clientnode 4.0.1447 → 4.0.1448
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/dist/Lock.js +83 -69
- package/dist/Logger.js +163 -756
- package/dist/Semaphore.js +46 -56
- package/dist/array.js +337 -661
- package/dist/cli.js +37 -45
- package/dist/constants.js +110 -198
- package/dist/context.js +25 -265
- package/dist/cookie.js +48 -265
- package/dist/data-transfer.js +166 -775
- package/dist/datetime.js +241 -1107
- package/dist/domNode.js +277 -495
- package/dist/expression/evaluators.js +234 -1189
- package/dist/expression/helper.js +82 -102
- package/dist/expression/index.js +10 -1341
- package/dist/expression/indicator-functions.js +21 -316
- package/dist/expression/type.js +5 -1
- package/dist/filesystem.js +323 -349
- package/dist/function.js +51 -93
- package/dist/index.js +26 -3232
- package/dist/indicators.js +68 -512
- package/dist/module.js +99 -197
- package/dist/number.js +25 -491
- package/dist/object.js +783 -917
- package/dist/process.js +38 -261
- package/dist/property-types.js +96 -17
- package/dist/scope.js +56 -2092
- package/dist/string.js +603 -991
- package/dist/test-helper.js +171 -633
- package/dist/type.js +9 -4
- package/dist/utility.js +91 -372
- package/package.json +2 -2
- package/dist/Lock.d.ts +0 -39
- package/dist/Logger.d.ts +0 -102
- package/dist/Semaphore.d.ts +0 -29
- package/dist/array.d.ts +0 -150
- package/dist/bundle/Lock.js +0 -86
- package/dist/bundle/Logger.js +0 -778
- package/dist/bundle/Semaphore.js +0 -75
- package/dist/bundle/array.js +0 -776
- package/dist/bundle/cli.js +0 -59
- package/dist/bundle/constants.js +0 -214
- package/dist/bundle/context.js +0 -280
- package/dist/bundle/cookie.js +0 -301
- package/dist/bundle/data-transfer.js +0 -825
- package/dist/bundle/datetime.js +0 -1148
- package/dist/bundle/domNode.js +0 -549
- package/dist/bundle/expression/evaluators.js +0 -1228
- package/dist/bundle/expression/helper.js +0 -117
- package/dist/bundle/expression/index.js +0 -1357
- package/dist/bundle/expression/indicator-functions.js +0 -332
- package/dist/bundle/expression/type.js +0 -16
- package/dist/bundle/filesystem.js +0 -436
- package/dist/bundle/function.js +0 -117
- package/dist/bundle/index.js +0 -3249
- package/dist/bundle/indicators.js +0 -565
- package/dist/bundle/module.js +0 -213
- package/dist/bundle/number.js +0 -527
- package/dist/bundle/object.js +0 -1104
- package/dist/bundle/process.js +0 -291
- package/dist/bundle/property-types.js +0 -36
- package/dist/bundle/scope.js +0 -2121
- package/dist/bundle/string.js +0 -1213
- package/dist/bundle/test-helper.js +0 -802
- package/dist/bundle/type.js +0 -16
- package/dist/bundle/utility.js +0 -420
- package/dist/cli.d.ts +0 -31
- package/dist/compatible/Lock.js +0 -86
- package/dist/compatible/Logger.js +0 -778
- package/dist/compatible/Semaphore.js +0 -75
- package/dist/compatible/array.js +0 -776
- package/dist/compatible/cli.js +0 -59
- package/dist/compatible/constants.js +0 -214
- package/dist/compatible/context.js +0 -280
- package/dist/compatible/cookie.js +0 -301
- package/dist/compatible/data-transfer.js +0 -825
- package/dist/compatible/datetime.js +0 -1148
- package/dist/compatible/domNode.js +0 -549
- package/dist/compatible/expression/evaluators.js +0 -1228
- package/dist/compatible/expression/helper.js +0 -117
- package/dist/compatible/expression/index.js +0 -1357
- package/dist/compatible/expression/indicator-functions.js +0 -332
- package/dist/compatible/expression/type.js +0 -16
- package/dist/compatible/filesystem.js +0 -436
- package/dist/compatible/function.js +0 -117
- package/dist/compatible/index.js +0 -3249
- package/dist/compatible/indicators.js +0 -565
- package/dist/compatible/module.js +0 -213
- package/dist/compatible/number.js +0 -527
- package/dist/compatible/object.js +0 -1104
- package/dist/compatible/process.js +0 -291
- package/dist/compatible/property-types.js +0 -36
- package/dist/compatible/scope.js +0 -2121
- package/dist/compatible/string.js +0 -1213
- package/dist/compatible/test-helper.js +0 -802
- package/dist/compatible/type.js +0 -16
- package/dist/compatible/utility.js +0 -420
- package/dist/constants.d.ts +0 -99
- package/dist/context.d.ts +0 -8
- package/dist/cookie.d.ts +0 -31
- package/dist/data-transfer.d.ts +0 -45
- package/dist/datetime.d.ts +0 -37
- package/dist/domNode.d.ts +0 -82
- package/dist/expression/evaluators.d.ts +0 -55
- package/dist/expression/helper.d.ts +0 -4
- package/dist/expression/index.d.ts +0 -7
- package/dist/expression/indicator-functions.d.ts +0 -14
- package/dist/expression/type.d.ts +0 -70
- package/dist/filesystem.d.ts +0 -143
- package/dist/function.d.ts +0 -20
- package/dist/index.d.ts +0 -23
- package/dist/indicators.d.ts +0 -68
- package/dist/module.d.ts +0 -8
- package/dist/number.d.ts +0 -35
- package/dist/object.d.ts +0 -231
- package/dist/process.d.ts +0 -22
- package/dist/property-types.d.ts +0 -460
- package/dist/scope.d.ts +0 -44
- package/dist/string.d.ts +0 -312
- package/dist/test/Lock.d.ts +0 -1
- package/dist/test/Logger.d.ts +0 -1
- package/dist/test/Semaphore.d.ts +0 -1
- package/dist/test/array.d.ts +0 -1
- package/dist/test/cookie.d.ts +0 -1
- package/dist/test/data-transfer.d.ts +0 -1
- package/dist/test/datetime.d.ts +0 -1
- package/dist/test/domNode.d.ts +0 -1
- package/dist/test/expression/evaluators.d.ts +0 -1
- package/dist/test/expression/helper.d.ts +0 -1
- package/dist/test/expression/indicator-functions.d.ts +0 -1
- package/dist/test/filesystem.d.ts +0 -1
- package/dist/test/function.d.ts +0 -1
- package/dist/test/indicators.d.ts +0 -1
- package/dist/test/number.d.ts +0 -1
- package/dist/test/object.d.ts +0 -1
- package/dist/test/process.d.ts +0 -1
- package/dist/test/property-types.d.ts +0 -1
- package/dist/test/scope.d.ts +0 -1
- package/dist/test/string.d.ts +0 -1
- package/dist/test/utility.d.ts +0 -1
- package/dist/test-helper.d.ts +0 -143
- package/dist/type.d.ts +0 -230
- package/dist/utility.d.ts +0 -44
package/dist/filesystem.js
CHANGED
|
@@ -1,98 +1,9 @@
|
|
|
1
|
-
if(typeof window==='undefined'||window===null)var window=(typeof global==='undefined'||global===null)?{}:global;import * as __WEBPACK_EXTERNAL_MODULE_core_js_modules_es_array_includes_js_66c3fd7d__ from "core-js/modules/es.array.includes.js";
|
|
2
|
-
/******/ var __webpack_modules__ = ([
|
|
3
|
-
/* 0 */
|
|
4
|
-
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
|
5
|
-
|
|
6
|
-
var x = function(y) {
|
|
7
|
-
var x = {}; __webpack_require__.d(x, y); return x
|
|
8
|
-
}
|
|
9
|
-
var y = function(x) { return function() { return x; }; }
|
|
10
|
-
module.exports = x({ });
|
|
11
|
-
|
|
12
|
-
/***/ }),
|
|
13
|
-
/* 1 */
|
|
14
|
-
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
15
|
-
|
|
16
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
17
|
-
/* harmony export */ uJ: function() { return /* binding */ DEFAULT_ENCODING; }
|
|
18
|
-
/* harmony export */ });
|
|
19
|
-
/* unused harmony exports CLOSE_EVENT_NAMES, CONSOLE_METHODS, VALUE_COPY_SYMBOL, IGNORE_NULL_AND_UNDEFINED_SYMBOL, ABBREVIATIONS, ANIMATION_END_EVENT_NAMES, CLASS_TO_TYPE_MAPPING, KEY_CODES, KEYBOARD_CODES, LOCALES, PLAIN_OBJECT_PROTOTYPES, SPECIAL_REGEX_SEQUENCES, TRANSITION_END_EVENT_NAMES */
|
|
20
1
|
// #!/usr/bin/env babel-node
|
|
21
2
|
// -*- coding: utf-8 -*-
|
|
22
|
-
/** @module
|
|
23
|
-
|
|
24
|
-
[Project page](https://torben.website/clientnode)
|
|
25
|
-
|
|
26
|
-
Copyright Torben Sickert (info["~at~"]torben.website) 16.12.2012
|
|
27
|
-
|
|
28
|
-
License
|
|
29
|
-
-------
|
|
30
|
-
|
|
31
|
-
This library written by Torben Sickert stands under a creative commons
|
|
32
|
-
naming 3.0 unported license.
|
|
33
|
-
See https://creativecommons.org/licenses/by/3.0/deed.de
|
|
34
|
-
endregion
|
|
35
|
-
*/var DEFAULT_ENCODING="utf8";var CLOSE_EVENT_NAMES=(/* unused pure expression or super */ null && (["close","exit","SIGINT","SIGTERM","SIGQUIT","uncaughtException"]));var CONSOLE_METHODS=(/* unused pure expression or super */ null && (["debug","error","info","log","warn"]));var VALUE_COPY_SYMBOL=Symbol.for("clientnodeValue");var IGNORE_NULL_AND_UNDEFINED_SYMBOL=Symbol.for("clientnodeIgnoreNullAndUndefined");// Lists all known abbreviation for proper camel case to delimited and back
|
|
36
|
-
// conversion.
|
|
37
|
-
var ABBREVIATIONS=(/* unused pure expression or super */ null && (["html","id","url","us","de","api","href"]));// Saves a string with all css3 browser specific animation end event names.
|
|
38
|
-
var ANIMATION_END_EVENT_NAMES="animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd";// String representation to object type name mapping.
|
|
39
|
-
var CLASS_TO_TYPE_MAPPING=(/* unused pure expression or super */ null && ({"[object Array]":"array","[object Boolean]":"boolean","[object Date]":"date","[object Error]":"error","[object Function]":"function","[object Map]":"map","[object Number]":"number","[object Object]":"object","[object RegExp]":"regexp","[object Set]":"set","[object String]":"string"}));// Saves a mapping from key codes to their corresponding name.
|
|
40
|
-
var KEY_CODES=(/* unused pure expression or super */ null && ({BACKSPACE:8,SPACE:32,TAB:9,DELETE:46,ENTER:13,COMMA:188,PERIOD:190,END:35,ESCAPE:27,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,HOME:36,NUMPAD_ADD:107,NUMPAD_SUBTRACT:109,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,PAGE_UP:33,PAGE_DOWN:34,UP:38,DOWN:40,LEFT:37,RIGHT:39}));var KEYBOARD_CODES=(/* unused pure expression or super */ null && ({BACKSPACE:"Backspace",SPACE:"Space",TAB:"Tab",DELETE:"Delete",ENTER:"Enter",COMMA:"Comma",PERIOD:"Period",END:"End",ESCAPE:"Escape",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F111",F12:"F12",HOME:"Home",NUMPAD_ADD:"NumpadAdd",NUMPAD_SUBTRACT:"NumpadSubtract",NUMPAD_DECIMAL:"NumpadDecimal",NUMPAD_DIVIDE:"NumpadDivide",NUMPAD_ENTER:"NumpadEnter",NUMPAD_MULTIPLY:"NumpadMultiply",PAGE_UP:"PageUp",PAGE_DOWN:"PageUp",UP:"ArrowUp",DOWN:"ArrowDown",LEFT:"ArrowLeft",RIGHT:"ArrowUp"}));var LOCALES=(/* unused pure expression or super */ null && ([]));var PLAIN_OBJECT_PROTOTYPES=[Object.prototype];// A list of special regular expression symbols.
|
|
41
|
-
var SPECIAL_REGEX_SEQUENCES=(/* unused pure expression or super */ null && (["-","[","]","(",")","^","$","*","+",".","{","}"]));// Saves a string with all css3 browser specific transition end event names.
|
|
42
|
-
var TRANSITION_END_EVENT_NAMES="transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd";
|
|
43
|
-
|
|
44
|
-
/***/ }),
|
|
45
|
-
/* 2 */,
|
|
46
|
-
/* 3 */,
|
|
47
|
-
/* 4 */
|
|
48
|
-
/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
49
|
-
|
|
50
|
-
__webpack_require__.a(__webpack_module__, async function (__webpack_handle_async_dependencies__, __webpack_async_result__) { try {
|
|
51
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
52
|
-
/* harmony export */ tE: function() { return /* binding */ NOOP; }
|
|
53
|
-
/* harmony export */ });
|
|
54
|
-
/* unused harmony exports globalContext, setGlobalContext, MAXIMAL_NUMBER_OF_ITERATIONS, mockConsole */
|
|
55
|
-
/* unused harmony import specifier */ var CONSOLE_METHODS;
|
|
56
|
-
/* harmony import */ var _module_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5);
|
|
57
|
-
var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_module_js__WEBPACK_IMPORTED_MODULE_0__]);
|
|
58
|
-
var __webpack_async_dependencies_result__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);
|
|
59
|
-
_module_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_async_dependencies_result__[0];
|
|
60
|
-
// #!/usr/bin/env babel-node
|
|
61
|
-
// -*- coding: utf-8 -*-
|
|
62
|
-
/** @module context *//* !
|
|
63
|
-
region header
|
|
64
|
-
[Project page](https://torben.website/clientnode)
|
|
65
|
-
|
|
66
|
-
Copyright Torben Sickert (info["~at~"]torben.website) 16.12.2012
|
|
67
|
-
|
|
68
|
-
License
|
|
69
|
-
-------
|
|
70
|
-
|
|
71
|
-
This library written by Torben Sickert stands under a creative commons
|
|
72
|
-
naming 3.0 unported license.
|
|
73
|
-
See https://creativecommons.org/licenses/by/3.0/deed.de
|
|
74
|
-
endregion
|
|
75
|
-
*/var _optionalRequire$defa,_optionalRequire;function _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var _n=0,F=function F(){};return{s:F,n:function n(){return _n>=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t.return||t.return()}finally{if(u)throw o}}}}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}var globalContext=(0,_module_js__WEBPACK_IMPORTED_MODULE_0__/* .determineGlobalContext */ .a8)();var setGlobalContext=function setGlobalContext(context){globalContext=context};globalContext.fetch=globalContext.fetch?globalContext.fetch.bind(globalContext):(_optionalRequire$defa=(_optionalRequire=(0,_module_js__WEBPACK_IMPORTED_MODULE_0__/* .optionalRequire */ .I5)("node-fetch"))===null||_optionalRequire===void 0?void 0:_optionalRequire.default)!==null&&_optionalRequire$defa!==void 0?_optionalRequire$defa:function(){for(var _len=arguments.length,parameters=new Array(_len),_key=0;_key<_len;_key++){parameters[_key]=arguments[_key]}return (0,_module_js__WEBPACK_IMPORTED_MODULE_0__/* .optionalImport */ .Sw)(/* webpackIgnore: true */"node-fetch").then(function(module){var _ref;return(_ref=module).default.apply(_ref,parameters)})};var MAXIMAL_NUMBER_OF_ITERATIONS=(/* unused pure expression or super */ null && ({value:100}));// A no-op dummy function.
|
|
76
|
-
var NOOP=function NOOP(){// Do nothing.
|
|
77
|
-
};var mockConsole=function mockConsole(){// Avoid errors in browsers that lack a console.
|
|
78
|
-
if(!Object.prototype.hasOwnProperty.call(globalContext,"console"))globalContext.console={};if(!globalContext.console)globalContext.console={};var _iterator=_createForOfIteratorHelper(CONSOLE_METHODS),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var methodName=_step.value;if(!(methodName in globalContext.console))globalContext.console[methodName]=NOOP}}catch(err){_iterator.e(err)}finally{_iterator.f()}};
|
|
79
|
-
__webpack_async_result__();
|
|
80
|
-
} catch(e) { __webpack_async_result__(e); } });
|
|
3
|
+
/** @module filesystem */
|
|
4
|
+
'use strict';
|
|
81
5
|
|
|
82
|
-
|
|
83
|
-
/* 5 */
|
|
84
|
-
/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
85
|
-
|
|
86
|
-
__webpack_require__.a(__webpack_module__, async function (__webpack_handle_async_dependencies__, __webpack_async_result__) { try {
|
|
87
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
88
|
-
/* harmony export */ I5: function() { return /* binding */ optionalRequire; },
|
|
89
|
-
/* harmony export */ Sw: function() { return /* binding */ optionalImport; },
|
|
90
|
-
/* harmony export */ a8: function() { return /* binding */ determineGlobalContext; }
|
|
91
|
-
/* harmony export */ });
|
|
92
|
-
/* unused harmony exports isImportSyntaxSupported, currentRequire, clearRequireCache, isolatedRequire */
|
|
93
|
-
// #!/usr/bin/env babel-node
|
|
94
|
-
// -*- coding: utf-8 -*-
|
|
95
|
-
/** @module module *//* !
|
|
6
|
+
/* !
|
|
96
7
|
region header
|
|
97
8
|
[Project page](https://torben.website/clientnode)
|
|
98
9
|
|
|
@@ -105,72 +16,80 @@ __webpack_require__.a(__webpack_module__, async function (__webpack_handle_async
|
|
|
105
16
|
naming 3.0 unported license.
|
|
106
17
|
See https://creativecommons.org/licenses/by/3.0/deed.de
|
|
107
18
|
endregion
|
|
108
|
-
*/
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
19
|
+
*/
|
|
20
|
+
import "core-js/modules/es.array.includes.js";
|
|
21
|
+
import "core-js/modules/es.array.push.js";
|
|
22
|
+
import { DEFAULT_ENCODING } from "./constants.js";
|
|
23
|
+
import { NOOP } from "./context.js";
|
|
24
|
+
import { optionalImport } from "./module.js";
|
|
25
|
+
export const imports = {
|
|
26
|
+
fs: null,
|
|
27
|
+
fsPromises: null,
|
|
28
|
+
path: null
|
|
29
|
+
};
|
|
30
|
+
let mkdirSync;
|
|
31
|
+
let readdirSync;
|
|
32
|
+
let readFileSync;
|
|
33
|
+
let statSync;
|
|
34
|
+
let writeFileSync;
|
|
35
|
+
const fsImportPromise = optionalImport('fs');
|
|
36
|
+
void fsImportPromise.then(module => {
|
|
37
|
+
imports.fs = module;
|
|
38
|
+
if (module) {
|
|
39
|
+
mkdirSync = module.mkdirSync;
|
|
40
|
+
readdirSync = module.readdirSync;
|
|
41
|
+
readFileSync = module.readFileSync;
|
|
42
|
+
statSync = module.statSync;
|
|
43
|
+
writeFileSync = module.writeFileSync;
|
|
44
|
+
} else {
|
|
45
|
+
mkdirSync = null;
|
|
46
|
+
readdirSync = null;
|
|
47
|
+
readFileSync = null;
|
|
48
|
+
statSync = null;
|
|
49
|
+
writeFileSync = null;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
let mkdir;
|
|
53
|
+
let readdir;
|
|
54
|
+
let readFile;
|
|
55
|
+
let stat;
|
|
56
|
+
let writeFile;
|
|
57
|
+
const fsPromisesImportPromise = optionalImport('fs/promises');
|
|
58
|
+
void fsPromisesImportPromise.then(module => {
|
|
59
|
+
imports.fsPromises = module;
|
|
60
|
+
if (module) {
|
|
61
|
+
mkdir = module.mkdir;
|
|
62
|
+
readdir = module.readdir;
|
|
63
|
+
readFile = module.readFile;
|
|
64
|
+
stat = module.stat;
|
|
65
|
+
writeFile = module.writeFile;
|
|
66
|
+
} else {
|
|
67
|
+
mkdir = null;
|
|
68
|
+
readdir = null;
|
|
69
|
+
readFile = null;
|
|
70
|
+
stat = null;
|
|
71
|
+
writeFile = null;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
let basename;
|
|
75
|
+
let join;
|
|
76
|
+
let resolve;
|
|
77
|
+
const pathImportPromise = optionalImport('path');
|
|
78
|
+
void pathImportPromise.then(module => {
|
|
79
|
+
imports.path = module;
|
|
80
|
+
if (module) {
|
|
81
|
+
basename = module.basename;
|
|
82
|
+
join = module.join;
|
|
83
|
+
resolve = module.resolve;
|
|
84
|
+
} else {
|
|
85
|
+
basename = null;
|
|
86
|
+
join = null;
|
|
87
|
+
resolve = null;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
export const importsPromise = Promise.all([fsImportPromise, fsPromisesImportPromise, pathImportPromise]);
|
|
125
91
|
|
|
126
|
-
|
|
127
|
-
/* 6 */,
|
|
128
|
-
/* 7 */,
|
|
129
|
-
/* 8 */,
|
|
130
|
-
/* 9 */,
|
|
131
|
-
/* 10 */,
|
|
132
|
-
/* 11 */
|
|
133
|
-
/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
134
|
-
|
|
135
|
-
__webpack_require__.a(__webpack_module__, async function (__webpack_handle_async_dependencies__, __webpack_async_result__) { try {
|
|
136
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
137
|
-
/* harmony export */ Ee: function() { return /* binding */ importsPromise; },
|
|
138
|
-
/* harmony export */ VW: function() { return /* binding */ imports; },
|
|
139
|
-
/* harmony export */ WY: function() { return /* binding */ isFileSync; },
|
|
140
|
-
/* harmony export */ Xp: function() { return /* binding */ copyFileSync; },
|
|
141
|
-
/* harmony export */ ZP: function() { return /* binding */ isDirectorySync; },
|
|
142
|
-
/* harmony export */ fo: function() { return /* binding */ isFile; },
|
|
143
|
-
/* harmony export */ hu: function() { return /* binding */ _walkDirectoryRecursivelySync; },
|
|
144
|
-
/* harmony export */ m3: function() { return /* binding */ copyFile; },
|
|
145
|
-
/* harmony export */ uD: function() { return /* binding */ copyDirectoryRecursiveSync; },
|
|
146
|
-
/* harmony export */ vX: function() { return /* binding */ copyDirectoryRecursive; },
|
|
147
|
-
/* harmony export */ wd: function() { return /* binding */ isDirectory; },
|
|
148
|
-
/* harmony export */ y3: function() { return /* binding */ _walkDirectoryRecursively; }
|
|
149
|
-
/* harmony export */ });
|
|
150
|
-
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
|
|
151
|
-
/* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1);
|
|
152
|
-
/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
|
|
153
|
-
/* harmony import */ var _module_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5);
|
|
154
|
-
var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_context_js__WEBPACK_IMPORTED_MODULE_2__, _module_js__WEBPACK_IMPORTED_MODULE_3__]);
|
|
155
|
-
var __webpack_async_dependencies_result__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);
|
|
156
|
-
_context_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_async_dependencies_result__[0];
|
|
157
|
-
_module_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_async_dependencies_result__[1];
|
|
158
|
-
// #!/usr/bin/env babel-node
|
|
159
|
-
// -*- coding: utf-8 -*-
|
|
160
|
-
/** @module filesystem *//* !
|
|
161
|
-
region header
|
|
162
|
-
[Project page](https://torben.website/clientnode)
|
|
163
|
-
|
|
164
|
-
Copyright Torben Sickert (info["~at~"]torben.website) 16.12.2012
|
|
165
|
-
|
|
166
|
-
License
|
|
167
|
-
-------
|
|
168
|
-
|
|
169
|
-
This library written by Torben Sickert stands under a creative commons
|
|
170
|
-
naming 3.0 unported license.
|
|
171
|
-
See https://creativecommons.org/licenses/by/3.0/deed.de
|
|
172
|
-
endregion
|
|
173
|
-
*/function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _regenerator(){/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */var e,t,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof Generator?n:Generator,u=Object.create(c.prototype);return _regeneratorDefine2(u,"_invoke",function(r,n,o){var i,c,u,f=0,p=o||[],y=!1,G={p:0,n:0,v:e,a:d,f:d.bind(e,4),d:function d(t,r){return i=t,c=0,u=e,G.n=r,a}};function d(r,n){for(c=r,u=n,t=0;!y&&f&&!o&&t<p.length;t++){var o,i=p[t],d=G.p,l=i[2];r>3?(o=l===n)&&(u=i[(c=i[4])?5:(c=3,3)],i[4]=i[5]=e):i[0]<=d&&((o=r<2&&d<i[1])?(c=0,G.v=n,G.n=i[1]):d<l&&(o=r<3||i[0]>n||n>l)&&(i[4]=r,i[5]=n,G.n=l,c=0))}if(o||r>1)return a;throw y=!0,n}return function(o,p,l){if(f>1)throw TypeError("Generator is already running");for(y&&1===p&&d(p,l),c=p,u=l;(t=c<2?e:u)||!y;){i||(c?c<3?(c>1&&(G.n=-1),d(c,u)):G.n=u:G.v=u);try{if(f=2,i){if(c||(o="next"),t=i[o]){if(!(t=t.call(i,u)))throw TypeError("iterator result is not an object");if(!t.done)return t;u=t.value,c<2&&(c=0)}else 1===c&&(t=i.return)&&t.call(i),c<2&&(u=TypeError("The iterator does not provide a '"+o+"' method"),c=1);i=e}else if((t=(y=G.n<0)?u:r.call(n,G))!==a)break}catch(t){i=e,c=1,u=t}finally{f=1}}return{value:t,done:y}}}(r,o,i),!0),u}var a={};function Generator(){}function GeneratorFunction(){}function GeneratorFunctionPrototype(){}t=Object.getPrototypeOf;var c=[][n]?t(t([][n]())):(_regeneratorDefine2(t={},n,function(){return this}),t),u=GeneratorFunctionPrototype.prototype=Generator.prototype=Object.create(c);function f(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,GeneratorFunctionPrototype):(e.__proto__=GeneratorFunctionPrototype,_regeneratorDefine2(e,o,"GeneratorFunction")),e.prototype=Object.create(u),e}return GeneratorFunction.prototype=GeneratorFunctionPrototype,_regeneratorDefine2(u,"constructor",GeneratorFunctionPrototype),_regeneratorDefine2(GeneratorFunctionPrototype,"constructor",GeneratorFunction),GeneratorFunction.displayName="GeneratorFunction",_regeneratorDefine2(GeneratorFunctionPrototype,o,"GeneratorFunction"),_regeneratorDefine2(u),_regeneratorDefine2(u,o,"Generator"),_regeneratorDefine2(u,n,function(){return this}),_regeneratorDefine2(u,"toString",function(){return"[object Generator]"}),(_regenerator=function _regenerator(){return{w:i,m:f}})()}function _regeneratorDefine2(e,r,n,t){var i=Object.defineProperty;try{i({},"",{})}catch(e){i=0}_regeneratorDefine2=function _regeneratorDefine(e,r,n,t){function o(r,n){_regeneratorDefine2(e,r,function(e){return this._invoke(r,n,e)})}r?i?i(e,r,{value:n,enumerable:!t,configurable:!t,writable:!t}):e[r]=n:(o("next",0),o("throw",1),o("return",2))},_regeneratorDefine2(e,r,n,t)}function _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var _n=0,F=function F(){};return{s:F,n:function n(){return _n>=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t.return||t.return()}finally{if(u)throw o}}}}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function asyncGeneratorStep(n,t,e,r,o,a,c){try{var i=n[a](c),u=i.value}catch(n){return void e(n)}i.done?t(u):Promise.resolve(u).then(r,o)}function _asyncToGenerator(n){return function(){var t=this,e=arguments;return new Promise(function(r,o){var a=n.apply(t,e);function _next(n){asyncGeneratorStep(a,r,o,_next,_throw,"next",n)}function _throw(n){asyncGeneratorStep(a,r,o,_next,_throw,"throw",n)}_next(void 0)})}}var imports={fs:null,fsPromises:null,path:null};var mkdirSync;var readdirSync;var readFileSync;var statSync;var writeFileSync;var fsImportPromise=(0,_module_js__WEBPACK_IMPORTED_MODULE_3__/* .optionalImport */ .Sw)("fs");void fsImportPromise.then(function(module){imports.fs=module;if(module){mkdirSync=module.mkdirSync;readdirSync=module.readdirSync;readFileSync=module.readFileSync;statSync=module.statSync;writeFileSync=module.writeFileSync}else{mkdirSync=null;readdirSync=null;readFileSync=null;statSync=null;writeFileSync=null}});var mkdir;var readdir;var readFile;var stat;var writeFile;var fsPromisesImportPromise=(0,_module_js__WEBPACK_IMPORTED_MODULE_3__/* .optionalImport */ .Sw)("fs/promises");void fsPromisesImportPromise.then(function(module){imports.fsPromises=module;if(module){mkdir=module.mkdir;readdir=module.readdir;readFile=module.readFile;stat=module.stat;writeFile=module.writeFile}else{mkdir=null;readdir=null;readFile=null;stat=null;writeFile=null}});var basename;var join;var resolve;var pathImportPromise=(0,_module_js__WEBPACK_IMPORTED_MODULE_3__/* .optionalImport */ .Sw)("path");void pathImportPromise.then(function(module){imports.path=module;if(module){basename=module.basename;join=module.join;resolve=module.resolve}else{basename=null;join=null;resolve=null}});var importsPromise=Promise.all([fsImportPromise,fsPromisesImportPromise,pathImportPromise]);/**
|
|
92
|
+
/**
|
|
174
93
|
* Copies given source directory via path to given target directory location
|
|
175
94
|
* with same target name as source file has or copy to given complete target
|
|
176
95
|
* directory path.
|
|
@@ -183,7 +102,36 @@ _module_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_async_dependencies_result__[
|
|
|
183
102
|
* @param readOptions - Options to use for reading source file.
|
|
184
103
|
* @param writeOptions - Options to use for writing to target file.
|
|
185
104
|
* @returns Promise holding the determined target directory path.
|
|
186
|
-
*/
|
|
105
|
+
*/
|
|
106
|
+
export const copyDirectoryRecursive = async (sourcePath, targetPath, contents = false, callback = NOOP, readOptions = {
|
|
107
|
+
encoding: null,
|
|
108
|
+
flag: 'r'
|
|
109
|
+
}, writeOptions = {
|
|
110
|
+
encoding: DEFAULT_ENCODING,
|
|
111
|
+
flag: 'w',
|
|
112
|
+
mode: 0o666
|
|
113
|
+
}) => {
|
|
114
|
+
if (!(basename && join && mkdir && resolve)) throw new Error('Could not load filesystem functions.');
|
|
115
|
+
sourcePath = resolve(sourcePath);
|
|
116
|
+
if (!contents && (await isDirectory(targetPath))) targetPath = resolve(targetPath, basename(sourcePath));
|
|
117
|
+
|
|
118
|
+
// NOTE: Check if folder needs to be created or integrated.
|
|
119
|
+
try {
|
|
120
|
+
await mkdir(targetPath);
|
|
121
|
+
} catch (error) {
|
|
122
|
+
if (error.code !== 'EEXIST') throw error;
|
|
123
|
+
}
|
|
124
|
+
for (const currentSourceFile of await walkDirectoryRecursively(sourcePath, callback)) {
|
|
125
|
+
const currentTargetPath = join(targetPath, currentSourceFile.path.substring(sourcePath.length));
|
|
126
|
+
if (currentSourceFile.stats?.isDirectory()) try {
|
|
127
|
+
await mkdir(currentTargetPath);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
if (error.code !== 'EEXIST') throw error;
|
|
130
|
+
} else await copyFile(currentSourceFile.path, currentTargetPath, readOptions, writeOptions);
|
|
131
|
+
}
|
|
132
|
+
return targetPath;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
187
135
|
* Copies given source directory via path to given target directory location
|
|
188
136
|
* with same target name as source file has or copy to given complete target
|
|
189
137
|
* directory path.
|
|
@@ -196,8 +144,36 @@ _module_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_async_dependencies_result__[
|
|
|
196
144
|
* @param readOptions - Options to use for reading source file.
|
|
197
145
|
* @param writeOptions - Options to use for writing to target file.
|
|
198
146
|
* @returns Determined target directory path.
|
|
199
|
-
*/
|
|
200
|
-
|
|
147
|
+
*/
|
|
148
|
+
export const copyDirectoryRecursiveSync = (sourcePath, targetPath, contents = false, callback = NOOP, readOptions = {
|
|
149
|
+
encoding: null,
|
|
150
|
+
flag: 'r'
|
|
151
|
+
}, writeOptions = {
|
|
152
|
+
encoding: DEFAULT_ENCODING,
|
|
153
|
+
flag: 'w',
|
|
154
|
+
mode: 0o666
|
|
155
|
+
}) => {
|
|
156
|
+
if (!(basename && join && mkdirSync && resolve)) throw new Error('Could not load filesystem functions.');
|
|
157
|
+
sourcePath = resolve(sourcePath);
|
|
158
|
+
if (!contents && isDirectorySync(targetPath)) targetPath = resolve(targetPath, basename(sourcePath));
|
|
159
|
+
|
|
160
|
+
// NOTE: Try/Check if target folder needs to be created.
|
|
161
|
+
try {
|
|
162
|
+
mkdirSync(targetPath);
|
|
163
|
+
} catch (error) {
|
|
164
|
+
if (error.code !== 'EEXIST') throw error;
|
|
165
|
+
}
|
|
166
|
+
for (const currentSourceFile of walkDirectoryRecursivelySync(sourcePath, callback)) {
|
|
167
|
+
const currentTargetPath = join(targetPath, currentSourceFile.path.substring(sourcePath.length));
|
|
168
|
+
if (currentSourceFile.stats?.isDirectory()) try {
|
|
169
|
+
mkdirSync(currentTargetPath);
|
|
170
|
+
} catch (error) {
|
|
171
|
+
if (error.code !== 'EEXIST') throw error;
|
|
172
|
+
} else copyFileSync(currentSourceFile.path, currentTargetPath, readOptions, writeOptions);
|
|
173
|
+
}
|
|
174
|
+
return targetPath;
|
|
175
|
+
};
|
|
176
|
+
/**
|
|
201
177
|
* Copies given source file via path to given target directory location with
|
|
202
178
|
* same target name as source file has or copy to given complete target file
|
|
203
179
|
* path.
|
|
@@ -206,7 +182,26 @@ try{mkdirSync(targetPath)}catch(error){if(error.code!=="EEXIST")throw error}for(
|
|
|
206
182
|
* @param readOptions - Options to use for reading source file.
|
|
207
183
|
* @param writeOptions - Options to use for writing to target file.
|
|
208
184
|
* @returns Determined target file path.
|
|
209
|
-
*/
|
|
185
|
+
*/
|
|
186
|
+
export const copyFile = async (sourcePath, targetPath, readOptions = {
|
|
187
|
+
encoding: null,
|
|
188
|
+
flag: 'r'
|
|
189
|
+
}, writeOptions = {
|
|
190
|
+
encoding: DEFAULT_ENCODING,
|
|
191
|
+
flag: 'w',
|
|
192
|
+
mode: 0o666
|
|
193
|
+
}) => {
|
|
194
|
+
if (!(basename && readFile && resolve && writeFile)) throw new Error('Could not load filesystem functions.');
|
|
195
|
+
|
|
196
|
+
/*
|
|
197
|
+
NOTE: If target path references a directory a new file with the same
|
|
198
|
+
name will be created.
|
|
199
|
+
*/
|
|
200
|
+
if (await isDirectory(targetPath)) targetPath = resolve(targetPath, basename(sourcePath));
|
|
201
|
+
await writeFile(targetPath, await readFile(sourcePath, readOptions), writeOptions);
|
|
202
|
+
return targetPath;
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
210
205
|
* Copies given source file via path to given target directory location with
|
|
211
206
|
* same target name as source file has or copy to given complete target file
|
|
212
207
|
* path.
|
|
@@ -215,26 +210,82 @@ try{mkdirSync(targetPath)}catch(error){if(error.code!=="EEXIST")throw error}for(
|
|
|
215
210
|
* @param readOptions - Options to use for reading source file.
|
|
216
211
|
* @param writeOptions - Options to use for writing to target file.
|
|
217
212
|
* @returns Determined target file path.
|
|
218
|
-
*/
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
213
|
+
*/
|
|
214
|
+
export const copyFileSync = (sourcePath, targetPath, readOptions = {
|
|
215
|
+
encoding: null,
|
|
216
|
+
flag: 'r'
|
|
217
|
+
}, writeOptions = {
|
|
218
|
+
encoding: DEFAULT_ENCODING,
|
|
219
|
+
flag: 'w',
|
|
220
|
+
mode: 0o666
|
|
221
|
+
}) => {
|
|
222
|
+
if (!(basename && readFileSync && resolve && writeFileSync)) throw new Error('Could not load filesystem functions.');
|
|
223
|
+
|
|
224
|
+
/*
|
|
225
|
+
NOTE: If target path references a directory a new file with the same
|
|
226
|
+
name will be created.
|
|
227
|
+
*/
|
|
228
|
+
if (isDirectorySync(targetPath)) targetPath = resolve(targetPath, basename(sourcePath));
|
|
229
|
+
writeFileSync(targetPath, readFileSync(sourcePath, readOptions), writeOptions);
|
|
230
|
+
return targetPath;
|
|
231
|
+
};
|
|
232
|
+
/**
|
|
222
233
|
* Checks if given path points to a valid directory.
|
|
223
234
|
* @param filePath - Path to directory.
|
|
224
235
|
* @returns A promise holding a boolean which indicates directory existence.
|
|
225
|
-
*/
|
|
236
|
+
*/
|
|
237
|
+
export const isDirectory = async filePath => {
|
|
238
|
+
if (!stat) throw new Error('Could not load filesystem functions.');
|
|
239
|
+
try {
|
|
240
|
+
return (await stat(filePath)).isDirectory();
|
|
241
|
+
} catch (error) {
|
|
242
|
+
if (Object.prototype.hasOwnProperty.call(error, 'code') && ['ENOENT', 'ENOTDIR'].includes(error.code)) return false;
|
|
243
|
+
throw error;
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
/**
|
|
226
247
|
* Checks if given path points to a valid directory.
|
|
227
248
|
* @param filePath - Path to directory.
|
|
228
249
|
* @returns A boolean which indicates directory existence.
|
|
229
|
-
*/
|
|
250
|
+
*/
|
|
251
|
+
export const isDirectorySync = filePath => {
|
|
252
|
+
if (!statSync) throw new Error('Could not load filesystem functions.');
|
|
253
|
+
try {
|
|
254
|
+
return statSync(filePath).isDirectory();
|
|
255
|
+
} catch (error) {
|
|
256
|
+
if (Object.prototype.hasOwnProperty.call(error, 'code') && ['ENOENT', 'ENOTDIR'].includes(error.code)) return false;
|
|
257
|
+
throw error;
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
/**
|
|
230
261
|
* Checks if given path points to a valid file.
|
|
231
262
|
* @param filePath - Path to directory.
|
|
232
263
|
* @returns A promise holding a boolean which indicates directory existence.
|
|
233
|
-
*/
|
|
264
|
+
*/
|
|
265
|
+
export const isFile = async filePath => {
|
|
266
|
+
if (!stat) throw new Error('Could not load filesystem functions.');
|
|
267
|
+
try {
|
|
268
|
+
return (await stat(filePath)).isFile();
|
|
269
|
+
} catch (error) {
|
|
270
|
+
if (Object.prototype.hasOwnProperty.call(error, 'code') && ['ENOENT', 'ENOTDIR'].includes(error.code)) return false;
|
|
271
|
+
throw error;
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
/**
|
|
234
275
|
* Checks if given path points to a valid file.
|
|
235
276
|
* @param filePath - Path to file.
|
|
236
277
|
* @returns A boolean which indicates file existence.
|
|
237
|
-
*/
|
|
278
|
+
*/
|
|
279
|
+
export const isFileSync = filePath => {
|
|
280
|
+
if (!statSync) throw new Error('Could not load filesystem functions.');
|
|
281
|
+
try {
|
|
282
|
+
return statSync(filePath).isFile();
|
|
283
|
+
} catch (error) {
|
|
284
|
+
if (Object.prototype.hasOwnProperty.call(error, 'code') && ['ENOENT', 'ENOTDIR'].includes(error.code)) return false;
|
|
285
|
+
throw error;
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
/**
|
|
238
289
|
* Iterates through given directory structure recursively and calls given
|
|
239
290
|
* callback for each found file. Callback gets file path and corresponding stat
|
|
240
291
|
* object as argument.
|
|
@@ -247,10 +298,58 @@ try{mkdirSync(targetPath)}catch(error){if(error.code!=="EEXIST")throw error}for(
|
|
|
247
298
|
* "false" no traversing into that directory will occur.
|
|
248
299
|
* @param options - Options to use for nested "readdir" calls.
|
|
249
300
|
* @returns A promise holding the determined files.
|
|
250
|
-
*/
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
301
|
+
*/
|
|
302
|
+
export const walkDirectoryRecursively = async (directoryPath, callback = null, options = DEFAULT_ENCODING) => {
|
|
303
|
+
if (!(readdir && resolve && stat)) throw new Error('Could not load filesystem functions.');
|
|
304
|
+
const files = [];
|
|
305
|
+
for (const directoryEntry of await readdir(directoryPath, typeof options === 'string' ? {
|
|
306
|
+
encoding: options,
|
|
307
|
+
withFileTypes: true
|
|
308
|
+
} : {
|
|
309
|
+
...options,
|
|
310
|
+
withFileTypes: true
|
|
311
|
+
})) {
|
|
312
|
+
const filePath = resolve(directoryPath, directoryEntry.name);
|
|
313
|
+
const file = {
|
|
314
|
+
directoryPath,
|
|
315
|
+
directoryEntry,
|
|
316
|
+
error: null,
|
|
317
|
+
name: directoryEntry.name,
|
|
318
|
+
path: filePath,
|
|
319
|
+
stats: null
|
|
320
|
+
};
|
|
321
|
+
try {
|
|
322
|
+
file.stats = await stat(filePath);
|
|
323
|
+
} catch (error) {
|
|
324
|
+
file.error = error;
|
|
325
|
+
}
|
|
326
|
+
files.push(file);
|
|
327
|
+
}
|
|
328
|
+
if (callback)
|
|
329
|
+
/*
|
|
330
|
+
NOTE: Directories and have to be iterated first to be able to
|
|
331
|
+
avoid deeper unwanted traversing.
|
|
332
|
+
*/
|
|
333
|
+
files.sort((firstFile, secondFile) => {
|
|
334
|
+
if (firstFile.stats?.isDirectory()) {
|
|
335
|
+
if (secondFile.stats?.isDirectory()) return 0;
|
|
336
|
+
return -1;
|
|
337
|
+
}
|
|
338
|
+
if (secondFile.stats?.isDirectory()) return 1;
|
|
339
|
+
return 0;
|
|
340
|
+
});
|
|
341
|
+
let finalFiles = [];
|
|
342
|
+
for (const file of files) {
|
|
343
|
+
finalFiles.push(file);
|
|
344
|
+
let result = callback ? callback(file) : undefined;
|
|
345
|
+
if (result === null) break;
|
|
346
|
+
if (typeof result === 'object' && 'then' in result) result = await result;
|
|
347
|
+
if (result === null) break;
|
|
348
|
+
if (result !== false && file.stats?.isDirectory()) finalFiles = finalFiles.concat(await walkDirectoryRecursively(file.path, callback, options));
|
|
349
|
+
}
|
|
350
|
+
return finalFiles;
|
|
351
|
+
};
|
|
352
|
+
/**
|
|
254
353
|
* Iterates through given directory structure recursively and calls given
|
|
255
354
|
* callback for each found file. Callback gets file path and corresponding
|
|
256
355
|
* stats object as argument.
|
|
@@ -258,179 +357,54 @@ try{mkdirSync(targetPath)}catch(error){if(error.code!=="EEXIST")throw error}for(
|
|
|
258
357
|
* @param callback - Function to invoke for each traversed file.
|
|
259
358
|
* @param options - Options to use for nested "readdir" calls.
|
|
260
359
|
* @returns Determined list if all files.
|
|
261
|
-
*/
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
/******/ if(dep !== null && typeof dep === "object") {
|
|
312
|
-
/******/
|
|
313
|
-
/******/ if(dep[webpackQueues]) return dep;
|
|
314
|
-
/******/ if(dep.then) {
|
|
315
|
-
/******/ var queue = [];
|
|
316
|
-
/******/ queue.d = 0;
|
|
317
|
-
/******/ dep.then(function(r) {
|
|
318
|
-
/******/ obj[webpackExports] = r;
|
|
319
|
-
/******/ resolveQueue(queue);
|
|
320
|
-
/******/ }, function(e) {
|
|
321
|
-
/******/ obj[webpackError] = e;
|
|
322
|
-
/******/ resolveQueue(queue);
|
|
323
|
-
/******/ });
|
|
324
|
-
/******/ var obj = {};
|
|
325
|
-
/******/
|
|
326
|
-
/******/ obj[webpackQueues] = function(fn) { fn(queue); };
|
|
327
|
-
/******/ return obj;
|
|
328
|
-
/******/ }
|
|
329
|
-
/******/ }
|
|
330
|
-
/******/ var ret = {};
|
|
331
|
-
/******/ ret[webpackQueues] = function() {};
|
|
332
|
-
/******/ ret[webpackExports] = dep;
|
|
333
|
-
/******/ return ret;
|
|
334
|
-
/******/ }); };
|
|
335
|
-
/******/ __webpack_require__.a = function(module, body, hasAwait) {
|
|
336
|
-
/******/ var queue;
|
|
337
|
-
/******/ hasAwait && ((queue = []).d = -1);
|
|
338
|
-
/******/ var depQueues = new Set();
|
|
339
|
-
/******/ var exports = module.exports;
|
|
340
|
-
/******/ var currentDeps;
|
|
341
|
-
/******/ var outerResolve;
|
|
342
|
-
/******/ var reject;
|
|
343
|
-
/******/ var promise = new Promise(function(resolve, rej) {
|
|
344
|
-
/******/ reject = rej;
|
|
345
|
-
/******/ outerResolve = resolve;
|
|
346
|
-
/******/ });
|
|
347
|
-
/******/ promise[webpackExports] = exports;
|
|
348
|
-
/******/ promise[webpackQueues] = function(fn) { queue && fn(queue), depQueues.forEach(fn), promise["catch"](function() {}); };
|
|
349
|
-
/******/ module.exports = promise;
|
|
350
|
-
/******/ var handle = function(deps) {
|
|
351
|
-
/******/ currentDeps = wrapDeps(deps);
|
|
352
|
-
/******/ var fn;
|
|
353
|
-
/******/ var getResult = function() { return currentDeps.map(function(d) {
|
|
354
|
-
/******/
|
|
355
|
-
/******/ if(d[webpackError]) throw d[webpackError];
|
|
356
|
-
/******/ return d[webpackExports];
|
|
357
|
-
/******/ }); }
|
|
358
|
-
/******/ var promise = new Promise(function(resolve) {
|
|
359
|
-
/******/ fn = function() { resolve(getResult); };
|
|
360
|
-
/******/ fn.r = 0;
|
|
361
|
-
/******/ var fnQueue = function(q) { q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn))); };
|
|
362
|
-
/******/ currentDeps.map(function(dep) { dep[webpackQueues](fnQueue); });
|
|
363
|
-
/******/ });
|
|
364
|
-
/******/ return fn.r ? promise : getResult();
|
|
365
|
-
/******/ }
|
|
366
|
-
/******/ var done = function(err) { (err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue); }
|
|
367
|
-
/******/ body(handle, done);
|
|
368
|
-
/******/ queue && queue.d < 0 && (queue.d = 0);
|
|
369
|
-
/******/ };
|
|
370
|
-
/******/ }();
|
|
371
|
-
/******/
|
|
372
|
-
/******/ /* webpack/runtime/define property getters */
|
|
373
|
-
/******/ !function() {
|
|
374
|
-
/******/ // define getter/value functions for harmony exports
|
|
375
|
-
/******/ __webpack_require__.d = function(exports, definition) {
|
|
376
|
-
/******/ if(Array.isArray(definition)) {
|
|
377
|
-
/******/ var i = 0;
|
|
378
|
-
/******/ while(i < definition.length) {
|
|
379
|
-
/******/ var key = definition[i++];
|
|
380
|
-
/******/ var binding = definition[i++];
|
|
381
|
-
/******/ if(!__webpack_require__.o(exports, key)) {
|
|
382
|
-
/******/ if(binding === 0) {
|
|
383
|
-
/******/ Object.defineProperty(exports, key, { enumerable: true, value: definition[i++] });
|
|
384
|
-
/******/ } else {
|
|
385
|
-
/******/ Object.defineProperty(exports, key, { enumerable: true, get: binding });
|
|
386
|
-
/******/ }
|
|
387
|
-
/******/ } else if(binding === 0) { i++; }
|
|
388
|
-
/******/ }
|
|
389
|
-
/******/ } else {
|
|
390
|
-
/******/ for(var key in definition) {
|
|
391
|
-
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
392
|
-
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
393
|
-
/******/ }
|
|
394
|
-
/******/ }
|
|
395
|
-
/******/ }
|
|
396
|
-
/******/ };
|
|
397
|
-
/******/ }();
|
|
398
|
-
/******/
|
|
399
|
-
/******/ /* webpack/runtime/global */
|
|
400
|
-
/******/ !function() {
|
|
401
|
-
/******/ __webpack_require__.g = (function() {
|
|
402
|
-
/******/ if (typeof globalThis === 'object') return globalThis;
|
|
403
|
-
/******/ try {
|
|
404
|
-
/******/ return this || new Function('return this')();
|
|
405
|
-
/******/ } catch (e) {
|
|
406
|
-
/******/ if (typeof window === 'object') return window;
|
|
407
|
-
/******/ }
|
|
408
|
-
/******/ })();
|
|
409
|
-
/******/ }();
|
|
410
|
-
/******/
|
|
411
|
-
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
412
|
-
/******/ !function() {
|
|
413
|
-
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
|
|
414
|
-
/******/ }();
|
|
415
|
-
/******/
|
|
416
|
-
/************************************************************************/
|
|
417
|
-
/******/
|
|
418
|
-
/******/ // startup
|
|
419
|
-
/******/ // Load entry module and return exports
|
|
420
|
-
/******/ // This entry module used 'module' so it can't be inlined
|
|
421
|
-
/******/ var __webpack_exports__ = __webpack_require__(11);
|
|
422
|
-
/******/ __webpack_exports__ = await __webpack_exports__;
|
|
423
|
-
/******/ var __webpack_exports__copyDirectoryRecursive = __webpack_exports__.vX;
|
|
424
|
-
/******/ var __webpack_exports__copyDirectoryRecursiveSync = __webpack_exports__.uD;
|
|
425
|
-
/******/ var __webpack_exports__copyFile = __webpack_exports__.m3;
|
|
426
|
-
/******/ var __webpack_exports__copyFileSync = __webpack_exports__.Xp;
|
|
427
|
-
/******/ var __webpack_exports__imports = __webpack_exports__.VW;
|
|
428
|
-
/******/ var __webpack_exports__importsPromise = __webpack_exports__.Ee;
|
|
429
|
-
/******/ var __webpack_exports__isDirectory = __webpack_exports__.wd;
|
|
430
|
-
/******/ var __webpack_exports__isDirectorySync = __webpack_exports__.ZP;
|
|
431
|
-
/******/ var __webpack_exports__isFile = __webpack_exports__.fo;
|
|
432
|
-
/******/ var __webpack_exports__isFileSync = __webpack_exports__.WY;
|
|
433
|
-
/******/ var __webpack_exports__walkDirectoryRecursively = __webpack_exports__.y3;
|
|
434
|
-
/******/ var __webpack_exports__walkDirectoryRecursivelySync = __webpack_exports__.hu;
|
|
435
|
-
/******/ export { __webpack_exports__copyDirectoryRecursive as copyDirectoryRecursive, __webpack_exports__copyDirectoryRecursiveSync as copyDirectoryRecursiveSync, __webpack_exports__copyFile as copyFile, __webpack_exports__copyFileSync as copyFileSync, __webpack_exports__imports as imports, __webpack_exports__importsPromise as importsPromise, __webpack_exports__isDirectory as isDirectory, __webpack_exports__isDirectorySync as isDirectorySync, __webpack_exports__isFile as isFile, __webpack_exports__isFileSync as isFileSync, __webpack_exports__walkDirectoryRecursively as walkDirectoryRecursively, __webpack_exports__walkDirectoryRecursivelySync as walkDirectoryRecursivelySync };
|
|
436
|
-
/******/
|
|
360
|
+
*/
|
|
361
|
+
export const walkDirectoryRecursivelySync = (directoryPath, callback = NOOP, options = DEFAULT_ENCODING) => {
|
|
362
|
+
if (!(readdirSync && resolve && statSync)) throw new Error('Could not load filesystem functions.');
|
|
363
|
+
const files = [];
|
|
364
|
+
for (const directoryEntry of readdirSync(directoryPath, typeof options === 'string' ? {
|
|
365
|
+
encoding: options,
|
|
366
|
+
withFileTypes: true
|
|
367
|
+
} : {
|
|
368
|
+
...options,
|
|
369
|
+
withFileTypes: true
|
|
370
|
+
})) {
|
|
371
|
+
const filePath = resolve(directoryPath, directoryEntry.name);
|
|
372
|
+
const file = {
|
|
373
|
+
directoryPath,
|
|
374
|
+
directoryEntry,
|
|
375
|
+
error: null,
|
|
376
|
+
name: directoryEntry.name,
|
|
377
|
+
path: filePath,
|
|
378
|
+
stats: null
|
|
379
|
+
};
|
|
380
|
+
try {
|
|
381
|
+
file.stats = statSync(filePath);
|
|
382
|
+
} catch (error) {
|
|
383
|
+
file.error = error;
|
|
384
|
+
}
|
|
385
|
+
files.push(file);
|
|
386
|
+
}
|
|
387
|
+
let finalFiles = [];
|
|
388
|
+
if (callback) {
|
|
389
|
+
/*
|
|
390
|
+
NOTE: Directories have to be iterated first to potentially
|
|
391
|
+
avoid deeper iterations.
|
|
392
|
+
*/
|
|
393
|
+
files.sort((firstFile, secondFile) => {
|
|
394
|
+
if (firstFile.stats?.isDirectory()) {
|
|
395
|
+
if (secondFile.stats?.isDirectory()) return 0;
|
|
396
|
+
return -1;
|
|
397
|
+
}
|
|
398
|
+
if (secondFile.stats?.isDirectory()) return 1;
|
|
399
|
+
return 0;
|
|
400
|
+
});
|
|
401
|
+
for (const file of files) {
|
|
402
|
+
finalFiles.push(file);
|
|
403
|
+
const result = callback(file);
|
|
404
|
+
if (result === null) break;
|
|
405
|
+
if (result !== false && file.stats?.isDirectory()) finalFiles = finalFiles.concat(walkDirectoryRecursivelySync(file.path, callback, options));
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return finalFiles;
|
|
409
|
+
};
|
|
410
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2ZpbGVzeXN0ZW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gIyEvdXNyL2Jpbi9lbnYgYmFiZWwtbm9kZVxuLy8gLSotIGNvZGluZzogdXRmLTggLSotXG4vKiogQG1vZHVsZSBmaWxlc3lzdGVtICovXG4ndXNlIHN0cmljdCdcbi8qICFcbiAgICByZWdpb24gaGVhZGVyXG4gICAgW1Byb2plY3QgcGFnZV0oaHR0cHM6Ly90b3JiZW4ud2Vic2l0ZS9jbGllbnRub2RlKVxuXG4gICAgQ29weXJpZ2h0IFRvcmJlbiBTaWNrZXJ0IChpbmZvW1wifmF0flwiXXRvcmJlbi53ZWJzaXRlKSAxNi4xMi4yMDEyXG5cbiAgICBMaWNlbnNlXG4gICAgLS0tLS0tLVxuXG4gICAgVGhpcyBsaWJyYXJ5IHdyaXR0ZW4gYnkgVG9yYmVuIFNpY2tlcnQgc3RhbmRzIHVuZGVyIGEgY3JlYXRpdmUgY29tbW9uc1xuICAgIG5hbWluZyAzLjAgdW5wb3J0ZWQgbGljZW5zZS5cbiAgICBTZWUgaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMC9kZWVkLmRlXG4gICAgZW5kcmVnaW9uXG4qL1xuaW1wb3J0IHR5cGUge1xuICAgIE9iamVjdEVuY29kaW5nT3B0aW9ucyxcbiAgICBta2RpclN5bmMgYXMgbWtkaXJTeW5jVHlwZSxcbiAgICByZWFkZGlyU3luYyBhcyByZWFkZGlyU3luY1R5cGUsXG4gICAgcmVhZEZpbGVTeW5jIGFzIHJlYWRGaWxlU3luY1R5cGUsXG4gICAgc3RhdFN5bmMgYXMgc3RhdFN5bmNUeXBlLFxuICAgIHdyaXRlRmlsZVN5bmMgYXMgd3JpdGVGaWxlU3luY1R5cGVcbn0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB0eXBlIHtcbiAgICBta2RpciBhcyBta2RpclR5cGUsXG4gICAgcmVhZGRpciBhcyByZWFkZGlyVHlwZSxcbiAgICByZWFkRmlsZSBhcyByZWFkRmlsZVR5cGUsXG4gICAgc3RhdCBhcyBzdGF0VHlwZSxcbiAgICB3cml0ZUZpbGUgYXMgd3JpdGVGaWxlVHlwZVxufSBmcm9tICdmcy9wcm9taXNlcydcbmltcG9ydCB0eXBlIHtcbiAgICBiYXNlbmFtZSBhcyBiYXNlbmFtZVR5cGUsXG4gICAgam9pbiBhcyBqb2luVHlwZSxcbiAgICByZXNvbHZlIGFzIHJlc29sdmVUeXBlXG59IGZyb20gJ3BhdGgnXG5cbmltcG9ydCB0eXBlIHtBbnlGdW5jdGlvbiwgRW5jb2RpbmcsIEZpbGUsIEZpbGVUcmF2ZXJzZVJlc3VsdH0gZnJvbSAnLi90eXBlJ1xuXG5pbXBvcnQge0RFRkFVTFRfRU5DT0RJTkd9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHtOT09QfSBmcm9tICcuL2NvbnRleHQnXG5pbXBvcnQge29wdGlvbmFsSW1wb3J0fSBmcm9tICcuL21vZHVsZSdcblxuZXhwb3J0IGNvbnN0IGltcG9ydHM6IHtcbiAgICBmczogbnVsbCB8IHR5cGVvZiBpbXBvcnQoJ2ZzJylcbiAgICBmc1Byb21pc2VzOiBudWxsIHwgdHlwZW9mIGltcG9ydCgnZnMvcHJvbWlzZXMnKVxuICAgIHBhdGg6IG51bGwgfCB0eXBlb2YgaW1wb3J0KCdwYXRoJylcbn0gPSB7XG4gICAgZnM6IG51bGwsXG4gICAgZnNQcm9taXNlczogbnVsbCxcbiAgICBwYXRoOiBudWxsXG59XG5cbmxldCBta2RpclN5bmM6IG51bGwgfCB0eXBlb2YgbWtkaXJTeW5jVHlwZVxubGV0IHJlYWRkaXJTeW5jOiBudWxsIHwgdHlwZW9mIHJlYWRkaXJTeW5jVHlwZVxubGV0IHJlYWRGaWxlU3luYzogbnVsbCB8IHR5cGVvZiByZWFkRmlsZVN5bmNUeXBlXG5sZXQgc3RhdFN5bmM6IG51bGwgfCB0eXBlb2Ygc3RhdFN5bmNUeXBlXG5sZXQgd3JpdGVGaWxlU3luYzogbnVsbCB8IHR5cGVvZiB3cml0ZUZpbGVTeW5jVHlwZVxuY29uc3QgZnNJbXBvcnRQcm9taXNlID0gb3B0aW9uYWxJbXBvcnQ8dHlwZW9mIGltcG9ydCgnZnMnKT4oJ2ZzJylcbnZvaWQgZnNJbXBvcnRQcm9taXNlLnRoZW4oKG1vZHVsZSkgPT4ge1xuICAgIGltcG9ydHMuZnMgPSBtb2R1bGVcblxuICAgIGlmIChtb2R1bGUpIHtcbiAgICAgICAgbWtkaXJTeW5jID0gbW9kdWxlLm1rZGlyU3luY1xuICAgICAgICByZWFkZGlyU3luYyA9IG1vZHVsZS5yZWFkZGlyU3luY1xuICAgICAgICByZWFkRmlsZVN5bmMgPSBtb2R1bGUucmVhZEZpbGVTeW5jXG4gICAgICAgIHN0YXRTeW5jID0gbW9kdWxlLnN0YXRTeW5jXG4gICAgICAgIHdyaXRlRmlsZVN5bmMgPSBtb2R1bGUud3JpdGVGaWxlU3luY1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG1rZGlyU3luYyA9IG51bGxcbiAgICAgICAgcmVhZGRpclN5bmMgPSBudWxsXG4gICAgICAgIHJlYWRGaWxlU3luYyA9IG51bGxcbiAgICAgICAgc3RhdFN5bmMgPSBudWxsXG4gICAgICAgIHdyaXRlRmlsZVN5bmMgPSBudWxsXG4gICAgfVxufSlcblxubGV0IG1rZGlyOiBudWxsIHwgdHlwZW9mIG1rZGlyVHlwZVxubGV0IHJlYWRkaXI6IG51bGwgfCB0eXBlb2YgcmVhZGRpclR5cGVcbmxldCByZWFkRmlsZTogbnVsbCB8IHR5cGVvZiByZWFkRmlsZVR5cGVcbmxldCBzdGF0OiBudWxsIHwgdHlwZW9mIHN0YXRUeXBlXG5sZXQgd3JpdGVGaWxlOiBudWxsIHwgdHlwZW9mIHdyaXRlRmlsZVR5cGVcbmNvbnN0IGZzUHJvbWlzZXNJbXBvcnRQcm9taXNlID1cbiAgICBvcHRpb25hbEltcG9ydDx0eXBlb2YgaW1wb3J0KCdmcy9wcm9taXNlcycpPignZnMvcHJvbWlzZXMnKVxudm9pZCBmc1Byb21pc2VzSW1wb3J0UHJvbWlzZS50aGVuKChtb2R1bGUpID0+IHtcbiAgICBpbXBvcnRzLmZzUHJvbWlzZXMgPSBtb2R1bGVcblxuICAgIGlmIChtb2R1bGUpIHtcbiAgICAgICAgbWtkaXIgPSBtb2R1bGUubWtkaXJcbiAgICAgICAgcmVhZGRpciA9IG1vZHVsZS5yZWFkZGlyXG4gICAgICAgIHJlYWRGaWxlID0gbW9kdWxlLnJlYWRGaWxlXG4gICAgICAgIHN0YXQgPSBtb2R1bGUuc3RhdFxuICAgICAgICB3cml0ZUZpbGUgPSBtb2R1bGUud3JpdGVGaWxlXG4gICAgfSBlbHNlIHtcbiAgICAgICAgbWtkaXIgPSBudWxsXG4gICAgICAgIHJlYWRkaXIgPSBudWxsXG4gICAgICAgIHJlYWRGaWxlID0gbnVsbFxuICAgICAgICBzdGF0ID0gbnVsbFxuICAgICAgICB3cml0ZUZpbGUgPSBudWxsXG4gICAgfVxufSlcblxubGV0IGJhc2VuYW1lOiBudWxsIHwgdHlwZW9mIGJhc2VuYW1lVHlwZVxubGV0IGpvaW46IG51bGwgfCB0eXBlb2Ygam9pblR5cGVcbmxldCByZXNvbHZlOiBudWxsIHwgdHlwZW9mIHJlc29sdmVUeXBlXG5jb25zdCBwYXRoSW1wb3J0UHJvbWlzZSA9IG9wdGlvbmFsSW1wb3J0PHR5cGVvZiBpbXBvcnQoJ3BhdGgnKT4oJ3BhdGgnKVxudm9pZCBwYXRoSW1wb3J0UHJvbWlzZS50aGVuKChtb2R1bGUpID0+IHtcbiAgICBpbXBvcnRzLnBhdGggPSBtb2R1bGVcblxuICAgIGlmIChtb2R1bGUpIHtcbiAgICAgICAgYmFzZW5hbWUgPSBtb2R1bGUuYmFzZW5hbWVcbiAgICAgICAgam9pbiA9IG1vZHVsZS5qb2luXG4gICAgICAgIHJlc29sdmUgPSBtb2R1bGUucmVzb2x2ZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VuYW1lID0gbnVsbFxuICAgICAgICBqb2luID0gbnVsbFxuICAgICAgICByZXNvbHZlID0gbnVsbFxuICAgIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBpbXBvcnRzUHJvbWlzZSA9IFByb21pc2UuYWxsKFtcbiAgICBmc0ltcG9ydFByb21pc2UsIGZzUHJvbWlzZXNJbXBvcnRQcm9taXNlLCBwYXRoSW1wb3J0UHJvbWlzZVxuXSlcblxuLyoqXG4gKiBDb3BpZXMgZ2l2ZW4gc291cmNlIGRpcmVjdG9yeSB2aWEgcGF0aCB0byBnaXZlbiB0YXJnZXQgZGlyZWN0b3J5IGxvY2F0aW9uXG4gKiB3aXRoIHNhbWUgdGFyZ2V0IG5hbWUgYXMgc291cmNlIGZpbGUgaGFzIG9yIGNvcHkgdG8gZ2l2ZW4gY29tcGxldGUgdGFyZ2V0XG4gKiBkaXJlY3RvcnkgcGF0aC5cbiAqIEBwYXJhbSBzb3VyY2VQYXRoIC0gUGF0aCB0byBkaXJlY3RvcnkgdG8gY29weS5cbiAqIEBwYXJhbSB0YXJnZXRQYXRoIC0gVGFyZ2V0IGRpcmVjdG9yeSBvciBjb21wbGV0ZSBkaXJlY3RvcnkgbG9jYXRpb24gdG8gY29weVxuICogaW4uXG4gKiBAcGFyYW0gY29udGVudHMgLSBJbmRpY2F0ZXMgd2hldGhlciB3ZSBvbmx5IHdhbnQgdG8gY29weSBjb250ZW50IG9mIHNvdXJjZVxuICogcGF0aCB3aXRob3V0IHJlY3JlYXRpbmcgdGhlIHNvdXJjZWZpbGUgaXRzZWxmIG9uIHRhcmdldCBsb2NhdGlvbi5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCB0cmF2ZXJzZWQgZmlsZS5cbiAqIEBwYXJhbSByZWFkT3B0aW9ucyAtIE9wdGlvbnMgdG8gdXNlIGZvciByZWFkaW5nIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHdyaXRlT3B0aW9ucyAtIE9wdGlvbnMgdG8gdXNlIGZvciB3cml0aW5nIHRvIHRhcmdldCBmaWxlLlxuICogQHJldHVybnMgUHJvbWlzZSBob2xkaW5nIHRoZSBkZXRlcm1pbmVkIHRhcmdldCBkaXJlY3RvcnkgcGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvcHlEaXJlY3RvcnlSZWN1cnNpdmUgPSBhc3luYyAoXG4gICAgc291cmNlUGF0aDogc3RyaW5nLFxuICAgIHRhcmdldFBhdGg6IHN0cmluZyxcbiAgICBjb250ZW50cyA9IGZhbHNlLFxuICAgIGNhbGxiYWNrOiBBbnlGdW5jdGlvbiA9IE5PT1AsXG4gICAgcmVhZE9wdGlvbnMgPSB7ZW5jb2Rpbmc6IG51bGwsIGZsYWc6ICdyJ30sXG4gICAgd3JpdGVPcHRpb25zID0ge2VuY29kaW5nOiBERUZBVUxUX0VOQ09ESU5HLCBmbGFnOiAndycsIG1vZGU6IDBvNjY2fVxuKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICBpZiAoIShiYXNlbmFtZSAmJiBqb2luICYmIG1rZGlyICYmIHJlc29sdmUpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGZpbGVzeXN0ZW0gZnVuY3Rpb25zLicpXG5cbiAgICBzb3VyY2VQYXRoID0gcmVzb2x2ZShzb3VyY2VQYXRoKVxuICAgIGlmICghY29udGVudHMgJiYgYXdhaXQgaXNEaXJlY3RvcnkodGFyZ2V0UGF0aCkpXG4gICAgICAgIHRhcmdldFBhdGggPSByZXNvbHZlKHRhcmdldFBhdGgsIGJhc2VuYW1lKHNvdXJjZVBhdGgpKVxuXG4gICAgLy8gTk9URTogQ2hlY2sgaWYgZm9sZGVyIG5lZWRzIHRvIGJlIGNyZWF0ZWQgb3IgaW50ZWdyYXRlZC5cbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBta2Rpcih0YXJnZXRQYXRoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRUVYSVNUJylcbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgZm9yIChcbiAgICAgICAgY29uc3QgY3VycmVudFNvdXJjZUZpbGUgb2ZcbiAgICAgICAgYXdhaXQgd2Fsa0RpcmVjdG9yeVJlY3Vyc2l2ZWx5KHNvdXJjZVBhdGgsIGNhbGxiYWNrKVxuICAgICkge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFyZ2V0UGF0aDogc3RyaW5nID0gam9pbihcbiAgICAgICAgICAgIHRhcmdldFBhdGgsIGN1cnJlbnRTb3VyY2VGaWxlLnBhdGguc3Vic3RyaW5nKHNvdXJjZVBhdGgubGVuZ3RoKVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2VGaWxlLnN0YXRzPy5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBta2RpcihjdXJyZW50VGFyZ2V0UGF0aClcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFRVhJU1QnKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBhd2FpdCBjb3B5RmlsZShcbiAgICAgICAgICAgICAgICBjdXJyZW50U291cmNlRmlsZS5wYXRoLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXRQYXRoLFxuICAgICAgICAgICAgICAgIHJlYWRPcHRpb25zLFxuICAgICAgICAgICAgICAgIHdyaXRlT3B0aW9uc1xuICAgICAgICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRQYXRoXG59XG4vKipcbiAqIENvcGllcyBnaXZlbiBzb3VyY2UgZGlyZWN0b3J5IHZpYSBwYXRoIHRvIGdpdmVuIHRhcmdldCBkaXJlY3RvcnkgbG9jYXRpb25cbiAqIHdpdGggc2FtZSB0YXJnZXQgbmFtZSBhcyBzb3VyY2UgZmlsZSBoYXMgb3IgY29weSB0byBnaXZlbiBjb21wbGV0ZSB0YXJnZXRcbiAqIGRpcmVjdG9yeSBwYXRoLlxuICogQHBhcmFtIHNvdXJjZVBhdGggLSBQYXRoIHRvIGRpcmVjdG9yeSB0byBjb3B5LlxuICogQHBhcmFtIHRhcmdldFBhdGggLSBUYXJnZXQgZGlyZWN0b3J5IG9yIGNvbXBsZXRlIGRpcmVjdG9yeSBsb2NhdGlvbiB0byBjb3B5XG4gKiBpbi5cbiAqIEBwYXJhbSBjb250ZW50cyAtIEluZGljYXRlcyB3aGV0aGVyIHdlIG9ubHkgd2FudCB0byBjb3B5IGNvbnRlbnQgb2Ygc291cmNlXG4gKiBwYXRoIHdpdGhvdXQgcmVjcmVhdGluZyB0aGUgc291cmNlZmlsZSBpdHNlbGYgb24gdGFyZ2V0IGxvY2F0aW9uLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gaW52b2tlIGZvciBlYWNoIHRyYXZlcnNlZCBmaWxlLlxuICogQHBhcmFtIHJlYWRPcHRpb25zIC0gT3B0aW9ucyB0byB1c2UgZm9yIHJlYWRpbmcgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gd3JpdGVPcHRpb25zIC0gT3B0aW9ucyB0byB1c2UgZm9yIHdyaXRpbmcgdG8gdGFyZ2V0IGZpbGUuXG4gKiBAcmV0dXJucyBEZXRlcm1pbmVkIHRhcmdldCBkaXJlY3RvcnkgcGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvcHlEaXJlY3RvcnlSZWN1cnNpdmVTeW5jID0gKFxuICAgIHNvdXJjZVBhdGg6IHN0cmluZyxcbiAgICB0YXJnZXRQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudHMgPSBmYWxzZSxcbiAgICBjYWxsYmFjazogQW55RnVuY3Rpb24gPSBOT09QLFxuICAgIHJlYWRPcHRpb25zID0ge2VuY29kaW5nOiBudWxsLCBmbGFnOiAncid9LFxuICAgIHdyaXRlT3B0aW9ucyA9IHtlbmNvZGluZzogREVGQVVMVF9FTkNPRElORywgZmxhZzogJ3cnLCBtb2RlOiAwbzY2Nn1cbik6IHN0cmluZyA9PiB7XG4gICAgaWYgKCEoYmFzZW5hbWUgJiYgam9pbiAmJiBta2RpclN5bmMgJiYgcmVzb2x2ZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgZmlsZXN5c3RlbSBmdW5jdGlvbnMuJylcblxuICAgIHNvdXJjZVBhdGggPSByZXNvbHZlKHNvdXJjZVBhdGgpXG4gICAgaWYgKCFjb250ZW50cyAmJiBpc0RpcmVjdG9yeVN5bmModGFyZ2V0UGF0aCkpXG4gICAgICAgIHRhcmdldFBhdGggPSByZXNvbHZlKHRhcmdldFBhdGgsIGJhc2VuYW1lKHNvdXJjZVBhdGgpKVxuXG4gICAgLy8gTk9URTogVHJ5L0NoZWNrIGlmIHRhcmdldCBmb2xkZXIgbmVlZHMgdG8gYmUgY3JlYXRlZC5cbiAgICB0cnkge1xuICAgICAgICBta2RpclN5bmModGFyZ2V0UGF0aClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VFWElTVCcpXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGZvciAoXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTb3VyY2VGaWxlIG9mXG4gICAgICAgIHdhbGtEaXJlY3RvcnlSZWN1cnNpdmVseVN5bmMoc291cmNlUGF0aCwgY2FsbGJhY2spXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXRQYXRoOiBzdHJpbmcgPSBqb2luKFxuICAgICAgICAgICAgdGFyZ2V0UGF0aCwgY3VycmVudFNvdXJjZUZpbGUucGF0aC5zdWJzdHJpbmcoc291cmNlUGF0aC5sZW5ndGgpXG4gICAgICAgIClcbiAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2VGaWxlLnN0YXRzPy5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBta2RpclN5bmMoY3VycmVudFRhcmdldFBhdGgpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRUVYSVNUJylcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29weUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIGN1cnJlbnRTb3VyY2VGaWxlLnBhdGgsXG4gICAgICAgICAgICAgICAgY3VycmVudFRhcmdldFBhdGgsXG4gICAgICAgICAgICAgICAgcmVhZE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgd3JpdGVPcHRpb25zXG4gICAgICAgICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFBhdGhcbn1cbi8qKlxuICogQ29waWVzIGdpdmVuIHNvdXJjZSBmaWxlIHZpYSBwYXRoIHRvIGdpdmVuIHRhcmdldCBkaXJlY3RvcnkgbG9jYXRpb24gd2l0aFxuICogc2FtZSB0YXJnZXQgbmFtZSBhcyBzb3VyY2UgZmlsZSBoYXMgb3IgY29weSB0byBnaXZlbiBjb21wbGV0ZSB0YXJnZXQgZmlsZVxuICogcGF0aC5cbiAqIEBwYXJhbSBzb3VyY2VQYXRoIC0gUGF0aCB0byBmaWxlIHRvIGNvcHkuXG4gKiBAcGFyYW0gdGFyZ2V0UGF0aCAtIFRhcmdldCBkaXJlY3Rvcnkgb3IgY29tcGxldGUgZmlsZSBsb2NhdGlvbiB0byBjb3B5IHRvLlxuICogQHBhcmFtIHJlYWRPcHRpb25zIC0gT3B0aW9ucyB0byB1c2UgZm9yIHJlYWRpbmcgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gd3JpdGVPcHRpb25zIC0gT3B0aW9ucyB0byB1c2UgZm9yIHdyaXRpbmcgdG8gdGFyZ2V0IGZpbGUuXG4gKiBAcmV0dXJucyBEZXRlcm1pbmVkIHRhcmdldCBmaWxlIHBhdGguXG4gKi9cbmV4cG9ydCBjb25zdCBjb3B5RmlsZSA9IGFzeW5jIChcbiAgICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gICAgdGFyZ2V0UGF0aDogc3RyaW5nLFxuICAgIHJlYWRPcHRpb25zID0ge2VuY29kaW5nOiBudWxsLCBmbGFnOiAncid9LFxuICAgIHdyaXRlT3B0aW9ucyA9IHtlbmNvZGluZzogREVGQVVMVF9FTkNPRElORywgZmxhZzogJ3cnLCBtb2RlOiAwbzY2Nn1cbik6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgaWYgKCEoYmFzZW5hbWUgJiYgcmVhZEZpbGUgJiYgcmVzb2x2ZSAmJiB3cml0ZUZpbGUpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGZpbGVzeXN0ZW0gZnVuY3Rpb25zLicpXG5cbiAgICAvKlxuICAgICAgICBOT1RFOiBJZiB0YXJnZXQgcGF0aCByZWZlcmVuY2VzIGEgZGlyZWN0b3J5IGEgbmV3IGZpbGUgd2l0aCB0aGUgc2FtZVxuICAgICAgICBuYW1lIHdpbGwgYmUgY3JlYXRlZC5cbiAgICAqL1xuICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeSh0YXJnZXRQYXRoKSlcbiAgICAgICAgdGFyZ2V0UGF0aCA9IHJlc29sdmUodGFyZ2V0UGF0aCwgYmFzZW5hbWUoc291cmNlUGF0aCkpXG5cbiAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICAgIHRhcmdldFBhdGgsIGF3YWl0IHJlYWRGaWxlKHNvdXJjZVBhdGgsIHJlYWRPcHRpb25zKSwgd3JpdGVPcHRpb25zXG4gICAgKVxuXG4gICAgcmV0dXJuIHRhcmdldFBhdGhcbn1cbi8qKlxuICogQ29waWVzIGdpdmVuIHNvdXJjZSBmaWxlIHZpYSBwYXRoIHRvIGdpdmVuIHRhcmdldCBkaXJlY3RvcnkgbG9jYXRpb24gd2l0aFxuICogc2FtZSB0YXJnZXQgbmFtZSBhcyBzb3VyY2UgZmlsZSBoYXMgb3IgY29weSB0byBnaXZlbiBjb21wbGV0ZSB0YXJnZXQgZmlsZVxuICogcGF0aC5cbiAqIEBwYXJhbSBzb3VyY2VQYXRoIC0gUGF0aCB0byBmaWxlIHRvIGNvcHkuXG4gKiBAcGFyYW0gdGFyZ2V0UGF0aCAtIFRhcmdldCBkaXJlY3Rvcnkgb3IgY29tcGxldGUgZmlsZSBsb2NhdGlvbiB0byBjb3B5IHRvLlxuICogQHBhcmFtIHJlYWRPcHRpb25zIC0gT3B0aW9ucyB0byB1c2UgZm9yIHJlYWRpbmcgc291cmNlIGZpbGUuXG4gKiBAcGFyYW0gd3JpdGVPcHRpb25zIC0gT3B0aW9ucyB0byB1c2UgZm9yIHdyaXRpbmcgdG8gdGFyZ2V0IGZpbGUuXG4gKiBAcmV0dXJucyBEZXRlcm1pbmVkIHRhcmdldCBmaWxlIHBhdGguXG4gKi9cbmV4cG9ydCBjb25zdCBjb3B5RmlsZVN5bmMgPSAoXG4gICAgc291cmNlUGF0aDogc3RyaW5nLFxuICAgIHRhcmdldFBhdGg6IHN0cmluZyxcbiAgICByZWFkT3B0aW9ucyA9IHtlbmNvZGluZzogbnVsbCwgZmxhZzogJ3InfSxcbiAgICB3cml0ZU9wdGlvbnMgPSB7ZW5jb2Rpbmc6IERFRkFVTFRfRU5DT0RJTkcsIGZsYWc6ICd3JywgbW9kZTogMG82NjZ9XG4pOiBzdHJpbmcgPT4ge1xuICAgIGlmICghKGJhc2VuYW1lICYmIHJlYWRGaWxlU3luYyAmJiByZXNvbHZlICYmIHdyaXRlRmlsZVN5bmMpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGZpbGVzeXN0ZW0gZnVuY3Rpb25zLicpXG5cbiAgICAvKlxuICAgICAgICBOT1RFOiBJZiB0YXJnZXQgcGF0aCByZWZlcmVuY2VzIGEgZGlyZWN0b3J5IGEgbmV3IGZpbGUgd2l0aCB0aGUgc2FtZVxuICAgICAgICBuYW1lIHdpbGwgYmUgY3JlYXRlZC5cbiAgICAqL1xuICAgIGlmIChpc0RpcmVjdG9yeVN5bmModGFyZ2V0UGF0aCkpXG4gICAgICAgIHRhcmdldFBhdGggPSByZXNvbHZlKHRhcmdldFBhdGgsIGJhc2VuYW1lKHNvdXJjZVBhdGgpKVxuXG4gICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgdGFyZ2V0UGF0aCwgcmVhZEZpbGVTeW5jKHNvdXJjZVBhdGgsIHJlYWRPcHRpb25zKSwgd3JpdGVPcHRpb25zXG4gICAgKVxuXG4gICAgcmV0dXJuIHRhcmdldFBhdGhcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGdpdmVuIHBhdGggcG9pbnRzIHRvIGEgdmFsaWQgZGlyZWN0b3J5LlxuICogQHBhcmFtIGZpbGVQYXRoIC0gUGF0aCB0byBkaXJlY3RvcnkuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgaG9sZGluZyBhIGJvb2xlYW4gd2hpY2ggaW5kaWNhdGVzIGRpcmVjdG9yeSBleGlzdGVuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0RpcmVjdG9yeSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgaWYgKCFzdGF0KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGZpbGVzeXN0ZW0gZnVuY3Rpb25zLicpXG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHN0YXQoZmlsZVBhdGgpKS5pc0RpcmVjdG9yeSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCAnY29kZScpICYmXG4gICAgICAgICAgICBbJ0VOT0VOVCcsICdFTk9URElSJ10uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSBhcyBzdHJpbmdcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG59XG4vKipcbiAqIENoZWNrcyBpZiBnaXZlbiBwYXRoIHBvaW50cyB0byBhIHZhbGlkIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSBmaWxlUGF0aCAtIFBhdGggdG8gZGlyZWN0b3J5LlxuICogQHJldHVybnMgQSBib29sZWFuIHdoaWNoIGluZGljYXRlcyBkaXJlY3RvcnkgZXhpc3RlbmNlLlxuICovXG5leHBvcnQgY29uc3QgaXNEaXJlY3RvcnlTeW5jID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIXN0YXRTeW5jKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGZpbGVzeXN0ZW0gZnVuY3Rpb25zLicpXG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gc3RhdFN5bmMoZmlsZVBhdGgpLmlzRGlyZWN0b3J5KClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3IsICdjb2RlJykgJiZcbiAgICAgICAgICAgIFsnRU5PRU5UJywgJ0VOT1RESVInXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlIGFzIHN0cmluZ1xuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cbn1cbi8qKlxuICogQ2hlY2tzIGlmIGdpdmVuIHBhdGggcG9pbnRzIHRvIGEgdmFsaWQgZmlsZS5cbiAqIEBwYXJhbSBmaWxlUGF0aCAtIFBhdGggdG8gZGlyZWN0b3J5LlxuICogQHJldHVybnMgQSBwcm9taXNlIGhvbGRpbmcgYSBib29sZWFuIHdoaWNoIGluZGljYXRlcyBkaXJlY3RvcnkgZXhpc3RlbmNlLlxuICovXG5leHBvcnQgY29uc3QgaXNGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBpZiAoIXN0YXQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgZmlsZXN5c3RlbSBmdW5jdGlvbnMuJylcblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgc3RhdChmaWxlUGF0aCkpLmlzRmlsZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCAnY29kZScpICYmXG4gICAgICAgICAgICBbJ0VOT0VOVCcsICdFTk9URElSJ10uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSBhcyBzdHJpbmdcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG59XG4vKipcbiAqIENoZWNrcyBpZiBnaXZlbiBwYXRoIHBvaW50cyB0byBhIHZhbGlkIGZpbGUuXG4gKiBAcGFyYW0gZmlsZVBhdGggLSBQYXRoIHRvIGZpbGUuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gd2hpY2ggaW5kaWNhdGVzIGZpbGUgZXhpc3RlbmNlLlxuICovXG5leHBvcnQgY29uc3QgaXNGaWxlU3luYyA9IChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFzdGF0U3luYylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBmaWxlc3lzdGVtIGZ1bmN0aW9ucy4nKVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHN0YXRTeW5jKGZpbGVQYXRoKS5pc0ZpbGUoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlcnJvciwgJ2NvZGUnKSAmJlxuICAgICAgICAgICAgWydFTk9FTlQnLCAnRU5PVERJUiddLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgIChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgYXMgc3RyaW5nXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxufVxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGdpdmVuIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgcmVjdXJzaXZlbHkgYW5kIGNhbGxzIGdpdmVuXG4gKiBjYWxsYmFjayBmb3IgZWFjaCBmb3VuZCBmaWxlLiBDYWxsYmFjayBnZXRzIGZpbGUgcGF0aCBhbmQgY29ycmVzcG9uZGluZyBzdGF0XG4gKiBvYmplY3QgYXMgYXJndW1lbnQuXG4gKiBAcGFyYW0gZGlyZWN0b3J5UGF0aCAtIFBhdGggdG8gZGlyZWN0b3J5IHN0cnVjdHVyZSB0byB0cmF2ZXJzZS5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGludm9rZSBmb3IgZWFjaCB0cmF2ZXJzZWQgZmlsZSBhbmQgcG90ZW50aWFsbHlcbiAqIG1hbmlwdWxhdGUgZnVydGhlciB0cmF2ZXJzaW5nIGluIGFscGhhYmV0aWNhbCBzb3J0ZWQgb3JkZXIuXG4gKiBJZiBpdCByZXR1cm5zIFwibnVsbFwiIG9yIGEgcHJvbWlzZSByZXNvbHZpbmcgdG8gXCJudWxsXCIsIG5vIGZ1cnRoZXIgZmlsZXNcbiAqIHdpbGwgYmUgdHJhdmVyc2VkIGFmdGVyd2FyZC5cbiAqIElmIGl0IGhhbmRsZXMgYSBkaXJlY3RvcnkgYW5kIHJldHVybnMgXCJmYWxzZVwiIG9yIGEgcHJvbWlzZSByZXNvbHZpbmcgdG9cbiAqIFwiZmFsc2VcIiBubyB0cmF2ZXJzaW5nIGludG8gdGhhdCBkaXJlY3Rvcnkgd2lsbCBvY2N1ci5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB1c2UgZm9yIG5lc3RlZCBcInJlYWRkaXJcIiBjYWxscy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSBob2xkaW5nIHRoZSBkZXRlcm1pbmVkIGZpbGVzLlxuICovXG5leHBvcnQgY29uc3Qgd2Fsa0RpcmVjdG9yeVJlY3Vyc2l2ZWx5ID0gYXN5bmMgKFxuICAgIGRpcmVjdG9yeVBhdGg6IHN0cmluZyxcbiAgICBjYWxsYmFjazogbnVsbCB8ICgoZmlsZTogRmlsZSkgPT4gRmlsZVRyYXZlcnNlUmVzdWx0KSA9IG51bGwsXG4gICAgb3B0aW9uczogKFxuICAgICAgICBFbmNvZGluZyB8XG4gICAgICAgIChPYmplY3RFbmNvZGluZ09wdGlvbnMgJiB7d2l0aEZpbGVUeXBlcz86IGZhbHNlOyByZWN1cnNpdmU/OiBib29sZWFufSlcbiAgICApID0gREVGQVVMVF9FTkNPRElOR1xuKTogUHJvbWlzZTxBcnJheTxGaWxlPj4gPT4ge1xuICAgIGlmICghKHJlYWRkaXIgJiYgcmVzb2x2ZSAmJiBzdGF0KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBmaWxlc3lzdGVtIGZ1bmN0aW9ucy4nKVxuXG4gICAgY29uc3QgZmlsZXM6IEFycmF5PEZpbGU+ID0gW11cbiAgICBmb3IgKGNvbnN0IGRpcmVjdG9yeUVudHJ5IG9mIGF3YWl0IHJlYWRkaXIoXG4gICAgICAgIGRpcmVjdG9yeVBhdGgsXG4gICAgICAgICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAge2VuY29kaW5nOiBvcHRpb25zLCB3aXRoRmlsZVR5cGVzOiB0cnVlfSA6XG4gICAgICAgICAgICB7Li4ub3B0aW9ucywgd2l0aEZpbGVUeXBlczogdHJ1ZX1cbiAgICAgICAgKVxuICAgICkpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGg6IHN0cmluZyA9IHJlc29sdmUoXG4gICAgICAgICAgICBkaXJlY3RvcnlQYXRoLCBkaXJlY3RvcnlFbnRyeS5uYW1lXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgZmlsZTogRmlsZSA9IHtcbiAgICAgICAgICAgIGRpcmVjdG9yeVBhdGgsXG4gICAgICAgICAgICBkaXJlY3RvcnlFbnRyeSxcbiAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgbmFtZTogZGlyZWN0b3J5RW50cnkubmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgc3RhdHM6IG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmaWxlLnN0YXRzID0gYXdhaXQgc3RhdChmaWxlUGF0aClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb25cbiAgICAgICAgfVxuXG4gICAgICAgIGZpbGVzLnB1c2goZmlsZSlcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgIC8qXG4gICAgICAgICAgICBOT1RFOiBEaXJlY3RvcmllcyBhbmQgaGF2ZSB0byBiZSBpdGVyYXRlZCBmaXJzdCB0byBiZSBhYmxlIHRvXG4gICAgICAgICAgICBhdm9pZCBkZWVwZXIgdW53YW50ZWQgdHJhdmVyc2luZy5cbiAgICAgICAgKi9cbiAgICAgICAgZmlsZXMuc29ydCgoZmlyc3RGaWxlOiBGaWxlLCBzZWNvbmRGaWxlOiBGaWxlKTogLTEgfCAwfDEgPT4ge1xuICAgICAgICAgICAgaWYgKGZpcnN0RmlsZS5zdGF0cz8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWNvbmRGaWxlLnN0YXRzPy5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWNvbmRGaWxlLnN0YXRzPy5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiAxXG5cbiAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH0pXG5cbiAgICBsZXQgZmluYWxGaWxlczogQXJyYXk8RmlsZT4gPSBbXVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBmaW5hbEZpbGVzLnB1c2goZmlsZSlcblxuICAgICAgICBsZXQgcmVzdWx0OiBGaWxlVHJhdmVyc2VSZXN1bHQgPVxuICAgICAgICAgICAgY2FsbGJhY2sgPyBjYWxsYmFjayhmaWxlKSA6IHVuZGVmaW5lZFxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiAndGhlbicgaW4gcmVzdWx0KVxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVzdWx0XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UgJiYgZmlsZS5zdGF0cz8uaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICAgIGZpbmFsRmlsZXMgPSBmaW5hbEZpbGVzLmNvbmNhdChcbiAgICAgICAgICAgICAgICBhd2FpdCB3YWxrRGlyZWN0b3J5UmVjdXJzaXZlbHkoZmlsZS5wYXRoLCBjYWxsYmFjaywgb3B0aW9ucylcbiAgICAgICAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gZmluYWxGaWxlc1xufVxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGdpdmVuIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgcmVjdXJzaXZlbHkgYW5kIGNhbGxzIGdpdmVuXG4gKiBjYWxsYmFjayBmb3IgZWFjaCBmb3VuZCBmaWxlLiBDYWxsYmFjayBnZXRzIGZpbGUgcGF0aCBhbmQgY29ycmVzcG9uZGluZ1xuICogc3RhdHMgb2JqZWN0IGFzIGFyZ3VtZW50LlxuICogQHBhcmFtIGRpcmVjdG9yeVBhdGggLSBQYXRoIHRvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdG8gdHJhdmVyc2UuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggdHJhdmVyc2VkIGZpbGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdXNlIGZvciBuZXN0ZWQgXCJyZWFkZGlyXCIgY2FsbHMuXG4gKiBAcmV0dXJucyBEZXRlcm1pbmVkIGxpc3QgaWYgYWxsIGZpbGVzLlxuICovXG5leHBvcnQgY29uc3Qgd2Fsa0RpcmVjdG9yeVJlY3Vyc2l2ZWx5U3luYyA9IChcbiAgICBkaXJlY3RvcnlQYXRoOiBzdHJpbmcsXG4gICAgY2FsbGJhY2s6IEFueUZ1bmN0aW9uIHwgbnVsbCA9IE5PT1AsXG4gICAgb3B0aW9uczogKFxuICAgICAgICBFbmNvZGluZyB8XG4gICAgICAgIChPYmplY3RFbmNvZGluZ09wdGlvbnMgJiB7d2l0aEZpbGVUeXBlcz86IGZhbHNlOyByZWN1cnNpdmU/OiBib29sZWFufSlcbiAgICApID0gREVGQVVMVF9FTkNPRElOR1xuKTogQXJyYXk8RmlsZT4gPT4ge1xuICAgIGlmICghKHJlYWRkaXJTeW5jICYmIHJlc29sdmUgJiYgc3RhdFN5bmMpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGZpbGVzeXN0ZW0gZnVuY3Rpb25zLicpXG5cbiAgICBjb25zdCBmaWxlczogQXJyYXk8RmlsZT4gPSBbXVxuXG4gICAgZm9yIChjb25zdCBkaXJlY3RvcnlFbnRyeSBvZiByZWFkZGlyU3luYyhcbiAgICAgICAgZGlyZWN0b3J5UGF0aCxcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgIHtlbmNvZGluZzogb3B0aW9ucywgd2l0aEZpbGVUeXBlczogdHJ1ZX0gOlxuICAgICAgICAgICAgey4uLm9wdGlvbnMsIHdpdGhGaWxlVHlwZXM6IHRydWV9XG4gICAgKSkge1xuICAgICAgICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID1cbiAgICAgICAgICAgIHJlc29sdmUoZGlyZWN0b3J5UGF0aCwgZGlyZWN0b3J5RW50cnkubmFtZSlcbiAgICAgICAgY29uc3QgZmlsZTogRmlsZSA9IHtcbiAgICAgICAgICAgIGRpcmVjdG9yeVBhdGgsXG4gICAgICAgICAgICBkaXJlY3RvcnlFbnRyeSxcbiAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgbmFtZTogZGlyZWN0b3J5RW50cnkubmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgc3RhdHM6IG51bGxcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZmlsZS5zdGF0cyA9IHN0YXRTeW5jKGZpbGVQYXRoKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgZmlsZS5lcnJvciA9IGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvblxuICAgICAgICB9XG4gICAgICAgIGZpbGVzLnB1c2goZmlsZSlcbiAgICB9XG5cbiAgICBsZXQgZmluYWxGaWxlczogQXJyYXk8RmlsZT4gPSBbXVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBOT1RFOiBEaXJlY3RvcmllcyBoYXZlIHRvIGJlIGl0ZXJhdGVkIGZpcnN0IHRvIHBvdGVudGlhbGx5XG4gICAgICAgICAgICBhdm9pZCBkZWVwZXIgaXRlcmF0aW9ucy5cbiAgICAgICAgKi9cbiAgICAgICAgZmlsZXMuc29ydCgoZmlyc3RGaWxlOiBGaWxlLCBzZWNvbmRGaWxlOiBGaWxlKTogbnVtYmVyID0+IHtcbiAgICAgICAgICAgIGlmIChmaXJzdEZpbGUuc3RhdHM/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2Vjb25kRmlsZS5zdGF0cz8uaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBcblxuICAgICAgICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2Vjb25kRmlsZS5zdGF0cz8uaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMVxuXG4gICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9KVxuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgZmluYWxGaWxlcy5wdXNoKGZpbGUpXG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogdW5rbm93biA9IGNhbGxiYWNrKGZpbGUpXG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UgJiYgZmlsZS5zdGF0cz8uaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICAgICAgICBmaW5hbEZpbGVzID0gZmluYWxGaWxlcy5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgIHdhbGtEaXJlY3RvcnlSZWN1cnNpdmVseVN5bmMoZmlsZS5wYXRoLCBjYWxsYmFjaywgb3B0aW9ucylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmluYWxGaWxlc1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQUFBO0FBcUNBLFNBQVEsZ0JBQWdCO0FBQ3hCLFNBQVEsSUFBSTtBQUNaLFNBQVEsY0FBYztBQUV0QixPQUFPLE1BQU0sT0FJWixHQUFHO0VBQ0EsRUFBRSxFQUFFLElBQUk7RUFDUixVQUFVLEVBQUUsSUFBSTtFQUNoQixJQUFJLEVBQUU7QUFDVixDQUFDO0FBRUQsSUFBSSxTQUFzQztBQUMxQyxJQUFJLFdBQTBDO0FBQzlDLElBQUksWUFBNEM7QUFDaEQsSUFBSSxRQUFvQztBQUN4QyxJQUFJLGFBQThDO0FBQ2xELE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBc0IsSUFBSSxDQUFDO0FBQ2pFLEtBQUssZUFBZSxDQUFDLElBQUksQ0FBRSxNQUFNLElBQUs7RUFDbEMsT0FBTyxDQUFDLEVBQUUsR0FBRyxNQUFNO0VBRW5CLElBQUksTUFBTSxFQUFFO0lBQ1IsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTO0lBQzVCLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVztJQUNoQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVk7SUFDbEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRO0lBQzFCLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYTtFQUN4QyxDQUFDLE1BQU07SUFDSCxTQUFTLEdBQUcsSUFBSTtJQUNoQixXQUFXLEdBQUcsSUFBSTtJQUNsQixZQUFZLEdBQUcsSUFBSTtJQUNuQixRQUFRLEdBQUcsSUFBSTtJQUNmLGFBQWEsR0FBRyxJQUFJO0VBQ3hCO0FBQ0osQ0FBQyxDQUFDO0FBRUYsSUFBSSxLQUE4QjtBQUNsQyxJQUFJLE9BQWtDO0FBQ3RDLElBQUksUUFBb0M7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
|