@posiwise/common-services 0.1.77 → 0.1.78

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.
@@ -132,8 +132,8 @@ export class PermissionService {
132
132
  }
133
133
  expr = this.handleNonBooleanPermissions(permission, expr, productKey, permission_key, productSlug);
134
134
  // Now expr is made of true/false values with &&, ||, ()
135
- // Safe evaluation of boolean expressions without using eval()
136
- return this.evaluateBooleanExpression(expr);
135
+ // eslint-disable-next-line no-eval
136
+ return eval(expr); // NOSONAR
137
137
  }
138
138
  handleNonBooleanPermissions(permission, expr, productKey, permission_key, productSlug) {
139
139
  if (typeof permission !== 'boolean') {
@@ -240,161 +240,6 @@ export class PermissionService {
240
240
  getCurrentProduct() {
241
241
  return JSON.parse(localStorage.getItem('product'));
242
242
  }
243
- /**
244
- * Safely evaluates boolean expressions without using eval()
245
- * Supports: true, false, &&, ||, (, )
246
- * @param expr - Boolean expression string like "true && false || (true && false)"
247
- * @returns boolean result
248
- */
249
- evaluateBooleanExpression(expr) {
250
- if (!expr || typeof expr !== 'string') {
251
- return false;
252
- }
253
- try {
254
- // Clean up the expression - remove extra spaces and normalize
255
- const cleanExpr = expr.trim().replace(/\s+/g, ' ');
256
- // Simple tokenizer for boolean expressions
257
- const tokens = this.tokenizeBooleanExpression(cleanExpr);
258
- // Parse and evaluate the expression
259
- return this.parseBooleanExpression(tokens);
260
- }
261
- catch (error) {
262
- console.warn('Error evaluating boolean expression:', expr, error);
263
- return false;
264
- }
265
- }
266
- /**
267
- * Tokenizes a boolean expression string
268
- */
269
- tokenizeBooleanExpression(expr) {
270
- const tokens = [];
271
- let i = 0;
272
- while (i < expr.length) {
273
- const char = expr[i];
274
- if (this.isWhitespace(char)) {
275
- i++;
276
- }
277
- else if (this.isParenthesis(char)) {
278
- tokens.push(char);
279
- i++;
280
- }
281
- else if (this.isDoubleOperator(expr, i, '&')) {
282
- tokens.push('&&');
283
- i += 2;
284
- }
285
- else if (this.isDoubleOperator(expr, i, '|')) {
286
- tokens.push('||');
287
- i += 2;
288
- }
289
- else {
290
- const token = this.collectToken(expr, i);
291
- if (token.value) {
292
- tokens.push(token.value);
293
- }
294
- i = token.nextIndex;
295
- }
296
- }
297
- return tokens;
298
- }
299
- isWhitespace(char) {
300
- return char === ' ';
301
- }
302
- isParenthesis(char) {
303
- return char === '(' || char === ')';
304
- }
305
- isDoubleOperator(expr, index, operator) {
306
- return expr[index] === operator && expr[index + 1] === operator;
307
- }
308
- collectToken(expr, startIndex) {
309
- let current = '';
310
- let i = startIndex;
311
- while (i < expr.length && ![' ', '(', ')', '&', '|'].includes(expr[i])) {
312
- current += expr[i];
313
- i++;
314
- }
315
- return { value: current, nextIndex: i };
316
- }
317
- /**
318
- * Parses and evaluates boolean expression tokens
319
- */
320
- parseBooleanExpression(tokens) {
321
- // Handle simple cases first
322
- if (tokens.length === 1) {
323
- return tokens[0] === 'true';
324
- }
325
- // Convert to postfix notation and evaluate
326
- const postfix = this.infixToPostfix(tokens);
327
- return this.evaluatePostfix(postfix);
328
- }
329
- /**
330
- * Converts infix notation to postfix (Reverse Polish Notation)
331
- */
332
- infixToPostfix(tokens) {
333
- const output = [];
334
- const operators = [];
335
- const precedence = { '||': 1, '&&': 2 };
336
- for (const token of tokens) {
337
- if (token === 'true' || token === 'false') {
338
- output.push(token);
339
- }
340
- else if (token === '(') {
341
- operators.push(token);
342
- }
343
- else if (token === ')') {
344
- while (operators.length > 0 && operators[operators.length - 1] !== '(') {
345
- const op = operators.pop();
346
- if (op)
347
- output.push(op);
348
- }
349
- operators.pop(); // Remove '('
350
- }
351
- else if (token === '&&' || token === '||') {
352
- while (operators.length > 0 &&
353
- operators[operators.length - 1] !== '(' &&
354
- precedence[operators[operators.length - 1]] >= precedence[token]) {
355
- const op = operators.pop();
356
- if (op)
357
- output.push(op);
358
- }
359
- operators.push(token);
360
- }
361
- }
362
- while (operators.length > 0) {
363
- const op = operators.pop();
364
- if (op)
365
- output.push(op);
366
- }
367
- return output;
368
- }
369
- /**
370
- * Evaluates postfix boolean expression
371
- */
372
- evaluatePostfix(postfix) {
373
- const stack = [];
374
- for (const token of postfix) {
375
- if (token === 'true') {
376
- stack.push(true);
377
- }
378
- else if (token === 'false') {
379
- stack.push(false);
380
- }
381
- else if (token === '&&') {
382
- const b = stack.pop();
383
- const a = stack.pop();
384
- if (a !== undefined && b !== undefined) {
385
- stack.push(a && b);
386
- }
387
- }
388
- else if (token === '||') {
389
- const b = stack.pop();
390
- const a = stack.pop();
391
- if (a !== undefined && b !== undefined) {
392
- stack.push(a || b);
393
- }
394
- }
395
- }
396
- return stack[0] || false;
397
- }
398
243
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PermissionService, deps: [{ token: i1.MainApiHttpService }], target: i0.ɵɵFactoryTarget.Injectable }); }
399
244
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PermissionService, providedIn: 'root' }); }
400
245
  }
@@ -404,4 +249,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
404
249
  providedIn: 'root'
405
250
  }]
406
251
  }], ctorParameters: () => [{ type: i1.MainApiHttpService }] });
