@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,189 +1,632 @@
1
- import assert from "assert"; // Note: "/index.js" added to imports, because of issue
2
- // https://github.com/date-fns/date-fns/issues/2964
3
-
4
- import formatISO from "date-fns/formatISO/index.js";
5
- import frLocale from "date-fns/locale/fr/index.js";
6
- import parseDate from "date-fns/parse/index.js";
7
- import deepEqual from "deep-equal";
8
- import fs from "fs-extra";
9
- import frontMatter from "front-matter";
10
- import jsYaml from "js-yaml";
11
- import fetch from "node-fetch";
12
- import { parse as parseHtml } from "node-html-parser";
13
- import path from "path";
14
- import { cleanAmendement } from "../cleaners/index.js";
15
- import { Convert as AmendementsConvert } from "../types/amendements.js";
16
- export async function* iterRechercheAmendements(amendementsSearchCacheDir, url, incremental, minDateDepot, minDateExamen, options = {}) {
17
- for await (const [amendementUrlPath, amendement] of iterRechercheRawAmendements(amendementsSearchCacheDir, url, incremental, minDateDepot, minDateExamen, options)) {
18
- cleanAmendement(amendement); // Double conversion, to convert strings to dates.
19
-
20
- yield [amendementUrlPath, AmendementsConvert.toAmendement(JSON.stringify(amendement))];
21
- }
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
+
5
+ require("core-js/modules/es.array.is-array.js");
6
+
7
+ require("core-js/modules/es.function.name.js");
8
+
9
+ require("core-js/modules/es.array.from.js");
10
+
11
+ require("core-js/modules/es.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
+ Object.defineProperty(exports, "__esModule", {
32
+ value: true
33
+ });
34
+ exports.iterRechercheAmendements = iterRechercheAmendements;
35
+ exports.iterRechercheRawAmendements = iterRechercheRawAmendements;
36
+
37
+ require("core-js/modules/es.object.to-string.js");
38
+
39
+ require("core-js/modules/es.promise.js");
40
+
41
+ require("core-js/modules/es.symbol.js");
42
+
43
+ require("core-js/modules/es.symbol.description.js");
44
+
45
+ require("core-js/modules/es.symbol.async-iterator.js");
46
+
47
+ require("core-js/modules/es.symbol.iterator.js");
48
+
49
+ require("core-js/modules/es.array.iterator.js");
50
+
51
+ require("core-js/modules/es.string.iterator.js");
52
+
53
+ require("core-js/modules/web.dom-collections.iterator.js");
54
+
55
+ require("core-js/modules/es.regexp.exec.js");
56
+
57
+ require("core-js/modules/es.array.includes.js");
58
+
59
+ require("core-js/modules/es.string.includes.js");
60
+
61
+ require("core-js/modules/es.array.concat.js");
62
+
63
+ require("core-js/modules/es.parse-int.js");
64
+
65
+ require("core-js/modules/es.array.map.js");
66
+
67
+ require("core-js/modules/es.date.to-string.js");
68
+
69
+ require("core-js/modules/es.regexp.to-string.js");
70
+
71
+ require("core-js/modules/web.url.js");
72
+
73
+ require("core-js/modules/web.url-search-params.js");
74
+
75
+ require("core-js/modules/es.string.split.js");
76
+
77
+ require("core-js/modules/es.array.join.js");
78
+
79
+ require("core-js/modules/es.array.slice.js");
80
+
81
+ require("core-js/modules/es.string.replace.js");
82
+
83
+ require("core-js/modules/es.array.find.js");
84
+
85
+ var _assert = _interopRequireDefault(require("assert"));
86
+
87
+ var _index = _interopRequireDefault(require("date-fns/formatISO/index.js"));
88
+
89
+ var _index2 = _interopRequireDefault(require("date-fns/locale/fr/index.js"));
90
+
91
+ var _index3 = _interopRequireDefault(require("date-fns/parse/index.js"));
92
+
93
+ var _deepEqual = _interopRequireDefault(require("deep-equal"));
94
+
95
+ var _fsExtra = _interopRequireDefault(require("fs-extra"));
96
+
97
+ var _frontMatter = _interopRequireDefault(require("front-matter"));
98
+
99
+ var _jsYaml = _interopRequireDefault(require("js-yaml"));
100
+
101
+ var _nodeFetch = _interopRequireDefault(require("node-fetch"));
102
+
103
+ var _nodeHtmlParser = require("node-html-parser");
104
+
105
+ var _path = _interopRequireDefault(require("path"));
106
+
107
+ var _cleaners = require("../cleaners");
108
+
109
+ var _amendements = require("../types/amendements");
110
+
111
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
112
+
113
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
114
+
115
+ 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."); }
116
+
117
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
118
+
119
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
120
+
121
+ 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; } } }; }
122
+
123
+ 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; }
124
+
125
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
126
+
127
+ 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."); }
128
+
129
+ 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); }
130
+
131
+ 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; }
132
+
133
+ 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; }
134
+
135
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
136
+
137
+ function _awaitAsyncGenerator(value) { return new _AwaitValue(value); }
138
+
139
+ function _wrapAsyncGenerator(fn) { return function () { return new _AsyncGenerator(fn.apply(this, arguments)); }; }
140
+
141
+ function _AsyncGenerator(gen) { var front, back; function send(key, arg) { return new Promise(function (resolve, reject) { var request = { key: key, arg: arg, resolve: resolve, reject: reject, next: null }; if (back) { back = back.next = request; } else { front = back = request; resume(key, arg); } }); } function resume(key, arg) { try { var result = gen[key](arg); var value = result.value; var wrappedAwait = value instanceof _AwaitValue; Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) { if (wrappedAwait) { resume(key === "return" ? "return" : "next", arg); return; } settle(result.done ? "return" : "normal", arg); }, function (err) { resume("throw", err); }); } catch (err) { settle("throw", err); } } function settle(type, value) { switch (type) { case "return": front.resolve({ value: value, done: true }); break; case "throw": front.reject(value); break; default: front.resolve({ value: value, done: false }); break; } front = front.next; if (front) { resume(front.key, front.arg); } else { back = null; } } this._invoke = send; if (typeof gen["return"] !== "function") { this["return"] = undefined; } }
142
+
143
+ _AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () { return this; };
144
+
145
+ _AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); };
146
+
147
+ _AsyncGenerator.prototype["throw"] = function (arg) { return this._invoke("throw", arg); };
148
+
149
+ _AsyncGenerator.prototype["return"] = function (arg) { return this._invoke("return", arg); };
150
+
151
+ function _AwaitValue(value) { this.wrapped = value; }
152
+
153
+ 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"); }
154
+
155
+ 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); }
156
+
157
+ function iterRechercheAmendements(_x, _x2, _x3, _x4, _x5) {
158
+ return _iterRechercheAmendements.apply(this, arguments);
22
159
  }
