@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,14 +1,108 @@
1
- import { execSync } from "child_process";
2
- import commandLineArgs from "command-line-args";
3
- import fs from "fs-extra"; // import fetch from "node-fetch"
1
+ "use strict";
4
2
 
5
- import path from "path"; // import stream from "stream"
6
- // import util from "util"
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); }
7
4
 
8
- import { EnabledDatasets } from "../datasets.js";
9
- import { loadAssembleeData } from "../loaders.js";
10
- import { CodeTypeOrgane, TypeMandat } from "../types/acteurs_et_organes.js";
11
- const optionsDefinitions = [{
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.string.iterator.js");
10
+
11
+ require("core-js/modules/es.symbol.js");
12
+
13
+ require("core-js/modules/es.symbol.description.js");
14
+
15
+ require("core-js/modules/es.symbol.iterator.js");
16
+
17
+ require("core-js/modules/es.array.is-array.js");
18
+
19
+ require("core-js/modules/es.promise.js");
20
+
21
+ require("core-js/modules/es.symbol.async-iterator.js");
22
+
23
+ require("core-js/modules/es.symbol.to-string-tag.js");
24
+
25
+ require("core-js/modules/es.json.to-string-tag.js");
26
+
27
+ require("core-js/modules/es.math.to-string-tag.js");
28
+
29
+ require("core-js/modules/es.object.define-property.js");
30
+
31
+ require("core-js/modules/es.object.create.js");
32
+
33
+ require("core-js/modules/es.object.get-prototype-of.js");
34
+
35
+ require("core-js/modules/es.array.for-each.js");
36
+
37
+ require("core-js/modules/web.dom-collections.for-each.js");
38
+
39
+ require("core-js/modules/es.object.set-prototype-of.js");
40
+
41
+ require("core-js/modules/es.array.reverse.js");
42
+
43
+ require("core-js/modules/es.regexp.exec.js");
44
+
45
+ require("core-js/modules/es.string.match.js");
46
+
47
+ require("core-js/modules/es.array.sort.js");
48
+
49
+ require("core-js/modules/es.array.filter.js");
50
+
51
+ require("core-js/modules/es.object.to-string.js");
52
+
53
+ require("core-js/modules/es.object.values.js");
54
+
55
+ require("core-js/modules/es.string.replace.js");
56
+
57
+ require("core-js/modules/es.string.trim.js");
58
+
59
+ require("core-js/modules/es.array.concat.js");
60
+
61
+ require("core-js/modules/es.array.join.js");
62
+
63
+ require("core-js/modules/es.array.slice.js");
64
+
65
+ require("core-js/modules/es.array.iterator.js");
66
+
67
+ require("core-js/modules/web.dom-collections.iterator.js");
68
+
69
+ var _child_process = require("child_process");
70
+
71
+ var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
72
+
73
+ var _fsExtra = _interopRequireDefault(require("fs-extra"));
74
+
75
+ var _path = _interopRequireDefault(require("path"));
76
+
77
+ var _datasets = require("../datasets");
78
+
79
+ var _loaders = require("../loaders");
80
+
81
+ var _acteurs_et_organes = require("../types/acteurs_et_organes");
82
+
83
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
84
+
85
+ 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; }
86
+
87
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
88
+
89
+ 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."); }
90
+
91
+ 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; }
92
+
93
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
94
+
95
+ 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); } }
96
+
97
+ 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); }); }; }
98
+
99
+ 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; } } }; }
100
+
101
+ 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); }
102
+
103
+ 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; }
104
+
105
+ var optionsDefinitions = [{
12
106
  alias: "C",
13
107
  help: "clone repositories from given group (or organization) git URL",
14
108
  name: "clone",
@@ -40,13 +134,13 @@ const optionsDefinitions = [{
40
134
  name: "dataDir",
41
135
  type: String
42
136
  }];
43
- const options = commandLineArgs(optionsDefinitions); // const pipeline = util.promisify(stream.pipeline)
137
+ var options = (0, _commandLineArgs["default"])(optionsDefinitions); // const pipeline = util.promisify(stream.pipeline)
44
138
 
45
139
  function commitAndPush(repositoryDir, commit, remotes) {
46
- let error = false;
140
+ var error = false;
47
141
 
48
142
  if (commit) {
49
- execSync("git add .", {
143
+ (0, _child_process.execSync)("git add .", {
50
144
  cwd: repositoryDir,
51
145
  env: process.env,
52
146
  encoding: "utf-8",
@@ -54,7 +148,7 @@ function commitAndPush(repositoryDir, commit, remotes) {
54
148
  });
55
149
 
56
150
  try {
57
- execSync('git commit -m "Nouvelle moisson"', {
151
+ (0, _child_process.execSync)('git commit -m "Nouvelle moisson"', {
58
152
  cwd: repositoryDir,
59
153
  env: process.env,
60
154
  encoding: "utf-8"
@@ -66,212 +160,294 @@ function commitAndPush(repositoryDir, commit, remotes) {
66
160
  }
67
161
  }
68
162
 
69
- for (const remote of remotes || []) {
70
- try {
71
- execSync(`git push ${remote} master`, {
72
- cwd: repositoryDir,
73
- env: process.env,
74
- encoding: "utf-8",
75
- stdio: ["ignore", "ignore", "pipe"]
76
- });
77
- } catch (childProcess) {
78
- // Don't stop when push fails.
79
- console.error(childProcess.output);
80
- error = true;
163
+ var _iterator = _createForOfIteratorHelper(remotes || []),
164
+ _step;
165
+
166
+ try {
167
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
168
+ var remote = _step.value;
169
+
170
+ try {
171
+ (0, _child_process.execSync)("git push ".concat(remote, " master"), {
172
+ cwd: repositoryDir,
173
+ env: process.env,
174
+ encoding: "utf-8",
175
+ stdio: ["ignore", "ignore", "pipe"]
176
+ });
177
+ } catch (childProcess) {
178
+ // Don't stop when push fails.
179
+ console.error(childProcess.output);
180
+ error = true;
181
+ }
81
182
  }
183
+ } catch (err) {
184
+ _iterator.e(err);
185
+ } finally {
186
+ _iterator.f();
82
187
  }
83
188
  }
84
189
 
85
190
  return error;
86
191
  }
87
192
 
88
- async function retrievePhotosSenateurs() {
89
- const dataDir = options.dataDir;
90
- const {
91
- acteurByUid
92
- } = loadAssembleeData(dataDir, EnabledDatasets.ActeursEtOrganes, options.legislature);
93
- const senateurs = Object.values(acteurByUid).filter(acteur => {
94
- const {
95
- mandats
96
- } = acteur;
97
-
98
- if (!mandats) {
99
- return false;
100
- }
101
-
102
- const mandatSenateur = mandats.filter(mandat => mandat.xsiType === TypeMandat.MandatParlementaireType && // mandat.legislature === options.legislature &&
103
- mandat.typeOrgane === CodeTypeOrgane.Senat)[0];
193
+ function retrievePhotosSenateurs() {
194
+ return _retrievePhotosSenateurs.apply(this, arguments);
195
+ }
104
196
 
105
- if (mandatSenateur === undefined) {
106
- return false;
107
- }
197
+ function _retrievePhotosSenateurs() {
198
+ _retrievePhotosSenateurs = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
199
+ var dataDir, _loadAssembleeData, acteurByUid, senateurs, gitGroupUrl, photosDirName, photosDir, missingPhotoFilePath, _iterator4, _step4, senateur, ident, senateurStem, photoFilename, photoFilePath, photoTempFilename, photoTempFilePath, urlPhoto, _iterator5, _step5, _senateur2, _ident, _senateurStem2, photoByIdSenateur, rowsFilenames, senateurIndex, rowIndex, row, photosFilenames, _iterator6, _step6, _step6$value, columnIndex, _senateur, _senateurStem, _photoFilename, rowFilename, _i2, _rowsFilenames, _rowFilename, jsonFilePath;
200
+
201
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
202
+ while (1) {
203
+ switch (_context.prev = _context.next) {
204
+ case 0:
205
+ dataDir = options.dataDir;
206
+ _loadAssembleeData = (0, _loaders.loadAssembleeData)(dataDir, _datasets.EnabledDatasets.ActeursEtOrganes, options.legislature), acteurByUid = _loadAssembleeData.acteurByUid;
207
+ senateurs = Object.values(acteurByUid).filter(function (acteur) {
208
+ var mandats = acteur.mandats;
209
+
210
+ if (!mandats) {
211
+ return false;
212
+ }
213
+
214
+ var mandatSenateur = mandats.filter(function (mandat) {
215
+ return mandat.xsiType === _acteurs_et_organes.TypeMandat.MandatParlementaireType && // mandat.legislature === options.legislature &&
216
+ mandat.typeOrgane === _acteurs_et_organes.CodeTypeOrgane.Senat;
217
+ })[0];
218
+
219
+ if (mandatSenateur === undefined) {
220
+ return false;
221
+ }
222
+
223
+ var adresses = acteur.adresses;
224
+
225
+ if (adresses === undefined) {
226
+ return false;
227
+ }
228
+
229
+ var url = null;
230
+
231
+ var _iterator3 = _createForOfIteratorHelper(adresses),
232
+ _step3;
233
+
234
+ try {
235
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
236
+ var adresse = _step3.value;
237
+
238
+ if (adresse.xsiType === "AdresseSiteWeb_Type" && adresse.typeLibelle === "Url sénateur") {
239
+ url = adresse.valElec;
240
+ }
241
+ }
242
+ } catch (err) {
243
+ _iterator3.e(err);
244
+ } finally {
245
+ _iterator3.f();
246
+ }
247
+
248
+ return Boolean(url);
249
+ }).sort(function (a, b) {
250
+ return a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length;
251
+ });
252
+ gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined;
253
+ photosDirName = "photos_senateurs";
254
+
255
+ if (gitGroupUrl !== undefined) {
256
+ (0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(photosDirName, ".git"), {
257
+ cwd: dataDir,
258
+ env: process.env,
259
+ encoding: "utf-8",
260
+ stdio: ["ignore", "ignore", "pipe"]
261
+ });
262
+ }
263
+
264
+ photosDir = _path["default"].join(dataDir, photosDirName); // Download photos.
265
+
266
+ _fsExtra["default"].ensureDirSync(photosDir);
267
+
268
+ if (options.fetch) {
269
+ missingPhotoFilePath = "images/transparent_155x225.jpg";
270
+ _iterator4 = _createForOfIteratorHelper(senateurs);
271
+
272
+ try {
273
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
274
+ senateur = _step4.value;
275
+ ident = senateur.etatCivil.ident;
276
+ senateurStem = stemFromSenateur(senateur);
277
+ photoFilename = "".concat(senateurStem, ".jpg");
278
+ photoFilePath = _path["default"].join(photosDir, photoFilename);
279
+ photoTempFilename = "".concat(senateurStem, "_temp.jpg");
280
+ photoTempFilePath = _path["default"].join(photosDir, photoTempFilename);
281
+ urlPhoto = "https://www.senat.fr/senimg/".concat(photoFilename);
282
+
283
+ if (!options.silent) {
284
+ console.log("Loading photo ".concat(urlPhoto, " for ").concat(ident.prenom, " ").concat(ident.nom, "\u2026"));
285
+ } // for (let retries = 0; retries < 3; retries++) {
286
+ // const response = await fetch(urlPhoto)
287
+ // if (response.ok) {
288
+ // await pipeline(response.body, fs.createWriteStream(photoTempFilePath))
289
+ // fs.renameSync(photoTempFilePath, photoFilePath)
290
+ // break
291
+ // }
292
+ // if (retries >= 2) {
293
+ // console.warn(`Fetch failed: ${urlPhoto} (${ident.prenom} ${ident.nom})`)
294
+ // console.warn(response.status, response.statusText)
295
+ // console.warn(await response.text())
296
+ // if (fs.existsSync(photoFilePath)) {
297
+ // console.warn(" => Reusing existing image")
298
+ // } else {
299
+ // console.warn(" => Using blank image")
300
+ // fs.copyFileSync(missingPhotoFilePath, photoFilePath)
301
+ // }
302
+ // break
303
+ // }
304
+ // }
305
+
306
+
307
+ try {
308
+ (0, _child_process.execSync)("wget --quiet -O ".concat(photoTempFilename, " ").concat(urlPhoto), {
309
+ cwd: photosDir,
310
+ env: process.env,
311
+ encoding: "utf-8" // stdio: ["ignore", "ignore", "pipe"],
312
+
313
+ });
314
+
315
+ _fsExtra["default"].renameSync(photoTempFilePath, photoFilePath);
316
+ } catch (error) {
317
+ console.error(error);
318
+
319
+ if (_fsExtra["default"].existsSync(photoFilePath)) {
320
+ console.warn(" => Reusing existing image");
321
+ } else {
322
+ console.warn(" => Using blank image");
323
+
324
+ _fsExtra["default"].copyFileSync(missingPhotoFilePath, photoFilePath);
325
+ }
326
+ }
327
+ }
328
+ } catch (err) {
329
+ _iterator4.e(err);
330
+ } finally {
331
+ _iterator4.f();
332
+ }
333
+ } // Resize photos to 155x225, because some haven't exactly this size.
334
+
335
+
336
+ _iterator5 = _createForOfIteratorHelper(senateurs);
337
+
338
+ try {
339
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
340
+ _senateur2 = _step5.value;
341
+ _ident = _senateur2.etatCivil.ident;
342
+ _senateurStem2 = stemFromSenateur(_senateur2);
343
+
344
+ if (!options.silent) {
345
+ console.log("Resizing photo ".concat(_senateurStem2, " for ").concat(_ident.prenom, " ").concat(_ident.nom, "\u2026"));
346
+ }
347
+
348
+ (0, _child_process.execSync)("gm convert -resize 155x225! ".concat(_senateurStem2, ".jpg ").concat(_senateurStem2, "_155x225.jpg"), {
349
+ cwd: photosDir
350
+ });
351
+ } // Create a mosaic of photos.
352
+
353
+ } catch (err) {
354
+ _iterator5.e(err);
355
+ } finally {
356
+ _iterator5.f();
357
+ }
358
+
359
+ photoByIdSenateur = {};
360
+ rowsFilenames = [];
361
+
362
+ for (senateurIndex = 0, rowIndex = 0; senateurIndex < senateurs.length; senateurIndex += 25, rowIndex++) {
363
+ row = senateurs.slice(senateurIndex, senateurIndex + 25);
364
+ photosFilenames = [];
365
+ _iterator6 = _createForOfIteratorHelper(row.entries());
366
+
367
+ try {
368
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
369
+ _step6$value = _slicedToArray(_step6.value, 2), columnIndex = _step6$value[0], _senateur = _step6$value[1];
370
+ _senateurStem = stemFromSenateur(_senateur);
371
+ _photoFilename = "".concat(_senateurStem, "_155x225.jpg");
372
+ photosFilenames.push(_photoFilename);
373
+ photoByIdSenateur[_senateur.uid] = {
374
+ chemin: "photos_senateurs/".concat(_photoFilename),
375
+ cheminMosaique: "photos_senateurs/senateurs.jpg",
376
+ hauteur: 225,
377
+ largeur: 155,
378
+ xMosaique: columnIndex * 155,
379
+ yMosaique: rowIndex * 225
380
+ };
381
+ }
382
+ } catch (err) {
383
+ _iterator6.e(err);
384
+ } finally {
385
+ _iterator6.f();
386
+ }
387
+
388
+ rowFilename = "row-".concat(rowIndex, ".jpg");
389
+ (0, _child_process.execSync)("gm convert ".concat(photosFilenames.join(" "), " +append ").concat(rowFilename), {
390
+ cwd: photosDir
391
+ });
392
+ rowsFilenames.push(rowFilename);
393
+ }
394
+
395
+ (0, _child_process.execSync)("gm convert ".concat(rowsFilenames.join(" "), " -append senateurs.jpg"), {
396
+ cwd: photosDir
397
+ });
398
+
399
+ for (_i2 = 0, _rowsFilenames = rowsFilenames; _i2 < _rowsFilenames.length; _i2++) {
400
+ _rowFilename = _rowsFilenames[_i2];
401
+
402
+ _fsExtra["default"].unlinkSync(_path["default"].join(photosDir, _rowFilename));
403
+ }
404
+
405
+ jsonFilePath = _path["default"].join(photosDir, "senateurs.json");
406
+
407
+ _fsExtra["default"].writeFileSync(jsonFilePath, JSON.stringify(photoByIdSenateur, null, 2));
408
+
409
+ return _context.abrupt("return", commitAndPush(photosDir, options.commit, options.remote));
410
+
411
+ case 19:
412
+ case "end":
413
+ return _context.stop();
414
+ }
415
+ }
416
+ }, _callee);
417
+ }));
418
+ return _retrievePhotosSenateurs.apply(this, arguments);
419
+ }
108
420
 
109
- const {
110
- adresses
111
- } = acteur;
421
+ function stemFromSenateur(senateur) {
422
+ var adresses = senateur.adresses;
423
+ var url = null;
112
424
 
113
- if (adresses === undefined) {
114
- return false;
115
- }
425
+ var _iterator2 = _createForOfIteratorHelper(adresses),
426
+ _step2;
116
427
 
117
- let url = null;
428
+ try {
429
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
430
+ var adresse = _step2.value;
118
431
 
119
- for (const adresse of adresses) {
120
432
  if (adresse.xsiType === "AdresseSiteWeb_Type" && adresse.typeLibelle === "Url sénateur") {
121
433
  url = adresse.valElec;
122
434
  }
123
435
  }
124
-
125
- return Boolean(url);
126
- }).sort((a, b) => a.uid.length === b.uid.length ? a.uid.localeCompare(b.uid) : a.uid.length - b.uid.length);
127
- const gitGroupUrl = options.clone ? options.clone.trim().replace(/\/+$/, "") : undefined;
128
- const photosDirName = "photos_senateurs";
129
-
130
- if (gitGroupUrl !== undefined) {
131
- execSync(`git clone ${gitGroupUrl}/${photosDirName}.git`, {
132
- cwd: dataDir,
133
- env: process.env,
134
- encoding: "utf-8",
135
- stdio: ["ignore", "ignore", "pipe"]
136
- });
137
- }
138
-
139
- const photosDir = path.join(dataDir, photosDirName); // Download photos.
140
-
141
- fs.ensureDirSync(photosDir);
142
-
143
- if (options.fetch) {
144
- const missingPhotoFilePath = "images/transparent_155x225.jpg";
145
-
146
- for (const senateur of senateurs) {
147
- const ident = senateur.etatCivil.ident;
148
- const senateurStem = stemFromSenateur(senateur);
149
- const photoFilename = `${senateurStem}.jpg`;
150
- const photoFilePath = path.join(photosDir, photoFilename);
151
- const photoTempFilename = `${senateurStem}_temp.jpg`;
152
- const photoTempFilePath = path.join(photosDir, photoTempFilename);
153
- const urlPhoto = `https://www.senat.fr/senimg/${photoFilename}`;
154
-
155
- if (!options.silent) {
156
- console.log(`Loading photo ${urlPhoto} for ${ident.prenom} ${ident.nom}…`);
157
- } // for (let retries = 0; retries < 3; retries++) {
158
- // const response = await fetch(urlPhoto)
159
- // if (response.ok) {
160
- // await pipeline(response.body, fs.createWriteStream(photoTempFilePath))
161
- // fs.renameSync(photoTempFilePath, photoFilePath)
162
- // break
163
- // }
164
- // if (retries >= 2) {
165
- // console.warn(`Fetch failed: ${urlPhoto} (${ident.prenom} ${ident.nom})`)
166
- // console.warn(response.status, response.statusText)
167
- // console.warn(await response.text())
168
- // if (fs.existsSync(photoFilePath)) {
169
- // console.warn(" => Reusing existing image")
170
- // } else {
171
- // console.warn(" => Using blank image")
172
- // fs.copyFileSync(missingPhotoFilePath, photoFilePath)
173
- // }
174
- // break
175
- // }
176
- // }
177
-
178
-
179
- try {
180
- execSync(`wget --quiet -O ${photoTempFilename} ${urlPhoto}`, {
181
- cwd: photosDir,
182
- env: process.env,
183
- encoding: "utf-8" // stdio: ["ignore", "ignore", "pipe"],
184
-
185
- });
186
- fs.renameSync(photoTempFilePath, photoFilePath);
187
- } catch (error) {
188
- console.error(error);
189
-
190
- if (fs.existsSync(photoFilePath)) {
191
- console.warn(" => Reusing existing image");
192
- } else {
193
- console.warn(" => Using blank image");
194
- fs.copyFileSync(missingPhotoFilePath, photoFilePath);
195
- }
196
- }
197
- }
198
- } // Resize photos to 155x225, because some haven't exactly this size.
199
-
200
-
201
- for (const senateur of senateurs) {
202
- const ident = senateur.etatCivil.ident;
203
- const senateurStem = stemFromSenateur(senateur);
204
-
205
- if (!options.silent) {
206
- console.log(`Resizing photo ${senateurStem} for ${ident.prenom} ${ident.nom}…`);
207
- }
208
-
209
- execSync(`gm convert -resize 155x225! ${senateurStem}.jpg ${senateurStem}_155x225.jpg`, {
210
- cwd: photosDir
211
- });
212
- } // Create a mosaic of photos.
213
-
214
-
215
- const photoByIdSenateur = {};
216
- const rowsFilenames = [];
217
-
218
- for (let senateurIndex = 0, rowIndex = 0; senateurIndex < senateurs.length; senateurIndex += 25, rowIndex++) {
219
- const row = senateurs.slice(senateurIndex, senateurIndex + 25);
220
- const photosFilenames = [];
221
-
222
- for (const [columnIndex, senateur] of row.entries()) {
223
- const senateurStem = stemFromSenateur(senateur);
224
- const photoFilename = `${senateurStem}_155x225.jpg`;
225
- photosFilenames.push(photoFilename);
226
- photoByIdSenateur[senateur.uid] = {
227
- chemin: `photos_senateurs/${photoFilename}`,
228
- cheminMosaique: `photos_senateurs/senateurs.jpg`,
229
- hauteur: 225,
230
- largeur: 155,
231
- xMosaique: columnIndex * 155,
232
- yMosaique: rowIndex * 225
233
- };
234
- }
235
-
236
- const rowFilename = `row-${rowIndex}.jpg`;
237
- execSync(`gm convert ${photosFilenames.join(" ")} +append ${rowFilename}`, {
238
- cwd: photosDir
239
- });
240
- rowsFilenames.push(rowFilename);
241
- }
242
-
243
- execSync(`gm convert ${rowsFilenames.join(" ")} -append senateurs.jpg`, {
244
- cwd: photosDir
245
- });
246
-
247
- for (const rowFilename of rowsFilenames) {
248
- fs.unlinkSync(path.join(photosDir, rowFilename));
249
- }
250
-
251
- const jsonFilePath = path.join(photosDir, "senateurs.json");
252
- fs.writeFileSync(jsonFilePath, JSON.stringify(photoByIdSenateur, null, 2));
253
- return commitAndPush(photosDir, options.commit, options.remote);
254
- }
255
-
256
- function stemFromSenateur(senateur) {
257
- const {
258
- adresses
259
- } = senateur;
260
- let url = null;
261
-
262
- for (const adresse of adresses) {
263
- if (adresse.xsiType === "AdresseSiteWeb_Type" && adresse.typeLibelle === "Url sénateur") {
264
- url = adresse.valElec;
265
- }
436
+ } catch (err) {
437
+ _iterator2.e(err);
438
+ } finally {
439
+ _iterator2.f();
266
440
  }
267
441
 
268
- const match = url.match(/^https:\/\/www\.senat\.fr\/senateur\/(.*)\.html$/);
269
- const senateurStem = match[1];
442
+ var match = url.match(/^https:\/\/www\.senat\.fr\/senateur\/(.*)\.html$/);
443
+ var senateurStem = match[1];
270
444
  return senateurStem;
271
445
  }
272
446
 
273
- retrievePhotosSenateurs().then(error => process.exit(error ? 1 : 0)).catch(error => {
447
+ retrievePhotosSenateurs().then(function (error) {
448
+ return process.exit(error ? 1 : 0);
449
+ })["catch"](function (error) {
274
450
  console.log(error);
275
451
  process.exit(2);
276
452
  });
277
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsIkVuYWJsZWREYXRhc2V0cyIsImxvYWRBc3NlbWJsZWVEYXRhIiwiQ29kZVR5cGVPcmdhbmUiLCJUeXBlTWFuZGF0Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwibXVsdGlwbGUiLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsImNvbW1pdEFuZFB1c2giLCJyZXBvc2l0b3J5RGlyIiwiY29tbWl0IiwicmVtb3RlcyIsImVycm9yIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJjaGlsZFByb2Nlc3MiLCJzdGRlcnIiLCJ0ZXN0Iiwic3Rkb3V0IiwiY29uc29sZSIsIm91dHB1dCIsInJlbW90ZSIsInJldHJpZXZlUGhvdG9zU2VuYXRldXJzIiwiZGF0YURpciIsImFjdGV1ckJ5VWlkIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImxlZ2lzbGF0dXJlIiwic2VuYXRldXJzIiwiT2JqZWN0IiwidmFsdWVzIiwiZmlsdGVyIiwiYWN0ZXVyIiwibWFuZGF0cyIsIm1hbmRhdFNlbmF0ZXVyIiwibWFuZGF0IiwieHNpVHlwZSIsIk1hbmRhdFBhcmxlbWVudGFpcmVUeXBlIiwidHlwZU9yZ2FuZSIsIlNlbmF0IiwidW5kZWZpbmVkIiwiYWRyZXNzZXMiLCJ1cmwiLCJhZHJlc3NlIiwidHlwZUxpYmVsbGUiLCJ2YWxFbGVjIiwic29ydCIsImEiLCJiIiwidWlkIiwibGVuZ3RoIiwibG9jYWxlQ29tcGFyZSIsImdpdEdyb3VwVXJsIiwiY2xvbmUiLCJ0cmltIiwicmVwbGFjZSIsInBob3Rvc0Rpck5hbWUiLCJwaG90b3NEaXIiLCJqb2luIiwiZW5zdXJlRGlyU3luYyIsImZldGNoIiwibWlzc2luZ1Bob3RvRmlsZVBhdGgiLCJzZW5hdGV1ciIsImlkZW50IiwiZXRhdENpdmlsIiwic2VuYXRldXJTdGVtIiwic3RlbUZyb21TZW5hdGV1ciIsInBob3RvRmlsZW5hbWUiLCJwaG90b0ZpbGVQYXRoIiwicGhvdG9UZW1wRmlsZW5hbWUiLCJwaG90b1RlbXBGaWxlUGF0aCIsInVybFBob3RvIiwic2lsZW50IiwibG9nIiwicHJlbm9tIiwibm9tIiwicmVuYW1lU3luYyIsImV4aXN0c1N5bmMiLCJ3YXJuIiwiY29weUZpbGVTeW5jIiwicGhvdG9CeUlkU2VuYXRldXIiLCJyb3dzRmlsZW5hbWVzIiwic2VuYXRldXJJbmRleCIsInJvd0luZGV4Iiwicm93Iiwic2xpY2UiLCJwaG90b3NGaWxlbmFtZXMiLCJjb2x1bW5JbmRleCIsImVudHJpZXMiLCJwdXNoIiwiY2hlbWluIiwiY2hlbWluTW9zYWlxdWUiLCJoYXV0ZXVyIiwibGFyZ2V1ciIsInhNb3NhaXF1ZSIsInlNb3NhaXF1ZSIsInJvd0ZpbGVuYW1lIiwidW5saW5rU3luYyIsImpzb25GaWxlUGF0aCIsIndyaXRlRmlsZVN5bmMiLCJKU09OIiwic3RyaW5naWZ5IiwibWF0Y2giLCJ0aGVuIiwiZXhpdCIsImNhdGNoIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvcmV0cmlldmVfc2VuYXRldXJzX3Bob3Rvcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGlsZFByb2Nlc3MsIGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG4vLyBpbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuLy8gaW1wb3J0IHN0cmVhbSBmcm9tIFwic3RyZWFtXCJcbi8vIGltcG9ydCB1dGlsIGZyb20gXCJ1dGlsXCJcblxuaW1wb3J0IHsgRW5hYmxlZERhdGFzZXRzIH0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IGxvYWRBc3NlbWJsZWVEYXRhIH0gZnJvbSBcIi4uL2xvYWRlcnNcIlxuaW1wb3J0IHtcbiAgQWN0ZXVyLFxuICBDb2RlVHlwZU9yZ2FuZSxcbiAgTWFuZGF0LFxuICBQaG90byxcbiAgVHlwZU1hbmRhdCxcbn0gZnJvbSBcIi4uL3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAge1xuICAgIGFsaWFzOiBcIkNcIixcbiAgICBoZWxwOiBcImNsb25lIHJlcG9zaXRvcmllcyBmcm9tIGdpdmVuIGdyb3VwIChvciBvcmdhbml6YXRpb24pIGdpdCBVUkxcIixcbiAgICBuYW1lOiBcImNsb25lXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwiY1wiLFxuICAgIGhlbHA6IFwiY29tbWl0IHBob3Rvc1wiLFxuICAgIG5hbWU6IFwiY29tbWl0XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcImZcIixcbiAgICBoZWxwOiBcImZldGNoIHPDqW5hdGV1cnMnIHBpY3R1cmVzIGluc3RlYWQgb2YgcmV0cmlldmluZyB0aGVtIGZyb20gZmlsZXNcIixcbiAgICBuYW1lOiBcImZldGNoXCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInJcIixcbiAgICBoZWxwOiBcInB1c2ggY29tbWl0IHRvIGdpdmVuIHJlbW90ZVwiLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG5hbWU6IFwicmVtb3RlXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwic1wiLFxuICAgIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gICAgbmFtZTogXCJzaWxlbnRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICBoZWxwOiBcImRpcmVjdG9yeSBjb250YWluaW5nIEFzc2VtYmzDqWUgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG4vLyBjb25zdCBwaXBlbGluZSA9IHV0aWwucHJvbWlzaWZ5KHN0cmVhbS5waXBlbGluZSlcblxuZnVuY3Rpb24gY29tbWl0QW5kUHVzaChcbiAgcmVwb3NpdG9yeURpcjogc3RyaW5nLFxuICBjb21taXQ6IGJvb2xlYW4sXG4gIHJlbW90ZXM/OiBzdHJpbmdbXSxcbik6IGJvb2xlYW4ge1xuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBpZiAoY29tbWl0KSB7XG4gICAgZXhlY1N5bmMoXCJnaXQgYWRkIC5cIiwge1xuICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICBleGVjU3luYygnZ2l0IGNvbW1pdCAtbSBcIk5vdXZlbGxlIG1vaXNzb25cIicsIHtcbiAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGNoaWxkUHJvY2VzcyBhcyBDaGlsZFByb2Nlc3MpLnN0ZGVyciA9PT0gbnVsbCB8fFxuICAgICAgICAhL25vdGhpbmcgdG8gY29tbWl0Ly50ZXN0KChjaGlsZFByb2Nlc3MgYXMgYW55KS5zdGRvdXQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICB0aHJvdyBjaGlsZFByb2Nlc3NcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCByZW1vdGUgb2YgcmVtb3RlcyB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBwdXNoICR7cmVtb3RlfSBtYXN0ZXJgLCB7XG4gICAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICAvLyBEb24ndCBzdG9wIHdoZW4gcHVzaCBmYWlscy5cbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlUGhvdG9zU2VuYXRldXJzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBkYXRhRGlyID0gb3B0aW9ucy5kYXRhRGlyXG4gIGNvbnN0IHsgYWN0ZXVyQnlVaWQgfSA9IGxvYWRBc3NlbWJsZWVEYXRhKFxuICAgIGRhdGFEaXIsXG4gICAgRW5hYmxlZERhdGFzZXRzLkFjdGV1cnNFdE9yZ2FuZXMsXG4gICAgb3B0aW9ucy5sZWdpc2xhdHVyZSxcbiAgKVxuICBjb25zdCBzZW5hdGV1cnMgPSBPYmplY3QudmFsdWVzKGFjdGV1ckJ5VWlkKVxuICAgIC5maWx0ZXIoKGFjdGV1cikgPT4ge1xuICAgICAgY29uc3QgeyBtYW5kYXRzIH0gPSBhY3RldXJcbiAgICAgIGlmICghbWFuZGF0cykge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hbmRhdFNlbmF0ZXVyID0gbWFuZGF0cy5maWx0ZXIoXG4gICAgICAgIChtYW5kYXQ6IE1hbmRhdCkgPT5cbiAgICAgICAgICBtYW5kYXQueHNpVHlwZSA9PT0gVHlwZU1hbmRhdC5NYW5kYXRQYXJsZW1lbnRhaXJlVHlwZSAmJlxuICAgICAgICAgIC8vIG1hbmRhdC5sZWdpc2xhdHVyZSA9PT0gb3B0aW9ucy5sZWdpc2xhdHVyZSAmJlxuICAgICAgICAgIG1hbmRhdC50eXBlT3JnYW5lID09PSBDb2RlVHlwZU9yZ2FuZS5TZW5hdCxcbiAgICAgIClbMF1cbiAgICAgIGlmIChtYW5kYXRTZW5hdGV1ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgY29uc3QgeyBhZHJlc3NlcyB9ID0gYWN0ZXVyXG4gICAgICBpZiAoYWRyZXNzZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIGxldCB1cmwgPSBudWxsXG4gICAgICBmb3IgKGNvbnN0IGFkcmVzc2Ugb2YgYWRyZXNzZXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFkcmVzc2UueHNpVHlwZSA9PT0gXCJBZHJlc3NlU2l0ZVdlYl9UeXBlXCIgJiZcbiAgICAgICAgICBhZHJlc3NlLnR5cGVMaWJlbGxlID09PSBcIlVybCBzw6luYXRldXJcIlxuICAgICAgICApIHtcbiAgICAgICAgICB1cmwgPSBhZHJlc3NlLnZhbEVsZWNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIEJvb2xlYW4odXJsKVxuICAgIH0pXG4gICAgLnNvcnQoKGEsIGIpID0+XG4gICAgICBhLnVpZC5sZW5ndGggPT09IGIudWlkLmxlbmd0aFxuICAgICAgICA/IGEudWlkLmxvY2FsZUNvbXBhcmUoYi51aWQpXG4gICAgICAgIDogYS51aWQubGVuZ3RoIC0gYi51aWQubGVuZ3RoLFxuICAgIClcblxuICBjb25zdCBnaXRHcm91cFVybCA9IG9wdGlvbnMuY2xvbmVcbiAgICA/IG9wdGlvbnMuY2xvbmUudHJpbSgpLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgICA6IHVuZGVmaW5lZFxuICBjb25zdCBwaG90b3NEaXJOYW1lID0gXCJwaG90b3Nfc2VuYXRldXJzXCJcbiAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7cGhvdG9zRGlyTmFtZX0uZ2l0YCwge1xuICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICB9KVxuICB9XG4gIGNvbnN0IHBob3Rvc0RpciA9IHBhdGguam9pbihkYXRhRGlyLCBwaG90b3NEaXJOYW1lKVxuXG4gIC8vIERvd25sb2FkIHBob3Rvcy5cbiAgZnMuZW5zdXJlRGlyU3luYyhwaG90b3NEaXIpXG4gIGlmIChvcHRpb25zLmZldGNoKSB7XG4gICAgY29uc3QgbWlzc2luZ1Bob3RvRmlsZVBhdGggPSBcImltYWdlcy90cmFuc3BhcmVudF8xNTV4MjI1LmpwZ1wiXG4gICAgZm9yIChjb25zdCBzZW5hdGV1ciBvZiBzZW5hdGV1cnMpIHtcbiAgICAgIGNvbnN0IGlkZW50ID0gc2VuYXRldXIuZXRhdENpdmlsLmlkZW50XG4gICAgICBjb25zdCBzZW5hdGV1clN0ZW0gPSBzdGVtRnJvbVNlbmF0ZXVyKHNlbmF0ZXVyKVxuICAgICAgY29uc3QgcGhvdG9GaWxlbmFtZSA9IGAke3NlbmF0ZXVyU3RlbX0uanBnYFxuICAgICAgY29uc3QgcGhvdG9GaWxlUGF0aCA9IHBhdGguam9pbihwaG90b3NEaXIsIHBob3RvRmlsZW5hbWUpXG4gICAgICBjb25zdCBwaG90b1RlbXBGaWxlbmFtZSA9IGAke3NlbmF0ZXVyU3RlbX1fdGVtcC5qcGdgXG4gICAgICBjb25zdCBwaG90b1RlbXBGaWxlUGF0aCA9IHBhdGguam9pbihwaG90b3NEaXIsIHBob3RvVGVtcEZpbGVuYW1lKVxuICAgICAgY29uc3QgdXJsUGhvdG8gPSBgaHR0cHM6Ly93d3cuc2VuYXQuZnIvc2VuaW1nLyR7cGhvdG9GaWxlbmFtZX1gXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBMb2FkaW5nIHBob3RvICR7dXJsUGhvdG99IGZvciAke2lkZW50LnByZW5vbX0gJHtpZGVudC5ub2194oCmYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgLy8gZm9yIChsZXQgcmV0cmllcyA9IDA7IHJldHJpZXMgPCAzOyByZXRyaWVzKyspIHtcbiAgICAgIC8vICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmxQaG90bylcbiAgICAgIC8vICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAvLyAgICAgYXdhaXQgcGlwZWxpbmUocmVzcG9uc2UuYm9keSwgZnMuY3JlYXRlV3JpdGVTdHJlYW0ocGhvdG9UZW1wRmlsZVBhdGgpKVxuICAgICAgLy8gICAgIGZzLnJlbmFtZVN5bmMocGhvdG9UZW1wRmlsZVBhdGgsIHBob3RvRmlsZVBhdGgpXG4gICAgICAvLyAgICAgYnJlYWtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gICBpZiAocmV0cmllcyA+PSAyKSB7XG4gICAgICAvLyAgICAgY29uc29sZS53YXJuKGBGZXRjaCBmYWlsZWQ6ICR7dXJsUGhvdG99ICgke2lkZW50LnByZW5vbX0gJHtpZGVudC5ub219KWApXG4gICAgICAvLyAgICAgY29uc29sZS53YXJuKHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2Uuc3RhdHVzVGV4dClcbiAgICAgIC8vICAgICBjb25zb2xlLndhcm4oYXdhaXQgcmVzcG9uc2UudGV4dCgpKVxuICAgICAgLy8gICAgIGlmIChmcy5leGlzdHNTeW5jKHBob3RvRmlsZVBhdGgpKSB7XG4gICAgICAvLyAgICAgICBjb25zb2xlLndhcm4oXCIgID0+IFJldXNpbmcgZXhpc3RpbmcgaW1hZ2VcIilcbiAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgLy8gICAgICAgY29uc29sZS53YXJuKFwiICA9PiBVc2luZyBibGFuayBpbWFnZVwiKVxuICAgICAgLy8gICAgICAgZnMuY29weUZpbGVTeW5jKG1pc3NpbmdQaG90b0ZpbGVQYXRoLCBwaG90b0ZpbGVQYXRoKVxuICAgICAgLy8gICAgIH1cbiAgICAgIC8vICAgICBicmVha1xuICAgICAgLy8gICB9XG4gICAgICAvLyB9XG4gICAgICB0cnkge1xuICAgICAgICBleGVjU3luYyhgd2dldCAtLXF1aWV0IC1PICR7cGhvdG9UZW1wRmlsZW5hbWV9ICR7dXJsUGhvdG99YCwge1xuICAgICAgICAgIGN3ZDogcGhvdG9zRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICAvLyBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgICAgZnMucmVuYW1lU3luYyhwaG90b1RlbXBGaWxlUGF0aCwgcGhvdG9GaWxlUGF0aClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBob3RvRmlsZVBhdGgpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiICA9PiBSZXVzaW5nIGV4aXN0aW5nIGltYWdlXCIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiICA9PiBVc2luZyBibGFuayBpbWFnZVwiKVxuICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhtaXNzaW5nUGhvdG9GaWxlUGF0aCwgcGhvdG9GaWxlUGF0aClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc2l6ZSBwaG90b3MgdG8gMTU1eDIyNSwgYmVjYXVzZSBzb21lIGhhdmVuJ3QgZXhhY3RseSB0aGlzIHNpemUuXG4gIGZvciAoY29uc3Qgc2VuYXRldXIgb2Ygc2VuYXRldXJzKSB7XG4gICAgY29uc3QgaWRlbnQgPSBzZW5hdGV1ci5ldGF0Q2l2aWwuaWRlbnRcbiAgICBjb25zdCBzZW5hdGV1clN0ZW0gPSBzdGVtRnJvbVNlbmF0ZXVyKHNlbmF0ZXVyKVxuICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgUmVzaXppbmcgcGhvdG8gJHtzZW5hdGV1clN0ZW19IGZvciAke2lkZW50LnByZW5vbX0gJHtpZGVudC5ub2194oCmYCxcbiAgICAgIClcbiAgICB9XG4gICAgZXhlY1N5bmMoXG4gICAgICBgZ20gY29udmVydCAtcmVzaXplIDE1NXgyMjUhICR7c2VuYXRldXJTdGVtfS5qcGcgJHtzZW5hdGV1clN0ZW19XzE1NXgyMjUuanBnYCxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBwaG90b3NEaXIsXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIG1vc2FpYyBvZiBwaG90b3MuXG4gIGNvbnN0IHBob3RvQnlJZFNlbmF0ZXVyOiB7IFt1aWQ6IHN0cmluZ106IFBob3RvIH0gPSB7fVxuICBjb25zdCByb3dzRmlsZW5hbWVzOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoXG4gICAgbGV0IHNlbmF0ZXVySW5kZXggPSAwLCByb3dJbmRleCA9IDA7XG4gICAgc2VuYXRldXJJbmRleCA8IHNlbmF0ZXVycy5sZW5ndGg7XG4gICAgc2VuYXRldXJJbmRleCArPSAyNSwgcm93SW5kZXgrK1xuICApIHtcbiAgICBjb25zdCByb3cgPSBzZW5hdGV1cnMuc2xpY2Uoc2VuYXRldXJJbmRleCwgc2VuYXRldXJJbmRleCArIDI1KVxuICAgIGNvbnN0IHBob3Rvc0ZpbGVuYW1lczogc3RyaW5nW10gPSBbXVxuICAgIGZvciAoY29uc3QgW2NvbHVtbkluZGV4LCBzZW5hdGV1cl0gb2Ygcm93LmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgc2VuYXRldXJTdGVtID0gc3RlbUZyb21TZW5hdGV1cihzZW5hdGV1cilcbiAgICAgIGNvbnN0IHBob3RvRmlsZW5hbWUgPSBgJHtzZW5hdGV1clN0ZW19XzE1NXgyMjUuanBnYFxuICAgICAgcGhvdG9zRmlsZW5hbWVzLnB1c2gocGhvdG9GaWxlbmFtZSlcbiAgICAgIHBob3RvQnlJZFNlbmF0ZXVyW3NlbmF0ZXVyLnVpZF0gPSB7XG4gICAgICAgIGNoZW1pbjogYHBob3Rvc19zZW5hdGV1cnMvJHtwaG90b0ZpbGVuYW1lfWAsXG4gICAgICAgIGNoZW1pbk1vc2FpcXVlOiBgcGhvdG9zX3NlbmF0ZXVycy9zZW5hdGV1cnMuanBnYCxcbiAgICAgICAgaGF1dGV1cjogMjI1LFxuICAgICAgICBsYXJnZXVyOiAxNTUsXG4gICAgICAgIHhNb3NhaXF1ZTogY29sdW1uSW5kZXggKiAxNTUsXG4gICAgICAgIHlNb3NhaXF1ZTogcm93SW5kZXggKiAyMjUsXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJvd0ZpbGVuYW1lID0gYHJvdy0ke3Jvd0luZGV4fS5qcGdgXG4gICAgZXhlY1N5bmMoYGdtIGNvbnZlcnQgJHtwaG90b3NGaWxlbmFtZXMuam9pbihcIiBcIil9ICthcHBlbmQgJHtyb3dGaWxlbmFtZX1gLCB7XG4gICAgICBjd2Q6IHBob3Rvc0RpcixcbiAgICB9KVxuICAgIHJvd3NGaWxlbmFtZXMucHVzaChyb3dGaWxlbmFtZSlcbiAgfVxuICBleGVjU3luYyhgZ20gY29udmVydCAke3Jvd3NGaWxlbmFtZXMuam9pbihcIiBcIil9IC1hcHBlbmQgc2VuYXRldXJzLmpwZ2AsIHtcbiAgICBjd2Q6IHBob3Rvc0RpcixcbiAgfSlcbiAgZm9yIChjb25zdCByb3dGaWxlbmFtZSBvZiByb3dzRmlsZW5hbWVzKSB7XG4gICAgZnMudW5saW5rU3luYyhwYXRoLmpvaW4ocGhvdG9zRGlyLCByb3dGaWxlbmFtZSkpXG4gIH1cblxuICBjb25zdCBqc29uRmlsZVBhdGggPSBwYXRoLmpvaW4ocGhvdG9zRGlyLCBcInNlbmF0ZXVycy5qc29uXCIpXG4gIGZzLndyaXRlRmlsZVN5bmMoanNvbkZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShwaG90b0J5SWRTZW5hdGV1ciwgbnVsbCwgMikpXG5cbiAgcmV0dXJuIGNvbW1pdEFuZFB1c2gocGhvdG9zRGlyLCBvcHRpb25zLmNvbW1pdCwgb3B0aW9ucy5yZW1vdGUpXG59XG5cbmZ1bmN0aW9uIHN0ZW1Gcm9tU2VuYXRldXIoc2VuYXRldXI6IEFjdGV1cikge1xuICBjb25zdCB7IGFkcmVzc2VzIH0gPSBzZW5hdGV1clxuICBsZXQgdXJsID0gbnVsbFxuICBmb3IgKGNvbnN0IGFkcmVzc2Ugb2YgYWRyZXNzZXMhKSB7XG4gICAgaWYgKFxuICAgICAgYWRyZXNzZS54c2lUeXBlID09PSBcIkFkcmVzc2VTaXRlV2ViX1R5cGVcIiAmJlxuICAgICAgYWRyZXNzZS50eXBlTGliZWxsZSA9PT0gXCJVcmwgc8OpbmF0ZXVyXCJcbiAgICApIHtcbiAgICAgIHVybCA9IGFkcmVzc2UudmFsRWxlY1xuICAgIH1cbiAgfVxuICBjb25zdCBtYXRjaCA9IHVybCEubWF0Y2goL15odHRwczpcXC9cXC93d3dcXC5zZW5hdFxcLmZyXFwvc2VuYXRldXJcXC8oLiopXFwuaHRtbCQvKVxuICBjb25zdCBzZW5hdGV1clN0ZW0gPSBtYXRjaCFbMV1cbiAgcmV0dXJuIHNlbmF0ZXVyU3RlbVxufVxuXG5yZXRyaWV2ZVBob3Rvc1NlbmF0ZXVycygpXG4gIC50aGVuKChlcnJvcikgPT4gcHJvY2Vzcy5leGl0KGVycm9yID8gMSA6IDApKVxuICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgcHJvY2Vzcy5leGl0KDIpXG4gIH0pXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQXVCQSxRQUF2QixRQUF1QyxlQUF2QztBQUNBLE9BQU9DLGVBQVAsTUFBNEIsbUJBQTVCO0FBQ0EsT0FBT0MsRUFBUCxNQUFlLFVBQWYsQyxDQUNB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
453
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIlN0cmluZyIsIkJvb2xlYW4iLCJtdWx0aXBsZSIsImRlZmF1bHRPcHRpb24iLCJvcHRpb25zIiwiY29tbWFuZExpbmVBcmdzIiwiY29tbWl0QW5kUHVzaCIsInJlcG9zaXRvcnlEaXIiLCJjb21taXQiLCJyZW1vdGVzIiwiZXJyb3IiLCJleGVjU3luYyIsImN3ZCIsImVudiIsInByb2Nlc3MiLCJlbmNvZGluZyIsInN0ZGlvIiwiY2hpbGRQcm9jZXNzIiwic3RkZXJyIiwidGVzdCIsInN0ZG91dCIsImNvbnNvbGUiLCJvdXRwdXQiLCJyZW1vdGUiLCJyZXRyaWV2ZVBob3Rvc1NlbmF0ZXVycyIsImRhdGFEaXIiLCJsb2FkQXNzZW1ibGVlRGF0YSIsIkVuYWJsZWREYXRhc2V0cyIsIkFjdGV1cnNFdE9yZ2FuZXMiLCJsZWdpc2xhdHVyZSIsImFjdGV1ckJ5VWlkIiwic2VuYXRldXJzIiwiT2JqZWN0IiwidmFsdWVzIiwiZmlsdGVyIiwiYWN0ZXVyIiwibWFuZGF0cyIsIm1hbmRhdFNlbmF0ZXVyIiwibWFuZGF0IiwieHNpVHlwZSIsIlR5cGVNYW5kYXQiLCJNYW5kYXRQYXJsZW1lbnRhaXJlVHlwZSIsInR5cGVPcmdhbmUiLCJDb2RlVHlwZU9yZ2FuZSIsIlNlbmF0IiwidW5kZWZpbmVkIiwiYWRyZXNzZXMiLCJ1cmwiLCJhZHJlc3NlIiwidHlwZUxpYmVsbGUiLCJ2YWxFbGVjIiwic29ydCIsImEiLCJiIiwidWlkIiwibGVuZ3RoIiwibG9jYWxlQ29tcGFyZSIsImdpdEdyb3VwVXJsIiwiY2xvbmUiLCJ0cmltIiwicmVwbGFjZSIsInBob3Rvc0Rpck5hbWUiLCJwaG90b3NEaXIiLCJwYXRoIiwiam9pbiIsImZzIiwiZW5zdXJlRGlyU3luYyIsImZldGNoIiwibWlzc2luZ1Bob3RvRmlsZVBhdGgiLCJzZW5hdGV1ciIsImlkZW50IiwiZXRhdENpdmlsIiwic2VuYXRldXJTdGVtIiwic3RlbUZyb21TZW5hdGV1ciIsInBob3RvRmlsZW5hbWUiLCJwaG90b0ZpbGVQYXRoIiwicGhvdG9UZW1wRmlsZW5hbWUiLCJwaG90b1RlbXBGaWxlUGF0aCIsInVybFBob3RvIiwic2lsZW50IiwibG9nIiwicHJlbm9tIiwibm9tIiwicmVuYW1lU3luYyIsImV4aXN0c1N5bmMiLCJ3YXJuIiwiY29weUZpbGVTeW5jIiwicGhvdG9CeUlkU2VuYXRldXIiLCJyb3dzRmlsZW5hbWVzIiwic2VuYXRldXJJbmRleCIsInJvd0luZGV4Iiwicm93Iiwic2xpY2UiLCJwaG90b3NGaWxlbmFtZXMiLCJlbnRyaWVzIiwiY29sdW1uSW5kZXgiLCJwdXNoIiwiY2hlbWluIiwiY2hlbWluTW9zYWlxdWUiLCJoYXV0ZXVyIiwibGFyZ2V1ciIsInhNb3NhaXF1ZSIsInlNb3NhaXF1ZSIsInJvd0ZpbGVuYW1lIiwidW5saW5rU3luYyIsImpzb25GaWxlUGF0aCIsIndyaXRlRmlsZVN5bmMiLCJKU09OIiwic3RyaW5naWZ5IiwibWF0Y2giLCJ0aGVuIiwiZXhpdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3JldHJpZXZlX3NlbmF0ZXVyc19waG90b3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hpbGRQcm9jZXNzLCBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuLy8gaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbi8vIGltcG9ydCBzdHJlYW0gZnJvbSBcInN0cmVhbVwiXG4vLyBpbXBvcnQgdXRpbCBmcm9tIFwidXRpbFwiXG5cbmltcG9ydCB7IEVuYWJsZWREYXRhc2V0cyB9IGZyb20gXCIuLi9kYXRhc2V0c1wiXG5pbXBvcnQgeyBsb2FkQXNzZW1ibGVlRGF0YSB9IGZyb20gXCIuLi9sb2FkZXJzXCJcbmltcG9ydCB7XG4gIEFjdGV1cixcbiAgQ29kZVR5cGVPcmdhbmUsXG4gIE1hbmRhdCxcbiAgUGhvdG8sXG4gIFR5cGVNYW5kYXQsXG59IGZyb20gXCIuLi90eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuXG5jb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gIHtcbiAgICBhbGlhczogXCJDXCIsXG4gICAgaGVscDogXCJjbG9uZSByZXBvc2l0b3JpZXMgZnJvbSBnaXZlbiBncm91cCAob3Igb3JnYW5pemF0aW9uKSBnaXQgVVJMXCIsXG4gICAgbmFtZTogXCJjbG9uZVwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcImNcIixcbiAgICBoZWxwOiBcImNvbW1pdCBwaG90b3NcIixcbiAgICBuYW1lOiBcImNvbW1pdFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJmXCIsXG4gICAgaGVscDogXCJmZXRjaCBzw6luYXRldXJzJyBwaWN0dXJlcyBpbnN0ZWFkIG9mIHJldHJpZXZpbmcgdGhlbSBmcm9tIGZpbGVzXCIsXG4gICAgbmFtZTogXCJmZXRjaFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJyXCIsXG4gICAgaGVscDogXCJwdXNoIGNvbW1pdCB0byBnaXZlbiByZW1vdGVcIixcbiAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICBuYW1lOiBcInJlbW90ZVwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInNcIixcbiAgICBoZWxwOiBcImRvbid0IGxvZyBhbnl0aGluZ1wiLFxuICAgIG5hbWU6IFwic2lsZW50XCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGRlZmF1bHRPcHRpb246IHRydWUsXG4gICAgaGVscDogXCJkaXJlY3RvcnkgY29udGFpbmluZyBBc3NlbWJsw6llIG9wZW4gZGF0YSBmaWxlc1wiLFxuICAgIG5hbWU6IFwiZGF0YURpclwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbl1cbmNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zKVxuLy8gY29uc3QgcGlwZWxpbmUgPSB1dGlsLnByb21pc2lmeShzdHJlYW0ucGlwZWxpbmUpXG5cbmZ1bmN0aW9uIGNvbW1pdEFuZFB1c2goXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgY29tbWl0OiBib29sZWFuLFxuICByZW1vdGVzPzogc3RyaW5nW10sXG4pOiBib29sZWFuIHtcbiAgbGV0IGVycm9yID0gZmFsc2VcbiAgaWYgKGNvbW1pdCkge1xuICAgIGV4ZWNTeW5jKFwiZ2l0IGFkZCAuXCIsIHtcbiAgICAgIGN3ZDogcmVwb3NpdG9yeURpcixcbiAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgZXhlY1N5bmMoJ2dpdCBjb21taXQgLW0gXCJOb3V2ZWxsZSBtb2lzc29uXCInLCB7XG4gICAgICAgIGN3ZDogcmVwb3NpdG9yeURpcixcbiAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChjaGlsZFByb2Nlc3MgYXMgQ2hpbGRQcm9jZXNzKS5zdGRlcnIgPT09IG51bGwgfHxcbiAgICAgICAgIS9ub3RoaW5nIHRvIGNvbW1pdC8udGVzdCgoY2hpbGRQcm9jZXNzIGFzIGFueSkuc3Rkb3V0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoKGNoaWxkUHJvY2VzcyBhcyBhbnkpLm91dHB1dClcbiAgICAgICAgdGhyb3cgY2hpbGRQcm9jZXNzXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVtb3RlIG9mIHJlbW90ZXMgfHwgW10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgcHVzaCAke3JlbW90ZX0gbWFzdGVyYCwge1xuICAgICAgICAgIGN3ZDogcmVwb3NpdG9yeURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICAgICAgLy8gRG9uJ3Qgc3RvcCB3aGVuIHB1c2ggZmFpbHMuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoKGNoaWxkUHJvY2VzcyBhcyBhbnkpLm91dHB1dClcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBlcnJvclxufVxuXG5hc3luYyBmdW5jdGlvbiByZXRyaWV2ZVBob3Rvc1NlbmF0ZXVycygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICBjb25zdCB7IGFjdGV1ckJ5VWlkIH0gPSBsb2FkQXNzZW1ibGVlRGF0YShcbiAgICBkYXRhRGlyLFxuICAgIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzLFxuICAgIG9wdGlvbnMubGVnaXNsYXR1cmUsXG4gIClcbiAgY29uc3Qgc2VuYXRldXJzID0gT2JqZWN0LnZhbHVlcyhhY3RldXJCeVVpZClcbiAgICAuZmlsdGVyKChhY3RldXIpID0+IHtcbiAgICAgIGNvbnN0IHsgbWFuZGF0cyB9ID0gYWN0ZXVyXG4gICAgICBpZiAoIW1hbmRhdHMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBjb25zdCBtYW5kYXRTZW5hdGV1ciA9IG1hbmRhdHMuZmlsdGVyKFxuICAgICAgICAobWFuZGF0OiBNYW5kYXQpID0+XG4gICAgICAgICAgbWFuZGF0LnhzaVR5cGUgPT09IFR5cGVNYW5kYXQuTWFuZGF0UGFybGVtZW50YWlyZVR5cGUgJiZcbiAgICAgICAgICAvLyBtYW5kYXQubGVnaXNsYXR1cmUgPT09IG9wdGlvbnMubGVnaXNsYXR1cmUgJiZcbiAgICAgICAgICBtYW5kYXQudHlwZU9yZ2FuZSA9PT0gQ29kZVR5cGVPcmdhbmUuU2VuYXQsXG4gICAgICApWzBdXG4gICAgICBpZiAobWFuZGF0U2VuYXRldXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgYWRyZXNzZXMgfSA9IGFjdGV1clxuICAgICAgaWYgKGFkcmVzc2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBsZXQgdXJsID0gbnVsbFxuICAgICAgZm9yIChjb25zdCBhZHJlc3NlIG9mIGFkcmVzc2VzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBhZHJlc3NlLnhzaVR5cGUgPT09IFwiQWRyZXNzZVNpdGVXZWJfVHlwZVwiICYmXG4gICAgICAgICAgYWRyZXNzZS50eXBlTGliZWxsZSA9PT0gXCJVcmwgc8OpbmF0ZXVyXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgdXJsID0gYWRyZXNzZS52YWxFbGVjXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBCb29sZWFuKHVybClcbiAgICB9KVxuICAgIC5zb3J0KChhLCBiKSA9PlxuICAgICAgYS51aWQubGVuZ3RoID09PSBiLnVpZC5sZW5ndGhcbiAgICAgICAgPyBhLnVpZC5sb2NhbGVDb21wYXJlKGIudWlkKVxuICAgICAgICA6IGEudWlkLmxlbmd0aCAtIGIudWlkLmxlbmd0aCxcbiAgICApXG5cbiAgY29uc3QgZ2l0R3JvdXBVcmwgPSBvcHRpb25zLmNsb25lXG4gICAgPyBvcHRpb25zLmNsb25lLnRyaW0oKS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgOiB1bmRlZmluZWRcbiAgY29uc3QgcGhvdG9zRGlyTmFtZSA9IFwicGhvdG9zX3NlbmF0ZXVyc1wiXG4gIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke3Bob3Rvc0Rpck5hbWV9LmdpdGAsIHtcbiAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgfSlcbiAgfVxuICBjb25zdCBwaG90b3NEaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgcGhvdG9zRGlyTmFtZSlcblxuICAvLyBEb3dubG9hZCBwaG90b3MuXG4gIGZzLmVuc3VyZURpclN5bmMocGhvdG9zRGlyKVxuICBpZiAob3B0aW9ucy5mZXRjaCkge1xuICAgIGNvbnN0IG1pc3NpbmdQaG90b0ZpbGVQYXRoID0gXCJpbWFnZXMvdHJhbnNwYXJlbnRfMTU1eDIyNS5qcGdcIlxuICAgIGZvciAoY29uc3Qgc2VuYXRldXIgb2Ygc2VuYXRldXJzKSB7XG4gICAgICBjb25zdCBpZGVudCA9IHNlbmF0ZXVyLmV0YXRDaXZpbC5pZGVudFxuICAgICAgY29uc3Qgc2VuYXRldXJTdGVtID0gc3RlbUZyb21TZW5hdGV1cihzZW5hdGV1cilcbiAgICAgIGNvbnN0IHBob3RvRmlsZW5hbWUgPSBgJHtzZW5hdGV1clN0ZW19LmpwZ2BcbiAgICAgIGNvbnN0IHBob3RvRmlsZVBhdGggPSBwYXRoLmpvaW4ocGhvdG9zRGlyLCBwaG90b0ZpbGVuYW1lKVxuICAgICAgY29uc3QgcGhvdG9UZW1wRmlsZW5hbWUgPSBgJHtzZW5hdGV1clN0ZW19X3RlbXAuanBnYFxuICAgICAgY29uc3QgcGhvdG9UZW1wRmlsZVBhdGggPSBwYXRoLmpvaW4ocGhvdG9zRGlyLCBwaG90b1RlbXBGaWxlbmFtZSlcbiAgICAgIGNvbnN0IHVybFBob3RvID0gYGh0dHBzOi8vd3d3LnNlbmF0LmZyL3NlbmltZy8ke3Bob3RvRmlsZW5hbWV9YFxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgTG9hZGluZyBwaG90byAke3VybFBob3RvfSBmb3IgJHtpZGVudC5wcmVub219ICR7aWRlbnQubm9tfeKApmAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIC8vIGZvciAobGV0IHJldHJpZXMgPSAwOyByZXRyaWVzIDwgMzsgcmV0cmllcysrKSB7XG4gICAgICAvLyAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsUGhvdG8pXG4gICAgICAvLyAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgLy8gICAgIGF3YWl0IHBpcGVsaW5lKHJlc3BvbnNlLmJvZHksIGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHBob3RvVGVtcEZpbGVQYXRoKSlcbiAgICAgIC8vICAgICBmcy5yZW5hbWVTeW5jKHBob3RvVGVtcEZpbGVQYXRoLCBwaG90b0ZpbGVQYXRoKVxuICAgICAgLy8gICAgIGJyZWFrXG4gICAgICAvLyAgIH1cbiAgICAgIC8vICAgaWYgKHJldHJpZXMgPj0gMikge1xuICAgICAgLy8gICAgIGNvbnNvbGUud2FybihgRmV0Y2ggZmFpbGVkOiAke3VybFBob3RvfSAoJHtpZGVudC5wcmVub219ICR7aWRlbnQubm9tfSlgKVxuICAgICAgLy8gICAgIGNvbnNvbGUud2FybihyZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnN0YXR1c1RleHQpXG4gICAgICAvLyAgICAgY29uc29sZS53YXJuKGF3YWl0IHJlc3BvbnNlLnRleHQoKSlcbiAgICAgIC8vICAgICBpZiAoZnMuZXhpc3RzU3luYyhwaG90b0ZpbGVQYXRoKSkge1xuICAgICAgLy8gICAgICAgY29uc29sZS53YXJuKFwiICA9PiBSZXVzaW5nIGV4aXN0aW5nIGltYWdlXCIpXG4gICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgIC8vICAgICAgIGNvbnNvbGUud2FybihcIiAgPT4gVXNpbmcgYmxhbmsgaW1hZ2VcIilcbiAgICAgIC8vICAgICAgIGZzLmNvcHlGaWxlU3luYyhtaXNzaW5nUGhvdG9GaWxlUGF0aCwgcGhvdG9GaWxlUGF0aClcbiAgICAgIC8vICAgICB9XG4gICAgICAvLyAgICAgYnJlYWtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgICAgdHJ5IHtcbiAgICAgICAgZXhlY1N5bmMoYHdnZXQgLS1xdWlldCAtTyAke3Bob3RvVGVtcEZpbGVuYW1lfSAke3VybFBob3RvfWAsIHtcbiAgICAgICAgICBjd2Q6IHBob3Rvc0RpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgLy8gc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICAgIGZzLnJlbmFtZVN5bmMocGhvdG9UZW1wRmlsZVBhdGgsIHBob3RvRmlsZVBhdGgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwaG90b0ZpbGVQYXRoKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIiAgPT4gUmV1c2luZyBleGlzdGluZyBpbWFnZVwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIiAgPT4gVXNpbmcgYmxhbmsgaW1hZ2VcIilcbiAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMobWlzc2luZ1Bob3RvRmlsZVBhdGgsIHBob3RvRmlsZVBhdGgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXNpemUgcGhvdG9zIHRvIDE1NXgyMjUsIGJlY2F1c2Ugc29tZSBoYXZlbid0IGV4YWN0bHkgdGhpcyBzaXplLlxuICBmb3IgKGNvbnN0IHNlbmF0ZXVyIG9mIHNlbmF0ZXVycykge1xuICAgIGNvbnN0IGlkZW50ID0gc2VuYXRldXIuZXRhdENpdmlsLmlkZW50XG4gICAgY29uc3Qgc2VuYXRldXJTdGVtID0gc3RlbUZyb21TZW5hdGV1cihzZW5hdGV1cilcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFJlc2l6aW5nIHBob3RvICR7c2VuYXRldXJTdGVtfSBmb3IgJHtpZGVudC5wcmVub219ICR7aWRlbnQubm9tfeKApmAsXG4gICAgICApXG4gICAgfVxuICAgIGV4ZWNTeW5jKFxuICAgICAgYGdtIGNvbnZlcnQgLXJlc2l6ZSAxNTV4MjI1ISAke3NlbmF0ZXVyU3RlbX0uanBnICR7c2VuYXRldXJTdGVtfV8xNTV4MjI1LmpwZ2AsXG4gICAgICB7XG4gICAgICAgIGN3ZDogcGhvdG9zRGlyLFxuICAgICAgfSxcbiAgICApXG4gIH1cblxuICAvLyBDcmVhdGUgYSBtb3NhaWMgb2YgcGhvdG9zLlxuICBjb25zdCBwaG90b0J5SWRTZW5hdGV1cjogeyBbdWlkOiBzdHJpbmddOiBQaG90byB9ID0ge31cbiAgY29uc3Qgcm93c0ZpbGVuYW1lczogc3RyaW5nW10gPSBbXVxuICBmb3IgKFxuICAgIGxldCBzZW5hdGV1ckluZGV4ID0gMCwgcm93SW5kZXggPSAwO1xuICAgIHNlbmF0ZXVySW5kZXggPCBzZW5hdGV1cnMubGVuZ3RoO1xuICAgIHNlbmF0ZXVySW5kZXggKz0gMjUsIHJvd0luZGV4KytcbiAgKSB7XG4gICAgY29uc3Qgcm93ID0gc2VuYXRldXJzLnNsaWNlKHNlbmF0ZXVySW5kZXgsIHNlbmF0ZXVySW5kZXggKyAyNSlcbiAgICBjb25zdCBwaG90b3NGaWxlbmFtZXM6IHN0cmluZ1tdID0gW11cbiAgICBmb3IgKGNvbnN0IFtjb2x1bW5JbmRleCwgc2VuYXRldXJdIG9mIHJvdy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHNlbmF0ZXVyU3RlbSA9IHN0ZW1Gcm9tU2VuYXRldXIoc2VuYXRldXIpXG4gICAgICBjb25zdCBwaG90b0ZpbGVuYW1lID0gYCR7c2VuYXRldXJTdGVtfV8xNTV4MjI1LmpwZ2BcbiAgICAgIHBob3Rvc0ZpbGVuYW1lcy5wdXNoKHBob3RvRmlsZW5hbWUpXG4gICAgICBwaG90b0J5SWRTZW5hdGV1cltzZW5hdGV1ci51aWRdID0ge1xuICAgICAgICBjaGVtaW46IGBwaG90b3Nfc2VuYXRldXJzLyR7cGhvdG9GaWxlbmFtZX1gLFxuICAgICAgICBjaGVtaW5Nb3NhaXF1ZTogYHBob3Rvc19zZW5hdGV1cnMvc2VuYXRldXJzLmpwZ2AsXG4gICAgICAgIGhhdXRldXI6IDIyNSxcbiAgICAgICAgbGFyZ2V1cjogMTU1LFxuICAgICAgICB4TW9zYWlxdWU6IGNvbHVtbkluZGV4ICogMTU1LFxuICAgICAgICB5TW9zYWlxdWU6IHJvd0luZGV4ICogMjI1LFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByb3dGaWxlbmFtZSA9IGByb3ctJHtyb3dJbmRleH0uanBnYFxuICAgIGV4ZWNTeW5jKGBnbSBjb252ZXJ0ICR7cGhvdG9zRmlsZW5hbWVzLmpvaW4oXCIgXCIpfSArYXBwZW5kICR7cm93RmlsZW5hbWV9YCwge1xuICAgICAgY3dkOiBwaG90b3NEaXIsXG4gICAgfSlcbiAgICByb3dzRmlsZW5hbWVzLnB1c2gocm93RmlsZW5hbWUpXG4gIH1cbiAgZXhlY1N5bmMoYGdtIGNvbnZlcnQgJHtyb3dzRmlsZW5hbWVzLmpvaW4oXCIgXCIpfSAtYXBwZW5kIHNlbmF0ZXVycy5qcGdgLCB7XG4gICAgY3dkOiBwaG90b3NEaXIsXG4gIH0pXG4gIGZvciAoY29uc3Qgcm93RmlsZW5hbWUgb2Ygcm93c0ZpbGVuYW1lcykge1xuICAgIGZzLnVubGlua1N5bmMocGF0aC5qb2luKHBob3Rvc0Rpciwgcm93RmlsZW5hbWUpKVxuICB9XG5cbiAgY29uc3QganNvbkZpbGVQYXRoID0gcGF0aC5qb2luKHBob3Rvc0RpciwgXCJzZW5hdGV1cnMuanNvblwiKVxuICBmcy53cml0ZUZpbGVTeW5jKGpzb25GaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkocGhvdG9CeUlkU2VuYXRldXIsIG51bGwsIDIpKVxuXG4gIHJldHVybiBjb21taXRBbmRQdXNoKHBob3Rvc0Rpciwgb3B0aW9ucy5jb21taXQsIG9wdGlvbnMucmVtb3RlKVxufVxuXG5mdW5jdGlvbiBzdGVtRnJvbVNlbmF0ZXVyKHNlbmF0ZXVyOiBBY3RldXIpIHtcbiAgY29uc3QgeyBhZHJlc3NlcyB9ID0gc2VuYXRldXJcbiAgbGV0IHVybCA9IG51bGxcbiAgZm9yIChjb25zdCBhZHJlc3NlIG9mIGFkcmVzc2VzISkge1xuICAgIGlmIChcbiAgICAgIGFkcmVzc2UueHNpVHlwZSA9PT0gXCJBZHJlc3NlU2l0ZVdlYl9UeXBlXCIgJiZcbiAgICAgIGFkcmVzc2UudHlwZUxpYmVsbGUgPT09IFwiVXJsIHPDqW5hdGV1clwiXG4gICAgKSB7XG4gICAgICB1cmwgPSBhZHJlc3NlLnZhbEVsZWNcbiAgICB9XG4gIH1cbiAgY29uc3QgbWF0Y2ggPSB1cmwhLm1hdGNoKC9eaHR0cHM6XFwvXFwvd3d3XFwuc2VuYXRcXC5mclxcL3NlbmF0ZXVyXFwvKC4qKVxcLmh0bWwkLylcbiAgY29uc3Qgc2VuYXRldXJTdGVtID0gbWF0Y2ghWzFdXG4gIHJldHVybiBzZW5hdGV1clN0ZW1cbn1cblxucmV0cmlldmVQaG90b3NTZW5hdGV1cnMoKVxuICAudGhlbigoZXJyb3IpID0+IHByb2Nlc3MuZXhpdChlcnJvciA/IDEgOiAwKSlcbiAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgIHByb2Nlc3MuZXhpdCgyKVxuICB9KVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUVBOztBQUlBOztB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