@tricoteuses/assemblee 1.0.0-next.2 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +2 -0
  2. package/lib/api.js +23 -7
  3. package/lib/api.mjs +41 -0
  4. package/lib/bugs/acteur-00010/plugin.test.js +139 -33
  5. package/lib/bugs/acteur-00010/plugin.test.mjs +33 -0
  6. package/lib/bugs/acteur-00010.js +166 -24
  7. package/lib/bugs/acteur-00010.mjs +31 -0
  8. package/lib/bugs/agenda-00002/plugin.test.js +178 -52
  9. package/lib/bugs/agenda-00002/plugin.test.mjs +52 -0
  10. package/lib/bugs/agenda-00002.js +507 -143
  11. package/lib/bugs/agenda-00002.mjs +197 -0
  12. package/lib/bugs/agenda-00008/plugin.test.js +143 -31
  13. package/lib/bugs/agenda-00008/plugin.test.mjs +31 -0
  14. package/lib/bugs/agenda-00008.js +180 -25
  15. package/lib/bugs/agenda-00008.mjs +30 -0
  16. package/lib/bugs/agenda-00011/plugin.test.js +371 -156
  17. package/lib/bugs/agenda-00011/plugin.test.mjs +156 -0
  18. package/lib/bugs/agenda-00011.js +416 -117
  19. package/lib/bugs/agenda-00011.mjs +150 -0
  20. package/lib/bugs.js +591 -54
  21. package/lib/bugs.mjs +93 -0
  22. package/lib/cleaners/actes_legislatifs.js +149 -61
  23. package/lib/cleaners/actes_legislatifs.mjs +311 -0
  24. package/lib/cleaners/acteurs.js +255 -123
  25. package/lib/cleaners/acteurs.mjs +211 -0
  26. package/lib/cleaners/amendements.js +242 -117
  27. package/lib/cleaners/amendements.mjs +292 -0
  28. package/lib/cleaners/documents.js +147 -62
  29. package/lib/cleaners/documents.mjs +162 -0
  30. package/lib/cleaners/dossiers_legislatifs.js +132 -45
  31. package/lib/cleaners/dossiers_legislatifs.mjs +123 -0
  32. package/lib/cleaners/index.js +64 -8
  33. package/lib/cleaners/index.mjs +8 -0
  34. package/lib/cleaners/organes.js +54 -21
  35. package/lib/cleaners/organes.mjs +64 -0
  36. package/lib/cleaners/reunions.js +237 -127
  37. package/lib/cleaners/reunions.mjs +318 -0
  38. package/lib/cleaners/scrutins.js +261 -99
  39. package/lib/cleaners/scrutins.mjs +254 -0
  40. package/lib/cleaners/xml.js +81 -16
  41. package/lib/cleaners/xml.mjs +42 -0
  42. package/lib/datasets.js +284 -153
  43. package/lib/datasets.mjs +596 -0
  44. package/lib/dates.js +93 -34
  45. package/lib/dates.mjs +98 -0
  46. package/lib/dossiers_legislatifs.js +107 -33
  47. package/lib/dossiers_legislatifs.mjs +215 -0
  48. package/lib/file_systems.js +203 -35
  49. package/lib/file_systems.mjs +64 -0
  50. package/lib/git.js +139 -41
  51. package/lib/git.mjs +114 -0
  52. package/lib/index.js +310 -16
  53. package/lib/index.mjs +16 -0
  54. package/lib/inserters.js +355 -131
  55. package/lib/inserters.mjs +413 -0
  56. package/lib/loaders.js +900 -440
  57. package/lib/loaders.mjs +678 -0
  58. package/lib/organes.js +15 -5
  59. package/lib/organes.mjs +18 -0
  60. package/lib/parsers/documents.js +241 -89
  61. package/lib/parsers/documents.mjs +433 -0
  62. package/lib/parsers/index.js +36 -3
  63. package/lib/parsers/index.mjs +3 -0
  64. package/lib/parsers/recherche_amendements.js +616 -173
  65. package/lib/parsers/recherche_amendements.mjs +189 -0
  66. package/lib/raw_types/acteurs_et_organes.d.ts +36 -148
  67. package/lib/raw_types/acteurs_et_organes.js +228 -506
  68. package/lib/raw_types/acteurs_et_organes.mjs +1240 -0
  69. package/lib/raw_types/agendas.js +165 -75
  70. package/lib/raw_types/agendas.mjs +944 -0
  71. package/lib/raw_types/amendements.js +165 -77
  72. package/lib/raw_types/amendements.mjs +1040 -0
  73. package/lib/raw_types/dossiers_legislatifs.d.ts +1 -43
  74. package/lib/raw_types/dossiers_legislatifs.js +181 -143
  75. package/lib/raw_types/dossiers_legislatifs.mjs +1792 -0
  76. package/lib/raw_types/scrutins.js +144 -61
  77. package/lib/raw_types/scrutins.mjs +645 -0
  78. package/lib/scripts/bugs_helper.js +657 -155
  79. package/lib/scripts/bugs_helper.mjs +286 -0
  80. package/lib/scripts/clean_data.js +380 -145
  81. package/lib/scripts/clean_data.mjs +190 -0
  82. package/lib/scripts/clean_reorganized_data.js +627 -331
  83. package/lib/scripts/clean_reorganized_data.mjs +520 -0
  84. package/lib/scripts/diff_amendements.js +159 -73
  85. package/lib/scripts/diff_amendements.mjs +234 -0
  86. package/lib/scripts/document_dossiers_legislatifs.js +570 -288
  87. package/lib/scripts/document_dossiers_legislatifs.mjs +494 -0
  88. package/lib/scripts/get_today_reunions.js +37 -20
  89. package/lib/scripts/get_today_reunions.mjs +41 -0
  90. package/lib/scripts/merge_scrutins.js +121 -39
  91. package/lib/scripts/merge_scrutins.mjs +69 -0
  92. package/lib/scripts/parse_textes_lois.js +179 -125
  93. package/lib/scripts/parse_textes_lois.mjs +215 -0
  94. package/lib/scripts/raw_types_from_amendements.js +276 -77
  95. package/lib/scripts/raw_types_from_amendements.mjs +118 -0
  96. package/lib/scripts/reorganize_data.js +867 -446
  97. package/lib/scripts/reorganize_data.mjs +712 -0
  98. package/lib/scripts/retrieve_deputes_photos.js +378 -157
  99. package/lib/scripts/retrieve_deputes_photos.mjs +230 -0
  100. package/lib/scripts/retrieve_documents.js +648 -172
  101. package/lib/scripts/retrieve_documents.mjs +292 -0
  102. package/lib/scripts/retrieve_open_data.js +286 -85
  103. package/lib/scripts/retrieve_open_data.mjs +125 -0
  104. package/lib/scripts/retrieve_pending_amendments.js +302 -69
  105. package/lib/scripts/retrieve_pending_amendments.mjs +130 -0
  106. package/lib/scripts/retrieve_senateurs_photos.js +374 -198
  107. package/lib/scripts/retrieve_senateurs_photos.mjs +277 -0
  108. package/lib/scripts/retrieve_textes_lois.js +343 -89
  109. package/lib/scripts/retrieve_textes_lois.mjs +168 -0
  110. package/lib/scripts/test_load.js +30 -11
  111. package/lib/scripts/test_load.mjs +26 -0
  112. package/lib/scripts/test_load_big_files.js +30 -11
  113. package/lib/scripts/test_load_big_files.mjs +26 -0
  114. package/lib/scripts/validate_json.js +370 -120
  115. package/lib/scripts/validate_json.mjs +216 -0
  116. package/lib/shared_types/codes_actes.js +50 -15
  117. package/lib/shared_types/codes_actes.mjs +228 -0
  118. package/lib/strings.js +16 -3
  119. package/lib/strings.mjs +7 -0
  120. package/lib/types/acteurs_et_organes.js +156 -71
  121. package/lib/types/acteurs_et_organes.mjs +918 -0
  122. package/lib/types/agendas.js +154 -67
  123. package/lib/types/agendas.mjs +623 -0
  124. package/lib/types/amendements.js +166 -77
  125. package/lib/types/amendements.mjs +885 -0
  126. package/lib/types/dossiers_legislatifs.d.ts +1 -42
  127. package/lib/types/dossiers_legislatifs.js +182 -143
  128. package/lib/types/dossiers_legislatifs.mjs +1120 -0
  129. package/lib/types/legislatures.js +12 -3
  130. package/lib/types/legislatures.mjs +9 -0
  131. package/lib/types/scrutins.js +144 -61
  132. package/lib/types/scrutins.mjs +528 -0
  133. package/lib/urls.js +44 -25
  134. package/lib/urls.mjs +201 -0
  135. package/package.json +33 -12