23
- export async function* iterRechercheRawAmendements(amendementsSearchCacheDir, url, incremental, minDateDepot, minDateExamen, options = {}) {
24
- await fs.ensureDir(amendementsSearchCacheDir);
25
- assert.strictEqual(/[?&]date_depot=/.exec(url), null, `URL ${url} already contains a deposit date`);
26
- assert.strictEqual(/[?&]order=/.exec(url), null, `URL ${url} already contains a sort order`);
27
- assert.strictEqual(/[?&]page=/.exec(url), null, `URL ${url} already contains a page number`);
28
-
29
- if (incremental) {
30
- assert.notStrictEqual(/[?&]etat=/.exec(url), null, `In incremental mode, URL ${url} must contain an "etat" query parameter`);
31
- }
32
-
33
- url += (url.includes("?") ? "&" : "?") + "order=date_depot,desc&page=1";
34
-
35
- if (minDateDepot != null) {
36
- assert.notStrictEqual(/\d{4}-\d{2}-\d{2}/.exec(minDateDepot), null, `Invalid format for minimum date: ${minDateDepot}`);
37
- }
38
-
39
- let amendementNumber = 0;
40
-
41
- iterSearchPages: while (true) {
42
- if (options.verbose) {
43
- console.log(`Fetching amendements search page at ${url}…`);
44
- }
45
-
46
- const response = await fetch(url);
47
- assert(response.ok, `Retrieval of search page at ${url} failed with error: ${response.status} ${response.statusText}`);
48
- const page = await response.text();
49
- const html = parseHtml(page);
50
-
51
- if (html.querySelector("div.no-result") !== null) {
52
- break;
53
- }
54
-
55
- const amendementsCountDiv = html.querySelector("div.mirror-card-subtitle");
56
- assert.notStrictEqual(amendementsCountDiv, null);
57
- const amendementsCount = parseInt(/\d+/.exec(amendementsCountDiv.text)[0]);
58
- const amendementsDiv = html.querySelector("div.amendement-list--results-table");
59
- assert.notStrictEqual(amendementsDiv, null);
60
- const amendementsTable = amendementsDiv.querySelector("table");
61
- assert.notStrictEqual(amendementsTable, null);
62
- const tfootTr = amendementsTable.querySelector("tfoot > tr");
63
- assert.notStrictEqual(tfootTr, null);
64
- const tfootTrCells = tfootTr.querySelectorAll("td, th").map(cell => cell.text);
65
- assert(deepEqual(tfootTrCells, ["", "n°", "Dossier législatif", "Emplacement", "Auteur", "État", "Sort", "Date d'examen", "Examiné par", "Texte visé", "Date de dépôt"]), `Unexpected columns in ${JSON.stringify(tfootTrCells, null, 2)}`);
66
- const amendementsTr = amendementsTable.querySelectorAll("tbody > tr");
67
- assert.notStrictEqual(amendementsTr.length, 0);
68
-
69
- for (const amendementTr of amendementsTr) {
70
- amendementNumber++;
71
-
72
- if (minDateDepot != null || minDateExamen != null) {
73
- const amendementTdList = amendementTr.querySelectorAll("td");
74
- assert.strictEqual(amendementTdList.length, 11, `Unexpected number of columns in amendment row: ${amendementTr.outerHTML}`);
75
-
76
- if (minDateDepot != null) {
77
- const dateDepotTd = amendementTdList[10];
78
- const dateDepot = formatISO(parseDate(dateDepotTd.text, "d MMMM y", new Date(), {
79
- locale: frLocale
80
- }), {
81
- representation: "date"
82
- });
83
-
84
- if (dateDepot < minDateDepot) {
85
- // Since the amendments are sorted by deposit date, once an amendment
86
- // with an old deposit date is encountered, the full search can be stopped.
87
- break iterSearchPages;
88
- }
160
+
161
+ function _iterRechercheAmendements() {
162
+ _iterRechercheAmendements = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(amendementsSearchCacheDir, url, incremental, minDateDepot, minDateExamen) {
163
+ var options,
164
+ _iteratorAbruptCompletion,
165
+ _didIteratorError,
166
+ _iteratorError,
167
+ _iterator,
168
+ _step,
169
+ _step$value,
170
+ amendementUrlPath,
171
+ amendement,
172
+ _args = arguments;
173
+
174
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
175
+ while (1) {
176
+ switch (_context.prev = _context.next) {
177
+ case 0:
178
+ options = _args.length > 5 && _args[5] !== undefined ? _args[5] : {};
179
+ _iteratorAbruptCompletion = false;
180
+ _didIteratorError = false;
181
+ _context.prev = 3;
182
+ _iterator = _asyncIterator(iterRechercheRawAmendements(amendementsSearchCacheDir, url, incremental, minDateDepot, minDateExamen, options));
183
+
184
+ case 5:
185
+ _context.next = 7;
186
+ return _awaitAsyncGenerator(_iterator.next());
187
+
188
+ case 7:
189
+ if (!(_iteratorAbruptCompletion = !(_step = _context.sent).done)) {
190
+ _context.next = 15;
191
+ break;
192
+ }
193
+
194
+ _step$value = _slicedToArray(_step.value, 2), amendementUrlPath = _step$value[0], amendement = _step$value[1];
195
+ (0, _cleaners.cleanAmendement)(amendement); // Double conversion, to convert strings to dates.
196
+
197
+ _context.next = 12;
198
+ return [amendementUrlPath, _amendements.Convert.toAmendement(JSON.stringify(amendement))];
199
+
200
+ case 12:
201
+ _iteratorAbruptCompletion = false;
202
+ _context.next = 5;
203
+ break;
204
+
205
+ case 15:
206
+ _context.next = 21;
207
+ break;
208
+
209
+ case 17:
210
+ _context.prev = 17;
211
+ _context.t0 = _context["catch"](3);
212
+ _didIteratorError = true;
213
+ _iteratorError = _context.t0;
214
+
215
+ case 21:
216
+ _context.prev = 21;
217
+ _context.prev = 22;
218
+
219
+ if (!(_iteratorAbruptCompletion && _iterator["return"] != null)) {
220
+ _context.next = 26;
221
+ break;
222
+ }
223
+
224
+ _context.next = 26;
225
+ return _awaitAsyncGenerator(_iterator["return"]());
226
+
227
+ case 26:
228
+ _context.prev = 26;
229
+
230
+ if (!_didIteratorError) {
231
+ _context.next = 29;
232
+ break;
233
+ }
234
+
235
+ throw _iteratorError;
236
+
237
+ case 29:
238
+ return _context.finish(26);
239
+
240
+ case 30:
241
+ return _context.finish(21);
242
+
243
+ case 31:
244
+ case "end":
245
+ return _context.stop();
89
246
  }
247
+ }
248
+ }, _callee, null, [[3, 17, 21, 31], [22,, 26, 30]]);
249
+ }));
250
+ return _iterRechercheAmendements.apply(this, arguments);
251
+ }
252
+
253
+ function iterRechercheRawAmendements(_x6, _x7, _x8, _x9, _x10) {
254
+ return _iterRechercheRawAmendements.apply(this, arguments);
255
+ }
256
+
257
+ function _iterRechercheRawAmendements() {
258
+ _iterRechercheRawAmendements = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(amendementsSearchCacheDir, url, incremental, minDateDepot, minDateExamen) {
259
+ var options,
260
+ amendementNumber,
261
+ response,
262
+ page,
263
+ html,
264
+ amendementsCountDiv,
265
+ amendementsCount,
266
+ amendementsDiv,
267
+ amendementsTable,
268
+ tfootTr,
269
+ tfootTrCells,
270
+ amendementsTr,
271
+ _iterator2,
272
+ _step2,
273
+ amendementTr,
274
+ amendementTdList,
275
+ dateDepotTd,
276
+ dateDepot,
277
+ dateExamenTd,
278
+ dateExamen,
279
+ amendementUrlPath,
280
+ amendementUrlPathSplitted,
281
+ amendementSearchCacheFilePath,
282
+ existingAmendementSearchCache,
283
+ amendementTrOuterHtml,
284
+ amendementSearchCache,
285
+ amendementHtmlUrl,
286
+ amendementHtmlResponse,
287
+ amendementHtmlPage,
288
+ amendementHtml,
289
+ formatsLi,
290
+ jsonLi,
291
+ jsonA,
292
+ amendementJsonUrlPath,
293
+ amendementJsonUrl,
294
+ amendementJsonResponse,
295
+ amendement,
296
+ paginationA,
297
+ urlPath,
298
+ _args2 = arguments;
299
+
300
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
301
+ while (1) {
302
+ switch (_context2.prev = _context2.next) {
303
+ case 0:
304
+ options = _args2.length > 5 && _args2[5] !== undefined ? _args2[5] : {};
305
+ _context2.next = 3;
306
+ return _awaitAsyncGenerator(_fsExtra["default"].ensureDir(amendementsSearchCacheDir));
307
+
308
+ case 3:
309
+ _assert["default"].strictEqual(/[?&]date_depot=/.exec(url), null, "URL ".concat(url, " already contains a deposit date"));
310
+
311
+ _assert["default"].strictEqual(/[?&]order=/.exec(url), null, "URL ".concat(url, " already contains a sort order"));
312
+
313
+ _assert["default"].strictEqual(/[?&]page=/.exec(url), null, "URL ".concat(url, " already contains a page number"));
314
+
315
+ if (incremental) {
316
+ _assert["default"].notStrictEqual(/[?&]etat=/.exec(url), null, "In incremental mode, URL ".concat(url, " must contain an \"etat\" query parameter"));
317
+ }
318
+
319
+ url += (url.includes("?") ? "&" : "?") + "order=date_depot,desc&page=1";
320
+
321
+ if (minDateDepot != null) {
322
+ _assert["default"].notStrictEqual(/\d{4}-\d{2}-\d{2}/.exec(minDateDepot), null, "Invalid format for minimum date: ".concat(minDateDepot));
323
+ }
324
+
325
+ amendementNumber = 0;
326
+
327
+ case 10:
328
+ if (!true) {
329
+ _context2.next = 129;
330
+ break;
331
+ }
332
+
333
+ if (options.verbose) {
334
+ console.log("Fetching amendements search page at ".concat(url, "\u2026"));
335
+ }
336
+
337
+ _context2.next = 14;
338
+ return _awaitAsyncGenerator((0, _nodeFetch["default"])(url));
339
+
340
+ case 14:
341
+ response = _context2.sent;
342
+ (0, _assert["default"])(response.ok, "Retrieval of search page at ".concat(url, " failed with error: ").concat(response.status, " ").concat(response.statusText));
343
+ _context2.next = 18;
344
+ return _awaitAsyncGenerator(response.text());
345
+
346
+ case 18:
347
+ page = _context2.sent;
348
+ html = (0, _nodeHtmlParser.parse)(page);
349
+
350
+ if (!(html.querySelector("div.no-result") !== null)) {
351
+ _context2.next = 22;
352
+ break;
353
+ }
354
+
355
+ return _context2.abrupt("break", 129);
356
+
357
+ case 22:
358
+ amendementsCountDiv = html.querySelector("div.mirror-card-subtitle");
359
+
360
+ _assert["default"].notStrictEqual(amendementsCountDiv, null);
361
+
362
+ amendementsCount = parseInt(/\d+/.exec(amendementsCountDiv.text)[0]);
363
+ amendementsDiv = html.querySelector("div.amendement-list--results-table");
364
+
365
+ _assert["default"].notStrictEqual(amendementsDiv, null);
366
+
367
+ amendementsTable = amendementsDiv.querySelector("table");
368
+
369
+ _assert["default"].notStrictEqual(amendementsTable, null);
370
+
371
+ tfootTr = amendementsTable.querySelector("tfoot > tr");
372
+
373
+ _assert["default"].notStrictEqual(tfootTr, null);
374
+
375
+ tfootTrCells = tfootTr.querySelectorAll("td, th").map(function (cell) {
376
+ return cell.text;
377
+ });
378
+ (0, _assert["default"])((0, _deepEqual["default"])(tfootTrCells, ["", "n°", "Dossier législatif", "Emplacement", "Auteur", "État", "Sort", "Date d'examen", "Examiné par", "Texte visé", "Date de dépôt"]), "Unexpected columns in ".concat(JSON.stringify(tfootTrCells, null, 2)));
379
+ amendementsTr = amendementsTable.querySelectorAll("tbody > tr");
380
+
381
+ _assert["default"].notStrictEqual(amendementsTr.length, 0);
382
+
383
+ _iterator2 = _createForOfIteratorHelper(amendementsTr);
384
+ _context2.prev = 36;
90
385
 
91
- if (minDateExamen != null) {
92
- const dateExamenTd = amendementTdList[7];
386
+ _iterator2.s();
93
387
 
94
- if (dateExamenTd.text) {
95
- const dateExamen = formatISO(parseDate(dateExamenTd.text, "d MMMM y", new Date(), {
96
- locale: frLocale
388
+ case 38:
389
+ if ((_step2 = _iterator2.n()).done) {
390
+ _context2.next = 113;
391
+ break;
392
+ }
393
+
394
+ amendementTr = _step2.value;
395
+ amendementNumber++;
396
+
397
+ if (!(minDateDepot != null || minDateExamen != null)) {
398
+ _context2.next = 55;
399
+ break;
400
+ }
401
+
402
+ amendementTdList = amendementTr.querySelectorAll("td");
403
+
404
+ _assert["default"].strictEqual(amendementTdList.length, 11, "Unexpected number of columns in amendment row: ".concat(amendementTr.outerHTML));
405
+
406
+ if (!(minDateDepot != null)) {
407
+ _context2.next = 49;
408
+ break;
409
+ }
410
+
411
+ dateDepotTd = amendementTdList[10];
412
+ dateDepot = (0, _index["default"])((0, _index3["default"])(dateDepotTd.text, "d MMMM y", new Date(), {
413
+ locale: _index2["default"]
97
414
  }), {
98
415
  representation: "date"
99
416
  });
100
417
 
101
- if (dateExamen < minDateExamen) {
102
- // This amendment has been discussed since a few days.
103
- // => Ignore it, because it should be in Assemblée open data.
104
- continue;
418
+ if (!(dateDepot < minDateDepot)) {
419
+ _context2.next = 49;
420
+ break;
105
421
  }
106
- }
107
- }
108
- }
109
422
 
110
- const amendementUrlPath = amendementTr.getAttribute("data-href");
111
- assert.notStrictEqual(amendementUrlPath, undefined);
112
- const amendementUrlPathSplitted = amendementUrlPath.split("/");
113
- assert.strictEqual(amendementUrlPathSplitted[0], "", `Unexpected URL path for amendement: ${amendementUrlPath}`);
114
- assert.strictEqual(amendementUrlPathSplitted[1], "dyn", `Unexpected URL path for amendement: ${amendementUrlPath}`);
115
- const amendementSearchCacheFilePath = path.join(amendementsSearchCacheDir, ...amendementUrlPathSplitted.slice(2)) + ".html";
116
- await fs.ensureDir(path.dirname(amendementSearchCacheFilePath));
117
- const existingAmendementSearchCache = (await fs.pathExists(amendementSearchCacheFilePath)) ? await fs.readFile(amendementSearchCacheFilePath, "utf8") : null;
118
- const amendementTrOuterHtml = amendementTr.outerHTML;
119
- const amendementSearchCache = `---\n${jsYaml.dump({
120
- position: amendementsCount - amendementNumber,
121
- search: url.replace(/&page=[\d]+/, "")
122
- }, {
123
- sortKeys: true
124
- })}---\n\n${amendementTrOuterHtml}`;
125
-
126
- if (amendementSearchCache === existingAmendementSearchCache) {
127
- if (incremental) {
128
- // The same <tr> is already in cache and in the same position.
129
- // Assume that following amendments are not changed and stop looking
130
- // for amendments to upsert.
131
- break iterSearchPages;
132
- }
423
+ return _context2.abrupt("break", 129);
133
424
 
134
- continue;
135
- }
425
+ case 49:
426
+ if (!(minDateExamen != null)) {
427
+ _context2.next = 55;
428
+ break;
429
+ }
136
430
 
137
- if (existingAmendementSearchCache !== null && frontMatter(existingAmendementSearchCache).body === amendementTrOuterHtml) {
138
- // The same <tr> is already in cache, but in a different position.
139
- // Assume the amendment is unchanged.
140
- continue;
141
- }
431
+ dateExamenTd = amendementTdList[7];
432
+
433
+ if (!dateExamenTd.text) {
434
+ _context2.next = 55;
435
+ break;
436
+ }
437
+
438
+ dateExamen = (0, _index["default"])((0, _index3["default"])(dateExamenTd.text, "d MMMM y", new Date(), {
439
+ locale: _index2["default"]
440
+ }), {
441
+ representation: "date"
442
+ });
443
+
444
+ if (!(dateExamen < minDateExamen)) {
445
+ _context2.next = 55;
446
+ break;
447
+ }
448
+
449
+ return _context2.abrupt("continue", 111);
450
+
451
+ case 55:
452
+ amendementUrlPath = amendementTr.getAttribute("data-href");
453
+
454
+ _assert["default"].notStrictEqual(amendementUrlPath, undefined);
455
+
456
+ amendementUrlPathSplitted = amendementUrlPath.split("/");
142
457
 
143
- if (options.verbose) {
144
- if (existingAmendementSearchCache === null) {
145
- console.log(`Adding amendement search cache: ${amendementSearchCacheFilePath}…`);
146
- } else {
147
- console.log(`Updating amendement search cache: ${amendementSearchCacheFilePath}…`);
458
+ _assert["default"].strictEqual(amendementUrlPathSplitted[0], "", "Unexpected URL path for amendement: ".concat(amendementUrlPath));
459
+
460
+ _assert["default"].strictEqual(amendementUrlPathSplitted[1], "dyn", "Unexpected URL path for amendement: ".concat(amendementUrlPath));
461
+
462
+ amendementSearchCacheFilePath = _path["default"].join.apply(_path["default"], [amendementsSearchCacheDir].concat(_toConsumableArray(amendementUrlPathSplitted.slice(2)))) + ".html";
463
+ _context2.next = 63;
464
+ return _awaitAsyncGenerator(_fsExtra["default"].ensureDir(_path["default"].dirname(amendementSearchCacheFilePath)));
465
+
466
+ case 63:
467
+ _context2.next = 65;
468
+ return _awaitAsyncGenerator(_fsExtra["default"].pathExists(amendementSearchCacheFilePath));
469
+
470
+ case 65:
471
+ if (!_context2.sent) {
472
+ _context2.next = 71;
473
+ break;
474
+ }
475
+
476
+ _context2.next = 68;
477
+ return _awaitAsyncGenerator(_fsExtra["default"].readFile(amendementSearchCacheFilePath, "utf8"));
478
+
479
+ case 68:
480
+ _context2.t0 = _context2.sent;
481
+ _context2.next = 72;
482
+ break;
483
+
484
+ case 71:
485
+ _context2.t0 = null;
486
+
487
+ case 72:
488
+ existingAmendementSearchCache = _context2.t0;
489
+ amendementTrOuterHtml = amendementTr.outerHTML;
490
+ amendementSearchCache = "---\n".concat(_jsYaml["default"].dump({
491
+ position: amendementsCount - amendementNumber,
492
+ search: url.replace(/&page=[\d]+/, "")
493
+ }, {
494
+ sortKeys: true
495
+ }), "---\n\n").concat(amendementTrOuterHtml);
496
+
497
+ if (!(amendementSearchCache === existingAmendementSearchCache)) {
498
+ _context2.next = 79;
499
+ break;
500
+ }
501
+
502
+ if (!incremental) {
503
+ _context2.next = 78;
504
+ break;
505
+ }
506
+
507
+ return _context2.abrupt("break", 129);
508
+
509
+ case 78:
510
+ return _context2.abrupt("continue", 111);
511
+
512
+ case 79:
513
+ if (!(existingAmendementSearchCache !== null && (0, _frontMatter["default"])(existingAmendementSearchCache).body === amendementTrOuterHtml)) {
514
+ _context2.next = 81;
515
+ break;
516
+ }
517
+
518
+ return _context2.abrupt("continue", 111);
519
+
520
+ case 81:
521
+ if (options.verbose) {
522
+ if (existingAmendementSearchCache === null) {
523
+ console.log("Adding amendement search cache: ".concat(amendementSearchCacheFilePath, "\u2026"));
524
+ } else {
525
+ console.log("Updating amendement search cache: ".concat(amendementSearchCacheFilePath, "\u2026"));
526
+ }
527
+ }
528
+
529
+ amendementHtmlUrl = new URL(amendementUrlPath, "https://www.assemblee-nationale.fr/").toString();
530
+ _context2.next = 85;
531
+ return _awaitAsyncGenerator((0, _nodeFetch["default"])(amendementHtmlUrl));
532
+
533
+ case 85:
534
+ amendementHtmlResponse = _context2.sent;
535
+ (0, _assert["default"])(amendementHtmlResponse.ok, "Retrieval of amendement HTML page at ".concat(amendementHtmlUrl, " failed with error: ").concat(amendementHtmlResponse.status, " ").concat(amendementHtmlResponse.statusText));
536
+ _context2.next = 89;
537
+ return _awaitAsyncGenerator(amendementHtmlResponse.text());
538
+
539
+ case 89:
540
+ amendementHtmlPage = _context2.sent;
541
+ amendementHtml = (0, _nodeHtmlParser.parse)(amendementHtmlPage);
542
+ formatsLi = amendementHtml.querySelectorAll("li.mirror-card-header--options--content--item");
543
+
544
+ _assert["default"].notStrictEqual(formatsLi.length, 0);
545
+
546
+ jsonLi = formatsLi.find(function (formatLi) {
547
+ var formatSpan = formatLi.querySelector("a > span");
548
+
549
+ _assert["default"].notStrictEqual(formatSpan, null, "No <span> in <a> found in ".concat(formatLi.toString()));
550
+
551
+ return formatSpan.text === "Version JSON";
552
+ });
553
+
554
+ _assert["default"].notStrictEqual(jsonLi, undefined, "No JSON version found for amendement at ".concat(amendementHtmlUrl));
555
+
556
+ jsonA = jsonLi.querySelector("a");
557
+
558
+ _assert["default"].notStrictEqual(jsonA, null, "No <a> found in ".concat(jsonLi.toString()));
559
+
560
+ amendementJsonUrlPath = jsonA.getAttribute("href");
561
+
562
+ _assert["default"].notStrictEqual(amendementJsonUrlPath, undefined, "No URL found for JSON version of amendement: ".concat(jsonLi.toString()));
563
+
564
+ amendementJsonUrl = new URL(amendementJsonUrlPath, "https://www.assemblee-nationale.fr/").toString();
565
+ _context2.next = 102;
566
+ return _awaitAsyncGenerator((0, _nodeFetch["default"])(amendementJsonUrl));
567
+
568
+ case 102:
569
+ amendementJsonResponse = _context2.sent;
570
+ (0, _assert["default"])(amendementJsonResponse.ok, "Retrieval of amendement JSON page at ".concat(amendementJsonUrl, " failed with error: ").concat(amendementJsonResponse.status, " ").concat(amendementJsonResponse.statusText));
571
+ _context2.next = 106;
572
+ return _awaitAsyncGenerator(amendementJsonResponse.json());
573
+
574
+ case 106:
575
+ amendement = _context2.sent;
576
+ _context2.next = 109;
577
+ return [amendementUrlPath, amendement];
578
+
579
+ case 109:
580
+ _context2.next = 111;
581
+ return _awaitAsyncGenerator(_fsExtra["default"].writeFile(amendementSearchCacheFilePath, amendementSearchCache, "utf8"));
582
+
583
+ case 111:
584
+ _context2.next = 38;
585
+ break;
586
+
587
+ case 113:
588
+ _context2.next = 118;
589
+ break;
590
+
591
+ case 115:
592
+ _context2.prev = 115;
593
+ _context2.t1 = _context2["catch"](36);
594
+
595
+ _iterator2.e(_context2.t1);
596
+
597
+ case 118:
598
+ _context2.prev = 118;
599
+
600
+ _iterator2.f();
601
+
602
+ return _context2.finish(118);
603
+
604
+ case 121:
605
+ paginationA = html.querySelector("div.an-pagination--item > i.an-icons-chevron-right ~ a");
606
+
607
+ if (!(paginationA === null)) {
608
+ _context2.next = 124;
609
+ break;
610
+ }
611
+
612
+ return _context2.abrupt("break", 129);
613
+
614
+ case 124:
615
+ urlPath = paginationA.getAttribute("href");
616
+
617
+ _assert["default"].notStrictEqual(urlPath, undefined);
618
+
619
+ url = new URL(urlPath, "https://www.assemblee-nationale.fr/").toString();
620
+ _context2.next = 10;
621
+ break;
622
+
623
+ case 129:
624
+ case "end":
625
+ return _context2.stop();
148
626
  }
149
627
  }
150
-
151
- const amendementHtmlUrl = new URL(amendementUrlPath, "https://www.assemblee-nationale.fr/").toString();
152
- const amendementHtmlResponse = await fetch(amendementHtmlUrl);
153
- assert(amendementHtmlResponse.ok, `Retrieval of amendement HTML page at ${amendementHtmlUrl} failed with error: ${amendementHtmlResponse.status} ${amendementHtmlResponse.statusText}`);
154
- const amendementHtmlPage = await amendementHtmlResponse.text();
155
- const amendementHtml = parseHtml(amendementHtmlPage);
156
- const formatsLi = amendementHtml.querySelectorAll("li.mirror-card-header--options--content--item");
157
- assert.notStrictEqual(formatsLi.length, 0);
158
- const jsonLi = formatsLi.find(formatLi => {
159
- const formatSpan = formatLi.querySelector("a > span");
160
- assert.notStrictEqual(formatSpan, null, `No <span> in <a> found in ${formatLi.toString()}`);
161
- return formatSpan.text === "Version JSON";
162
- });
163
- assert.notStrictEqual(jsonLi, undefined, `No JSON version found for amendement at ${amendementHtmlUrl}`);
164
- const jsonA = jsonLi.querySelector("a");
165
- assert.notStrictEqual(jsonA, null, `No <a> found in ${jsonLi.toString()}`);
166
- const amendementJsonUrlPath = jsonA.getAttribute("href");
167
- assert.notStrictEqual(amendementJsonUrlPath, undefined, `No URL found for JSON version of amendement: ${jsonLi.toString()}`);
168
- const amendementJsonUrl = new URL(amendementJsonUrlPath, "https://www.assemblee-nationale.fr/").toString();
169
- const amendementJsonResponse = await fetch(amendementJsonUrl);
170
- assert(amendementJsonResponse.ok, `Retrieval of amendement JSON page at ${amendementJsonUrl} failed with error: ${amendementJsonResponse.status} ${amendementJsonResponse.statusText}`);
171
- const amendement = await amendementJsonResponse.json();
172
- yield [amendementUrlPath, amendement]; // SearchCache must be written at the end to ensure that everything is in a consistent state,
173
- // even if script fails abruptly.
174
-
175
- await fs.writeFile(amendementSearchCacheFilePath, amendementSearchCache, "utf8");
176
- }
177
-
178
- const paginationA = html.querySelector("div.an-pagination--item > i.an-icons-chevron-right ~ a");
179
-
180
- if (paginationA === null) {
181
- break;
182
- }
183
-
184
- const urlPath = paginationA.getAttribute("href");
185
- assert.notStrictEqual(urlPath, undefined);
186
- url = new URL(urlPath, "https://www.assemblee-nationale.fr/").toString();
187
- }
628
+ }, _callee2, null, [[36, 115, 118, 121]]);
629
+ }));
630
+ return _iterRechercheRawAmendements.apply(this, arguments);
188
631
  }
