tnp-helpers 16.100.3 → 16.100.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/assets/shared/shared_folder_info.txt +1 -1
  2. package/browser/README.md +24 -24
  3. package/browser/esm2022/lib/base/base-project.mjs +173 -6
  4. package/browser/esm2022/lib/base/core-project.mjs +54 -0
  5. package/browser/esm2022/lib/base/index.mjs +3 -1
  6. package/browser/esm2022/lib/base/linked-project.mjs +77 -0
  7. package/browser/esm2022/lib/helpers/for-browser/angular.helper.mjs +89 -0
  8. package/browser/esm2022/lib/helpers/for-browser/helpers-browser.mjs +48 -0
  9. package/browser/esm2022/lib/helpers/helpers-array-obj.mjs +117 -0
  10. package/browser/esm2022/lib/helpers/helpers-numbers.mjs +12 -0
  11. package/browser/esm2022/lib/helpers/helpers-strings-regexes.mjs +51 -0
  12. package/browser/esm2022/lib/helpers/helpers-strings.mjs +258 -0
  13. package/browser/esm2022/lib/helpers/helpers.mjs +358 -0
  14. package/browser/esm2022/lib/index.mjs +3 -4
  15. package/browser/fesm2022/tnp-helpers.mjs +308 -15
  16. package/browser/fesm2022/tnp-helpers.mjs.map +1 -1
  17. package/browser/lib/base/base-project.d.ts +19 -5
  18. package/browser/lib/base/core-project.d.ts +54 -0
  19. package/browser/lib/base/index.d.ts +3 -1
  20. package/browser/lib/base/linked-project.d.ts +36 -0
  21. package/{client/lib → browser/lib/helpers}/helpers.d.ts +1 -1
  22. package/browser/lib/index.d.ts +2 -3
  23. package/client/README.md +24 -24
  24. package/client/esm2022/lib/base/base-project.mjs +173 -6
  25. package/client/esm2022/lib/base/core-project.mjs +54 -0
  26. package/client/esm2022/lib/base/index.mjs +3 -1
  27. package/client/esm2022/lib/base/linked-project.mjs +77 -0
  28. package/client/esm2022/lib/helpers/for-browser/angular.helper.mjs +89 -0
  29. package/client/esm2022/lib/helpers/for-browser/helpers-browser.mjs +48 -0
  30. package/client/esm2022/lib/helpers/helpers-array-obj.mjs +117 -0
  31. package/client/esm2022/lib/helpers/helpers-numbers.mjs +12 -0
  32. package/client/esm2022/lib/helpers/helpers-strings-regexes.mjs +51 -0
  33. package/client/esm2022/lib/helpers/helpers-strings.mjs +258 -0
  34. package/client/esm2022/lib/helpers/helpers.mjs +358 -0
  35. package/client/esm2022/lib/index.mjs +3 -4
  36. package/client/fesm2022/tnp-helpers.mjs +308 -15
  37. package/client/fesm2022/tnp-helpers.mjs.map +1 -1
  38. package/client/lib/base/base-project.d.ts +19 -5
  39. package/client/lib/base/core-project.d.ts +54 -0
  40. package/client/lib/base/index.d.ts +3 -1
  41. package/client/lib/base/linked-project.d.ts +36 -0
  42. package/{browser/lib → client/lib/helpers}/helpers.d.ts +1 -1
  43. package/client/lib/index.d.ts +2 -3
  44. package/client/package.json +35 -35
  45. package/{package.json_tnp.json5 → firedev.jsonc} +59 -60
  46. package/lib/base/base-command-line.backend.d.ts +3 -1
  47. package/lib/base/base-command-line.backend.js +43 -6
  48. package/lib/base/base-command-line.backend.js.map +1 -1
  49. package/lib/base/base-project.d.ts +32 -6
  50. package/lib/base/base-project.js +381 -92
  51. package/lib/base/base-project.js.map +1 -1
  52. package/lib/base/core-project.d.ts +53 -0
  53. package/lib/base/core-project.js +78 -0
  54. package/lib/base/core-project.js.map +1 -0
  55. package/lib/base/index.d.ts +2 -0
  56. package/lib/base/index.js +2 -0
  57. package/lib/base/index.js.map +1 -1
  58. package/lib/base/linked-project.d.ts +35 -0
  59. package/lib/base/linked-project.js +96 -0
  60. package/lib/base/linked-project.js.map +1 -0
  61. package/lib/{for-backend → helpers/for-backend}/helpers-cli-tool.backend.d.ts +1 -1
  62. package/lib/{for-backend → helpers/for-backend}/helpers-cli-tool.backend.js +1 -1
  63. package/lib/{for-backend → helpers/for-backend}/helpers-cli-tool.backend.js.map +1 -1
  64. package/lib/{for-backend → helpers/for-backend}/helpers-console-gui.js +1 -1
  65. package/lib/{for-backend → helpers/for-backend}/helpers-console-gui.js.map +1 -1
  66. package/lib/{for-backend → helpers/for-backend}/helpers-dependencies.backend.js +1 -1
  67. package/lib/{for-backend → helpers/for-backend}/helpers-dependencies.backend.js.map +1 -1
  68. package/lib/{for-backend → helpers/for-backend}/helpers-file-folders.backend.d.ts +2 -7
  69. package/lib/{for-backend → helpers/for-backend}/helpers-file-folders.backend.js +13 -69
  70. package/lib/helpers/for-backend/helpers-file-folders.backend.js.map +1 -0
  71. package/lib/{for-backend → helpers/for-backend}/helpers-git.backend.d.ts +12 -3
  72. package/lib/{for-backend → helpers/for-backend}/helpers-git.backend.js +76 -11
  73. package/lib/helpers/for-backend/helpers-git.backend.js.map +1 -0
  74. package/lib/{for-backend → helpers/for-backend}/helpers-path.backend.js +1 -1
  75. package/lib/{for-backend → helpers/for-backend}/helpers-path.backend.js.map +1 -1
  76. package/lib/{for-backend → helpers/for-backend}/helpers-process.backend.d.ts +0 -1
  77. package/lib/{for-backend → helpers/for-backend}/helpers-process.backend.js +1 -5
  78. package/lib/{for-backend → helpers/for-backend}/helpers-process.backend.js.map +1 -1
  79. package/lib/{for-backend → helpers/for-backend}/helpers-system-terminal.backend.js +1 -1
  80. package/lib/{for-backend → helpers/for-backend}/helpers-system-terminal.backend.js.map +1 -1
  81. package/lib/{for-backend → helpers/for-backend}/helpers-vscode.backend.d.ts +1 -1
  82. package/lib/{for-backend → helpers/for-backend}/helpers-vscode.backend.js +1 -1
  83. package/lib/{for-backend → helpers/for-backend}/helpers-vscode.backend.js.map +1 -1
  84. package/lib/{for-backend → helpers/for-backend}/ts-code/ts-code-extractor.js +1 -1
  85. package/lib/{for-backend → helpers/for-backend}/ts-code/ts-code-extractor.js.map +1 -1
  86. package/lib/{for-backend → helpers/for-backend}/ts-code/ts-code-modifier.backend.js +1 -1
  87. package/lib/{for-backend → helpers/for-backend}/ts-code/ts-code-modifier.backend.js.map +1 -1
  88. package/lib/helpers/for-browser/angular.helper.js +6 -0
  89. package/lib/{helpers-strings.js → helpers/helpers-strings.js} +1 -1
  90. package/lib/{helpers-strings.js.map → helpers/helpers-strings.js.map} +1 -1
  91. package/lib/{helpers.d.ts → helpers/helpers.d.ts} +1 -1
  92. package/lib/{helpers.js → helpers/helpers.js} +1 -1
  93. package/lib/{helpers.js.map → helpers/helpers.js.map} +1 -1
  94. package/lib/index.d.ts +2 -3
  95. package/lib/index.js +1 -2
  96. package/lib/index.js.map +1 -1
  97. package/lib/models.d.ts +0 -10
  98. package/lib/models.js +3 -0
  99. package/lib/models.js.map +1 -1
  100. package/lib/old/base-component.js +3 -3
  101. package/lib/old/base-formly-component.js +3 -3
  102. package/lib/old/dual-component-ctrl.js +3 -3
  103. package/package.json +4 -5
  104. package/tmp-environment.json +39 -39
  105. package/websql/README.md +24 -24
  106. package/websql/esm2022/lib/base/base-project.mjs +173 -6
  107. package/websql/esm2022/lib/base/core-project.mjs +54 -0
  108. package/websql/esm2022/lib/base/index.mjs +3 -1
  109. package/websql/esm2022/lib/base/linked-project.mjs +77 -0
  110. package/websql/esm2022/lib/helpers/for-browser/angular.helper.mjs +89 -0
  111. package/websql/esm2022/lib/helpers/for-browser/helpers-browser.mjs +48 -0
  112. package/websql/esm2022/lib/helpers/helpers-array-obj.mjs +117 -0
  113. package/websql/esm2022/lib/helpers/helpers-numbers.mjs +12 -0
  114. package/websql/esm2022/lib/helpers/helpers-strings-regexes.mjs +51 -0
  115. package/websql/esm2022/lib/helpers/helpers-strings.mjs +258 -0
  116. package/websql/esm2022/lib/helpers/helpers.mjs +358 -0
  117. package/websql/esm2022/lib/index.mjs +3 -4
  118. package/websql/fesm2022/tnp-helpers.mjs +308 -15
  119. package/websql/fesm2022/tnp-helpers.mjs.map +1 -1
  120. package/websql/lib/base/base-project.d.ts +19 -5
  121. package/websql/lib/base/core-project.d.ts +54 -0
  122. package/websql/lib/base/index.d.ts +3 -1
  123. package/websql/lib/base/linked-project.d.ts +36 -0
  124. package/websql/lib/{helpers.d.ts → helpers/helpers.d.ts} +1 -1
  125. package/websql/lib/index.d.ts +2 -3
  126. package/browser/esm2022/lib/for-browser/angular.helper.mjs +0 -89
  127. package/browser/esm2022/lib/for-browser/helpers-browser.mjs +0 -48
  128. package/browser/esm2022/lib/helpers-array-obj.mjs +0 -117
  129. package/browser/esm2022/lib/helpers-numbers.mjs +0 -12
  130. package/browser/esm2022/lib/helpers-strings-regexes.mjs +0 -51
  131. package/browser/esm2022/lib/helpers-strings.mjs +0 -258
  132. package/browser/esm2022/lib/helpers.mjs +0 -358
  133. package/browser/esm2022/lib/models.mjs +0 -4
  134. package/browser/lib/models.d.ts +0 -11
  135. package/client/esm2022/lib/for-browser/angular.helper.mjs +0 -89
  136. package/client/esm2022/lib/for-browser/helpers-browser.mjs +0 -48
  137. package/client/esm2022/lib/helpers-array-obj.mjs +0 -117
  138. package/client/esm2022/lib/helpers-numbers.mjs +0 -12
  139. package/client/esm2022/lib/helpers-strings-regexes.mjs +0 -51
  140. package/client/esm2022/lib/helpers-strings.mjs +0 -258
  141. package/client/esm2022/lib/helpers.mjs +0 -358
  142. package/client/esm2022/lib/models.mjs +0 -4
  143. package/client/lib/models.d.ts +0 -11
  144. package/lib/for-backend/helpers-file-folders.backend.js.map +0 -1
  145. package/lib/for-backend/helpers-git.backend.js.map +0 -1
  146. package/lib/for-browser/angular.helper.js +0 -6
  147. package/package.json_devDependencies.json +0 -222
  148. package/websql/esm2022/lib/for-browser/angular.helper.mjs +0 -89
  149. package/websql/esm2022/lib/for-browser/helpers-browser.mjs +0 -48
  150. package/websql/esm2022/lib/helpers-array-obj.mjs +0 -117
  151. package/websql/esm2022/lib/helpers-numbers.mjs +0 -12
  152. package/websql/esm2022/lib/helpers-strings-regexes.mjs +0 -51
  153. package/websql/esm2022/lib/helpers-strings.mjs +0 -258
  154. package/websql/esm2022/lib/helpers.mjs +0 -358
  155. package/websql/esm2022/lib/models.mjs +0 -4
  156. package/websql/lib/models.d.ts +0 -11
  157. /package/browser/lib/{for-browser → helpers/for-browser}/angular.helper.d.ts +0 -0
  158. /package/browser/lib/{for-browser → helpers/for-browser}/helpers-browser.d.ts +0 -0
  159. /package/browser/lib/{helpers-array-obj.d.ts → helpers/helpers-array-obj.d.ts} +0 -0
  160. /package/browser/lib/{helpers-numbers.d.ts → helpers/helpers-numbers.d.ts} +0 -0
  161. /package/browser/lib/{helpers-strings-regexes.d.ts → helpers/helpers-strings-regexes.d.ts} +0 -0
  162. /package/browser/lib/{helpers-strings.d.ts → helpers/helpers-strings.d.ts} +0 -0
  163. /package/client/lib/{for-browser → helpers/for-browser}/angular.helper.d.ts +0 -0
  164. /package/client/lib/{for-browser → helpers/for-browser}/helpers-browser.d.ts +0 -0
  165. /package/client/lib/{helpers-array-obj.d.ts → helpers/helpers-array-obj.d.ts} +0 -0
  166. /package/client/lib/{helpers-numbers.d.ts → helpers/helpers-numbers.d.ts} +0 -0
  167. /package/client/lib/{helpers-strings-regexes.d.ts → helpers/helpers-strings-regexes.d.ts} +0 -0
  168. /package/client/lib/{helpers-strings.d.ts → helpers/helpers-strings.d.ts} +0 -0
  169. /package/lib/{for-backend → helpers/for-backend}/helpers-console-gui.d.ts +0 -0
  170. /package/lib/{for-backend → helpers/for-backend}/helpers-dependencies.backend.d.ts +0 -0
  171. /package/lib/{for-backend → helpers/for-backend}/helpers-network.backend.d.ts +0 -0
  172. /package/lib/{for-backend → helpers/for-backend}/helpers-network.backend.js +0 -0
  173. /package/lib/{for-backend → helpers/for-backend}/helpers-network.backend.js.map +0 -0
  174. /package/lib/{for-backend → helpers/for-backend}/helpers-npm.backend.d.ts +0 -0
  175. /package/lib/{for-backend → helpers/for-backend}/helpers-npm.backend.js +0 -0
  176. /package/lib/{for-backend → helpers/for-backend}/helpers-npm.backend.js.map +0 -0
  177. /package/lib/{for-backend → helpers/for-backend}/helpers-path.backend.d.ts +0 -0
  178. /package/lib/{for-backend → helpers/for-backend}/helpers-system-terminal.backend.d.ts +0 -0
  179. /package/lib/{for-backend → helpers/for-backend}/ts-code/index.d.ts +0 -0
  180. /package/lib/{for-backend → helpers/for-backend}/ts-code/index.js +0 -0
  181. /package/lib/{for-backend → helpers/for-backend}/ts-code/index.js.map +0 -0
  182. /package/lib/{for-backend → helpers/for-backend}/ts-code/ts-code-extractor.d.ts +0 -0
  183. /package/lib/{for-backend → helpers/for-backend}/ts-code/ts-code-modifier.backend.d.ts +0 -0
  184. /package/lib/{for-browser → helpers/for-browser}/angular.helper.d.ts +0 -0
  185. /package/lib/{for-browser → helpers/for-browser}/angular.helper.js.map +0 -0
  186. /package/lib/{for-browser → helpers/for-browser}/helpers-browser.d.ts +0 -0
  187. /package/lib/{for-browser → helpers/for-browser}/helpers-browser.js +0 -0
  188. /package/lib/{for-browser → helpers/for-browser}/helpers-browser.js.map +0 -0
  189. /package/lib/{helpers-array-obj.d.ts → helpers/helpers-array-obj.d.ts} +0 -0
  190. /package/lib/{helpers-array-obj.js → helpers/helpers-array-obj.js} +0 -0
  191. /package/lib/{helpers-array-obj.js.map → helpers/helpers-array-obj.js.map} +0 -0
  192. /package/lib/{helpers-json5.backend.d.ts → helpers/helpers-json5.backend.d.ts} +0 -0
  193. /package/lib/{helpers-json5.backend.js → helpers/helpers-json5.backend.js} +0 -0
  194. /package/lib/{helpers-json5.backend.js.map → helpers/helpers-json5.backend.js.map} +0 -0
  195. /package/lib/{helpers-numbers.d.ts → helpers/helpers-numbers.d.ts} +0 -0
  196. /package/lib/{helpers-numbers.js → helpers/helpers-numbers.js} +0 -0
  197. /package/lib/{helpers-numbers.js.map → helpers/helpers-numbers.js.map} +0 -0
  198. /package/lib/{helpers-strings-regexes.d.ts → helpers/helpers-strings-regexes.d.ts} +0 -0
  199. /package/lib/{helpers-strings-regexes.js → helpers/helpers-strings-regexes.js} +0 -0
  200. /package/lib/{helpers-strings-regexes.js.map → helpers/helpers-strings-regexes.js.map} +0 -0
  201. /package/lib/{helpers-strings.d.ts → helpers/helpers-strings.d.ts} +0 -0
  202. /package/websql/lib/{for-browser → helpers/for-browser}/angular.helper.d.ts +0 -0
  203. /package/websql/lib/{for-browser → helpers/for-browser}/helpers-browser.d.ts +0 -0
  204. /package/websql/lib/{helpers-array-obj.d.ts → helpers/helpers-array-obj.d.ts} +0 -0
  205. /package/websql/lib/{helpers-numbers.d.ts → helpers/helpers-numbers.d.ts} +0 -0
  206. /package/websql/lib/{helpers-strings-regexes.d.ts → helpers/helpers-strings-regexes.d.ts} +0 -0
  207. /package/websql/lib/{helpers-strings.d.ts → helpers/helpers-strings.d.ts} +0 -0