@@ -1,11 +1,114 @@
1
- import { execSync } from "child_process";
2
- import commandLineArgs from "command-line-args";
3
- import deepEqual from "deep-equal";
4
- import fs from "fs-extra";
5
- import path from "path";
6
- import { commit } from "../git.js";
7
- import { iterRechercheRawAmendements } from "../parsers/index.js";
8
- const optionsDefinitions = [{
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
+
5
+ require("core-js/modules/es.function.name.js");
6
+
7
+ require("core-js/modules/es.array.from.js");
8
+
9
+ require("core-js/modules/es.array.is-array.js");
10
+
11
+ require("core-js/modules/es.symbol.to-string-tag.js");
12
+
13
+ require("core-js/modules/es.json.to-string-tag.js");
14
+
15
+ require("core-js/modules/es.math.to-string-tag.js");
16
+
17
+ require("core-js/modules/es.object.define-property.js");
18
+
19
+ require("core-js/modules/es.object.create.js");
20
+
21
+ require("core-js/modules/es.object.get-prototype-of.js");
22
+
23
+ require("core-js/modules/es.array.for-each.js");
24
+
25
+ require("core-js/modules/web.dom-collections.for-each.js");
26
+
27
+ require("core-js/modules/es.object.set-prototype-of.js");
28
+
29
+ require("core-js/modules/es.array.reverse.js");
30
+
31
+ require("core-js/modules/es.symbol.js");
32
+
33
+ require("core-js/modules/es.symbol.description.js");
34
+
35
+ require("core-js/modules/es.object.to-string.js");
36
+
37
+ require("core-js/modules/es.symbol.async-iterator.js");
38
+
39
+ require("core-js/modules/es.symbol.iterator.js");
40
+
41
+ require("core-js/modules/es.array.iterator.js");
42
+
43
+ require("core-js/modules/es.string.iterator.js");
44
+
45
+ require("core-js/modules/web.dom-collections.iterator.js");
46
+
47
+ require("core-js/modules/es.promise.js");
48
+
49
+ require("core-js/modules/es.regexp.exec.js");
50
+
51
+ require("core-js/modules/es.string.replace.js");
52
+
53
+ require("core-js/modules/es.string.trim.js");
54
+
55
+ require("core-js/modules/es.array.join.js");
56
+
57
+ require("core-js/modules/es.array.concat.js");
58
+
59
+ require("core-js/modules/es.string.split.js");
60
+
61
+ require("core-js/modules/es.array.slice.js");
62
+
63
+ var _child_process = require("child_process");
64
+
65
+ var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
66
+
67
+ var _deepEqual = _interopRequireDefault(require("deep-equal"));
68
+
69
+ var _fsExtra = _interopRequireDefault(require("fs-extra"));
70
+
71
+ var _path = _interopRequireDefault(require("path"));
72
+
73
+ var _git = require("../git");
74
+
75
+ var _parsers = require("../parsers");
76
+
77
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
78
+
79
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return generator._invoke = function (innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; }(innerFn, self, context), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; this._invoke = function (method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); }; } function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (undefined === method) { if (context.delegate = null, "throw" === context.method) { if (delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method)) return ContinueSentinel; context.method = "throw", context.arg = new TypeError("The iterator does not provide a 'throw' method"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, define(Gp, "constructor", GeneratorFunctionPrototype), define(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (object) { var keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) { "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
80
+
81
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
82
+
83
+ 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."); }
84
+
85
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
86
+
87
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
88
+
89
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
90
+
91
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
92
+
93
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
94
+
95
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
96
+
97
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
98
+
99
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
100
+
101
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
102
+
103
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
104
+
105
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
106
+
107
+ function _asyncIterator(iterable) { var method, async, sync, retry = 2; for ("undefined" != typeof Symbol && (async = Symbol.asyncIterator, sync = Symbol.iterator); retry--;) { if (async && null != (method = iterable[async])) return method.call(iterable); if (sync && null != (method = iterable[sync])) return new AsyncFromSyncIterator(method.call(iterable)); async = "@@asyncIterator", sync = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
108
+
109
+ function AsyncFromSyncIterator(s) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var done = r.done; return Promise.resolve(r.value).then(function (value) { return { value: value, done: done }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(s) { this.s = s, this.n = s.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, "return": function _return(value) { var ret = this.s["return"]; return void 0 === ret ? Promise.resolve({ value: value, done: !0 }) : AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments)); }, "throw": function _throw(value) { var thr = this.s["return"]; return void 0 === thr ? Promise.reject(value) : AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(s); }
110
+
111
+ var optionsDefinitions = [{
9
112
  alias: "C",
10
113
  help: "clone repositories from given group (or organization) git URL",
11
114
  name: "clone",
@@ -47,84 +150,214 @@ const optionsDefinitions = [{
47
150
  name: "dataDir",
48
151
  type: String
49
152
  }];
50
- const options = commandLineArgs(optionsDefinitions);
153
+ var options = (0, _commandLineArgs["default"])(optionsDefinitions);
51
154
 
52
155
  function commitAndPush(repositoryDir, options, remotes) {
53
- let error = false;
156
+ var error = false;
54
157
 
55
158
  if (options.commit) {
56
- commit(repositoryDir, "Nouvelle moisson");
57
-
58
- for (const remote of remotes || []) {
59
- try {
60
- execSync(`git push ${remote} master`, {
61
- cwd: repositoryDir,
62
- env: process.env,
63
- encoding: "utf-8",
64
- stdio: ["ignore", "ignore", "pipe"]
65
- });
66
- } catch (childProcess) {
67
- // Don't stop when push fails.
68
- console.error(childProcess.output);
69
- error = true;
159
+ (0, _git.commit)(repositoryDir, "Nouvelle moisson");
160
+
161
+ var _iterator2 = _createForOfIteratorHelper(remotes || []),
162
+ _step2;
163
+
164
+ try {
165
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
166
+ var remote = _step2.value;
167
+
168
+ try {
169
+ (0, _child_process.execSync)("git push ".concat(remote, " master"), {
170
+ cwd: repositoryDir,
171
+ env: process.env,
172
+ encoding: "utf-8",
173
+ stdio: ["ignore", "ignore", "pipe"]
174
+ });
175
+ } catch (childProcess) {
176
+ // Don't stop when push fails.
177
+ console.error(childProcess.output);
178
+ error = true;
179
+ }
70
180
  }
181
+ } catch (err) {
182
+ _iterator2.e(err);
183
+ } finally {
184
+ _iterator2.f();
71
185
  }
72
186
  }
73
187
 
74
188
  return error;
75
189
  }
76
190
 
77
- async function main() {
78
- const gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined;
191
+ function main() {
192
+ return _main.apply(this, arguments);
193
+ }
79
194
 
80
- if (gitGroupUrl !== undefined) {
81
- execSync(`git clone ${gitGroupUrl}/Amendements_en_attente.git`, {
82
- cwd: options.dataDir,
83
- env: process.env,
84
- encoding: "utf-8",
85
- stdio: ["ignore", "ignore", "pipe"]
86
- });
87
- }
195
+ function _main() {
196
+ _main = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
197
+ var gitGroupUrl, amendementsDir, cacheDir, _i, _arr, etat, url, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step$value, amendementUrlPath, amendement, amendementUrlPathSplitted, amendementFilePath, existingAmendement;
88
198
 
89
- const amendementsDir = path.join(options.dataDir, "Amendements_en_attente");
90
- await fs.ensureDir(amendementsDir);
91
- const cacheDir = path.join(options.dataDir, "Amendements_en_attente_cache");
92
-
93
- for (const etat of ["En recevabilité", "En traitement"]) {
94
- const url = `https://www.assemblee-nationale.fr/dyn/${options.legislature}/amendements?etat=${encodeURIComponent(etat)}`;
95
-
96
- for await (const [amendementUrlPath, amendement] of iterRechercheRawAmendements(cacheDir, url, options.incremental, null, null, {
97
- silent: options.silent,
98
- verbose: options.verbose
99
- })) {
100
- const amendementUrlPathSplitted = amendementUrlPath.split("/");
101
- const amendementFilePath = path.join(amendementsDir, ...amendementUrlPathSplitted.slice(2)) + ".json";
102
- await fs.ensureDir(path.dirname(amendementFilePath));
103
- const existingAmendement = (await fs.pathExists(amendementFilePath)) ? await fs.readJson(amendementFilePath) : null;
104
-
105
- if (!deepEqual(amendement, existingAmendement)) {
106
- if (!options.silent) {
107
- if (existingAmendement === null) {
108
- console.log(`Adding amendement JSON: ${amendementFilePath}…`);
109
- } else {
110
- console.log(`Updating amendement JSON: ${amendementFilePath}…`);
111
- }
112
- }
199
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
200
+ while (1) {
201
+ switch (_context.prev = _context.next) {
202
+ case 0:
203
+ gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined;
113
204
 
114
- await fs.writeJson(amendementFilePath, amendement, {
115
- spaces: 2
116
- });
117
- }
118
- }
119
- }
205
+ if (gitGroupUrl !== undefined) {
206
+ (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/Amendements_en_attente.git"), {
207
+ cwd: options.dataDir,
208
+ env: process.env,
209
+ encoding: "utf-8",
210
+ stdio: ["ignore", "ignore", "pipe"]
211
+ });
212
+ }
120
213
 
121
- if (commitAndPush(amendementsDir, options, options.remote)) {
122
- process.exit(2);
123
- }
214
+ amendementsDir = _path["default"].join(options.dataDir, "Amendements_en_attente");
215
+ _context.next = 5;
216
+ return _fsExtra["default"].ensureDir(amendementsDir);
217
+
218
+ case 5:
219
+ cacheDir = _path["default"].join(options.dataDir, "Amendements_en_attente_cache");
220
+ _i = 0, _arr = ["En recevabilité", "En traitement"];
221
+
222
+ case 7:
223
+ if (!(_i < _arr.length)) {
224
+ _context.next = 58;
225
+ break;
226
+ }
227
+
228
+ etat = _arr[_i];
229
+ url = "https://www.assemblee-nationale.fr/dyn/".concat(options.legislature, "/amendements?etat=").concat(encodeURIComponent(etat));
230
+ _iteratorAbruptCompletion = false;
231
+ _didIteratorError = false;
232
+ _context.prev = 12;
233
+ _iterator = _asyncIterator((0, _parsers.iterRechercheRawAmendements)(cacheDir, url, options.incremental, null, null, {
234
+ silent: options.silent,
235
+ verbose: options.verbose
236
+ }));
237
+
238
+ case 14:
239
+ _context.next = 16;
240
+ return _iterator.next();
241
+
242
+ case 16:
243
+ if (!(_iteratorAbruptCompletion = !(_step = _context.sent).done)) {
244
+ _context.next = 39;
245
+ break;
246
+ }
247
+
248
+ _step$value = _slicedToArray(_step.value, 2), amendementUrlPath = _step$value[0], amendement = _step$value[1];
249
+ amendementUrlPathSplitted = amendementUrlPath.split("/");
250
+ amendementFilePath = _path["default"].join.apply(_path["default"], [amendementsDir].concat(_toConsumableArray(amendementUrlPathSplitted.slice(2)))) + ".json";
251
+ _context.next = 22;
252
+ return _fsExtra["default"].ensureDir(_path["default"].dirname(amendementFilePath));
253
+
254
+ case 22:
255
+ _context.next = 24;
256
+ return _fsExtra["default"].pathExists(amendementFilePath);
257
+
258
+ case 24:
259
+ if (!_context.sent) {
260
+ _context.next = 30;
261
+ break;
262
+ }
263
+
264
+ _context.next = 27;
265
+ return _fsExtra["default"].readJson(amendementFilePath);
266
+
267
+ case 27:
268
+ _context.t0 = _context.sent;
269
+ _context.next = 31;
270
+ break;
271
+
272
+ case 30:
273
+ _context.t0 = null;
274
+
275
+ case 31:
276
+ existingAmendement = _context.t0;
277
+
278
+ if ((0, _deepEqual["default"])(amendement, existingAmendement)) {
279
+ _context.next = 36;
280
+ break;
281
+ }
282
+
283
+ if (!options.silent) {
284
+ if (existingAmendement === null) {
285
+ console.log("Adding amendement JSON: ".concat(amendementFilePath, "\u2026"));
286
+ } else {
287
+ console.log("Updating amendement JSON: ".concat(amendementFilePath, "\u2026"));
288
+ }
289
+ }
290
+
291
+ _context.next = 36;
292
+ return _fsExtra["default"].writeJson(amendementFilePath, amendement, {
293
+ spaces: 2
294
+ });
295
+
296
+ case 36:
297
+ _iteratorAbruptCompletion = false;
298
+ _context.next = 14;
299
+ break;
300
+
301
+ case 39:
302
+ _context.next = 45;
303
+ break;
304
+
305
+ case 41:
306
+ _context.prev = 41;
307
+ _context.t1 = _context["catch"](12);
308
+ _didIteratorError = true;
309
+ _iteratorError = _context.t1;
310
+
311
+ case 45:
312
+ _context.prev = 45;
313
+ _context.prev = 46;
314
+
315
+ if (!(_iteratorAbruptCompletion && _iterator["return"] != null)) {
316
+ _context.next = 50;
317
+ break;
318
+ }
319
+
320
+ _context.next = 50;
321
+ return _iterator["return"]();
322
+
323
+ case 50:
324
+ _context.prev = 50;
325
+
326
+ if (!_didIteratorError) {
327
+ _context.next = 53;
328
+ break;
329
+ }
330
+
331
+ throw _iteratorError;
332
+
333
+ case 53:
334
+ return _context.finish(50);
335
+
336
+ case 54:
337
+ return _context.finish(45);
338
+
339
+ case 55:
340
+ _i++;
341
+ _context.next = 7;
342
+ break;
343
+
344
+ case 58:
345
+ if (commitAndPush(amendementsDir, options, options.remote)) {
346
+ process.exit(2);
347
+ }
348
+
349
+ case 59:
350
+ case "end":
351
+ return _context.stop();
352
+ }
353
+ }
354
+ }, _callee, null, [[12, 41, 45, 55], [46,, 50, 54]]);
355
+ }));
356
+ return _main.apply(this, arguments);
124
357
  }
125
358
 
126
- main().catch(error => {
359
+ main()["catch"](function (error) {
127
360
  console.log(error);
128
361
  process.exit(1);
129
362
  });
130
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImRlZXBFcXVhbCIsImZzIiwicGF0aCIsImNvbW1pdCIsIml0ZXJSZWNoZXJjaGVSYXdBbWVuZGVtZW50cyIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImFsaWFzIiwiaGVscCIsIm5hbWUiLCJ0eXBlIiwiU3RyaW5nIiwiQm9vbGVhbiIsImRlZmF1bHRWYWx1ZSIsIm11bHRpcGxlIiwiZGVmYXVsdE9wdGlvbiIsIm9wdGlvbnMiLCJjb21taXRBbmRQdXNoIiwicmVwb3NpdG9yeURpciIsInJlbW90ZXMiLCJlcnJvciIsInJlbW90ZSIsImN3ZCIsImVudiIsInByb2Nlc3MiLCJlbmNvZGluZyIsInN0ZGlvIiwiY2hpbGRQcm9jZXNzIiwiY29uc29sZSIsIm91dHB1dCIsIm1haW4iLCJnaXRHcm91cFVybCIsImNsb25lIiwidHJpbSIsInJlcGxhY2UiLCJ1bmRlZmluZWQiLCJkYXRhRGlyIiwiYW1lbmRlbWVudHNEaXIiLCJqb2luIiwiZW5zdXJlRGlyIiwiY2FjaGVEaXIiLCJldGF0IiwidXJsIiwibGVnaXNsYXR1cmUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJhbWVuZGVtZW50VXJsUGF0aCIsImFtZW5kZW1lbnQiLCJpbmNyZW1lbnRhbCIsInNpbGVudCIsInZlcmJvc2UiLCJhbWVuZGVtZW50VXJsUGF0aFNwbGl0dGVkIiwic3BsaXQiLCJhbWVuZGVtZW50RmlsZVBhdGgiLCJzbGljZSIsImRpcm5hbWUiLCJleGlzdGluZ0FtZW5kZW1lbnQiLCJwYXRoRXhpc3RzIiwicmVhZEpzb24iLCJsb2ciLCJ3cml0ZUpzb24iLCJzcGFjZXMiLCJleGl0IiwiY2F0Y2giXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9yZXRyaWV2ZV9wZW5kaW5nX2FtZW5kbWVudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZGVlcEVxdWFsIGZyb20gXCJkZWVwLWVxdWFsXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5pbXBvcnQgeyBjb21taXQgfSBmcm9tIFwiLi4vZ2l0XCJcbmltcG9ydCB7IGl0ZXJSZWNoZXJjaGVSYXdBbWVuZGVtZW50cyB9IGZyb20gXCIuLi9wYXJzZXJzXCJcblxuY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICB7XG4gICAgYWxpYXM6IFwiQ1wiLFxuICAgIGhlbHA6IFwiY2xvbmUgcmVwb3NpdG9yaWVzIGZyb20gZ2l2ZW4gZ3JvdXAgKG9yIG9yZ2FuaXphdGlvbikgZ2l0IFVSTFwiLFxuICAgIG5hbWU6IFwiY2xvbmVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJjXCIsXG4gICAgaGVscDogXCJjb21taXQgY2xlYW4gZmlsZXNcIixcbiAgICBuYW1lOiBcImNvbW1pdFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJpXCIsXG4gICAgaGVscDogXCJpbmNyZW1lbnRhbCBtb2RlOiByZXRyaWV2ZSBvbmx5IGFtZW5kbWVudHMgd2hvc2UgcG9zaXRpb24gaW4gc2VhcmNoIGhhcyBjaGFuZ2VkXCIsXG4gICAgbmFtZTogXCJpbmNyZW1lbnRhbFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJsXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIjE2XCIsXG4gICAgbmFtZTogXCJsZWdpc2xhdHVyZVwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInJcIixcbiAgICBoZWxwOiBcInB1c2ggY29tbWl0IHRvIGdpdmVuIHJlbW90ZVwiLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG5hbWU6IFwicmVtb3RlXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwic1wiLFxuICAgIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gICAgbmFtZTogXCJzaWxlbnRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwidlwiLFxuICAgIGhlbHA6IFwidmVyYm9zZSBsb2dzXCIsXG4gICAgbmFtZTogXCJ2ZXJib3NlXCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGRlZmF1bHRPcHRpb246IHRydWUsXG4gICAgaGVscDogXCJkaXJlY3RvcnkgY29udGFpbmluZyBBc3NlbWJsw6llIG9wZW4gZGF0YSBmaWxlc1wiLFxuICAgIG5hbWU6IFwiZGF0YURpclwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbl1cbmNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zKVxuXG5mdW5jdGlvbiBjb21taXRBbmRQdXNoKFxuICByZXBvc2l0b3J5RGlyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSxcbiAgcmVtb3Rlcz86IHN0cmluZ1tdLFxuKTogYm9vbGVhbiB7XG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgIGNvbW1pdChyZXBvc2l0b3J5RGlyLCBcIk5vdXZlbGxlIG1vaXNzb25cIilcbiAgICBmb3IgKGNvbnN0IHJlbW90ZSBvZiByZW1vdGVzIHx8IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IHB1c2ggJHtyZW1vdGV9IG1hc3RlcmAsIHtcbiAgICAgICAgICBjd2Q6IHJlcG9zaXRvcnlEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIC8vIERvbid0IHN0b3Agd2hlbiBwdXNoIGZhaWxzLlxuICAgICAgICBjb25zb2xlLmVycm9yKChjaGlsZFByb2Nlc3MgYXMgYW55KS5vdXRwdXQpXG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZXJyb3Jcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgY29uc3QgZ2l0R3JvdXBVcmwgPSBvcHRpb25zLmNsb25lXG4gICAgPyBvcHRpb25zLmNsb25lLnRyaW0oKS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgOiB1bmRlZmluZWRcbiAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9L0FtZW5kZW1lbnRzX2VuX2F0dGVudGUuZ2l0YCwge1xuICAgICAgY3dkOiBvcHRpb25zLmRhdGFEaXIsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBhbWVuZGVtZW50c0RpciA9IHBhdGguam9pbihvcHRpb25zLmRhdGFEaXIsIFwiQW1lbmRlbWVudHNfZW5fYXR0ZW50ZVwiKVxuICBhd2FpdCBmcy5lbnN1cmVEaXIoYW1lbmRlbWVudHNEaXIpXG4gIGNvbnN0IGNhY2hlRGlyID0gcGF0aC5qb2luKG9wdGlvbnMuZGF0YURpciwgXCJBbWVuZGVtZW50c19lbl9hdHRlbnRlX2NhY2hlXCIpXG4gIGZvciAoY29uc3QgZXRhdCBvZiBbXCJFbiByZWNldmFiaWxpdMOpXCIsIFwiRW4gdHJhaXRlbWVudFwiXSkge1xuICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyL2R5bi8ke1xuICAgICAgb3B0aW9ucy5sZWdpc2xhdHVyZVxuICAgIH0vYW1lbmRlbWVudHM/ZXRhdD0ke2VuY29kZVVSSUNvbXBvbmVudChldGF0KX1gXG4gICAgZm9yIGF3YWl0IChjb25zdCBbXG4gICAgICBhbWVuZGVtZW50VXJsUGF0aCxcbiAgICAgIGFtZW5kZW1lbnQsXG4gICAgXSBvZiBpdGVyUmVjaGVyY2hlUmF3QW1lbmRlbWVudHMoXG4gICAgICBjYWNoZURpcixcbiAgICAgIHVybCxcbiAgICAgIG9wdGlvbnMuaW5jcmVtZW50YWwsXG4gICAgICBudWxsLFxuICAgICAgbnVsbCxcbiAgICAgIHsgc2lsZW50OiBvcHRpb25zLnNpbGVudCwgdmVyYm9zZTogb3B0aW9ucy52ZXJib3NlIH0sXG4gICAgKSkge1xuICAgICAgY29uc3QgYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZCA9IGFtZW5kZW1lbnRVcmxQYXRoIS5zcGxpdChcIi9cIilcbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRGaWxlUGF0aCA9XG4gICAgICAgIHBhdGguam9pbihhbWVuZGVtZW50c0RpciwgLi4uYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZC5zbGljZSgyKSkgK1xuICAgICAgICBcIi5qc29uXCJcbiAgICAgIGF3YWl0IGZzLmVuc3VyZURpcihwYXRoLmRpcm5hbWUoYW1lbmRlbWVudEZpbGVQYXRoKSlcbiAgICAgIGNvbnN0IGV4aXN0aW5nQW1lbmRlbWVudCA9IChhd2FpdCBmcy5wYXRoRXhpc3RzKGFtZW5kZW1lbnRGaWxlUGF0aCkpXG4gICAgICAgID8gYXdhaXQgZnMucmVhZEpzb24oYW1lbmRlbWVudEZpbGVQYXRoKVxuICAgICAgICA6IG51bGxcbiAgICAgIGlmICghZGVlcEVxdWFsKGFtZW5kZW1lbnQsIGV4aXN0aW5nQW1lbmRlbWVudCkpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGlmIChleGlzdGluZ0FtZW5kZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBZGRpbmcgYW1lbmRlbWVudCBKU09OOiAke2FtZW5kZW1lbnRGaWxlUGF0aH3igKZgKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVXBkYXRpbmcgYW1lbmRlbWVudCBKU09OOiAke2FtZW5kZW1lbnRGaWxlUGF0aH3igKZgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBmcy53cml0ZUpzb24oYW1lbmRlbWVudEZpbGVQYXRoLCBhbWVuZGVtZW50LCB7IHNwYWNlczogMiB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb21taXRBbmRQdXNoKGFtZW5kZW1lbnRzRGlyLCBvcHRpb25zLCBvcHRpb25zLnJlbW90ZSkpIHtcbiAgICBwcm9jZXNzLmV4aXQoMilcbiAgfVxufVxuXG5tYWluKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gIGNvbnNvbGUubG9nKGVycm9yKVxuICBwcm9jZXNzLmV4aXQoMSlcbn0pXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVQsUUFBeUIsZUFBekI7QUFDQSxPQUFPQyxlQUFQLE1BQTRCLG1CQUE1QjtBQUNBLE9BQU9DLFNBQVAsTUFBc0IsWUFBdEI7QUFDQSxPQUFPQyxFQUFQLE1BQWUsVUFBZjtBQUNBLE9BQU9DLElBQVAsTUFBaUIsTUFBakI7U0FFU0MsTTtTQUNBQywyQjtBQUVULE1BQU1DLGtCQUFrQixHQUFHLENBQ3pCO0VBQ0VDLEtBQUssRUFBRSxHQURUO0VBRUVDLElBQUksRUFBRSwrREFGUjtFQUdFQyxJQUFJLEVBQUUsT0FIUjtFQUlFQyxJQUFJLEVBQUVDO0FBSlIsQ0FEeUIsRUFPekI7RUFDRUosS0FBSyxFQUFFLEdBRFQ7RUFFRUMsSUFBSSxFQUFFLG9CQUZSO0VBR0VDLElBQUksRUFBRSxRQUhSO0VBSUVDLElBQUksRUFBRUU7QUFKUixDQVB5QixFQWF6QjtFQUNFTCxLQUFLLEVBQUUsR0FEVDtFQUVFQyxJQUFJLEVBQUUsaUZBRlI7RUFHRUMs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
363
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIlN0cmluZyIsIkJvb2xlYW4iLCJkZWZhdWx0VmFsdWUiLCJtdWx0aXBsZSIsImRlZmF1bHRPcHRpb24iLCJvcHRpb25zIiwiY29tbWFuZExpbmVBcmdzIiwiY29tbWl0QW5kUHVzaCIsInJlcG9zaXRvcnlEaXIiLCJyZW1vdGVzIiwiZXJyb3IiLCJjb21taXQiLCJyZW1vdGUiLCJleGVjU3luYyIsImN3ZCIsImVudiIsInByb2Nlc3MiLCJlbmNvZGluZyIsInN0ZGlvIiwiY2hpbGRQcm9jZXNzIiwiY29uc29sZSIsIm91dHB1dCIsIm1haW4iLCJnaXRHcm91cFVybCIsImNsb25lIiwidHJpbSIsInJlcGxhY2UiLCJ1bmRlZmluZWQiLCJkYXRhRGlyIiwiYW1lbmRlbWVudHNEaXIiLCJwYXRoIiwiam9pbiIsImZzIiwiZW5zdXJlRGlyIiwiY2FjaGVEaXIiLCJldGF0IiwidXJsIiwibGVnaXNsYXR1cmUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJpdGVyUmVjaGVyY2hlUmF3QW1lbmRlbWVudHMiLCJpbmNyZW1lbnRhbCIsInNpbGVudCIsInZlcmJvc2UiLCJhbWVuZGVtZW50VXJsUGF0aCIsImFtZW5kZW1lbnQiLCJhbWVuZGVtZW50VXJsUGF0aFNwbGl0dGVkIiwic3BsaXQiLCJhbWVuZGVtZW50RmlsZVBhdGgiLCJzbGljZSIsImRpcm5hbWUiLCJwYXRoRXhpc3RzIiwicmVhZEpzb24iLCJleGlzdGluZ0FtZW5kZW1lbnQiLCJkZWVwRXF1YWwiLCJsb2ciLCJ3cml0ZUpzb24iLCJzcGFjZXMiLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvcmV0cmlldmVfcGVuZGluZ19hbWVuZG1lbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IGRlZXBFcXVhbCBmcm9tIFwiZGVlcC1lcXVhbFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHsgY29tbWl0IH0gZnJvbSBcIi4uL2dpdFwiXG5pbXBvcnQgeyBpdGVyUmVjaGVyY2hlUmF3QW1lbmRlbWVudHMgfSBmcm9tIFwiLi4vcGFyc2Vyc1wiXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAge1xuICAgIGFsaWFzOiBcIkNcIixcbiAgICBoZWxwOiBcImNsb25lIHJlcG9zaXRvcmllcyBmcm9tIGdpdmVuIGdyb3VwIChvciBvcmdhbml6YXRpb24pIGdpdCBVUkxcIixcbiAgICBuYW1lOiBcImNsb25lXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwiY1wiLFxuICAgIGhlbHA6IFwiY29tbWl0IGNsZWFuIGZpbGVzXCIsXG4gICAgbmFtZTogXCJjb21taXRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwiaVwiLFxuICAgIGhlbHA6IFwiaW5jcmVtZW50YWwgbW9kZTogcmV0cmlldmUgb25seSBhbWVuZG1lbnRzIHdob3NlIHBvc2l0aW9uIGluIHNlYXJjaCBoYXMgY2hhbmdlZFwiLFxuICAgIG5hbWU6IFwiaW5jcmVtZW50YWxcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwibFwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCIxNlwiLFxuICAgIG5hbWU6IFwibGVnaXNsYXR1cmVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJyXCIsXG4gICAgaGVscDogXCJwdXNoIGNvbW1pdCB0byBnaXZlbiByZW1vdGVcIixcbiAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICBuYW1lOiBcInJlbW90ZVwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInNcIixcbiAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgIG5hbWU6IFwic2lsZW50XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInZcIixcbiAgICBoZWxwOiBcInZlcmJvc2UgbG9nc1wiLFxuICAgIG5hbWU6IFwidmVyYm9zZVwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0T3B0aW9uOiB0cnVlLFxuICAgIGhlbHA6IFwiZGlyZWN0b3J5IGNvbnRhaW5pbmcgQXNzZW1ibMOpZSBvcGVuIGRhdGEgZmlsZXNcIixcbiAgICBuYW1lOiBcImRhdGFEaXJcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG5dXG5jb25zdCBvcHRpb25zID0gY29tbWFuZExpbmVBcmdzKG9wdGlvbnNEZWZpbml0aW9ucylcblxuZnVuY3Rpb24gY29tbWl0QW5kUHVzaChcbiAgcmVwb3NpdG9yeURpcjogc3RyaW5nLFxuICBvcHRpb25zOiBhbnksXG4gIHJlbW90ZXM/OiBzdHJpbmdbXSxcbik6IGJvb2xlYW4ge1xuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICBjb21taXQocmVwb3NpdG9yeURpciwgXCJOb3V2ZWxsZSBtb2lzc29uXCIpXG4gICAgZm9yIChjb25zdCByZW1vdGUgb2YgcmVtb3RlcyB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBwdXNoICR7cmVtb3RlfSBtYXN0ZXJgLCB7XG4gICAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICAvLyBEb24ndCBzdG9wIHdoZW4gcHVzaCBmYWlscy5cbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIGNvbnN0IGdpdEdyb3VwVXJsID0gb3B0aW9ucy5jbG9uZVxuICAgID8gb3B0aW9ucy5jbG9uZS50cmltKCkucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICAgIDogdW5kZWZpbmVkXG4gIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS9BbWVuZGVtZW50c19lbl9hdHRlbnRlLmdpdGAsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5kYXRhRGlyLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgYW1lbmRlbWVudHNEaXIgPSBwYXRoLmpvaW4ob3B0aW9ucy5kYXRhRGlyLCBcIkFtZW5kZW1lbnRzX2VuX2F0dGVudGVcIilcbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGFtZW5kZW1lbnRzRGlyKVxuICBjb25zdCBjYWNoZURpciA9IHBhdGguam9pbihvcHRpb25zLmRhdGFEaXIsIFwiQW1lbmRlbWVudHNfZW5fYXR0ZW50ZV9jYWNoZVwiKVxuICBmb3IgKGNvbnN0IGV0YXQgb2YgW1wiRW4gcmVjZXZhYmlsaXTDqVwiLCBcIkVuIHRyYWl0ZW1lbnRcIl0pIHtcbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci9keW4vJHtcbiAgICAgIG9wdGlvbnMubGVnaXNsYXR1cmVcbiAgICB9L2FtZW5kZW1lbnRzP2V0YXQ9JHtlbmNvZGVVUklDb21wb25lbnQoZXRhdCl9YFxuICAgIGZvciBhd2FpdCAoY29uc3QgW1xuICAgICAgYW1lbmRlbWVudFVybFBhdGgsXG4gICAgICBhbWVuZGVtZW50LFxuICAgIF0gb2YgaXRlclJlY2hlcmNoZVJhd0FtZW5kZW1lbnRzKFxuICAgICAgY2FjaGVEaXIsXG4gICAgICB1cmwsXG4gICAgICBvcHRpb25zLmluY3JlbWVudGFsLFxuICAgICAgbnVsbCxcbiAgICAgIG51bGwsXG4gICAgICB7IHNpbGVudDogb3B0aW9ucy5zaWxlbnQsIHZlcmJvc2U6IG9wdGlvbnMudmVyYm9zZSB9LFxuICAgICkpIHtcbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRVcmxQYXRoU3BsaXR0ZWQgPSBhbWVuZGVtZW50VXJsUGF0aCEuc3BsaXQoXCIvXCIpXG4gICAgICBjb25zdCBhbWVuZGVtZW50RmlsZVBhdGggPVxuICAgICAgICBwYXRoLmpvaW4oYW1lbmRlbWVudHNEaXIsIC4uLmFtZW5kZW1lbnRVcmxQYXRoU3BsaXR0ZWQuc2xpY2UoMikpICtcbiAgICAgICAgXCIuanNvblwiXG4gICAgICBhd2FpdCBmcy5lbnN1cmVEaXIocGF0aC5kaXJuYW1lKGFtZW5kZW1lbnRGaWxlUGF0aCkpXG4gICAgICBjb25zdCBleGlzdGluZ0FtZW5kZW1lbnQgPSAoYXdhaXQgZnMucGF0aEV4aXN0cyhhbWVuZGVtZW50RmlsZVBhdGgpKVxuICAgICAgICA/IGF3YWl0IGZzLnJlYWRKc29uKGFtZW5kZW1lbnRGaWxlUGF0aClcbiAgICAgICAgOiBudWxsXG4gICAgICBpZiAoIWRlZXBFcXVhbChhbWVuZGVtZW50LCBleGlzdGluZ0FtZW5kZW1lbnQpKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdBbWVuZGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQWRkaW5nIGFtZW5kZW1lbnQgSlNPTjogJHthbWVuZGVtZW50RmlsZVBhdGh94oCmYClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFVwZGF0aW5nIGFtZW5kZW1lbnQgSlNPTjogJHthbWVuZGVtZW50RmlsZVBhdGh94oCmYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZnMud3JpdGVKc29uKGFtZW5kZW1lbnRGaWxlUGF0aCwgYW1lbmRlbWVudCwgeyBzcGFjZXM6IDIgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29tbWl0QW5kUHVzaChhbWVuZGVtZW50c0Rpciwgb3B0aW9ucywgb3B0aW9ucy5yZW1vdGUpKSB7XG4gICAgcHJvY2Vzcy5leGl0KDIpXG4gIH1cbn1cblxubWFpbigpLmNhdGNoKChlcnJvcikgPT4ge1xuICBjb25zb2xlLmxvZyhlcnJvcilcbiAgcHJvY2Vzcy5leGl0KDEpXG59KVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOzs7OytDQU5BLG9KOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFBLElBQU1BLGtCQUFrQixHQUFHLENBQ3pCO0VBQ0VDLEtBQUssRUFBRSxHQURUO0VBRUVDLElBQUksRUFBRSwrREFGUjtFQUdFQyxJQUFJLEVBQUUsT0FIUjtFQUlFQyxJQUFJLEVBQUVDO0FBSlIsQ0FEeUIsRUFPekI7RUFDRUosS0FBSyxFQUFFLEdBRFQ7RUFFRUMsSUFBSSxFQUFFLG9CQUZSO0VBR0VDLElBQUksRUFBRSxRQUhSO0VBSUVDLElBQUksRUFBRUU7QUFKUixDQVB5QixFQWF6QjtFQUNFTCxLQUFLLEVBQUUsR0FEVDtFQUVFQyxJQUFJLEVBQUUsaUZBRlI7RUFHRUMsSUFBSSxFQUFFLGFBSFI7RUFJRUMsSUFBSSxFQUFFRTtBQUpSLENBYnlCLEVBbUJ6QjtFQUNFTCxLQUFLLEVBQUUsR0FEVDtFQUVFTSxZQUFZLEVBQUUsSUFGaEI7RUFHRUosSUFBSSxFQUFFLGFBSFI7RUFJRUMsSUFBSSxFQUFFQztBQUpSLENBbkJ5QixFQXlCekI7RUFDRUosS0FBSyxFQUFFLEdBRFQ7RUFFRUMsSUFBSSxFQUFFLDZCQUZSO0VBR0VNLFFBQVEsRUFBRSxJQUhaO0VBSUVMLElBQUksRUFBRSxRQUpSO0VBS0VDLElBQUksRUFBRUM7QUFMUixDQXpCeUIsRUFnQ3pCO0VBQ0VKLEtBQUssRUFBRSxHQURUO0VBRUVDLElBQUksRUFBRSxvQkFGUjtFQUdFQyxJQUFJLEVBQUUsUUFIUjtFQUlFQyxJQUFJLEVBQUVFO0FBSlIsQ0FoQ3lCLEVBc0N6QjtFQUNFTCxLQUFLLEVBQUUsR0FEVDtFQUVFQyxJQUFJLEVBQUUsY0FGUjtFQUdFQyxJQUFJLEVBQUUsU0FIUjtFQUlFQyxJQUFJLEVBQUVFO0FBSlIsQ0F0Q3lCLEVBNEN6QjtFQUNFRyxhQUFhLEVBQUUsSUFEakI7RUFFRVAsSUFBSSxFQUFFLGdEQUZSO0VBR0VDLElBQUksRUFBRSxTQUhSO0VBSUVDLElBQUksRUFBRUM7QUFKUixDQTVDeUIsQ0FBM0I7QUFtREEsSUFBTUssT0FBTyxHQUFHLElBQUFDLDJCQUFBLEVBQWdCWCxrQkFBaEIsQ0FBaEI7O0FBRUEsU0FBU1ksYUFBVCxDQUNFQyxhQURGLEVBRUVILE9BRkYsRUFHRUksT0FIRixFQUlXO0VBQ1QsSUFBSUMsS0FBSyxHQUFHLEtBQVo7O0VBQ0EsSUFBSUwsT0FBTyxDQUFDTSxNQUFaLEVBQW9CO0lBQ2xCLElBQUFBLFdBQUEsRUFBT0gsYUFBUCxFQUFzQixrQkFBdEI7O0lBRGtCLDRDQUVHQyxPQUFPLElBQUksRUFGZDtJQUFBOztJQUFBO01BRWxCLHVEQUFvQztRQUFBLElBQXpCRyxNQUF5Qjs7UUFDbEMsSUFBSTtVQUNGLElBQUFDLHVCQUFBLHFCQUFxQkQsTUFBckIsY0FBc0M7WUFDcENFLEdBQUcsRUFBRU4sYUFEK0I7WUFFcENPLEdBQUcsRUFBRUMsT0FBTyxDQUFDRCxHQUZ1QjtZQUdwQ0UsUUFBUSxFQUFFLE9BSDBCO1lBSXBDQyxLQUFLLEVBQUUsQ0FBQyxRQUFELEVBQVcsUUFBWCxFQUFxQixNQUFyQjtVQUo2QixDQUF0QztRQU1ELENBUEQsQ0FPRSxPQUFPQyxZQUFQLEVBQXFCO1VBQ3JCO1VBQ0FDLE9BQU8sQ0FBQ1YsS0FBUixDQUFlUyxZQUFELENBQXNCRSxNQUFwQztVQUNBWCxLQUFLLEdBQUcsSUFBUjtRQUNEO01BQ0Y7SUFmaUI7TUFBQTtJQUFBO01BQUE7SUFBQTtFQWdCbkI7O0VBQ0QsT0FBT0EsS0FBUDtBQUNEOztTQUVjWSxJOzs7OztxRUFBZjtJQUFBOztJQUFBO01BQUE7UUFBQTtVQUFBO1lBQ1FDLFdBRFIsR0FDc0JsQixPQUFPLENBQUNtQixLQUFSLEdBQ2hCbkIsT0FBTyxDQUFDbUIsS0FBUixDQUFjQyxJQUFkLEdBQXFCQyxPQUFyQixDQUE2QixNQUE3QixFQUFxQyxFQUFyQyxDQURnQixHQUVoQkMsU0FITjs7WUFJRSxJQUFJSixXQUFXLEtBQUtJLFNBQXBCLEVBQStCO2NBQzdCLElBQUFkLHVCQUFBLHNCQUFzQlUsV0FBdEIsa0NBQWdFO2dCQUM5RFQsR0FBRyxFQUFFVCxPQUFPLENBQUN1QixPQURpRDtnQkFFOURiLEdBQUcsRUFBRUMsT0FBTyxDQUFDRCxHQUZpRDtnQkFHOURFLFFBQVEsRUFBRSxPQUhvRDtnQkFJOURDLEtBQUssRUFBRSxDQUFDLFFBQUQsRUFBVyxRQUFYLEVBQXFCLE1BQXJCO2NBSnVELENBQWhFO1lBTUQ7O1lBRUtXLGNBYlIsR0FheUJDLGdCQUFBLENBQUtDLElBQUwsQ0FBVTFCLE9BQU8sQ0FBQ3VCLE9BQWxCLEVBQTJCLHdCQUEzQixDQWJ6QjtZQUFBO1lBQUEsT0FjUUksbUJBQUEsQ0FBR0MsU0FBSCxDQUFhSixjQUFiLENBZFI7O1VBQUE7WUFlUUssUUFmUixHQWVtQkosZ0JBQUEsQ0FBS0MsSUFBTCxDQUFVMUIsT0FBTyxDQUFDdUIsT0FBbEIsRUFBMkIsOEJBQTNCLENBZm5CO1lBQUEsZUFnQnFCLENBQUMsaUJBQUQsRUFBb0IsZUFBcEIsQ0FoQnJCOztVQUFBO1lBQUE7Y0FBQTtjQUFBO1lBQUE7O1lBZ0JhTyxJQWhCYjtZQWlCVUMsR0FqQlYsb0RBa0JNL0IsT0FBTyxDQUFDZ0MsV0FsQmQsK0JBbUJ5QkMsa0JBQWtCLENBQUNILElBQUQsQ0FuQjNDO1lBQUE7WUFBQTtZQUFBO1lBQUEsMkJBdUJTLElBQUFJLG9DQUFBLEVBQ0hMLFFBREcsRUFFSEUsR0FGRyxFQUdIL0IsT0FBTyxDQUFDbUMsV0FITCxFQUlILElBSkcsRUFLSCxJQUxHLEVBTUg7Y0FBRUMsTUFBTSxFQUFFcEMsT0FBTyxDQUFDb0MsTUFBbEI7Y0FBMEJDLE9BQU8sRUFBRXJDLE9BQU8sQ0FBQ3FDO1lBQTNDLENBTkcsQ0F2QlQ7O1VBQUE7WUFBQTtZQUFBOztVQUFBO1lBQUE7Y0FBQTtjQUFBO1lBQUE7O1lBQUEsOENBcUJNQyxpQkFyQk4sbUJBc0JNQyxVQXRCTjtZQStCWUMseUJBL0JaLEdBK0J3Q0YsaUJBQWlCLENBQUVHLEtBQW5CLENBQXlCLEdBQXpCLENBL0J4QztZQWdDWUMsa0JBaENaLEdBaUNRakIsZ0JBQUEsQ0FBS0MsSUFBTCxPQUFBRCxnQkFBQSxHQUFVRCxjQUFWLDRCQUE2QmdCLHlCQUF5QixDQUFDRyxLQUExQixDQUFnQyxDQUFoQyxDQUE3QixNQUNBLE9BbENSO1lBQUE7WUFBQSxPQW1DWWhCLG1CQUFBLENBQUdDLFNBQUgsQ0FBYUgsZ0JBQUEsQ0FBS21CLE9BQUwsQ0FBYUYsa0JBQWIsQ0FBYixDQW5DWjs7VUFBQTtZQUFBO1lBQUEsT0FvQ3dDZixtQkFBQSxDQUFHa0IsVUFBSCxDQUFjSCxrQkFBZCxDQXBDeEM7O1VBQUE7WUFBQTtjQUFBO2NBQUE7WUFBQTs7WUFBQTtZQUFBLE9BcUNnQmYsbUJBQUEsQ0FBR21CLFFBQUgsQ0FBWUosa0JBQVosQ0FyQ2hCOztVQUFBO1lBQUE7WUFBQTtZQUFBOztVQUFBO1lBQUEsY0FzQ1UsSUF0Q1Y7O1VBQUE7WUFvQ1lLLGtCQXBDWjs7WUFBQSxJQXVDVyxJQUFBQyxxQkFBQSxFQUFVVCxVQUFWLEVBQXNCUSxrQkFBdEIsQ0F2Q1g7Y0FBQTtjQUFBO1lBQUE7O1lBd0NRLElBQUksQ0FBQy9DLE9BQU8sQ0FBQ29DLE1BQWIsRUFBcUI7Y0FDbkIsSUFBSVcsa0JBQWtCLEtBQUssSUFBM0IsRUFBaUM7Z0JBQy9CaEMsT0FBTyxDQUFDa0MsR0FBUixtQ0FBdUNQLGtCQUF2QztjQUNELENBRkQsTUFFTztnQkFDTDNCLE9BQU8sQ0FBQ2tDLEdBQVIscUNBQXlDUCxrQkFBekM7Y0FDRDtZQUNGOztZQTlDVDtZQUFBLE9BK0NjZixtQkFBQSxDQUFHdUIsU0FBSCxDQUFhUixrQkFBYixFQUFpQ0gsVUFBakMsRUFBNkM7Y0FBRVksTUFBTSxFQUFFO1lBQVYsQ0FBN0MsQ0EvQ2Q7O1VBQUE7WUFBQTtZQUFBO1lBQUE7O1VBQUE7WUFBQTtZQUFBOztVQUFBO1lBQUE7WUFBQTtZQUFBO1lBQUE7O1VBQUE7WUFBQTtZQUFBOztZQUFBO2NBQUE7Y0FBQTtZQUFBOztZQUFBO1lBQUE7O1VBQUE7WUFBQTs7WUFBQTtjQUFBO2NBQUE7WUFBQTs7WUFBQTs7VUFBQTtZQUFBOztVQUFBO1lBQUE7O1VBQUE7WUFBQTtZQUFBO1lBQUE7O1VBQUE7WUFvREUsSUFBSWpELGFBQWEsQ0FBQ3NCLGNBQUQsRUFBaUJ4QixPQUFqQixFQUEwQkEsT0FBTyxDQUFDTyxNQUFsQyxDQUFqQixFQUE0RDtjQUMxREksT0FBTyxDQUFDeUMsSUFBUixDQUFhLENBQWI7WUFDRDs7VUF0REg7VUFBQTtZQUFBO1FBQUE7TUFBQTtJQUFBO0VBQUEsQzs7OztBQXlEQW5DLElBQUksV0FBSixDQUFhLFVBQUNaLEtBQUQsRUFBVztFQUN0QlUsT0FBTyxDQUFDa0MsR0FBUixDQUFZNUMsS0FBWjtFQUNBTSxPQUFPLENBQUN5QyxJQUFSLENBQWEsQ0FBYjtBQUNELENBSEQifQ==
@@ -0,0 +1,130 @@
1
+ import { execSync } from "child_process";
2
+ import commandLineArgs from "command-line-args";
3
+ import deepEqual from "deep-equal";
4
+ import fs from "fs-extra";
5
+ import path from "path";
6
+ import { commit } from "../git.mjs";
7
+ import { iterRechercheRawAmendements } from "../parsers/index.mjs";
8
+ const optionsDefinitions = [{
9
+ alias: "C",
10
+ help: "clone repositories from given group (or organization) git URL",
11
+ name: "clone",
12
+ type: String
13
+ }, {
14
+ alias: "c",
15
+ help: "commit clean files",
16
+ name: "commit",
17
+ type: Boolean
18
+ }, {
19
+ alias: "i",
20
+ help: "incremental mode: retrieve only amendments whose position in search has changed",
21
+ name: "incremental",
22
+ type: Boolean
23
+ }, {
24
+ alias: "l",
25
+ defaultValue: "16",
26
+ name: "legislature",
27
+ type: String
28
+ }, {
29
+ alias: "r",
30
+ help: "push commit to given remote",
31
+ multiple: true,
32
+ name: "remote",
33
+ type: String
34
+ }, {
35
+ alias: "s",
36
+ help: "don't log anything",
37
+ name: "silent",
38
+ type: Boolean
39
+ }, {
40
+ alias: "v",
41
+ help: "verbose logs",
42
+ name: "verbose",
43
+ type: Boolean
44
+ }, {
45
+ defaultOption: true,
46
+ help: "directory containing Assemblée open data files",
47
+ name: "dataDir",
48
+ type: String
49
+ }];
50
+ const options = commandLineArgs(optionsDefinitions);
51
+
52
+ function commitAndPush(repositoryDir, options, remotes) {
53
+ let error = false;
54
+
55
+ if (options.commit) {
56
+ commit(repositoryDir, "Nouvelle moisson");
57
+
58
+ for (const remote of remotes || []) {
59
+ try {
60
+ execSync(`git push ${remote} master`, {
61
+ cwd: repositoryDir,
62
+ env: process.env,
63
+ encoding: "utf-8",
64
+ stdio: ["ignore", "ignore", "pipe"]
65
+ });
66
+ } catch (childProcess) {
67
+ // Don't stop when push fails.
68
+ console.error(childProcess.output);
69
+ error = true;
70
+ }
71
+ }
72
+ }
73
+
74
+ return error;
75
+ }
76
+
77
+ async function main() {
78
+ const gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined;
79
+
80
+ if (gitGroupUrl !== undefined) {
81
+ execSync(`git clone ${gitGroupUrl}/Amendements_en_attente.git`, {
82
+ cwd: options.dataDir,
83
+ env: process.env,
84
+ encoding: "utf-8",
85
+ stdio: ["ignore", "ignore", "pipe"]
86
+ });
87
+ }
88
+
89
+ const amendementsDir = path.join(options.dataDir, "Amendements_en_attente");
90
+ await fs.ensureDir(amendementsDir);
91
+ const cacheDir = path.join(options.dataDir, "Amendements_en_attente_cache");
92
+
93
+ for (const etat of ["En recevabilité", "En traitement"]) {
94
+ const url = `https://www.assemblee-nationale.fr/dyn/${options.legislature}/amendements?etat=${encodeURIComponent(etat)}`;
95
+
96
+ for await (const [amendementUrlPath, amendement] of iterRechercheRawAmendements(cacheDir, url, options.incremental, null, null, {
97
+ silent: options.silent,
98
+ verbose: options.verbose
99
+ })) {
100
+ const amendementUrlPathSplitted = amendementUrlPath.split("/");
101
+ const amendementFilePath = path.join(amendementsDir, ...amendementUrlPathSplitted.slice(2)) + ".json";
102
+ await fs.ensureDir(path.dirname(amendementFilePath));
103
+ const existingAmendement = (await fs.pathExists(amendementFilePath)) ? await fs.readJson(amendementFilePath) : null;
104
+
105
+ if (!deepEqual(amendement, existingAmendement)) {
106
+ if (!options.silent) {
107
+ if (existingAmendement === null) {
108
+ console.log(`Adding amendement JSON: ${amendementFilePath}…`);
109
+ } else {
110
+ console.log(`Updating amendement JSON: ${amendementFilePath}…`);
111
+ }
112
+ }
113
+
114
+ await fs.writeJson(amendementFilePath, amendement, {
115
+ spaces: 2
116
+ });
117
+ }
118
+ }
119
+ }
120
+
121
+ if (commitAndPush(amendementsDir, options, options.remote)) {
122
+ process.exit(2);
123
+ }
124
+ }
125
+
126
+ main().catch(error => {
127
+ console.log(error);
128
+ process.exit(1);
129
+ });
130
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImRlZXBFcXVhbCIsImZzIiwicGF0aCIsImNvbW1pdCIsIml0ZXJSZWNoZXJjaGVSYXdBbWVuZGVtZW50cyIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImFsaWFzIiwiaGVscCIsIm5hbWUiLCJ0eXBlIiwiU3RyaW5nIiwiQm9vbGVhbiIsImRlZmF1bHRWYWx1ZSIsIm11bHRpcGxlIiwiZGVmYXVsdE9wdGlvbiIsIm9wdGlvbnMiLCJjb21taXRBbmRQdXNoIiwicmVwb3NpdG9yeURpciIsInJlbW90ZXMiLCJlcnJvciIsInJlbW90ZSIsImN3ZCIsImVudiIsInByb2Nlc3MiLCJlbmNvZGluZyIsInN0ZGlvIiwiY2hpbGRQcm9jZXNzIiwiY29uc29sZSIsIm91dHB1dCIsIm1haW4iLCJnaXRHcm91cFVybCIsImNsb25lIiwidHJpbSIsInJlcGxhY2UiLCJ1bmRlZmluZWQiLCJkYXRhRGlyIiwiYW1lbmRlbWVudHNEaXIiLCJqb2luIiwiZW5zdXJlRGlyIiwiY2FjaGVEaXIiLCJldGF0IiwidXJsIiwibGVnaXNsYXR1cmUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJhbWVuZGVtZW50VXJsUGF0aCIsImFtZW5kZW1lbnQiLCJpbmNyZW1lbnRhbCIsInNpbGVudCIsInZlcmJvc2UiLCJhbWVuZGVtZW50VXJsUGF0aFNwbGl0dGVkIiwic3BsaXQiLCJhbWVuZGVtZW50RmlsZVBhdGgiLCJzbGljZSIsImRpcm5hbWUiLCJleGlzdGluZ0FtZW5kZW1lbnQiLCJwYXRoRXhpc3RzIiwicmVhZEpzb24iLCJsb2ciLCJ3cml0ZUpzb24iLCJzcGFjZXMiLCJleGl0IiwiY2F0Y2giXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9yZXRyaWV2ZV9wZW5kaW5nX2FtZW5kbWVudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZGVlcEVxdWFsIGZyb20gXCJkZWVwLWVxdWFsXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5pbXBvcnQgeyBjb21taXQgfSBmcm9tIFwiLi4vZ2l0XCJcbmltcG9ydCB7IGl0ZXJSZWNoZXJjaGVSYXdBbWVuZGVtZW50cyB9IGZyb20gXCIuLi9wYXJzZXJzXCJcblxuY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICB7XG4gICAgYWxpYXM6IFwiQ1wiLFxuICAgIGhlbHA6IFwiY2xvbmUgcmVwb3NpdG9yaWVzIGZyb20gZ2l2ZW4gZ3JvdXAgKG9yIG9yZ2FuaXphdGlvbikgZ2l0IFVSTFwiLFxuICAgIG5hbWU6IFwiY2xvbmVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJjXCIsXG4gICAgaGVscDogXCJjb21taXQgY2xlYW4gZmlsZXNcIixcbiAgICBuYW1lOiBcImNvbW1pdFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJpXCIsXG4gICAgaGVscDogXCJpbmNyZW1lbnRhbCBtb2RlOiByZXRyaWV2ZSBvbmx5IGFtZW5kbWVudHMgd2hvc2UgcG9zaXRpb24gaW4gc2VhcmNoIGhhcyBjaGFuZ2VkXCIsXG4gICAgbmFtZTogXCJpbmNyZW1lbnRhbFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJsXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIjE2XCIsXG4gICAgbmFtZTogXCJsZWdpc2xhdHVyZVwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInJcIixcbiAgICBoZWxwOiBcInB1c2ggY29tbWl0IHRvIGdpdmVuIHJlbW90ZVwiLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG5hbWU6IFwicmVtb3RlXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwic1wiLFxuICAgIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gICAgbmFtZTogXCJzaWxlbnRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwidlwiLFxuICAgIGhlbHA6IFwidmVyYm9zZSBsb2dzXCIsXG4gICAgbmFtZTogXCJ2ZXJib3NlXCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGRlZmF1bHRPcHRpb246IHRydWUsXG4gICAgaGVscDogXCJkaXJlY3RvcnkgY29udGFpbmluZyBBc3NlbWJsw6llIG9wZW4gZGF0YSBmaWxlc1wiLFxuICAgIG5hbWU6IFwiZGF0YURpclwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbl1cbmNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zKVxuXG5mdW5jdGlvbiBjb21taXRBbmRQdXNoKFxuICByZXBvc2l0b3J5RGlyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSxcbiAgcmVtb3Rlcz86IHN0cmluZ1tdLFxuKTogYm9vbGVhbiB7XG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgIGNvbW1pdChyZXBvc2l0b3J5RGlyLCBcIk5vdXZlbGxlIG1vaXNzb25cIilcbiAgICBmb3IgKGNvbnN0IHJlbW90ZSBvZiByZW1vdGVzIHx8IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IHB1c2ggJHtyZW1vdGV9IG1hc3RlcmAsIHtcbiAgICAgICAgICBjd2Q6IHJlcG9zaXRvcnlEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIC8vIERvbid0IHN0b3Agd2hlbiBwdXNoIGZhaWxzLlxuICAgICAgICBjb25zb2xlLmVycm9yKChjaGlsZFByb2Nlc3MgYXMgYW55KS5vdXRwdXQpXG4gICAgICAgIGVycm9yID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZXJyb3Jcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgY29uc3QgZ2l0R3JvdXBVcmwgPSBvcHRpb25zLmNsb25lXG4gICAgPyBvcHRpb25zLmNsb25lLnRyaW0oKS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgOiB1bmRlZmluZWRcbiAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9L0FtZW5kZW1lbnRzX2VuX2F0dGVudGUuZ2l0YCwge1xuICAgICAgY3dkOiBvcHRpb25zLmRhdGFEaXIsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBhbWVuZGVtZW50c0RpciA9IHBhdGguam9pbihvcHRpb25zLmRhdGFEaXIsIFwiQW1lbmRlbWVudHNfZW5fYXR0ZW50ZVwiKVxuICBhd2FpdCBmcy5lbnN1cmVEaXIoYW1lbmRlbWVudHNEaXIpXG4gIGNvbnN0IGNhY2hlRGlyID0gcGF0aC5qb2luKG9wdGlvbnMuZGF0YURpciwgXCJBbWVuZGVtZW50c19lbl9hdHRlbnRlX2NhY2hlXCIpXG4gIGZvciAoY29uc3QgZXRhdCBvZiBbXCJFbiByZWNldmFiaWxpdMOpXCIsIFwiRW4gdHJhaXRlbWVudFwiXSkge1xuICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyL2R5bi8ke1xuICAgICAgb3B0aW9ucy5sZWdpc2xhdHVyZVxuICAgIH0vYW1lbmRlbWVudHM/ZXRhdD0ke2VuY29kZVVSSUNvbXBvbmVudChldGF0KX1gXG4gICAgZm9yIGF3YWl0IChjb25zdCBbXG4gICAgICBhbWVuZGVtZW50VXJsUGF0aCxcbiAgICAgIGFtZW5kZW1lbnQsXG4gICAgXSBvZiBpdGVyUmVjaGVyY2hlUmF3QW1lbmRlbWVudHMoXG4gICAgICBjYWNoZURpcixcbiAgICAgIHVybCxcbiAgICAgIG9wdGlvbnMuaW5jcmVtZW50YWwsXG4gICAgICBudWxsLFxuICAgICAgbnVsbCxcbiAgICAgIHsgc2lsZW50OiBvcHRpb25zLnNpbGVudCwgdmVyYm9zZTogb3B0aW9ucy52ZXJib3NlIH0sXG4gICAgKSkge1xuICAgICAgY29uc3QgYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZCA9IGFtZW5kZW1lbnRVcmxQYXRoIS5zcGxpdChcIi9cIilcbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRGaWxlUGF0aCA9XG4gICAgICAgIHBhdGguam9pbihhbWVuZGVtZW50c0RpciwgLi4uYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZC5zbGljZSgyKSkgK1xuICAgICAgICBcIi5qc29uXCJcbiAgICAgIGF3YWl0IGZzLmVuc3VyZURpcihwYXRoLmRpcm5hbWUoYW1lbmRlbWVudEZpbGVQYXRoKSlcbiAgICAgIGNvbnN0IGV4aXN0aW5nQW1lbmRlbWVudCA9IChhd2FpdCBmcy5wYXRoRXhpc3RzKGFtZW5kZW1lbnRGaWxlUGF0aCkpXG4gICAgICAgID8gYXdhaXQgZnMucmVhZEpzb24oYW1lbmRlbWVudEZpbGVQYXRoKVxuICAgICAgICA6IG51bGxcbiAgICAgIGlmICghZGVlcEVxdWFsKGFtZW5kZW1lbnQsIGV4aXN0aW5nQW1lbmRlbWVudCkpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGlmIChleGlzdGluZ0FtZW5kZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBZGRpbmcgYW1lbmRlbWVudCBKU09OOiAke2FtZW5kZW1lbnRGaWxlUGF0aH3igKZgKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVXBkYXRpbmcgYW1lbmRlbWVudCBKU09OOiAke2FtZW5kZW1lbnRGaWxlUGF0aH3igKZgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBmcy53cml0ZUpzb24oYW1lbmRlbWVudEZpbGVQYXRoLCBhbWVuZGVtZW50LCB7IHNwYWNlczogMiB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb21taXRBbmRQdXNoKGFtZW5kZW1lbnRzRGlyLCBvcHRpb25zLCBvcHRpb25zLnJlbW90ZSkpIHtcbiAgICBwcm9jZXNzLmV4aXQoMilcbiAgfVxufVxuXG5tYWluKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gIGNvbnNvbGUubG9nKGVycm9yKVxuICBwcm9jZXNzLmV4aXQoMSlcbn0pXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVQsUUFBeUIsZUFBekI7QUFDQSxPQUFPQyxlQUFQLE1BQTRCLG1CQUE1QjtBQUNBLE9BQU9DLFNBQVAsTUFBc0IsWUFBdEI7QUFDQSxPQUFPQyxFQUFQLE1BQWUsVUFBZjtBQUNBLE9BQU9DLElBQVAsTUFBaUIsTUFBakI7U0FFU0MsTTtTQUNBQywyQjtBQUVULE1BQU1DLGtCQUFrQixHQUFHLENBQ3pCO0VBQ0VDLEtBQUssRUFBRSxHQURUO0VBRUVDLElBQUksRUFBRSwrREFGUjtFQUdFQyxJQUFJLEVBQUUsT0FIUjtFQUlFQyxJQUFJLEVBQUVDO0FBSlIsQ0FEeUIsRUFPekI7RUFDRUosS0FBSyxFQUFFLEdBRFQ7RUFFRUMsSUFBSSxFQUFFLG9CQUZSO0VBR0VDLElBQUksRUFBRSxRQUhSO0VBSUVDLElBQUksRUFBRUU7QUFKUixDQVB5QixFQWF6QjtFQUNFTCxLQUFLLEVBQUUsR0FEVDtFQUVFQyxJQUFJLEVBQUUsaUZBRlI7RUFHRUMs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