189
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJmb3JtYXRJU08iLCJmckxvY2FsZSIsInBhcnNlRGF0ZSIsImRlZXBFcXVhbCIsImZzIiwiZnJvbnRNYXR0ZXIiLCJqc1lhbWwiLCJmZXRjaCIsInBhcnNlIiwicGFyc2VIdG1sIiwicGF0aCIsImNsZWFuQW1lbmRlbWVudCIsIkNvbnZlcnQiLCJBbWVuZGVtZW50c0NvbnZlcnQiLCJpdGVyUmVjaGVyY2hlQW1lbmRlbWVudHMiLCJhbWVuZGVtZW50c1NlYXJjaENhY2hlRGlyIiwidXJsIiwiaW5jcmVtZW50YWwiLCJtaW5EYXRlRGVwb3QiLCJtaW5EYXRlRXhhbWVuIiwib3B0aW9ucyIsImFtZW5kZW1lbnRVcmxQYXRoIiwiYW1lbmRlbWVudCIsIml0ZXJSZWNoZXJjaGVSYXdBbWVuZGVtZW50cyIsInRvQW1lbmRlbWVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJlbnN1cmVEaXIiLCJzdHJpY3RFcXVhbCIsImV4ZWMiLCJub3RTdHJpY3RFcXVhbCIsImluY2x1ZGVzIiwiYW1lbmRlbWVudE51bWJlciIsIml0ZXJTZWFyY2hQYWdlcyIsInZlcmJvc2UiLCJjb25zb2xlIiwibG9nIiwicmVzcG9uc2UiLCJvayIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJwYWdlIiwidGV4dCIsImh0bWwiLCJxdWVyeVNlbGVjdG9yIiwiYW1lbmRlbWVudHNDb3VudERpdiIsImFtZW5kZW1lbnRzQ291bnQiLCJwYXJzZUludCIsImFtZW5kZW1lbnRzRGl2IiwiYW1lbmRlbWVudHNUYWJsZSIsInRmb290VHIiLCJ0Zm9vdFRyQ2VsbHMiLCJxdWVyeVNlbGVjdG9yQWxsIiwibWFwIiwiY2VsbCIsImFtZW5kZW1lbnRzVHIiLCJsZW5ndGgiLCJhbWVuZGVtZW50VHIiLCJhbWVuZGVtZW50VGRMaXN0Iiwib3V0ZXJIVE1MIiwiZGF0ZURlcG90VGQiLCJkYXRlRGVwb3QiLCJEYXRlIiwibG9jYWxlIiwicmVwcmVzZW50YXRpb24iLCJkYXRlRXhhbWVuVGQiLCJkYXRlRXhhbWVuIiwiZ2V0QXR0cmlidXRlIiwidW5kZWZpbmVkIiwiYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZCIsInNwbGl0IiwiYW1lbmRlbWVudFNlYXJjaENhY2hlRmlsZVBhdGgiLCJqb2luIiwic2xpY2UiLCJkaXJuYW1lIiwiZXhpc3RpbmdBbWVuZGVtZW50U2VhcmNoQ2FjaGUiLCJwYXRoRXhpc3RzIiwicmVhZEZpbGUiLCJhbWVuZGVtZW50VHJPdXRlckh0bWwiLCJhbWVuZGVtZW50U2VhcmNoQ2FjaGUiLCJkdW1wIiwicG9zaXRpb24iLCJzZWFyY2giLCJyZXBsYWNlIiwic29ydEtleXMiLCJib2R5IiwiYW1lbmRlbWVudEh0bWxVcmwiLCJVUkwiLCJ0b1N0cmluZyIsImFtZW5kZW1lbnRIdG1sUmVzcG9uc2UiLCJhbWVuZGVtZW50SHRtbFBhZ2UiLCJhbWVuZGVtZW50SHRtbCIsImZvcm1hdHNMaSIsImpzb25MaSIsImZpbmQiLCJmb3JtYXRMaSIsImZvcm1hdFNwYW4iLCJqc29uQSIsImFtZW5kZW1lbnRKc29uVXJsUGF0aCIsImFtZW5kZW1lbnRKc29uVXJsIiwiYW1lbmRlbWVudEpzb25SZXNwb25zZSIsImpzb24iLCJ3cml0ZUZpbGUiLCJwYWdpbmF0aW9uQSIsInVybFBhdGgiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFyc2Vycy9yZWNoZXJjaGVfYW1lbmRlbWVudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCJcbi8vIE5vdGU6IFwiL2luZGV4LmpzXCIgYWRkZWQgdG8gaW1wb3J0cywgYmVjYXVzZSBvZiBpc3N1ZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8yOTY0XG5pbXBvcnQgZm9ybWF0SVNPIGZyb20gXCJkYXRlLWZucy9mb3JtYXRJU08vaW5kZXguanNcIlxuaW1wb3J0IGZyTG9jYWxlIGZyb20gXCJkYXRlLWZucy9sb2NhbGUvZnIvaW5kZXguanNcIlxuaW1wb3J0IHBhcnNlRGF0ZSBmcm9tIFwiZGF0ZS1mbnMvcGFyc2UvaW5kZXguanNcIlxuaW1wb3J0IGRlZXBFcXVhbCBmcm9tIFwiZGVlcC1lcXVhbFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBmcm9udE1hdHRlciBmcm9tIFwiZnJvbnQtbWF0dGVyXCJcbmltcG9ydCBqc1lhbWwgZnJvbSBcImpzLXlhbWxcIlxuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCJcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlSHRtbCB9IGZyb20gXCJub2RlLWh0bWwtcGFyc2VyXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHsgY2xlYW5BbWVuZGVtZW50IH0gZnJvbSBcIi4uL2NsZWFuZXJzXCJcbmltcG9ydCB7IEFtZW5kZW1lbnQgYXMgUmF3QW1lbmRlbWVudCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvYW1lbmRlbWVudHNcIlxuaW1wb3J0IHsgQW1lbmRlbWVudCwgQ29udmVydCBhcyBBbWVuZGVtZW50c0NvbnZlcnQgfSBmcm9tIFwiLi4vdHlwZXMvYW1lbmRlbWVudHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24qIGl0ZXJSZWNoZXJjaGVBbWVuZGVtZW50cyhcbiAgYW1lbmRlbWVudHNTZWFyY2hDYWNoZURpcjogc3RyaW5nLFxuICB1cmw6IHN0cmluZyxcbiAgaW5jcmVtZW50YWw6IGJvb2xlYW4sXG4gIG1pbkRhdGVEZXBvdD86IHN0cmluZyB8IG51bGwsXG4gIG1pbkRhdGVFeGFtZW4/OiBzdHJpbmcgfCBudWxsLFxuICBvcHRpb25zOiB7IHNpbGVudD86IGJvb2xlYW47IHZlcmJvc2U/OiBib29sZWFuIH0gPSB7fSxcbik6IEFzeW5jR2VuZXJhdG9yPFtzdHJpbmcsIEFtZW5kZW1lbnRdLCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciBhd2FpdCAoY29uc3QgW1xuICAgIGFtZW5kZW1lbnRVcmxQYXRoLFxuICAgIGFtZW5kZW1lbnQsXG4gIF0gb2YgaXRlclJlY2hlcmNoZVJhd0FtZW5kZW1lbnRzKFxuICAgIGFtZW5kZW1lbnRzU2VhcmNoQ2FjaGVEaXIsXG4gICAgdXJsLFxuICAgIGluY3JlbWVudGFsLFxuICAgIG1pbkRhdGVEZXBvdCxcbiAgICBtaW5EYXRlRXhhbWVuLFxuICAgIG9wdGlvbnMsXG4gICkpIHtcbiAgICBjbGVhbkFtZW5kZW1lbnQoYW1lbmRlbWVudClcbiAgICAvLyBEb3VibGUgY29udmVyc2lvbiwgdG8gY29udmVydCBzdHJpbmdzIHRvIGRhdGVzLlxuICAgIHlpZWxkIFtcbiAgICAgIGFtZW5kZW1lbnRVcmxQYXRoLFxuICAgICAgQW1lbmRlbWVudHNDb252ZXJ0LnRvQW1lbmRlbWVudChKU09OLnN0cmluZ2lmeShhbWVuZGVtZW50KSksXG4gICAgXVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiogaXRlclJlY2hlcmNoZVJhd0FtZW5kZW1lbnRzKFxuICBhbWVuZGVtZW50c1NlYXJjaENhY2hlRGlyOiBzdHJpbmcsXG4gIHVybDogc3RyaW5nLFxuICBpbmNyZW1lbnRhbDogYm9vbGVhbixcbiAgbWluRGF0ZURlcG90Pzogc3RyaW5nIHwgbnVsbCxcbiAgbWluRGF0ZUV4YW1lbj86IHN0cmluZyB8IG51bGwsXG4gIG9wdGlvbnM6IHsgc2lsZW50PzogYm9vbGVhbjsgdmVyYm9zZT86IGJvb2xlYW4gfSA9IHt9LFxuKTogQXN5bmNHZW5lcmF0b3I8W3N0cmluZywgUmF3QW1lbmRlbWVudF0sIHZvaWQsIHVua25vd24+IHtcbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGFtZW5kZW1lbnRzU2VhcmNoQ2FjaGVEaXIpXG5cbiAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgIC9bPyZdZGF0ZV9kZXBvdD0vLmV4ZWModXJsKSxcbiAgICBudWxsLFxuICAgIGBVUkwgJHt1cmx9IGFscmVhZHkgY29udGFpbnMgYSBkZXBvc2l0IGRhdGVgLFxuICApXG4gIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAvWz8mXW9yZGVyPS8uZXhlYyh1cmwpLFxuICAgIG51bGwsXG4gICAgYFVSTCAke3VybH0gYWxyZWFkeSBjb250YWlucyBhIHNvcnQgb3JkZXJgLFxuICApXG4gIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAvWz8mXXBhZ2U9Ly5leGVjKHVybCksXG4gICAgbnVsbCxcbiAgICBgVVJMICR7dXJsfSBhbHJlYWR5IGNvbnRhaW5zIGEgcGFnZSBudW1iZXJgLFxuICApXG4gIGlmIChpbmNyZW1lbnRhbCkge1xuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICAgIC9bPyZdZXRhdD0vLmV4ZWModXJsKSxcbiAgICAgIG51bGwsXG4gICAgICBgSW4gaW5jcmVtZW50YWwgbW9kZSwgVVJMICR7dXJsfSBtdXN0IGNvbnRhaW4gYW4gXCJldGF0XCIgcXVlcnkgcGFyYW1ldGVyYCxcbiAgICApXG4gIH1cbiAgdXJsICs9ICh1cmwuaW5jbHVkZXMoXCI/XCIpID8gXCImXCIgOiBcIj9cIikgKyBcIm9yZGVyPWRhdGVfZGVwb3QsZGVzYyZwYWdlPTFcIlxuXG4gIGlmIChtaW5EYXRlRGVwb3QgIT0gbnVsbCkge1xuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICAgIC9cXGR7NH0tXFxkezJ9LVxcZHsyfS8uZXhlYyhtaW5EYXRlRGVwb3QpLFxuICAgICAgbnVsbCxcbiAgICAgIGBJbnZhbGlkIGZvcm1hdCBmb3IgbWluaW11bSBkYXRlOiAke21pbkRhdGVEZXBvdH1gLFxuICAgIClcbiAgfVxuXG4gIGxldCBhbWVuZGVtZW50TnVtYmVyID0gMFxuICBpdGVyU2VhcmNoUGFnZXM6IHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coYEZldGNoaW5nIGFtZW5kZW1lbnRzIHNlYXJjaCBwYWdlIGF0ICR7dXJsfeKApmApXG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKVxuICAgIGFzc2VydChcbiAgICAgIHJlc3BvbnNlLm9rLFxuICAgICAgYFJldHJpZXZhbCBvZiBzZWFyY2ggcGFnZSBhdCAke3VybH0gZmFpbGVkIHdpdGggZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCxcbiAgICApXG4gICAgY29uc3QgcGFnZSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgIGNvbnN0IGh0bWwgPSBwYXJzZUh0bWwocGFnZSlcbiAgICBpZiAoaHRtbC5xdWVyeVNlbGVjdG9yKFwiZGl2Lm5vLXJlc3VsdFwiKSAhPT0gbnVsbCkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgY29uc3QgYW1lbmRlbWVudHNDb3VudERpdiA9IGh0bWwucXVlcnlTZWxlY3RvcihcImRpdi5taXJyb3ItY2FyZC1zdWJ0aXRsZVwiKVxuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhbWVuZGVtZW50c0NvdW50RGl2LCBudWxsKVxuICAgIGNvbnN0IGFtZW5kZW1lbnRzQ291bnQgPSBwYXJzZUludCgvXFxkKy8uZXhlYyhhbWVuZGVtZW50c0NvdW50RGl2IS50ZXh0KSFbMF0pXG4gICAgY29uc3QgYW1lbmRlbWVudHNEaXYgPSBodG1sLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBcImRpdi5hbWVuZGVtZW50LWxpc3QtLXJlc3VsdHMtdGFibGVcIixcbiAgICApXG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFtZW5kZW1lbnRzRGl2LCBudWxsKVxuICAgIGNvbnN0IGFtZW5kZW1lbnRzVGFibGUgPSBhbWVuZGVtZW50c0RpdiEucXVlcnlTZWxlY3RvcihcInRhYmxlXCIpXG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFtZW5kZW1lbnRzVGFibGUsIG51bGwpXG4gICAgY29uc3QgdGZvb3RUciA9IGFtZW5kZW1lbnRzVGFibGUhLnF1ZXJ5U2VsZWN0b3IoXCJ0Zm9vdCA+IHRyXCIpXG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKHRmb290VHIsIG51bGwpXG4gICAgY29uc3QgdGZvb3RUckNlbGxzID0gdGZvb3RUciFcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKFwidGQsIHRoXCIpXG4gICAgICAubWFwKChjZWxsKSA9PiBjZWxsLnRleHQpXG4gICAgYXNzZXJ0KFxuICAgICAgZGVlcEVxdWFsKHRmb290VHJDZWxscywgW1xuICAgICAgICBcIlwiLFxuICAgICAgICBcIm7CsFwiLFxuICAgICAgICBcIkRvc3NpZXIgbMOpZ2lzbGF0aWZcIixcbiAgICAgICAgXCJFbXBsYWNlbWVudFwiLFxuICAgICAgICBcIkF1dGV1clwiLFxuICAgICAgICBcIsOJdGF0XCIsXG4gICAgICAgIFwiU29ydFwiLFxuICAgICAgICBcIkRhdGUgZCdleGFtZW5cIixcbiAgICAgICAgXCJFeGFtaW7DqSBwYXJcIixcbiAgICAgICAgXCJUZXh0ZSB2aXPDqVwiLFxuICAgICAgICBcIkRhdGUgZGUgZMOpcMO0dFwiLFxuICAgICAgXSksXG4gICAgICBgVW5leHBlY3RlZCBjb2x1bW5zIGluICR7SlNPTi5zdHJpbmdpZnkodGZvb3RUckNlbGxzLCBudWxsLCAyKX1gLFxuICAgIClcbiAgICBjb25zdCBhbWVuZGVtZW50c1RyID0gYW1lbmRlbWVudHNUYWJsZSEucXVlcnlTZWxlY3RvckFsbChcInRib2R5ID4gdHJcIilcbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYW1lbmRlbWVudHNUci5sZW5ndGgsIDApXG4gICAgZm9yIChjb25zdCBhbWVuZGVtZW50VHIgb2YgYW1lbmRlbWVudHNUcikge1xuICAgICAgYW1lbmRlbWVudE51bWJlcisrXG5cbiAgICAgIGlmIChtaW5EYXRlRGVwb3QgIT0gbnVsbCB8fCBtaW5EYXRlRXhhbWVuICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudFRkTGlzdCA9IGFtZW5kZW1lbnRUci5xdWVyeVNlbGVjdG9yQWxsKFwidGRcIilcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICAgIGFtZW5kZW1lbnRUZExpc3QubGVuZ3RoLFxuICAgICAgICAgIDExLFxuICAgICAgICAgIGBVbmV4cGVjdGVkIG51bWJlciBvZiBjb2x1bW5zIGluIGFtZW5kbWVudCByb3c6ICR7YW1lbmRlbWVudFRyLm91dGVySFRNTH1gLFxuICAgICAgICApXG4gICAgICAgIGlmIChtaW5EYXRlRGVwb3QgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGRhdGVEZXBvdFRkID0gYW1lbmRlbWVudFRkTGlzdFsxMF1cbiAgICAgICAgICBjb25zdCBkYXRlRGVwb3QgPSBmb3JtYXRJU08oXG4gICAgICAgICAgICBwYXJzZURhdGUoZGF0ZURlcG90VGQudGV4dCwgXCJkIE1NTU0geVwiLCBuZXcgRGF0ZSgpLCB7IGxvY2FsZTogZnJMb2NhbGUgfSksXG4gICAgICAgICAgICB7IHJlcHJlc2VudGF0aW9uOiBcImRhdGVcIiB9LFxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAoZGF0ZURlcG90IDwgbWluRGF0ZURlcG90KSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgYW1lbmRtZW50cyBhcmUgc29ydGVkIGJ5IGRlcG9zaXQgZGF0ZSwgb25jZSBhbiBhbWVuZG1lbnRcbiAgICAgICAgICAgIC8vIHdpdGggYW4gb2xkIGRlcG9zaXQgZGF0ZSBpcyBlbmNvdW50ZXJlZCwgdGhlIGZ1bGwgc2VhcmNoIGNhbiBiZSBzdG9wcGVkLlxuICAgICAgICAgICAgYnJlYWsgaXRlclNlYXJjaFBhZ2VzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaW5EYXRlRXhhbWVuICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBkYXRlRXhhbWVuVGQgPSBhbWVuZGVtZW50VGRMaXN0WzddXG4gICAgICAgICAgaWYgKGRhdGVFeGFtZW5UZC50ZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlRXhhbWVuID0gZm9ybWF0SVNPKFxuICAgICAgICAgICAgICBwYXJzZURhdGUoZGF0ZUV4YW1lblRkLnRleHQsIFwiZCBNTU1NIHlcIiwgbmV3IERhdGUoKSwge1xuICAgICAgICAgICAgICAgIGxvY2FsZTogZnJMb2NhbGUsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB7IHJlcHJlc2VudGF0aW9uOiBcImRhdGVcIiB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKGRhdGVFeGFtZW4gPCBtaW5EYXRlRXhhbWVuKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgYW1lbmRtZW50IGhhcyBiZWVuIGRpc2N1c3NlZCBzaW5jZSBhIGZldyBkYXlzLlxuICAgICAgICAgICAgICAvLyA9PiBJZ25vcmUgaXQsIGJlY2F1c2UgaXQgc2hvdWxkIGJlIGluIEFzc2VtYmzDqWUgb3BlbiBkYXRhLlxuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhbWVuZGVtZW50VXJsUGF0aCA9IGFtZW5kZW1lbnRUci5nZXRBdHRyaWJ1dGUoXCJkYXRhLWhyZWZcIilcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhbWVuZGVtZW50VXJsUGF0aCwgdW5kZWZpbmVkKVxuICAgICAgY29uc3QgYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZCA9IGFtZW5kZW1lbnRVcmxQYXRoIS5zcGxpdChcIi9cIilcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZFswXSxcbiAgICAgICAgXCJcIixcbiAgICAgICAgYFVuZXhwZWN0ZWQgVVJMIHBhdGggZm9yIGFtZW5kZW1lbnQ6ICR7YW1lbmRlbWVudFVybFBhdGh9YCxcbiAgICAgIClcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZFsxXSxcbiAgICAgICAgXCJkeW5cIixcbiAgICAgICAgYFVuZXhwZWN0ZWQgVVJMIHBhdGggZm9yIGFtZW5kZW1lbnQ6ICR7YW1lbmRlbWVudFVybFBhdGh9YCxcbiAgICAgIClcbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRTZWFyY2hDYWNoZUZpbGVQYXRoID1cbiAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgIGFtZW5kZW1lbnRzU2VhcmNoQ2FjaGVEaXIsXG4gICAgICAgICAgLi4uYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZC5zbGljZSgyKSxcbiAgICAgICAgKSArIFwiLmh0bWxcIlxuICAgICAgYXdhaXQgZnMuZW5zdXJlRGlyKHBhdGguZGlybmFtZShhbWVuZGVtZW50U2VhcmNoQ2FjaGVGaWxlUGF0aCkpXG4gICAgICBjb25zdCBleGlzdGluZ0FtZW5kZW1lbnRTZWFyY2hDYWNoZSA9IChhd2FpdCBmcy5wYXRoRXhpc3RzKFxuICAgICAgICBhbWVuZGVtZW50U2VhcmNoQ2FjaGVGaWxlUGF0aCxcbiAgICAgICkpXG4gICAgICAgID8gYXdhaXQgZnMucmVhZEZpbGUoYW1lbmRlbWVudFNlYXJjaENhY2hlRmlsZVBhdGgsIFwidXRmOFwiKVxuICAgICAgICA6IG51bGxcbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRUck91dGVySHRtbCA9IGFtZW5kZW1lbnRUci5vdXRlckhUTUxcbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRTZWFyY2hDYWNoZSA9IGAtLS1cXG4ke2pzWWFtbC5kdW1wKFxuICAgICAgICB7XG4gICAgICAgICAgcG9zaXRpb246IGFtZW5kZW1lbnRzQ291bnQgLSBhbWVuZGVtZW50TnVtYmVyLFxuICAgICAgICAgIHNlYXJjaDogdXJsLnJlcGxhY2UoLyZwYWdlPVtcXGRdKy8sIFwiXCIpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc29ydEtleXM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICApfS0tLVxcblxcbiR7YW1lbmRlbWVudFRyT3V0ZXJIdG1sfWBcbiAgICAgIGlmIChhbWVuZGVtZW50U2VhcmNoQ2FjaGUgPT09IGV4aXN0aW5nQW1lbmRlbWVudFNlYXJjaENhY2hlKSB7XG4gICAgICAgIGlmIChpbmNyZW1lbnRhbCkge1xuICAgICAgICAgIC8vIFRoZSBzYW1lIDx0cj4gaXMgYWxyZWFkeSBpbiBjYWNoZSBhbmQgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gICAgICAgICAgLy8gQXNzdW1lIHRoYXQgZm9sbG93aW5nIGFtZW5kbWVudHMgYXJlIG5vdCBjaGFuZ2VkIGFuZCBzdG9wIGxvb2tpbmdcbiAgICAgICAgICAvLyBmb3IgYW1lbmRtZW50cyB0byB1cHNlcnQuXG4gICAgICAgICAgYnJlYWsgaXRlclNlYXJjaFBhZ2VzXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgZXhpc3RpbmdBbWVuZGVtZW50U2VhcmNoQ2FjaGUgIT09IG51bGwgJiZcbiAgICAgICAgZnJvbnRNYXR0ZXIoZXhpc3RpbmdBbWVuZGVtZW50U2VhcmNoQ2FjaGUpLmJvZHkgPT09XG4gICAgICAgICAgYW1lbmRlbWVudFRyT3V0ZXJIdG1sXG4gICAgICApIHtcbiAgICAgICAgLy8gVGhlIHNhbWUgPHRyPiBpcyBhbHJlYWR5IGluIGNhY2hlLCBidXQgaW4gYSBkaWZmZXJlbnQgcG9zaXRpb24uXG4gICAgICAgIC8vIEFzc3VtZSB0aGUgYW1lbmRtZW50IGlzIHVuY2hhbmdlZC5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nQW1lbmRlbWVudFNlYXJjaENhY2hlID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgQWRkaW5nIGFtZW5kZW1lbnQgc2VhcmNoIGNhY2hlOiAke2FtZW5kZW1lbnRTZWFyY2hDYWNoZUZpbGVQYXRofeKApmAsXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFVwZGF0aW5nIGFtZW5kZW1lbnQgc2VhcmNoIGNhY2hlOiAke2FtZW5kZW1lbnRTZWFyY2hDYWNoZUZpbGVQYXRofeKApmAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBhbWVuZGVtZW50SHRtbFVybCA9IG5ldyBVUkwoXG4gICAgICAgIGFtZW5kZW1lbnRVcmxQYXRoISxcbiAgICAgICAgXCJodHRwczovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyL1wiLFxuICAgICAgKS50b1N0cmluZygpXG4gICAgICBjb25zdCBhbWVuZGVtZW50SHRtbFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYW1lbmRlbWVudEh0bWxVcmwpXG4gICAgICBhc3NlcnQoXG4gICAgICAgIGFtZW5kZW1lbnRIdG1sUmVzcG9uc2Uub2ssXG4gICAgICAgIGBSZXRyaWV2YWwgb2YgYW1lbmRlbWVudCBIVE1MIHBhZ2UgYXQgJHthbWVuZGVtZW50SHRtbFVybH0gZmFpbGVkIHdpdGggZXJyb3I6ICR7YW1lbmRlbWVudEh0bWxSZXNwb25zZS5zdGF0dXN9ICR7YW1lbmRlbWVudEh0bWxSZXNwb25zZS5zdGF0dXNUZXh0fWAsXG4gICAgICApXG4gICAgICBjb25zdCBhbWVuZGVtZW50SHRtbFBhZ2UgPSBhd2FpdCBhbWVuZGVtZW50SHRtbFJlc3BvbnNlLnRleHQoKVxuICAgICAgY29uc3QgYW1lbmRlbWVudEh0bWwgPSBwYXJzZUh0bWwoYW1lbmRlbWVudEh0bWxQYWdlKVxuICAgICAgY29uc3QgZm9ybWF0c0xpID0gYW1lbmRlbWVudEh0bWwucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgXCJsaS5taXJyb3ItY2FyZC1oZWFkZXItLW9wdGlvbnMtLWNvbnRlbnQtLWl0ZW1cIixcbiAgICAgIClcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChmb3JtYXRzTGkubGVuZ3RoLCAwKVxuICAgICAgY29uc3QganNvbkxpID0gZm9ybWF0c0xpLmZpbmQoKGZvcm1hdExpKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdFNwYW4gPSBmb3JtYXRMaS5xdWVyeVNlbGVjdG9yKFwiYSA+IHNwYW5cIilcbiAgICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgICAgICAgIGZvcm1hdFNwYW4sXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBgTm8gPHNwYW4+IGluIDxhPiBmb3VuZCBpbiAke2Zvcm1hdExpLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gZm9ybWF0U3BhbiEudGV4dCA9PT0gXCJWZXJzaW9uIEpTT05cIlxuICAgICAgfSlcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICAgICAganNvbkxpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGBObyBKU09OIHZlcnNpb24gZm91bmQgZm9yIGFtZW5kZW1lbnQgYXQgJHthbWVuZGVtZW50SHRtbFVybH1gLFxuICAgICAgKVxuICAgICAgY29uc3QganNvbkEgPSBqc29uTGkhLnF1ZXJ5U2VsZWN0b3IoXCJhXCIpXG4gICAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgICAgIGpzb25BLFxuICAgICAgICBudWxsLFxuICAgICAgICBgTm8gPGE+IGZvdW5kIGluICR7anNvbkxpIS50b1N0cmluZygpfWAsXG4gICAgICApXG4gICAgICBjb25zdCBhbWVuZGVtZW50SnNvblVybFBhdGggPSBqc29uQSEuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgICAgICBhbWVuZGVtZW50SnNvblVybFBhdGgsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYE5vIFVSTCBmb3VuZCBmb3IgSlNPTiB2ZXJzaW9uIG9mIGFtZW5kZW1lbnQ6ICR7anNvbkxpIS50b1N0cmluZygpfWAsXG4gICAgICApXG4gICAgICBjb25zdCBhbWVuZGVtZW50SnNvblVybCA9IG5ldyBVUkwoXG4gICAgICAgIGFtZW5kZW1lbnRKc29uVXJsUGF0aCEsXG4gICAgICAgIFwiaHR0cHM6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci9cIixcbiAgICAgICkudG9TdHJpbmcoKVxuICAgICAgY29uc3QgYW1lbmRlbWVudEpzb25SZXNwb25zZSA9IGF3YWl0IGZldGNoKGFtZW5kZW1lbnRKc29uVXJsKVxuICAgICAgYXNzZXJ0KFxuICAgICAgICBhbWVuZGVtZW50SnNvblJlc3BvbnNlLm9rLFxuICAgICAgICBgUmV0cmlldmFsIG9mIGFtZW5kZW1lbnQgSlNPTiBwYWdlIGF0ICR7YW1lbmRlbWVudEpzb25Vcmx9IGZhaWxlZCB3aXRoIGVycm9yOiAke2FtZW5kZW1lbnRKc29uUmVzcG9uc2Uuc3RhdHVzfSAke2FtZW5kZW1lbnRKc29uUmVzcG9uc2Uuc3RhdHVzVGV4dH1gLFxuICAgICAgKVxuICAgICAgY29uc3QgYW1lbmRlbWVudCA9IGF3YWl0IGFtZW5kZW1lbnRKc29uUmVzcG9uc2UuanNvbigpXG4gICAgICB5aWVsZCBbYW1lbmRlbWVudFVybFBhdGghLCBhbWVuZGVtZW50XVxuXG4gICAgICAvLyBTZWFyY2hDYWNoZSBtdXN0IGJlIHdyaXR0ZW4gYXQgdGhlIGVuZCB0byBlbnN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIGluIGEgY29uc2lzdGVudCBzdGF0ZSxcbiAgICAgIC8vIGV2ZW4gaWYgc2NyaXB0IGZhaWxzIGFicnVwdGx5LlxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgICBhbWVuZGVtZW50U2VhcmNoQ2FjaGVGaWxlUGF0aCxcbiAgICAgICAgYW1lbmRlbWVudFNlYXJjaENhY2hlLFxuICAgICAgICBcInV0ZjhcIixcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBwYWdpbmF0aW9uQSA9IGh0bWwucXVlcnlTZWxlY3RvcihcbiAgICAgIFwiZGl2LmFuLXBhZ2luYXRpb24tLWl0ZW0gPiBpLmFuLWljb25zLWNoZXZyb24tcmlnaHQgfiBhXCIsXG4gICAgKVxuICAgIGlmIChwYWdpbmF0aW9uQSA9PT0gbnVsbCkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgY29uc3QgdXJsUGF0aCA9IHBhZ2luYXRpb25BLmdldEF0dHJpYnV0ZShcImhyZWZcIilcbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwodXJsUGF0aCwgdW5kZWZpbmVkKVxuICAgIHVybCA9IG5ldyBVUkwodXJsUGF0aCEsIFwiaHR0cHM6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci9cIikudG9TdHJpbmcoKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLE1BQVAsTUFBbUIsUUFBbkIsQyxDQUNBO0FBQ0E7O0FBQ0EsT0FBT0MsU0FBUCxNQUFzQiw2QkFBdEI7QUFDQSxPQUFPQyxRQUFQLE1BQXFCLDZCQUFyQjtBQUNBLE9BQU9DLFNBQVAsTUFBc0IseUJBQXRCO0FBQ0EsT0FBT0MsU0FBUCxNQUFzQixZQUF0QjtBQUNBLE9BQU9DLEVBQVAsTUFBZSxVQUFmO0FBQ0EsT0FBT0MsV0FBUCxNQUF3QixjQUF4QjtBQUNBLE9BQU9DLE1BQVAsTUFBbUIsU0FBbkI7QUFDQSxPQUFPQyxLQUFQLE1BQWtCLFlBQWxCO0FBQ0EsU0FBU0MsS0FBSyxJQUFJQyxTQUFsQixRQUFtQyxrQkFBbkM7QUFDQSxPQUFPQyxJQUFQLE1BQWlCLE1BQWpCO1NBRVNDLGU7U0FFWUMsT0FBTyxJQUFJQyxrQjtBQUVoQyxPQUFPLGdCQUFnQkMsd0JBQWhCLENBQ0xDLHlCQURLLEVBRUxDLEdBRkssRUFHTEMsV0FISyxFQUlMQyxZQUpLLEVBS0xDLGFBTEssRUFNTEMsT0FBZ0QsR0FBRyxFQU45QyxFQU9nRDtFQUNyRCxXQUFXLE1BQU0sQ0FDZkMsaUJBRGUsRUFFZkMsVUFGZSxDQUFqQixJQUdLQywyQkFBMkIsQ0FDOUJSLHlCQUQ4QixFQUU5QkMsR0FGOEIsRUFHOUJDLFdBSDhCLEVBSTlCQyxZQUo4QixFQUs5QkMsYUFMOEIsRUFNOUJDLE9BTjhCLENBSGhDLEVBVUc7SUFDRFQsZUFBZSxDQUFDVyxVQUFELENBQWYsQ0FEQyxDQUVEOztJQUNBLE1BQU0sQ0FDSkQsaUJBREksRUFFSlIsa0JBQWtCLENBQUNXLFlBQW5CLENBQWdDQyxJQUFJLENBQUNDLFNBQUwsQ0FBZUosVUFBZixDQUFoQyxDQUZJLENBQU47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
632
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpdGVyUmVjaGVyY2hlQW1lbmRlbWVudHMiLCJhbWVuZGVtZW50c1NlYXJjaENhY2hlRGlyIiwidXJsIiwiaW5jcmVtZW50YWwiLCJtaW5EYXRlRGVwb3QiLCJtaW5EYXRlRXhhbWVuIiwib3B0aW9ucyIsIml0ZXJSZWNoZXJjaGVSYXdBbWVuZGVtZW50cyIsImFtZW5kZW1lbnRVcmxQYXRoIiwiYW1lbmRlbWVudCIsImNsZWFuQW1lbmRlbWVudCIsIkFtZW5kZW1lbnRzQ29udmVydCIsInRvQW1lbmRlbWVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJmcyIsImVuc3VyZURpciIsImFzc2VydCIsInN0cmljdEVxdWFsIiwiZXhlYyIsIm5vdFN0cmljdEVxdWFsIiwiaW5jbHVkZXMiLCJhbWVuZGVtZW50TnVtYmVyIiwidmVyYm9zZSIsImNvbnNvbGUiLCJsb2ciLCJmZXRjaCIsInJlc3BvbnNlIiwib2siLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwidGV4dCIsInBhZ2UiLCJodG1sIiwicGFyc2VIdG1sIiwicXVlcnlTZWxlY3RvciIsImFtZW5kZW1lbnRzQ291bnREaXYiLCJhbWVuZGVtZW50c0NvdW50IiwicGFyc2VJbnQiLCJhbWVuZGVtZW50c0RpdiIsImFtZW5kZW1lbnRzVGFibGUiLCJ0Zm9vdFRyIiwidGZvb3RUckNlbGxzIiwicXVlcnlTZWxlY3RvckFsbCIsIm1hcCIsImNlbGwiLCJkZWVwRXF1YWwiLCJhbWVuZGVtZW50c1RyIiwibGVuZ3RoIiwiYW1lbmRlbWVudFRyIiwiYW1lbmRlbWVudFRkTGlzdCIsIm91dGVySFRNTCIsImRhdGVEZXBvdFRkIiwiZGF0ZURlcG90IiwiZm9ybWF0SVNPIiwicGFyc2VEYXRlIiwiRGF0ZSIsImxvY2FsZSIsImZyTG9jYWxlIiwicmVwcmVzZW50YXRpb24iLCJkYXRlRXhhbWVuVGQiLCJkYXRlRXhhbWVuIiwiZ2V0QXR0cmlidXRlIiwidW5kZWZpbmVkIiwiYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZCIsInNwbGl0IiwiYW1lbmRlbWVudFNlYXJjaENhY2hlRmlsZVBhdGgiLCJwYXRoIiwiam9pbiIsInNsaWNlIiwiZGlybmFtZSIsInBhdGhFeGlzdHMiLCJyZWFkRmlsZSIsImV4aXN0aW5nQW1lbmRlbWVudFNlYXJjaENhY2hlIiwiYW1lbmRlbWVudFRyT3V0ZXJIdG1sIiwiYW1lbmRlbWVudFNlYXJjaENhY2hlIiwianNZYW1sIiwiZHVtcCIsInBvc2l0aW9uIiwic2VhcmNoIiwicmVwbGFjZSIsInNvcnRLZXlzIiwiZnJvbnRNYXR0ZXIiLCJib2R5IiwiYW1lbmRlbWVudEh0bWxVcmwiLCJVUkwiLCJ0b1N0cmluZyIsImFtZW5kZW1lbnRIdG1sUmVzcG9uc2UiLCJhbWVuZGVtZW50SHRtbFBhZ2UiLCJhbWVuZGVtZW50SHRtbCIsImZvcm1hdHNMaSIsImpzb25MaSIsImZpbmQiLCJmb3JtYXRMaSIsImZvcm1hdFNwYW4iLCJqc29uQSIsImFtZW5kZW1lbnRKc29uVXJsUGF0aCIsImFtZW5kZW1lbnRKc29uVXJsIiwiYW1lbmRlbWVudEpzb25SZXNwb25zZSIsImpzb24iLCJ3cml0ZUZpbGUiLCJwYWdpbmF0aW9uQSIsInVybFBhdGgiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFyc2Vycy9yZWNoZXJjaGVfYW1lbmRlbWVudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCJcbi8vIE5vdGU6IFwiL2luZGV4LmpzXCIgYWRkZWQgdG8gaW1wb3J0cywgYmVjYXVzZSBvZiBpc3N1ZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8yOTY0XG5pbXBvcnQgZm9ybWF0SVNPIGZyb20gXCJkYXRlLWZucy9mb3JtYXRJU08vaW5kZXguanNcIlxuaW1wb3J0IGZyTG9jYWxlIGZyb20gXCJkYXRlLWZucy9sb2NhbGUvZnIvaW5kZXguanNcIlxuaW1wb3J0IHBhcnNlRGF0ZSBmcm9tIFwiZGF0ZS1mbnMvcGFyc2UvaW5kZXguanNcIlxuaW1wb3J0IGRlZXBFcXVhbCBmcm9tIFwiZGVlcC1lcXVhbFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBmcm9udE1hdHRlciBmcm9tIFwiZnJvbnQtbWF0dGVyXCJcbmltcG9ydCBqc1lhbWwgZnJvbSBcImpzLXlhbWxcIlxuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCJcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlSHRtbCB9IGZyb20gXCJub2RlLWh0bWwtcGFyc2VyXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHsgY2xlYW5BbWVuZGVtZW50IH0gZnJvbSBcIi4uL2NsZWFuZXJzXCJcbmltcG9ydCB7IEFtZW5kZW1lbnQgYXMgUmF3QW1lbmRlbWVudCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvYW1lbmRlbWVudHNcIlxuaW1wb3J0IHsgQW1lbmRlbWVudCwgQ29udmVydCBhcyBBbWVuZGVtZW50c0NvbnZlcnQgfSBmcm9tIFwiLi4vdHlwZXMvYW1lbmRlbWVudHNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24qIGl0ZXJSZWNoZXJjaGVBbWVuZGVtZW50cyhcbiAgYW1lbmRlbWVudHNTZWFyY2hDYWNoZURpcjogc3RyaW5nLFxuICB1cmw6IHN0cmluZyxcbiAgaW5jcmVtZW50YWw6IGJvb2xlYW4sXG4gIG1pbkRhdGVEZXBvdD86IHN0cmluZyB8IG51bGwsXG4gIG1pbkRhdGVFeGFtZW4/OiBzdHJpbmcgfCBudWxsLFxuICBvcHRpb25zOiB7IHNpbGVudD86IGJvb2xlYW47IHZlcmJvc2U/OiBib29sZWFuIH0gPSB7fSxcbik6IEFzeW5jR2VuZXJhdG9yPFtzdHJpbmcsIEFtZW5kZW1lbnRdLCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciBhd2FpdCAoY29uc3QgW1xuICAgIGFtZW5kZW1lbnRVcmxQYXRoLFxuICAgIGFtZW5kZW1lbnQsXG4gIF0gb2YgaXRlclJlY2hlcmNoZVJhd0FtZW5kZW1lbnRzKFxuICAgIGFtZW5kZW1lbnRzU2VhcmNoQ2FjaGVEaXIsXG4gICAgdXJsLFxuICAgIGluY3JlbWVudGFsLFxuICAgIG1pbkRhdGVEZXBvdCxcbiAgICBtaW5EYXRlRXhhbWVuLFxuICAgIG9wdGlvbnMsXG4gICkpIHtcbiAgICBjbGVhbkFtZW5kZW1lbnQoYW1lbmRlbWVudClcbiAgICAvLyBEb3VibGUgY29udmVyc2lvbiwgdG8gY29udmVydCBzdHJpbmdzIHRvIGRhdGVzLlxuICAgIHlpZWxkIFtcbiAgICAgIGFtZW5kZW1lbnRVcmxQYXRoLFxuICAgICAgQW1lbmRlbWVudHNDb252ZXJ0LnRvQW1lbmRlbWVudChKU09OLnN0cmluZ2lmeShhbWVuZGVtZW50KSksXG4gICAgXVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiogaXRlclJlY2hlcmNoZVJhd0FtZW5kZW1lbnRzKFxuICBhbWVuZGVtZW50c1NlYXJjaENhY2hlRGlyOiBzdHJpbmcsXG4gIHVybDogc3RyaW5nLFxuICBpbmNyZW1lbnRhbDogYm9vbGVhbixcbiAgbWluRGF0ZURlcG90Pzogc3RyaW5nIHwgbnVsbCxcbiAgbWluRGF0ZUV4YW1lbj86IHN0cmluZyB8IG51bGwsXG4gIG9wdGlvbnM6IHsgc2lsZW50PzogYm9vbGVhbjsgdmVyYm9zZT86IGJvb2xlYW4gfSA9IHt9LFxuKTogQXN5bmNHZW5lcmF0b3I8W3N0cmluZywgUmF3QW1lbmRlbWVudF0sIHZvaWQsIHVua25vd24+IHtcbiAgYXdhaXQgZnMuZW5zdXJlRGlyKGFtZW5kZW1lbnRzU2VhcmNoQ2FjaGVEaXIpXG5cbiAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgIC9bPyZdZGF0ZV9kZXBvdD0vLmV4ZWModXJsKSxcbiAgICBudWxsLFxuICAgIGBVUkwgJHt1cmx9IGFscmVhZHkgY29udGFpbnMgYSBkZXBvc2l0IGRhdGVgLFxuICApXG4gIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAvWz8mXW9yZGVyPS8uZXhlYyh1cmwpLFxuICAgIG51bGwsXG4gICAgYFVSTCAke3VybH0gYWxyZWFkeSBjb250YWlucyBhIHNvcnQgb3JkZXJgLFxuICApXG4gIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAvWz8mXXBhZ2U9Ly5leGVjKHVybCksXG4gICAgbnVsbCxcbiAgICBgVVJMICR7dXJsfSBhbHJlYWR5IGNvbnRhaW5zIGEgcGFnZSBudW1iZXJgLFxuICApXG4gIGlmIChpbmNyZW1lbnRhbCkge1xuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICAgIC9bPyZdZXRhdD0vLmV4ZWModXJsKSxcbiAgICAgIG51bGwsXG4gICAgICBgSW4gaW5jcmVtZW50YWwgbW9kZSwgVVJMICR7dXJsfSBtdXN0IGNvbnRhaW4gYW4gXCJldGF0XCIgcXVlcnkgcGFyYW1ldGVyYCxcbiAgICApXG4gIH1cbiAgdXJsICs9ICh1cmwuaW5jbHVkZXMoXCI/XCIpID8gXCImXCIgOiBcIj9cIikgKyBcIm9yZGVyPWRhdGVfZGVwb3QsZGVzYyZwYWdlPTFcIlxuXG4gIGlmIChtaW5EYXRlRGVwb3QgIT0gbnVsbCkge1xuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICAgIC9cXGR7NH0tXFxkezJ9LVxcZHsyfS8uZXhlYyhtaW5EYXRlRGVwb3QpLFxuICAgICAgbnVsbCxcbiAgICAgIGBJbnZhbGlkIGZvcm1hdCBmb3IgbWluaW11bSBkYXRlOiAke21pbkRhdGVEZXBvdH1gLFxuICAgIClcbiAgfVxuXG4gIGxldCBhbWVuZGVtZW50TnVtYmVyID0gMFxuICBpdGVyU2VhcmNoUGFnZXM6IHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coYEZldGNoaW5nIGFtZW5kZW1lbnRzIHNlYXJjaCBwYWdlIGF0ICR7dXJsfeKApmApXG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKVxuICAgIGFzc2VydChcbiAgICAgIHJlc3BvbnNlLm9rLFxuICAgICAgYFJldHJpZXZhbCBvZiBzZWFyY2ggcGFnZSBhdCAke3VybH0gZmFpbGVkIHdpdGggZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCxcbiAgICApXG4gICAgY29uc3QgcGFnZSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgIGNvbnN0IGh0bWwgPSBwYXJzZUh0bWwocGFnZSlcbiAgICBpZiAoaHRtbC5xdWVyeVNlbGVjdG9yKFwiZGl2Lm5vLXJlc3VsdFwiKSAhPT0gbnVsbCkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgY29uc3QgYW1lbmRlbWVudHNDb3VudERpdiA9IGh0bWwucXVlcnlTZWxlY3RvcihcImRpdi5taXJyb3ItY2FyZC1zdWJ0aXRsZVwiKVxuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhbWVuZGVtZW50c0NvdW50RGl2LCBudWxsKVxuICAgIGNvbnN0IGFtZW5kZW1lbnRzQ291bnQgPSBwYXJzZUludCgvXFxkKy8uZXhlYyhhbWVuZGVtZW50c0NvdW50RGl2IS50ZXh0KSFbMF0pXG4gICAgY29uc3QgYW1lbmRlbWVudHNEaXYgPSBodG1sLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICBcImRpdi5hbWVuZGVtZW50LWxpc3QtLXJlc3VsdHMtdGFibGVcIixcbiAgICApXG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFtZW5kZW1lbnRzRGl2LCBudWxsKVxuICAgIGNvbnN0IGFtZW5kZW1lbnRzVGFibGUgPSBhbWVuZGVtZW50c0RpdiEucXVlcnlTZWxlY3RvcihcInRhYmxlXCIpXG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFtZW5kZW1lbnRzVGFibGUsIG51bGwpXG4gICAgY29uc3QgdGZvb3RUciA9IGFtZW5kZW1lbnRzVGFibGUhLnF1ZXJ5U2VsZWN0b3IoXCJ0Zm9vdCA+IHRyXCIpXG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKHRmb290VHIsIG51bGwpXG4gICAgY29uc3QgdGZvb3RUckNlbGxzID0gdGZvb3RUciFcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKFwidGQsIHRoXCIpXG4gICAgICAubWFwKChjZWxsKSA9PiBjZWxsLnRleHQpXG4gICAgYXNzZXJ0KFxuICAgICAgZGVlcEVxdWFsKHRmb290VHJDZWxscywgW1xuICAgICAgICBcIlwiLFxuICAgICAgICBcIm7CsFwiLFxuICAgICAgICBcIkRvc3NpZXIgbMOpZ2lzbGF0aWZcIixcbiAgICAgICAgXCJFbXBsYWNlbWVudFwiLFxuICAgICAgICBcIkF1dGV1clwiLFxuICAgICAgICBcIsOJdGF0XCIsXG4gICAgICAgIFwiU29ydFwiLFxuICAgICAgICBcIkRhdGUgZCdleGFtZW5cIixcbiAgICAgICAgXCJFeGFtaW7DqSBwYXJcIixcbiAgICAgICAgXCJUZXh0ZSB2aXPDqVwiLFxuICAgICAgICBcIkRhdGUgZGUgZMOpcMO0dFwiLFxuICAgICAgXSksXG4gICAgICBgVW5leHBlY3RlZCBjb2x1bW5zIGluICR7SlNPTi5zdHJpbmdpZnkodGZvb3RUckNlbGxzLCBudWxsLCAyKX1gLFxuICAgIClcbiAgICBjb25zdCBhbWVuZGVtZW50c1RyID0gYW1lbmRlbWVudHNUYWJsZSEucXVlcnlTZWxlY3RvckFsbChcInRib2R5ID4gdHJcIilcbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYW1lbmRlbWVudHNUci5sZW5ndGgsIDApXG4gICAgZm9yIChjb25zdCBhbWVuZGVtZW50VHIgb2YgYW1lbmRlbWVudHNUcikge1xuICAgICAgYW1lbmRlbWVudE51bWJlcisrXG5cbiAgICAgIGlmIChtaW5EYXRlRGVwb3QgIT0gbnVsbCB8fCBtaW5EYXRlRXhhbWVuICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudFRkTGlzdCA9IGFtZW5kZW1lbnRUci5xdWVyeVNlbGVjdG9yQWxsKFwidGRcIilcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICAgIGFtZW5kZW1lbnRUZExpc3QubGVuZ3RoLFxuICAgICAgICAgIDExLFxuICAgICAgICAgIGBVbmV4cGVjdGVkIG51bWJlciBvZiBjb2x1bW5zIGluIGFtZW5kbWVudCByb3c6ICR7YW1lbmRlbWVudFRyLm91dGVySFRNTH1gLFxuICAgICAgICApXG4gICAgICAgIGlmIChtaW5EYXRlRGVwb3QgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGRhdGVEZXBvdFRkID0gYW1lbmRlbWVudFRkTGlzdFsxMF1cbiAgICAgICAgICBjb25zdCBkYXRlRGVwb3QgPSBmb3JtYXRJU08oXG4gICAgICAgICAgICBwYXJzZURhdGUoZGF0ZURlcG90VGQudGV4dCwgXCJkIE1NTU0geVwiLCBuZXcgRGF0ZSgpLCB7IGxvY2FsZTogZnJMb2NhbGUgfSksXG4gICAgICAgICAgICB7IHJlcHJlc2VudGF0aW9uOiBcImRhdGVcIiB9LFxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAoZGF0ZURlcG90IDwgbWluRGF0ZURlcG90KSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgYW1lbmRtZW50cyBhcmUgc29ydGVkIGJ5IGRlcG9zaXQgZGF0ZSwgb25jZSBhbiBhbWVuZG1lbnRcbiAgICAgICAgICAgIC8vIHdpdGggYW4gb2xkIGRlcG9zaXQgZGF0ZSBpcyBlbmNvdW50ZXJlZCwgdGhlIGZ1bGwgc2VhcmNoIGNhbiBiZSBzdG9wcGVkLlxuICAgICAgICAgICAgYnJlYWsgaXRlclNlYXJjaFBhZ2VzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaW5EYXRlRXhhbWVuICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBkYXRlRXhhbWVuVGQgPSBhbWVuZGVtZW50VGRMaXN0WzddXG4gICAgICAgICAgaWYgKGRhdGVFeGFtZW5UZC50ZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlRXhhbWVuID0gZm9ybWF0SVNPKFxuICAgICAgICAgICAgICBwYXJzZURhdGUoZGF0ZUV4YW1lblRkLnRleHQsIFwiZCBNTU1NIHlcIiwgbmV3IERhdGUoKSwge1xuICAgICAgICAgICAgICAgIGxvY2FsZTogZnJMb2NhbGUsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB7IHJlcHJlc2VudGF0aW9uOiBcImRhdGVcIiB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKGRhdGVFeGFtZW4gPCBtaW5EYXRlRXhhbWVuKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgYW1lbmRtZW50IGhhcyBiZWVuIGRpc2N1c3NlZCBzaW5jZSBhIGZldyBkYXlzLlxuICAgICAgICAgICAgICAvLyA9PiBJZ25vcmUgaXQsIGJlY2F1c2UgaXQgc2hvdWxkIGJlIGluIEFzc2VtYmzDqWUgb3BlbiBkYXRhLlxuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhbWVuZGVtZW50VXJsUGF0aCA9IGFtZW5kZW1lbnRUci5nZXRBdHRyaWJ1dGUoXCJkYXRhLWhyZWZcIilcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhbWVuZGVtZW50VXJsUGF0aCwgdW5kZWZpbmVkKVxuICAgICAgY29uc3QgYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZCA9IGFtZW5kZW1lbnRVcmxQYXRoIS5zcGxpdChcIi9cIilcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZFswXSxcbiAgICAgICAgXCJcIixcbiAgICAgICAgYFVuZXhwZWN0ZWQgVVJMIHBhdGggZm9yIGFtZW5kZW1lbnQ6ICR7YW1lbmRlbWVudFVybFBhdGh9YCxcbiAgICAgIClcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZFsxXSxcbiAgICAgICAgXCJkeW5cIixcbiAgICAgICAgYFVuZXhwZWN0ZWQgVVJMIHBhdGggZm9yIGFtZW5kZW1lbnQ6ICR7YW1lbmRlbWVudFVybFBhdGh9YCxcbiAgICAgIClcbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRTZWFyY2hDYWNoZUZpbGVQYXRoID1cbiAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgIGFtZW5kZW1lbnRzU2VhcmNoQ2FjaGVEaXIsXG4gICAgICAgICAgLi4uYW1lbmRlbWVudFVybFBhdGhTcGxpdHRlZC5zbGljZSgyKSxcbiAgICAgICAgKSArIFwiLmh0bWxcIlxuICAgICAgYXdhaXQgZnMuZW5zdXJlRGlyKHBhdGguZGlybmFtZShhbWVuZGVtZW50U2VhcmNoQ2FjaGVGaWxlUGF0aCkpXG4gICAgICBjb25zdCBleGlzdGluZ0FtZW5kZW1lbnRTZWFyY2hDYWNoZSA9IChhd2FpdCBmcy5wYXRoRXhpc3RzKFxuICAgICAgICBhbWVuZGVtZW50U2VhcmNoQ2FjaGVGaWxlUGF0aCxcbiAgICAgICkpXG4gICAgICAgID8gYXdhaXQgZnMucmVhZEZpbGUoYW1lbmRlbWVudFNlYXJjaENhY2hlRmlsZVBhdGgsIFwidXRmOFwiKVxuICAgICAgICA6IG51bGxcbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRUck91dGVySHRtbCA9IGFtZW5kZW1lbnRUci5vdXRlckhUTUxcbiAgICAgIGNvbnN0IGFtZW5kZW1lbnRTZWFyY2hDYWNoZSA9IGAtLS1cXG4ke2pzWWFtbC5kdW1wKFxuICAgICAgICB7XG4gICAgICAgICAgcG9zaXRpb246IGFtZW5kZW1lbnRzQ291bnQgLSBhbWVuZGVtZW50TnVtYmVyLFxuICAgICAgICAgIHNlYXJjaDogdXJsLnJlcGxhY2UoLyZwYWdlPVtcXGRdKy8sIFwiXCIpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc29ydEtleXM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICApfS0tLVxcblxcbiR7YW1lbmRlbWVudFRyT3V0ZXJIdG1sfWBcbiAgICAgIGlmIChhbWVuZGVtZW50U2VhcmNoQ2FjaGUgPT09IGV4aXN0aW5nQW1lbmRlbWVudFNlYXJjaENhY2hlKSB7XG4gICAgICAgIGlmIChpbmNyZW1lbnRhbCkge1xuICAgICAgICAgIC8vIFRoZSBzYW1lIDx0cj4gaXMgYWxyZWFkeSBpbiBjYWNoZSBhbmQgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gICAgICAgICAgLy8gQXNzdW1lIHRoYXQgZm9sbG93aW5nIGFtZW5kbWVudHMgYXJlIG5vdCBjaGFuZ2VkIGFuZCBzdG9wIGxvb2tpbmdcbiAgICAgICAgICAvLyBmb3IgYW1lbmRtZW50cyB0byB1cHNlcnQuXG4gICAgICAgICAgYnJlYWsgaXRlclNlYXJjaFBhZ2VzXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgZXhpc3RpbmdBbWVuZGVtZW50U2VhcmNoQ2FjaGUgIT09IG51bGwgJiZcbiAgICAgICAgZnJvbnRNYXR0ZXIoZXhpc3RpbmdBbWVuZGVtZW50U2VhcmNoQ2FjaGUpLmJvZHkgPT09XG4gICAgICAgICAgYW1lbmRlbWVudFRyT3V0ZXJIdG1sXG4gICAgICApIHtcbiAgICAgICAgLy8gVGhlIHNhbWUgPHRyPiBpcyBhbHJlYWR5IGluIGNhY2hlLCBidXQgaW4gYSBkaWZmZXJlbnQgcG9zaXRpb24uXG4gICAgICAgIC8vIEFzc3VtZSB0aGUgYW1lbmRtZW50IGlzIHVuY2hhbmdlZC5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nQW1lbmRlbWVudFNlYXJjaENhY2hlID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgQWRkaW5nIGFtZW5kZW1lbnQgc2VhcmNoIGNhY2hlOiAke2FtZW5kZW1lbnRTZWFyY2hDYWNoZUZpbGVQYXRofeKApmAsXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFVwZGF0aW5nIGFtZW5kZW1lbnQgc2VhcmNoIGNhY2hlOiAke2FtZW5kZW1lbnRTZWFyY2hDYWNoZUZpbGVQYXRofeKApmAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBhbWVuZGVtZW50SHRtbFVybCA9IG5ldyBVUkwoXG4gICAgICAgIGFtZW5kZW1lbnRVcmxQYXRoISxcbiAgICAgICAgXCJodHRwczovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyL1wiLFxuICAgICAgKS50b1N0cmluZygpXG4gICAgICBjb25zdCBhbWVuZGVtZW50SHRtbFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYW1lbmRlbWVudEh0bWxVcmwpXG4gICAgICBhc3NlcnQoXG4gICAgICAgIGFtZW5kZW1lbnRIdG1sUmVzcG9uc2Uub2ssXG4gICAgICAgIGBSZXRyaWV2YWwgb2YgYW1lbmRlbWVudCBIVE1MIHBhZ2UgYXQgJHthbWVuZGVtZW50SHRtbFVybH0gZmFpbGVkIHdpdGggZXJyb3I6ICR7YW1lbmRlbWVudEh0bWxSZXNwb25zZS5zdGF0dXN9ICR7YW1lbmRlbWVudEh0bWxSZXNwb25zZS5zdGF0dXNUZXh0fWAsXG4gICAgICApXG4gICAgICBjb25zdCBhbWVuZGVtZW50SHRtbFBhZ2UgPSBhd2FpdCBhbWVuZGVtZW50SHRtbFJlc3BvbnNlLnRleHQoKVxuICAgICAgY29uc3QgYW1lbmRlbWVudEh0bWwgPSBwYXJzZUh0bWwoYW1lbmRlbWVudEh0bWxQYWdlKVxuICAgICAgY29uc3QgZm9ybWF0c0xpID0gYW1lbmRlbWVudEh0bWwucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgXCJsaS5taXJyb3ItY2FyZC1oZWFkZXItLW9wdGlvbnMtLWNvbnRlbnQtLWl0ZW1cIixcbiAgICAgIClcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChmb3JtYXRzTGkubGVuZ3RoLCAwKVxuICAgICAgY29uc3QganNvbkxpID0gZm9ybWF0c0xpLmZpbmQoKGZvcm1hdExpKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdFNwYW4gPSBmb3JtYXRMaS5xdWVyeVNlbGVjdG9yKFwiYSA+IHNwYW5cIilcbiAgICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgICAgICAgIGZvcm1hdFNwYW4sXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBgTm8gPHNwYW4+IGluIDxhPiBmb3VuZCBpbiAke2Zvcm1hdExpLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gZm9ybWF0U3BhbiEudGV4dCA9PT0gXCJWZXJzaW9uIEpTT05cIlxuICAgICAgfSlcbiAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICAgICAganNvbkxpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGBObyBKU09OIHZlcnNpb24gZm91bmQgZm9yIGFtZW5kZW1lbnQgYXQgJHthbWVuZGVtZW50SHRtbFVybH1gLFxuICAgICAgKVxuICAgICAgY29uc3QganNvbkEgPSBqc29uTGkhLnF1ZXJ5U2VsZWN0b3IoXCJhXCIpXG4gICAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgICAgIGpzb25BLFxuICAgICAgICBudWxsLFxuICAgICAgICBgTm8gPGE+IGZvdW5kIGluICR7anNvbkxpIS50b1N0cmluZygpfWAsXG4gICAgICApXG4gICAgICBjb25zdCBhbWVuZGVtZW50SnNvblVybFBhdGggPSBqc29uQSEuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgICAgICBhbWVuZGVtZW50SnNvblVybFBhdGgsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYE5vIFVSTCBmb3VuZCBmb3IgSlNPTiB2ZXJzaW9uIG9mIGFtZW5kZW1lbnQ6ICR7anNvbkxpIS50b1N0cmluZygpfWAsXG4gICAgICApXG4gICAgICBjb25zdCBhbWVuZGVtZW50SnNvblVybCA9IG5ldyBVUkwoXG4gICAgICAgIGFtZW5kZW1lbnRKc29uVXJsUGF0aCEsXG4gICAgICAgIFwiaHR0cHM6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci9cIixcbiAgICAgICkudG9TdHJpbmcoKVxuICAgICAgY29uc3QgYW1lbmRlbWVudEpzb25SZXNwb25zZSA9IGF3YWl0IGZldGNoKGFtZW5kZW1lbnRKc29uVXJsKVxuICAgICAgYXNzZXJ0KFxuICAgICAgICBhbWVuZGVtZW50SnNvblJlc3BvbnNlLm9rLFxuICAgICAgICBgUmV0cmlldmFsIG9mIGFtZW5kZW1lbnQgSlNPTiBwYWdlIGF0ICR7YW1lbmRlbWVudEpzb25Vcmx9IGZhaWxlZCB3aXRoIGVycm9yOiAke2FtZW5kZW1lbnRKc29uUmVzcG9uc2Uuc3RhdHVzfSAke2FtZW5kZW1lbnRKc29uUmVzcG9uc2Uuc3RhdHVzVGV4dH1gLFxuICAgICAgKVxuICAgICAgY29uc3QgYW1lbmRlbWVudCA9IGF3YWl0IGFtZW5kZW1lbnRKc29uUmVzcG9uc2UuanNvbigpXG4gICAgICB5aWVsZCBbYW1lbmRlbWVudFVybFBhdGghLCBhbWVuZGVtZW50XVxuXG4gICAgICAvLyBTZWFyY2hDYWNoZSBtdXN0IGJlIHdyaXR0ZW4gYXQgdGhlIGVuZCB0byBlbnN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIGluIGEgY29uc2lzdGVudCBzdGF0ZSxcbiAgICAgIC8vIGV2ZW4gaWYgc2NyaXB0IGZhaWxzIGFicnVwdGx5LlxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgICBhbWVuZGVtZW50U2VhcmNoQ2FjaGVGaWxlUGF0aCxcbiAgICAgICAgYW1lbmRlbWVudFNlYXJjaENhY2hlLFxuICAgICAgICBcInV0ZjhcIixcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBwYWdpbmF0aW9uQSA9IGh0bWwucXVlcnlTZWxlY3RvcihcbiAgICAgIFwiZGl2LmFuLXBhZ2luYXRpb24tLWl0ZW0gPiBpLmFuLWljb25zLWNoZXZyb24tcmlnaHQgfiBhXCIsXG4gICAgKVxuICAgIGlmIChwYWdpbmF0aW9uQSA9PT0gbnVsbCkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgY29uc3QgdXJsUGF0aCA9IHBhZ2luYXRpb25BLmdldEF0dHJpYnV0ZShcImhyZWZcIilcbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwodXJsUGF0aCwgdW5kZWZpbmVkKVxuICAgIHVybCA9IG5ldyBVUkwodXJsUGF0aCEsIFwiaHR0cHM6Ly93d3cuYXNzZW1ibGVlLW5hdGlvbmFsZS5mci9cIikudG9TdHJpbmcoKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUVBOzs7Ozs7Ozs7Ozs7OzsrQ0FmQSxvSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQWlCdUJBLHdCOzs7OzsyRkFBaEIsaUJBQ0xDLHlCQURLLEVBRUxDLEdBRkssRUFHTEMsV0FISyxFQUlMQyxZQUpLLEVBS0xDLGFBTEs7SUFBQTtJQUFBO0lBQUE7SUFBQTtJQUFBO0lBQUE7SUFBQTtJQUFBO0lBQUE7SUFBQTs7SUFBQTtNQUFBO1FBQUE7VUFBQTtZQU1MQyxPQU5LLDJEQU04QyxFQU45QztZQUFBO1lBQUE7WUFBQTtZQUFBLDJCQVdBQywyQkFBMkIsQ0FDOUJOLHlCQUQ4QixFQUU5QkMsR0FGOEIsRUFHOUJDLFdBSDhCLEVBSTlCQyxZQUo4QixFQUs5QkMsYUFMOEIsRUFNOUJDLE9BTjhCLENBWDNCOztVQUFBO1lBQUE7WUFBQTs7VUFBQTtZQUFBO2NBQUE7Y0FBQTtZQUFBOztZQUFBLDhDQVNIRSxpQkFURyxtQkFVSEMsVUFWRztZQW1CSCxJQUFBQyx5QkFBQSxFQUFnQkQsVUFBaEIsRUFuQkcsQ0FvQkg7O1lBcEJHO1lBcUJILE9BQU0sQ0FDSkQsaUJBREksRUFFSkcsb0JBQUEsQ0FBbUJDLFlBQW5CLENBQWdDQyxJQUFJLENBQUNDLFNBQUwsQ0FBZUwsVUFBZixDQUFoQyxDQUZJLENBQU47O1VBckJHO1lBQUE7WUFBQTtZQUFBOztVQUFBO1lBQUE7WUFBQTs7VUFBQTtZQUFBO1lBQUE7WUFBQTtZQUFB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