mapa-library-ui 0.25.3 → 0.26.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 (54) 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/table/lib/components/table/public-api.mjs +2 -1
  22. package/esm2020/src/lib/components/table/lib/components/table/src/table.module.mjs +10 -3
  23. package/fesm2015/mapa-library-ui-src-lib-components-table.mjs +31 -24
  24. package/fesm2015/mapa-library-ui-src-lib-components-table.mjs.map +1 -1
  25. package/fesm2015/mapa-library-ui.mjs +3675 -2
  26. package/fesm2015/mapa-library-ui.mjs.map +1 -1
  27. package/fesm2020/mapa-library-ui-src-lib-components-table.mjs +31 -24
  28. package/fesm2020/mapa-library-ui-src-lib-components-table.mjs.map +1 -1
  29. package/fesm2020/mapa-library-ui.mjs +3682 -2
  30. package/fesm2020/mapa-library-ui.mjs.map +1 -1
  31. package/lib/core/js-brasil/index.d.ts +15 -0
  32. package/lib/core/js-brasil/src/create.d.ts +37 -0
  33. package/lib/core/js-brasil/src/createNumberMask.d.ts +13 -0
  34. package/lib/core/js-brasil/src/estados.d.ts +7 -0
  35. package/lib/core/js-brasil/src/index.d.ts +34 -0
  36. package/lib/core/js-brasil/src/inscricaoestadual.d.ts +7 -0
  37. package/lib/core/js-brasil/src/interfaces.d.ts +51 -0
  38. package/lib/core/js-brasil/src/iptu.d.ts +3 -0
  39. package/lib/core/js-brasil/src/iptu_create.d.ts +5 -0
  40. package/lib/core/js-brasil/src/iptu_mask.d.ts +2 -0
  41. package/lib/core/js-brasil/src/iptu_validate.d.ts +10 -0
  42. package/lib/core/js-brasil/src/mask.d.ts +53 -0
  43. package/lib/core/js-brasil/src/name.d.ts +9 -0
  44. package/lib/core/js-brasil/src/placa.d.ts +6 -0
  45. package/lib/core/js-brasil/src/rg.d.ts +5 -0
  46. package/lib/core/js-brasil/src/saude.d.ts +84 -0
  47. package/lib/core/js-brasil/src/utils.d.ts +71 -0
  48. package/lib/core/js-brasil/src/validate.d.ts +90 -0
  49. package/lib/core/pipes/cpf.d.ts +7 -0
  50. package/mapa-library-ui-0.26.0.tgz +0 -0
  51. package/package.json +1 -1
  52. package/public-api.d.ts +2 -0
  53. package/src/lib/components/table/lib/components/table/public-api.d.ts +1 -0
  54. package/mapa-library-ui-0.25.3.tgz +0 -0
