mapa-library-ui 0.25.3 → 0.27.0

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 (69) hide show
  1. package/esm2020/lib/core/js-brasil/index.mjs +16 -0
  2. package/esm2020/lib/core/js-brasil/src/create.mjs +455 -0
  3. package/esm2020/lib/core/js-brasil/src/createNumberMask.mjs +115 -0
  4. package/esm2020/lib/core/js-brasil/src/estados.mjs +34 -0
  5. package/esm2020/lib/core/js-brasil/src/index.mjs +34 -0
  6. package/esm2020/lib/core/js-brasil/src/inscricaoestadual.mjs +702 -0
  7. package/esm2020/lib/core/js-brasil/src/interfaces.mjs +2 -0
  8. package/esm2020/lib/core/js-brasil/src/iptu.mjs +25 -0
  9. package/esm2020/lib/core/js-brasil/src/iptu_create.mjs +60 -0
  10. package/esm2020/lib/core/js-brasil/src/iptu_mask.mjs +38 -0
  11. package/esm2020/lib/core/js-brasil/src/iptu_validate.mjs +67 -0
  12. package/esm2020/lib/core/js-brasil/src/mask.mjs +579 -0
  13. package/esm2020/lib/core/js-brasil/src/name.mjs +371 -0
  14. package/esm2020/lib/core/js-brasil/src/placa.mjs +162 -0
  15. package/esm2020/lib/core/js-brasil/src/rg.mjs +63 -0
  16. package/esm2020/lib/core/js-brasil/src/saude.mjs +62 -0
  17. package/esm2020/lib/core/js-brasil/src/utils.mjs +304 -0
  18. package/esm2020/lib/core/js-brasil/src/validate.mjs +627 -0
  19. package/esm2020/lib/core/pipes/cpf.mjs +17 -0
  20. package/esm2020/public-api.mjs +3 -1
  21. package/esm2020/src/lib/components/capability/lib/components/dropdown/src/dropdown.component.mjs +2 -2
  22. package/esm2020/src/lib/components/chart/lib/components/dropdown/src/dropdown.component.mjs +2 -2
  23. package/esm2020/src/lib/components/dropdown/lib/components/dropdown/src/dropdown.component.mjs +2 -2
  24. package/esm2020/src/lib/components/table/lib/components/table/public-api.mjs +2 -1
  25. package/esm2020/src/lib/components/table/lib/components/table/src/table.module.mjs +10 -3
  26. package/fesm2015/mapa-library-ui-src-lib-components-capability.mjs +1 -1
  27. package/fesm2015/mapa-library-ui-src-lib-components-capability.mjs.map +1 -1
  28. package/fesm2015/mapa-library-ui-src-lib-components-chart.mjs +1 -1
  29. package/fesm2015/mapa-library-ui-src-lib-components-chart.mjs.map +1 -1
  30. package/fesm2015/mapa-library-ui-src-lib-components-dropdown.mjs +1 -1
  31. package/fesm2015/mapa-library-ui-src-lib-components-dropdown.mjs.map +1 -1
  32. package/fesm2015/mapa-library-ui-src-lib-components-table.mjs +31 -24
  33. package/fesm2015/mapa-library-ui-src-lib-components-table.mjs.map +1 -1
  34. package/fesm2015/mapa-library-ui.mjs +3675 -2
  35. package/fesm2015/mapa-library-ui.mjs.map +1 -1
  36. package/fesm2020/mapa-library-ui-src-lib-components-capability.mjs +1 -1
  37. package/fesm2020/mapa-library-ui-src-lib-components-capability.mjs.map +1 -1
  38. package/fesm2020/mapa-library-ui-src-lib-components-chart.mjs +1 -1
  39. package/fesm2020/mapa-library-ui-src-lib-components-chart.mjs.map +1 -1
  40. package/fesm2020/mapa-library-ui-src-lib-components-dropdown.mjs +1 -1
  41. package/fesm2020/mapa-library-ui-src-lib-components-dropdown.mjs.map +1 -1
  42. package/fesm2020/mapa-library-ui-src-lib-components-table.mjs +31 -24
  43. package/fesm2020/mapa-library-ui-src-lib-components-table.mjs.map +1 -1
  44. package/fesm2020/mapa-library-ui.mjs +3682 -2
  45. package/fesm2020/mapa-library-ui.mjs.map +1 -1
  46. package/lib/core/js-brasil/index.d.ts +15 -0
  47. package/lib/core/js-brasil/src/create.d.ts +37 -0
  48. package/lib/core/js-brasil/src/createNumberMask.d.ts +13 -0
  49. package/lib/core/js-brasil/src/estados.d.ts +7 -0
  50. package/lib/core/js-brasil/src/index.d.ts +34 -0
  51. package/lib/core/js-brasil/src/inscricaoestadual.d.ts +7 -0
  52. package/lib/core/js-brasil/src/interfaces.d.ts +51 -0
  53. package/lib/core/js-brasil/src/iptu.d.ts +3 -0
  54. package/lib/core/js-brasil/src/iptu_create.d.ts +5 -0
  55. package/lib/core/js-brasil/src/iptu_mask.d.ts +2 -0
  56. package/lib/core/js-brasil/src/iptu_validate.d.ts +10 -0
  57. package/lib/core/js-brasil/src/mask.d.ts +53 -0
  58. package/lib/core/js-brasil/src/name.d.ts +9 -0
  59. package/lib/core/js-brasil/src/placa.d.ts +6 -0
  60. package/lib/core/js-brasil/src/rg.d.ts +5 -0
  61. package/lib/core/js-brasil/src/saude.d.ts +84 -0
  62. package/lib/core/js-brasil/src/utils.d.ts +71 -0
  63. package/lib/core/js-brasil/src/validate.d.ts +90 -0
  64. package/lib/core/pipes/cpf.d.ts +7 -0
  65. package/mapa-library-ui-0.27.0.tgz +0 -0
  66. package/package.json +1 -1
  67. package/public-api.d.ts +2 -0
  68. package/src/lib/components/table/lib/components/table/public-api.d.ts +1 -0
  69. package/mapa-library-ui-0.25.3.tgz +0 -0
