@tricoteuses/assemblee 1.10.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/README.md +8 -1
  2. package/lib/amendements-79bwpkvR.js +154 -0
  3. package/lib/amendements-CV3s5a0M.js +667 -0
  4. package/lib/cleaners/index.d.ts +9 -9
  5. package/lib/cleaners.js +564 -0
  6. package/lib/datasets.d.ts +3 -3
  7. package/lib/dossiers_legislatifs.d.ts +2 -2
  8. package/lib/index.d.ts +17 -22
  9. package/lib/index.js +1542 -314
  10. package/lib/inserters.d.ts +5 -5
  11. package/lib/loaders-9mHdTl9L.js +4158 -0
  12. package/lib/loaders.d.ts +12 -12
  13. package/lib/loaders.js +29 -1689
  14. package/lib/organes.d.ts +1 -1
  15. package/lib/parse-Ccs6wcUg.js +2512 -0
  16. package/lib/parsers/index.d.ts +2 -3
  17. package/lib/parsers/plf.d.ts +1 -0
  18. package/lib/parsers/recherche_amendements.d.ts +2 -2
  19. package/lib/parsers/textes_lois.d.ts +1 -23
  20. package/lib/parsers.js +398 -0
  21. package/lib/raw_types/debats.d.ts +2 -2
  22. package/lib/raw_types/dossiers_legislatifs.d.ts +1 -1
  23. package/lib/schemas/acteurs_et_organes.json +1166 -0
  24. package/lib/schemas/agendas.json +1745 -0
  25. package/lib/schemas/amendements.json +2085 -0
  26. package/lib/schemas/debats.json +842 -0
  27. package/lib/schemas/dossiers_legislatifs.json +3874 -0
  28. package/lib/schemas/legislatures.json +17 -0
  29. package/lib/schemas/questions.json +704 -0
  30. package/lib/schemas/scrutins.json +701 -0
  31. package/lib/scripts/retrieve_deputes_photos.d.ts +1 -1
  32. package/lib/types/acteurs_et_organes.d.ts +340 -0
  33. package/lib/types/agendas.d.ts +236 -10
  34. package/lib/types/amendements.d.ts +276 -1
  35. package/lib/types/debats.d.ts +52 -2
  36. package/lib/types/dossiers_legislatifs.d.ts +403 -9
  37. package/lib/types/questions.d.ts +99 -2
  38. package/lib/types/scrutins.d.ts +101 -0
  39. package/lib/urls.d.ts +2 -2
  40. package/package.json +32 -94
  41. package/lib/api.js +0 -52
  42. package/lib/api.mjs +0 -45
  43. package/lib/bugs/acteur-00010/plugin.test.js +0 -90
  44. package/lib/bugs/acteur-00010/plugin.test.mjs +0 -33
  45. package/lib/bugs/acteur-00010.d.ts +0 -7
  46. package/lib/bugs/acteur-00010.js +0 -116
  47. package/lib/bugs/acteur-00010.mjs +0 -26
  48. package/lib/bugs/agenda-00002/plugin.test.js +0 -124
  49. package/lib/bugs/agenda-00002/plugin.test.mjs +0 -50
  50. package/lib/bugs/agenda-00002.d.ts +0 -15
  51. package/lib/bugs/agenda-00002.js +0 -406
  52. package/lib/bugs/agenda-00002.mjs +0 -172
  53. package/lib/bugs/agenda-00008/plugin.test.js +0 -92
  54. package/lib/bugs/agenda-00008/plugin.test.mjs +0 -31
  55. package/lib/bugs/agenda-00008.d.ts +0 -7
  56. package/lib/bugs/agenda-00008.js +0 -123
  57. package/lib/bugs/agenda-00008.mjs +0 -26
  58. package/lib/bugs/agenda-00011/plugin.test.d.ts +0 -1
  59. package/lib/bugs/agenda-00011/plugin.test.js +0 -263
  60. package/lib/bugs/agenda-00011/plugin.test.mjs +0 -152
  61. package/lib/bugs/agenda-00011.d.ts +0 -16
  62. package/lib/bugs/agenda-00011.js +0 -333
  63. package/lib/bugs/agenda-00011.mjs +0 -125
  64. package/lib/bugs.d.ts +0 -21
  65. package/lib/bugs.js +0 -452
  66. package/lib/bugs.mjs +0 -70
  67. package/lib/cleaners/actes_legislatifs.js +0 -315
  68. package/lib/cleaners/actes_legislatifs.mjs +0 -253
  69. package/lib/cleaners/acteurs.js +0 -265
  70. package/lib/cleaners/acteurs.mjs +0 -180
  71. package/lib/cleaners/amendements.js +0 -294
  72. package/lib/cleaners/amendements.mjs +0 -227
  73. package/lib/cleaners/debats.js +0 -12
  74. package/lib/cleaners/debats.mjs +0 -5
  75. package/lib/cleaners/documents.js +0 -205
  76. package/lib/cleaners/documents.mjs +0 -133
  77. package/lib/cleaners/dossiers_legislatifs.js +0 -131
  78. package/lib/cleaners/dossiers_legislatifs.mjs +0 -70
  79. package/lib/cleaners/index.js +0 -70
  80. package/lib/cleaners/index.mjs +0 -10
  81. package/lib/cleaners/organes.js +0 -65
  82. package/lib/cleaners/organes.mjs +0 -48
  83. package/lib/cleaners/questions.js +0 -12
  84. package/lib/cleaners/questions.mjs +0 -5
  85. package/lib/cleaners/reunions.js +0 -312
  86. package/lib/cleaners/reunions.mjs +0 -255
  87. package/lib/cleaners/scrutins.js +0 -340
  88. package/lib/cleaners/scrutins.mjs +0 -221
  89. package/lib/cleaners/xml.js +0 -74
  90. package/lib/cleaners/xml.mjs +0 -59
  91. package/lib/datasets.js +0 -837
  92. package/lib/datasets.mjs +0 -755
  93. package/lib/dates.js +0 -124
  94. package/lib/dates.mjs +0 -100
  95. package/lib/dossiers_legislatifs.js +0 -346
  96. package/lib/dossiers_legislatifs.mjs +0 -208
  97. package/lib/file_systems.js +0 -162
  98. package/lib/file_systems.mjs +0 -62
  99. package/lib/git.js +0 -223
  100. package/lib/git.mjs +0 -151
  101. package/lib/index.mjs +0 -17
  102. package/lib/inserters.js +0 -521
  103. package/lib/inserters.mjs +0 -337
  104. package/lib/loaders.mjs +0 -886
  105. package/lib/logger.js +0 -35
  106. package/lib/logger.mjs +0 -26
  107. package/lib/organes.js +0 -22
  108. package/lib/organes.mjs +0 -15
  109. package/lib/parsers/documents.d.ts +0 -62
  110. package/lib/parsers/documents.js +0 -453
  111. package/lib/parsers/documents.mjs +0 -370
  112. package/lib/parsers/index.js +0 -40
  113. package/lib/parsers/index.mjs +0 -4
  114. package/lib/parsers/recherche_amendements.js +0 -403
  115. package/lib/parsers/recherche_amendements.mjs +0 -167
  116. package/lib/parsers/textes_lois.js +0 -307
  117. package/lib/parsers/textes_lois.mjs +0 -264
  118. package/lib/raw_types/acteurs_et_organes.js +0 -1215
  119. package/lib/raw_types/acteurs_et_organes.mjs +0 -1148
  120. package/lib/raw_types/agendas.js +0 -777
  121. package/lib/raw_types/agendas.mjs +0 -724
  122. package/lib/raw_types/amendements.js +0 -1052
  123. package/lib/raw_types/amendements.mjs +0 -993
  124. package/lib/raw_types/debats.js +0 -630
  125. package/lib/raw_types/debats.mjs +0 -573
  126. package/lib/raw_types/dossiers_legislatifs.js +0 -1529
  127. package/lib/raw_types/dossiers_legislatifs.mjs +0 -1471
  128. package/lib/raw_types/questions.js +0 -469
  129. package/lib/raw_types/questions.mjs +0 -416
  130. package/lib/raw_types/scrutins.js +0 -651
  131. package/lib/raw_types/scrutins.mjs +0 -598
  132. package/lib/schemas/acteur/Acteur.json +0 -56
  133. package/lib/schemas/acteur/AdresseElectronique.json +0 -52
  134. package/lib/schemas/acteur/AdressePostale.json +0 -75
  135. package/lib/schemas/acteur/Civ.json +0 -14
  136. package/lib/schemas/acteur/Collaborateur.json +0 -29
  137. package/lib/schemas/acteur/EtatCivil.json +0 -51
  138. package/lib/schemas/acteur/Ident.json +0 -40
  139. package/lib/schemas/acteur/Lieu.json +0 -66
  140. package/lib/schemas/acteur/Mandat.json +0 -192
  141. package/lib/schemas/acteur/Profession.json +0 -46
  142. package/lib/schemas/agenda/Agenda.json +0 -318
  143. package/lib/schemas/agenda/CycleDeVie.json +0 -45
  144. package/lib/schemas/agenda/PointOdj.json +0 -82
  145. package/lib/schemas/amendement/Amendement.json +0 -246
  146. package/lib/schemas/amendement/Diff.json +0 -25
  147. package/lib/schemas/amendement/DispositifAmdtCredit.json +0 -85
  148. package/lib/schemas/amendement/Identifiant.json +0 -62
  149. package/lib/schemas/amendement/PointeurFragmentTexte.json +0 -127
  150. package/lib/schemas/amendement/Representation.json +0 -67
  151. package/lib/schemas/amendement/Total.json +0 -26
  152. package/lib/schemas/converted_from_type/acteurs_et_organes.json +0 -666
  153. package/lib/schemas/converted_from_type/agendas.json +0 -1100
  154. package/lib/schemas/converted_from_type/amendements.json +0 -3191
  155. package/lib/schemas/converted_from_type/debats.json +0 -682
  156. package/lib/schemas/converted_from_type/deputes.json +0 -26
  157. package/lib/schemas/converted_from_type/dossiers_legislatifs.json +0 -2918
  158. package/lib/schemas/converted_from_type/legislatures.json +0 -16
  159. package/lib/schemas/converted_from_type/questions.json +0 -328
  160. package/lib/schemas/converted_from_type/scrutins.json +0 -393
  161. package/lib/schemas/debat/Contenu.json +0 -75
  162. package/lib/schemas/debat/Debat.json +0 -40
  163. package/lib/schemas/debat/Metadonnees.json +0 -75
  164. package/lib/schemas/debat/Orateur.json +0 -60
  165. package/lib/schemas/debat/Point.json +0 -169
  166. package/lib/schemas/debat/Sommaire.json +0 -71
  167. package/lib/schemas/debat/SommaireElement.json +0 -108
  168. package/lib/schemas/debat/Texte.json +0 -34
  169. package/lib/schemas/document/CodeLibelle.json +0 -25
  170. package/lib/schemas/document/Document.json +0 -385
  171. package/lib/schemas/document/Indexation.json +0 -38
  172. package/lib/schemas/dossier/ActeLegislatif.json +0 -211
  173. package/lib/schemas/dossier/ActeLegislatifBase.json +0 -62
  174. package/lib/schemas/dossier/Agenda.json +0 -23
  175. package/lib/schemas/dossier/ConseilConstitutionnel.json +0 -35
  176. package/lib/schemas/dossier/Decision.json +0 -25
  177. package/lib/schemas/dossier/Dossier.json +0 -124
  178. package/lib/schemas/dossier/EtudeImpact.json +0 -29
  179. package/lib/schemas/dossier/EtudePlf.json +0 -105
  180. package/lib/schemas/dossier/Europe.json +0 -42
  181. package/lib/schemas/dossier/FamCodeLibelle.json +0 -25
  182. package/lib/schemas/dossier/InfoJO.json +0 -23
  183. package/lib/schemas/dossier/Initiateur.json +0 -36
  184. package/lib/schemas/dossier/Motion.json +0 -27
  185. package/lib/schemas/dossier/Promulgation.json +0 -62
  186. package/lib/schemas/dossier/Rapporteur.json +0 -36
  187. package/lib/schemas/dossier/Texte.json +0 -47
  188. package/lib/schemas/organe/CodeTypeOrgane.json +0 -43
  189. package/lib/schemas/organe/Organe.json +0 -136
  190. package/lib/schemas/organe/ViMoDe.json +0 -28
  191. package/lib/schemas/question/Auteur.json +0 -58
  192. package/lib/schemas/question/Cloture.json +0 -28
  193. package/lib/schemas/question/InfoJO.json +0 -40
  194. package/lib/schemas/question/MinAttribElement.json +0 -30
  195. package/lib/schemas/question/Question.json +0 -172
  196. package/lib/schemas/question/Renouvellement.json +0 -17
  197. package/lib/schemas/question/Signalement.json +0 -21
  198. package/lib/schemas/question/Texte.json +0 -24
  199. package/lib/schemas/scrutin/DecompteVoix.json +0 -35
  200. package/lib/schemas/scrutin/Dysfonctionnement.json +0 -50
  201. package/lib/schemas/scrutin/MiseAuPoint.json +0 -53
  202. package/lib/schemas/scrutin/OrganeVotant.json +0 -88
  203. package/lib/schemas/scrutin/Scrutin.json +0 -187
  204. package/lib/schemas/scrutin/Votant.json +0 -37
  205. package/lib/scripts/bugs_helper.d.ts +0 -13
  206. package/lib/scripts/bugs_helper.js +0 -595
  207. package/lib/scripts/bugs_helper.mjs +0 -251
  208. package/lib/scripts/clean_reorganized_data.js +0 -613
  209. package/lib/scripts/clean_reorganized_data.mjs +0 -276
  210. package/lib/scripts/diff_amendements.js +0 -249
  211. package/lib/scripts/diff_amendements.mjs +0 -202
  212. package/lib/scripts/document_dossiers_legislatifs.js +0 -655
  213. package/lib/scripts/document_dossiers_legislatifs.mjs +0 -414
  214. package/lib/scripts/get_today_reunions.js +0 -37
  215. package/lib/scripts/get_today_reunions.mjs +0 -31
  216. package/lib/scripts/merge_scrutins.js +0 -97
  217. package/lib/scripts/merge_scrutins.mjs +0 -47
  218. package/lib/scripts/parse_textes_lois.d.ts +0 -1
  219. package/lib/scripts/parse_textes_lois.js +0 -171
  220. package/lib/scripts/parse_textes_lois.mjs +0 -140
  221. package/lib/scripts/process_open_dataset.js +0 -301
  222. package/lib/scripts/process_open_dataset.mjs +0 -134
  223. package/lib/scripts/raw_types_from_amendements.js +0 -135
  224. package/lib/scripts/raw_types_from_amendements.mjs +0 -134
  225. package/lib/scripts/reorganize_data.js +0 -805
  226. package/lib/scripts/reorganize_data.mjs +0 -517
  227. package/lib/scripts/retrieve_deputes_photos.js +0 -310
  228. package/lib/scripts/retrieve_deputes_photos.mjs +0 -158
  229. package/lib/scripts/retrieve_documents.js +0 -547
  230. package/lib/scripts/retrieve_documents.mjs +0 -242
  231. package/lib/scripts/retrieve_open_data.js +0 -107
  232. package/lib/scripts/retrieve_open_data.mjs +0 -26
  233. package/lib/scripts/retrieve_pending_amendments.js +0 -206
  234. package/lib/scripts/retrieve_pending_amendments.mjs +0 -57
  235. package/lib/scripts/retrieve_senateurs_photos.js +0 -234
  236. package/lib/scripts/retrieve_senateurs_photos.mjs +0 -116
  237. package/lib/scripts/retrieve_textes_lois.d.ts +0 -1
  238. package/lib/scripts/retrieve_textes_lois.js +0 -240
  239. package/lib/scripts/retrieve_textes_lois.mjs +0 -85
  240. package/lib/scripts/shared/cli_helpers.js +0 -89
  241. package/lib/scripts/shared/cli_helpers.mjs +0 -81
  242. package/lib/scripts/test_iter_load.js +0 -155
  243. package/lib/scripts/test_iter_load.mjs +0 -72
  244. package/lib/scripts/test_load.js +0 -26
  245. package/lib/scripts/test_load.mjs +0 -16
  246. package/lib/scripts/test_load_big_files.js +0 -26
  247. package/lib/scripts/test_load_big_files.mjs +0 -16
  248. package/lib/scripts/validate_json.js +0 -353
  249. package/lib/scripts/validate_json.mjs +0 -184
  250. package/lib/shared_types/codes_actes.js +0 -231
  251. package/lib/shared_types/codes_actes.mjs +0 -224
  252. package/lib/strings.js +0 -16
  253. package/lib/strings.mjs +0 -7
  254. package/lib/types/acteurs_et_organes.js +0 -965
  255. package/lib/types/acteurs_et_organes.mjs +0 -906
  256. package/lib/types/agendas.js +0 -628
  257. package/lib/types/agendas.mjs +0 -575
  258. package/lib/types/amendements.js +0 -899
  259. package/lib/types/amendements.mjs +0 -842
  260. package/lib/types/debats.js +0 -619
  261. package/lib/types/debats.mjs +0 -562
  262. package/lib/types/dossiers_legislatifs.js +0 -1188
  263. package/lib/types/dossiers_legislatifs.mjs +0 -1130
  264. package/lib/types/legislatures.js +0 -17
  265. package/lib/types/legislatures.mjs +0 -10
  266. package/lib/types/questions.js +0 -454
  267. package/lib/types/questions.mjs +0 -401
  268. package/lib/types/scrutins.js +0 -556
  269. package/lib/types/scrutins.mjs +0 -503
  270. package/lib/urls.js +0 -325
  271. package/lib/urls.mjs +0 -258
  272. /package/lib/{bugs/acteur-00010/plugin.test.d.ts → scripts/add_links_to_documents.d.ts} +0 -0
  273. /package/lib/{bugs/agenda-00002/plugin.test.d.ts → scripts/copy-schemas.d.ts} +0 -0
  274. /package/lib/{bugs/agenda-00008/plugin.test.d.ts → scripts/generate-json-schemas.d.ts} +0 -0