@@ -1,117 +0,0 @@
1
- import { _ } from 'tnp-core/websql';
2
- import * as fuzzy from 'fuzzy';
3
- export class HelpersArrayObj {
4
- from(s) {
5
- if (_.isArray(s)) {
6
- return s;
7
- }
8
- if (_.isString(s)) {
9
- return s.split(' ');
10
- }
11
- }
12
- second(arr) {
13
- if (!Array.isArray(arr) || arr.length < 2) {
14
- return void 0;
15
- }
16
- return arr[1];
17
- }
18
- /**
19
- * @deprecated
20
- * use moveObjectBefore
21
- */
22
- arrayMoveElementBefore(arr, a, b, prop) {
23
- let indexA = prop ? arr.findIndex(elem => elem[prop] === a[prop]) : arr.indexOf(a);
24
- _.pullAt(arr, indexA);
25
- let indexB = prop ? arr.findIndex(elem => elem[prop] === b[prop]) : arr.indexOf(b);
26
- if (indexB === 0) {
27
- arr.unshift(a);
28
- }
29
- else {
30
- arr.splice(indexB - 1, 0, a);
31
- }
32
- return arr;
33
- }
34
- /**
35
- * @deprecated
36
- * use moveObjectAfter
37
- */
38
- arrayMoveElementAfterB(arr, a, b, prop) {
39
- let indexA = prop ? arr.findIndex(elem => elem[prop] === a[prop]) : arr.indexOf(a);
40
- _.pullAt(arr, indexA);
41
- let indexB = prop ? arr.findIndex(elem => elem[prop] === b[prop]) : arr.indexOf(b);
42
- if (indexB === arr.length - 1) {
43
- arr.push(a);
44
- }
45
- else {
46
- arr.splice(indexB + 1, 0, a);
47
- }
48
- return arr;
49
- }
50
- moveObjectBefore(array, target, before) {
51
- const newArray = [...array];
52
- const targetIndex = newArray.findIndex(item => item === target);
53
- const beforeIndex = newArray.findIndex(item => item === before);
54
- if (targetIndex === -1 || beforeIndex === -1) {
55
- console.error("Target or Before object not found in the array");
56
- return newArray;
57
- }
58
- newArray.splice(targetIndex, 1);
59
- newArray.splice(beforeIndex, 0, target);
60
- return newArray;
61
- }
62
- moveObjectAfter(array, target, after) {
63
- const newArray = [...array];
64
- const targetIndex = newArray.findIndex(item => item === target);
65
- const afterIndex = newArray.findIndex(item => item === after);
66
- if (targetIndex === -1 || afterIndex === -1) {
67
- console.error("Target or After object not found in the array");
68
- return newArray;
69
- }
70
- newArray.splice(targetIndex, 1);
71
- newArray.splice(afterIndex + 1, 0, target);
72
- return newArray;
73
- }
74
- /**
75
- * @deprecated
76
- */
77
- uniqArray(array, uniqueProperty) {
78
- var seen = {};
79
- return array
80
- .filter(f => !!f)
81
- .filter(function (item) {
82
- return seen.hasOwnProperty(uniqueProperty ? item[uniqueProperty] : item) ? false
83
- : (seen[uniqueProperty ? item[uniqueProperty] : item] = true);
84
- });
85
- }
86
- sortKeys(obj) {
87
- if (_.isArray(obj)) {
88
- return obj.map(this.sortKeys);
89
- }
90
- if (_.isObject(obj)) {
91
- return _.fromPairs(_.keys(obj).sort().map(key => [key, this.sortKeys(obj[key])]));
92
- }
93
- return obj;
94
- }
95
- ;
96
- /**
97
- * Fuzzy search
98
- */
99
- fuzzy(query, list, valueFn) {
100
- const resultsFuzzy = fuzzy.filter(query, list.map(k => valueFn ? valueFn(k) : k));
101
- const resultsFuzzyKebab = fuzzy.filter(_.kebabCase(query), list.map(k => _.kebabCase((valueFn ? valueFn(k) : k))));
102
- const matches = resultsFuzzy.map((el) => el.string);
103
- const matchesKebab = resultsFuzzyKebab.map((el) => el.string);
104
- const results = (resultsFuzzy.length === 0) ? [] : list.filter(k => {
105
- return matches.includes((valueFn ? valueFn(k) : k));
106
- });
107
- if (matches.length === 0 && matchesKebab.length > 0) {
108
- const m = list.find(k => _.kebabCase((valueFn ? valueFn(k) : k)) === _.first(matchesKebab));
109
- results.push(m);
110
- matches.push((valueFn ? valueFn(m) : m));
111
- }
112
- return { matches, results };
113
- }
114
- }
115
- ;
116
- ({}); // @--end-of-file-for-module=tnp-helpers lib/helpers-array-obj.ts
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy1hcnJheS1vYmouanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90bXAtbGlicy1mb3ItZGlzdC13ZWJzcWwvdG5wLWhlbHBlcnMvcHJvamVjdHMvdG5wLWhlbHBlcnMvc3JjL2xpYi9oZWxwZXJzLWFycmF5LW9iai50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEMsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFHL0IsTUFBTSxPQUFPLGVBQWU7SUFFMUIsSUFBSSxDQUFDLENBQW9CO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNoQixPQUFPLENBQUMsQ0FBQztTQUNWO1FBQ0QsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUNwQjtJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsR0FBRztRQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pDLE9BQU8sS0FBSyxDQUFDLENBQUM7U0FDZjtRQUNELE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxzQkFBc0IsQ0FBVSxHQUFVLEVBQUUsQ0FBTSxFQUFFLENBQU0sRUFBRSxJQUFjO1FBQ3hFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2hCLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEI7YUFBTTtZQUNMLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDSCxzQkFBc0IsQ0FBVSxHQUFVLEVBQUUsQ0FBTSxFQUFFLENBQU0sRUFBRSxJQUFjO1FBQ3hFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsSUFBSSxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNiO2FBQU07WUFDTCxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsZ0JBQWdCLENBQVUsS0FBVSxFQUFFLE1BQVMsRUFBRSxNQUFTO1FBQ3hELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUM1QixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7UUFFaEUsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBRTVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztZQUNoRSxPQUFPLFFBQVEsQ0FBQztTQUNqQjtRQUdELFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBR2hDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV4QyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsZUFBZSxDQUFVLEtBQVUsRUFBRSxNQUFTLEVBQUUsS0FBUTtRQUN0RCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDNUIsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQztRQUNoRSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBRTlELElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUUzQyxPQUFPLENBQUMsS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7WUFDL0QsT0FBTyxRQUFRLENBQUM7U0FDakI7UUFHRCxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUdoQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTNDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBVSxLQUFZLEVBQUUsY0FBMEI7UUFDekQsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsT0FBTyxLQUFLO2FBQ1QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoQixNQUFNLENBQUMsVUFBVSxJQUFJO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7Z0JBQzlFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFRLENBQUM7SUFDZCxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQUc7UUFDVixJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbEIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvQjtRQUNELElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuQixPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25GO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQUEsQ0FBQztJQUVGOztPQUVHO0lBQ0gsS0FBSyxDQUFVLEtBQWEsRUFBRSxJQUFTLEVBQUUsT0FBc0M7UUFDN0UsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FDL0IsS0FBSyxFQUNMLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3hDLENBQUE7UUFDRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQ3BDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUSxDQUFDLENBQUMsQ0FDOUQsQ0FBQTtRQUNELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5RCxNQUFNLE9BQU8sR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNqRSxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFRLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDbkcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUSxDQUFDLENBQUM7U0FDakQ7UUFFRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzlCLENBQUM7Q0FFRjtBQUVBLENBQUM7QUFBQSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUVBQWlFIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbmltcG9ydCB7IF8gfSBmcm9tICd0bnAtY29yZS93ZWJzcWwnO1xuaW1wb3J0ICogYXMgZnV6enkgZnJvbSAnZnV6enknO1xuXG5cbmV4cG9ydCBjbGFzcyBIZWxwZXJzQXJyYXlPYmoge1xuXG4gIGZyb20oczogc3RyaW5nIHwgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgaWYgKF8uaXNBcnJheShzKSkge1xuICAgICAgcmV0dXJuIHM7XG4gICAgfVxuICAgIGlmIChfLmlzU3RyaW5nKHMpKSB7XG4gICAgICByZXR1cm4gcy5zcGxpdCgnICcpXG4gICAgfVxuICB9XG5cbiAgc2Vjb25kKGFycikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpIHx8IGFyci5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gYXJyWzFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIHVzZSBtb3ZlT2JqZWN0QmVmb3JlXG4gICAqL1xuICBhcnJheU1vdmVFbGVtZW50QmVmb3JlPFQgPSBhbnk+KGFycjogYW55W10sIGE6IGFueSwgYjogYW55LCBwcm9wPzoga2V5b2YgVCkge1xuICAgIGxldCBpbmRleEEgPSBwcm9wID8gYXJyLmZpbmRJbmRleChlbGVtID0+IGVsZW1bcHJvcF0gPT09IGFbcHJvcF0pIDogYXJyLmluZGV4T2YoYSk7XG4gICAgXy5wdWxsQXQoYXJyLCBpbmRleEEpO1xuICAgIGxldCBpbmRleEIgPSBwcm9wID8gYXJyLmZpbmRJbmRleChlbGVtID0+IGVsZW1bcHJvcF0gPT09IGJbcHJvcF0pIDogYXJyLmluZGV4T2YoYik7XG4gICAgaWYgKGluZGV4QiA9PT0gMCkge1xuICAgICAgYXJyLnVuc2hpZnQoYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyci5zcGxpY2UoaW5kZXhCIC0gMSwgMCwgYSk7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogdXNlIG1vdmVPYmplY3RBZnRlclxuICAgKi9cbiAgYXJyYXlNb3ZlRWxlbWVudEFmdGVyQjxUID0gYW55PihhcnI6IGFueVtdLCBhOiBhbnksIGI6IGFueSwgcHJvcD86IGtleW9mIFQpIHtcbiAgICBsZXQgaW5kZXhBID0gcHJvcCA/IGFyci5maW5kSW5kZXgoZWxlbSA9PiBlbGVtW3Byb3BdID09PSBhW3Byb3BdKSA6IGFyci5pbmRleE9mKGEpO1xuICAgIF8ucHVsbEF0KGFyciwgaW5kZXhBKTtcbiAgICBsZXQgaW5kZXhCID0gcHJvcCA/IGFyci5maW5kSW5kZXgoZWxlbSA9PiBlbGVtW3Byb3BdID09PSBiW3Byb3BdKSA6IGFyci5pbmRleE9mKGIpO1xuICAgIGlmIChpbmRleEIgPT09IGFyci5sZW5ndGggLSAxKSB7XG4gICAgICBhcnIucHVzaChhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJyLnNwbGljZShpbmRleEIgKyAxLCAwLCBhKTtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIG1vdmVPYmplY3RCZWZvcmU8VCA9IGFueT4oYXJyYXk6IFRbXSwgdGFyZ2V0OiBULCBiZWZvcmU6IFQpOiBUW10ge1xuICAgIGNvbnN0IG5ld0FycmF5ID0gWy4uLmFycmF5XTtcbiAgICBjb25zdCB0YXJnZXRJbmRleCA9IG5ld0FycmF5LmZpbmRJbmRleChpdGVtID0+IGl0ZW0gPT09IHRhcmdldCk7XG4gICAgY29uc3QgYmVmb3JlSW5kZXggPSBuZXdBcnJheS5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSBiZWZvcmUpO1xuXG4gICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSB8fCBiZWZvcmVJbmRleCA9PT0gLTEpIHtcblxuICAgICAgY29uc29sZS5lcnJvcihcIlRhcmdldCBvciBCZWZvcmUgb2JqZWN0IG5vdCBmb3VuZCBpbiB0aGUgYXJyYXlcIik7XG4gICAgICByZXR1cm4gbmV3QXJyYXk7XG4gICAgfVxuXG5cbiAgICBuZXdBcnJheS5zcGxpY2UodGFyZ2V0SW5kZXgsIDEpO1xuXG5cbiAgICBuZXdBcnJheS5zcGxpY2UoYmVmb3JlSW5kZXgsIDAsIHRhcmdldCk7XG5cbiAgICByZXR1cm4gbmV3QXJyYXk7XG4gIH1cblxuICBtb3ZlT2JqZWN0QWZ0ZXI8VCA9IGFueT4oYXJyYXk6IFRbXSwgdGFyZ2V0OiBULCBhZnRlcjogVCk6IFRbXSB7XG4gICAgY29uc3QgbmV3QXJyYXkgPSBbLi4uYXJyYXldO1xuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gbmV3QXJyYXkuZmluZEluZGV4KGl0ZW0gPT4gaXRlbSA9PT0gdGFyZ2V0KTtcbiAgICBjb25zdCBhZnRlckluZGV4ID0gbmV3QXJyYXkuZmluZEluZGV4KGl0ZW0gPT4gaXRlbSA9PT0gYWZ0ZXIpO1xuXG4gICAgaWYgKHRhcmdldEluZGV4ID09PSAtMSB8fCBhZnRlckluZGV4ID09PSAtMSkge1xuXG4gICAgICBjb25zb2xlLmVycm9yKFwiVGFyZ2V0IG9yIEFmdGVyIG9iamVjdCBub3QgZm91bmQgaW4gdGhlIGFycmF5XCIpO1xuICAgICAgcmV0dXJuIG5ld0FycmF5O1xuICAgIH1cblxuXG4gICAgbmV3QXJyYXkuc3BsaWNlKHRhcmdldEluZGV4LCAxKTtcblxuXG4gICAgbmV3QXJyYXkuc3BsaWNlKGFmdGVySW5kZXggKyAxLCAwLCB0YXJnZXQpO1xuXG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICB1bmlxQXJyYXk8VCA9IGFueT4oYXJyYXk6IGFueVtdLCB1bmlxdWVQcm9wZXJ0eT86IChrZXlvZiBUKSkge1xuICAgIHZhciBzZWVuID0ge307XG4gICAgcmV0dXJuIGFycmF5XG4gICAgICAuZmlsdGVyKGYgPT4gISFmKVxuICAgICAgLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gc2Vlbi5oYXNPd25Qcm9wZXJ0eSh1bmlxdWVQcm9wZXJ0eSA/IGl0ZW1bdW5pcXVlUHJvcGVydHldIDogaXRlbSkgPyBmYWxzZVxuICAgICAgICAgIDogKHNlZW5bdW5pcXVlUHJvcGVydHkgPyBpdGVtW3VuaXF1ZVByb3BlcnR5XSA6IGl0ZW1dID0gdHJ1ZSk7XG4gICAgICB9KSBhcyBUW107XG4gIH1cblxuICBzb3J0S2V5cyhvYmopIHtcbiAgICBpZiAoXy5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiBvYmoubWFwKHRoaXMuc29ydEtleXMpO1xuICAgIH1cbiAgICBpZiAoXy5pc09iamVjdChvYmopKSB7XG4gICAgICByZXR1cm4gXy5mcm9tUGFpcnMoXy5rZXlzKG9iaikuc29ydCgpLm1hcChrZXkgPT4gW2tleSwgdGhpcy5zb3J0S2V5cyhvYmpba2V5XSldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1enp5IHNlYXJjaFxuICAgKi9cbiAgZnV6enk8VCA9IGFueT4ocXVlcnk6IHN0cmluZywgbGlzdDogVFtdLCB2YWx1ZUZuPzogKG1vZGVsRnJvbUxpc3Q6IFQpID0+IHN0cmluZykge1xuICAgIGNvbnN0IHJlc3VsdHNGdXp6eSA9IGZ1enp5LmZpbHRlcihcbiAgICAgIHF1ZXJ5LFxuICAgICAgbGlzdC5tYXAoayA9PiB2YWx1ZUZuID8gdmFsdWVGbihrKSA6IGspLFxuICAgIClcbiAgICBjb25zdCByZXN1bHRzRnV6enlLZWJhYiA9IGZ1enp5LmZpbHRlcihcbiAgICAgIF8ua2ViYWJDYXNlKHF1ZXJ5KSxcbiAgICAgIGxpc3QubWFwKGsgPT4gXy5rZWJhYkNhc2UoKHZhbHVlRm4gPyB2YWx1ZUZuKGspIDogaykgYXMgYW55KSksXG4gICAgKVxuICAgIGNvbnN0IG1hdGNoZXMgPSByZXN1bHRzRnV6enkubWFwKChlbCkgPT4gZWwuc3RyaW5nKTtcbiAgICBjb25zdCBtYXRjaGVzS2ViYWIgPSByZXN1bHRzRnV6enlLZWJhYi5tYXAoKGVsKSA9PiBlbC5zdHJpbmcpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IChyZXN1bHRzRnV6enkubGVuZ3RoID09PSAwKSA/IFtdIDogbGlzdC5maWx0ZXIoayA9PiB7XG4gICAgICByZXR1cm4gbWF0Y2hlcy5pbmNsdWRlcygodmFsdWVGbiA/IHZhbHVlRm4oaykgOiBrKSBhcyBhbnkpO1xuICAgIH0pXG5cbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDAgJiYgbWF0Y2hlc0tlYmFiLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG0gPSBsaXN0LmZpbmQoayA9PiBfLmtlYmFiQ2FzZSgodmFsdWVGbiA/IHZhbHVlRm4oaykgOiBrKSBhcyBhbnkpID09PSBfLmZpcnN0KG1hdGNoZXNLZWJhYikpO1xuICAgICAgcmVzdWx0cy5wdXNoKG0pO1xuICAgICAgbWF0Y2hlcy5wdXNoKCh2YWx1ZUZuID8gdmFsdWVGbihtKSA6IG0pIGFzIGFueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbWF0Y2hlcywgcmVzdWx0cyB9O1xuICB9XG5cbn1cblxuIDsoe30pOyAvLyBALS1lbmQtb2YtZmlsZS1mb3ItbW9kdWxlPXRucC1oZWxwZXJzIGxpYi9oZWxwZXJzLWFycmF5LW9iai50cyJdfQ==
@@ -1,12 +0,0 @@
1
- export class HelpersNumber {
2
- constructor() {
3
- /**
4
- * @deprecated
5
- * use _.random()
6
- */
7
- this.randomInteger = (max, min) => Math.round(Math.random() * (max - min)) + min;
8
- }
9
- }
10
- ;
11
- ({}); // @--end-of-file-for-module=tnp-helpers lib/helpers-numbers.ts
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy1udW1iZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWRpc3Qtd2Vic3FsL3RucC1oZWxwZXJzL3Byb2plY3RzL3RucC1oZWxwZXJzL3NyYy9saWIvaGVscGVycy1udW1iZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBTyxhQUFhO0lBQTFCO1FBQ0U7OztXQUdHO1FBQ0gsa0JBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBRzlFLENBQUM7Q0FBQTtBQUVBLENBQUM7QUFBQSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsK0RBQStEIiwic291cmNlc0NvbnRlbnQiOlsiXG5cblxuZXhwb3J0IGNsYXNzIEhlbHBlcnNOdW1iZXIge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogdXNlIF8ucmFuZG9tKClcbiAgICovXG4gIHJhbmRvbUludGVnZXIgPSAobWF4LCBtaW4pID0+IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcblxuXG59XG5cbiA7KHt9KTsgLy8gQC0tZW5kLW9mLWZpbGUtZm9yLW1vZHVsZT10bnAtaGVscGVycyBsaWIvaGVscGVycy1udW1iZXJzLnRzIl19
@@ -1,51 +0,0 @@
1
- import { _ } from 'tnp-core/websql';
2
- export class HelpersStringsRegexes {
3
- escapeStringForRegEx(s) {
4
- return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
5
- }
6
- matchExactOnce(s, regex) {
7
- if (!_.isString(s) || !_.isRegExp(regex)) {
8
- return void 0;
9
- }
10
- const result = s.match(regex);
11
- if (_.isNil(result)) {
12
- return void 0;
13
- }
14
- return result.length >= 1 ? _.first(result) : void 0;
15
- }
16
- get regex() {
17
- return {
18
- /**
19
- * mathes
20
- * xxx.xxx.xxx.xxx
21
- * xxx.xxx.xxx.xxx:port
22
- * http://xxx.xxx.xxx.xxx:port
23
- * http://xxx.xxx.xxx.xxx
24
- * https://xxx.xxx.xxx.xxx:port
25
- * https://xxx.xxx.xxx.xxx *
26
- */
27
- get forStringWithIpHost() {
28
- const regex = /(http(s)?\:\/\/)?(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\:[0-9]+)?/;
29
- return regex;
30
- },
31
- /**
32
- * mathes
33
- * http://domain.com:port
34
- * http://domain.com
35
- * http://domain:port
36
- * http://domain
37
- * https://domain.com:port
38
- * https://domain.com
39
- * https://domain:port
40
- * https://domain
41
- */
42
- get forStringWithDomainHost() {
43
- const regex = /(((http(s)?\:\/\/)?[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+(\:[0-9]+)?)|((http(s)?\:\/\/)[a-zA-Z0-9-]{1,61}))/;
44
- return regex;
45
- }
46
- };
47
- }
48
- }
49
- ;
50
- ({}); // @--end-of-file-for-module=tnp-helpers lib/helpers-strings-regexes.ts
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy1zdHJpbmdzLXJlZ2V4ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90bXAtbGlicy1mb3ItZGlzdC13ZWJzcWwvdG5wLWhlbHBlcnMvcHJvamVjdHMvdG5wLWhlbHBlcnMvc3JjL2xpYi9oZWxwZXJzLXN0cmluZ3MtcmVnZXhlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEMsTUFBTSxPQUFPLHFCQUFxQjtJQUloQyxvQkFBb0IsQ0FBQyxDQUFTO1FBQzVCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsY0FBYyxDQUFDLENBQVMsRUFBRSxLQUFhO1FBQ3JDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4QyxPQUFPLEtBQUssQ0FBQyxDQUFDO1NBQ2Y7UUFDRCxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQyxDQUFDO1NBQ2Y7UUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTztZQUNMOzs7Ozs7OzthQVFDO1lBQ0QsSUFBSSxtQkFBbUI7Z0JBQ3JCLE1BQU0sS0FBSyxHQUFHLDRMQUE0TCxDQUFDO2dCQUMzTSxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRDs7Ozs7Ozs7OztZQVVBO1lBQ0EsSUFBSSx1QkFBdUI7Z0JBQ3pCLE1BQU0sS0FBSyxHQUFHLGtJQUFrSSxDQUFDO2dCQUNqSixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7U0FDRixDQUFBO0lBQ0gsQ0FBQztDQUNGO0FBRUEsQ0FBQztBQUFBLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyx1RUFBdUUiLCJzb3VyY2VzQ29udGVudCI6WyJcblxuaW1wb3J0IHsgXyB9IGZyb20gJ3RucC1jb3JlL3dlYnNxbCc7XG5leHBvcnQgY2xhc3MgSGVscGVyc1N0cmluZ3NSZWdleGVzIHtcblxuXG5cbiAgZXNjYXBlU3RyaW5nRm9yUmVnRXgoczogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHMucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG4gIH1cblxuICBtYXRjaEV4YWN0T25jZShzOiBzdHJpbmcsIHJlZ2V4OiBSZWdFeHApOiBzdHJpbmcge1xuICAgIGlmICghXy5pc1N0cmluZyhzKSB8fCAhXy5pc1JlZ0V4cChyZWdleCkpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHMubWF0Y2gocmVnZXgpO1xuICAgIGlmIChfLmlzTmlsKHJlc3VsdCkpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQubGVuZ3RoID49IDEgPyBfLmZpcnN0KHJlc3VsdCkgOiB2b2lkIDA7XG4gIH1cblxuICBnZXQgcmVnZXgoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAqIG1hdGhlc1xuICAgICAqIHh4eC54eHgueHh4Lnh4eFxuICAgICAqIHh4eC54eHgueHh4Lnh4eDpwb3J0XG4gICAgICogaHR0cDovL3h4eC54eHgueHh4Lnh4eDpwb3J0XG4gICAgICogaHR0cDovL3h4eC54eHgueHh4Lnh4eFxuICAgICAqIGh0dHBzOi8veHh4Lnh4eC54eHgueHh4OnBvcnRcbiAgICAgKiBodHRwczovL3h4eC54eHgueHh4Lnh4eCAgICpcbiAgICAgKi9cbiAgICAgIGdldCBmb3JTdHJpbmdXaXRoSXBIb3N0KCkge1xuICAgICAgICBjb25zdCByZWdleCA9IC8oaHR0cChzKT9cXDpcXC9cXC8pPygyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pKFxcOlswLTldKyk/LztcbiAgICAgICAgcmV0dXJuIHJlZ2V4O1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICogbWF0aGVzXG4gICAgKiBodHRwOi8vZG9tYWluLmNvbTpwb3J0XG4gICAgKiBodHRwOi8vZG9tYWluLmNvbVxuICAgICogaHR0cDovL2RvbWFpbjpwb3J0XG4gICAgKiBodHRwOi8vZG9tYWluXG4gICAgKiBodHRwczovL2RvbWFpbi5jb206cG9ydFxuICAgICogaHR0cHM6Ly9kb21haW4uY29tXG4gICAgKiBodHRwczovL2RvbWFpbjpwb3J0XG4gICAgKiBodHRwczovL2RvbWFpblxuICAgICovXG4gICAgICBnZXQgZm9yU3RyaW5nV2l0aERvbWFpbkhvc3QoKSB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gLygoKGh0dHAocyk/XFw6XFwvXFwvKT9bYS16QS1aMC05XVthLXpBLVowLTktXXsxLDYxfVthLXpBLVowLTldKD86XFwuW2EtekEtWl17Mix9KSsoXFw6WzAtOV0rKT8pfCgoaHR0cChzKT9cXDpcXC9cXC8pW2EtekEtWjAtOS1dezEsNjF9KSkvO1xuICAgICAgICByZXR1cm4gcmVnZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbiA7KHt9KTsgLy8gQC0tZW5kLW9mLWZpbGUtZm9yLW1vZHVsZT10bnAtaGVscGVycyBsaWIvaGVscGVycy1zdHJpbmdzLXJlZ2V4ZXMudHMiXX0=
@@ -1,258 +0,0 @@
1
- import { _ } from 'tnp-core/websql';
2
- import { Helpers } from './index';
3
- export class HelpersStrings {
4
- /**
5
- * Example:
6
- *
7
- * const result = interpolateString("I'm {age} years old!")
8
- * .withParameters({ age: 29 });
9
- *
10
- * const result = interpolateString("The {a} says {n}, {n}, {n}!")
11
- * .withParameters({ a: 'cow', n: 'moo' });
12
- *
13
- *
14
- * @param value string to interpolate
15
- * @param parameters object with parametes
16
- */
17
- interpolateString(value) {
18
- if (typeof value !== 'string') {
19
- Helpers.warn('[firedev-heleprs] Value for interpolation is not string: ', value);
20
- return value;
21
- }
22
- return {
23
- withParameters(parameters) {
24
- if (typeof parameters !== 'object') {
25
- Helpers.log(parameters);
26
- Helpers.warn('[firedev-heleprs] Parameters are not a object: ');
27
- return value;
28
- }
29
- return value.replace(/{([^{}]*)}/g, function (a, b) {
30
- var r = parameters[b];
31
- return typeof r === 'string' || typeof r === 'number' ? r : a;
32
- });
33
- }
34
- };
35
- }
36
- /**
37
- *
38
- * @param pixelsCss exmaple: 100px
39
- * @returns number value
40
- */
41
- numValue(pixelsCss) {
42
- return parseInt(pixelsCss.replace('px', ''));
43
- }
44
- /**
45
- * examples:
46
- * 'aa bb bb' => ['aa','bb','cc'],
47
- * 'aa' => ['aa']
48
- * ['aa'] => ['aa']
49
- */
50
- splitIfNeed(stringOrArr) {
51
- let res = [];
52
- if (_.isArray(stringOrArr)) {
53
- res = stringOrArr.map(s => {
54
- return s.trim();
55
- });
56
- }
57
- if (_.isString(stringOrArr)) {
58
- res = stringOrArr.split(/\s*[\s,]\s*/);
59
- }
60
- return res.filter(f => !!f && (f.trim() !== ''));
61
- }
62
- removeDoubleOrMoreEmptyLines(s) {
63
- s = s?.split('\n').map(f => f.trimRight()).join('\n');
64
- return s?.replace(/(\r\n|\r|\n){2,}/g, '$1\n');
65
- }
66
- /**
67
- *
68
- * https://stackoverflow.com/a/57129703/1345101
69
- *
70
- * Returns the plural of an English word.
71
- *
72
- * @export
73
- * @param {string} word
74
- * @param {number} [amount]
75
- * @returns {string}
76
- */
77
- plural(word, amount) {
78
- if (amount !== undefined && amount === 1) {
79
- return word;
80
- }
81
- const plural = {
82
- '(quiz)$': "$1zes",
83
- '^(ox)$': "$1en",
84
- '([m|l])ouse$': "$1ice",
85
- '(matr|vert|ind)ix|ex$': "$1ices",
86
- '(x|ch|ss|sh)$': "$1es",
87
- '([^aeiouy]|qu)y$': "$1ies",
88
- '(hive)$': "$1s",
89
- '(?:([^f])fe|([lr])f)$': "$1$2ves",
90
- '(shea|lea|loa|thie)f$': "$1ves",
91
- 'sis$': "ses",
92
- '([ti])um$': "$1a",
93
- '(tomat|potat|ech|her|vet)o$': "$1oes",
94
- '(bu)s$': "$1ses",
95
- '(alias)$': "$1es",
96
- '(octop)us$': "$1i",
97
- '(ax|test)is$': "$1es",
98
- '(us)$': "$1es",
99
- '([^s]+)$': "$1s"
100
- };
101
- const irregular = {
102
- 'move': 'moves',
103
- 'foot': 'feet',
104
- 'goose': 'geese',
105
- 'sex': 'sexes',
106
- 'child': 'children',
107
- 'man': 'men',
108
- 'tooth': 'teeth',
109
- 'person': 'people'
110
- };
111
- const uncountable = [
112
- 'sheep',
113
- 'fish',
114
- 'deer',
115
- 'moose',
116
- 'series',
117
- 'species',
118
- 'money',
119
- 'rice',
120
- 'information',
121
- 'equipment',
122
- 'bison',
123
- 'cod',
124
- 'offspring',
125
- 'pike',
126
- 'salmon',
127
- 'shrimp',
128
- 'swine',
129
- 'trout',
130
- 'aircraft',
131
- 'hovercraft',
132
- 'spacecraft',
133
- 'sugar',
134
- 'tuna',
135
- 'you',
136
- 'wood'
137
- ];
138
- if (uncountable.indexOf(word.toLowerCase()) >= 0) {
139
- return word;
140
- }
141
- for (const w in irregular) {
142
- const pattern = new RegExp(`${w}$`, 'i');
143
- const replace = irregular[w];
144
- if (pattern.test(word)) {
145
- return word.replace(pattern, replace);
146
- }
147
- }
148
- for (const reg in plural) {
149
- const pattern = new RegExp(reg, 'i');
150
- if (pattern.test(word)) {
151
- return word.replace(pattern, plural[reg]);
152
- }
153
- }
154
- return word;
155
- }
156
- /**
157
- * https://stackoverflow.com/a/57129703/1345101
158
- *
159
- * Returns the singular of an English word.
160
- *
161
- * @export
162
- * @param {string} word
163
- * @param {number} [amount]
164
- * @returns {string}
165
- */
166
- singular(word, amount) {
167
- if (amount !== undefined && amount !== 1) {
168
- return word;
169
- }
170
- const singular = {
171
- '(quiz)zes$': "$1",
172
- '(matr)ices$': "$1ix",
173
- '(vert|ind)ices$': "$1ex",
174
- '^(ox)en$': "$1",
175
- '(alias)es$': "$1",
176
- '(octop|vir)i$': "$1us",
177
- '(cris|ax|test)es$': "$1is",
178
- '(shoe)s$': "$1",
179
- '(o)es$': "$1",
180
- '(bus)es$': "$1",
181
- '([m|l])ice$': "$1ouse",
182
- '(x|ch|ss|sh)es$': "$1",
183
- '(m)ovies$': "$1ovie",
184
- '(s)eries$': "$1eries",
185
- '([^aeiouy]|qu)ies$': "$1y",
186
- '([lr])ves$': "$1f",
187
- '(tive)s$': "$1",
188
- '(hive)s$': "$1",
189
- '(li|wi|kni)ves$': "$1fe",
190
- '(shea|loa|lea|thie)ves$': "$1f",
191
- '(^analy)ses$': "$1sis",
192
- '((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$': "$1$2sis",
193
- '([ti])a$': "$1um",
194
- '(n)ews$': "$1ews",
195
- '(h|bl)ouses$': "$1ouse",
196
- '(corpse)s$': "$1",
197
- '(us)es$': "$1",
198
- 's$': ""
199
- };
200
- const irregular = {
201
- 'move': 'moves',
202
- 'foot': 'feet',
203
- 'goose': 'geese',
204
- 'sex': 'sexes',
205
- 'child': 'children',
206
- 'man': 'men',
207
- 'tooth': 'teeth',
208
- 'person': 'people'
209
- };
210
- const uncountable = [
211
- 'sheep',
212
- 'fish',
213
- 'deer',
214
- 'moose',
215
- 'series',
216
- 'species',
217
- 'money',
218
- 'rice',
219
- 'information',
220
- 'equipment',
221
- 'bison',
222
- 'cod',
223
- 'offspring',
224
- 'pike',
225
- 'salmon',
226
- 'shrimp',
227
- 'swine',
228
- 'trout',
229
- 'aircraft',
230
- 'hovercraft',
231
- 'spacecraft',
232
- 'sugar',
233
- 'tuna',
234
- 'you',
235
- 'wood'
236
- ];
237
- if (uncountable.indexOf(word.toLowerCase()) >= 0) {
238
- return word;
239
- }
240
- for (const w in irregular) {
241
- const pattern = new RegExp(`${irregular[w]}$`, 'i');
242
- const replace = w;
243
- if (pattern.test(word)) {
244
- return word.replace(pattern, replace);
245
- }
246
- }
247
- for (const reg in singular) {
248
- const pattern = new RegExp(reg, 'i');
249
- if (pattern.test(word)) {
250
- return word.replace(pattern, singular[reg]);
251
- }
252
- }
253
- return word;
254
- }
255
- }
256
- ;
257
- ({}); // @--end-of-file-for-module=tnp-helpers lib/helpers-strings.ts
258
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy1zdHJpbmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWRpc3Qtd2Vic3FsL3RucC1oZWxwZXJzL3Byb2plY3RzL3RucC1oZWxwZXJzL3NyYy9saWIvaGVscGVycy1zdHJpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWxDLE1BQU0sT0FBTyxjQUFjO0lBRXpCOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILGlCQUFpQixDQUFVLEtBQWE7UUFDdEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQywyREFBMkQsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsT0FBTztZQUNMLGNBQWMsQ0FBQyxVQUFhO2dCQUMxQixJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRTtvQkFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFpQixDQUFDLENBQUM7b0JBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQUMsaURBQWlELENBQUMsQ0FBQztvQkFDaEUsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUNoRCxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLE9BQU8sT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLENBQVEsQ0FBQyxDQUFDO1lBQ1osQ0FBQztTQUNGLENBQUE7SUFFSCxDQUFDO0lB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WUFDVixZQUFZO1lBQ1osWUFBWTtZQUNaLE9BQU87WUFDUCxNQUFNO1lBQ04sS0FBSztZQUNMLE1BQU07U0FDUCxDQUFBO1FBRUQsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoRCxPQUFPLElBQUksQ0FBQTtTQUNaO1FBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLEVBQUU7WUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUNuRCxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUE7WUFDakIsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO2FBQ3RDO1NBQ0Y7UUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsRUFBRTtZQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDcEMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO2FBQzVDO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7Q0FFRjtBQUdBLENBQUM7QUFBQSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsK0RBQStEIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbmltcG9ydCB7IF8gfSBmcm9tICd0bnAtY29yZS93ZWJzcWwnO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gJy4vaW5kZXgnO1xuXG5leHBvcnQgY2xhc3MgSGVscGVyc1N0cmluZ3Mge1xuXG4gIC8qKlxuICAgKiBFeGFtcGxlOlxuICAgKlxuICAgKiBjb25zdCByZXN1bHQgPSBpbnRlcnBvbGF0ZVN0cmluZyhcIkknbSB7YWdlfSB5ZWFycyBvbGQhXCIpXG4gICAqIC53aXRoUGFyYW1ldGVycyh7IGFnZTogMjkgfSk7XG4gICAqXG4gICAqIGNvbnN0IHJlc3VsdCA9IGludGVycG9sYXRlU3RyaW5nKFwiVGhlIHthfSBzYXlzIHtufSwge259LCB7bn0hXCIpXG4gICAqIC53aXRoUGFyYW1ldGVycyh7IGE6ICdjb3cnLCBuOiAnbW9vJyB9KTtcbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIHN0cmluZyB0byBpbnRlcnBvbGF0ZVxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyBvYmplY3Qgd2l0aCBwYXJhbWV0ZXNcbiAgICovXG4gIGludGVycG9sYXRlU3RyaW5nPFQgPSBhbnk+KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgSGVscGVycy53YXJuKCdbZmlyZWRldi1oZWxlcHJzXSBWYWx1ZSBmb3IgaW50ZXJwb2xhdGlvbiBpcyBub3Qgc3RyaW5nOiAnLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdpdGhQYXJhbWV0ZXJzKHBhcmFtZXRlcnM6IFQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbWV0ZXJzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIEhlbHBlcnMubG9nKHBhcmFtZXRlcnMgYXMgYW55KTtcbiAgICAgICAgICBIZWxwZXJzLndhcm4oJ1tmaXJlZGV2LWhlbGVwcnNdIFBhcmFtZXRlcnMgYXJlIG5vdCBhIG9iamVjdDogJyk7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC97KFtee31dKil9L2csIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgdmFyIHIgPSBwYXJhbWV0ZXJzW2JdO1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgciA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHIgPT09ICdudW1iZXInID8gciA6IGE7XG4gICAgICAgIH0gYXMgYW55KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcGl4ZWxzQ3NzIGV4bWFwbGU6IDEwMHB4XG4gICAqIEByZXR1cm5zIG51bWJlciB2YWx1ZVxuICAgKi9cbiAgbnVtVmFsdWUocGl4ZWxzQ3NzOiBzdHJpbmcpIHtcblxuICAgIHJldHVybiBwYXJzZUludChwaXhlbHNDc3MucmVwbGFjZSgncHgnLCAnJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIGV4YW1wbGVzOlxuICAgKiAnYWEgYmIgYmInID0+IFsnYWEnLCdiYicsJ2NjJ10sXG4gICAqICdhYScgPT4gWydhYSddXG4gICAqIFsnYWEnXSA9PiBbJ2FhJ11cbiAgICovXG4gIHNwbGl0SWZOZWVkKHN0cmluZ09yQXJyOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBsZXQgcmVzID0gW107XG4gICAgaWYgKF8uaXNBcnJheShzdHJpbmdPckFycikpIHtcbiAgICAgIHJlcyA9IHN0cmluZ09yQXJyLm1hcChzID0+IHtcbiAgICAgICAgcmV0dXJuIHMudHJpbSgpO1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKF8uaXNTdHJpbmcoc3RyaW5nT3JBcnIpKSB7XG4gICAgICByZXMgPSBzdHJpbmdPckFyci5zcGxpdCgvXFxzKltcXHMsXVxccyovKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5maWx0ZXIoZiA9PiAhIWYgJiYgKGYudHJpbSgpICE9PSAnJykpO1xuICB9XG5cbiAgcmVtb3ZlRG91YmxlT3JNb3JlRW1wdHlMaW5lcyhzOiBzdHJpbmcpIHtcbiAgICBzID0gcz8uc3BsaXQoJ1xcbicpLm1hcChmID0+IGYudHJpbVJpZ2h0KCkpLmpvaW4oJ1xcbicpO1xuICAgIHJldHVybiBzPy5yZXBsYWNlKC8oXFxyXFxufFxccnxcXG4pezIsfS9nLCAnJDFcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNTcxMjk3MDMvMTM0NTEwMVxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBwbHVyYWwgb2YgYW4gRW5nbGlzaCB3b3JkLlxuICAgKlxuICAgKiBAZXhwb3J0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYW1vdW50XVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgcGx1cmFsKHdvcmQ6IHN0cmluZywgYW1vdW50PzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYW1vdW50ICE9PSB1bmRlZmluZWQgJiYgYW1vdW50ID09PSAxKSB7XG4gICAgICByZXR1cm4gd29yZFxuICAgIH1cbiAgICBjb25zdCBwbHVyYWw6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAnKHF1aXopJCc6IFwiJDF6ZXNcIixcbiAgICAgICdeKG94KSQnOiBcIiQxZW5cIixcbiAgICAgICcoW218bF0pb3VzZSQnOiBcIiQxaWNlXCIsXG4gICAgICAnKG1hdHJ8dmVydHxpbmQpaXh8ZXgkJzogXCIkMWljZXNcIixcbiAgICAgICcoeHxjaHxzc3xzaCkkJzogXCIkMWVzXCIsXG4gICAgICAnKFteYWVpb3V5XXxxdSl5JCc6IFwiJDFpZXNcIixcbiAgICAgICcoaGl2ZSkkJzogXCIkMXNcIixcbiAgICAgICcoPzooW15mXSlmZXwoW2xyXSlmKSQnOiBcIiQxJDJ2ZXNcIixcbiAgICAgICcoc2hlYXxsZWF8bG9hfHRoaWUpZiQnOiBcIiQxdmVzXCIsXG4gICAgICAnc2lzJCc6IFwic2VzXCIsXG4gICAgICAnKFt0aV0pdW0kJzogXCIkMWFcIixcbiAgICAgICcodG9tYXR8cG90YXR8ZWNofGhlcnx2ZXQpbyQnOiBcIiQxb2VzXCIsXG4gICAgICAnKGJ1KXMkJzogXCIkMXNlc1wiLFxuICAgICAgJyhhbGlhcykkJzogXCIkMWVzXCIsXG4gICAgICAnKG9jdG9wKXVzJCc6IFwiJDFpXCIsXG4gICAgICAnKGF4fHRlc3QpaXMkJzogXCIkMWVzXCIsXG4gICAgICAnKHVzKSQnOiBcIiQxZXNcIixcbiAgICAgICcoW15zXSspJCc6IFwiJDFzXCJcbiAgICB9XG4gICAgY29uc3QgaXJyZWd1bGFyOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgJ21vdmUnOiAnbW92ZXMnLFxuICAgICAgJ2Zvb3QnOiAnZmVldCcsXG4gICAgICAnZ29vc2UnOiAnZ2Vlc2UnLFxuICAgICAgJ3NleCc6ICdzZXhlcycsXG4gICAgICAnY2hpbGQnOiAnY2hpbGRyZW4nLFxuICAgICAgJ21hbic6ICdtZW4nLFxuICAgICAgJ3Rvb3RoJzogJ3RlZXRoJyxcbiAgICAgICdwZXJzb24nOiAncGVvcGxlJ1xuICAgIH1cbiAgICBjb25zdCB1bmNvdW50YWJsZTogc3RyaW5nW10gPSBbXG4gICAgICAnc2hlZXAnLFxuICAgICAgJ2Zpc2gnLFxuICAgICAgJ2RlZXInLFxuICAgICAgJ21vb3NlJyxcbiAgICAgICdzZXJpZXMnLFxuICAgICAgJ3NwZWNpZXMnLFxuICAgICAgJ21vbmV5JyxcbiAgICAgICdyaWNlJyxcbiAgICAgICdpbmZvcm1hdGlvbicsXG4gICAgICAnZXF1aXBtZW50JyxcbiAgICAgICdiaXNvbicsXG4gICAgICAnY29kJyxcbiAgICAgICdvZmZzcHJpbmcnLFxuICAgICAgJ3Bpa2UnLFxuICAgICAgJ3NhbG1vbicsXG4gICAgICAnc2hyaW1wJyxcbiAgICAgICdzd2luZScsXG4gICAgICAndHJvdXQnLFxuICAgICAgJ2FpcmNyYWZ0JyxcbiAgICAgICdob3ZlcmNyYWZ0JyxcbiAgICAgICdzcGFjZWNyYWZ0JyxcbiAgICAgICdzdWdhcicsXG4gICAgICAndHVuYScsXG4gICAgICAneW91JyxcbiAgICAgICd3b29kJ1xuICAgIF1cblxuICAgIGlmICh1bmNvdW50YWJsZS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPj0gMCkge1xuICAgICAgcmV0dXJuIHdvcmRcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHcgaW4gaXJyZWd1bGFyKSB7XG4gICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChgJHt3fSRgLCAnaScpXG4gICAgICBjb25zdCByZXBsYWNlID0gaXJyZWd1bGFyW3ddXG4gICAgICBpZiAocGF0dGVybi50ZXN0KHdvcmQpKSB7XG4gICAgICAgIHJldHVybiB3b3JkLnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlZyBpbiBwbHVyYWwpIHtcbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKHJlZywgJ2knKVxuICAgICAgaWYgKHBhdHRlcm4udGVzdCh3b3JkKSkge1xuICAgICAgICByZXR1cm4gd29yZC5yZXBsYWNlKHBhdHRlcm4sIHBsdXJhbFtyZWddKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd29yZFxuICB9XG5cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzU3MTI5NzAzLzEzNDUxMDFcbiAgICpcbiAgKiBSZXR1cm5zIHRoZSBzaW5ndWxhciBvZiBhbiBFbmdsaXNoIHdvcmQuXG4gICpcbiAgKiBAZXhwb3J0XG4gICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAgKiBAcGFyYW0ge251bWJlcn0gW2Ftb3VudF1cbiAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAqL1xuICBzaW5ndWxhcih3b3JkOiBzdHJpbmcsIGFtb3VudD86IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGFtb3VudCAhPT0gdW5kZWZpbmVkICYmIGFtb3VudCAhPT0gMSkge1xuICAgICAgcmV0dXJuIHdvcmRcbiAgICB9XG4gICAgY29uc3Qgc2luZ3VsYXI6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAnKHF1aXopemVzJCc6IFwiJDFcIixcbiAgICAgICcobWF0cilpY2VzJCc6IFwiJDFpeFwiLFxuICAgICAgJyh2ZXJ0fGluZClpY2VzJCc6IFwiJDFleFwiLFxuICAgICAgJ14ob3gpZW4kJzogXCIkMVwiLFxuICAgICAgJyhhbGlhcyllcyQnOiBcIiQxXCIsXG4gICAgICAnKG9jdG9wfHZpcilpJCc6IFwiJDF1c1wiLFxuICAgICAgJyhjcmlzfGF4fHRlc3QpZXMkJzogXCIkMWlzXCIsXG4gICAgICAnKHNob2UpcyQnOiBcIiQxXCIsXG4gICAgICAnKG8pZXMkJzogXCIkMVwiLFxuICAgICAgJyhidXMpZXMkJzogXCIkMVwiLFxuICAgICAgJyhbbXxsXSlpY2UkJzogXCIkMW91c2VcIixcbiAgICAgICcoeHxjaHxzc3xzaCllcyQnOiBcIiQxXCIsXG4gICAgICAnKG0pb3ZpZXMkJzogXCIkMW92aWVcIixcbiAgICAgICcocyllcmllcyQnOiBcIiQxZXJpZXNcIixcbiAgICAgICcoW15hZWlvdXldfHF1KWllcyQnOiBcIiQxeVwiLFxuICAgICAgJyhbbHJdKXZlcyQnOiBcIiQxZlwiLFxuICAgICAgJyh0aXZlKXMkJzogXCIkMVwiLFxuICAgICAgJyhoaXZlKXMkJzogXCIkMVwiLFxuICAgICAgJyhsaXx3aXxrbmkpdmVzJCc6IFwiJDFmZVwiLFxuICAgICAgJyhzaGVhfGxvYXxsZWF8dGhpZSl2ZXMkJzogXCIkMWZcIixcbiAgICAgICcoXmFuYWx5KXNlcyQnOiBcIiQxc2lzXCIsXG4gICAgICAnKChhKW5hbHl8KGIpYXwoZClpYWdub3wocClhcmVudGhlfChwKXJvZ25vfChzKXlub3B8KHQpaGUpc2VzJCc6IFwiJDEkMnNpc1wiLFxuICAgICAgJyhbdGldKWEkJzogXCIkMXVtXCIsXG4gICAgICAnKG4pZXdzJCc6IFwiJDFld3NcIixcbiAgICAgICcoaHxibClvdXNlcyQnOiBcIiQxb3VzZVwiLFxuICAgICAgJyhjb3Jwc2UpcyQnOiBcIiQxXCIsXG4gICAgICAnKHVzKWVzJCc6IFwiJDFcIixcbiAgICAgICdzJCc6IFwiXCJcbiAgICB9XG4gICAgY29uc3QgaXJyZWd1bGFyOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgJ21vdmUnOiAnbW92ZXMnLFxuICAgICAgJ2Zvb3QnOiAnZmVldCcsXG4gICAgICAnZ29vc2UnOiAnZ2Vlc2UnLFxuICAgICAgJ3NleCc6ICdzZXhlcycsXG4gICAgICAnY2hpbGQnOiAnY2hpbGRyZW4nLFxuICAgICAgJ21hbic6ICdtZW4nLFxuICAgICAgJ3Rvb3RoJzogJ3RlZXRoJyxcbiAgICAgICdwZXJzb24nOiAncGVvcGxlJ1xuICAgIH1cbiAgICBjb25zdCB1bmNvdW50YWJsZTogc3RyaW5nW10gPSBbXG4gICAgICAnc2hlZXAnLFxuICAgICAgJ2Zpc2gnLFxuICAgICAgJ2RlZXInLFxuICAgICAgJ21vb3NlJyxcbiAgICAgICdzZXJpZXMnLFxuICAgICAgJ3NwZWNpZXMnLFxuICAgICAgJ21vbmV5JyxcbiAgICAgICdyaWNlJyxcbiAgICAgICdpbmZvcm1hdGlvbicsXG4gICAgICAnZXF1aXBtZW50JyxcbiAgICAgICdiaXNvbicsXG4gICAgICAnY29kJyxcbiAgICAgICdvZmZzcHJpbmcnLFxuICAgICAgJ3Bpa2UnLFxuICAgICAgJ3NhbG1vbicsXG4gICAgICAnc2hyaW1wJyxcbiAgICAgICdzd2luZScsXG4gICAgICAndHJvdXQnLFxuICAgICAgJ2FpcmNyYWZ0JyxcbiAgICAgICdob3ZlcmNyYWZ0JyxcbiAgICAgICdzcGFjZWNyYWZ0JyxcbiAgICAgICdzdWdhcicsXG4gICAgICAndHVuYScsXG4gICAgICAneW91JyxcbiAgICAgICd3b29kJ1xuICAgIF1cblxuICAgIGlmICh1bmNvdW50YWJsZS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPj0gMCkge1xuICAgICAgcmV0dXJuIHdvcmRcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHcgaW4gaXJyZWd1bGFyKSB7XG4gICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChgJHtpcnJlZ3VsYXJbd119JGAsICdpJylcbiAgICAgIGNvbnN0IHJlcGxhY2UgPSB3XG4gICAgICBpZiAocGF0dGVybi50ZXN0KHdvcmQpKSB7XG4gICAgICAgIHJldHVybiB3b3JkLnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlZyBpbiBzaW5ndWxhcikge1xuICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAocmVnLCAnaScpXG4gICAgICBpZiAocGF0dGVybi50ZXN0KHdvcmQpKSB7XG4gICAgICAgIHJldHVybiB3b3JkLnJlcGxhY2UocGF0dGVybiwgc2luZ3VsYXJbcmVnXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdvcmRcbiAgfVxuXG59XG5cblxuIDsoe30pOyAvLyBALS1lbmQtb2YtZmlsZS1mb3ItbW9kdWxlPXRucC1oZWxwZXJzIGxpYi9oZWxwZXJzLXN0cmluZ3MudHMiXX0=