407
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24tc2VydmljZXMvc3JjL2xpYi9wZXJtaXNzaW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLEVBQVEsTUFBTSw0QkFBNEIsQ0FBQztBQUU5RixPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFFbkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7OztBQUs3RCxNQUFNLE9BQU8saUJBQWlCO0lBUzFCLFlBQTZCLEdBQXVCO1FBQXZCLFFBQUcsR0FBSCxHQUFHLENBQW9CO1FBRnBELFNBQUksR0FBUyxJQUFJLENBQUM7SUFFcUMsQ0FBQztJQUV4RCxzQkFBc0IsQ0FBQyxZQUFZO1FBQy9CLGlCQUFpQixDQUFDLG9CQUFvQixHQUFHLFlBQVksQ0FBQztJQUMxRCxDQUFDO0lBRUQsU0FBUyxDQUNMLGNBQXNCLEVBQ3RCLFVBQVUsR0FBRyxJQUFJLEVBQ2pCLGNBQWMsR0FBRyxJQUFJLEVBQ3JCLFdBQVcsR0FBRyxJQUFJO1FBRWxCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztZQUV0QixzQ0FBc0M7WUFDdEMseUJBQXlCO1lBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFFRCxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNqQixjQUFjLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztZ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LEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNyQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDdkIsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQzdCLENBQUM7K0dBamVRLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmQsTUFBTTs7NEZBRVQsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQURNSU5fU1VCX01FTlVfV0hJVEVMSVNULCBQRVJNSVNTSU9OX05BTUVTLCBVc2VyIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi11dGlsaXRpZXMnO1xuXG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9jbG9uZURlZXAnO1xuaW1wb3J0IHBpY2tCeSBmcm9tICdsb2Rhc2gvcGlja0J5JztcblxuaW1wb3J0IHsgTWFpbkFwaUh0dHBTZXJ2aWNlIH0gZnJvbSAnLi9tYWluLWFwaS1odHRwLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25TZXJ2aWNlIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0YXRpYyBzZWxlY3RlZFByb2R1Y3Q6IGFueTsgLy8gTk9TT05BUlxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgc2VsZWN0ZWRTdWJzY3JpcHRpb246IGFueTsgLy8gTk9TT05BUlxuXG4gICAgdXNlcjogVXNlciA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGFwaTogTWFpbkFwaUh0dHBTZXJ2aWNlKSB7fVxuXG4gICAgc2V0Q3VycmVudFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgUGVybWlzc2lvblNlcnZpY2Uuc2VsZWN0ZWRTdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb247XG4gICAgfVxuXG4gICAgaXNHcmFudGVkKFxuICAgICAgICBwZXJtaXNzaW9uTmFtZTogc3RyaW5nLFxuICAgICAgICBwcm9kdWN0S2V5ID0gbnVsbCxcbiAgICAgICAgcGVybWlzc2lvbl9rZXkgPSBudWxsLFxuICAgICAgICBwcm9kdWN0U2x1ZyA9IG51bGxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudXNlcikge1xuICAgICAgICAgICAgY29uc3QgeyB1c2VyIH0gPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBBZG1pbiBoYXZlIGFjY2VzcyB0byBhbGwgdGhlIG1lbnVzLlxuICAgICAgICAgICAgLy8gRS5nLiwgUGFnZXMuU3VwZXJBZG1pblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTdXBlckFkbWluKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBlcm1pc3Npb25OYW1lKSB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbk5hbWUgPSB0aGlzLmdldEZvcm1hdHRlZFBlcm1pc3Npb25OYW1lKHBlcm1pc3Npb25OYW1lLCBwcm9kdWN0U2x1Zyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJldHVybmluZyB0cnVlIGlmIHVzZXIgaGFzIGEgZ2l2ZW4gcGVybWlzc2lvblxuICAgICAgICAgICAgLy8gRS5nLiwgUGFnZXMuUm9sZS5DbG91ZE9saXZlLlNhbGVzTWFuYWdlclxuICAgICAgICAgICAgLy8gb3IgUGFnZXMuQmV0YSBvciBQYWdlcy5BbHBoYVxuXG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbk5hbWU/LmluY2x1ZGVzKCd8fCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwZXJtaXNzaW9uTmFtZS5zcGxpdCgnfHwnKS5tYXAocCA9PiBwLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzQW55R3JhbnRlZFBlcm1pc3Npb24ocGFydHMsIHVzZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlclsnYXV0aCddPy5bJ2dyYW50ZWQnXVtwZXJtaXNzaW9uTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQZXJtaXNzaW9ucyA9IHRoaXMuaGFuZGxlUHJvZHVjdEtleShcbiAgICAgICAgICAgICAgICBwcm9kdWN0S2V5LFxuICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbl9rZXksXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbk5hbWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChmaWx0ZXJlZFBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkUGVybWlzc2lvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vIHZhbGlkIHBlcm1pc3Npb24gd2FzIGRldGVjdGVkIGZvciB0aGlzIHVzZXJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2VyIG5vdCBsb2dnZWQtaW5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzQW55R3JhbnRlZFBlcm1pc3Npb24ocGFydHM6IHN0cmluZ1tdLCB1c2VyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBwYXJ0cy5zb21lKHBhcnQgPT4gdXNlclsnYXV0aCddPy5bJ2dyYW50ZWQnXVtwYXJ0XSk7XG4gICAgfVxuXG4gICAgaGFuZGxlUHJvZHVjdEtleShwcm9kdWN0S2V5LCB1c2VyLCBwZXJtaXNzaW9uX2tleSwgcGVybWlzc2lvbk5hbWUpIHtcbiAgICAgICAgaWYgKHByb2R1Y3RLZXkpIHtcbiAgICAgICAgICAgIC8vIGZpbHRlcnMgdGhlIHBlcm1pc3Npb24gb25seSBmb3IgdGhlIHNlbGVjdGVkIHByb2R1Y3QuXG4gICAgICAgICAgICBsZXQgZmlsdGVyZWRQZXJtaXNzaW9ucyA9IHBpY2tCeShjbG9uZURlZXAodXNlclsnYXV0aCddWydncmFudGVkJ10pLCAoX3ZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5LmluY2x1ZGVzKHByb2R1Y3RLZXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBhZGQgUGFnZXMuUHJvZHVjdC57cGVybWlzc2lvbl9rZXl9XG4gICAgICAgICAgICBmaWx0ZXJlZFBlcm1pc3Npb25zID0ge1xuICAgICAgICAgICAgICAgIC4uLnsgW2BQYWdlcy5Qcm9kdWN0LiR7cGVybWlzc2lvbl9rZXl9YF06IHRydWUgfSxcbiAgICAgICAgICAgICAgICAuLi5maWx0ZXJlZFBlcm1pc3Npb25zXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBFLmcuLCBQYWdlcy5Qcm9kdWN0LkNsb3VkT2xpdmUuQ2xvdWRPbGl2ZV9Nc3BLZXlcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFBlcm1pc3Npb25zW3Blcm1pc3Npb25OYW1lXSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Rm9ybWF0dGVkUGVybWlzc2lvbk5hbWUocGVybWlzc2lvbk5hbWU6IHN0cmluZywgcHJvZHVjdFNsdWc6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3QgPSBQZXJtaXNzaW9uU2VydmljZT8uc2VsZWN0ZWRQcm9kdWN0ID8/IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHNlbGVjdGVkUHJvZHVjdD8uc3Vic2NyaXB0aW9uX3NsdWc7XG5cbiAgICAgICAgbGV0IHNsdWdUb0NoZWNrOiBzdHJpbmc7XG4gICAgICAgIGlmICghcHJvZHVjdFNsdWcpIHtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uTmFtZS5pbmNsdWRlcygnUGFnZXMuUHJvZHVjdC4nKSkge1xuICAgICAgICAgICAgICAgIHNsdWdUb0NoZWNrID0gYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS5gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbk5hbWUuaW5jbHVkZXMoJ1BhZ2VzLlJvbGUuJykpIHtcbiAgICAgICAgICAgICAgICBzbHVnVG9DaGVjayA9IGBQYWdlcy5Sb2xlLiR7c3Vic2NyaXB0aW9uU2x1Z30uYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNsdWdUb0NoZWNrID0gcHJvZHVjdFNsdWc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBlcm1pc3Npb25OYW1lLmluY2x1ZGVzKHNsdWdUb0NoZWNrKSAmJiBwZXJtaXNzaW9uTmFtZS5pbmNsdWRlcygnUGFnZXMuUHJvZHVjdC4nKSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbk5hbWUgPSBwZXJtaXNzaW9uTmFtZS5yZXBsYWNlKCdQYWdlcy5Qcm9kdWN0LicsIHNsdWdUb0NoZWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwZXJtaXNzaW9uTmFtZS5pbmNsdWRlcygnUGFnZXMuUm9sZS4nKSAmJiAhcGVybWlzc2lvbk5hbWUuaW5jbHVkZXMoc2x1Z1RvQ2hlY2spKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9uTmFtZSA9IHBlcm1pc3Npb25OYW1lLnJlcGxhY2UoJ1BhZ2VzLlJvbGUuJywgc2x1Z1RvQ2hlY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25OYW1lO1xuICAgIH1cblxuICAgIGdldFBlcm1pc3Npb25UcmVlRGF0YUJ5Um9sZShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gW107XG4gICAgICAgIGRhdGEuYWxsLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGVsZW1lbnQ7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCwgLy8gcGVybWlzc2lvbklkOiBVc2VkIHRvIHVwZGF0ZSB0aGUgcGVybWlzc2lvbnMgb24gY2hhbmdlXG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZTogbmFtZS5pbmNsdWRlcygnLicpID8gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sYXN0SW5kZXhPZignLicpKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogZWxlbWVudC5uYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgZ3JhbnRlZFBlcm1pc3Npb25OYW1lczogT2JqZWN0LmtleXMoZGF0YS5ncmFudGVkKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGV2YWx1YXRlUGVybWlzc2lvbnMoXG4gICAgICAgIHBlcm1pc3Npb246IHN0cmluZyxcbiAgICAgICAgcHJvZHVjdEtleTogc3RyaW5nID0gbnVsbCxcbiAgICAgICAgcGVybWlzc2lvbl9rZXk6IHN0cmluZyA9IG51bGwsXG4gICAgICAgIHByb2R1Y3RTbHVnOiBzdHJpbmcgPSBudWxsXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghcGVybWlzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGV4cHIgPSAnJztcblxuICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUEVSTUlTU0lPTl9OQU1FUy5TdXBlckFkbWluKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1N1cGVyQWRtaW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUEVSTUlTU0lPTl9OQU1FUy5TdWJzY3JpcHRpb25BZG1pbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uQWRtaW4oKSB8fCB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb24gPT09IFBFUk1JU1NJT05fTkFNRVMuU3Vic2NyaXB0aW9uT3duZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb24gPT09IFBFUk1JU1NJT05fTkFNRVMuU3Vic2NyaXB0aW9uU3VwZXJBZG1pbikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyQWRtaW4oKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uU3VwZXJPd25lcigpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5pc1N1cGVyQWRtaW4oKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUEVSTUlTU0lPTl9OQU1FUy5TdWJzY3JpcHRpb25TdXBlck93bmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1VzZXJTdWJzY3JpcHRpb25TdXBlck93bmVyKCkgfHwgdGhpcy5pc1N1cGVyQWRtaW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgcGVybWlzc2lvbiA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIEFETUlOX1NVQl9NRU5VX1dISVRFTElTVC5zb21lKHYgPT4gcGVybWlzc2lvbi5pbmNsdWRlcyh2KSkgJiZcbiAgICAgICAgICAgICh0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyQWRtaW4oKSB8fCB0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyT3duZXIoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHIgPSB0aGlzLmhhbmRsZU5vbkJvb2xlYW5QZXJtaXNzaW9ucyhcbiAgICAgICAgICAgIHBlcm1pc3Npb24sXG4gICAgICAgICAgICBleHByLFxuICAgICAgICAgICAgcHJvZHVjdEtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25fa2V5LFxuICAgICAgICAgICAgcHJvZHVjdFNsdWdcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBOb3cgZXhwciBpcyBtYWRlIG9mIHRydWUvZmFsc2UgdmFsdWVzIHdpdGggJiYsIHx8LCAoKVxuICAgICAgICAvLyBTYWZlIGV2YWx1YXRpb24gb2YgYm9vbGVhbiBleHByZXNzaW9ucyB3aXRob3V0IHVzaW5nIGV2YWwoKVxuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZUJvb2xlYW5FeHByZXNzaW9uKGV4cHIpO1xuICAgIH1cblxuICAgIGhhbmRsZU5vbkJvb2xlYW5QZXJtaXNzaW9ucyhwZXJtaXNzaW9uLCBleHByLCBwcm9kdWN0S2V5LCBwZXJtaXNzaW9uX2tleSwgcHJvZHVjdFNsdWcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwZXJtaXNzaW9uICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb24uc3BsaXQoJyAnKS5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHgudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKFsnfHwnLCAnJiYnLCAnKCcsICcpJ10uaW5jbHVkZXMocmF3KSkge1xuICAgICAgICAgICAgICAgICAgICBleHByICs9IGAgJHtyYXd9IGA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV2YWx1YXRlZDogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1cGVyQWRtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuaXNTdXBlckFkbWluKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvbkFkbWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uQWRtaW4oKSB8fCB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvbk93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgPSB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvblN1cGVyQWRtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1VzZXJTdWJzY3JpcHRpb25TdXBlckFkbWluKCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyT3duZXIoKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdXBlckFkbWluKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvblN1cGVyT3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uU3VwZXJPd25lcigpIHx8IHRoaXMuaXNTdXBlckFkbWluKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZHVjdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGl0J3MgUGFnZXMuUHJvZHVjdCBvciBQYWdlcy5Sb2xlIHdpdGggcHJvZHVjdEtleVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkID0gdGhpcy5pc0dyYW50ZWQocmF3LCBwcm9kdWN0S2V5LCBwZXJtaXNzaW9uX2tleSwgcHJvZHVjdFNsdWcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkID0gdGhpcy5pc0dyYW50ZWQocmF3KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGV4cHIgKz0gYCAke2V2YWx1YXRlZH0gYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICBnZXRQZXJtaXNzaW9uQnlSb2xlKHJvbGVJZDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaS5nZXQoYC9hZG1pbi9yb2xlX3Blcm1pc3Npb25zLyR7cm9sZUlkfWApO1xuICAgIH1cblxuICAgIHNhdmVVc2VyUGVybWlzc2lvbihwYXlsb2FkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaS5wb3N0KGAvYWRtaW4vcm9sZV9wZXJtaXNzaW9uc2AsIHBheWxvYWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRldGVybWluZSB1c2VyIGlzIHN1cGVyX2FkbWluIHVzaW5nIHVzZXIuYXV0aC5ncmFudGVkWydQYWdlcy5TdXBlckFkbWluJ11cbiAgICAgKi9cbiAgICBpc1N1cGVyQWRtaW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMudXNlci5hdXRoLmdyYW50ZWRbJ1BhZ2VzLlN1cGVyQWRtaW4nXSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQW55IFByb2R1Y3QgQWRtaW4gcmVnYXJkbGVzcyBvZiB0aGUgcHJvZHVjdCBiZWluZyBtYXN0ZXIgcHJvZHVjdCBvciBub3QuXG4gICAgICovXG4gICAgcHVibGljIGlzVXNlclN1YnNjcmlwdGlvbk93bmVyKHByb2R1Y3Q/KTogYm9vbGVhbiB7XG4gICAgICAgIHByb2R1Y3QgPz89IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHByb2R1Y3Q/LnN1YnNjcmlwdGlvbl9zbHVnO1xuICAgICAgICByZXR1cm4gISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS4ke3Byb2R1Y3Q/LnBlcm1pc3Npb25fa2V5fS4ke3Byb2R1Y3QuZmVhdHVyZV9rZXl9LlN1YnNjcmlwdGlvbk93bmVyYFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFueSBQcm9kdWN0IEFkbWluIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb2R1Y3QgYmVpbmcgbWFzdGVyIHByb2R1Y3Qgb3Igbm90LlxuICAgICAqICpyYmFjQWxsb3c9XCJTdWJzY3JpcHRpb25BZG1pblwiXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNVc2VyU3Vic2NyaXB0aW9uQWRtaW4ocHJvZHVjdD8pOiBib29sZWFuIHtcbiAgICAgICAgcHJvZHVjdCA/Pz0gdGhpcy5nZXRDdXJyZW50UHJvZHVjdCgpO1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25TbHVnID0gcHJvZHVjdD8uc3Vic2NyaXB0aW9uX3NsdWc7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhIXRoaXMudXNlci5hdXRoLmdyYW50ZWRbXG4gICAgICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS4ke3Byb2R1Y3Q/LnBlcm1pc3Npb25fa2V5fS4ke3Byb2R1Y3QuZmVhdHVyZV9rZXl9LlN1YnNjcmlwdGlvbkFkbWluYFxuICAgICAgICAgICAgXSB8fFxuICAgICAgICAgICAgISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgICAgIGBQYWdlcy5Qcm9kdWN0LiR7c3Vic2NyaXB0aW9uU2x1Z30uJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25Pd25lcmBcbiAgICAgICAgICAgIF1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbnkgUHJvZHVjdCBBZG1pbiBvZiB0aGUgcHJvZHVjdCBiZWluZyB0aGUgbWFzdGVyIHByb2R1Y3RcbiAgICAgKi9cbiAgICBpc1VzZXJTdWJzY3JpcHRpb25TdXBlckFkbWluKHByb2R1Y3Q/KTogYm9vbGVhbiB7XG4gICAgICAgIHByb2R1Y3QgPz89IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHByb2R1Y3Q/LnN1YnNjcmlwdGlvbl9zbHVnO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgICAgIGBQYWdlcy5Qcm9kdWN0LiR7c3Vic2NyaXB0aW9uU2x1Z30uJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25TdXBlckFkbWluYFxuICAgICAgICAgICAgXSB8fFxuICAgICAgICAgICAgISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgICAgIGBQYWdlcy5Qcm9kdWN0LiR7c3Vic2NyaXB0aW9uU2x1Z30uJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25TdXBlck93bmVyYFxuICAgICAgICAgICAgXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlzVXNlck1hc3RlclN1YnNjcmlwdGlvblN1cGVyQWRtaW4ocHJvZHVjdD8pOiBib29sZWFuIHtcbiAgICAgICAgcHJvZHVjdCA/Pz0gdGhpcy5nZXRDdXJyZW50UHJvZHVjdCgpO1xuICAgICAgICByZXR1cm4gISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25TdXBlckFkbWluYFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFueSBQcm9kdWN0IEFkbWluIG9mIHRoZSBwcm9kdWN0IGJlaW5nIHRoZSBtYXN0ZXIgcHJvZHVjdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1VzZXJTdWJzY3JpcHRpb25TdXBlck93bmVyKHByb2R1Y3Q/KTogYm9vbGVhbiB7XG4gICAgICAgIHByb2R1Y3QgPz89IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHByb2R1Y3Q/LnN1YnNjcmlwdGlvbl9zbHVnO1xuICAgICAgICByZXR1cm4gISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS4ke3Byb2R1Y3Q/LnBlcm1pc3Npb25fa2V5fS4ke3Byb2R1Y3QuZmVhdHVyZV9rZXl9LlN1YnNjcmlwdGlvblN1cGVyT3duZXJgXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudFByb2R1Y3QocHJvZHVjdCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICdwcm9kdWN0JyxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBpZDogcHJvZHVjdC5pZCxcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uX2tleTogcHJvZHVjdD8ucGVybWlzc2lvbl9rZXksXG4gICAgICAgICAgICAgICAgZmVhdHVyZV9rZXk6IHByb2R1Y3QuZmVhdHVyZV9rZXksXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHByb2R1Y3Quc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uX3NsdWc6IHByb2R1Y3Quc3Vic2NyaXB0aW9uX3NsdWdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRQcm9kdWN0KCkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncHJvZHVjdCcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYWZlbHkgZXZhbHVhdGVzIGJvb2xlYW4gZXhwcmVzc2lvbnMgd2l0aG91dCB1c2luZyBldmFsKClcbiAgICAgKiBTdXBwb3J0czogdHJ1ZSwgZmFsc2UsICYmLCB8fCwgKCwgKVxuICAgICAqIEBwYXJhbSBleHByIC0gQm9vbGVhbiBleHByZXNzaW9uIHN0cmluZyBsaWtlIFwidHJ1ZSAmJiBmYWxzZSB8fCAodHJ1ZSAmJiBmYWxzZSlcIlxuICAgICAqIEByZXR1cm5zIGJvb2xlYW4gcmVzdWx0XG4gICAgICovXG4gICAgcHJpdmF0ZSBldmFsdWF0ZUJvb2xlYW5FeHByZXNzaW9uKGV4cHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWV4cHIgfHwgdHlwZW9mIGV4cHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGV4cHJlc3Npb24gLSByZW1vdmUgZXh0cmEgc3BhY2VzIGFuZCBub3JtYWxpemVcbiAgICAgICAgICAgIGNvbnN0IGNsZWFuRXhwciA9IGV4cHIudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcblxuICAgICAgICAgICAgLy8gU2ltcGxlIHRva2VuaXplciBmb3IgYm9vbGVhbiBleHByZXNzaW9uc1xuICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gdGhpcy50b2tlbml6ZUJvb2xlYW5FeHByZXNzaW9uKGNsZWFuRXhwcik7XG5cbiAgICAgICAgICAgIC8vIFBhcnNlIGFuZCBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VCb29sZWFuRXhwcmVzc2lvbih0b2tlbnMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBldmFsdWF0aW5nIGJvb2xlYW4gZXhwcmVzc2lvbjonLCBleHByLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2tlbml6ZXMgYSBib29sZWFuIGV4cHJlc3Npb24gc3RyaW5nXG4gICAgICovXG4gICAgcHJpdmF0ZSB0b2tlbml6ZUJvb2xlYW5FeHByZXNzaW9uKGV4cHI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBleHByLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IGV4cHJbaV07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzV2hpdGVzcGFjZShjaGFyKSkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1BhcmVudGhlc2lzKGNoYXIpKSB7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goY2hhcik7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRG91YmxlT3BlcmF0b3IoZXhwciwgaSwgJyYnKSkge1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKCcmJicpO1xuICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0RvdWJsZU9wZXJhdG9yKGV4cHIsIGksICd8JykpIHtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCgnfHwnKTtcbiAgICAgICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jb2xsZWN0VG9rZW4oZXhwciwgaSk7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSA9IHRva2VuLm5leHRJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1doaXRlc3BhY2UoY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjaGFyID09PSAnICc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1BhcmVudGhlc2lzKGNoYXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY2hhciA9PT0gJygnIHx8IGNoYXIgPT09ICcpJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRG91YmxlT3BlcmF0b3IoZXhwcjogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBvcGVyYXRvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBleHByW2luZGV4XSA9PT0gb3BlcmF0b3IgJiYgZXhwcltpbmRleCArIDFdID09PSBvcGVyYXRvcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbGxlY3RUb2tlbihleHByOiBzdHJpbmcsIHN0YXJ0SW5kZXg6IG51bWJlcik6IHsgdmFsdWU6IHN0cmluZzsgbmV4dEluZGV4OiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gJyc7XG4gICAgICAgIGxldCBpID0gc3RhcnRJbmRleDtcblxuICAgICAgICB3aGlsZSAoaSA8IGV4cHIubGVuZ3RoICYmICFbJyAnLCAnKCcsICcpJywgJyYnLCAnfCddLmluY2x1ZGVzKGV4cHJbaV0pKSB7XG4gICAgICAgICAgICBjdXJyZW50ICs9IGV4cHJbaV07XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB2YWx1ZTogY3VycmVudCwgbmV4dEluZGV4OiBpIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIGFuZCBldmFsdWF0ZXMgYm9vbGVhbiBleHByZXNzaW9uIHRva2Vuc1xuICAgICAqL1xuICAgIHByaXZhdGUgcGFyc2VCb29sZWFuRXhwcmVzc2lvbih0b2tlbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIEhhbmRsZSBzaW1wbGUgY2FzZXMgZmlyc3RcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbnNbMF0gPT09ICd0cnVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgdG8gcG9zdGZpeCBub3RhdGlvbiBhbmQgZXZhbHVhdGVcbiAgICAgICAgY29uc3QgcG9zdGZpeCA9IHRoaXMuaW5maXhUb1Bvc3RmaXgodG9rZW5zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVQb3N0Zml4KHBvc3RmaXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGluZml4IG5vdGF0aW9uIHRvIHBvc3RmaXggKFJldmVyc2UgUG9saXNoIE5vdGF0aW9uKVxuICAgICAqL1xuICAgIHByaXZhdGUgaW5maXhUb1Bvc3RmaXgodG9rZW5zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCBvcGVyYXRvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IHByZWNlZGVuY2UgPSB7ICd8fCc6IDEsICcmJic6IDIgfTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSAndHJ1ZScgfHwgdG9rZW4gPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnKCcpIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRvcnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnKScpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAob3BlcmF0b3JzLmxlbmd0aCA+IDAgJiYgb3BlcmF0b3JzW29wZXJhdG9ycy5sZW5ndGggLSAxXSAhPT0gJygnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wID0gb3BlcmF0b3JzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3ApIG91dHB1dC5wdXNoKG9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3BlcmF0b3JzLnBvcCgpOyAvLyBSZW1vdmUgJygnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnJiYnIHx8IHRva2VuID09PSAnfHwnKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcnNbb3BlcmF0b3JzLmxlbmd0aCAtIDFdICE9PSAnKCcgJiZcbiAgICAgICAgICAgICAgICAgICAgcHJlY2VkZW5jZVtvcGVyYXRvcnNbb3BlcmF0b3JzLmxlbmd0aCAtIDFdXSA+PSBwcmVjZWRlbmNlW3Rva2VuXVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcCA9IG9wZXJhdG9ycy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wKSBvdXRwdXQucHVzaChvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wZXJhdG9ycy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChvcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgb3AgPSBvcGVyYXRvcnMucG9wKCk7XG4gICAgICAgICAgICBpZiAob3ApIG91dHB1dC5wdXNoKG9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZhbHVhdGVzIHBvc3RmaXggYm9vbGVhbiBleHByZXNzaW9uXG4gICAgICovXG4gICAgcHJpdmF0ZSBldmFsdWF0ZVBvc3RmaXgocG9zdGZpeDogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc3RhY2s6IGJvb2xlYW5bXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcG9zdGZpeCkge1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJyYmJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgaWYgKGEgIT09IHVuZGVmaW5lZCAmJiBiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhICYmIGIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd8fCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIGlmIChhICE9PSB1bmRlZmluZWQgJiYgYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8fCBiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RhY2tbMF0gfHwgZmFsc2U7XG4gICAgfVxufVxuIl19
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24tc2VydmljZXMvc3JjL2xpYi9wZXJtaXNzaW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLEVBQVEsTUFBTSw0QkFBNEIsQ0FBQztBQUU5RixPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFFbkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7OztBQUs3RCxNQUFNLE9BQU8saUJBQWlCO0lBUzFCLFlBQTZCLEdBQXVCO1FBQXZCLFFBQUcsR0FBSCxHQUFHLENBQW9CO1FBRnBELFNBQUksR0FBUyxJQUFJLENBQUM7SUFFcUMsQ0FBQztJQUV4RCxzQkFBc0IsQ0FBQyxZQUFZO1FBQy9CLGlCQUFpQixDQUFDLG9CQUFvQixHQUFHLFlBQVksQ0FBQztJQUMxRCxDQUFDO0lBRUQsU0FBUyxDQUNMLGNBQXNCLEVBQ3RCLFVBQVUsR0FBRyxJQUFJLEVBQ2pCLGNBQWMsR0FBRyxJQUFJLEVBQ3JCLFdBQVcsR0FBRyxJQUFJO1FBRWxCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztZQUV0QixzQ0FBc0M7WUFDdEMseUJBQXlCO1lBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUM7WUFFRCxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNqQixjQUFjLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztZ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QUFXO1lBQ2hDLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztZQUN0QyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCO1NBQy9DLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVNLGlCQUFpQjtRQUNwQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7K0dBM1RRLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmQsTUFBTTs7NEZBRVQsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQURNSU5fU1VCX01FTlVfV0hJVEVMSVNULCBQRVJNSVNTSU9OX05BTUVTLCBVc2VyIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi11dGlsaXRpZXMnO1xuXG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9jbG9uZURlZXAnO1xuaW1wb3J0IHBpY2tCeSBmcm9tICdsb2Rhc2gvcGlja0J5JztcblxuaW1wb3J0IHsgTWFpbkFwaUh0dHBTZXJ2aWNlIH0gZnJvbSAnLi9tYWluLWFwaS1odHRwLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25TZXJ2aWNlIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0YXRpYyBzZWxlY3RlZFByb2R1Y3Q6IGFueTsgLy8gTk9TT05BUlxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgc2VsZWN0ZWRTdWJzY3JpcHRpb246IGFueTsgLy8gTk9TT05BUlxuXG4gICAgdXNlcjogVXNlciA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGFwaTogTWFpbkFwaUh0dHBTZXJ2aWNlKSB7fVxuXG4gICAgc2V0Q3VycmVudFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgUGVybWlzc2lvblNlcnZpY2Uuc2VsZWN0ZWRTdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb247XG4gICAgfVxuXG4gICAgaXNHcmFudGVkKFxuICAgICAgICBwZXJtaXNzaW9uTmFtZTogc3RyaW5nLFxuICAgICAgICBwcm9kdWN0S2V5ID0gbnVsbCxcbiAgICAgICAgcGVybWlzc2lvbl9rZXkgPSBudWxsLFxuICAgICAgICBwcm9kdWN0U2x1ZyA9IG51bGxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudXNlcikge1xuICAgICAgICAgICAgY29uc3QgeyB1c2VyIH0gPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBBZG1pbiBoYXZlIGFjY2VzcyB0byBhbGwgdGhlIG1lbnVzLlxuICAgICAgICAgICAgLy8gRS5nLiwgUGFnZXMuU3VwZXJBZG1pblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTdXBlckFkbWluKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBlcm1pc3Npb25OYW1lKSB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbk5hbWUgPSB0aGlzLmdldEZvcm1hdHRlZFBlcm1pc3Npb25OYW1lKHBlcm1pc3Npb25OYW1lLCBwcm9kdWN0U2x1Zyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJldHVybmluZyB0cnVlIGlmIHVzZXIgaGFzIGEgZ2l2ZW4gcGVybWlzc2lvblxuICAgICAgICAgICAgLy8gRS5nLiwgUGFnZXMuUm9sZS5DbG91ZE9saXZlLlNhbGVzTWFuYWdlclxuICAgICAgICAgICAgLy8gb3IgUGFnZXMuQmV0YSBvciBQYWdlcy5BbHBoYVxuXG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbk5hbWU/LmluY2x1ZGVzKCd8fCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwZXJtaXNzaW9uTmFtZS5zcGxpdCgnfHwnKS5tYXAocCA9PiBwLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzQW55R3JhbnRlZFBlcm1pc3Npb24ocGFydHMsIHVzZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlclsnYXV0aCddPy5bJ2dyYW50ZWQnXVtwZXJtaXNzaW9uTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQZXJtaXNzaW9ucyA9IHRoaXMuaGFuZGxlUHJvZHVjdEtleShcbiAgICAgICAgICAgICAgICBwcm9kdWN0S2V5LFxuICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbl9rZXksXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbk5hbWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChmaWx0ZXJlZFBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkUGVybWlzc2lvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vIHZhbGlkIHBlcm1pc3Npb24gd2FzIGRldGVjdGVkIGZvciB0aGlzIHVzZXJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2VyIG5vdCBsb2dnZWQtaW5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzQW55R3JhbnRlZFBlcm1pc3Npb24ocGFydHM6IHN0cmluZ1tdLCB1c2VyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBwYXJ0cy5zb21lKHBhcnQgPT4gdXNlclsnYXV0aCddPy5bJ2dyYW50ZWQnXVtwYXJ0XSk7XG4gICAgfVxuXG4gICAgaGFuZGxlUHJvZHVjdEtleShwcm9kdWN0S2V5LCB1c2VyLCBwZXJtaXNzaW9uX2tleSwgcGVybWlzc2lvbk5hbWUpIHtcbiAgICAgICAgaWYgKHByb2R1Y3RLZXkpIHtcbiAgICAgICAgICAgIC8vIGZpbHRlcnMgdGhlIHBlcm1pc3Npb24gb25seSBmb3IgdGhlIHNlbGVjdGVkIHByb2R1Y3QuXG4gICAgICAgICAgICBsZXQgZmlsdGVyZWRQZXJtaXNzaW9ucyA9IHBpY2tCeShjbG9uZURlZXAodXNlclsnYXV0aCddWydncmFudGVkJ10pLCAoX3ZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5LmluY2x1ZGVzKHByb2R1Y3RLZXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBhZGQgUGFnZXMuUHJvZHVjdC57cGVybWlzc2lvbl9rZXl9XG4gICAgICAgICAgICBmaWx0ZXJlZFBlcm1pc3Npb25zID0ge1xuICAgICAgICAgICAgICAgIC4uLnsgW2BQYWdlcy5Qcm9kdWN0LiR7cGVybWlzc2lvbl9rZXl9YF06IHRydWUgfSxcbiAgICAgICAgICAgICAgICAuLi5maWx0ZXJlZFBlcm1pc3Npb25zXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBFLmcuLCBQYWdlcy5Qcm9kdWN0LkNsb3VkT2xpdmUuQ2xvdWRPbGl2ZV9Nc3BLZXlcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFBlcm1pc3Npb25zW3Blcm1pc3Npb25OYW1lXSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Rm9ybWF0dGVkUGVybWlzc2lvbk5hbWUocGVybWlzc2lvbk5hbWU6IHN0cmluZywgcHJvZHVjdFNsdWc6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3QgPSBQZXJtaXNzaW9uU2VydmljZT8uc2VsZWN0ZWRQcm9kdWN0ID8/IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHNlbGVjdGVkUHJvZHVjdD8uc3Vic2NyaXB0aW9uX3NsdWc7XG5cbiAgICAgICAgbGV0IHNsdWdUb0NoZWNrOiBzdHJpbmc7XG4gICAgICAgIGlmICghcHJvZHVjdFNsdWcpIHtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uTmFtZS5pbmNsdWRlcygnUGFnZXMuUHJvZHVjdC4nKSkge1xuICAgICAgICAgICAgICAgIHNsdWdUb0NoZWNrID0gYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS5gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbk5hbWUuaW5jbHVkZXMoJ1BhZ2VzLlJvbGUuJykpIHtcbiAgICAgICAgICAgICAgICBzbHVnVG9DaGVjayA9IGBQYWdlcy5Sb2xlLiR7c3Vic2NyaXB0aW9uU2x1Z30uYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNsdWdUb0NoZWNrID0gcHJvZHVjdFNsdWc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBlcm1pc3Npb25OYW1lLmluY2x1ZGVzKHNsdWdUb0NoZWNrKSAmJiBwZXJtaXNzaW9uTmFtZS5pbmNsdWRlcygnUGFnZXMuUHJvZHVjdC4nKSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbk5hbWUgPSBwZXJtaXNzaW9uTmFtZS5yZXBsYWNlKCdQYWdlcy5Qcm9kdWN0LicsIHNsdWdUb0NoZWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwZXJtaXNzaW9uTmFtZS5pbmNsdWRlcygnUGFnZXMuUm9sZS4nKSAmJiAhcGVybWlzc2lvbk5hbWUuaW5jbHVkZXMoc2x1Z1RvQ2hlY2spKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9uTmFtZSA9IHBlcm1pc3Npb25OYW1lLnJlcGxhY2UoJ1BhZ2VzLlJvbGUuJywgc2x1Z1RvQ2hlY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25OYW1lO1xuICAgIH1cblxuICAgIGdldFBlcm1pc3Npb25UcmVlRGF0YUJ5Um9sZShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gW107XG4gICAgICAgIGRhdGEuYWxsLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGVsZW1lbnQ7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCwgLy8gcGVybWlzc2lvbklkOiBVc2VkIHRvIHVwZGF0ZSB0aGUgcGVybWlzc2lvbnMgb24gY2hhbmdlXG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZTogbmFtZS5pbmNsdWRlcygnLicpID8gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sYXN0SW5kZXhPZignLicpKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogZWxlbWVudC5uYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgZ3JhbnRlZFBlcm1pc3Npb25OYW1lczogT2JqZWN0LmtleXMoZGF0YS5ncmFudGVkKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGV2YWx1YXRlUGVybWlzc2lvbnMoXG4gICAgICAgIHBlcm1pc3Npb246IHN0cmluZyxcbiAgICAgICAgcHJvZHVjdEtleTogc3RyaW5nID0gbnVsbCxcbiAgICAgICAgcGVybWlzc2lvbl9rZXk6IHN0cmluZyA9IG51bGwsXG4gICAgICAgIHByb2R1Y3RTbHVnOiBzdHJpbmcgPSBudWxsXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghcGVybWlzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGV4cHIgPSAnJztcblxuICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUEVSTUlTU0lPTl9OQU1FUy5TdXBlckFkbWluKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1N1cGVyQWRtaW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUEVSTUlTU0lPTl9OQU1FUy5TdWJzY3JpcHRpb25BZG1pbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uQWRtaW4oKSB8fCB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb24gPT09IFBFUk1JU1NJT05fTkFNRVMuU3Vic2NyaXB0aW9uT3duZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb24gPT09IFBFUk1JU1NJT05fTkFNRVMuU3Vic2NyaXB0aW9uU3VwZXJBZG1pbikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyQWRtaW4oKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uU3VwZXJPd25lcigpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5pc1N1cGVyQWRtaW4oKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUEVSTUlTU0lPTl9OQU1FUy5TdWJzY3JpcHRpb25TdXBlck93bmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1VzZXJTdWJzY3JpcHRpb25TdXBlck93bmVyKCkgfHwgdGhpcy5pc1N1cGVyQWRtaW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgcGVybWlzc2lvbiA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIEFETUlOX1NVQl9NRU5VX1dISVRFTElTVC5zb21lKHYgPT4gcGVybWlzc2lvbi5pbmNsdWRlcyh2KSkgJiZcbiAgICAgICAgICAgICh0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyQWRtaW4oKSB8fCB0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyT3duZXIoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cHIgPSB0aGlzLmhhbmRsZU5vbkJvb2xlYW5QZXJtaXNzaW9ucyhcbiAgICAgICAgICAgIHBlcm1pc3Npb24sXG4gICAgICAgICAgICBleHByLFxuICAgICAgICAgICAgcHJvZHVjdEtleSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25fa2V5LFxuICAgICAgICAgICAgcHJvZHVjdFNsdWdcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBOb3cgZXhwciBpcyBtYWRlIG9mIHRydWUvZmFsc2UgdmFsdWVzIHdpdGggJiYsIHx8LCAoKVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXZhbFxuICAgICAgICByZXR1cm4gZXZhbChleHByKTsgLy8gTk9TT05BUlxuICAgIH1cblxuICAgIGhhbmRsZU5vbkJvb2xlYW5QZXJtaXNzaW9ucyhwZXJtaXNzaW9uLCBleHByLCBwcm9kdWN0S2V5LCBwZXJtaXNzaW9uX2tleSwgcHJvZHVjdFNsdWcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwZXJtaXNzaW9uICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb24uc3BsaXQoJyAnKS5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHgudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKFsnfHwnLCAnJiYnLCAnKCcsICcpJ10uaW5jbHVkZXMocmF3KSkge1xuICAgICAgICAgICAgICAgICAgICBleHByICs9IGAgJHtyYXd9IGA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV2YWx1YXRlZDogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1cGVyQWRtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuaXNTdXBlckFkbWluKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvbkFkbWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uQWRtaW4oKSB8fCB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvbk93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgPSB0aGlzLmlzVXNlclN1YnNjcmlwdGlvbk93bmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvblN1cGVyQWRtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1VzZXJTdWJzY3JpcHRpb25TdXBlckFkbWluKCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVXNlclN1YnNjcmlwdGlvblN1cGVyT3duZXIoKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdXBlckFkbWluKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF3ID09PSBQRVJNSVNTSU9OX05BTUVTLlN1YnNjcmlwdGlvblN1cGVyT3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCA9IHRoaXMuaXNVc2VyU3Vic2NyaXB0aW9uU3VwZXJPd25lcigpIHx8IHRoaXMuaXNTdXBlckFkbWluKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZHVjdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGl0J3MgUGFnZXMuUHJvZHVjdCBvciBQYWdlcy5Sb2xlIHdpdGggcHJvZHVjdEtleVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkID0gdGhpcy5pc0dyYW50ZWQocmF3LCBwcm9kdWN0S2V5LCBwZXJtaXNzaW9uX2tleSwgcHJvZHVjdFNsdWcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkID0gdGhpcy5pc0dyYW50ZWQocmF3KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGV4cHIgKz0gYCAke2V2YWx1YXRlZH0gYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG5cbiAgICBnZXRQZXJtaXNzaW9uQnlSb2xlKHJvbGVJZDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaS5nZXQoYC9hZG1pbi9yb2xlX3Blcm1pc3Npb25zLyR7cm9sZUlkfWApO1xuICAgIH1cblxuICAgIHNhdmVVc2VyUGVybWlzc2lvbihwYXlsb2FkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaS5wb3N0KGAvYWRtaW4vcm9sZV9wZXJtaXNzaW9uc2AsIHBheWxvYWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRldGVybWluZSB1c2VyIGlzIHN1cGVyX2FkbWluIHVzaW5nIHVzZXIuYXV0aC5ncmFudGVkWydQYWdlcy5TdXBlckFkbWluJ11cbiAgICAgKi9cbiAgICBpc1N1cGVyQWRtaW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMudXNlci5hdXRoLmdyYW50ZWRbJ1BhZ2VzLlN1cGVyQWRtaW4nXSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQW55IFByb2R1Y3QgQWRtaW4gcmVnYXJkbGVzcyBvZiB0aGUgcHJvZHVjdCBiZWluZyBtYXN0ZXIgcHJvZHVjdCBvciBub3QuXG4gICAgICovXG4gICAgcHVibGljIGlzVXNlclN1YnNjcmlwdGlvbk93bmVyKHByb2R1Y3Q/KTogYm9vbGVhbiB7XG4gICAgICAgIHByb2R1Y3QgPz89IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHByb2R1Y3Q/LnN1YnNjcmlwdGlvbl9zbHVnO1xuICAgICAgICByZXR1cm4gISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS4ke3Byb2R1Y3Q/LnBlcm1pc3Npb25fa2V5fS4ke3Byb2R1Y3QuZmVhdHVyZV9rZXl9LlN1YnNjcmlwdGlvbk93bmVyYFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFueSBQcm9kdWN0IEFkbWluIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb2R1Y3QgYmVpbmcgbWFzdGVyIHByb2R1Y3Qgb3Igbm90LlxuICAgICAqICpyYmFjQWxsb3c9XCJTdWJzY3JpcHRpb25BZG1pblwiXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNVc2VyU3Vic2NyaXB0aW9uQWRtaW4ocHJvZHVjdD8pOiBib29sZWFuIHtcbiAgICAgICAgcHJvZHVjdCA/Pz0gdGhpcy5nZXRDdXJyZW50UHJvZHVjdCgpO1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25TbHVnID0gcHJvZHVjdD8uc3Vic2NyaXB0aW9uX3NsdWc7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhIXRoaXMudXNlci5hdXRoLmdyYW50ZWRbXG4gICAgICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS4ke3Byb2R1Y3Q/LnBlcm1pc3Npb25fa2V5fS4ke3Byb2R1Y3QuZmVhdHVyZV9rZXl9LlN1YnNjcmlwdGlvbkFkbWluYFxuICAgICAgICAgICAgXSB8fFxuICAgICAgICAgICAgISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgICAgIGBQYWdlcy5Qcm9kdWN0LiR7c3Vic2NyaXB0aW9uU2x1Z30uJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25Pd25lcmBcbiAgICAgICAgICAgIF1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbnkgUHJvZHVjdCBBZG1pbiBvZiB0aGUgcHJvZHVjdCBiZWluZyB0aGUgbWFzdGVyIHByb2R1Y3RcbiAgICAgKi9cbiAgICBpc1VzZXJTdWJzY3JpcHRpb25TdXBlckFkbWluKHByb2R1Y3Q/KTogYm9vbGVhbiB7XG4gICAgICAgIHByb2R1Y3QgPz89IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHByb2R1Y3Q/LnN1YnNjcmlwdGlvbl9zbHVnO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgICAgIGBQYWdlcy5Qcm9kdWN0LiR7c3Vic2NyaXB0aW9uU2x1Z30uJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25TdXBlckFkbWluYFxuICAgICAgICAgICAgXSB8fFxuICAgICAgICAgICAgISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgICAgIGBQYWdlcy5Qcm9kdWN0LiR7c3Vic2NyaXB0aW9uU2x1Z30uJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25TdXBlck93bmVyYFxuICAgICAgICAgICAgXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlzVXNlck1hc3RlclN1YnNjcmlwdGlvblN1cGVyQWRtaW4ocHJvZHVjdD8pOiBib29sZWFuIHtcbiAgICAgICAgcHJvZHVjdCA/Pz0gdGhpcy5nZXRDdXJyZW50UHJvZHVjdCgpO1xuICAgICAgICByZXR1cm4gISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtwcm9kdWN0Py5wZXJtaXNzaW9uX2tleX0uJHtwcm9kdWN0LmZlYXR1cmVfa2V5fS5TdWJzY3JpcHRpb25TdXBlckFkbWluYFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFueSBQcm9kdWN0IEFkbWluIG9mIHRoZSBwcm9kdWN0IGJlaW5nIHRoZSBtYXN0ZXIgcHJvZHVjdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1VzZXJTdWJzY3JpcHRpb25TdXBlck93bmVyKHByb2R1Y3Q/KTogYm9vbGVhbiB7XG4gICAgICAgIHByb2R1Y3QgPz89IHRoaXMuZ2V0Q3VycmVudFByb2R1Y3QoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2x1ZyA9IHByb2R1Y3Q/LnN1YnNjcmlwdGlvbl9zbHVnO1xuICAgICAgICByZXR1cm4gISF0aGlzLnVzZXIuYXV0aC5ncmFudGVkW1xuICAgICAgICAgICAgYFBhZ2VzLlByb2R1Y3QuJHtzdWJzY3JpcHRpb25TbHVnfS4ke3Byb2R1Y3Q/LnBlcm1pc3Npb25fa2V5fS4ke3Byb2R1Y3QuZmVhdHVyZV9rZXl9LlN1YnNjcmlwdGlvblN1cGVyT3duZXJgXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudFByb2R1Y3QocHJvZHVjdCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICdwcm9kdWN0JyxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBpZDogcHJvZHVjdC5pZCxcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uX2tleTogcHJvZHVjdD8ucGVybWlzc2lvbl9rZXksXG4gICAgICAgICAgICAgICAgZmVhdHVyZV9rZXk6IHByb2R1Y3QuZmVhdHVyZV9rZXksXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHByb2R1Y3Quc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uX3NsdWc6IHByb2R1Y3Quc3Vic2NyaXB0aW9uX3NsdWdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRQcm9kdWN0KCkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncHJvZHVjdCcpKTtcbiAgICB9XG59XG4iXX0=
@@ -1271,8 +1271,8 @@ class PermissionService {
1271
1271
  }