@@ -1,805 +0,0 @@
1
- "use strict";
2
-
3
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
- require("core-js/modules/es.symbol.js");
5
- require("core-js/modules/es.symbol.description.js");
6
- require("core-js/modules/es.symbol.iterator.js");
7
- require("core-js/modules/es.array.from.js");
8
- require("core-js/modules/es.array.is-array.js");
9
- require("core-js/modules/es.array.iterator.js");
10
- require("core-js/modules/es.array.slice.js");
11
- require("core-js/modules/es.function.name.js");
12
- require("core-js/modules/es.object.define-property.js");
13
- require("core-js/modules/es.object.get-own-property-descriptor.js");
14
- require("core-js/modules/es.object.to-string.js");
15
- require("core-js/modules/es.regexp.to-string.js");
16
- require("core-js/modules/es.string.iterator.js");
17
- require("core-js/modules/es.weak-map.js");
18
- require("core-js/modules/web.dom-collections.iterator.js");
19
- require("core-js/modules/es.array.concat.js");
20
- require("core-js/modules/es.array.join.js");
21
- require("core-js/modules/es.array.sort.js");
22
- require("core-js/modules/es.date.to-json.js");
23
- require("core-js/modules/es.date.to-string.js");
24
- require("core-js/modules/es.object.keys.js");
25
- require("core-js/modules/es.object.values.js");
26
- require("core-js/modules/es.regexp.exec.js");
27
- require("core-js/modules/es.string.ends-with.js");
28
- require("core-js/modules/es.string.replace.js");
29
- require("core-js/modules/es.string.starts-with.js");
30
- require("core-js/modules/es.string.trim.js");
31
- var _assert = _interopRequireDefault(require("assert"));
32
- var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
33
- var _fsExtra = _interopRequireDefault(require("fs-extra"));
34
- var _path = _interopRequireDefault(require("path"));
35
- var _datasets = require("../datasets");
36
- var _dates = require("../dates");
37
- var git = _interopRequireWildcard(require("../git"));
38
- var _file_systems = require("../file_systems");
39
- var _loaders = require("../loaders");
40
- var _acteurs_et_organes = require("../raw_types/acteurs_et_organes");
41
- var _agendas = require("../raw_types/agendas");
42
- var _amendements = require("../raw_types/amendements");
43
- var _dossiers_legislatifs = require("../raw_types/dossiers_legislatifs");
44
- var _scrutins = require("../raw_types/scrutins");
45
- var _questions = require("../raw_types/questions");
46
- var _debats = require("../raw_types/debats");
47
- var _cli_helpers = require("./shared/cli_helpers");
48
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
49
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
50
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
51
- function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
52
- 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."); }
53
- function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
54
- function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
55
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
56
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
57
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
58
- function parseArgs(argv) {
59
- var optionsDefinitions = [_cli_helpers.cloneOption, _cli_helpers.commitOption, _cli_helpers.categoriesOption, _cli_helpers.legislatureOption, _cli_helpers.remoteOption, _cli_helpers.silentOption, _cli_helpers.verboseOption, _cli_helpers.dataDirDefaultOption, _cli_helpers.fetchDocumentsOption, _cli_helpers.parseDocumentsOption, _cli_helpers.documentFormatOption, _cli_helpers.pullOption, {
60
- alias: "V",
61
- help: "don't validate raw data",
62
- name: "no-validate-raw",
63
- type: Boolean
64
- }];
65
- var options = (0, _commandLineArgs["default"])(optionsDefinitions, {
66
- argv: argv
67
- });
68
- return options;
69
- }
70
- function clearDirectory(dirPath) {
71
- _fsExtra["default"].ensureDirSync(dirPath);
72
- var _iterator = _createForOfIteratorHelper(_fsExtra["default"].readdirSync(dirPath)),
73
- _step;
74
- try {
75
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
76
- var filename = _step.value;
77
- if (!filename.startsWith(".")) {
78
- _fsExtra["default"].removeSync(_path["default"].join(dirPath, filename));
79
- }
80
- }
81
- } catch (err) {
82
- _iterator.e(err);
83
- } finally {
84
- _iterator.f();
85
- }
86
- }
87
- function cloneGit(gitGroupUrl, datasetName, dataDir) {
88
- git.clone(gitGroupUrl, datasetName, dataDir);
89
- }
90
- function reorganizeData(options) {
91
- var _options$clone;
92
- var dataDir = options.dataDir;
93
- Date.prototype.toJSON = _dates.patchedDateToJson;
94
- var exitCode = options.commit ? 10 : 0;
95
- var gitGroupUrl = (_options$clone = options.clone) === null || _options$clone === void 0 ? void 0 : _options$clone.trim().replace(/\/+$/, "");
96
- var validateRawData = !options["no-validate-raw"];
97
- var enabledDatasets = (0, _datasets.getEnabledDatasets)(options.categories);
98
- var chosenDatasets = (0, _datasets.filterByLegislature)(_datasets.datasets, options.legislature);
99
- function commitGit(datasetReorganizedDir, options) {
100
- if (options.commit) {
101
- var errorCode = git.commitAndPush(datasetReorganizedDir, "Nouvelle moisson", options.remote);
102
- if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
103
- exitCode = errorCode;
104
- }
105
- }
106
- }
107
- if (enabledDatasets & _datasets.EnabledDatasets.ActeursEtOrganes) {
108
- var _iterator2 = _createForOfIteratorHelper(chosenDatasets.acteursEtOrganes),
109
- _step2;
110
- try {
111
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
112
- var dataset = _step2.value;
113
- var originalJsonDirectoryOrFilePath = _path["default"].join(dataDir, dataset.filename);
114
- if (!options.silent) {
115
- console.log("Reorganizing ".concat(originalJsonDirectoryOrFilePath));
116
- }
117
- var datasetName = _path["default"].basename(originalJsonDirectoryOrFilePath, ".json");
118
- cloneGit(gitGroupUrl, datasetName, dataDir);
119
- var datasetReorganizedDir = _path["default"].join(dataDir, datasetName);
120
- if (options.pull) {
121
- git.resetAndPull(datasetReorganizedDir);
122
- }
123
- clearDirectory(datasetReorganizedDir);
124
- var acteursReorganizedDir = _path["default"].join(datasetReorganizedDir, "acteurs");
125
- _fsExtra["default"].mkdirSync(acteursReorganizedDir);
126
- var organesReorganizedDir = _path["default"].join(datasetReorganizedDir, "organes");
127
- _fsExtra["default"].mkdirSync(organesReorganizedDir);
128
- switch (dataset.structure) {
129
- case _datasets.DatasetStructure.SingleFile:
130
- {
131
- var originalJson = _fsExtra["default"].readFileSync(originalJsonDirectoryOrFilePath, {
132
- encoding: "utf8"
133
- });
134
- var originalData = validateRawData ? _acteurs_et_organes.Convert.toActeursEtOrganes(originalJson) : JSON.parse(originalJson);
135
- var _iterator3 = _createForOfIteratorHelper(originalData["export"].acteurs.acteur),
136
- _step3;
137
- try {
138
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
139
- var acteur = _step3.value;
140
- var reorganizedJsonFilePath = _path["default"].join(acteursReorganizedDir, acteur.uid["#text"] + ".json");
141
- _fsExtra["default"].writeFileSync(reorganizedJsonFilePath, JSON.stringify(acteur, null, 2), {
142
- encoding: "utf8"
143
- });
144
- }
145
- } catch (err) {
146
- _iterator3.e(err);
147
- } finally {
148
- _iterator3.f();
149
- }
150
- var _iterator4 = _createForOfIteratorHelper(originalData["export"].organes.organe),
151
- _step4;
152
- try {
153
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
154
- var organe = _step4.value;
155
- var _reorganizedJsonFilePath = _path["default"].join(organesReorganizedDir, organe.uid + ".json");
156
- _fsExtra["default"].writeFileSync(_reorganizedJsonFilePath, JSON.stringify(organe, null, 2), {
157
- encoding: "utf8"
158
- });
159
- }
160
- } catch (err) {
161
- _iterator4.e(err);
162
- } finally {
163
- _iterator4.f();
164
- }
165
- }
166
- break;
167
- case _datasets.DatasetStructure.SegmentedFiles:
168
- {
169
- var deportsByActeurUid = {};
170
- if (_fsExtra["default"].existsSync(_path["default"].join(originalJsonDirectoryOrFilePath, "deport"))) {
171
- var _iterator5 = _createForOfIteratorHelper((0, _file_systems.walkDir)(originalJsonDirectoryOrFilePath, ["deport"])),
172
- _step5;
173
- try {
174
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
175
- var deportSplitPath = _step5.value;
176
- var deportFilename = deportSplitPath[deportSplitPath.length - 1];
177
- if (!deportFilename.endsWith(".json")) {
178
- continue;
179
- }
180
- var deportOriginalFilePath = _path["default"].join.apply(_path["default"], [originalJsonDirectoryOrFilePath].concat(_toConsumableArray(deportSplitPath)));
181
- if (options.verbose) {
182
- console.log(" Loading \"deport\" file: ".concat(deportOriginalFilePath, "\u2026"));
183
- }
184
- var deportOriginalJson = _fsExtra["default"].readFileSync(deportOriginalFilePath, {
185
- encoding: "utf8"
186
- });
187
- var deportOriginal = validateRawData ? _acteurs_et_organes.Convert.toDeport(deportOriginalJson) : JSON.parse(deportOriginalJson);
188
- var deport = deportOriginal.deport;
189
- var _deports = deportsByActeurUid[deport.acteurRef];
190
- if (_deports === undefined) {
191
- _deports = deportsByActeurUid[deport.acteurRef] = [];
192
- }
193
- _deports.push(deport);
194
- }
195
- } catch (err) {
196
- _iterator5.e(err);
197
- } finally {
198
- _iterator5.f();
199
- }
200
- for (var _i = 0, _Object$values = Object.values(deportsByActeurUid); _i < _Object$values.length; _i++) {
201
- var deports = _Object$values[_i];
202
- deports.sort(function (a, b) {
203
- return a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length;
204
- });
205
- }
206
- }
207
- var mandatsByActeurUid = {};
208
- if (_fsExtra["default"].existsSync(_path["default"].join(originalJsonDirectoryOrFilePath, "mandat"))) {
209
- var _iterator6 = _createForOfIteratorHelper((0, _file_systems.walkDir)(originalJsonDirectoryOrFilePath, ["mandat"])),
210
- _step6;
211
- try {
212
- for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
213
- var mandatSplitPath = _step6.value;
214
- var mandatFilename = mandatSplitPath[mandatSplitPath.length - 1];
215
- if (!mandatFilename.endsWith(".json")) {
216
- continue;
217
- }
218
- var mandatOriginalFilePath = _path["default"].join.apply(_path["default"], [originalJsonDirectoryOrFilePath].concat(_toConsumableArray(mandatSplitPath)));
219
- if (options.verbose) {
220
- console.log(" Loading \"mandat\" file: ".concat(mandatOriginalFilePath, "\u2026"));
221
- }
222
- var mandatOriginalJson = _fsExtra["default"].readFileSync(mandatOriginalFilePath, {
223
- encoding: "utf8"
224
- });
225
- var mandatOriginal = validateRawData ? _acteurs_et_organes.Convert.toMandatWrapper(mandatOriginalJson) : JSON.parse(mandatOriginalJson);
226
- var mandat = mandatOriginal.mandat;
227
- var _mandats = mandatsByActeurUid[mandat.acteurRef];
228
- if (_mandats === undefined) {
229
- _mandats = mandatsByActeurUid[mandat.acteurRef] = [];
230
- }
231
- _mandats.push(mandat);
232
- }
233
- } catch (err) {
234
- _iterator6.e(err);
235
- } finally {
236
- _iterator6.f();
237
- }
238
- for (var _i2 = 0, _Object$values2 = Object.values(mandatsByActeurUid); _i2 < _Object$values2.length; _i2++) {
239
- var mandats = _Object$values2[_i2];
240
- mandats.sort(function (a, b) {
241
- return a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length;
242
- });
243
- }
244
- }
245
- var _iterator7 = _createForOfIteratorHelper((0, _file_systems.walkDir)(originalJsonDirectoryOrFilePath, ["acteur"])),
246
- _step7;
247
- try {
248
- for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
249
- var acteurSplitPath = _step7.value;
250
- var acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
251
- if (!acteurFilename.endsWith(".json")) {
252
- continue;
253
- }
254
- var acteurOriginalFilePath = _path["default"].join.apply(_path["default"], [originalJsonDirectoryOrFilePath].concat(_toConsumableArray(acteurSplitPath)));
255
- if (options.verbose) {
256
- console.log(" Reorganizing \"acteur\" file: ".concat(acteurOriginalFilePath, "\u2026"));
257
- }
258
- var acteurOriginalJson = _fsExtra["default"].readFileSync(acteurOriginalFilePath, {
259
- encoding: "utf8"
260
- });
261
- var acteurOriginal = validateRawData ? _acteurs_et_organes.Convert.toActeur(acteurOriginalJson) : JSON.parse(acteurOriginalJson);
262
- var _acteur = acteurOriginal.acteur;
263
- var acteurUid = _acteur.uid["#text"];
264
- var _deports2 = deportsByActeurUid[acteurUid];
265
- if (_deports2 !== undefined) {
266
- _assert["default"].strictEqual(_acteur.deports, undefined);
267
- _acteur.deports = {
268
- deport: _deports2
269
- };
270
- }
271
- var _mandats2 = mandatsByActeurUid[acteurUid];
272
- if (_mandats2 !== undefined) {
273
- _assert["default"].strictEqual(_acteur.mandats, undefined);
274
- _acteur.mandats = {
275
- mandat: _mandats2
276
- };
277
- }
278
- var acteurReorganizedJsonFilePath = _path["default"].join(acteursReorganizedDir, acteurUid + ".json");
279
- _fsExtra["default"].writeFileSync(acteurReorganizedJsonFilePath, JSON.stringify(_acteur, null, 2), {
280
- encoding: "utf8"
281
- });
282
- }
283
- } catch (err) {
284
- _iterator7.e(err);
285
- } finally {
286
- _iterator7.f();
287
- }
288
- var _iterator8 = _createForOfIteratorHelper((0, _file_systems.walkDir)(originalJsonDirectoryOrFilePath, ["organe"])),
289
- _step8;
290
- try {
291
- for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
292
- var organeSplitPath = _step8.value;
293
- var organeFilename = organeSplitPath[organeSplitPath.length - 1];
294
- if (!organeFilename.endsWith(".json")) {
295
- continue;
296
- }
297
- var organeOriginalFilePath = _path["default"].join.apply(_path["default"], [originalJsonDirectoryOrFilePath].concat(_toConsumableArray(organeSplitPath)));
298
- if (options.verbose) {
299
- console.log(" Reorganizing \"organe\" file: ".concat(organeOriginalFilePath, "\u2026"));
300
- }
301
- var organeOriginalJson = _fsExtra["default"].readFileSync(organeOriginalFilePath, {
302
- encoding: "utf8"
303
- });
304
- var organeOriginal = validateRawData ? _acteurs_et_organes.Convert.toOrgane(organeOriginalJson) : JSON.parse(organeOriginalJson);
305
- var _organe = organeOriginal.organe;
306
- var organeReorganizedJsonFilePath = _path["default"].join(organesReorganizedDir, _organe.uid + ".json");
307
- _fsExtra["default"].writeFileSync(organeReorganizedJsonFilePath, JSON.stringify(_organe, null, 2), {
308
- encoding: "utf8"
309
- });
310
- }
311
- } catch (err) {
312
- _iterator8.e(err);
313
- } finally {
314
- _iterator8.f();
315
- }
316
- }
317
- break;
318
- }
319
- commitGit(datasetReorganizedDir, options);
320
- }
321
- } catch (err) {
322
- _iterator2.e(err);
323
- } finally {
324
- _iterator2.f();
325
- }
326
- }
327
- if (enabledDatasets & _datasets.EnabledDatasets.Agendas) {
328
- var _iterator9 = _createForOfIteratorHelper(chosenDatasets.agendas),
329
- _step9;
330
- try {
331
- for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
332
- var _dataset = _step9.value;
333
- var _originalJsonDirectoryOrFilePath = _path["default"].join(dataDir, _dataset.filename);
334
- if (!options.silent) {
335
- console.log("Reorganizing ".concat(_originalJsonDirectoryOrFilePath));
336
- }
337
- var _datasetName = _path["default"].basename(_originalJsonDirectoryOrFilePath, ".json");
338
- cloneGit(gitGroupUrl, _datasetName, dataDir);
339
- var _datasetReorganizedDir = _path["default"].join(dataDir, _datasetName);
340
- clearDirectory(_datasetReorganizedDir);
341
- switch (_dataset.structure) {
342
- case _datasets.DatasetStructure.SingleFile:
343
- {
344
- var _originalJson = _fsExtra["default"].readFileSync(_originalJsonDirectoryOrFilePath, {
345
- encoding: "utf8"
346
- });
347
- var _originalData = validateRawData ? _agendas.Convert.toAgendas(_originalJson) : JSON.parse(_originalJson);
348
- var _iterator10 = _createForOfIteratorHelper(_originalData.reunions.reunion),
349
- _step10;
350
- try {
351
- for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
352
- var reunion = _step10.value;
353
- writeReorganizedJson(_datasetReorganizedDir, reunion, _loaders.pathFromReunionUid);
354
- }
355
- } catch (err) {
356
- _iterator10.e(err);
357
- } finally {
358
- _iterator10.f();
359
- }
360
- }
361
- break;
362
- case _datasets.DatasetStructure.SegmentedFiles:
363
- {
364
- var _iterator11 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_originalJsonDirectoryOrFilePath, ["reunion"])),
365
- _step11;
366
- try {
367
- for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
368
- var reunionSplitPath = _step11.value;
369
- var reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
370
- if (!reunionFilename.endsWith(".json")) {
371
- continue;
372
- }
373
- var reunionOriginalFilePath = _path["default"].join.apply(_path["default"], [_originalJsonDirectoryOrFilePath].concat(_toConsumableArray(reunionSplitPath)));
374
- if (options.verbose) {
375
- console.log(" Reorganizing \"reunion\" file: ".concat(reunionOriginalFilePath, "\u2026"));
376
- }
377
- var reunionOriginalJson = _fsExtra["default"].readFileSync(reunionOriginalFilePath, {
378
- encoding: "utf8"
379
- });
380
- var reunionOriginal = validateRawData ? _agendas.Convert.toReunion(reunionOriginalJson) : JSON.parse(reunionOriginalJson);
381
- var _reunion = reunionOriginal.reunion;
382
- writeReorganizedJson(_datasetReorganizedDir, _reunion, _loaders.pathFromReunionUid);
383
- }
384
- } catch (err) {
385
- _iterator11.e(err);
386
- } finally {
387
- _iterator11.f();
388
- }
389
- }
390
- break;
391
- }
392
- commitGit(_datasetReorganizedDir, options);
393
- }
394
- } catch (err) {
395
- _iterator9.e(err);
396
- } finally {
397
- _iterator9.f();
398
- }
399
- }
400
- if (enabledDatasets & _datasets.EnabledDatasets.Amendements) {
401
- var _iterator12 = _createForOfIteratorHelper(chosenDatasets.amendements),
402
- _step12;
403
- try {
404
- for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
405
- var _dataset2 = _step12.value;
406
- var _originalJsonDirectoryOrFilePath2 = _path["default"].join(dataDir, _dataset2.filename);
407
- if (!options.silent) {
408
- console.log("Reorganizing ".concat(_originalJsonDirectoryOrFilePath2));
409
- }
410
- var _datasetName2 = _path["default"].basename(_originalJsonDirectoryOrFilePath2, ".json");
411
- cloneGit(gitGroupUrl, _datasetName2, dataDir);
412
- var _datasetReorganizedDir2 = _path["default"].join(dataDir, _datasetName2);
413
- clearDirectory(_datasetReorganizedDir2);
414
- switch (_dataset2.structure) {
415
- case _datasets.DatasetStructure.SingleFile:
416
- {
417
- var _originalJson2 = _fsExtra["default"].readFileSync(_originalJsonDirectoryOrFilePath2, {
418
- encoding: "utf8"
419
- });
420
- var _originalData2 = validateRawData ? _amendements.Convert.toAmendements(_originalJson2) : JSON.parse(_originalJson2);
421
- var _iterator13 = _createForOfIteratorHelper(_originalData2.textesEtAmendements.texteleg),
422
- _step13;
423
- try {
424
- for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
425
- var texteLegislatif = _step13.value;
426
- var _iterator14 = _createForOfIteratorHelper(texteLegislatif.amendements),
427
- _step14;
428
- try {
429
- for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
430
- var amendement = _step14.value;
431
- writeAmendementReorganizedJson(_datasetReorganizedDir2, amendement);
432
- }
433
- } catch (err) {
434
- _iterator14.e(err);
435
- } finally {
436
- _iterator14.f();
437
- }
438
- }
439
- } catch (err) {
440
- _iterator13.e(err);
441
- } finally {
442
- _iterator13.f();
443
- }
444
- }
445
- break;
446
- case _datasets.DatasetStructure.SegmentedFiles:
447
- {
448
- var _iterator15 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_originalJsonDirectoryOrFilePath2)),
449
- _step15;
450
- try {
451
- for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
452
- var amendementSplitPath = _step15.value;
453
- var amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
454
- if (!amendementFilename.endsWith(".json")) {
455
- continue;
456
- }
457
- var amendementOriginalFilePath = _path["default"].join.apply(_path["default"], [_originalJsonDirectoryOrFilePath2].concat(_toConsumableArray(amendementSplitPath)));
458
- if (options.verbose) {
459
- console.log(" Reorganizing \"amendement\" file: ".concat(amendementOriginalFilePath, "\u2026"));
460
- }
461
- var amendementOriginalJson = _fsExtra["default"].readFileSync(amendementOriginalFilePath, {
462
- encoding: "utf8"
463
- });
464
- var amendementOriginal = validateRawData ? _amendements.Convert.toAmendementWrapper(amendementOriginalJson) : JSON.parse(amendementOriginalJson);
465
- var _amendement = amendementOriginal.amendement;
466
- writeAmendementReorganizedJson(_datasetReorganizedDir2, _amendement);
467
- }
468
- } catch (err) {
469
- _iterator15.e(err);
470
- } finally {
471
- _iterator15.f();
472
- }
473
- }
474
- break;
475
- }
476
- commitGit(_datasetReorganizedDir2, options);
477
- }
478
- } catch (err) {
479
- _iterator12.e(err);
480
- } finally {
481
- _iterator12.f();
482
- }
483
- }
484
- if (enabledDatasets & _datasets.EnabledDatasets.DossiersLegislatifs) {
485
- var _iterator16 = _createForOfIteratorHelper(chosenDatasets.dossiersLegislatifs),
486
- _step16;
487
- try {
488
- for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
489
- var _dataset3 = _step16.value;
490
- var _originalJsonDirectoryOrFilePath3 = _path["default"].join(dataDir, _dataset3.filename);
491
- if (!options.silent) {
492
- console.log("Reorganizing ".concat(_originalJsonDirectoryOrFilePath3));
493
- }
494
- var _datasetName3 = _path["default"].basename(_originalJsonDirectoryOrFilePath3, ".json");
495
- cloneGit(gitGroupUrl, _datasetName3, dataDir);
496
- var _datasetReorganizedDir3 = _path["default"].join(dataDir, _datasetName3);
497
- clearDirectory(_datasetReorganizedDir3);
498
- var documentsDir = _path["default"].join(_datasetReorganizedDir3, "documents");
499
- _fsExtra["default"].mkdirSync(documentsDir);
500
- var dossiersDir = _path["default"].join(_datasetReorganizedDir3, "dossiers");
501
- _fsExtra["default"].mkdirSync(dossiersDir);
502
- switch (_dataset3.structure) {
503
- case _datasets.DatasetStructure.SingleFile:
504
- {
505
- var _originalJson3 = _fsExtra["default"].readFileSync(_originalJsonDirectoryOrFilePath3, {
506
- encoding: "utf8"
507
- });
508
- var _originalData3 = validateRawData ? _dossiers_legislatifs.Convert.toDossiersLegislatifs(_originalJson3) : JSON.parse(_originalJson3);
509
- var _iterator17 = _createForOfIteratorHelper(_originalData3["export"].textesLegislatifs.document),
510
- _step17;
511
- try {
512
- for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {
513
- var document = _step17.value;
514
- writeReorganizedJson(documentsDir, document, _loaders.pathFromDocumentUid);
515
- }
516
- } catch (err) {
517
- _iterator17.e(err);
518
- } finally {
519
- _iterator17.f();
520
- }
521
- var _iterator18 = _createForOfIteratorHelper(_originalData3["export"].dossiersLegislatifs.dossier),
522
- _step18;
523
- try {
524
- for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {
525
- var dossierParlementaire = _step18.value.dossierParlementaire;
526
- writeReorganizedJson(dossiersDir, dossierParlementaire, _loaders.pathFromDossierParlementaireUid);
527
- }
528
- } catch (err) {
529
- _iterator18.e(err);
530
- } finally {
531
- _iterator18.f();
532
- }
533
- }
534
- break;
535
- case _datasets.DatasetStructure.SegmentedFiles:
536
- {
537
- var _iterator19 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_originalJsonDirectoryOrFilePath3, ["document"])),
538
- _step19;
539
- try {
540
- for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) {
541
- var documentSplitPath = _step19.value;
542
- var documentFilename = documentSplitPath[documentSplitPath.length - 1];
543
- if (!documentFilename.endsWith(".json")) {
544
- continue;
545
- }
546
- var documentOriginalFilePath = _path["default"].join.apply(_path["default"], [_originalJsonDirectoryOrFilePath3].concat(_toConsumableArray(documentSplitPath)));
547
- if (options.verbose) {
548
- console.log(" Reorganizing \"document\" file: ".concat(documentOriginalFilePath, "\u2026"));
549
- }
550
- var documentOriginalJson = _fsExtra["default"].readFileSync(documentOriginalFilePath, {
551
- encoding: "utf8"
552
- });
553
- var documentOriginal = validateRawData ? _dossiers_legislatifs.Convert.toDocument(documentOriginalJson) : JSON.parse(documentOriginalJson);
554
- var _document = documentOriginal.document;
555
- writeReorganizedJson(documentsDir, _document, _loaders.pathFromDocumentUid);
556
- }
557
- } catch (err) {
558
- _iterator19.e(err);
559
- } finally {
560
- _iterator19.f();
561
- }
562
- var _iterator20 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_originalJsonDirectoryOrFilePath3, ["dossierParlementaire"])),
563
- _step20;
564
- try {
565
- for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) {
566
- var dossierParlementaireSplitPath = _step20.value;
567
- var dossierParlementaireFilename = dossierParlementaireSplitPath[dossierParlementaireSplitPath.length - 1];
568
- if (!dossierParlementaireFilename.endsWith(".json")) {
569
- continue;
570
- }
571
- var dossierParlementaireOriginalFilePath = _path["default"].join.apply(_path["default"], [_originalJsonDirectoryOrFilePath3].concat(_toConsumableArray(dossierParlementaireSplitPath)));
572
- if (options.verbose) {
573
- console.log(" Reorganizing \"dossierParlementaire\" file: ".concat(dossierParlementaireOriginalFilePath, "\u2026"));
574
- }
575
- var dossierParlementaireOriginalJson = _fsExtra["default"].readFileSync(dossierParlementaireOriginalFilePath, {
576
- encoding: "utf8"
577
- });
578
- var dossierParlementaireOriginal = validateRawData ? _dossiers_legislatifs.Convert.toDossierParlementaire(dossierParlementaireOriginalJson) : JSON.parse(dossierParlementaireOriginalJson);
579
- var _dossierParlementaire = dossierParlementaireOriginal.dossierParlementaire;
580
- writeReorganizedJson(dossiersDir, _dossierParlementaire, _loaders.pathFromDossierParlementaireUid);
581
- }
582
- } catch (err) {
583
- _iterator20.e(err);
584
- } finally {
585
- _iterator20.f();
586
- }
587
- }
588
- break;
589
- }
590
- commitGit(_datasetReorganizedDir3, options);
591
- }
592
- } catch (err) {
593
- _iterator16.e(err);
594
- } finally {
595
- _iterator16.f();
596
- }
597
- }
598
- if (enabledDatasets & _datasets.EnabledDatasets.Scrutins) {
599
- var _iterator21 = _createForOfIteratorHelper(chosenDatasets.scrutins),
600
- _step21;
601
- try {
602
- for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) {
603
- var _dataset4 = _step21.value;
604
- var _originalJsonDirectoryOrFilePath4 = _path["default"].join(dataDir, _dataset4.filename);
605
- if (!options.silent) {
606
- console.log("Reorganizing ".concat(_originalJsonDirectoryOrFilePath4));
607
- }
608
- var _datasetName4 = _path["default"].basename(_originalJsonDirectoryOrFilePath4, ".json");
609
- cloneGit(gitGroupUrl, _datasetName4, dataDir);
610
- var _datasetReorganizedDir4 = _path["default"].join(dataDir, _datasetName4);
611
- clearDirectory(_datasetReorganizedDir4);
612
- switch (_dataset4.structure) {
613
- case _datasets.DatasetStructure.SingleFile:
614
- {
615
- var _originalJson4 = _fsExtra["default"].readFileSync(_originalJsonDirectoryOrFilePath4, {
616
- encoding: "utf8"
617
- });
618
- var _originalData4 = validateRawData ? _scrutins.Convert.toScrutins(_originalJson4) : JSON.parse(_originalJson4);
619
- var _iterator22 = _createForOfIteratorHelper(_originalData4.scrutins.scrutin),
620
- _step22;
621
- try {
622
- for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) {
623
- var scrutin = _step22.value;
624
- writeReorganizedJson(_datasetReorganizedDir4, scrutin, _loaders.pathFromScrutinUid);
625
- }
626
- } catch (err) {
627
- _iterator22.e(err);
628
- } finally {
629
- _iterator22.f();
630
- }
631
- }
632
- break;
633
- case _datasets.DatasetStructure.SegmentedFiles:
634
- {
635
- var _iterator23 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_originalJsonDirectoryOrFilePath4)),
636
- _step23;
637
- try {
638
- for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) {
639
- var scrutinSplitPath = _step23.value;
640
- var scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
641
- if (!scrutinFilename.endsWith(".json")) {
642
- continue;
643
- }
644
- var scrutinOriginalFilePath = _path["default"].join.apply(_path["default"], [_originalJsonDirectoryOrFilePath4].concat(_toConsumableArray(scrutinSplitPath)));
645
- if (options.verbose) {
646
- console.log(" Reorganizing \"scrutin\" file: ".concat(scrutinOriginalFilePath, "\u2026"));
647
- }
648
- var scrutinOriginalJson = _fsExtra["default"].readFileSync(scrutinOriginalFilePath, {
649
- encoding: "utf8"
650
- });
651
- var scrutinOriginal = validateRawData ? _scrutins.Convert.toScrutinWrapper(scrutinOriginalJson) : JSON.parse(scrutinOriginalJson);
652
- var _scrutin = scrutinOriginal.scrutin;
653
- writeReorganizedJson(_datasetReorganizedDir4, _scrutin, _loaders.pathFromScrutinUid);
654
- }
655
- } catch (err) {
656
- _iterator23.e(err);
657
- } finally {
658
- _iterator23.f();
659
- }
660
- }
661
- break;
662
- }
663
- commitGit(_datasetReorganizedDir4, options);
664
- }
665
- } catch (err) {
666
- _iterator21.e(err);
667
- } finally {
668
- _iterator21.f();
669
- }
670
- }
671
- if (enabledDatasets & _datasets.EnabledDatasets.Questions) {
672
- var _iterator24 = _createForOfIteratorHelper(_datasets.datasets.questions),
673
- _step24;
674
- try {
675
- for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) {
676
- var _dataset5 = _step24.value;
677
- var _originalJsonDirectoryOrFilePath5 = _path["default"].join(dataDir, _dataset5.filename);
678
- if (!options.silent) {
679
- console.log("Reorganizing ".concat(_originalJsonDirectoryOrFilePath5));
680
- }
681
- var _datasetName5 = _path["default"].basename(_originalJsonDirectoryOrFilePath5, ".json");
682
- cloneGit(gitGroupUrl, _datasetName5, dataDir);
683
- var _datasetReorganizedDir5 = _path["default"].join(dataDir, _datasetName5);
684
- clearDirectory(_datasetReorganizedDir5);
685
- switch (_dataset5.structure) {
686
- case _datasets.DatasetStructure.SegmentedFiles:
687
- {
688
- var _iterator25 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_originalJsonDirectoryOrFilePath5)),
689
- _step25;
690
- try {
691
- for (_iterator25.s(); !(_step25 = _iterator25.n()).done;) {
692
- var questionSplitPath = _step25.value;
693
- var questionFilename = questionSplitPath[questionSplitPath.length - 1];
694
- if (!questionFilename.endsWith(".json")) {
695
- continue;
696
- }
697
- var questionOriginalFilePath = _path["default"].join.apply(_path["default"], [_originalJsonDirectoryOrFilePath5].concat(_toConsumableArray(questionSplitPath)));
698
- if (options.verbose) {
699
- console.log(" Reorganizing \"question\" file: ".concat(questionOriginalFilePath, "\u2026"));
700
- }
701
- var questionOriginalJson = _fsExtra["default"].readFileSync(questionOriginalFilePath, {
702
- encoding: "utf8"
703
- });
704
- var questionOriginal = validateRawData ? _questions.Convert.toQuestionWrapper(questionOriginalJson) : JSON.parse(questionOriginalJson);
705
- var question = questionOriginal.question;
706
- writeReorganizedJson(_datasetReorganizedDir5, question, _loaders.pathFromQuestionUid);
707
- }
708
- } catch (err) {
709
- _iterator25.e(err);
710
- } finally {
711
- _iterator25.f();
712
- }
713
- }
714
- break;
715
- }
716
- commitGit(_datasetReorganizedDir5, options);
717
- }
718
- } catch (err) {
719
- _iterator24.e(err);
720
- } finally {
721
- _iterator24.f();
722
- }
723
- }
724
- if (enabledDatasets & _datasets.EnabledDatasets.ComptesRendusSeances) {
725
- var _iterator26 = _createForOfIteratorHelper(_datasets.datasets.comptesRendusSeances),
726
- _step26;
727
- try {
728
- for (_iterator26.s(); !(_step26 = _iterator26.n()).done;) {
729
- var _dataset6 = _step26.value;
730
- var _originalJsonDirectoryOrFilePath6 = _path["default"].join(dataDir, _dataset6.filename);
731
- if (!options.silent) {
732
- console.log("Reorganizing ".concat(_originalJsonDirectoryOrFilePath6));
733
- }
734
- var _datasetName6 = _path["default"].basename(_originalJsonDirectoryOrFilePath6, ".xml");
735
- cloneGit(gitGroupUrl, _datasetName6, dataDir);
736
- var _datasetReorganizedDir6 = _path["default"].join(dataDir, _datasetName6);
737
- clearDirectory(_datasetReorganizedDir6);
738
- switch (_dataset6.structure) {
739
- case _datasets.DatasetStructure.SegmentedFiles:
740
- {
741
- var _iterator27 = _createForOfIteratorHelper((0, _file_systems.walkDir)(_originalJsonDirectoryOrFilePath6)),
742
- _step27;
743
- try {
744
- for (_iterator27.s(); !(_step27 = _iterator27.n()).done;) {
745
- var compteRenduSeanceSplitPath = _step27.value;
746
- var compteRenduSeanceFilename = compteRenduSeanceSplitPath[compteRenduSeanceSplitPath.length - 1];
747
- if (!compteRenduSeanceFilename.endsWith(".json")) {
748
- continue;
749
- }
750
- var compteRenduSeanceOriginalFilePath = _path["default"].join.apply(_path["default"], [_originalJsonDirectoryOrFilePath6].concat(_toConsumableArray(compteRenduSeanceSplitPath)));
751
- if (options.verbose) {
752
- console.log(" Reorganizing \"compteRenduSeance\" file: ".concat(compteRenduSeanceOriginalFilePath, "\u2026"));
753
- }
754
- var compteRenduSeanceOriginalJson = _fsExtra["default"].readFileSync(compteRenduSeanceOriginalFilePath, {
755
- encoding: "utf8"
756
- });
757
- var compteRenduSeanceOriginal = validateRawData ? _debats.Convert.toCompteRenduWrapper(compteRenduSeanceOriginalJson) : JSON.parse(compteRenduSeanceOriginalJson);
758
- var compteRenduSeance = compteRenduSeanceOriginal.compteRendu;
759
- writeReorganizedJson(_datasetReorganizedDir6, compteRenduSeance, _loaders.pathFromCompteRenduUid);
760
- }
761
- } catch (err) {
762
- _iterator27.e(err);
763
- } finally {
764
- _iterator27.f();
765
- }
766
- }
767
- break;
768
- }
769
- commitGit(_datasetReorganizedDir6, options);
770
- }
771
- } catch (err) {
772
- _iterator26.e(err);
773
- } finally {
774
- _iterator26.f();
775
- }
776
- }
777
-
778
- // Restore standard conversion of dates to JSON.
779
- Date.prototype.toJSON = _dates.existingDateToJson;
780
- return exitCode;
781
- }
782
- function writeAmendementReorganizedJson(datasetReorganizedDir, amendement) {
783
- var uidTexteLegislatif = amendement.texteLegislatifRef;
784
- _assert["default"].notStrictEqual(uidTexteLegislatif, undefined);
785
- var texteLegislatifDir = _path["default"].join(datasetReorganizedDir, uidTexteLegislatif);
786
- _fsExtra["default"].ensureDirSync(texteLegislatifDir);
787
- var reorganizedJsonFilePath = _path["default"].join(texteLegislatifDir, amendement.uid + ".json");
788
- _fsExtra["default"].writeFileSync(reorganizedJsonFilePath, JSON.stringify(amendement, null, 2), {
789
- encoding: "utf8"
790
- });
791
- }
792
- function writeReorganizedJson(dir, obj, pathFromUid) {
793
- var basename = pathFromUid(dir, obj.uid);
794
- _fsExtra["default"].writeFileSync("".concat(basename, ".json"), JSON.stringify(obj, null, 2), {
795
- encoding: "utf8"
796
- });
797
- }
798
- function main(argv) {
799
- var options = parseArgs(argv);
800
- return reorganizeData(options);
801
- }
802
-
803
- /* istanbul ignore if */
804
- if (process.argv[1].endsWith("reorganize_data.ts")) process.exit(main(process.argv));
805
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXNzZXJ0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfY29tbWFuZExpbmVBcmdzIiwiX2ZzRXh0cmEiLCJfcGF0aCIsIl9kYXRhc2V0cyIsIl9kYXRlcyIsImdpdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2ZpbGVfc3lzdGVtcyIsIl9sb2FkZXJzIiwiX2FjdGV1cnNfZXRfb3JnYW5lcyIsIl9hZ2VuZGFzIiwiX2FtZW5kZW1lbnRzIiwiX2Rvc3NpZXJzX2xlZ2lzbGF0aWZzIiwiX3NjcnV0aW5zIiwiX3F1ZXN0aW9ucyIsIl9kZWJhdHMiLCJfY2xpX2hlbHBlcnMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJfYXJyYXlXaXRob3V0SG9sZXMiLCJfaXRlcmFibGVUb0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlU3ByZWFkIiwiVHlwZUVycm9yIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImZyb20iLCJpc0FycmF5IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJkb25lIiwidmFsdWUiLCJmIiwibyIsIm5leHQiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwidGVzdCIsInBhcnNlQXJncyIsImFyZ3YiLCJvcHRpb25zRGVmaW5pdGlvbnMiLCJjbG9uZU9wdGlvbiIsImNvbW1pdE9wdGlvbiIsImNhdGVnb3JpZXNPcHRpb24iLCJsZWdpc2xhdHVyZU9wdGlvbiIsInJlbW90ZU9wdGlvbiIsInNpbGVudE9wdGlvbiIsInZlcmJvc2VPcHRpb24iLCJkYXRhRGlyRGVmYXVsdE9wdGlvbiIsImZldGNoRG9jdW1lbnRzT3B0aW9uIiwicGFyc2VEb2N1bWVudHNPcHRpb24iLCJkb2N1bWVudEZvcm1hdE9wdGlvbiIsInB1bGxPcHRpb24iLCJhbGlhcyIsImhlbHAiLCJ0eXBlIiwiQm9vbGVhbiIsIm9wdGlvbnMiLCJjb21tYW5kTGluZUFyZ3MiLCJjbGVhckRpcmVjdG9yeSIsImRpclBhdGgiLCJmcyIsImVuc3VyZURpclN5bmMiLCJfaXRlcmF0b3IiLCJyZWFkZGlyU3luYyIsIl9zdGVwIiwiZmlsZW5hbWUiLCJzdGFydHNXaXRoIiwicmVtb3ZlU3luYyIsInBhdGgiLCJqb2luIiwiZXJyIiwiY2xvbmVHaXQiLCJnaXRHcm91cFVybCIsImRhdGFzZXROYW1lIiwiZGF0YURpciIsImNsb25lIiwicmVvcmdhbml6ZURhdGEiLCJfb3B0aW9ucyRjbG9uZSIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJwYXRjaGVkRGF0ZVRvSnNvbiIsImV4aXRDb2RlIiwiY29tbWl0IiwidHJpbSIsInJlcGxhY2UiLCJ2YWxpZGF0ZVJhd0RhdGEiLCJlbmFibGVkRGF0YXNldHMiLCJnZXRFbmFibGVkRGF0YXNldHMiLCJjYXRlZ29yaWVzIiwiY2hvc2VuRGF0YXNldHMiLCJmaWx0ZXJCeUxlZ2lzbGF0dXJlIiwiZGF0YXNldHMiLCJsZWdpc2xhdHVyZSIsImNvbW1pdEdpdCIsImRhdGFzZXRSZW9yZ2FuaXplZERpciIsImVycm9yQ29kZSIsImNvbW1pdEFuZFB1c2giLCJyZW1vdGUiLCJFbmFibGVkRGF0YXNldHMiLCJBY3RldXJzRXRPcmdhbmVzIiwiX2l0ZXJhdG9yMiIsImFjdGV1cnNFdE9yZ2FuZXMiLCJfc3RlcDIiLCJkYXRhc2V0Iiwib3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCIsInNpbGVudCIsImNvbnNvbGUiLCJsb2ciLCJjb25jYXQiLCJiYXNlbmFtZSIsInB1bGwiLCJyZXNldEFuZFB1bGwiLCJhY3RldXJzUmVvcmdhbml6ZWREaXIiLCJta2RpclN5bmMiLCJvcmdhbmVzUmVvcmdhbml6ZWREaXIiLCJzdHJ1Y3R1cmUiLCJEYXRhc2V0U3RydWN0dXJlIiwiU2luZ2xlRmlsZSIsIm9yaWdpbmFsSnNvbiIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwib3JpZ2luYWxEYXRhIiwiQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQiLCJ0b0FjdGV1cnNFdE9yZ2FuZXMiLCJKU09OIiwicGFyc2UiLCJfaXRlcmF0b3IzIiwiYWN0ZXVycyIsImFjdGV1ciIsIl9zdGVwMyIsInJlb3JnYW5pemVkSnNvbkZpbGVQYXRoIiwidWlkIiwid3JpdGVGaWxlU3luYyIsInN0cmluZ2lmeSIsIl9pdGVyYXRvcjQiLCJvcmdhbmVzIiwib3JnYW5lIiwiX3N0ZXA0IiwiU2VnbWVudGVkRmlsZXMiLCJkZXBvcnRzQnlBY3RldXJVaWQiLCJleGlzdHNTeW5jIiwiX2l0ZXJhdG9yNSIsIndhbGtEaXIiLCJfc3RlcDUiLCJkZXBvcnRTcGxpdFBhdGgiLCJkZXBvcnRGaWxlbmFtZSIsImVuZHNXaXRoIiwiZGVwb3J0T3JpZ2luYWxGaWxlUGF0aCIsImFwcGx5IiwidmVyYm9zZSIsImRlcG9ydE9yaWdpbmFsSnNvbiIsImRlcG9ydE9yaWdpbmFsIiwidG9EZXBvcnQiLCJkZXBvcnQiLCJkZXBvcnRzIiwiYWN0ZXVyUmVmIiwidW5kZWZpbmVkIiwicHVzaCIsIl9pIiwiX09iamVjdCR2YWx1ZXMiLCJ2YWx1ZXMiLCJzb3J0IiwiYiIsImxvY2FsZUNvbXBhcmUiLCJtYW5kYXRzQnlBY3RldXJVaWQiLCJfaXRlcmF0b3I2IiwiX3N0ZXA2IiwibWFuZGF0U3BsaXRQYXRoIiwibWFuZGF0RmlsZW5hbWUiLCJtYW5kYXRPcmlnaW5hbEZpbGVQYXRoIiwibWFuZGF0T3JpZ2luYWxKc29uIiwibWFuZGF0T3JpZ2luYWwiLCJ0b01hbmRhdFdyYXBwZXIiLCJtYW5kYXQiLCJtYW5kYXRzIiwiX2kyIiwiX09iamVjdCR2YWx1ZXMyIiwiX2l0ZXJhdG9yNyIsIl9zdGVwNyIsImFjdGV1clNwbGl0UGF0aCIsImFjdGV1ckZpbGVuYW1lIiwiYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCIsImFjdGV1ck9yaWdpbmFsSnNvbiIsImFjdGV1ck9yaWdpbmFsIiwidG9BY3RldXIiLCJhY3RldXJVaWQiLCJhc3NlcnQiLCJzdHJpY3RFcXVhbCIsImFjdGV1clJlb3JnYW5pemVkSnNvbkZpbGVQYXRoIiwiX2l0ZXJhdG9yOCIsIl9zdGVwOCIsIm9yZ2FuZVNwbGl0UGF0aCIsIm9yZ2FuZUZpbGVuYW1lIiwib3JnYW5lT3JpZ2luYWxGaWxlUGF0aCIsIm9yZ2FuZU9yaWdpbmFsSnNvbiIsIm9yZ2FuZU9yaWdpbmFsIiwidG9PcmdhbmUiLCJvcmdhbmVSZW9yZ2FuaXplZEpzb25GaWxlUGF0aCIsIkFnZW5kYXMiLCJfaXRlcmF0b3I5IiwiYWdlbmRhcyIsIl9zdGVwOSIsIkFnZW5kYXNSYXdDb252ZXJ0IiwidG9BZ2VuZGFzIiwiX2l0ZXJhdG9yMTAiLCJyZXVuaW9ucyIsInJldW5pb24iLCJfc3RlcDEwIiwid3JpdGVSZW9yZ2FuaXplZEpzb24iLCJwYXRoRnJvbVJldW5pb25VaWQiLCJfaXRlcmF0b3IxMSIsIl9zdGVwMTEiLCJyZXVuaW9uU3BsaXRQYXRoIiwicmV1bmlvbkZpbGVuYW1lIiwicmV1bmlvbk9yaWdpbmFsRmlsZVBhdGgiLCJyZXVuaW9uT3JpZ2luYWxKc29uIiwicmV1bmlvbk9yaWdpbmFsIiwidG9SZXVuaW9uIiwiQW1lbmRlbWVudHMiLCJfaXRlcmF0b3IxMiIsImFtZW5kZW1lbnRzIiwiX3N0ZXAxMiIsIkFtZW5kZW1lbnRzUmF3Q29udmVydCIsInRvQW1lbmRlbWVudHMiLCJfaXRlcmF0b3IxMyIsInRleHRlc0V0QW1lbmRlbWVudHMiLCJ0ZXh0ZWxlZyIsIl9zdGVwMTMiLCJ0ZXh0ZUxlZ2lzbGF0aWYiLCJfaXRlcmF0b3IxNCIsIl9zdGVwMTQiLCJhbWVuZGVtZW50Iiwid3JpdGVBbWVuZGVtZW50UmVvcmdhbml6ZWRKc29uIiwiX2l0ZXJhdG9yMTUiLCJfc3RlcDE1IiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsImFtZW5kZW1lbnRGaWxlbmFtZSIsImFtZW5kZW1lbnRPcmlnaW5hbEZpbGVQYXRoIiwiYW1lbmRlbWVudE9yaWdpbmFsSnNvbiIsImFtZW5kZW1lbnRPcmlnaW5hbCIsInRvQW1lbmRlbWVudFdyYXBwZXIiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzIiwiX2l0ZXJhdG9yMTYiLCJkb3NzaWVyc0xlZ2lzbGF0aWZzIiwiX3N0ZXAxNiIsImRvY3VtZW50c0RpciIsImRvc3NpZXJzRGlyIiwiRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQiLCJ0b0Rvc3NpZXJzTGVnaXNsYXRpZnMiLCJfaXRlcmF0b3IxNyIsInRleHRlc0xlZ2lzbGF0aWZzIiwiZG9jdW1lbnQiLCJfc3RlcDE3IiwicGF0aEZyb21Eb2N1bWVudFVpZCIsIl9pdGVyYXRvcjE4IiwiZG9zc2llciIsIl9zdGVwMTgiLCJkb3NzaWVyUGFybGVtZW50YWlyZSIsInBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQiLCJfaXRlcmF0b3IxOSIsIl9zdGVwMTkiLCJkb2N1bWVudFNwbGl0UGF0aCIsImRvY3VtZW50RmlsZW5hbWUiLCJkb2N1bWVudE9yaWdpbmFsRmlsZVBhdGgiLCJkb2N1bWVudE9yaWdpbmFsSnNvbiIsImRvY3VtZW50T3JpZ2luYWwiLCJ0b0RvY3VtZW50IiwiX2l0ZXJhdG9yMjAiLCJfc3RlcDIwIiwiZG9zc2llclBhcmxlbWVudGFpcmVTcGxpdFBhdGgiLCJkb3NzaWVyUGFybGVtZW50YWlyZUZpbGVuYW1lIiwiZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRoIiwiZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEpzb24iLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsIiwidG9Eb3NzaWVyUGFybGVtZW50YWlyZSIsIlNjcnV0aW5zIiwiX2l0ZXJhdG9yMjEiLCJzY3J1dGlucyIsIl9zdGVwMjEiLCJTY3J1dGluc1Jhd0NvbnZlcnQiLCJ0b1NjcnV0aW5zIiwiX2l0ZXJhdG9yMjIiLCJzY3J1dGluIiwiX3N0ZXAyMiIsInBhdGhGcm9tU2NydXRpblVpZCIsIl9pdGVyYXRvcjIzIiwiX3N0ZXAyMyIsInNjcnV0aW5TcGxpdFBhdGgiLCJzY3J1dGluRmlsZW5hbWUiLCJzY3J1dGluT3JpZ2luYWxGaWxlUGF0aCIsInNjcnV0aW5PcmlnaW5hbEpzb24iLCJzY3J1dGluT3JpZ2luYWwiLCJ0b1NjcnV0aW5XcmFwcGVyIiwiUXVlc3Rpb25zIiwiX2l0ZXJhdG9yMjQiLCJxdWVzdGlvbnMiLCJfc3RlcDI0IiwiX2l0ZXJhdG9yMjUiLCJfc3RlcDI1IiwicXVlc3Rpb25TcGxpdFBhdGgiLCJxdWVzdGlvbkZpbGVuYW1lIiwicXVlc3Rpb25PcmlnaW5hbEZpbGVQYXRoIiwicXVlc3Rpb25PcmlnaW5hbEpzb24iLCJxdWVzdGlvbk9yaWdpbmFsIiwiUXVlc3Rpb25zUmF3Q29udmVydCIsInRvUXVlc3Rpb25XcmFwcGVyIiwicXVlc3Rpb24iLCJwYXRoRnJvbVF1ZXN0aW9uVWlkIiwiQ29tcHRlc1JlbmR1c1NlYW5jZXMiLCJfaXRlcmF0b3IyNiIsImNvbXB0ZXNSZW5kdXNTZWFuY2VzIiwiX3N0ZXAyNiIsIl9pdGVyYXRvcjI3IiwiX3N0ZXAyNyIsImNvbXB0ZVJlbmR1U2VhbmNlU3BsaXRQYXRoIiwiY29tcHRlUmVuZHVTZWFuY2VGaWxlbmFtZSIsImNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWxGaWxlUGF0aCIsImNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWxKc29uIiwiY29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbCIsIkNvbXB0ZXNSZW5kdXNSYXdDb252ZXJ0IiwidG9Db21wdGVSZW5kdVdyYXBwZXIiLCJjb21wdGVSZW5kdVNlYW5jZSIsImNvbXB0ZVJlbmR1IiwicGF0aEZyb21Db21wdGVSZW5kdVVpZCIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInVpZFRleHRlTGVnaXNsYXRpZiIsInRleHRlTGVnaXNsYXRpZlJlZiIsIm5vdFN0cmljdEVxdWFsIiwidGV4dGVMZWdpc2xhdGlmRGlyIiwiZGlyIiwib2JqIiwicGF0aEZyb21VaWQiLCJtYWluIiwicHJvY2VzcyIsImV4aXQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9yZW9yZ2FuaXplX2RhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHtcbiAgZGF0YXNldHMsXG4gIERhdGFzZXRTdHJ1Y3R1cmUsXG4gIEVuYWJsZWREYXRhc2V0cyxcbiAgZ2V0RW5hYmxlZERhdGFzZXRzLFxuICBmaWx0ZXJCeUxlZ2lzbGF0dXJlLFxufSBmcm9tIFwiLi4vZGF0YXNldHNcIlxuaW1wb3J0IHsgZXhpc3RpbmdEYXRlVG9Kc29uLCBwYXRjaGVkRGF0ZVRvSnNvbiB9IGZyb20gXCIuLi9kYXRlc1wiXG5pbXBvcnQgKiBhcyBnaXQgZnJvbSBcIi4uL2dpdFwiXG5pbXBvcnQgeyB3YWxrRGlyIH0gZnJvbSBcIi4uL2ZpbGVfc3lzdGVtc1wiXG5pbXBvcnQge1xuICBwYXRoRnJvbUNvbXB0ZVJlbmR1VWlkLFxuICBwYXRoRnJvbURvY3VtZW50VWlkLFxuICBwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkLFxuICBwYXRoRnJvbVF1ZXN0aW9uVWlkLFxuICBwYXRoRnJvbVJldW5pb25VaWQsXG4gIHBhdGhGcm9tU2NydXRpblVpZCxcbn0gZnJvbSBcIi4uL2xvYWRlcnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvYWN0ZXVyc19ldF9vcmdhbmVzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQWdlbmRhc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL2FnZW5kYXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBbWVuZGVtZW50c1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL2FtZW5kZW1lbnRzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgU2NydXRpbnNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9zY3J1dGluc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIFF1ZXN0aW9uc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL3F1ZXN0aW9uc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIENvbXB0ZXNSZW5kdXNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9kZWJhdHNcIlxuaW1wb3J0IHtcbiAgY2xvbmVPcHRpb24sXG4gIGNvbW1pdE9wdGlvbixcbiAgY2F0ZWdvcmllc09wdGlvbixcbiAgbGVnaXNsYXR1cmVPcHRpb24sXG4gIHJlbW90ZU9wdGlvbixcbiAgc2lsZW50T3B0aW9uLFxuICB2ZXJib3NlT3B0aW9uLFxuICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbiAgcHVsbE9wdGlvbixcbiAgZmV0Y2hEb2N1bWVudHNPcHRpb24sXG4gIHBhcnNlRG9jdW1lbnRzT3B0aW9uLFxuICBkb2N1bWVudEZvcm1hdE9wdGlvbixcbn0gZnJvbSBcIi4vc2hhcmVkL2NsaV9oZWxwZXJzXCJcblxuZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ3Y6IHN0cmluZ1tdKTogYW55IHtcbiAgY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICAgIGNsb25lT3B0aW9uLFxuICAgIGNvbW1pdE9wdGlvbixcbiAgICBjYXRlZ29yaWVzT3B0aW9uLFxuICAgIGxlZ2lzbGF0dXJlT3B0aW9uLFxuICAgIHJlbW90ZU9wdGlvbixcbiAgICBzaWxlbnRPcHRpb24sXG4gICAgdmVyYm9zZU9wdGlvbixcbiAgICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbiAgICBmZXRjaERvY3VtZW50c09wdGlvbixcbiAgICBwYXJzZURvY3VtZW50c09wdGlvbixcbiAgICBkb2N1bWVudEZvcm1hdE9wdGlvbixcbiAgICBwdWxsT3B0aW9uLFxuICAgIHtcbiAgICAgIGFsaWFzOiBcIlZcIixcbiAgICAgIGhlbHA6IFwiZG9uJ3QgdmFsaWRhdGUgcmF3IGRhdGFcIixcbiAgICAgIG5hbWU6IFwibm8tdmFsaWRhdGUtcmF3XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMsIHtcbiAgICBhcmd2OiBhcmd2LFxuICB9KVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBjbGVhckRpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgZnMuZW5zdXJlRGlyU3luYyhkaXJQYXRoKVxuICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRpclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlbmFtZS5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZW5hbWUpKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9uZUdpdChcbiAgZ2l0R3JvdXBVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGF0YXNldE5hbWU6IHN0cmluZyxcbiAgZGF0YURpcjogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGdpdC5jbG9uZShnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG59XG5cbmZ1bmN0aW9uIHJlb3JnYW5pemVEYXRhKG9wdGlvbnM6IGFueSk6IG51bWJlciB7XG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gcGF0Y2hlZERhdGVUb0pzb25cbiAgbGV0IGV4aXRDb2RlID0gb3B0aW9ucy5jb21taXQgPyAxMCA6IDBcbiAgY29uc3QgZ2l0R3JvdXBVcmwgPSBvcHRpb25zLmNsb25lPy50cmltKCkucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICBjb25zdCB2YWxpZGF0ZVJhd0RhdGEgPSAhb3B0aW9uc1tcIm5vLXZhbGlkYXRlLXJhd1wiXVxuICBjb25zdCBlbmFibGVkRGF0YXNldHMgPSBnZXRFbmFibGVkRGF0YXNldHMob3B0aW9ucy5jYXRlZ29yaWVzKVxuICBsZXQgY2hvc2VuRGF0YXNldHMgPSBmaWx0ZXJCeUxlZ2lzbGF0dXJlKGRhdGFzZXRzLCBvcHRpb25zLmxlZ2lzbGF0dXJlKVxuXG4gIGZ1bmN0aW9uIGNvbW1pdEdpdChkYXRhc2V0UmVvcmdhbml6ZWREaXI6IHN0cmluZywgb3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgICAgICBcIk5vdXZlbGxlIG1vaXNzb25cIixcbiAgICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgICApXG4gICAgICBpZiAoXG4gICAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgICAgKGV4aXRDb2RlID09PSAwICYmIGVycm9yQ29kZSAhPT0gMCAmJiBlcnJvckNvZGUgIT09IDEwKVxuICAgICAgKSB7XG4gICAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBjbG9uZUdpdChnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGlmIChvcHRpb25zLnB1bGwpIHtcbiAgICAgICAgZ2l0LnJlc2V0QW5kUHVsbChkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICB9XG4gICAgICBjbGVhckRpcmVjdG9yeShkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIGNvbnN0IGFjdGV1cnNSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIFwiYWN0ZXVyc1wiKVxuICAgICAgZnMubWtkaXJTeW5jKGFjdGV1cnNSZW9yZ2FuaXplZERpcilcbiAgICAgIGNvbnN0IG9yZ2FuZXNSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIFwib3JnYW5lc1wiKVxuICAgICAgZnMubWtkaXJTeW5jKG9yZ2FuZXNSZW9yZ2FuaXplZERpcilcblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9BY3RldXJzRXRPcmdhbmVzKG9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCBhY3RldXIgb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydC5hY3RldXJzLmFjdGV1cikge1xuICAgICAgICAgICAgICBjb25zdCByZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIGFjdGV1cnNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBhY3RldXIudWlkW1wiI3RleHRcIl0gKyBcIi5qc29uXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgICAgICByZW9yZ2FuaXplZEpzb25GaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShhY3RldXIsIG51bGwsIDIpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3JnYW5lIG9mIG9yaWdpbmFsRGF0YS5leHBvcnQub3JnYW5lcy5vcmdhbmUpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmdhbmVzUmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgb3JnYW5lLnVpZCArIFwiLmpzb25cIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9yZ2FuZSwgbnVsbCwgMiksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcG9ydHNCeUFjdGV1clVpZDoge1xuICAgICAgICAgICAgICBbYWN0ZXVyVWlkOiBzdHJpbmddOiB7IHVpZDogc3RyaW5nIH1bXVxuICAgICAgICAgICAgfSA9IHt9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZzLmV4aXN0c1N5bmMoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsIFwiZGVwb3J0XCIpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBvcnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIFtcImRlcG9ydFwiXSxcbiAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydEZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICAgIGRlcG9ydFNwbGl0UGF0aFtkZXBvcnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgICBpZiAoIWRlcG9ydEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydE9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgLi4uZGVwb3J0U3BsaXRQYXRoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgYCAgTG9hZGluZyBcImRlcG9ydFwiIGZpbGU6ICR7ZGVwb3J0T3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnRPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICAgIGRlcG9ydE9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydE9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9EZXBvcnQoZGVwb3J0T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGRlcG9ydE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnQgPSBkZXBvcnRPcmlnaW5hbC5kZXBvcnRcbiAgICAgICAgICAgICAgICBsZXQgZGVwb3J0cyA9IGRlcG9ydHNCeUFjdGV1clVpZFtkZXBvcnQuYWN0ZXVyUmVmXVxuICAgICAgICAgICAgICAgIGlmIChkZXBvcnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGRlcG9ydHMgPSBkZXBvcnRzQnlBY3RldXJVaWRbZGVwb3J0LmFjdGV1clJlZl0gPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZXBvcnRzLnB1c2goZGVwb3J0KVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBvcnRzIG9mIE9iamVjdC52YWx1ZXMoZGVwb3J0c0J5QWN0ZXVyVWlkKSkge1xuICAgICAgICAgICAgICAgIGRlcG9ydHMuc29ydCgoYSwgYikgPT5cbiAgICAgICAgICAgICAgICAgIGEudWlkLmxlbmd0aCA9PT0gYi51aWQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gYS51aWQubG9jYWxlQ29tcGFyZShiLnVpZClcbiAgICAgICAgICAgICAgICAgICAgOiBhLnVpZC5sZW5ndGggLSBiLnVpZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1hbmRhdHNCeUFjdGV1clVpZDoge1xuICAgICAgICAgICAgICBbYWN0ZXVyVWlkOiBzdHJpbmddOiB7IHVpZDogc3RyaW5nIH1bXVxuICAgICAgICAgICAgfSA9IHt9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZzLmV4aXN0c1N5bmMoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsIFwibWFuZGF0XCIpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYW5kYXRTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIFtcIm1hbmRhdFwiXSxcbiAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmRhdEZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICAgIG1hbmRhdFNwbGl0UGF0aFttYW5kYXRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgICBpZiAoIW1hbmRhdEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmRhdE9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgLi4ubWFuZGF0U3BsaXRQYXRoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgYCAgTG9hZGluZyBcIm1hbmRhdFwiIGZpbGU6ICR7bWFuZGF0T3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXRPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICAgIG1hbmRhdE9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmRhdE9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9NYW5kYXRXcmFwcGVyKFxuICAgICAgICAgICAgICAgICAgICAgIG1hbmRhdE9yaWdpbmFsSnNvbixcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG1hbmRhdE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXQgPSBtYW5kYXRPcmlnaW5hbC5tYW5kYXRcbiAgICAgICAgICAgICAgICBsZXQgbWFuZGF0cyA9IG1hbmRhdHNCeUFjdGV1clVpZFttYW5kYXQuYWN0ZXVyUmVmXVxuICAgICAgICAgICAgICAgIGlmIChtYW5kYXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIG1hbmRhdHMgPSBtYW5kYXRzQnlBY3RldXJVaWRbbWFuZGF0LmFjdGV1clJlZl0gPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYW5kYXRzLnB1c2gobWFuZGF0KVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYW5kYXRzIG9mIE9iamVjdC52YWx1ZXMobWFuZGF0c0J5QWN0ZXVyVWlkKSkge1xuICAgICAgICAgICAgICAgIG1hbmRhdHMuc29ydCgoYSwgYikgPT5cbiAgICAgICAgICAgICAgICAgIGEudWlkLmxlbmd0aCA9PT0gYi51aWQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gYS51aWQubG9jYWxlQ29tcGFyZShiLnVpZClcbiAgICAgICAgICAgICAgICAgICAgOiBhLnVpZC5sZW5ndGggLSBiLnVpZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0ZXVyU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImFjdGV1clwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyRmlsZW5hbWUgPSBhY3RldXJTcGxpdFBhdGhbYWN0ZXVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghYWN0ZXVyRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLmFjdGV1clNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJhY3RldXJcIiBmaWxlOiAke2FjdGV1ck9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0FjdGV1cihhY3RldXJPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGFjdGV1ck9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyID0gYWN0ZXVyT3JpZ2luYWwuYWN0ZXVyXG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1clVpZCA9IGFjdGV1ci51aWRbXCIjdGV4dFwiXVxuICAgICAgICAgICAgICBjb25zdCBkZXBvcnRzID0gZGVwb3J0c0J5QWN0ZXVyVWlkW2FjdGV1clVpZF1cbiAgICAgICAgICAgICAgaWYgKGRlcG9ydHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhY3RldXIuZGVwb3J0cywgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGFjdGV1ci5kZXBvcnRzID0geyBkZXBvcnQ6IGRlcG9ydHMgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG1hbmRhdHMgPSBtYW5kYXRzQnlBY3RldXJVaWRbYWN0ZXVyVWlkXVxuICAgICAgICAgICAgICBpZiAobWFuZGF0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFjdGV1ci5tYW5kYXRzLCB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgYWN0ZXVyLm1hbmRhdHMgPSB7IG1hbmRhdDogbWFuZGF0cyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyUmVvcmdhbml6ZWRKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBhY3RldXJzUmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgYWN0ZXVyVWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYWN0ZXVyUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYWN0ZXVyLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9yZ2FuZVNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJvcmdhbmVcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZUZpbGVuYW1lID0gb3JnYW5lU3BsaXRQYXRoW29yZ2FuZVNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIW9yZ2FuZUZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZU9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5vcmdhbmVTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwib3JnYW5lXCIgZmlsZTogJHtvcmdhbmVPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZU9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIG9yZ2FuZU9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9PcmdhbmUob3JnYW5lT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmdhbmVPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZSA9IG9yZ2FuZU9yaWdpbmFsLm9yZ2FuZVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVSZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yZ2FuZXNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBvcmdhbmUudWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgb3JnYW5lUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb21taXRHaXQoZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjbGVhckRpcmVjdG9yeShkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IEFnZW5kYXNSYXdDb252ZXJ0LnRvQWdlbmRhcyhvcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmV1bmlvbiBvZiBvcmlnaW5hbERhdGEucmV1bmlvbnMucmV1bmlvbikge1xuICAgICAgICAgICAgICB3cml0ZVJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgcmV1bmlvbixcbiAgICAgICAgICAgICAgICBwYXRoRnJvbVJldW5pb25VaWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmV1bmlvblNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJyZXVuaW9uXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uRmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIHJldW5pb25TcGxpdFBhdGhbcmV1bmlvblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIXJldW5pb25GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLnJldW5pb25TcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwicmV1bmlvblwiIGZpbGU6ICR7cmV1bmlvbk9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbk9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHJldW5pb25PcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb25PcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBZ2VuZGFzUmF3Q29udmVydC50b1JldW5pb24ocmV1bmlvbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UocmV1bmlvbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbiA9IHJldW5pb25PcmlnaW5hbC5yZXVuaW9uXG4gICAgICAgICAgICAgIHdyaXRlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICByZXVuaW9uLFxuICAgICAgICAgICAgICAgIHBhdGhGcm9tUmV1bmlvblVpZCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb21taXRHaXQoZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQW1lbmRlbWVudHMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMuYW1lbmRlbWVudHMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBjbG9uZUdpdChnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNsZWFyRGlyZWN0b3J5KGRhdGFzZXRSZW9yZ2FuaXplZERpcilcblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gQW1lbmRlbWVudHNSYXdDb252ZXJ0LnRvQW1lbmRlbWVudHMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRleHRlTGVnaXNsYXRpZiBvZiBvcmlnaW5hbERhdGEudGV4dGVzRXRBbWVuZGVtZW50c1xuICAgICAgICAgICAgICAudGV4dGVsZWcpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50IG9mIHRleHRlTGVnaXNsYXRpZi5hbWVuZGVtZW50cykge1xuICAgICAgICAgICAgICAgIHdyaXRlQW1lbmRlbWVudFJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICAgIGFtZW5kZW1lbnQsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudEZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBhbWVuZGVtZW50U3BsaXRQYXRoW2FtZW5kZW1lbnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFhbWVuZGVtZW50RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudE9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5hbWVuZGVtZW50U3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcImFtZW5kZW1lbnRcIiBmaWxlOiAke2FtZW5kZW1lbnRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBhbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQW1lbmRlbWVudHNSYXdDb252ZXJ0LnRvQW1lbmRlbWVudFdyYXBwZXIoXG4gICAgICAgICAgICAgICAgICAgIGFtZW5kZW1lbnRPcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGFtZW5kZW1lbnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnQgPSBhbWVuZGVtZW50T3JpZ2luYWwuYW1lbmRlbWVudFxuICAgICAgICAgICAgICB3cml0ZUFtZW5kZW1lbnRSZW9yZ2FuaXplZEpzb24oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBhbWVuZGVtZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb21taXRHaXQoZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuRG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5kb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjbGVhckRpcmVjdG9yeShkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIGNvbnN0IGRvY3VtZW50c0RpciA9IHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIFwiZG9jdW1lbnRzXCIpXG4gICAgICBmcy5ta2RpclN5bmMoZG9jdW1lbnRzRGlyKVxuICAgICAgY29uc3QgZG9zc2llcnNEaXIgPSBwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBcImRvc3NpZXJzXCIpXG4gICAgICBmcy5ta2RpclN5bmMoZG9zc2llcnNEaXIpXG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0LnRvRG9zc2llcnNMZWdpc2xhdGlmcyhcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbixcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jdW1lbnQgb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydC50ZXh0ZXNMZWdpc2xhdGlmc1xuICAgICAgICAgICAgICAuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgd3JpdGVSZW9yZ2FuaXplZEpzb24oZG9jdW1lbnRzRGlyLCBkb2N1bWVudCwgcGF0aEZyb21Eb2N1bWVudFVpZClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCB7IGRvc3NpZXJQYXJsZW1lbnRhaXJlIH0gb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydFxuICAgICAgICAgICAgICAuZG9zc2llcnNMZWdpc2xhdGlmcy5kb3NzaWVyKSB7XG4gICAgICAgICAgICAgIHdyaXRlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRvc3NpZXJzRGlyLFxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICAgICAgICAgICAgICAgIHBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jdW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wiZG9jdW1lbnRcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIGRvY3VtZW50U3BsaXRQYXRoW2RvY3VtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghZG9jdW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5kb2N1bWVudFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJkb2N1bWVudFwiIGZpbGU6ICR7ZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQudG9Eb2N1bWVudChkb2N1bWVudE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZG9jdW1lbnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gZG9jdW1lbnRPcmlnaW5hbC5kb2N1bWVudFxuICAgICAgICAgICAgICB3cml0ZVJlb3JnYW5pemVkSnNvbihkb2N1bWVudHNEaXIsIGRvY3VtZW50LCBwYXRoRnJvbURvY3VtZW50VWlkKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImRvc3NpZXJQYXJsZW1lbnRhaXJlXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aFtcbiAgICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIGlmICghZG9zc2llclBhcmxlbWVudGFpcmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5kb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJkb3NzaWVyUGFybGVtZW50YWlyZVwiIGZpbGU6ICR7ZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZShcbiAgICAgICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZSA9XG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbC5kb3NzaWVyUGFybGVtZW50YWlyZVxuICAgICAgICAgICAgICB3cml0ZVJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICBkb3NzaWVyc0RpcixcbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgICAgICAgICAgICAgICBwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNvbW1pdEdpdChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMpXG4gICAgfVxuICB9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuU2NydXRpbnMpIHtcbiAgICBmb3IgKGxldCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLnNjcnV0aW5zKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjbGVhckRpcmVjdG9yeShkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IFNjcnV0aW5zUmF3Q29udmVydC50b1NjcnV0aW5zKG9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCBzY3J1dGluIG9mIG9yaWdpbmFsRGF0YS5zY3J1dGlucy5zY3J1dGluKSB7XG4gICAgICAgICAgICAgIHdyaXRlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBzY3J1dGluLFxuICAgICAgICAgICAgICAgIHBhdGhGcm9tU2NydXRpblVpZCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzY3J1dGluU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW5GaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgc2NydXRpblNwbGl0UGF0aFtzY3J1dGluU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghc2NydXRpbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW5PcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uc2NydXRpblNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJzY3J1dGluXCIgZmlsZTogJHtzY3J1dGluT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgc2NydXRpbk9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbk9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IFNjcnV0aW5zUmF3Q29udmVydC50b1NjcnV0aW5XcmFwcGVyKHNjcnV0aW5PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKHNjcnV0aW5PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW4gPSBzY3J1dGluT3JpZ2luYWwuc2NydXRpblxuICAgICAgICAgICAgICB3cml0ZVJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgc2NydXRpbixcbiAgICAgICAgICAgICAgICBwYXRoRnJvbVNjcnV0aW5VaWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY29tbWl0R2l0KGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlF1ZXN0aW9ucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5xdWVzdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBjbG9uZUdpdChnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNsZWFyRGlyZWN0b3J5KGRhdGFzZXRSZW9yZ2FuaXplZERpcilcblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCBxdWVzdGlvblNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbkZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBxdWVzdGlvblNwbGl0UGF0aFtxdWVzdGlvblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIXF1ZXN0aW9uRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb25PcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4ucXVlc3Rpb25TcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwicXVlc3Rpb25cIiBmaWxlOiAke3F1ZXN0aW9uT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbk9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gUXVlc3Rpb25zUmF3Q29udmVydC50b1F1ZXN0aW9uV3JhcHBlcihxdWVzdGlvbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UocXVlc3Rpb25PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gcXVlc3Rpb25PcmlnaW5hbC5xdWVzdGlvblxuICAgICAgICAgICAgICB3cml0ZVJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgICAgICAgICAgcGF0aEZyb21RdWVzdGlvblVpZCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb21taXRHaXQoZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQ29tcHRlc1JlbmR1c1NlYW5jZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuY29tcHRlc1JlbmR1c1NlYW5jZXMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsIFwiLnhtbFwiKVxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjbGVhckRpcmVjdG9yeShkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tcHRlUmVuZHVTZWFuY2VTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgY29tcHRlUmVuZHVTZWFuY2VGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgY29tcHRlUmVuZHVTZWFuY2VTcGxpdFBhdGhbXG4gICAgICAgICAgICAgICAgICBjb21wdGVSZW5kdVNlYW5jZVNwbGl0UGF0aC5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICBpZiAoIWNvbXB0ZVJlbmR1U2VhbmNlRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgY29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uY29tcHRlUmVuZHVTZWFuY2VTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwiY29tcHRlUmVuZHVTZWFuY2VcIiBmaWxlOiAke2NvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IENvbXB0ZXNSZW5kdXNSYXdDb252ZXJ0LnRvQ29tcHRlUmVuZHVXcmFwcGVyKFxuICAgICAgICAgICAgICAgICAgICBjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsSnNvbixcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoY29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgICAgY29uc3QgY29tcHRlUmVuZHVTZWFuY2UgPSBjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsLmNvbXB0ZVJlbmR1XG4gICAgICAgICAgICAgIHdyaXRlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBjb21wdGVSZW5kdVNlYW5jZSxcbiAgICAgICAgICAgICAgICBwYXRoRnJvbUNvbXB0ZVJlbmR1VWlkLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNvbW1pdEdpdChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdG9yZSBzdGFuZGFyZCBjb252ZXJzaW9uIG9mIGRhdGVzIHRvIEpTT04uXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGV4aXN0aW5nRGF0ZVRvSnNvblxuXG4gIHJldHVybiBleGl0Q29kZVxufVxuXG5mdW5jdGlvbiB3cml0ZUFtZW5kZW1lbnRSZW9yZ2FuaXplZEpzb24oXG4gIGRhdGFzZXRSZW9yZ2FuaXplZERpcjogc3RyaW5nLFxuICBhbWVuZGVtZW50OiB7XG4gICAgdWlkOiBzdHJpbmdcbiAgICB0ZXh0ZUxlZ2lzbGF0aWZSZWY6IHN0cmluZ1xuICB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IHVpZFRleHRlTGVnaXNsYXRpZiA9IGFtZW5kZW1lbnQudGV4dGVMZWdpc2xhdGlmUmVmXG4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbCh1aWRUZXh0ZUxlZ2lzbGF0aWYsIHVuZGVmaW5lZClcbiAgY29uc3QgdGV4dGVMZWdpc2xhdGlmRGlyID0gcGF0aC5qb2luKFxuICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICB1aWRUZXh0ZUxlZ2lzbGF0aWYsXG4gIClcbiAgZnMuZW5zdXJlRGlyU3luYyh0ZXh0ZUxlZ2lzbGF0aWZEaXIpXG4gIGNvbnN0IHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgIHRleHRlTGVnaXNsYXRpZkRpcixcbiAgICBhbWVuZGVtZW50LnVpZCArIFwiLmpzb25cIixcbiAgKVxuICBmcy53cml0ZUZpbGVTeW5jKFxuICAgIHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgIEpTT04uc3RyaW5naWZ5KGFtZW5kZW1lbnQsIG51bGwsIDIpLFxuICAgIHtcbiAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICB9LFxuICApXG59XG5cbmZ1bmN0aW9uIHdyaXRlUmVvcmdhbml6ZWRKc29uPFQgZXh0ZW5kcyB7IHVpZDogc3RyaW5nIH0+KFxuICBkaXI6IHN0cmluZyxcbiAgb2JqOiBULFxuICBwYXRoRnJvbVVpZDogKGRpcjogc3RyaW5nLCB1aWQ6IHN0cmluZykgPT4gc3RyaW5nLFxuKTogdm9pZCB7XG4gIGNvbnN0IGJhc2VuYW1lID0gcGF0aEZyb21VaWQoZGlyLCBvYmoudWlkKVxuICBmcy53cml0ZUZpbGVTeW5jKGAke2Jhc2VuYW1lfS5qc29uYCwgSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKSwge1xuICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgfSlcbn1cblxuZnVuY3Rpb24gbWFpbihhcmd2OiBhbnkpOiBudW1iZXIge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VBcmdzKGFyZ3YpXG4gIHJldHVybiByZW9yZ2FuaXplRGF0YShvcHRpb25zKVxufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmIChwcm9jZXNzLmFyZ3ZbMV0uZW5kc1dpdGgoXCJyZW9yZ2FuaXplX2RhdGEudHNcIikpXG4gIHByb2Nlc3MuZXhpdChtYWluKHByb2Nlc3MuYXJndikpXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEs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