@@ -0,0 +1,579 @@
1
+ import { isArray, processCaretTraps } from './utils';
2
+ export { MASKSIE } from './inscricaoestadual';
3
+ import createNumberMask from './createNumberMask';
4
+ import { mask_iptu } from './iptu';
5
+ import { MASKSIE } from './inscricaoestadual';
6
+ const maskNumber = {
7
+ decimalLimit: 2,
8
+ thousandsSeparatorSymbol: '.',
9
+ decimalSymbol: ',',
10
+ allowDecimal: true,
11
+ integerLimit: 17,
12
+ prefix: '',
13
+ suffix: ''
14
+ };
15
+ export const MASKS = {
16
+ aih: {
17
+ text: '000000000000-0',
18
+ textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/]
19
+ },
20
+ cartaocredito: {
21
+ text: '0000 0000 0000 0000 00/00 000',
22
+ textMask: [/\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/, '0', /\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, '/', /\d/, /\d/, ' ', /\d/, /\d/, /\d/]
23
+ },
24
+ celular: {
25
+ text: '(00) 00000-0000',
26
+ textMask: ['(', /[1-9]/, /\d/, ')', ' ', /[5-9]/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/],
27
+ },
28
+ cep: {
29
+ text: '00.000-000',
30
+ textMask: [/\d/, /\d/, '.', /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/]
31
+ },
32
+ // certidao Certidões de Nascimento, Casamento ou Óbito
33
+ certidao: {
34
+ text: '000000.00.00.0000.0.00000.000.0000000-00',
35
+ textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, '.', /\d/, /\d/, '.',
36
+ /\d/, /\d/, /\d/, /\d/, '.', /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, '.',
37
+ /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/]
38
+ },
39
+ chassi: {
40
+ text: 'AAA AAAAAA AA AA0000',
41
+ textMask: [/[1-9]/, /\w/, /\w/, ' ', /\w/, /\w/, /\w/, /\w/, /\w/, /\w/, ' ', /\w/, /\w/, ' ', /\w/, /\w/, /\d/, /\d/, /\d/, /\d/]
42
+ },
43
+ cid: {
44
+ textMask: false
45
+ },
46
+ cnae: {
47
+ text: '0000-0/00',
48
+ textMask: [/\d/, /\d/, /\d/, /\d/, '-', /\d/, '/', /\d/, /\d/]
49
+ },
50
+ cnh: {
51
+ text: '000000000-00',
52
+ textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/]
53
+ },
54
+ renachseguranca: {
55
+ text: '00000000000',
56
+ textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/]
57
+ },
58
+ renachestadual: {
59
+ text: 'AA000000000',
60
+ textMask: [/[A-S]/, /[A-Z]/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/]
61
+ },
62
+ cnhespelho: {
63
+ text: '0000000000',
64
+ textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/]
65
+ },
66
+ cnpj: {
67
+ text: '00.000.000/0000-00',
68
+ textMask: [/\d/, /\d/, '.', /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/]
69
+ },
70
+ cns: {
71
+ text: '000 0000 0000 00-00',
72
+ textMask: [/[1|2|7|8|9]/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/, ' ', /\d/, /\d/, '-', /\d/, /\d/]
73
+ },
74
+ contabanco: {
75
+ text: '000 00000-0 00000-0',
76
+ textMask: [/\d/, /\d/, /\d/, ' ', /\d/, /\d/, /\d/, /\d/, /\d/, '-',
77
+ /\d/, ' ', /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/]
78
+ },
79
+ cpf: {
80
+ text: '000.000.000-00',
81
+ textMask: [/\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '-', /\d/, /\d/]
82
+ },
83
+ cpfcnpj: {
84
+ text: '00.000.000/0000-00',
85
+ textMask: [/\d/, /\d/, '.', /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/],
86
+ textMaskFunction: function mask(userInput) {
87
+ const numbers = userInput.match(/\d/g);
88
+ let numberLength = 0;
89
+ if (numbers) {
90
+ numberLength = numbers.join('').length;
91
+ }
92
+ if (!userInput || numberLength > 12) {
93
+ return [/\d/, /\d/, '.', /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/];
94
+ }
95
+ else {
96
+ return [/\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, '-', /\d/, /\d/];
97
+ }
98
+ }
99
+ },
100
+ currency: {
101
+ text: '0.000,00',
102
+ textMask: createNumberMask({
103
+ ...maskNumber,
104
+ prefix: 'R$ ',
105
+ allowNegative: true
106
+ })
107
+ },
108
+ data: {
109
+ text: '00/00/0000',
110
+ textMask: [/[0-3]/, /[0-9]/, '/', /[0-1]/, /[0-9]/, '/', /[0-2]/, /[0-9]/, /\d/, /\d/]
111
+ },
112
+ date: {
113
+ text: '00/00/0000',
114
+ textMask: [/[0-1]/, /[0-9]/, '/', /[0-3]/, /[0-9]/, '/', /[0-2]/, /[0-9]/, /\d/, /\d/]
115
+ },
116
+ datetime: {
117
+ text: '00/00/0000 00:00',
118
+ textMask: [/[0-1]/, /[0-9]/, '/', /[0-3]/, /[0-9]/, '/', /[0-2]/, /[0-9]/, /\d/, /\d/, ' ', /\d/, /\d/, ':', /[0-5]/, /\d/]
119
+ },
120
+ datahora: {
121
+ text: '00/00/0000 00:00',
122
+ textMask: [/[0-3]/, /[0-9]/, '/', /[0-1]/, /[0-9]/, '/', /[0-2]/, /[0-9]/, /\d/, /\d/, ' ', /\d/, /\d/, ':', /[0-5]/, /\d/]
123
+ },
124
+ ect: {
125
+ text: '00000000-0',
126
+ textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/]
127
+ },
128
+ endereco: {
129
+ text: '0000.0000.0000',
130
+ textMask: [/\d/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, '.', /[0-2]/, /[0-9]/, /\d/, /\d/]
131
+ },
132
+ iptu: {
133
+ text: '0000.0000.0000',
134
+ textMask: [/\d/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, '.', /[0-2]/, /[0-9]/, /\d/, /\d/]
135
+ },
136
+ number: {
137
+ text: '0.000,00',
138
+ textMask: createNumberMask(maskNumber)
139
+ },
140
+ porcentagem: {
141
+ text: '00,00%',
142
+ textMask: createNumberMask({
143
+ ...maskNumber,
144
+ suffix: '%'
145
+ })
146
+ },
147
+ pispasep: {
148
+ text: '000.00000.00-0',
149
+ textMask: [/\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, '-', /\d/]
150
+ },
151
+ placa: {
152
+ text: 'AAA-0000',
153
+ textMask: [/[A-S]/, /[A-Z]/, /[A-Z]/, '-', /\d/, /\d/, /\d/, /\d/]
154
+ },
155
+ processo: {
156
+ text: '0000000-00.0000.AAA.0000',
157
+ textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, '.', /[A-Za-z]/, /[A-Za-z]/, /[A-Za-z]/, '.', /\d/, /\d/, /\d/, /\d/]
158
+ },
159
+ renavam: {
160
+ text: '0000000000-00',
161
+ textMask: [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/],
162
+ textMaskFunction: function mask(userInput) {
163
+ const numbers = userInput.match(/\d/g);
164
+ let numberLength = 0;
165
+ if (numbers) {
166
+ numberLength = numbers.join('').length;
167
+ }
168
+ if (!userInput || numberLength < 9) {
169
+ return [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/];
170
+ }
171
+ else {
172
+ return [/\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, /\d/, '-', /\d/];
173
+ }
174
+ }
175
+ },
176
+ rg: {
177
+ text: 'AA-00.000.000',
178
+ textMask: [/[A-Za-z]/, /[A-Za-z]/, '-', /\d/, /\d/, '.', /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/]
179
+ },
180
+ sped: {
181
+ text: '0000.0000.0000',
182
+ textMask: [/\d/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, '.', /[0-2]/, /[0-9]/, /\d/, /\d/]
183
+ },
184
+ telefone: {
185
+ text: '(00) 00000-0000',
186
+ textMask: ['(', /[1-9]/, /\d/, ')', ' ', /[1-9]/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/],
187
+ textMaskFunction: function mask(userInput) {
188
+ const numbers = userInput.match(/\d/g);
189
+ let numberLength = 0;
190
+ if (numbers) {
191
+ numberLength = numbers.join('').length;
192
+ }
193
+ if (!userInput || numberLength > 10) {
194
+ return ['(', /[1-9]/, /\d/, ')', ' ', /[1-9]/, /\d/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/];
195
+ }
196
+ else {
197
+ return ['(', /[1-9]/, /\d/, ')', ' ', /[1-9]/, /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/];
198
+ }
199
+ }
200
+ },
201
+ time: {
202
+ text: '00:00',
203
+ textMask: [/\d/, /\d/, ':', /[0-5]/, /\d/]
204
+ },
205
+ titulo: {
206
+ text: '0000.0000.0000',
207
+ textMask: [/\d/, /\d/, /\d/, /\d/, '.', /\d/, /\d/, /\d/, /\d/, '.', /[0-2]/, /[0-9]/, /\d/, /\d/]
208
+ },
209
+ utils: {
210
+ numberToString: (n) => {
211
+ if (!n || typeof n === 'string') {
212
+ return n;
213
+ }
214
+ return (n.toString()).replace('.', ',');
215
+ },
216
+ textMask: false
217
+ }
218
+ };
219
+ const makeGeneric = (key) => {
220
+ return (value) => {
221
+ if (!value) {
222
+ return '';
223
+ }
224
+ let mask = MASKS[key].textMask;
225
+ let textMaskFunction = MASKS[key].textMaskFunction;
226
+ if (typeof textMaskFunction === 'function') {
227
+ mask = textMaskFunction(value);
228
+ }
229
+ return conformToMask(value, mask, { guide: false }).conformedValue;
230
+ };
231
+ };
232
+ export const maskBr = {
233
+ aih: makeGeneric('aih'),
234
+ celular: makeGeneric('celular'),
235
+ cep: makeGeneric('cep'),
236
+ certidao: makeGeneric('certidao'),
237
+ chassi: makeGeneric('chassi'),
238
+ cnae: makeGeneric('cnae'),
239
+ cnh: makeGeneric('cnh'),
240
+ renachseguranca: makeGeneric('renachseguranca'),
241
+ renachestadual: makeGeneric('renachestadual'),
242
+ cnhespelho: makeGeneric('cnhespelho'),
243
+ cnpj: makeGeneric('cnpj'),
244
+ cns: makeGeneric('cns'),
245
+ contabanco: makeGeneric('contabanco'),
246
+ cpf: makeGeneric('cpf'),
247
+ cpfcnpj: makeGeneric('cpfcnpj'),
248
+ cartaocredito: makeGeneric('cartaocredito'),
249
+ currency: (currencyValueInput, decimalsFormat = 2) => {
250
+ return formatNumber(MASKS['currency'], currencyValueInput, decimalsFormat);
251
+ },
252
+ data: makeGeneric('data'),
253
+ date: makeGeneric('date'),
254
+ datetime: makeGeneric('datetime'),
255
+ datahora: makeGeneric('datahora'),
256
+ ect: makeGeneric('ect'),
257
+ endereco: makeGeneric('endereco'),
258
+ inscricaoestadual: (inscricaoestadualValue, estado) => {
259
+ const ie = MASKSIE;
260
+ const ieState = ie[estado];
261
+ if (!inscricaoestadualValue || !estado || !ieState ||
262
+ !ieState.textMask) {
263
+ return '';
264
+ }
265
+ let mask = ieState.textMask;
266
+ let textMaskFunction = ieState.textMaskFunction;
267
+ if (typeof textMaskFunction === 'function') {
268
+ mask = textMaskFunction(inscricaoestadualValue);
269
+ }
270
+ return conformToMask(inscricaoestadualValue, mask, { guide: false }).conformedValue;
271
+ },
272
+ iptu: (iptuValue, estado, cidade) => {
273
+ const mask = mask_iptu(iptuValue, estado, cidade);
274
+ if (!mask || typeof mask === 'string') {
275
+ return '';
276
+ }
277
+ return conformToMask(iptuValue, mask.textMask, { guide: false }).conformedValue;
278
+ },
279
+ number: (numberValue, decimalsFormat = 2) => {
280
+ return formatNumber(MASKS['number'], numberValue, decimalsFormat);
281
+ },
282
+ porcentagem: (porcentagemValue, decimalsFormat = 2) => {
283
+ return formatNumber(MASKS['porcentagem'], porcentagemValue, decimalsFormat);
284
+ },
285
+ pispasep: makeGeneric('pispasep'),
286
+ placa: makeGeneric('placa'),
287
+ processo: makeGeneric('processo'),
288
+ renavam: makeGeneric('renavam'),
289
+ rg: makeGeneric('rg'),
290
+ sped: makeGeneric('sped'),
291
+ telefone: makeGeneric('telefone'),
292
+ time: (value) => {
293
+ if (value instanceof Date) {
294
+ value = value.toTimeString().split(' ')[0];
295
+ }
296
+ return makeGeneric('time')(value);
297
+ },
298
+ titulo: makeGeneric('titulo')
299
+ };
300
+ /**
301
+ * FROM TEXT-MASK
302
+ */
303
+ export const placeholderChar = '_';
304
+ export const strFunction = 'function';
305
+ const defaultPlaceholderChar = placeholderChar;
306
+ const emptyArray = [];
307
+ const emptyString = '';
308
+ export function conformToMask(inputValue = emptyString, mask = emptyArray, config = {}) {
309
+ let rawValue = inputValue.toString();
310
+ if (typeof inputValue === 'number') {
311
+ rawValue = inputValue.toString();
312
+ }
313
+ if (inputValue instanceof Date) {
314
+ rawValue = inputValue.toLocaleString("pt-br");
315
+ }
316
+ if (!isArray(mask)) {
317
+ // If someone passes a function as the mask property, we should call the
318
+ // function to get the mask array - Normally this is handled by the
319
+ // `createTextMaskInputElement:update` function - this allows mask functions
320
+ // to be used directly with `conformToMask`
321
+ if (typeof mask === strFunction) {
322
+ // call the mask function to get the mask array
323
+ mask = mask(inputValue, config);
324
+ // mask functions can setup caret traps to have some control over how the caret moves. We need to process
325
+ // the mask for any caret traps. `processCaretTraps` will remove the caret traps from the mask
326
+ mask = processCaretTraps(mask).maskWithoutCaretTraps;
327
+ }
328
+ else {
329
+ throw new Error('Text-mask:conformToMask; The mask property must be an array.');
330
+ }
331
+ }
332
+ // These configurations tell us how to conform the mask
333
+ const guide = config.guide || true;
334
+ const previousConformedValue = config.previousConformedValue || emptyString;
335
+ const placeholder = convertMaskToPlaceholder(mask, placeholderChar);
336
+ const currentCaretPosition = config.currentCaretPosition;
337
+ const keepCharPositions = config.keepCharPositions;
338
+ // The configs below indicate that the user wants the algorithm to work in *no guide* mode
339
+ const suppressGuide = guide === false && previousConformedValue !== undefined;
340
+ // Calculate lengths once for performance
341
+ const rawValueLength = rawValue.length;
342
+ const previousConformedValueLength = previousConformedValue.length;
343
+ const placeholderLength = placeholder.length;
344
+ const maskLength = mask.length;
345
+ // This tells us the number of edited characters and the direction in which they were edited (+/-)
346
+ const editDistance = rawValueLength - previousConformedValueLength;
347
+ // In *no guide* mode, we need to know if the user is trying to add a character or not
348
+ const isAddition = editDistance > 0;
349
+ // Tells us the index of the first change. For (438) 394-4938 to (38) 394-4938, that would be 1
350
+ const indexOfFirstChange = currentCaretPosition + (isAddition ? -editDistance : 0);
351
+ // We're also gonna need the index of last change, which we can derive as follows...
352
+ const indexOfLastChange = indexOfFirstChange + Math.abs(editDistance);
353
+ // If `conformToMask` is configured to keep character positions, that is, for mask 111, previous value
354
+ // _2_ and raw value 3_2_, the new conformed value should be 32_, not 3_2 (default behavior). That's in the case of
355
+ // addition. And in the case of deletion, previous value _23, raw value _3, the new conformed string should be
356
+ // __3, not _3_ (default behavior)
357
+ //
358
+ // The next block of logic handles keeping character positions for the case of deletion. (Keeping
359
+ // character positions for the case of addition is further down since it is handled differently.)
360
+ // To do this, we want to compensate for all characters that were deleted
361
+ if (keepCharPositions === true && !isAddition) {
362
+ // We will be storing the new placeholder characters in this variable.
363
+ let compensatingPlaceholderChars = emptyString;
364
+ // For every character that was deleted from a placeholder position, we add a placeholder char
365
+ for (let i = indexOfFirstChange; i < indexOfLastChange; i++) {
366
+ if (placeholder[i] === placeholderChar) {
367
+ compensatingPlaceholderChars += placeholderChar;
368
+ }
369
+ }
370
+ // Now we trick our algorithm by modifying the raw value to make it contain additional placeholder characters
371
+ // That way when the we start laying the characters again on the mask, it will keep the non-deleted characters
372
+ // in their positions.
373
+ rawValue = (rawValue.slice(0, indexOfFirstChange) +
374
+ compensatingPlaceholderChars +
375
+ rawValue.slice(indexOfFirstChange, rawValueLength));
376
+ }
377
+ // Convert `rawValue` string to an array, and mark characters based on whether they are newly added or have
378
+ // existed in the previous conformed value. Identifying new and old characters is needed for `conformToMask`
379
+ // to work if it is configured to keep character positions.
380
+ const rawValueArr = rawValue
381
+ .split(emptyString)
382
+ .map((char, i) => ({ char, isNew: i >= indexOfFirstChange && i < indexOfLastChange }));
383
+ // The loop below removes masking characters from user input. For example, for mask
384
+ // `00 (111)`, the placeholder would be `00 (___)`. If user input is `00 (234)`, the loop below
385
+ // would remove all characters but `234` from the `rawValueArr`. The rest of the algorithm
386
+ // then would lay `234` on top of the available placeholder positions in the mask.
387
+ for (let i = rawValueLength - 1; i >= 0; i--) {
388
+ const { char } = rawValueArr[i];
389
+ if (char !== placeholderChar) {
390
+ const shouldOffset = i >= indexOfFirstChange && previousConformedValueLength === maskLength;
391
+ if (char === placeholder[(shouldOffset) ? i - editDistance : i]) {
392
+ rawValueArr.splice(i, 1);
393
+ }
394
+ }
395
+ }
396
+ // This is the variable that we will be filling with characters as we figure them out
397
+ // in the algorithm below
398
+ let conformedValue = emptyString;
399
+ let someCharsRejected = false;
400
+ // Ok, so first we loop through the placeholder looking for placeholder characters to fill up.
401
+ placeholderLoop: for (let i = 0; i < placeholderLength; i++) {
402
+ const charInPlaceholder = placeholder[i];
403
+ // We see one. Let's find out what we can put in it.
404
+ if (charInPlaceholder === placeholderChar) {
405
+ // But before that, do we actually have any user characters that need a place?
406
+ if (rawValueArr.length > 0) {
407
+ // We will keep chipping away at user input until either we run out of characters
408
+ // or we find at least one character that we can map.
409
+ while (rawValueArr.length > 0) {
410
+ // Let's retrieve the first user character in the queue of characters we have left
411
+ const shift = rawValueArr.shift();
412
+ let rawValueChar = '', isNew = false;
413
+ if (shift) {
414
+ rawValueChar = shift.char;
415
+ isNew = shift.isNew;
416
+ }
417
+ // If the character we got from the user input is a placeholder character (which happens
418
+ // regularly because user input could be something like (540) 90_-____, which includes
419
+ // a bunch of `_` which are placeholder characters) and we are not in *no guide* mode,
420
+ // then we map this placeholder character to the current spot in the placeholder
421
+ if (rawValueChar === placeholderChar && suppressGuide !== true) {
422
+ conformedValue += placeholderChar;
423
+ // And we go to find the next placeholder character that needs filling
424
+ continue placeholderLoop;
425
+ // Else if, the character we got from the user input is not a placeholder, let's see
426
+ // if the current position in the mask can accept it.
427
+ }
428
+ else if (mask[i].test(rawValueChar)) {
429
+ // we map the character differently based on whether we are keeping character positions or not.
430
+ // If any of the conditions below are met, we simply map the raw value character to the
431
+ // placeholder position.
432
+ if (keepCharPositions !== true ||
433
+ isNew === false ||
434
+ previousConformedValue === emptyString ||
435
+ guide === false ||
436
+ !isAddition) {
437
+ conformedValue += rawValueChar;
438
+ }
439
+ else {
440
+ // We enter this block of code if we are trying to keep character positions and none of the conditions
441
+ // above is met. In this case, we need to see if there's an available spot for the raw value character
442
+ // to be mapped to. If we couldn't find a spot, we will discard the character.
443
+ //
444
+ // For example, for mask `1111`, previous conformed value `_2__`, raw value `942_2__`. We can map the
445
+ // `9`, to the first available placeholder position, but then, there are no more spots available for the
446
+ // `4` and `2`. So, we discard them and end up with a conformed value of `92__`.
447
+ const rawValueArrLength = rawValueArr.length;
448
+ let indexOfNextAvailablePlaceholderChar = null;
449
+ // Let's loop through the remaining raw value characters. We are looking for either a suitable spot, ie,
450
+ // a placeholder character or a non-suitable spot, ie, a non-placeholder character that is not new.
451
+ // If we see a suitable spot first, we store its position and exit the loop. If we see a non-suitable
452
+ // spot first, we exit the loop and our `indexOfNextAvailablePlaceholderChar` will stay as `null`.
453
+ for (let i = 0; i < rawValueArrLength; i++) {
454
+ const charData = rawValueArr[i];
455
+ if (charData.char !== placeholderChar && charData.isNew === false) {
456
+ break;
457
+ }
458
+ if (charData.char === placeholderChar) {
459
+ indexOfNextAvailablePlaceholderChar = i;
460
+ break;
461
+ }
462
+ }
463
+ // If `indexOfNextAvailablePlaceholderChar` is not `null`, that means the character is not blocked.
464
+ // We can map it. And to keep the character positions, we remove the placeholder character
465
+ // from the remaining characters
466
+ if (indexOfNextAvailablePlaceholderChar !== null) {
467
+ conformedValue += rawValueChar;
468
+ rawValueArr.splice(indexOfNextAvailablePlaceholderChar, 1);
469
+ // If `indexOfNextAvailablePlaceholderChar` is `null`, that means the character is blocked. We have to
470
+ // discard it.
471
+ }
472
+ else {
473
+ i--;
474
+ }
475
+ }
476
+ // Since we've mapped this placeholder position. We move on to the next one.
477
+ continue placeholderLoop;
478
+ }
479
+ else {
480
+ someCharsRejected = true;
481
+ }
482
+ }
483
+ }
484
+ // We reach this point when we've mapped all the user input characters to placeholder
485
+ // positions in the mask. In *guide* mode, we append the left over characters in the
486
+ // placeholder to the `conformedString`, but in *no guide* mode, we don't wanna do that.
487
+ //
488
+ // That is, for mask `(111)` and user input `2`, we want to return `(2`, not `(2__)`.
489
+ if (suppressGuide === false) {
490
+ conformedValue += placeholder.substr(i, placeholderLength);
491
+ }
492
+ // And we break
493
+ break;
494
+ // Else, the charInPlaceholder is not a placeholderChar. That is, we cannot fill it
495
+ // with user input. So we just map it to the final output
496
+ }
497
+ else {
498
+ conformedValue += charInPlaceholder;
499
+ }
500
+ }
501
+ // The following logic is needed to deal with the case of deletion in *no guide* mode.
502
+ //
503
+ // Consider the silly mask `(111) /// 1`. What if user tries to delete the last placeholder
504
+ // position? Something like `(589) /// `. We want to conform that to `(589`. Not `(589) /// `.
505
+ // That's why the logic below finds the last filled placeholder character, and removes everything
506
+ // from that point on.
507
+ if (suppressGuide && isAddition === false) {
508
+ let indexOfLastFilledPlaceholderChar = null;
509
+ // Find the last filled placeholder position and substring from there
510
+ for (let i = 0; i < conformedValue.length; i++) {
511
+ if (placeholder[i] === placeholderChar) {
512
+ indexOfLastFilledPlaceholderChar = i;
513
+ }
514
+ }
515
+ if (indexOfLastFilledPlaceholderChar !== null) {
516
+ // We substring from the beginning until the position after the last filled placeholder char.
517
+ conformedValue = conformedValue.substr(0, indexOfLastFilledPlaceholderChar + 1);
518
+ }
519
+ else {
520
+ // If we couldn't find `indexOfLastFilledPlaceholderChar` that means the user deleted
521
+ // the first character in the mask. So we return an empty string.
522
+ conformedValue = emptyString;
523
+ }
524
+ }
525
+ return { conformedValue, meta: { someCharsRejected } };
526
+ }
527
+ export function convertMaskToPlaceholder(mask = emptyArray, placeholderChar = defaultPlaceholderChar) {
528
+ if (!isArray(mask)) {
529
+ throw new Error('Text-mask:convertMaskToPlaceholder; The mask property must be an array.');
530
+ }
531
+ if (mask.indexOf(placeholderChar) !== -1) {
532
+ throw new Error('Placeholder character must not be used as part of the mask. Please specify a character ' +
533
+ 'that is not present in your mask as your placeholder character.\n\n' +
534
+ `The placeholder character that was received is: ${JSON.stringify(placeholderChar)}\n\n` +
535
+ `The mask that was received is: ${JSON.stringify(mask)}`);
536
+ }
537
+ return mask.map((char) => {
538
+ return (char instanceof RegExp) ? placeholderChar : char;
539
+ }).join('');
540
+ }
541
+ /**
542
+ * Due to a bug on textmask, the requireDecimal its not working, so this function solves this problem
543
+ * @param maskType
544
+ * @param numberValue
545
+ * @param decimalsFormat
546
+ * @returns
547
+ */
548
+ function formatNumber(maskType, numberValue, decimalsFormat = 2) {
549
+ if (!numberValue && numberValue !== 0) {
550
+ return '';
551
+ }
552
+ if (!numberValue.split) {
553
+ numberValue += '';
554
+ numberValue = numberValue.replace('.', ',');
555
+ }
556
+ const vals = numberValue.split(',');
557
+ if (!maskType.textMask || typeof maskType.textMask !== 'function') {
558
+ return '';
559
+ }
560
+ const mask = maskType.textMask(vals[0]);
561
+ let decimals = '';
562
+ if (decimalsFormat == undefined) {
563
+ decimals = vals.length > 1 ? ',' + vals[1] : '';
564
+ }
565
+ else {
566
+ decimals = vals.length > 1 ? (vals[1] < 10 ? vals[1].toString() + '0' : vals[1].toString()) : '00';
567
+ if (decimals.length > decimalsFormat) {
568
+ decimals = decimals.substring(0, decimalsFormat);
569
+ }
570
+ }
571
+ let conformedValue = conformToMask(numberValue, mask, { guide: false }).conformedValue;
572
+ let suffix = '';
573
+ if (conformedValue.indexOf('%') >= 0) {
574
+ conformedValue = conformedValue.replace('%', '');
575
+ suffix = '%';
576
+ }
577
+ return conformedValue + (decimalsFormat > 0 ? ',' + decimals : '') + suffix;
578
+ }
579
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hcGEtbGlicmFyeS11aS9zcmMvbGliL2NvcmUvanMtYnJhc2lsL3NyYy9tYXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sZ0JBQWdCLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNuQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsTUFBTSxVQUFVLEdBQVE7SUFDdEIsWUFBWSxFQUFFLENBQUM7SUFDZix3QkFBd0IsRUFBRSxHQUFHO0lBQzdCLGFBQWEsRUFBRSxHQUFHO0lBQ2xCLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFlBQVksRUFBRSxFQUFFO0lBQ2hCLE1BQU0sRUFBRSxFQUFFO0lBQ1YsTUFBTSxFQUFFLEVBQUU7Q0FDWCxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUF3QjtJQUN4QyxHQUFHLEVBQUU7UUFDSCxJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUM7S0FDOUY7SUFDRCxhQUFhLEVBQUU7UUFDYixJQUFJLEVBQUUsK0JBQStCO1FBQ3JDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUs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QUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsY0FBYyxFQUFFO1lBQ3BDLFFBQVEsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUNsRDtLQUNGO0lBRUQsSUFBSSxjQUFjLEdBQUcsYUFBYSxDQUNoQyxXQUFXLEVBQ1gsSUFBSSxFQUNKLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUNqQixDQUFDLGNBQWMsQ0FBQTtJQUdoQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUE7SUFDZixJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3BDLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNoRCxNQUFNLEdBQUcsR0FBRyxDQUFBO0tBQ2I7SUFDRCxPQUFPLGNBQWMsR0FBRyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNBcnJheSwgcHJvY2Vzc0NhcmV0VHJhcHMgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEJpZ09iamVjdCwgTWFza1R5cGUgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuZXhwb3J0IHsgTUFTS1NJRSB9IGZyb20gJy4vaW5zY3JpY2FvZXN0YWR1YWwnO1xuaW1wb3J0IGNyZWF0ZU51bWJlck1hc2sgZnJvbSAnLi9jcmVhdGVOdW1iZXJNYXNrJztcbmltcG9ydCB7IG1hc2tfaXB0dSB9IGZyb20gJy4vaXB0dSc7XG5pbXBvcnQgeyBNQVNLU0lFIH0gZnJvbSAnLi9pbnNjcmljYW9lc3RhZHVhbCc7XG5cbmNvbnN0IG1hc2tOdW1iZXI6IGFueSA9IHtcbiAgZGVjaW1hbExpbWl0OiAyLFxuICB0aG91c2FuZHNTZXBhcmF0b3JTeW1ib2w6ICcuJyxcbiAgZGVjaW1hbFN5bWJvbDogJywnLFxuICBhbGxvd0RlY2ltYWw6IHRydWUsXG4gIGludGVnZXJMaW1pdDogMTcsXG4gIHByZWZpeDogJycsXG4gIHN1ZmZpeDogJydcbn1cblxuZXhwb3J0IGNvbnN0IE1BU0tTOiBCaWdPYmplY3Q8TWFza1R5cGU+ID0ge1xuICBhaWg6IHtcbiAgICB0ZXh0OiAnMDAwMDAwMDAwMDAwLTAnLCAvLyAzNTE5MjM0MTQzMTItOFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkL11cbiAgfSxcbiAgY2FydGFvY3JlZGl0bzoge1xuICAgIHRleHQ6ICcwMDAwIDAwMDAgMDAwMCAwMDAwIDAwLzAwIDAwMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJyAnLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJyAnLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJzAnLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJyAnLCAvXFxkLywgL1xcZC8sICcvJywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgL1xcZC9dXG4gIH0sXG4gIGNlbHVsYXI6IHtcbiAgICB0ZXh0OiAnKDAwKSAwMDAwMC0wMDAwJyxcbiAgICB0ZXh0TWFzazogWycoJywgL1sxLTldLywgL1xcZC8sICcpJywgJyAnLCAvWzUtOV0vLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkL10sXG4gIH0sXG4gIGNlcDoge1xuICAgIHRleHQ6ICcwMC4wMDAtMDAwJyxcbiAgICB0ZXh0TWFzazogWy9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAvXFxkLywgL1xcZC9dXG4gIH0sXG4gIC8vIGNlcnRpZGFvIENlcnRpZMO1ZXMgZGUgTmFzY2ltZW50bywgQ2FzYW1lbnRvIG91IMOTYml0byBcbiAgY2VydGlkYW86IHtcbiAgICB0ZXh0OiAnMDAwMDAwLjAwLjAwLjAwMDAuMC4wMDAwMC4wMDAuMDAwMDAwMC0wMCcsIC8vIDEwNDUzOS4wMS41NS4yMDEzLjEuMDAwMTIuMDIxLjAwMDAxMjMtMjFcbiAgICB0ZXh0TWFzazogWy9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgJy4nLFxuICAgICAgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLicsXG4gICAgICAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgY2hhc3NpOiB7XG4gICAgdGV4dDogJ0FBQSBBQUFBQUEgQUEgQUEwMDAwJywgLy8gOUJXIFpaWjM3NyBWVCAwMDQyNTFcbiAgICB0ZXh0TWFzazogWy9bMS05XS8sIC9cXHcvLCAvXFx3LywgJyAnLCAvXFx3LywgL1xcdy8sIC9cXHcvLCAvXFx3LywgL1xcdy8sIC9cXHcvLCAnICcsIC9cXHcvLCAvXFx3LywgJyAnLCAvXFx3LywgL1xcdy8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICBjaWQ6IHtcbiAgICB0ZXh0TWFzazogZmFsc2VcbiAgfSxcbiAgY25hZToge1xuICAgIHRleHQ6ICcwMDAwLTAvMDAnLCAvLyA2ODIxLTgvMDFcbiAgICB0ZXh0TWFzazogWy9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAnLycsIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgY25oOiB7XG4gICAgdGV4dDogJzAwMDAwMDAwMC0wMCcsIC8vIDEyMzQ1Njc4OS0xXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgcmVuYWNoc2VndXJhbmNhOiB7XG4gICAgdGV4dDogJzAwMDAwMDAwMDAwJywgLy8gNTE0NzQ1NDY4NTRcbiAgICB0ZXh0TWFzazogWy9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgcmVuYWNoZXN0YWR1YWw6IHtcbiAgICB0ZXh0OiAnQUEwMDAwMDAwMDAnLCAvLyBNRzU5NzgxMjU2MFxuICAgIHRleHRNYXNrOiBbL1tBLVNdLywgL1tBLVpdLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgY25oZXNwZWxobzoge1xuICAgIHRleHQ6ICcwMDAwMDAwMDAwJywgLy8gMTIzNDU2Nzg5LTFcbiAgICB0ZXh0TWFzazogWy9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICBjbnBqOiB7XG4gICAgdGV4dDogJzAwLjAwMC4wMDAvMDAwMC0wMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLycsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgY25zOiB7XG4gICAgdGV4dDogJzAwMCAwMDAwIDAwMDAgMDAtMDAnLFxuICAgIHRleHRNYXNrOiBbL1sxfDJ8N3w4fDldLywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkLywgL1xcZC9dXG4gIH0sXG4gIGNvbnRhYmFuY286IHtcbiAgICB0ZXh0OiAnMDAwIDAwMDAwLTAgMDAwMDAtMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLFxuICAgICAgL1xcZC8sICcgJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvXVxuICB9LFxuICBjcGY6IHtcbiAgICB0ZXh0OiAnMDAwLjAwMC4wMDAtMDAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgL1xcZC8sICctJywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICBjcGZjbnBqOiB7XG4gICAgdGV4dDogJzAwLjAwMC4wMDAvMDAwMC0wMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLycsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAvXFxkL10sXG4gICAgdGV4dE1hc2tGdW5jdGlvbjogZnVuY3Rpb24gbWFzayh1c2VySW5wdXQ6IGFueSkge1xuICAgICAgY29uc3QgbnVtYmVycyA9IHVzZXJJbnB1dC5tYXRjaCgvXFxkL2cpO1xuICAgICAgbGV0IG51bWJlckxlbmd0aCA9IDA7XG4gICAgICBpZiAobnVtYmVycykge1xuICAgICAgICBudW1iZXJMZW5ndGggPSBudW1iZXJzLmpvaW4oJycpLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmICghdXNlcklucHV0IHx8IG51bWJlckxlbmd0aCA+IDEyKSB7XG4gICAgICAgIHJldHVybiBbL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy8nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkLywgL1xcZC9dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsvXFxkLywgL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkLywgL1xcZC9dO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgY3VycmVuY3k6IHtcbiAgICB0ZXh0OiAnMC4wMDAsMDAnLFxuICAgIHRleHRNYXNrOiBjcmVhdGVOdW1iZXJNYXNrKHtcbiAgICAgIC4uLm1hc2tOdW1iZXIsXG4gICAgICBwcmVmaXg6ICdSJCAnLFxuICAgICAgYWxsb3dOZWdhdGl2ZTogdHJ1ZVxuICAgIH0pXG4gIH0sXG4gIGRhdGE6IHtcbiAgICB0ZXh0OiAnMDAvMDAvMDAwMCcsXG4gICAgdGV4dE1hc2s6IFsvWzAtM10vLCAvWzAtOV0vLCAnLycsIC9bMC0xXS8sIC9bMC05XS8sICcvJywgL1swLTJdLywgL1swLTldLywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICBkYXRlOiB7XG4gICAgdGV4dDogJzAwLzAwLzAwMDAnLFxuICAgIHRleHRNYXNrOiBbL1swLTFdLywgL1swLTldLywgJy8nLCAvWzAtM10vLCAvWzAtOV0vLCAnLycsIC9bMC0yXS8sIC9bMC05XS8sIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgZGF0ZXRpbWU6IHtcbiAgICB0ZXh0OiAnMDAvMDAvMDAwMCAwMDowMCcsXG4gICAgdGV4dE1hc2s6IFsvWzAtMV0vLCAvWzAtOV0vLCAnLycsIC9bMC0zXS8sIC9bMC05XS8sICcvJywgL1swLTJdLywgL1swLTldLywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgJzonLCAvWzAtNV0vLCAvXFxkL11cbiAgfSxcbiAgZGF0YWhvcmE6IHtcbiAgICB0ZXh0OiAnMDAvMDAvMDAwMCAwMDowMCcsXG4gICAgdGV4dE1hc2s6IFsvWzAtM10vLCAvWzAtOV0vLCAnLycsIC9bMC0xXS8sIC9bMC05XS8sICcvJywgL1swLTJdLywgL1swLTldLywgL1xcZC8sIC9cXGQvLCAnICcsIC9cXGQvLCAvXFxkLywgJzonLCAvWzAtNV0vLCAvXFxkL11cbiAgfSxcbiAgZWN0OiB7XG4gICAgdGV4dDogJzAwMDAwMDAwLTAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvXVxuICB9LFxuICBlbmRlcmVjbzoge1xuICAgIHRleHQ6ICcwMDAwLjAwMDAuMDAwMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvWzAtMl0vLCAvWzAtOV0vLCAvXFxkLywgL1xcZC9dXG4gIH0sXG4gIGlwdHU6IHtcbiAgICB0ZXh0OiAnMDAwMC4wMDAwLjAwMDAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1swLTJdLywgL1swLTldLywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICBudW1iZXI6IHtcbiAgICB0ZXh0OiAnMC4wMDAsMDAnLFxuICAgIHRleHRNYXNrOiBjcmVhdGVOdW1iZXJNYXNrKG1hc2tOdW1iZXIpXG4gIH0sXG4gIHBvcmNlbnRhZ2VtOiB7XG4gICAgdGV4dDogJzAwLDAwJScsXG4gICAgdGV4dE1hc2s6IGNyZWF0ZU51bWJlck1hc2soe1xuICAgICAgLi4ubWFza051bWJlcixcbiAgICAgIHN1ZmZpeDogJyUnXG4gICAgfSlcbiAgfSxcbiAgcGlzcGFzZXA6IHtcbiAgICB0ZXh0OiAnMDAwLjAwMDAwLjAwLTAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvXVxuICB9LFxuICBwbGFjYToge1xuICAgIHRleHQ6ICdBQUEtMDAwMCcsXG4gICAgdGV4dE1hc2s6IFsvW0EtU10vLCAvW0EtWl0vLCAvW0EtWl0vLCAnLScsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICBwcm9jZXNzbzoge1xuICAgIHRleHQ6ICcwMDAwMDAwLTAwLjAwMDAuQUFBLjAwMDAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICctJywgL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLicsIC9bQS1aYS16XS8sIC9bQS1aYS16XS8sIC9bQS1aYS16XS8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC9dXG4gIH0sXG4gIHJlbmF2YW06IHtcbiAgICB0ZXh0OiAnMDAwMDAwMDAwMC0wMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkL10sXG4gICAgdGV4dE1hc2tGdW5jdGlvbjogZnVuY3Rpb24gbWFzayh1c2VySW5wdXQ6IGFueSkge1xuICAgICAgY29uc3QgbnVtYmVycyA9IHVzZXJJbnB1dC5tYXRjaCgvXFxkL2cpO1xuICAgICAgbGV0IG51bWJlckxlbmd0aCA9IDA7XG4gICAgICBpZiAobnVtYmVycykge1xuICAgICAgICBudW1iZXJMZW5ndGggPSBudW1iZXJzLmpvaW4oJycpLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmICghdXNlcklucHV0IHx8IG51bWJlckxlbmd0aCA8IDkpIHtcbiAgICAgICAgcmV0dXJuIFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICctJywgL1xcZC9dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkL107XG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZzoge1xuICAgIHRleHQ6ICdBQS0wMC4wMDAuMDAwJyxcbiAgICB0ZXh0TWFzazogWy9bQS1aYS16XS8sIC9bQS1aYS16XS8sICctJywgL1xcZC8sIC9cXGQvLCAnLicsIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkL11cbiAgfSxcbiAgc3BlZDoge1xuICAgIHRleHQ6ICcwMDAwLjAwMDAuMDAwMCcsXG4gICAgdGV4dE1hc2s6IFsvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy4nLCAvWzAtMl0vLCAvWzAtOV0vLCAvXFxkLywgL1xcZC9dXG4gIH0sXG4gIHRlbGVmb25lOiB7XG4gICAgdGV4dDogJygwMCkgMDAwMDAtMDAwMCcsXG4gICAgdGV4dE1hc2s6IFsnKCcsIC9bMS05XS8sIC9cXGQvLCAnKScsICcgJywgL1sxLTldLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICctJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC9dLFxuICAgIHRleHRNYXNrRnVuY3Rpb246IGZ1bmN0aW9uIG1hc2sodXNlcklucHV0OiBhbnkpIHtcbiAgICAgIGNvbnN0IG51bWJlcnMgPSB1c2VySW5wdXQubWF0Y2goL1xcZC9nKTtcbiAgICAgIGxldCBudW1iZXJMZW5ndGggPSAwO1xuICAgICAgaWYgKG51bWJlcnMpIHtcbiAgICAgICAgbnVtYmVyTGVuZ3RoID0gbnVtYmVycy5qb2luKCcnKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoIXVzZXJJbnB1dCB8fCBudW1iZXJMZW5ndGggPiAxMCkge1xuICAgICAgICByZXR1cm4gWycoJywgL1sxLTldLywgL1xcZC8sICcpJywgJyAnLCAvWzEtOV0vLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkLywgJy0nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkL107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWycoJywgL1sxLTldLywgL1xcZC8sICcpJywgJyAnLCAvWzEtOV0vLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAnLScsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvXTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHRpbWU6IHtcbiAgICB0ZXh0OiAnMDA6MDAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAnOicsIC9bMC01XS8sIC9cXGQvXVxuICB9LFxuICB0aXR1bG86IHtcbiAgICB0ZXh0OiAnMDAwMC4wMDAwLjAwMDAnLFxuICAgIHRleHRNYXNrOiBbL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC8sICcuJywgL1swLTJdLywgL1swLTldLywgL1xcZC8sIC9cXGQvXVxuICB9LFxuICB1dGlsczoge1xuICAgIG51bWJlclRvU3RyaW5nOiAobjogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIW4gfHwgdHlwZW9mIG4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChuLnRvU3RyaW5nKCkpLnJlcGxhY2UoJy4nLCAnLCcpO1xuICAgIH0sXG4gICAgdGV4dE1hc2s6IGZhbHNlXG4gIH1cbn1cblxuXG5jb25zdCBtYWtlR2VuZXJpYyA9IChrZXk6IHN0cmluZykgPT4ge1xuICByZXR1cm4gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGxldCBtYXNrID0gTUFTS1Nba2V5XS50ZXh0TWFza1xuICAgIGxldCB0ZXh0TWFza0Z1bmN0aW9uID0gTUFTS1Nba2V5XS50ZXh0TWFza0Z1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0ZXh0TWFza0Z1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtYXNrID0gdGV4dE1hc2tGdW5jdGlvbih2YWx1ZSk7XG4gICAgfVxuXG5cbiAgICByZXR1cm4gY29uZm9ybVRvTWFzayhcbiAgICAgIHZhbHVlLFxuICAgICAgbWFzayxcbiAgICAgIHsgZ3VpZGU6IGZhbHNlIH1cbiAgICApLmNvbmZvcm1lZFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBtYXNrQnIgPSB7XG4gIGFpaDogbWFrZUdlbmVyaWMoJ2FpaCcpLFxuICBjZWx1bGFyOiBtYWtlR2VuZXJpYygnY2VsdWxhcicpLFxuICBjZXA6IG1ha2VHZW5lcmljKCdjZXAnKSxcbiAgY2VydGlkYW86IG1ha2VHZW5lcmljKCdjZXJ0aWRhbycpLFxuICBjaGFzc2k6IG1ha2VHZW5lcmljKCdjaGFzc2knKSxcbiAgY25hZTogbWFrZUdlbmVyaWMoJ2NuYWUnKSxcbiAgY25oOiBtYWtlR2VuZXJpYygnY25oJyksXG4gIHJlbmFjaHNlZ3VyYW5jYTogbWFrZUdlbmVyaWMoJ3JlbmFjaHNlZ3VyYW5jYScpLFxuICByZW5hY2hlc3RhZHVhbDogbWFrZUdlbmVyaWMoJ3JlbmFjaGVzdGFkdWFsJyksXG4gIGNuaGVzcGVsaG86IG1ha2VHZW5lcmljKCdjbmhlc3BlbGhvJyksXG4gIGNucGo6IG1ha2VHZW5lcmljKCdjbnBqJyksXG4gIGNuczogbWFrZUdlbmVyaWMoJ2NucycpLFxuICBjb250YWJhbmNvOiBtYWtlR2VuZXJpYygnY29udGFiYW5jbycpLFxuICBjcGY6IG1ha2VHZW5lcmljKCdjcGYnKSxcbiAgY3BmY25wajogbWFrZUdlbmVyaWMoJ2NwZmNucGonKSxcbiAgY2FydGFvY3JlZGl0bzogbWFrZUdlbmVyaWMoJ2NhcnRhb2NyZWRpdG8nKSxcbiAgY3VycmVuY3k6IChjdXJyZW5jeVZhbHVlSW5wdXQ6IHN0cmluZyB8IG51bWJlciwgZGVjaW1hbHNGb3JtYXQ6IG51bWJlciA9IDIpID0+IHtcbiAgICByZXR1cm4gZm9ybWF0TnVtYmVyKE1BU0tTWydjdXJyZW5jeSddLCBjdXJyZW5jeVZhbHVlSW5wdXQsIGRlY2ltYWxzRm9ybWF0KTtcbiAgfSxcbiAgZGF0YTogbWFrZUdlbmVyaWMoJ2RhdGEnKSxcbiAgZGF0ZTogbWFrZUdlbmVyaWMoJ2RhdGUnKSxcbiAgZGF0ZXRpbWU6IG1ha2VHZW5lcmljKCdkYXRldGltZScpLFxuICBkYXRhaG9yYTogbWFrZUdlbmVyaWMoJ2RhdGFob3JhJyksXG4gIGVjdDogbWFrZUdlbmVyaWMoJ2VjdCcpLFxuICBlbmRlcmVjbzogbWFrZUdlbmVyaWMoJ2VuZGVyZWNvJyksXG4gIGluc2NyaWNhb2VzdGFkdWFsOiAoaW5zY3JpY2FvZXN0YWR1YWxWYWx1ZTogc3RyaW5nLCBlc3RhZG86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGllID0gTUFTS1NJRTtcbiAgICBjb25zdCBpZVN0YXRlID0gaWVbZXN0YWRvXVxuXG4gICAgaWYgKCFpbnNjcmljYW9lc3RhZHVhbFZhbHVlIHx8ICFlc3RhZG8gfHwgIWllU3RhdGUgfHxcbiAgICAgICFpZVN0YXRlLnRleHRNYXNrKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgbGV0IG1hc2sgPSBpZVN0YXRlLnRleHRNYXNrO1xuICAgIGxldCB0ZXh0TWFza0Z1bmN0aW9uID0gaWVTdGF0ZS50ZXh0TWFza0Z1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0ZXh0TWFza0Z1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtYXNrID0gdGV4dE1hc2tGdW5jdGlvbihpbnNjcmljYW9lc3RhZHVhbFZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZm9ybVRvTWFzayhcbiAgICAgIGluc2NyaWNhb2VzdGFkdWFsVmFsdWUsXG4gICAgICBtYXNrLFxuICAgICAgeyBndWlkZTogZmFsc2UgfVxuICAgICkuY29uZm9ybWVkVmFsdWU7XG4gIH0sXG4gIGlwdHU6IChpcHR1VmFsdWU6IHN0cmluZywgZXN0YWRvOiBzdHJpbmcsIGNpZGFkZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbWFzayA9IG1hc2tfaXB0dShpcHR1VmFsdWUsIGVzdGFkbywgY2lkYWRlKTtcbiAgICBpZiAoIW1hc2sgfHwgdHlwZW9mIG1hc2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBjb25mb3JtVG9NYXNrKFxuICAgICAgaXB0dVZhbHVlLFxuICAgICAgbWFzay50ZXh0TWFzayxcbiAgICAgIHsgZ3VpZGU6IGZhbHNlIH1cbiAgICApLmNvbmZvcm1lZFZhbHVlO1xuICB9LFxuICBudW1iZXI6IChudW1iZXJWYWx1ZTogYW55LCBkZWNpbWFsc0Zvcm1hdDogbnVtYmVyID0gMikgPT4ge1xuICAgIHJldHVybiBmb3JtYXROdW1iZXIoTUFTS1NbJ251bWJlciddLCBudW1iZXJWYWx1ZSwgZGVjaW1hbHNGb3JtYXQpO1xuICB9LFxuICBwb3JjZW50YWdlbTogKHBvcmNlbnRhZ2VtVmFsdWU6IHN0cmluZywgZGVjaW1hbHNGb3JtYXQ6IG51bWJlciA9IDIpID0+IHtcbiAgICByZXR1cm4gZm9ybWF0TnVtYmVyKE1BU0tTWydwb3JjZW50YWdlbSddLCBwb3JjZW50YWdlbVZhbHVlLCBkZWNpbWFsc0Zvcm1hdCk7XG4gIH0sXG4gIHBpc3Bhc2VwOiBtYWtlR2VuZXJpYygncGlzcGFzZXAnKSxcbiAgcGxhY2E6IG1ha2VHZW5lcmljKCdwbGFjYScpLFxuICBwcm9jZXNzbzogbWFrZUdlbmVyaWMoJ3Byb2Nlc3NvJyksXG4gIHJlbmF2YW06IG1ha2VHZW5lcmljKCdyZW5hdmFtJyksXG4gIHJnOiBtYWtlR2VuZXJpYygncmcnKSxcbiAgc3BlZDogbWFrZUdlbmVyaWMoJ3NwZWQnKSxcbiAgdGVsZWZvbmU6IG1ha2VHZW5lcmljKCd0ZWxlZm9uZScpLFxuICB0aW1lOiAodmFsdWU6IHN0cmluZyB8IERhdGUpID0+IHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnRvVGltZVN0cmluZygpLnNwbGl0KCcgJylbMF1cbiAgICB9XG4gICAgcmV0dXJuIG1ha2VHZW5lcmljKCd0aW1lJykodmFsdWUpXG4gIH0sXG4gIHRpdHVsbzogbWFrZUdlbmVyaWMoJ3RpdHVsbycpXG59O1xuXG5cblxuLyoqXG4gKiBGUk9NIFRFWFQtTUFTS1xuICovXG5leHBvcnQgY29uc3QgcGxhY2Vob2xkZXJDaGFyID0gJ18nXG5leHBvcnQgY29uc3Qgc3RyRnVuY3Rpb24gPSAnZnVuY3Rpb24nXG5cbmNvbnN0IGRlZmF1bHRQbGFjZWhvbGRlckNoYXIgPSBwbGFjZWhvbGRlckNoYXI7XG5jb25zdCBlbXB0eUFycmF5OiBhbnkgPSBbXVxuY29uc3QgZW1wdHlTdHJpbmcgPSAnJ1xuXG5leHBvcnQgZnVuY3Rpb24gY29uZm9ybVRvTWFzayhpbnB1dFZhbHVlOiBTdHJpbmcgfCBEYXRlID0gZW1wdHlTdHJpbmcsIG1hc2sgPSBlbXB0eUFycmF5LCBjb25maWc6IGFueSA9IHt9KSB7XG4gIGxldCByYXdWYWx1ZSA9IGlucHV0VmFsdWUudG9TdHJpbmcoKTtcbiAgaWYgKHR5cGVvZiBpbnB1dFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJhd1ZhbHVlID0gKDxudW1iZXI+aW5wdXRWYWx1ZSkudG9TdHJpbmcoKTtcbiAgfVxuICBpZiAoaW5wdXRWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByYXdWYWx1ZSA9ICg8RGF0ZT5pbnB1dFZhbHVlKS50b0xvY2FsZVN0cmluZyhcInB0LWJyXCIpXG4gIH1cblxuICBpZiAoIWlzQXJyYXkobWFzaykpIHtcbiAgICAvLyBJZiBzb21lb25lIHBhc3NlcyBhIGZ1bmN0aW9uIGFzIHRoZSBtYXNrIHByb3BlcnR5LCB3ZSBzaG91bGQgY2FsbCB0aGVcbiAgICAvLyBmdW5jdGlvbiB0byBnZXQgdGhlIG1hc2sgYXJyYXkgLSBOb3JtYWxseSB0aGlzIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgLy8gYGNyZWF0ZVRleHRNYXNrSW5wdXRFbGVtZW50OnVwZGF0ZWAgZnVuY3Rpb24gLSB0aGlzIGFsbG93cyBtYXNrIGZ1bmN0aW9uc1xuICAgIC8vIHRvIGJlIHVzZWQgZGlyZWN0bHkgd2l0aCBgY29uZm9ybVRvTWFza2BcblxuICAgIGlmICh0eXBlb2YgbWFzayA9PT0gc3RyRnVuY3Rpb24pIHtcbiAgICAgIC8vIGNhbGwgdGhlIG1hc2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBtYXNrIGFycmF5XG4gICAgICBtYXNrID0gbWFzayhpbnB1dFZhbHVlLCBjb25maWcpXG5cbiAgICAgIC8vIG1hc2sgZnVuY3Rpb25zIGNhbiBzZXR1cCBjYXJldCB0cmFwcyB0byBoYXZlIHNvbWUgY29udHJvbCBvdmVyIGhvdyB0aGUgY2FyZXQgbW92ZXMuIFdlIG5lZWQgdG8gcHJvY2Vzc1xuICAgICAgLy8gdGhlIG1hc2sgZm9yIGFueSBjYXJldCB0cmFwcy4gYHByb2Nlc3NDYXJldFRyYXBzYCB3aWxsIHJlbW92ZSB0aGUgY2FyZXQgdHJhcHMgZnJvbSB0aGUgbWFza1xuICAgICAgbWFzayA9IHByb2Nlc3NDYXJldFRyYXBzKG1hc2spLm1hc2tXaXRob3V0Q2FyZXRUcmFwc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUZXh0LW1hc2s6Y29uZm9ybVRvTWFzazsgVGhlIG1hc2sgcHJvcGVydHkgbXVzdCBiZSBhbiBhcnJheS4nXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLy8gVGhlc2UgY29uZmlndXJhdGlvbnMgdGVsbCB1cyBob3cgdG8gY29uZm9ybSB0aGUgbWFza1xuXG4gIGNvbnN0IGd1aWRlID0gY29uZmlnLmd1aWRlIHx8IHRydWU7XG4gIGNvbnN0IHByZXZpb3VzQ29uZm9ybWVkVmFsdWUgPSBjb25maWcucHJldmlvdXNDb25mb3JtZWRWYWx1ZSB8fCBlbXB0eVN0cmluZztcbiAgY29uc3QgcGxhY2Vob2xkZXIgPSBjb252ZXJ0TWFza1RvUGxhY2Vob2xkZXIobWFzaywgcGxhY2Vob2xkZXJDaGFyKTtcbiAgY29uc3QgY3VycmVudENhcmV0UG9zaXRpb24gPSBjb25maWcuY3VycmVudENhcmV0UG9zaXRpb247XG4gIGNvbnN0IGtlZXBDaGFyUG9zaXRpb25zID0gY29uZmlnLmtlZXBDaGFyUG9zaXRpb25zO1xuXG4gIC8vIFRoZSBjb25maWdzIGJlbG93IGluZGljYXRlIHRoYXQgdGhlIHVzZXIgd2FudHMgdGhlIGFsZ29yaXRobSB0byB3b3JrIGluICpubyBndWlkZSogbW9kZVxuICBjb25zdCBzdXBwcmVzc0d1aWRlID0gZ3VpZGUgPT09IGZhbHNlICYmIHByZXZpb3VzQ29uZm9ybWVkVmFsdWUgIT09IHVuZGVmaW5lZFxuXG4gIC8vIENhbGN1bGF0ZSBsZW5ndGhzIG9uY2UgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IHJhd1ZhbHVlTGVuZ3RoID0gcmF3VmFsdWUubGVuZ3RoXG4gIGNvbnN0IHByZXZpb3VzQ29uZm9ybWVkVmFsdWVMZW5ndGggPSBwcmV2aW91c0NvbmZvcm1lZFZhbHVlLmxlbmd0aFxuICBjb25zdCBwbGFjZWhvbGRlckxlbmd0aCA9IHBsYWNlaG9sZGVyLmxlbmd0aFxuICBjb25zdCBtYXNrTGVuZ3RoID0gbWFzay5sZW5ndGhcblxuICAvLyBUaGlzIHRlbGxzIHVzIHRoZSBudW1iZXIgb2YgZWRpdGVkIGNoYXJhY3RlcnMgYW5kIHRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhleSB3ZXJlIGVkaXRlZCAoKy8tKVxuICBjb25zdCBlZGl0RGlzdGFuY2UgPSByYXdWYWx1ZUxlbmd0aCAtIHByZXZpb3VzQ29uZm9ybWVkVmFsdWVMZW5ndGhcblxuICAvLyBJbiAqbm8gZ3VpZGUqIG1vZGUsIHdlIG5lZWQgdG8ga25vdyBpZiB0aGUgdXNlciBpcyB0cnlpbmcgdG8gYWRkIGEgY2hhcmFjdGVyIG9yIG5vdFxuICBjb25zdCBpc0FkZGl0aW9uID0gZWRpdERpc3RhbmNlID4gMFxuXG4gIC8vIFRlbGxzIHVzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhbmdlLiBGb3IgKDQzOCkgMzk0LTQ5MzggdG8gKDM4KSAzOTQtNDkzOCwgdGhhdCB3b3VsZCBiZSAxXG4gIGNvbnN0IGluZGV4T2ZGaXJzdENoYW5nZSA9IGN1cnJlbnRDYXJldFBvc2l0aW9uICsgKGlzQWRkaXRpb24gPyAtZWRpdERpc3RhbmNlIDogMClcblxuICAvLyBXZSdyZSBhbHNvIGdvbm5hIG5lZWQgdGhlIGluZGV4IG9mIGxhc3QgY2hhbmdlLCB3aGljaCB3ZSBjYW4gZGVyaXZlIGFzIGZvbGxvd3MuLi5cbiAgY29uc3QgaW5kZXhPZkxhc3RDaGFuZ2UgPSBpbmRleE9mRmlyc3RDaGFuZ2UgKyBNYXRoLmFicyhlZGl0RGlzdGFuY2UpXG5cbiAgLy8gSWYgYGNvbmZvcm1Ub01hc2tgIGlzIGNvbmZpZ3VyZWQgdG8ga2VlcCBjaGFyYWN0ZXIgcG9zaXRpb25zLCB0aGF0IGlzLCBmb3IgbWFzayAxMTEsIHByZXZpb3VzIHZhbHVlXG4gIC8vIF8yXyBhbmQgcmF3IHZhbHVlIDNfMl8sIHRoZSBuZXcgY29uZm9ybWVkIHZhbHVlIHNob3VsZCBiZSAzMl8sIG5vdCAzXzIgKGRlZmF1bHQgYmVoYXZpb3IpLiBUaGF0J3MgaW4gdGhlIGNhc2Ugb2ZcbiAgLy8gYWRkaXRpb24uIEFuZCBpbiB0aGUgY2FzZSBvZiBkZWxldGlvbiwgcHJldmlvdXMgdmFsdWUgXzIzLCByYXcgdmFsdWUgXzMsIHRoZSBuZXcgY29uZm9ybWVkIHN0cmluZyBzaG91bGQgYmVcbiAgLy8gX18zLCBub3QgXzNfIChkZWZhdWx0IGJlaGF2aW9yKVxuICAvL1xuICAvLyBUaGUgbmV4dCBibG9jayBvZiBsb2dpYyBoYW5kbGVzIGtlZXBpbmcgY2hhcmFjdGVyIHBvc2l0aW9ucyBmb3IgdGhlIGNhc2Ugb2YgZGVsZXRpb24uIChLZWVwaW5nXG4gIC8vIGNoYXJhY3RlciBwb3NpdGlvbnMgZm9yIHRoZSBjYXNlIG9mIGFkZGl0aW9uIGlzIGZ1cnRoZXIgZG93biBzaW5jZSBpdCBpcyBoYW5kbGVkIGRpZmZlcmVudGx5LilcbiAgLy8gVG8gZG8gdGhpcywgd2Ugd2FudCB0byBjb21wZW5zYXRlIGZvciBhbGwgY2hhcmFjdGVycyB0aGF0IHdlcmUgZGVsZXRlZFxuICBpZiAoa2VlcENoYXJQb3NpdGlvbnMgPT09IHRydWUgJiYgIWlzQWRkaXRpb24pIHtcbiAgICAvLyBXZSB3aWxsIGJlIHN0b3JpbmcgdGhlIG5ldyBwbGFjZWhvbGRlciBjaGFyYWN0ZXJzIGluIHRoaXMgdmFyaWFibGUuXG4gICAgbGV0IGNvbXBlbnNhdGluZ1BsYWNlaG9sZGVyQ2hhcnMgPSBlbXB0eVN0cmluZ1xuXG4gICAgLy8gRm9yIGV2ZXJ5IGNoYXJhY3RlciB0aGF0IHdhcyBkZWxldGVkIGZyb20gYSBwbGFjZWhvbGRlciBwb3NpdGlvbiwgd2UgYWRkIGEgcGxhY2Vob2xkZXIgY2hhclxuICAgIGZvciAobGV0IGkgPSBpbmRleE9mRmlyc3RDaGFuZ2U7IGkgPCBpbmRleE9mTGFzdENoYW5nZTsgaSsrKSB7XG4gICAgICBpZiAocGxhY2Vob2xkZXJbaV0gPT09IHBsYWNlaG9sZGVyQ2hhcikge1xuICAgICAgICBjb21wZW5zYXRpbmdQbGFjZWhvbGRlckNoYXJzICs9IHBsYWNlaG9sZGVyQ2hhclxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vdyB3ZSB0cmljayBvdXIgYWxnb3JpdGhtIGJ5IG1vZGlmeWluZyB0aGUgcmF3IHZhbHVlIHRvIG1ha2UgaXQgY29udGFpbiBhZGRpdGlvbmFsIHBsYWNlaG9sZGVyIGNoYXJhY3RlcnNcbiAgICAvLyBUaGF0IHdheSB3aGVuIHRoZSB3ZSBzdGFydCBsYXlpbmcgdGhlIGNoYXJhY3RlcnMgYWdhaW4gb24gdGhlIG1hc2ssIGl0IHdpbGwga2VlcCB0aGUgbm9uLWRlbGV0ZWQgY2hhcmFjdGVyc1xuICAgIC8vIGluIHRoZWlyIHBvc2l0aW9ucy5cbiAgICByYXdWYWx1ZSA9IChcbiAgICAgIHJhd1ZhbHVlLnNsaWNlKDAsIGluZGV4T2ZGaXJzdENoYW5nZSkgK1xuICAgICAgY29tcGVuc2F0aW5nUGxhY2Vob2xkZXJDaGFycyArXG4gICAgICByYXdWYWx1ZS5zbGljZShpbmRleE9mRmlyc3RDaGFuZ2UsIHJhd1ZhbHVlTGVuZ3RoKVxuICAgIClcbiAgfVxuXG4gIC8vIENvbnZlcnQgYHJhd1ZhbHVlYCBzdHJpbmcgdG8gYW4gYXJyYXksIGFuZCBtYXJrIGNoYXJhY3RlcnMgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBuZXdseSBhZGRlZCBvciBoYXZlXG4gIC8vIGV4aXN0ZWQgaW4gdGhlIHByZXZpb3VzIGNvbmZvcm1lZCB2YWx1ZS4gSWRlbnRpZnlpbmcgbmV3IGFuZCBvbGQgY2hhcmFjdGVycyBpcyBuZWVkZWQgZm9yIGBjb25mb3JtVG9NYXNrYFxuICAvLyB0byB3b3JrIGlmIGl0IGlzIGNvbmZpZ3VyZWQgdG8ga2VlcCBjaGFyYWN0ZXIgcG9zaXRpb25zLlxuICBjb25zdCByYXdWYWx1ZUFyciA9IHJhd1ZhbHVlXG4gICAgLnNwbGl0KGVtcHR5U3RyaW5nKVxuICAgIC5tYXAoKGNoYXIsIGkpID0+ICh7IGNoYXIsIGlzTmV3OiBpID49IGluZGV4T2ZGaXJzdENoYW5nZSAmJiBpIDwgaW5kZXhPZkxhc3RDaGFuZ2UgfSkpXG5cbiAgLy8gVGhlIGxvb3AgYmVsb3cgcmVtb3ZlcyBtYXNraW5nIGNoYXJhY3RlcnMgZnJvbSB1c2VyIGlucHV0LiBGb3IgZXhhbXBsZSwgZm9yIG1hc2tcbiAgLy8gYDAwICgxMTEpYCwgdGhlIHBsYWNlaG9sZGVyIHdvdWxkIGJlIGAwMCAoX19fKWAuIElmIHVzZXIgaW5wdXQgaXMgYDAwICgyMzQpYCwgdGhlIGxvb3AgYmVsb3dcbiAgLy8gd291bGQgcmVtb3ZlIGFsbCBjaGFyYWN0ZXJzIGJ1dCBgMjM0YCBmcm9tIHRoZSBgcmF3VmFsdWVBcnJgLiBUaGUgcmVzdCBvZiB0aGUgYWxnb3JpdGhtXG4gIC8vIHRoZW4gd291bGQgbGF5IGAyMzRgIG9uIHRvcCBvZiB0aGUgYXZhaWxhYmxlIHBsYWNlaG9sZGVyIHBvc2l0aW9ucyBpbiB0aGUgbWFzay5cbiAgZm9yIChsZXQgaSA9IHJhd1ZhbHVlTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCB7IGNoYXIgfSA9IHJhd1ZhbHVlQXJyW2ldXG5cbiAgICBpZiAoY2hhciAhPT0gcGxhY2Vob2xkZXJDaGFyKSB7XG4gICAgICBjb25zdCBzaG91bGRPZmZzZXQgPSBpID49IGluZGV4T2ZGaXJzdENoYW5nZSAmJiBwcmV2aW91c0NvbmZvcm1lZFZhbHVlTGVuZ3RoID09PSBtYXNrTGVuZ3RoXG5cbiAgICAgIGlmIChjaGFyID09PSBwbGFjZWhvbGRlclsoc2hvdWxkT2Zmc2V0KSA/IGkgLSBlZGl0RGlzdGFuY2UgOiBpXSkge1xuICAgICAgICByYXdWYWx1ZUFyci5zcGxpY2UoaSwgMSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGlzIHRoZSB2YXJpYWJsZSB0aGF0IHdlIHdpbGwgYmUgZmlsbGluZyB3aXRoIGNoYXJhY3RlcnMgYXMgd2UgZmlndXJlIHRoZW0gb3V0XG4gIC8vIGluIHRoZSBhbGdvcml0aG0gYmVsb3dcbiAgbGV0IGNvbmZvcm1lZFZhbHVlID0gZW1wdHlTdHJpbmdcbiAgbGV0IHNvbWVDaGFyc1JlamVjdGVkID0gZmFsc2VcblxuICAvLyBPaywgc28gZmlyc3Qgd2UgbG9vcCB0aHJvdWdoIHRoZSBwbGFjZWhvbGRlciBsb29raW5nIGZvciBwbGFjZWhvbGRlciBjaGFyYWN0ZXJzIHRvIGZpbGwgdXAuXG4gIHBsYWNlaG9sZGVyTG9vcDogZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFjZWhvbGRlckxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhckluUGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcltpXVxuXG4gICAgLy8gV2Ugc2VlIG9uZS4gTGV0J3MgZmluZCBvdXQgd2hhdCB3ZSBjYW4gcHV0IGluIGl0LlxuICAgIGlmIChjaGFySW5QbGFjZWhvbGRlciA9PT0gcGxhY2Vob2xkZXJDaGFyKSB7XG4gICAgICAvLyBCdXQgYmVmb3JlIHRoYXQsIGRvIHdlIGFjdHVhbGx5IGhhdmUgYW55IHVzZXIgY2hhcmFjdGVycyB0aGF0IG5lZWQgYSBwbGFjZT9cbiAgICAgIGlmIChyYXdWYWx1ZUFyci5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFdlIHdpbGwga2VlcCBjaGlwcGluZyBhd2F5IGF0IHVzZXIgaW5wdXQgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgY2hhcmFjdGVyc1xuICAgICAgICAvLyBvciB3ZSBmaW5kIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgdGhhdCB3ZSBjYW4gbWFwLlxuICAgICAgICB3aGlsZSAocmF3VmFsdWVBcnIubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIExldCdzIHJldHJpZXZlIHRoZSBmaXJzdCB1c2VyIGNoYXJhY3RlciBpbiB0aGUgcXVldWUgb2YgY2hhcmFjdGVycyB3ZSBoYXZlIGxlZnRcbiAgICAgICAgICBjb25zdCBzaGlmdCA9IHJhd1ZhbHVlQXJyLnNoaWZ0KCk7XG4gICAgICAgICAgbGV0IHJhd1ZhbHVlQ2hhcjogc3RyaW5nID0gJycsIGlzTmV3OiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHNoaWZ0KSB7XG4gICAgICAgICAgICByYXdWYWx1ZUNoYXIgPSBzaGlmdC5jaGFyO1xuICAgICAgICAgICAgaXNOZXcgPSBzaGlmdC5pc05ldztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiB0aGUgY2hhcmFjdGVyIHdlIGdvdCBmcm9tIHRoZSB1c2VyIGlucHV0IGlzIGEgcGxhY2Vob2xkZXIgY2hhcmFjdGVyICh3aGljaCBoYXBwZW5zXG4gICAgICAgICAgLy8gcmVndWxhcmx5IGJlY2F1c2UgdXNlciBpbnB1dCBjb3VsZCBiZSBzb21ldGhpbmcgbGlrZSAoNTQwKSA5MF8tX19fXywgd2hpY2ggaW5jbHVkZXNcbiAgICAgICAgICAvLyBhIGJ1bmNoIG9mIGBfYCB3aGljaCBhcmUgcGxhY2Vob2xkZXIgY2hhcmFjdGVycykgYW5kIHdlIGFyZSBub3QgaW4gKm5vIGd1aWRlKiBtb2RlLFxuICAgICAgICAgIC8vIHRoZW4gd2UgbWFwIHRoaXMgcGxhY2Vob2xkZXIgY2hhcmFjdGVyIHRvIHRoZSBjdXJyZW50IHNwb3QgaW4gdGhlIHBsYWNlaG9sZGVyXG4gICAgICAgICAgaWYgKHJhd1ZhbHVlQ2hhciA9PT0gcGxhY2Vob2xkZXJDaGFyICYmIHN1cHByZXNzR3VpZGUgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbmZvcm1lZFZhbHVlICs9IHBsYWNlaG9sZGVyQ2hhclxuXG4gICAgICAgICAgICAvLyBBbmQgd2UgZ28gdG8gZmluZCB0aGUgbmV4dCBwbGFjZWhvbGRlciBjaGFyYWN0ZXIgdGhhdCBuZWVkcyBmaWxsaW5nXG4gICAgICAgICAgICBjb250aW51ZSBwbGFjZWhvbGRlckxvb3BcblxuICAgICAgICAgICAgLy8gRWxzZSBpZiwgdGhlIGNoYXJhY3RlciB3ZSBnb3QgZnJvbSB0aGUgdXNlciBpbnB1dCBpcyBub3QgYSBwbGFjZWhvbGRlciwgbGV0J3Mgc2VlXG4gICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgbWFzayBjYW4gYWNjZXB0IGl0LlxuICAgICAgICAgIH0gZWxzZSBpZiAobWFza1tpXS50ZXN0KHJhd1ZhbHVlQ2hhcikpIHtcbiAgICAgICAgICAgIC8vIHdlIG1hcCB0aGUgY2hhcmFjdGVyIGRpZmZlcmVudGx5IGJhc2VkIG9uIHdoZXRoZXIgd2UgYXJlIGtlZXBpbmcgY2hhcmFjdGVyIHBvc2l0aW9ucyBvciBub3QuXG4gICAgICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIGNvbmRpdGlvbnMgYmVsb3cgYXJlIG1ldCwgd2Ugc2ltcGx5IG1hcCB0aGUgcmF3IHZhbHVlIGNoYXJhY3RlciB0byB0aGVcbiAgICAgICAgICAgIC8vIHBsYWNlaG9sZGVyIHBvc2l0aW9uLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBrZWVwQ2hhclBvc2l0aW9ucyAhPT0gdHJ1ZSB8fFxuICAgICAgICAgICAgICBpc05ldyA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgICAgcHJldmlvdXNDb25mb3JtZWRWYWx1ZSA9PT0gZW1wdHlTdHJpbmcgfHxcbiAgICAgICAgICAgICAgZ3VpZGUgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICAgICFpc0FkZGl0aW9uXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uZm9ybWVkVmFsdWUgKz0gcmF3VmFsdWVDaGFyXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBXZSBlbnRlciB0aGlzIGJsb2NrIG9mIGNvZGUgaWYgd2UgYXJlIHRyeWluZyB0byBrZWVwIGNoYXJhY3RlciBwb3NpdGlvbnMgYW5kIG5vbmUgb2YgdGhlIGNvbmRpdGlvbnNcbiAgICAgICAgICAgICAgLy8gYWJvdmUgaXMgbWV0LiBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gc2VlIGlmIHRoZXJlJ3MgYW4gYXZhaWxhYmxlIHNwb3QgZm9yIHRoZSByYXcgdmFsdWUgY2hhcmFjdGVyXG4gICAgICAgICAgICAgIC8vIHRvIGJlIG1hcHBlZCB0by4gSWYgd2UgY291bGRuJ3QgZmluZCBhIHNwb3QsIHdlIHdpbGwgZGlzY2FyZCB0aGUgY2hhcmFjdGVyLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgZm9yIG1hc2sgYDExMTFgLCBwcmV2aW91cyBjb25mb3JtZWQgdmFsdWUgYF8yX19gLCByYXcgdmFsdWUgYDk0Ml8yX19gLiBXZSBjYW4gbWFwIHRoZVxuICAgICAgICAgICAgICAvLyBgOWAsIHRvIHRoZSBmaXJzdCBhdmFpbGFibGUgcGxhY2Vob2xkZXIgcG9zaXRpb24sIGJ1dCB0aGVuLCB0aGVyZSBhcmUgbm8gbW9yZSBzcG90cyBhdmFpbGFibGUgZm9yIHRoZVxuICAgICAgICAgICAgICAvLyBgNGAgYW5kIGAyYC4gU28sIHdlIGRpc2NhcmQgdGhlbSBhbmQgZW5kIHVwIHdpdGggYSBjb25mb3JtZWQgdmFsdWUgb2YgYDkyX19gLlxuICAgICAgICAgICAgICBjb25zdCByYXdWYWx1ZUFyckxlbmd0aCA9IHJhd1ZhbHVlQXJyLmxlbmd0aFxuICAgICAgICAgICAgICBsZXQgaW5kZXhPZk5leHRBdmFpbGFibGVQbGFjZWhvbGRlckNoYXIgPSBudWxsXG5cbiAgICAgICAgICAgICAgLy8gTGV0J3MgbG9vcCB0aHJvdWdoIHRoZSByZW1haW5pbmcgcmF3IHZhbHVlIGNoYXJhY3RlcnMuIFdlIGFyZSBsb29raW5nIGZvciBlaXRoZXIgYSBzdWl0YWJsZSBzcG90LCBpZSxcbiAgICAgICAgICAgICAgLy8gYSBwbGFjZWhvbGRlciBjaGFyYWN0ZXIgb3IgYSBub24tc3VpdGFibGUgc3BvdCwgaWUsIGEgbm9uLXBsYWNlaG9sZGVyIGNoYXJhY3RlciB0aGF0IGlzIG5vdCBuZXcuXG4gICAgICAgICAgICAgIC8vIElmIHdlIHNlZSBhIHN1aXRhYmxlIHNwb3QgZmlyc3QsIHdlIHN0b3JlIGl0cyBwb3NpdGlvbiBhbmQgZXhpdCB0aGUgbG9vcC4gSWYgd2Ugc2VlIGEgbm9uLXN1aXRhYmxlXG4gICAgICAgICAgICAgIC8vIHNwb3QgZmlyc3QsIHdlIGV4aXQgdGhlIGxvb3AgYW5kIG91ciBgaW5kZXhPZk5leHRBdmFpbGFibGVQbGFjZWhvbGRlckNoYXJgIHdpbGwgc3RheSBhcyBgbnVsbGAuXG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3VmFsdWVBcnJMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJEYXRhID0gcmF3VmFsdWVBcnJbaV1cblxuICAgICAgICAgICAgICAgIGlmIChjaGFyRGF0YS5jaGFyICE9PSBwbGFjZWhvbGRlckNoYXIgJiYgY2hhckRhdGEuaXNOZXcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjaGFyRGF0YS5jaGFyID09PSBwbGFjZWhvbGRlckNoYXIpIHtcbiAgICAgICAgICAgICAgICAgIGluZGV4T2ZOZXh0QXZhaWxhYmxlUGxhY2Vob2xkZXJDaGFyID0gaVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBJZiBgaW5kZXhPZk5leHRBdmFpbGFibGVQbGFjZWhvbGRlckNoYXJgIGlzIG5vdCBgbnVsbGAsIHRoYXQgbWVhbnMgdGhlIGNoYXJhY3RlciBpcyBub3QgYmxvY2tlZC5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIG1hcCBpdC4gQW5kIHRvIGtlZXAgdGhlIGNoYXJhY3RlciBwb3NpdGlvbnMsIHdlIHJlbW92ZSB0aGUgcGxhY2Vob2xkZXIgY2hhcmFjdGVyXG4gICAgICAgICAgICAgIC8vIGZyb20gdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzXG4gICAgICAgICAgICAgIGlmIChpbmRleE9mTmV4dEF2YWlsYWJsZVBsYWNlaG9sZGVyQ2hhciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZvcm1lZFZhbHVlICs9IHJhd1ZhbHVlQ2hhclxuICAgICAgICAgICAgICAgIHJhd1ZhbHVlQXJyLnNwbGljZShpbmRleE9mTmV4dEF2YWlsYWJsZVBsYWNlaG9sZGVyQ2hhciwgMSlcblxuICAgICAgICAgICAgICAgIC8vIElmIGBpbmRleE9mTmV4dEF2YWlsYWJsZVBsYWNlaG9sZGVyQ2hhcmAgaXMgYG51bGxgLCB0aGF0IG1lYW5zIHRoZSBjaGFyYWN0ZXIgaXMgYmxvY2tlZC4gV2UgaGF2ZSB0b1xuICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgaXQuXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaS0tXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2luY2Ugd2UndmUgbWFwcGVkIHRoaXMgcGxhY2Vob2xkZXIgcG9zaXRpb24uIFdlIG1vdmUgb24gdG8gdGhlIG5leHQgb25lLlxuICAgICAgICAgICAgY29udGludWUgcGxhY2Vob2xkZXJMb29wXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvbWVDaGFyc1JlamVjdGVkID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXZSByZWFjaCB0aGlzIHBvaW50IHdoZW4gd2UndmUgbWFwcGVkIGFsbCB0aGUgdXNlciBpbnB1dCBjaGFyYWN0ZXJzIHRvIHBsYWNlaG9sZGVyXG4gICAgICAvLyBwb3NpdGlvbnMgaW4gdGhlIG1hc2suIEluICpndWlkZSogbW9kZSwgd2UgYXBwZW5kIHRoZSBsZWZ0IG92ZXIgY2hhcmFjdGVycyBpbiB0aGVcbiAgICAgIC8vIHBsYWNlaG9sZGVyIHRvIHRoZSBgY29uZm9ybWVkU3RyaW5nYCwgYnV0IGluICpubyBndWlkZSogbW9kZSwgd2UgZG9uJ3Qgd2FubmEgZG8gdGhhdC5cbiAgICAgIC8vXG4gICAgICAvLyBUaGF0IGlzLCBmb3IgbWFzayBgKDExMSlgIGFuZCB1c2VyIGlucHV0IGAyYCwgd2Ugd2FudCB0byByZXR1cm4gYCgyYCwgbm90IGAoMl9fKWAuXG4gICAgICBpZiAoc3VwcHJlc3NHdWlkZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uZm9ybWVkVmFsdWUgKz0gcGxhY2Vob2xkZXIuc3Vic3RyKGksIHBsYWNlaG9sZGVyTGVuZ3RoKVxuICAgICAgfVxuXG4gICAgICAvLyBBbmQgd2UgYnJlYWtcbiAgICAgIGJyZWFrXG5cbiAgICAgIC8vIEVsc2UsIHRoZSBjaGFySW5QbGFjZWhvbGRlciBpcyBub3QgYSBwbGFjZWhvbGRlckNoYXIuIFRoYXQgaXMsIHdlIGNhbm5vdCBmaWxsIGl0XG4gICAgICAvLyB3aXRoIHVzZXIgaW5wdXQuIFNvIHdlIGp1c3QgbWFwIGl0IHRvIHRoZSBmaW5hbCBvdXRwdXRcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZm9ybWVkVmFsdWUgKz0gY2hhckluUGxhY2Vob2xkZXJcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgZm9sbG93aW5nIGxvZ2ljIGlzIG5lZWRlZCB0byBkZWFsIHdpdGggdGhlIGNhc2Ugb2YgZGVsZXRpb24gaW4gKm5vIGd1aWRlKiBtb2RlLlxuICAvL1xuICAvLyBDb25zaWRlciB0aGUgc2lsbHkgbWFzayBgKDExMSkgLy8vIDFgLiBXaGF0IGlmIHVzZXIgdHJpZXMgdG8gZGVsZXRlIHRoZSBsYXN0IHBsYWNlaG9sZGVyXG4gIC8vIHBvc2l0aW9uPyBTb21ldGhpbmcgbGlrZSBgKDU4OSkgLy8vIGAuIFdlIHdhbnQgdG8gY29uZm9ybSB0aGF0IHRvIGAoNTg5YC4gTm90IGAoNTg5KSAvLy8gYC5cbiAgLy8gVGhhdCdzIHdoeSB0aGUgbG9naWMgYmVsb3cgZmluZHMgdGhlIGxhc3QgZmlsbGVkIHBsYWNlaG9sZGVyIGNoYXJhY3RlciwgYW5kIHJlbW92ZXMgZXZlcnl0aGluZ1xuICAvLyBmcm9tIHRoYXQgcG9pbnQgb24uXG4gIGlmIChzdXBwcmVzc0d1aWRlICYmIGlzQWRkaXRpb24gPT09IGZhbHNlKSB7XG4gICAgbGV0IGluZGV4T2ZMYXN0RmlsbGVkUGxhY2Vob2xkZXJDaGFyID0gbnVsbFxuXG4gICAgLy8gRmluZCB0aGUgbGFzdCBmaWxsZWQgcGxhY2Vob2xkZXIgcG9zaXRpb24gYW5kIHN1YnN0cmluZyBmcm9tIHRoZXJlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25mb3JtZWRWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBsYWNlaG9sZGVyW2ldID09PSBwbGFjZWhvbGRlckNoYXIpIHtcbiAgICAgICAgaW5kZXhPZkxhc3RGaWxsZWRQbGFjZWhvbGRlckNoYXIgPSBpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluZGV4T2ZMYXN0RmlsbGVkUGxhY2Vob2xkZXJDaGFyICE9PSBudWxsKSB7XG4gICAgICAvLyBXZSBzdWJzdHJpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIHVudGlsIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgbGFzdCBmaWxsZWQgcGxhY2Vob2xkZXIgY2hhci5cbiAgICAgIGNvbmZvcm1lZFZhbHVlID0gY29uZm9ybWVkVmFsdWUuc3Vic3RyKDAsIGluZGV4T2ZMYXN0RmlsbGVkUGxhY2Vob2xkZXJDaGFyICsgMSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgd2UgY291bGRuJ3QgZmluZCBgaW5kZXhPZkxhc3RGaWxsZWRQbGFjZWhvbGRlckNoYXJgIHRoYXQgbWVhbnMgdGhlIHVzZXIgZGVsZXRlZFxuICAgICAgLy8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgbWFzay4gU28gd2UgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgIGNvbmZvcm1lZFZhbHVlID0gZW1wdHlTdHJpbmdcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBjb25mb3JtZWRWYWx1ZSwgbWV0YTogeyBzb21lQ2hhcnNSZWplY3RlZCB9IH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydE1hc2tUb1BsYWNlaG9sZGVyKG1hc2sgPSBlbXB0eUFycmF5LCBwbGFjZWhvbGRlckNoYXIgPSBkZWZhdWx0UGxhY2Vob2xkZXJDaGFyKSB7XG4gIGlmICghaXNBcnJheShtYXNrKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdUZXh0LW1hc2s6Y29udmVydE1hc2tUb1BsYWNlaG9sZGVyOyBUaGUgbWFzayBwcm9wZXJ0eSBtdXN0IGJlIGFuIGFycmF5LidcbiAgICApXG4gIH1cblxuICBpZiAobWFzay5pbmRleE9mKHBsYWNlaG9sZGVyQ2hhcikgIT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1BsYWNlaG9sZGVyIGNoYXJhY3RlciBtdXN0IG5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIG1hc2suIFBsZWFzZSBzcGVjaWZ5IGEgY2hhcmFjdGVyICcgK1xuICAgICAgJ3RoYXQgaXMgbm90IHByZXNlbnQgaW4geW91ciBtYXNrIGFzIHlvdXIgcGxhY2Vob2xkZXIgY2hhcmFjdGVyLlxcblxcbicgK1xuICAgICAgYFRoZSBwbGFjZWhvbGRlciBjaGFyYWN0ZXIgdGhhdCB3YXMgcmVjZWl2ZWQgaXM6ICR7SlNPTi5zdHJpbmdpZnkocGxhY2Vob2xkZXJDaGFyKX1cXG5cXG5gICtcbiAgICAgIGBUaGUgbWFzayB0aGF0IHdhcyByZWNlaXZlZCBpczogJHtKU09OLnN0cmluZ2lmeShtYXNrKX1gXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIG1hc2subWFwKChjaGFyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gKGNoYXIgaW5zdGFuY2VvZiBSZWdFeHApID8gcGxhY2Vob2xkZXJDaGFyIDogY2hhclxuICB9KS5qb2luKCcnKVxufVxuXG4vKipcbiAqIER1ZSB0byBhIGJ1ZyBvbiB0ZXh0bWFzaywgdGhlIHJlcXVpcmVEZWNpbWFsIGl0cyBub3Qgd29ya2luZywgc28gdGhpcyBmdW5jdGlvbiBzb2x2ZXMgdGhpcyBwcm9ibGVtXG4gKiBAcGFyYW0gbWFza1R5cGUgXG4gKiBAcGFyYW0gbnVtYmVyVmFsdWUgXG4gKiBAcGFyYW0gZGVjaW1hbHNGb3JtYXQgXG4gKiBAcmV0dXJucyBcbiAqL1xuZnVuY3Rpb24gZm9ybWF0TnVtYmVyKG1hc2tUeXBlOiBhbnksIG51bWJlclZhbHVlOiBhbnksIGRlY2ltYWxzRm9ybWF0OiBudW1iZXIgPSAyKSB7XG4gIGlmICghbnVtYmVyVmFsdWUgJiYgbnVtYmVyVmFsdWUgIT09IDApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoIW51bWJlclZhbHVlLnNwbGl0KSB7XG4gICAgbnVtYmVyVmFsdWUgKz0gJyc7XG4gICAgbnVtYmVyVmFsdWUgPSBudW1iZXJWYWx1ZS5yZXBsYWNlKCcuJywgJywnKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHMgPSBudW1iZXJWYWx1ZS5zcGxpdCgnLCcpO1xuXG4gIGlmICghbWFza1R5cGUudGV4dE1hc2sgfHwgdHlwZW9mIG1hc2tUeXBlLnRleHRNYXNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgbWFzayA9IG1hc2tUeXBlLnRleHRNYXNrKHZhbHNbMF0pO1xuXG4gIGxldCBkZWNpbWFscyA9ICcnXG4gIGlmIChkZWNpbWFsc0Zvcm1hdCA9PSB1bmRlZmluZWQpIHtcbiAgICBkZWNpbWFscyA9IHZhbHMubGVuZ3RoID4gMSA/ICcsJyArIHZhbHNbMV0gOiAnJztcbiAgfSBlbHNlIHtcbiAgICBkZWNpbWFscyA9IHZhbHMubGVuZ3RoID4gMSA/ICh2YWxzWzFdIDwgMTAgPyB2YWxzWzFdLnRvU3RyaW5nKCkgKyAnMCcgOiB2YWxzWzFdLnRvU3RyaW5nKCkpIDogJzAwJztcbiAgICBpZiAoZGVjaW1hbHMubGVuZ3RoID4gZGVjaW1hbHNGb3JtYXQpIHtcbiAgICAgIGRlY2ltYWxzID0gZGVjaW1hbHMuc3Vic3RyaW5nKDAsIGRlY2ltYWxzRm9ybWF0KTtcbiAgICB9XG4gIH1cblxuICBsZXQgY29uZm9ybWVkVmFsdWUgPSBjb25mb3JtVG9NYXNrKFxuICAgIG51bWJlclZhbHVlLFxuICAgIG1hc2ssXG4gICAgeyBndWlkZTogZmFsc2UgfVxuICApLmNvbmZvcm1lZFZhbHVlXG5cblxuICBsZXQgc3VmZml4ID0gJydcbiAgaWYgKGNvbmZvcm1lZFZhbHVlLmluZGV4T2YoJyUnKSA+PSAwKSB7XG4gICAgY29uZm9ybWVkVmFsdWUgPSBjb25mb3JtZWRWYWx1ZS5yZXBsYWNlKCclJywgJycpXG4gICAgc3VmZml4ID0gJyUnXG4gIH1cbiAgcmV0dXJuIGNvbmZvcm1lZFZhbHVlICsgKGRlY2ltYWxzRm9ybWF0ID4gMCA/ICcsJyArIGRlY2ltYWxzIDogJycpICsgc3VmZml4O1xufSJdfQ==