eurostat-map 4.11.1 → 4.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/323.eurostatmap.min.js +3 -0
- package/build/323.eurostatmap.min.js.map +1 -0
- package/build/eurostatmap.js +23 -13
- package/build/eurostatmap.min.js +2 -2
- package/build/eurostatmap.min.js.map +1 -1
- package/build/package.json +1 -1
- package/build/src_core_dorling_dorling-worker_js.eurostatmap.js +218 -8
- package/build/vendors-node_modules_d3-force_src_collide_js-node_modules_d3-force_src_simulation_js-node_mod-2a5c42.eurostatmap.js +1320 -0
- package/package.json +1 -1
- package/build/215.eurostatmap.min.js +0 -3
- package/build/215.eurostatmap.min.js.map +0 -1
package/build/package.json
CHANGED
|
@@ -9,15 +9,36 @@
|
|
|
9
9
|
root["eurostatmap"] = factory();
|
|
10
10
|
})(self, () => {
|
|
11
11
|
return /******/ (() => { // webpackBootstrap
|
|
12
|
-
|
|
12
|
+
/******/ "use strict";
|
|
13
|
+
/******/ var __webpack_modules__ = ({
|
|
14
|
+
|
|
15
|
+
/***/ "./src/core/dorling/dorling-worker.js"
|
|
13
16
|
/*!********************************************!*\
|
|
14
17
|
!*** ./src/core/dorling/dorling-worker.js ***!
|
|
15
18
|
\********************************************/
|
|
19
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
20
|
+
|
|
21
|
+
__webpack_require__.r(__webpack_exports__);
|
|
22
|
+
/* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/collide.js");
|
|
23
|
+
/* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/simulation.js");
|
|
24
|
+
/* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/x.js");
|
|
25
|
+
/* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/y.js");
|
|
26
|
+
|
|
27
|
+
|
|
16
28
|
onmessage = (event) => {
|
|
17
29
|
const { nodes: inputNodes, radii, strengthX, strengthY, iterations, d3URL } = event.data
|
|
18
30
|
|
|
19
|
-
//
|
|
20
|
-
|
|
31
|
+
// d3-force is bundled directly by default (fast, no network dependency) - importScripts a
|
|
32
|
+
// full runtime d3 build only if the caller explicitly opted into a custom build via
|
|
33
|
+
// dorlingSettings({ workerD3URL }). Previously this always fetched the full d3 v7 bundle from
|
|
34
|
+
// an external CDN on every single Dorling toggle, even though only these 4 named exports are
|
|
35
|
+
// used - the network round-trip (worker spin-up + fetch + cache revalidation each time) was
|
|
36
|
+
// the actual cause of the "cartogram mode is slow now" regression, not the simulation itself.
|
|
37
|
+
let d3Force = { forceSimulation: d3_force__WEBPACK_IMPORTED_MODULE_1__["default"], forceX: d3_force__WEBPACK_IMPORTED_MODULE_2__["default"], forceY: d3_force__WEBPACK_IMPORTED_MODULE_3__["default"], forceCollide: d3_force__WEBPACK_IMPORTED_MODULE_0__["default"] }
|
|
38
|
+
if (d3URL) {
|
|
39
|
+
importScripts(d3URL)
|
|
40
|
+
d3Force = self.d3
|
|
41
|
+
}
|
|
21
42
|
|
|
22
43
|
const nodes = inputNodes.map((n, i) => {
|
|
23
44
|
n.x = n.properties.centroid[0]
|
|
@@ -26,11 +47,11 @@ onmessage = (event) => {
|
|
|
26
47
|
return n
|
|
27
48
|
})
|
|
28
49
|
|
|
29
|
-
const sim =
|
|
50
|
+
const sim = d3Force
|
|
30
51
|
.forceSimulation(nodes)
|
|
31
|
-
.force('x',
|
|
32
|
-
.force('y',
|
|
33
|
-
.force('collide',
|
|
52
|
+
.force('x', d3Force.forceX((d) => d.properties.centroid[0]).strength(strengthX))
|
|
53
|
+
.force('y', d3Force.forceY((d) => d.properties.centroid[1]).strength(strengthY))
|
|
54
|
+
.force('collide', d3Force.forceCollide((d) => d.r).iterations(iterations))
|
|
34
55
|
.stop()
|
|
35
56
|
|
|
36
57
|
const nTicks = Math.ceil(Math.log(sim.alphaMin()) / Math.log(1 - sim.alphaDecay()))
|
|
@@ -46,8 +67,197 @@ onmessage = (event) => {
|
|
|
46
67
|
self.close()
|
|
47
68
|
}
|
|
48
69
|
|
|
70
|
+
|
|
71
|
+
/***/ }
|
|
72
|
+
|
|
73
|
+
/******/ });
|
|
74
|
+
/************************************************************************/
|
|
75
|
+
/******/ // The module cache
|
|
76
|
+
/******/ var __webpack_module_cache__ = {};
|
|
77
|
+
/******/
|
|
78
|
+
/******/ // The require function
|
|
79
|
+
/******/ function __webpack_require__(moduleId) {
|
|
80
|
+
/******/ // Check if module is in cache
|
|
81
|
+
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
82
|
+
/******/ if (cachedModule !== undefined) {
|
|
83
|
+
/******/ return cachedModule.exports;
|
|
84
|
+
/******/ }
|
|
85
|
+
/******/ // Create a new module (and put it into the cache)
|
|
86
|
+
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
87
|
+
/******/ // no module.id needed
|
|
88
|
+
/******/ // no module.loaded needed
|
|
89
|
+
/******/ exports: {}
|
|
90
|
+
/******/ };
|
|
91
|
+
/******/
|
|
92
|
+
/******/ // Execute the module function
|
|
93
|
+
/******/ if (!(moduleId in __webpack_modules__)) {
|
|
94
|
+
/******/ delete __webpack_module_cache__[moduleId];
|
|
95
|
+
/******/ var e = new Error("Cannot find module '" + moduleId + "'");
|
|
96
|
+
/******/ e.code = 'MODULE_NOT_FOUND';
|
|
97
|
+
/******/ throw e;
|
|
98
|
+
/******/ }
|
|
99
|
+
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
100
|
+
/******/
|
|
101
|
+
/******/ // Return the exports of the module
|
|
102
|
+
/******/ return module.exports;
|
|
103
|
+
/******/ }
|
|
104
|
+
/******/
|
|
105
|
+
/******/ // expose the modules object (__webpack_modules__)
|
|
106
|
+
/******/ __webpack_require__.m = __webpack_modules__;
|
|
107
|
+
/******/
|
|
108
|
+
/******/ // the startup function
|
|
109
|
+
/******/ __webpack_require__.x = () => {
|
|
110
|
+
/******/ // Load entry module and return exports
|
|
111
|
+
/******/ // This entry module depends on other loaded chunks and execution need to be delayed
|
|
112
|
+
/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["vendors-node_modules_d3-force_src_collide_js-node_modules_d3-force_src_simulation_js-node_mod-2a5c42"], () => (__webpack_require__("./src/core/dorling/dorling-worker.js")))
|
|
113
|
+
/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__);
|
|
114
|
+
/******/ return __webpack_exports__;
|
|
115
|
+
/******/ };
|
|
116
|
+
/******/
|
|
117
|
+
/************************************************************************/
|
|
118
|
+
/******/ /* webpack/runtime/chunk loaded */
|
|
119
|
+
/******/ (() => {
|
|
120
|
+
/******/ var deferred = [];
|
|
121
|
+
/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => {
|
|
122
|
+
/******/ if(chunkIds) {
|
|
123
|
+
/******/ priority = priority || 0;
|
|
124
|
+
/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];
|
|
125
|
+
/******/ deferred[i] = [chunkIds, fn, priority];
|
|
126
|
+
/******/ return;
|
|
127
|
+
/******/ }
|
|
128
|
+
/******/ var notFulfilled = Infinity;
|
|
129
|
+
/******/ for (var i = 0; i < deferred.length; i++) {
|
|
130
|
+
/******/ var [chunkIds, fn, priority] = deferred[i];
|
|
131
|
+
/******/ var fulfilled = true;
|
|
132
|
+
/******/ for (var j = 0; j < chunkIds.length; j++) {
|
|
133
|
+
/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {
|
|
134
|
+
/******/ chunkIds.splice(j--, 1);
|
|
135
|
+
/******/ } else {
|
|
136
|
+
/******/ fulfilled = false;
|
|
137
|
+
/******/ if(priority < notFulfilled) notFulfilled = priority;
|
|
138
|
+
/******/ }
|
|
139
|
+
/******/ }
|
|
140
|
+
/******/ if(fulfilled) {
|
|
141
|
+
/******/ deferred.splice(i--, 1)
|
|
142
|
+
/******/ var r = fn();
|
|
143
|
+
/******/ if (r !== undefined) result = r;
|
|
144
|
+
/******/ }
|
|
145
|
+
/******/ }
|
|
146
|
+
/******/ return result;
|
|
147
|
+
/******/ };
|
|
148
|
+
/******/ })();
|
|
149
|
+
/******/
|
|
150
|
+
/******/ /* webpack/runtime/define property getters */
|
|
151
|
+
/******/ (() => {
|
|
152
|
+
/******/ // define getter functions for harmony exports
|
|
153
|
+
/******/ __webpack_require__.d = (exports, definition) => {
|
|
154
|
+
/******/ for(var key in definition) {
|
|
155
|
+
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
156
|
+
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
157
|
+
/******/ }
|
|
158
|
+
/******/ }
|
|
159
|
+
/******/ };
|
|
160
|
+
/******/ })();
|
|
161
|
+
/******/
|
|
162
|
+
/******/ /* webpack/runtime/ensure chunk */
|
|
163
|
+
/******/ (() => {
|
|
164
|
+
/******/ __webpack_require__.f = {};
|
|
165
|
+
/******/ // This file contains only the entry chunk.
|
|
166
|
+
/******/ // The chunk loading function for additional chunks
|
|
167
|
+
/******/ __webpack_require__.e = (chunkId) => {
|
|
168
|
+
/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
|
|
169
|
+
/******/ __webpack_require__.f[key](chunkId, promises);
|
|
170
|
+
/******/ return promises;
|
|
171
|
+
/******/ }, []));
|
|
172
|
+
/******/ };
|
|
173
|
+
/******/ })();
|
|
174
|
+
/******/
|
|
175
|
+
/******/ /* webpack/runtime/get javascript chunk filename */
|
|
176
|
+
/******/ (() => {
|
|
177
|
+
/******/ // This function allow to reference async chunks and chunks that the entrypoint depends on
|
|
178
|
+
/******/ __webpack_require__.u = (chunkId) => {
|
|
179
|
+
/******/ // return url for filenames based on template
|
|
180
|
+
/******/ return "" + chunkId + ".eurostatmap.js";
|
|
181
|
+
/******/ };
|
|
182
|
+
/******/ })();
|
|
183
|
+
/******/
|
|
184
|
+
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
185
|
+
/******/ (() => {
|
|
186
|
+
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
|
187
|
+
/******/ })();
|
|
188
|
+
/******/
|
|
189
|
+
/******/ /* webpack/runtime/make namespace object */
|
|
190
|
+
/******/ (() => {
|
|
191
|
+
/******/ // define __esModule on exports
|
|
192
|
+
/******/ __webpack_require__.r = (exports) => {
|
|
193
|
+
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
194
|
+
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
195
|
+
/******/ }
|
|
196
|
+
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
197
|
+
/******/ };
|
|
198
|
+
/******/ })();
|
|
199
|
+
/******/
|
|
200
|
+
/******/ /* webpack/runtime/publicPath */
|
|
201
|
+
/******/ (() => {
|
|
202
|
+
/******/ __webpack_require__.p = "/build/";
|
|
203
|
+
/******/ })();
|
|
204
|
+
/******/
|
|
205
|
+
/******/ /* webpack/runtime/importScripts chunk loading */
|
|
206
|
+
/******/ (() => {
|
|
207
|
+
/******/ // no baseURI
|
|
208
|
+
/******/
|
|
209
|
+
/******/ // object to store loaded chunks
|
|
210
|
+
/******/ // "1" means "already loaded"
|
|
211
|
+
/******/ var installedChunks = {
|
|
212
|
+
/******/ "src_core_dorling_dorling-worker_js": 1
|
|
213
|
+
/******/ };
|
|
214
|
+
/******/
|
|
215
|
+
/******/ // importScripts chunk loading
|
|
216
|
+
/******/ var installChunk = (data) => {
|
|
217
|
+
/******/ var [chunkIds, moreModules, runtime] = data;
|
|
218
|
+
/******/ for(var moduleId in moreModules) {
|
|
219
|
+
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
|
|
220
|
+
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
|
|
221
|
+
/******/ }
|
|
222
|
+
/******/ }
|
|
223
|
+
/******/ if(runtime) runtime(__webpack_require__);
|
|
224
|
+
/******/ while(chunkIds.length)
|
|
225
|
+
/******/ installedChunks[chunkIds.pop()] = 1;
|
|
226
|
+
/******/ parentChunkLoadingFunction(data);
|
|
227
|
+
/******/ };
|
|
228
|
+
/******/ __webpack_require__.f.i = (chunkId, promises) => {
|
|
229
|
+
/******/ // "1" is the signal for "already loaded"
|
|
230
|
+
/******/ if(!installedChunks[chunkId]) {
|
|
231
|
+
/******/ if(true) { // all chunks have JS
|
|
232
|
+
/******/ importScripts(__webpack_require__.p + __webpack_require__.u(chunkId));
|
|
233
|
+
/******/ }
|
|
234
|
+
/******/ }
|
|
235
|
+
/******/ };
|
|
236
|
+
/******/
|
|
237
|
+
/******/ var chunkLoadingGlobal = self["webpackChunkeurostatmap"] = self["webpackChunkeurostatmap"] || [];
|
|
238
|
+
/******/ var parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);
|
|
239
|
+
/******/ chunkLoadingGlobal.push = installChunk;
|
|
240
|
+
/******/
|
|
241
|
+
/******/ // no HMR
|
|
242
|
+
/******/
|
|
243
|
+
/******/ // no HMR manifest
|
|
244
|
+
/******/ })();
|
|
245
|
+
/******/
|
|
246
|
+
/******/ /* webpack/runtime/startup chunk dependencies */
|
|
247
|
+
/******/ (() => {
|
|
248
|
+
/******/ var next = __webpack_require__.x;
|
|
249
|
+
/******/ __webpack_require__.x = () => {
|
|
250
|
+
/******/ return __webpack_require__.e("vendors-node_modules_d3-force_src_collide_js-node_modules_d3-force_src_simulation_js-node_mod-2a5c42").then(next);
|
|
251
|
+
/******/ };
|
|
252
|
+
/******/ })();
|
|
253
|
+
/******/
|
|
254
|
+
/************************************************************************/
|
|
255
|
+
/******/
|
|
256
|
+
/******/ // run startup
|
|
257
|
+
/******/ var __webpack_exports__ = __webpack_require__.x();
|
|
258
|
+
/******/
|
|
49
259
|
/******/ return __webpack_exports__;
|
|
50
260
|
/******/ })()
|
|
51
261
|
;
|
|
52
262
|
});
|
|
53
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3JjX2NvcmVfZG9ybGluZ19kb3JsaW5nLXdvcmtlcl9qcy5ldXJvc3RhdG1hcC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7QUNWQTtBQUNBLFlBQVksb0VBQW9FO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQSwwQkFBMEIsOENBQThDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC8uL3NyYy9jb3JlL2RvcmxpbmcvZG9ybGluZy13b3JrZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZXVyb3N0YXRtYXBcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiZXVyb3N0YXRtYXBcIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCAoKSA9PiB7XG5yZXR1cm4gIiwib25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCB7IG5vZGVzOiBpbnB1dE5vZGVzLCByYWRpaSwgc3RyZW5ndGhYLCBzdHJlbmd0aFksIGl0ZXJhdGlvbnMsIGQzVVJMIH0gPSBldmVudC5kYXRhXHJcblxyXG4gICAgLy8gTG9hZCBEMyBkeW5hbWljYWxseSBpbnRvIHRoZSB3b3JrZXJcclxuICAgIGltcG9ydFNjcmlwdHMoZDNVUkwgfHwgJ2h0dHBzOi8vdW5wa2cuY29tL2QzQDcvZGlzdC9kMy5taW4uanMnKVxyXG5cclxuICAgIGNvbnN0IG5vZGVzID0gaW5wdXROb2Rlcy5tYXAoKG4sIGkpID0+IHtcclxuICAgICAgICBuLnggPSBuLnByb3BlcnRpZXMuY2VudHJvaWRbMF1cclxuICAgICAgICBuLnkgPSBuLnByb3BlcnRpZXMuY2VudHJvaWRbMV1cclxuICAgICAgICBuLnIgPSByYWRpaVtpXVxyXG4gICAgICAgIHJldHVybiBuXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IHNpbSA9IGQzXHJcbiAgICAgICAgLmZvcmNlU2ltdWxhdGlvbihub2RlcylcclxuICAgICAgICAuZm9yY2UoJ3gnLCBkMy5mb3JjZVgoKGQpID0+IGQucHJvcGVydGllcy5jZW50cm9pZFswXSkuc3RyZW5ndGgoc3RyZW5ndGhYKSlcclxuICAgICAgICAuZm9yY2UoJ3knLCBkMy5mb3JjZVkoKGQpID0+IGQucHJvcGVydGllcy5jZW50cm9pZFsxXSkuc3RyZW5ndGgoc3RyZW5ndGhZKSlcclxuICAgICAgICAuZm9yY2UoJ2NvbGxpZGUnLCBkMy5mb3JjZUNvbGxpZGUoKGQpID0+IGQucikuaXRlcmF0aW9ucyhpdGVyYXRpb25zKSlcclxuICAgICAgICAuc3RvcCgpXHJcblxyXG4gICAgY29uc3QgblRpY2tzID0gTWF0aC5jZWlsKE1hdGgubG9nKHNpbS5hbHBoYU1pbigpKSAvIE1hdGgubG9nKDEgLSBzaW0uYWxwaGFEZWNheSgpKSlcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5UaWNrczsgaSsrKSB7XHJcbiAgICAgICAgc2ltLnRpY2soKVxyXG4gICAgICAgIGlmIChpICUgMTAgPT09IDApIHtcclxuICAgICAgICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAncHJvZ3Jlc3MnLCBwcm9ncmVzczogaSwgdG90YWw6IG5UaWNrcyB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICdlbmQnLCBub2RlcyB9KVxyXG4gICAgc2VsZi5jbG9zZSgpXHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|
|
263
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3JjX2NvcmVfZG9ybGluZ19kb3JsaW5nLXdvcmtlcl9qcy5ldXJvc3RhdG1hcC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7O0FDVndFO0FBQ3hFO0FBQ0E7QUFDQSxZQUFZLG9FQUFvRTtBQUNoRjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsYUFBYTtBQUN0QztBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZUFBZSwwREFBUSwwREFBUSxnRUFBYztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQSwwQkFBMEIsOENBQThDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTs7Ozs7OztVQzFDQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7Ozs7V0N4Q0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSwrQkFBK0Isd0NBQXdDO1dBQ3ZFO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsaUJBQWlCLHFCQUFxQjtXQUN0QztXQUNBO1dBQ0Esa0JBQWtCLHFCQUFxQjtXQUN2QztXQUNBO1dBQ0EsS0FBSztXQUNMO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQzNCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBLEU7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFQUFFO1dBQ0YsRTs7Ozs7V0NSQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1dDSkEsd0Y7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdELEU7Ozs7O1dDTkEsa0M7Ozs7O1dDQUE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGFBQWE7V0FDYjtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7O1dBRUE7O1dBRUEsa0I7Ozs7O1dDcENBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1VFSEE7VUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC8uL3NyYy9jb3JlL2RvcmxpbmcvZG9ybGluZy13b3JrZXIuanMiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC93ZWJwYWNrL3J1bnRpbWUvZ2V0IGphdmFzY3JpcHQgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svcnVudGltZS9wdWJsaWNQYXRoIiwid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svcnVudGltZS9pbXBvcnRTY3JpcHRzIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ydW50aW1lL3N0YXJ0dXAgY2h1bmsgZGVwZW5kZW5jaWVzIiwid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svYmVmb3JlLXN0YXJ0dXAiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJldXJvc3RhdG1hcFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJldXJvc3RhdG1hcFwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsICgpID0+IHtcbnJldHVybiAiLCJpbXBvcnQgeyBmb3JjZVNpbXVsYXRpb24sIGZvcmNlWCwgZm9yY2VZLCBmb3JjZUNvbGxpZGUgfSBmcm9tICdkMy1mb3JjZSdcclxuXHJcbm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xyXG4gICAgY29uc3QgeyBub2RlczogaW5wdXROb2RlcywgcmFkaWksIHN0cmVuZ3RoWCwgc3RyZW5ndGhZLCBpdGVyYXRpb25zLCBkM1VSTCB9ID0gZXZlbnQuZGF0YVxyXG5cclxuICAgIC8vIGQzLWZvcmNlIGlzIGJ1bmRsZWQgZGlyZWN0bHkgYnkgZGVmYXVsdCAoZmFzdCwgbm8gbmV0d29yayBkZXBlbmRlbmN5KSAtIGltcG9ydFNjcmlwdHMgYVxyXG4gICAgLy8gZnVsbCBydW50aW1lIGQzIGJ1aWxkIG9ubHkgaWYgdGhlIGNhbGxlciBleHBsaWNpdGx5IG9wdGVkIGludG8gYSBjdXN0b20gYnVpbGQgdmlhXHJcbiAgICAvLyBkb3JsaW5nU2V0dGluZ3MoeyB3b3JrZXJEM1VSTCB9KS4gUHJldmlvdXNseSB0aGlzIGFsd2F5cyBmZXRjaGVkIHRoZSBmdWxsIGQzIHY3IGJ1bmRsZSBmcm9tXHJcbiAgICAvLyBhbiBleHRlcm5hbCBDRE4gb24gZXZlcnkgc2luZ2xlIERvcmxpbmcgdG9nZ2xlLCBldmVuIHRob3VnaCBvbmx5IHRoZXNlIDQgbmFtZWQgZXhwb3J0cyBhcmVcclxuICAgIC8vIHVzZWQgLSB0aGUgbmV0d29yayByb3VuZC10cmlwICh3b3JrZXIgc3Bpbi11cCArIGZldGNoICsgY2FjaGUgcmV2YWxpZGF0aW9uIGVhY2ggdGltZSkgd2FzXHJcbiAgICAvLyB0aGUgYWN0dWFsIGNhdXNlIG9mIHRoZSBcImNhcnRvZ3JhbSBtb2RlIGlzIHNsb3cgbm93XCIgcmVncmVzc2lvbiwgbm90IHRoZSBzaW11bGF0aW9uIGl0c2VsZi5cclxuICAgIGxldCBkM0ZvcmNlID0geyBmb3JjZVNpbXVsYXRpb24sIGZvcmNlWCwgZm9yY2VZLCBmb3JjZUNvbGxpZGUgfVxyXG4gICAgaWYgKGQzVVJMKSB7XHJcbiAgICAgICAgaW1wb3J0U2NyaXB0cyhkM1VSTClcclxuICAgICAgICBkM0ZvcmNlID0gc2VsZi5kM1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5vZGVzID0gaW5wdXROb2Rlcy5tYXAoKG4sIGkpID0+IHtcclxuICAgICAgICBuLnggPSBuLnByb3BlcnRpZXMuY2VudHJvaWRbMF1cclxuICAgICAgICBuLnkgPSBuLnByb3BlcnRpZXMuY2VudHJvaWRbMV1cclxuICAgICAgICBuLnIgPSByYWRpaVtpXVxyXG4gICAgICAgIHJldHVybiBuXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IHNpbSA9IGQzRm9yY2VcclxuICAgICAgICAuZm9yY2VTaW11bGF0aW9uKG5vZGVzKVxyXG4gICAgICAgIC5mb3JjZSgneCcsIGQzRm9yY2UuZm9yY2VYKChkKSA9PiBkLnByb3BlcnRpZXMuY2VudHJvaWRbMF0pLnN0cmVuZ3RoKHN0cmVuZ3RoWCkpXHJcbiAgICAgICAgLmZvcmNlKCd5JywgZDNGb3JjZS5mb3JjZVkoKGQpID0+IGQucHJvcGVydGllcy5jZW50cm9pZFsxXSkuc3RyZW5ndGgoc3RyZW5ndGhZKSlcclxuICAgICAgICAuZm9yY2UoJ2NvbGxpZGUnLCBkM0ZvcmNlLmZvcmNlQ29sbGlkZSgoZCkgPT4gZC5yKS5pdGVyYXRpb25zKGl0ZXJhdGlvbnMpKVxyXG4gICAgICAgIC5zdG9wKClcclxuXHJcbiAgICBjb25zdCBuVGlja3MgPSBNYXRoLmNlaWwoTWF0aC5sb2coc2ltLmFscGhhTWluKCkpIC8gTWF0aC5sb2coMSAtIHNpbS5hbHBoYURlY2F5KCkpKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblRpY2tzOyBpKyspIHtcclxuICAgICAgICBzaW0udGljaygpXHJcbiAgICAgICAgaWYgKGkgJSAxMCA9PT0gMCkge1xyXG4gICAgICAgICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICdwcm9ncmVzcycsIHByb2dyZXNzOiBpLCB0b3RhbDogblRpY2tzIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogJ2VuZCcsIG5vZGVzIH0pXHJcbiAgICBzZWxmLmNsb3NlKClcclxufVxyXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuLy8gdGhlIHN0YXJ0dXAgZnVuY3Rpb25cbl9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG5cdC8vIFRoaXMgZW50cnkgbW9kdWxlIGRlcGVuZHMgb24gb3RoZXIgbG9hZGVkIGNodW5rcyBhbmQgZXhlY3V0aW9uIG5lZWQgdG8gYmUgZGVsYXllZFxuXHR2YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyh1bmRlZmluZWQsIFtcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2QzLWZvcmNlX3NyY19jb2xsaWRlX2pzLW5vZGVfbW9kdWxlc19kMy1mb3JjZV9zcmNfc2ltdWxhdGlvbl9qcy1ub2RlX21vZC0yYTVjNDJcIl0sICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKFwiLi9zcmMvY29yZS9kb3JsaW5nL2Rvcmxpbmctd29ya2VyLmpzXCIpKSlcblx0X193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyhfX3dlYnBhY2tfZXhwb3J0c19fKTtcblx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG59O1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmYgPSB7fTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IHRoZSBlbnRyeSBjaHVuay5cbi8vIFRoZSBjaHVuayBsb2FkaW5nIGZ1bmN0aW9uIGZvciBhZGRpdGlvbmFsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5lID0gKGNodW5rSWQpID0+IHtcblx0cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uZikucmVkdWNlKChwcm9taXNlcywga2V5KSA9PiB7XG5cdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5mW2tleV0oY2h1bmtJZCwgcHJvbWlzZXMpO1xuXHRcdHJldHVybiBwcm9taXNlcztcblx0fSwgW10pKTtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYXN5bmMgY2h1bmtzIGFuZCBjaHVua3MgdGhhdCB0aGUgZW50cnlwb2ludCBkZXBlbmRzIG9uXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnUgPSAoY2h1bmtJZCkgPT4ge1xuXHQvLyByZXR1cm4gdXJsIGZvciBmaWxlbmFtZXMgYmFzZWQgb24gdGVtcGxhdGVcblx0cmV0dXJuIFwiXCIgKyBjaHVua0lkICsgXCIuZXVyb3N0YXRtYXAuanNcIjtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2J1aWxkL1wiOyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBjaHVua3Ncbi8vIFwiMVwiIG1lYW5zIFwiYWxyZWFkeSBsb2FkZWRcIlxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJzcmNfY29yZV9kb3JsaW5nX2Rvcmxpbmctd29ya2VyX2pzXCI6IDFcbn07XG5cbi8vIGltcG9ydFNjcmlwdHMgY2h1bmsgbG9hZGluZ1xudmFyIGluc3RhbGxDaHVuayA9IChkYXRhKSA9PiB7XG5cdHZhciBbY2h1bmtJZHMsIG1vcmVNb2R1bGVzLCBydW50aW1lXSA9IGRhdGE7XG5cdGZvcih2YXIgbW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8obW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuXHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tW21vZHVsZUlkXSA9IG1vcmVNb2R1bGVzW21vZHVsZUlkXTtcblx0XHR9XG5cdH1cblx0aWYocnVudGltZSkgcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0d2hpbGUoY2h1bmtJZHMubGVuZ3RoKVxuXHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkcy5wb3AoKV0gPSAxO1xuXHRwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbihkYXRhKTtcbn07XG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYuaSA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHQvLyBcIjFcIiBpcyB0aGUgc2lnbmFsIGZvciBcImFscmVhZHkgbG9hZGVkXCJcblx0aWYoIWluc3RhbGxlZENodW5rc1tjaHVua0lkXSkge1xuXHRcdGlmKHRydWUpIHsgLy8gYWxsIGNodW5rcyBoYXZlIEpTXG5cdFx0XHRpbXBvcnRTY3JpcHRzKF9fd2VicGFja19yZXF1aXJlX18ucCArIF9fd2VicGFja19yZXF1aXJlX18udShjaHVua0lkKSk7XG5cdFx0fVxuXHR9XG59O1xuXG52YXIgY2h1bmtMb2FkaW5nR2xvYmFsID0gc2VsZltcIndlYnBhY2tDaHVua2V1cm9zdGF0bWFwXCJdID0gc2VsZltcIndlYnBhY2tDaHVua2V1cm9zdGF0bWFwXCJdIHx8IFtdO1xudmFyIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uID0gY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpO1xuY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2ggPSBpbnN0YWxsQ2h1bms7XG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3QiLCJ2YXIgbmV4dCA9IF9fd2VicGFja19yZXF1aXJlX18ueDtcbl9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uZShcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2QzLWZvcmNlX3NyY19jb2xsaWRlX2pzLW5vZGVfbW9kdWxlc19kMy1mb3JjZV9zcmNfc2ltdWxhdGlvbl9qcy1ub2RlX21vZC0yYTVjNDJcIikudGhlbihuZXh0KTtcbn07IiwiIiwiLy8gcnVuIHN0YXJ0dXBcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy54KCk7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|