1272
1272
  expr = this.handleNonBooleanPermissions(permission, expr, productKey, permission_key, productSlug);
1273
1273
  // Now expr is made of true/false values with &&, ||, ()
1274
- // Safe evaluation of boolean expressions without using eval()
1275
- return this.evaluateBooleanExpression(expr);
1274
+ // eslint-disable-next-line no-eval
1275
+ return eval(expr); // NOSONAR
1276
1276
  }
1277
1277
  handleNonBooleanPermissions(permission, expr, productKey, permission_key, productSlug) {
1278
1278
  if (typeof permission !== 'boolean') {
@@ -1379,161 +1379,6 @@ class PermissionService {
1379
1379
  getCurrentProduct() {
1380
1380
  return JSON.parse(localStorage.getItem('product'));
1381
1381
  }
1382
- /**
1383
- * Safely evaluates boolean expressions without using eval()
1384
- * Supports: true, false, &&, ||, (, )
1385
- * @param expr - Boolean expression string like "true && false || (true && false)"
1386
- * @returns boolean result
1387
- */
1388
- evaluateBooleanExpression(expr) {
1389
- if (!expr || typeof expr !== 'string') {
1390
- return false;
1391
- }
1392
- try {
1393
- // Clean up the expression - remove extra spaces and normalize
1394
- const cleanExpr = expr.trim().replace(/\s+/g, ' ');
1395
- // Simple tokenizer for boolean expressions
1396
- const tokens = this.tokenizeBooleanExpression(cleanExpr);
1397
- // Parse and evaluate the expression
1398
- return this.parseBooleanExpression(tokens);
1399
- }
1400
- catch (error) {
1401
- console.warn('Error evaluating boolean expression:', expr, error);
1402
- return false;
1403
- }
1404
- }
1405
- /**
1406
- * Tokenizes a boolean expression string
1407
- */
1408
- tokenizeBooleanExpression(expr) {
1409
- const tokens = [];
1410
- let i = 0;
1411
- while (i < expr.length) {
1412
- const char = expr[i];
1413
- if (this.isWhitespace(char)) {
1414
- i++;
1415
- }
1416
- else if (this.isParenthesis(char)) {
1417
- tokens.push(char);
1418
- i++;
1419
- }
1420
- else if (this.isDoubleOperator(expr, i, '&')) {
1421
- tokens.push('&&');
1422
- i += 2;
1423
- }
1424
- else if (this.isDoubleOperator(expr, i, '|')) {
1425
- tokens.push('||');
1426
- i += 2;
1427
- }
1428
- else {
1429
- const token = this.collectToken(expr, i);
1430
- if (token.value) {
1431
- tokens.push(token.value);
1432
- }
1433
- i = token.nextIndex;
1434
- }
1435
- }
1436
- return tokens;
1437
- }
1438
- isWhitespace(char) {
1439
- return char === ' ';
1440
- }
1441
- isParenthesis(char) {
1442
- return char === '(' || char === ')';
1443
- }
1444
- isDoubleOperator(expr, index, operator) {
1445
- return expr[index] === operator && expr[index + 1] === operator;
1446
- }
1447
- collectToken(expr, startIndex) {
1448
- let current = '';
1449
- let i = startIndex;
1450
- while (i < expr.length && ![' ', '(', ')', '&', '|'].includes(expr[i])) {
1451
- current += expr[i];
1452
- i++;
1453
- }
1454
- return { value: current, nextIndex: i };
1455
- }
1456
- /**
1457
- * Parses and evaluates boolean expression tokens
1458
- */
1459
- parseBooleanExpression(tokens) {
1460
- // Handle simple cases first
1461
- if (tokens.length === 1) {
1462
- return tokens[0] === 'true';
1463
- }
1464
- // Convert to postfix notation and evaluate
1465
- const postfix = this.infixToPostfix(tokens);
1466
- return this.evaluatePostfix(postfix);
1467
- }
1468
- /**
1469
- * Converts infix notation to postfix (Reverse Polish Notation)
1470
- */
1471
- infixToPostfix(tokens) {
1472
- const output = [];
1473
- const operators = [];
1474
- const precedence = { '||': 1, '&&': 2 };
1475
- for (const token of tokens) {
1476
- if (token === 'true' || token === 'false') {
1477
- output.push(token);
1478
- }
1479
- else if (token === '(') {
1480
- operators.push(token);
1481
- }
1482
- else if (token === ')') {
1483
- while (operators.length > 0 && operators[operators.length - 1] !== '(') {
1484
- const op = operators.pop();
1485
- if (op)
1486
- output.push(op);
1487
- }
1488
- operators.pop(); // Remove '('
1489
- }
1490
- else if (token === '&&' || token === '||') {
1491
- while (operators.length > 0 &&
1492
- operators[operators.length - 1] !== '(' &&
1493
- precedence[operators[operators.length - 1]] >= precedence[token]) {
1494
- const op = operators.pop();
1495
- if (op)
1496
- output.push(op);
1497
- }
1498
- operators.push(token);
1499
- }
1500
- }
1501
- while (operators.length > 0) {
1502
- const op = operators.pop();
1503
- if (op)
1504
- output.push(op);
1505
- }
1506
- return output;
1507
- }
1508
- /**
1509
- * Evaluates postfix boolean expression
1510
- */
1511
- evaluatePostfix(postfix) {
1512
- const stack = [];
1513
- for (const token of postfix) {
1514
- if (token === 'true') {
1515
- stack.push(true);
1516
- }
1517
- else if (token === 'false') {
1518
- stack.push(false);
1519
- }
1520
- else if (token === '&&') {
1521
- const b = stack.pop();
1522
- const a = stack.pop();
1523
- if (a !== undefined && b !== undefined) {
1524
- stack.push(a && b);
1525
- }
1526
- }
1527
- else if (token === '||') {
1528
- const b = stack.pop();
1529
- const a = stack.pop();
1530
- if (a !== undefined && b !== undefined) {
1531
- stack.push(a || b);
1532
- }
1533
- }
1534
- }
1535
- return stack[0] || false;
1536
- }
1537
1382
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PermissionService, deps: [{ token: MainApiHttpService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1538
1383
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PermissionService, providedIn: 'root' }); }
1539
1384
  }