@@ -0,0 +1,304 @@
1
+ import { ESTADOS_SIGLA } from './estados';
2
+ export function isPresent(obj) {
3
+ return obj !== undefined && obj !== null;
4
+ }
5
+ export function isArray(value) {
6
+ return (Array.isArray && Array.isArray(value)) || value instanceof Array;
7
+ }
8
+ export function isString(value) {
9
+ return typeof value === 'string' || value instanceof String;
10
+ }
11
+ export function isNumber(value) {
12
+ return typeof value === 'number' && !isNaN(value); // && value.length === undefined
13
+ }
14
+ export function isNil(value) {
15
+ return typeof value === 'undefined' || value === null;
16
+ }
17
+ const strCaretTrap = '[]';
18
+ export function processCaretTraps(mask) {
19
+ const indexes = [];
20
+ let indexOfCaretTrap;
21
+ while (indexOfCaretTrap = mask.indexOf(strCaretTrap), indexOfCaretTrap !== -1) { // eslint-disable-line
22
+ indexes.push(indexOfCaretTrap);
23
+ mask.splice(indexOfCaretTrap, 1);
24
+ }
25
+ return { maskWithoutCaretTraps: mask, indexes };
26
+ }
27
+ export const modulo11 = (value) => {
28
+ let mults = [];
29
+ let weightVal = 2;
30
+ for (let i = 0; i < value.length; i++) {
31
+ // mults = [weightVal, ...mults]
32
+ mults.push(weightVal);
33
+ weightVal++;
34
+ if (weightVal > 9)
35
+ weightVal = 2;
36
+ }
37
+ mults = mults.reverse();
38
+ let sum = 0;
39
+ for (let i = 0; i < value.length; i++) {
40
+ sum += parseInt(value[i]) * mults[i];
41
+ }
42
+ const digit = (sum * 10) % 11;
43
+ return digit;
44
+ };
45
+ export const modulo11Custom = (string, size, maxMult = string.length, by10 = true) => {
46
+ if (!by10)
47
+ size = 1;
48
+ for (let n = 1; n <= size; n++) {
49
+ let soma = 0;
50
+ let mult = 2;
51
+ for (let i = string.length - 1; i >= 0; i--) {
52
+ soma += (mult * parseInt(string.charAt(i)));
53
+ mult++;
54
+ if (mult > maxMult)
55
+ mult = 2;
56
+ }
57
+ let dig;
58
+ if (by10) {
59
+ dig = ((soma * 10) % 11) % 10;
60
+ }
61
+ else {
62
+ dig = soma % 11;
63
+ if (dig == 10)
64
+ dig = 0;
65
+ }
66
+ string += dig;
67
+ }
68
+ return string.substr(string.length - size, size);
69
+ };
70
+ export const modulo11a = (string, size, mod) => {
71
+ let soma = 0;
72
+ for (let i = 1; i <= size; i++) {
73
+ // tslint:disable-next-line:radix
74
+ soma = soma + parseInt(string.substring(i - 1, i)) * (mod - i);
75
+ }
76
+ let resto = (soma * 10) % 11;
77
+ if ((resto === 10) || (resto === 11)) {
78
+ resto = 0;
79
+ }
80
+ return resto;
81
+ };
82
+ /**
83
+ *
84
+ * @param input
85
+ * ^ - Match line start
86
+ (\d) - match first digit and capture it in back reference #1 i.e. \1
87
+ (?!..) is a negative lookahead
88
+ (?!\1+$) means disallow the match if first digit is followed by same digit (captured group) till end.
89
+ \d{11}$ match next 11 digit followed by line end
90
+ */
91
+ export function allNumbersAreSame(inputValue) {
92
+ const input = getAllDigits(inputValue);
93
+ if (typeof input === 'string') {
94
+ const reg = new RegExp('^(\\d)(?!\\1+$)\\d{' + (input.length - 1) + '}$');
95
+ return reg.test(input);
96
+ }
97
+ return false;
98
+ }
99
+ export function getAllDigits(input) {
100
+ if (!input.match) {
101
+ input = input.toString();
102
+ }
103
+ const match = input.match(/\d/g);
104
+ if (match) {
105
+ return match.join("");
106
+ }
107
+ return '';
108
+ }
109
+ export function getAllWords(input) {
110
+ const match = input.match(/\w/g);
111
+ if (match) {
112
+ return match.join("");
113
+ }
114
+ return '';
115
+ }
116
+ export function currencyToNumber(input) {
117
+ if (typeof input === 'number') {
118
+ return input;
119
+ }
120
+ input = input.replace(/ /g, '');
121
+ if (input.indexOf('$') !== -1) {
122
+ const vals = input.split('$');
123
+ input = vals[1];
124
+ }
125
+ // Keeping just numbers . and ,
126
+ input = input.replace(/[^0-9.,]+/, '');
127
+ // eua format
128
+ if (input.indexOf('.') === (input.length - 1) - 2) {
129
+ input = input.replace(/\,/g, '');
130
+ }
131
+ // br format
132
+ else {
133
+ input = input.replace(/\./g, '').replace(',', '.');
134
+ }
135
+ return parseFloat(input);
136
+ }
137
+ export function numberToCurrency(value) {
138
+ return ' R$ ' + value.toFixed(2).replace('.', ',') + ' ';
139
+ }
140
+ ;
141
+ export function slugify(value) {
142
+ return value.toString().toLowerCase()
143
+ .replace(/[àÀáÁâÂãäÄÅåª]+/g, 'a') // Special Characters #1
144
+ .replace(/[èÈéÉêÊëË]+/g, 'e') // Special Characters #2
145
+ .replace(/[ìÌíÍîÎïÏ]+/g, 'i') // Special Characters #3
146
+ .replace(/[òÒóÓôÔõÕöÖº]+/g, 'o') // Special Characters #4
147
+ .replace(/[ùÙúÚûÛüÜ]+/g, 'u') // Special Characters #5
148
+ .replace(/[ýÝÿŸ]+/g, 'y') // Special Characters #6
149
+ .replace(/[ñÑ]+/g, 'n') // Special Characters #7
150
+ .replace(/[çÇ]+/g, 'c') // Special Characters #8
151
+ .replace(/[ß]+/g, 'ss') // Special Characters #9
152
+ .replace(/[Ææ]+/g, 'ae') // Special Characters #10
153
+ .replace(/[Øøœ]+/g, 'oe') // Special Characters #11
154
+ .replace(/[%]+/g, 'pct') // Special Characters #12
155
+ .replace(/\s+/g, '-') // Replace spaces with -
156
+ .replace(/[^\w\-]+/g, '') // Remove all non-word chars
157
+ .replace(/\-\-+/g, '-') // Replace multiple - with single -
158
+ .replace(/^-+/, '') // Trim - from start of text
159
+ .replace(/-+$/, ''); // Trim - from end of text
160
+ }
161
+ ;
162
+ /**
163
+ *
164
+ * @param string ex. 12345
165
+ * @param size 11
166
+ * @param fill 0
167
+ *
168
+ * Returns: 00000012345
169
+ */
170
+ export function fillString(string, size, fill) {
171
+ if (string.length < size) {
172
+ const dif = size - string.length;
173
+ for (let i = 0; i < dif; i++) {
174
+ string = fill + string;
175
+ }
176
+ }
177
+ return string;
178
+ }
179
+ export function randArray(array) {
180
+ const index = randomNumber(0, array.length);
181
+ return array[index];
182
+ }
183
+ export function rand(length, ...ranges) {
184
+ var str = ""; // the string (initialized to "")
185
+ while (length--) { // repeat this length of times
186
+ var ind = Math.floor(Math.random() * ranges.length); // get a random range from the ranges object
187
+ var min = ranges[ind][0].charCodeAt(0), // get the minimum char code allowed for this range
188
+ max = ranges[ind][1].charCodeAt(0); // get the maximum char code allowed for this range
189
+ var c = Math.floor(Math.random() * (max - min + 1)) + min; // get a random char code between min and max
190
+ str += String.fromCharCode(c); // convert it back into a character and append it to the string str
191
+ }
192
+ return str; // return str
193
+ }
194
+ export function randomNumber(begin, end) {
195
+ const dif = end - begin;
196
+ const number = Math.floor(Math.random() * dif) + begin;
197
+ return number;
198
+ }
199
+ export function randomLetter(size = 1, onlyCapitals = false) {
200
+ var text = "";
201
+ let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
202
+ if (onlyCapitals == false) {
203
+ possible += "abcdefghijklmnopqrstuvwxyz";
204
+ }
205
+ possible = possible.split('');
206
+ for (let i = 0; i < size; i++) {
207
+ const pos = Math.floor(Math.random() * possible.length);
208
+ text += possible[pos];
209
+ }
210
+ return text;
211
+ }
212
+ export function randomLetterOrNumber(size = 1, onlyCapitals = false) {
213
+ var text = "";
214
+ let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
215
+ if (onlyCapitals == false) {
216
+ possible += "abcdefghijklmnopqrstuvwxyz0123456789";
217
+ }
218
+ possible = possible.split('');
219
+ for (let i = 0; i < size; i++) {
220
+ const pos = Math.floor(Math.random() * possible.length);
221
+ text += possible[pos];
222
+ }
223
+ return text;
224
+ }
225
+ export const randomEstadoSigla = () => {
226
+ const total = ESTADOS_SIGLA.length;
227
+ return ESTADOS_SIGLA[Math.floor(Math.random() * total)];
228
+ };
229
+ export const CORES = ["AMARELO", "AZUL", "BEGE", "BRANCA", "CINZA", "DOURADA", "GRENA", "LARANJA", "MARROM", "PRATA",
230
+ "PRETA", "ROSA", "ROXA", "VERDE", "VERMELHA", "FANTASIA"];
231
+ export function getSpecialProperty(model, key) {
232
+ return model[key];
233
+ }
234
+ /**
235
+ *
236
+ */
237
+ export const makeGenericFaker = (val, options = null) => {
238
+ return () => {
239
+ if (!val.textMask || !val.textMask.map) {
240
+ return '';
241
+ }
242
+ const newData = val.textMask.map((c, index) => {
243
+ if (options && options[index]) {
244
+ return options[index]();
245
+ }
246
+ c = c.toString();
247
+ if (c === /\d/.toString()) {
248
+ return Math.floor(Math.random() * 10).toString();
249
+ }
250
+ else if (c === /[A-Za-z]/.toString()) {
251
+ return randomLetter(1).toString();
252
+ }
253
+ else if (c === /\w/.toString()) {
254
+ return randomLetterOrNumber(1).toString();
255
+ }
256
+ else if (c.indexOf('/[') === 0) { // /[1-9]/ ou /[5-9]/
257
+ c = c.replace('/[', '').replace(']/', '');
258
+ if (c.indexOf('-') > 0) {
259
+ c = c.split('-');
260
+ if (parseInt(c[1])) {
261
+ const mult = c[1] - c[0];
262
+ const plus = parseInt(c[0]);
263
+ return (Math.floor(Math.random() * mult) + plus).toString();
264
+ }
265
+ else {
266
+ return rand(1, [c[0], c[1]]);
267
+ }
268
+ }
269
+ else if (c.indexOf('|') > 0) {
270
+ c = c.split('|');
271
+ const index = Math.floor(Math.random() * c.length);
272
+ return c[index];
273
+ }
274
+ }
275
+ else {
276
+ return c;
277
+ }
278
+ });
279
+ return newData.join('');
280
+ };
281
+ };
282
+ const utilsBr = {
283
+ isPresent,
284
+ isArray,
285
+ isString,
286
+ isNumber,
287
+ isNil,
288
+ processCaretTraps,
289
+ allNumbersAreSame,
290
+ getAllDigits,
291
+ getAllWords,
292
+ currencyToNumber,
293
+ numberToCurrency,
294
+ slugify,
295
+ fillString,
296
+ randArray,
297
+ rand,
298
+ randomNumber,
299
+ randomLetter,
300
+ randomLetterOrNumber,
301
+ getSpecialProperty
302
+ };
303
+ export default utilsBr;
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXBhLWxpYnJhcnktdWkvc3JjL2xpYi9jb3JlL2pzLWJyYXNpbC9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUcxQyxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVE7SUFDaEMsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUM7QUFDM0MsQ0FBQztBQUVELE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBVTtJQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLEtBQUssQ0FBQTtBQUMxRSxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFVO0lBQ2pDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssWUFBWSxNQUFNLENBQUE7QUFDN0QsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBVTtJQUNqQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztBQUNyRixDQUFDO0FBRUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFVO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEtBQUssV0FBVyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUE7QUFDdkQsQ0FBQztBQUtELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQTtBQUN6QixNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBUztJQUN6QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7SUFFbEIsSUFBSSxnQkFBd0IsQ0FBQTtJQUM1QixPQUFPLGdCQUFnQixHQUFHLElBQUksQ0FBQyxP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QyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDOUI7aUJBQ0Y7cUJBQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDN0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbkQsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2pCO2FBRUY7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLENBQUM7YUFDVjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQTtBQUVELE1BQU0sT0FBTyxHQUFHO0lBQ2QsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLEtBQUs7SUFDTCxpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLFlBQVk7SUFDWixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixPQUFPO0lBQ1AsVUFBVTtJQUNWLFNBQVM7SUFDVCxJQUFJO0lBQ0osWUFBWTtJQUNaLFlBQVk7SUFDWixvQkFBb0I7SUFDcEIsa0JBQWtCO0NBQ25CLENBQUE7QUFFRCxlQUFlLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVTVEFET1NfU0lHTEEgfSBmcm9tICcuL2VzdGFkb3MnO1xuaW1wb3J0IHsgQmlnT2JqZWN0IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlc2VudChvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheSh2YWx1ZTogYW55KSB7XG4gIHJldHVybiAoQXJyYXkuaXNBcnJheSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBBcnJheVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWU6IGFueSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IGFueSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpOyAvLyAmJiB2YWx1ZS5sZW5ndGggPT09IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOaWwodmFsdWU6IGFueSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB2YWx1ZSA9PT0gbnVsbFxufVxuXG5cblxuXG5jb25zdCBzdHJDYXJldFRyYXAgPSAnW10nXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0NhcmV0VHJhcHMobWFzazogYW55KSB7XG4gIGNvbnN0IGluZGV4ZXMgPSBbXVxuXG4gIGxldCBpbmRleE9mQ2FyZXRUcmFwOiBudW1iZXJcbiAgd2hpbGUgKGluZGV4T2ZDYXJldFRyYXAgPSBtYXNrLmluZGV4T2Yoc3RyQ2FyZXRUcmFwKSwgaW5kZXhPZkNhcmV0VHJhcCAhPT0gLTEpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGluZGV4ZXMucHVzaChpbmRleE9mQ2FyZXRUcmFwKVxuXG4gICAgbWFzay5zcGxpY2UoaW5kZXhPZkNhcmV0VHJhcCwgMSlcbiAgfVxuXG4gIHJldHVybiB7IG1hc2tXaXRob3V0Q2FyZXRUcmFwczogbWFzaywgaW5kZXhlcyB9XG59XG5cbmV4cG9ydCBjb25zdCBtb2R1bG8xMSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gIGxldCBtdWx0czogYW55ID0gW11cbiAgbGV0IHdlaWdodFZhbCA9IDJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIC8vIG11bHRzID0gW3dlaWdodFZhbCwgLi4ubXVsdHNdXG4gICAgbXVsdHMucHVzaCh3ZWlnaHRWYWwpXG4gICAgd2VpZ2h0VmFsKytcbiAgICBpZiAod2VpZ2h0VmFsID4gOSkgd2VpZ2h0VmFsID0gMlxuICB9XG5cbiAgbXVsdHMgPSBtdWx0cy5yZXZlcnNlKClcblxuICBsZXQgc3VtID0gMFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgc3VtICs9IHBhcnNlSW50KHZhbHVlW2ldKSAqIG11bHRzW2ldXG4gIH1cbiAgY29uc3QgZGlnaXQgPSAoc3VtICoxMCkgJSAxMVxuICByZXR1cm4gZGlnaXRcbn1cblxuZXhwb3J0IGNvbnN0IG1vZHVsbzExQ3VzdG9tID0gKHN0cmluZzogc3RyaW5nLCBzaXplOiBudW1iZXIsIG1heE11bHQgPSBzdHJpbmcubGVuZ3RoLCBieTEwID0gdHJ1ZSkgPT4ge1xuICBpZiAoIWJ5MTApIHNpemUgPSAxXG4gIGZvciAobGV0IG4gPSAxOyBuIDw9IHNpemU7IG4rKykge1xuICAgIGxldCBzb21hID0gMFxuICAgIGxldCBtdWx0ID0gMlxuICAgIGZvciAobGV0IGkgPSBzdHJpbmcubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHNvbWEgKz0gKG11bHQgKiBwYXJzZUludChzdHJpbmcuY2hhckF0KGkpKSlcbiAgICAgIG11bHQrK1xuICAgICAgaWYgKG11bHQgPiBtYXhNdWx0KSBtdWx0ID0gMlxuICAgIH1cbiAgICBsZXQgZGlnXG4gICAgaWYgKGJ5MTApIHtcbiAgICAgIGRpZyA9ICgoc29tYSAqIDEwKSAlIDExKSAlIDEwO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWcgPSBzb21hICUgMTE7XG4gICAgICBpZiAoZGlnID09IDEwKSBkaWcgPSAwO1xuICAgIH1cbiAgICBzdHJpbmcgKz0gZGlnO1xuICB9XG4gIHJldHVybiBzdHJpbmcuc3Vic3RyKHN0cmluZy5sZW5ndGggLSBzaXplLCBzaXplKTtcbn1cblxuXG5leHBvcnQgY29uc3QgbW9kdWxvMTFhID0gKHN0cmluZzogc3RyaW5nLCBzaXplOiBudW1iZXIsIG1vZDogbnVtYmVyKSA9PiB7XG4gIGxldCBzb21hID0gMDtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gc2l6ZTsgaSsrKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJhZGl4XG4gICAgc29tYSA9IHNvbWEgKyBwYXJzZUludChzdHJpbmcuc3Vic3RyaW5nKGkgLSAxLCBpKSkgKiAobW9kIC0gaSk7XG4gIH1cbiAgbGV0IHJlc3RvID0gKHNvbWEgKiAxMCkgJSAxMTtcblxuICBpZiAoKHJlc3RvID09PSAxMCkgfHwgKHJlc3RvID09PSAxMSkpIHtcbiAgICByZXN0byA9IDA7XG4gIH1cbiAgcmV0dXJuIHJlc3RvO1xufVxuXG4vKipcbiAqIFxuICogQHBhcmFtIGlucHV0IFxuICogXiAtIE1hdGNoIGxpbmUgc3RhcnRcbiAgKFxcZCkgLSBtYXRjaCBmaXJzdCBkaWdpdCBhbmQgY2FwdHVyZSBpdCBpbiBiYWNrIHJlZmVyZW5jZSAjMSBpLmUuIFxcMVxuICAoPyEuLikgaXMgYSBuZWdhdGl2ZSBsb29rYWhlYWRcbiAgKD8hXFwxKyQpIG1lYW5zIGRpc2FsbG93IHRoZSBtYXRjaCBpZiBmaXJzdCBkaWdpdCBpcyBmb2xsb3dlZCBieSBzYW1lIGRpZ2l0IChjYXB0dXJlZCBncm91cCkgdGlsbCBlbmQuXG4gIFxcZHsxMX0kIG1hdGNoIG5leHQgMTEgZGlnaXQgZm9sbG93ZWQgYnkgbGluZSBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFsbE51bWJlcnNBcmVTYW1lKGlucHV0VmFsdWU6IHN0cmluZykge1xuICBjb25zdCBpbnB1dDogc3RyaW5nIHwgdm9pZCA9IGdldEFsbERpZ2l0cyhpbnB1dFZhbHVlKTtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCByZWcgPSBuZXcgUmVnRXhwKCdeKFxcXFxkKSg/IVxcXFwxKyQpXFxcXGR7JyArICgoPHN0cmluZz5pbnB1dCkubGVuZ3RoIC0gMSkgKyAnfSQnKTtcbiAgICByZXR1cm4gcmVnLnRlc3QoaW5wdXQpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbERpZ2l0cyhpbnB1dDogc3RyaW5nKSB7XG4gIGlmICghaW5wdXQubWF0Y2gpIHtcbiAgICBpbnB1dCA9IGlucHV0LnRvU3RyaW5nKCk7XG4gIH1cbiAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaCgvXFxkL2cpO1xuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4gbWF0Y2guam9pbihcIlwiKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxXb3JkcyhpbnB1dDogc3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goL1xcdy9nKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIG1hdGNoLmpvaW4oXCJcIik7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3VycmVuY3lUb051bWJlcihpbnB1dDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG4gIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvIC9nLCAnJyk7XG4gIGlmIChpbnB1dC5pbmRleE9mKCckJykgIT09IC0xKSB7XG4gICAgY29uc3QgdmFscyA9IGlucHV0LnNwbGl0KCckJyk7XG4gICAgaW5wdXQgPSB2YWxzWzFdO1xuICB9XG5cbiAgLy8gS2VlcGluZyBqdXN0IG51bWJlcnMgLiBhbmQgLFxuICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teMC05LixdKy8sICcnKTtcblxuICAvLyBldWEgZm9ybWF0XG4gIGlmIChpbnB1dC5pbmRleE9mKCcuJykgPT09IChpbnB1dC5sZW5ndGggLSAxKSAtIDIpIHtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1xcLC9nLCAnJylcbiAgfVxuICAvLyBiciBmb3JtYXRcbiAgZWxzZSB7XG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9cXC4vZywgJycpLnJlcGxhY2UoJywnLCAnLicpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlRmxvYXQoaW5wdXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyVG9DdXJyZW5jeSh2YWx1ZTogbnVtYmVyKSB7XG4gIHJldHVybiAnIFIkICcgKyB2YWx1ZS50b0ZpeGVkKDIpLnJlcGxhY2UoJy4nLCAnLCcpICsgJyAnO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNsdWdpZnkodmFsdWU6IHN0cmluZykge1xuXG4gIHJldHVybiB2YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvW8Ogw4DDocOBw6LDgsOjw6TDhMOFw6XCql0rL2csICdhJykgICAgICAgLy8gU3BlY2lhbCBDaGFyYWN0ZXJzICMxXG4gICAgLnJlcGxhY2UoL1vDqMOIw6nDicOqw4rDq8OLXSsvZywgJ2UnKSAgICAgICBcdC8vIFNwZWNpYWwgQ2hhcmFjdGVycyAjMlxuICAgIC5yZXBsYWNlKC9bw6zDjMOtw43DrsOOw6/Dj10rL2csICdpJykgICAgICAgXHQvLyBTcGVjaWFsIENoYXJhY3RlcnMgIzNcbiAgICAucmVwbGFjZSgvW8Oyw5LDs8OTw7TDlMO1w5XDtsOWwrpdKy9nLCAnbycpICAgICAgIFx0Ly8gU3BlY2lhbCBDaGFyYWN0ZXJzICM0XG4gICAgLnJlcGxhY2UoL1vDucOZw7rDmsO7w5vDvMOcXSsvZywgJ3UnKSAgICAgICBcdC8vIFNwZWNpYWwgQ2hhcmFjdGVycyAjNVxuICAgIC5yZXBsYWNlKC9bw73DncO/xbhdKy9nLCAneScpICAgICAgIFx0XHQvLyBTcGVjaWFsIENoYXJhY3RlcnMgIzZcbiAgICAucmVwbGFjZSgvW8Oxw5FdKy9nLCAnbicpICAgICAgIFx0XHRcdC8vIFNwZWNpYWwgQ2hhcmFjdGVycyAjN1xuICAgIC5yZXBsYWNlKC9bw6fDh10rL2csICdjJykgICAgICAgXHRcdFx0Ly8gU3BlY2lhbCBDaGFyYWN0ZXJzICM4XG4gICAgLnJlcGxhY2UoL1vDn10rL2csICdzcycpICAgICAgIFx0XHRcdC8vIFNwZWNpYWwgQ2hhcmFjdGVycyAjOVxuICAgIC5yZXBsYWNlKC9bw4bDpl0rL2csICdhZScpICAgICAgIFx0XHRcdC8vIFNwZWNpYWwgQ2hhcmFjdGVycyAjMTBcbiAgICAucmVwbGFjZSgvW8OYw7jFk10rL2csICdvZScpICAgICAgIFx0XHQvLyBTcGVjaWFsIENoYXJhY3RlcnMgIzExXG4gICAgLnJlcGxhY2UoL1slXSsvZywgJ3BjdCcpICAgICAgIFx0XHRcdC8vIFNwZWNpYWwgQ2hhcmFjdGVycyAjMTJcbiAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpICAgICAgICAgICBcdFx0Ly8gUmVwbGFjZSBzcGFjZXMgd2l0aCAtXG4gICAgLnJlcGxhY2UoL1teXFx3XFwtXSsvZywgJycpICAgICAgIFx0XHQvLyBSZW1vdmUgYWxsIG5vbi13b3JkIGNoYXJzXG4gICAgLnJlcGxhY2UoL1xcLVxcLSsvZywgJy0nKSAgICAgICAgIFx0XHQvLyBSZXBsYWNlIG11bHRpcGxlIC0gd2l0aCBzaW5nbGUgLVxuICAgIC5yZXBsYWNlKC9eLSsvLCAnJykgICAgICAgICAgICAgXHRcdC8vIFRyaW0gLSBmcm9tIHN0YXJ0IG9mIHRleHRcbiAgICAucmVwbGFjZSgvLSskLywgJycpOyAgICAgICAgICAgIFx0XHQvLyBUcmltIC0gZnJvbSBlbmQgb2YgdGV4dFxuXG59O1xuLyoqXG4gKiBcbiAqIEBwYXJhbSBzdHJpbmcgIGV4LiAxMjM0NVxuICogQHBhcmFtIHNpemUgICAxMVxuICogQHBhcmFtIGZpbGwgICAwXG4gKiBcbiAqIFJldHVybnM6IDAwMDAwMDEyMzQ1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsU3RyaW5nKHN0cmluZzogc3RyaW5nLCBzaXplOiBudW1iZXIsIGZpbGw6IHN0cmluZykge1xuICBpZiAoc3RyaW5nLmxlbmd0aCA8IHNpemUpIHtcbiAgICBjb25zdCBkaWYgPSBzaXplIC0gc3RyaW5nLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZjsgaSsrKSB7XG4gICAgICBzdHJpbmcgPSBmaWxsICsgc3RyaW5nXG4gICAgfVxuICB9XG4gIHJldHVybiBzdHJpbmc7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRBcnJheShhcnJheTogc3RyaW5nIHwgYW55W10pIHtcbiAgY29uc3QgaW5kZXggPSByYW5kb21OdW1iZXIoMCwgYXJyYXkubGVuZ3RoKTtcbiAgcmV0dXJuIGFycmF5W2luZGV4XTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcmFuZChsZW5ndGg6IG51bWJlciwgLi4ucmFuZ2VzOiBhbnlbXSkge1xuICB2YXIgc3RyID0gXCJcIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0cmluZyAoaW5pdGlhbGl6ZWQgdG8gXCJcIilcbiAgd2hpbGUgKGxlbmd0aC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBlYXQgdGhpcyBsZW5ndGggb2YgdGltZXNcbiAgICB2YXIgaW5kID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcmFuZ2VzLmxlbmd0aCk7ICAgICAgICAgICAgICAvLyBnZXQgYSByYW5kb20gcmFuZ2UgZnJvbSB0aGUgcmFuZ2VzIG9iamVjdFxuICAgIHZhciBtaW4gPSByYW5nZXNbaW5kXVswXS5jaGFyQ29kZUF0KDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbWluaW11bSBjaGFyIGNvZGUgYWxsb3dlZCBmb3IgdGhpcyByYW5nZVxuICAgICAgbWF4ID0gcmFuZ2VzW2luZF1bMV0uY2hhckNvZGVBdCgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbWF4aW11bSBjaGFyIGNvZGUgYWxsb3dlZCBmb3IgdGhpcyByYW5nZVxuICAgIHZhciBjID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjsgICAgICAgIC8vIGdldCBhIHJhbmRvbSBjaGFyIGNvZGUgYmV0d2VlbiBtaW4gYW5kIG1heFxuICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgaXQgYmFjayBpbnRvIGEgY2hhcmFjdGVyIGFuZCBhcHBlbmQgaXQgdG8gdGhlIHN0cmluZyBzdHJcbiAgfVxuICByZXR1cm4gc3RyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBzdHJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbU51bWJlcihiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICBjb25zdCBkaWYgPSBlbmQgLSBiZWdpbjtcbiAgY29uc3QgbnVtYmVyID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZGlmKSArIGJlZ2luO1xuICByZXR1cm4gbnVtYmVyO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21MZXR0ZXIoc2l6ZSA9IDEsIG9ubHlDYXBpdGFscyA9IGZhbHNlKSB7XG4gIHZhciB0ZXh0ID0gXCJcIjtcbiAgbGV0IHBvc3NpYmxlOiBhbnkgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXCI7XG4gIGlmIChvbmx5Q2FwaXRhbHMgPT0gZmFsc2UpIHtcbiAgICBwb3NzaWJsZSArPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG4gIH1cbiAgcG9zc2libGUgPSBwb3NzaWJsZS5zcGxpdCgnJyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgY29uc3QgcG9zID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcG9zc2libGUubGVuZ3RoKTtcbiAgICB0ZXh0ICs9IHBvc3NpYmxlW3Bvc107XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUxldHRlck9yTnVtYmVyKHNpemUgPSAxLCBvbmx5Q2FwaXRhbHMgPSBmYWxzZSkge1xuICB2YXIgdGV4dCA9IFwiXCI7XG4gIGxldCBwb3NzaWJsZTogYW55ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlcIjtcbiAgaWYgKG9ubHlDYXBpdGFscyA9PSBmYWxzZSkge1xuICAgIHBvc3NpYmxlICs9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XCI7XG4gIH1cbiAgcG9zc2libGUgPSBwb3NzaWJsZS5zcGxpdCgnJyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgY29uc3QgcG9zID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcG9zc2libGUubGVuZ3RoKTtcbiAgICB0ZXh0ICs9IHBvc3NpYmxlW3Bvc107XG4gIH1cbiAgcmV0dXJuIHRleHQ7XG59XG5cbmV4cG9ydCBjb25zdCByYW5kb21Fc3RhZG9TaWdsYSA9ICgpID0+IHtcbiAgY29uc3QgdG90YWwgPSBFU1RBRE9TX1NJR0xBLmxlbmd0aDtcbiAgcmV0dXJuIEVTVEFET1NfU0lHTEFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdG90YWwpXTtcbn1cblxuZXhwb3J0IGNvbnN0IENPUkVTID0gW1wiQU1BUkVMT1wiLCBcIkFaVUxcIiwgXCJCRUdFXCIsIFwiQlJBTkNBXCIsIFwiQ0lOWkFcIiwgXCJET1VSQURBXCIsIFwiR1JFTkFcIiwgXCJMQVJBTkpBXCIsIFwiTUFSUk9NXCIsIFwiUFJBVEFcIixcbiAgXCJQUkVUQVwiLCBcIlJPU0FcIiwgXCJST1hBXCIsIFwiVkVSREVcIiwgXCJWRVJNRUxIQVwiLCBcIkZBTlRBU0lBXCJdO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGVjaWFsUHJvcGVydHk8VE1vZGVsLCBUS2V5IGV4dGVuZHMga2V5b2YgVE1vZGVsPihcbiAgbW9kZWw6IFRNb2RlbCxcbiAga2V5OiBUS2V5XG4pIHtcbiAgcmV0dXJuIG1vZGVsW2tleV07XG59XG5cbi8qKlxuICogXG4gKi9cbmV4cG9ydCBjb25zdCBtYWtlR2VuZXJpY0Zha2VyID0gKHZhbDogYW55LCBvcHRpb25zOiBCaWdPYmplY3Q8RnVuY3Rpb24+IHwgbnVsbCA9IG51bGwpID0+IHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoIXZhbC50ZXh0TWFzayB8fCAhdmFsLnRleHRNYXNrLm1hcCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBuZXdEYXRhID0gdmFsLnRleHRNYXNrLm1hcCgoYzogc3RyaW5nIHwgYW55W10sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnNbaW5kZXhdKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zW2luZGV4XSgpO1xuICAgICAgfVxuICAgICAgYyA9IGMudG9TdHJpbmcoKTtcbiAgICAgIGlmIChjID09PSAvXFxkLy50b1N0cmluZygpKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMCkudG9TdHJpbmcoKVxuICAgICAgfSBlbHNlIGlmIChjID09PSAvW0EtWmEtel0vLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgcmV0dXJuIHJhbmRvbUxldHRlcigxKS50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmIChjID09PSAvXFx3Ly50b1N0cmluZygpKSB7XG4gICAgICAgIHJldHVybiByYW5kb21MZXR0ZXJPck51bWJlcigxKS50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmIChjLmluZGV4T2YoJy9bJykgPT09IDApIHsgLy8gL1sxLTldLyBvdSAvWzUtOV0vXG4gICAgICAgIGMgPSBjLnJlcGxhY2UoJy9bJywgJycpLnJlcGxhY2UoJ10vJywgJycpO1xuXG4gICAgICAgIGlmIChjLmluZGV4T2YoJy0nKSA+IDApIHtcbiAgICAgICAgICBjID0gYy5zcGxpdCgnLScpO1xuICAgICAgICAgIGlmIChwYXJzZUludChjWzFdKSkge1xuICAgICAgICAgICAgY29uc3QgbXVsdCA9IGNbMV0gLSBjWzBdO1xuICAgICAgICAgICAgY29uc3QgcGx1cyA9IHBhcnNlSW50KGNbMF0pO1xuICAgICAgICAgICAgcmV0dXJuIChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtdWx0KSArIHBsdXMpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByYW5kKDEsIFtjWzBdLCBjWzFdXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGMuaW5kZXhPZignfCcpID4gMCkge1xuICAgICAgICAgIGMgPSBjLnNwbGl0KCd8Jyk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjLmxlbmd0aCk7XG4gICAgICAgICAgcmV0dXJuIGNbaW5kZXhdO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBuZXdEYXRhLmpvaW4oJycpO1xuICB9O1xufVxuXG5jb25zdCB1dGlsc0JyID0ge1xuICBpc1ByZXNlbnQsXG4gIGlzQXJyYXksXG4gIGlzU3RyaW5nLFxuICBpc051bWJlcixcbiAgaXNOaWwsXG4gIHByb2Nlc3NDYXJldFRyYXBzLFxuICBhbGxOdW1iZXJzQXJlU2FtZSxcbiAgZ2V0QWxsRGlnaXRzLFxuICBnZXRBbGxXb3JkcyxcbiAgY3VycmVuY3lUb051bWJlcixcbiAgbnVtYmVyVG9DdXJyZW5jeSxcbiAgc2x1Z2lmeSxcbiAgZmlsbFN0cmluZyxcbiAgcmFuZEFycmF5LFxuICByYW5kLFxuICByYW5kb21OdW1iZXIsXG4gIHJhbmRvbUxldHRlcixcbiAgcmFuZG9tTGV0dGVyT3JOdW1iZXIsXG4gIGdldFNwZWNpYWxQcm9wZXJ0eVxufVxuXG5leHBvcnQgZGVmYXVsdCB1dGlsc0JyOyJdfQ==