@mediusinc/mng-commons 3.0.0-rc.8 → 3.0.0-rc.9

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 (66) hide show
  1. package/esm2022/lib/components/action/models/action-execution.model.mjs +1 -1
  2. package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +13 -2
  3. package/esm2022/lib/components/form/dropdown/dropdown.component.mjs +16 -5
  4. package/esm2022/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +10 -3
  5. package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +7 -5
  6. package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +15 -6
  7. package/esm2022/lib/components/tableview/table/table.component.mjs +9 -4
  8. package/esm2022/lib/descriptors/action/action.descriptor.mjs +6 -6
  9. package/esm2022/lib/descriptors/editor/editor.descriptor.mjs +2 -2
  10. package/esm2022/lib/descriptors/filter/filter.descriptor.mjs +4 -4
  11. package/esm2022/lib/descriptors/table/column.descriptor.mjs +2 -2
  12. package/esm2022/lib/descriptors/tableview/tableview.descriptor.mjs +2 -2
  13. package/esm2022/lib/error/error.handler.mjs +7 -10
  14. package/esm2022/lib/models/error.model.mjs +44 -2
  15. package/esm2022/lib/models/index.mjs +1 -2
  16. package/esm2022/lib/models/log.model.mjs +1 -1
  17. package/esm2022/lib/provide-commons.mjs +8 -3
  18. package/esm2022/lib/router/route-builder.mjs +3 -3
  19. package/esm2022/lib/router/routes-builder.mjs +2 -2
  20. package/esm2022/lib/services/action-error-mapper.service.mjs +3 -2
  21. package/esm2022/lib/services/action-executor.service.mjs +40 -25
  22. package/esm2022/lib/services/configuration.service.mjs +7 -13
  23. package/esm2022/lib/services/index.mjs +2 -1
  24. package/esm2022/lib/services/internal/commons-init.service.mjs +4 -3
  25. package/esm2022/lib/services/log-publisher-console.service.mjs +40 -0
  26. package/esm2022/lib/services/logger.service.mjs +57 -50
  27. package/esm2022/lib/services/tokens/index.mjs +2 -1
  28. package/esm2022/lib/services/tokens/log-publisher.token.mjs +3 -0
  29. package/esm2022/lib/services/version.service.mjs +7 -2
  30. package/esm2022/lib/utils/action-data-provider.util.mjs +7 -7
  31. package/esm2022/lib/utils/error.util.mjs +247 -0
  32. package/esm2022/lib/utils/i18n.util.mjs +7 -9
  33. package/esm2022/lib/utils/index.mjs +2 -1
  34. package/esm2022/lib/utils/notification.util.mjs +1 -1
  35. package/esm2022/lib/utils/route.util.mjs +2 -2
  36. package/esm2022/lib/utils/string.util.mjs +32 -1
  37. package/esm2022/lib/utils/tableview.util.mjs +2 -2
  38. package/esm2022/lib/utils/type.util.mjs +2 -2
  39. package/fesm2022/mediusinc-mng-commons.mjs +657 -270
  40. package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
  41. package/lib/components/action/models/action-execution.model.d.ts +2 -2
  42. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +1 -0
  43. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +1 -0
  44. package/lib/components/tableview/table/table.component.d.ts +1 -0
  45. package/lib/descriptors/editor/field.descriptor.d.ts +1 -1
  46. package/lib/descriptors/table/column.descriptor.d.ts +1 -1
  47. package/lib/models/error.model.d.ts +44 -9
  48. package/lib/models/index.d.ts +0 -1
  49. package/lib/models/log.model.d.ts +14 -8
  50. package/lib/services/action-error-mapper.service.d.ts +10 -3
  51. package/lib/services/action-executor.service.d.ts +3 -2
  52. package/lib/services/index.d.ts +1 -0
  53. package/lib/services/internal/commons-init.service.d.ts +1 -0
  54. package/lib/services/log-publisher-console.service.d.ts +4 -0
  55. package/lib/services/logger.service.d.ts +11 -8
  56. package/lib/services/tokens/index.d.ts +1 -0
  57. package/lib/services/tokens/log-publisher.token.d.ts +3 -0
  58. package/lib/services/version.service.d.ts +1 -0
  59. package/lib/utils/error.util.d.ts +116 -0
  60. package/lib/utils/i18n.util.d.ts +3 -3
  61. package/lib/utils/index.d.ts +1 -0
  62. package/lib/utils/notification.util.d.ts +2 -2
  63. package/lib/utils/string.util.d.ts +5 -0
  64. package/package.json +1 -1
  65. package/esm2022/lib/models/internal-error.model.mjs +0 -30
  66. package/lib/models/internal-error.model.d.ts +0 -26
@@ -1,6 +1,6 @@
1
1
  import { isObservable, throwError } from 'rxjs';
2
2
  import { MediusQueryParamBuilder } from '../api/models';
3
- import { MngInternalError } from '../models';
3
+ import { MngActionError } from '../models';
4
4
  export class ActionDataProviderUtil {
5
5
  static runGetAllOrFail(ctx) {
6
6
  const dataProviderExec = ActionDataProviderUtil.runGetAllDataProvider(ctx);
@@ -10,11 +10,11 @@ export class ActionDataProviderUtil {
10
10
  const serviceExec = ActionDataProviderUtil.runGetAllService(ctx);
11
11
  return isObservable(serviceExec)
12
12
  ? serviceExec
13
- : throwError(() => new MngInternalError(`Data provider and service instance could not extract fetch function to execute in action ${ctx.instance.action.actionNameLong} (${ctx.instance.action.model?.typeName}) for item id ${ctx.parameters?.itemId}.`, 'ActionDataProviderUtils error'));
13
+ : throwError(() => new MngActionError(`Data provider and service instance could not extract fetch function to execute in action ${ctx.instance.action.actionNameLong} (${ctx.instance.action.model?.typeName}) for item id ${ctx.parameters?.itemId}.`, ctx.contextLongName, { actionContext: ctx }));
14
14
  }
15
15
  static runFetchOrFail(ctx) {
16
16
  return (ActionDataProviderUtil.runFetch(ctx) ??
17
- throwError(() => new MngInternalError(`Data provider and service instance could not extract fetch function to execute in action ${ctx.instance.action.actionNameLong} (${ctx.instance.action.model?.typeName}) for item id ${ctx.parameters?.itemId}.`, 'ActionDataProviderUtils error')));
17
+ throwError(() => new MngActionError(`Data provider and service instance could not extract fetch function to execute in action ${ctx.instance.action.actionNameLong} (${ctx.instance.action.model?.typeName}) for item id ${ctx.parameters?.itemId}.`, ctx.contextLongName, { actionContext: ctx })));
18
18
  }
19
19
  static runFetch(ctx, fallback) {
20
20
  const dataProviderExec = ActionDataProviderUtil.runFetchDataProvider(ctx);
@@ -26,7 +26,7 @@ export class ActionDataProviderUtil {
26
26
  }
27
27
  static runCreateOrFail(ctx) {
28
28
  return (ActionDataProviderUtil.runCreate(ctx) ??
29
- throwError(() => new MngInternalError(`Data provider and service instance could not extract create function to execute in action ${ctx.instance.action.actionNameLong} (${ctx.instance.action.model?.typeName}) for item ${ctx.parameters?.item}.`, 'ActionDataProviderUtils error')));
29
+ throwError(() => new MngActionError(`Data provider and service instance could not extract create function to execute in action ${ctx.instance.action.actionNameLong} (${ctx.instance.action.model?.typeName}) for item ${ctx.parameters?.item}.`, ctx.contextLongName, { actionContext: ctx })));
30
30
  }
31
31
  static runCreate(ctx, fallback) {
32
32
  const dataProviderExec = ActionDataProviderUtil.runCreateDataProvider(ctx);
@@ -38,7 +38,7 @@ export class ActionDataProviderUtil {
38
38
  }
39
39
  static runUpdateOrFail(ctx) {
40
40
  return (ActionDataProviderUtil.runUpdate(ctx) ??
41
- throwError(() => new MngInternalError(`Data provider and service instance could not extract update function to execute in action ${ctx.instance.action.actionNameLong} (${ctx.instance.action.model?.typeName}) for item id ${ctx.parameters?.itemId}.`, 'ActionDataProviderUtils error')));
41
+ throwError(() => new MngActionError(`Data provider and service instance could not extract update function to execute in action ${ctx.instance.action.actionNameLong} (${ctx.instance.action.model?.typeName}) for item id ${ctx.parameters?.itemId}.`, ctx.contextLongName, { actionContext: ctx })));
42
42
  }
43
43
  static runUpdate(ctx, fallback) {
44
44
  const dataProviderExec = ActionDataProviderUtil.runUpdateDataProvider(ctx);
@@ -56,7 +56,7 @@ export class ActionDataProviderUtil {
56
56
  const serviceExec = ActionDataProviderUtil.runDeleteService(ctx);
57
57
  return isObservable(serviceExec)
58
58
  ? serviceExec
59
- : throwError(() => new MngInternalError(`Data provider and service instance could not extract delete function to execute in action ${ctx.instance.action.actionNameLong} (${ctx.instance.action.model?.typeName}) for item id ${ctx.parameters?.itemId}.`, 'ActionDataProviderUtils error'));
59
+ : throwError(() => new MngActionError(`Data provider and service instance could not extract delete function to execute in action ${ctx.instance.action.actionNameLong} (${ctx.instance.action.model?.typeName}) for item id ${ctx.parameters?.itemId}.`, ctx.contextLongName, { actionContext: ctx }));
60
60
  }
61
61
  static runGetAllService(ctx) {
62
62
  if (typeof ctx.serviceInstance !== 'undefined') {
@@ -162,4 +162,4 @@ export class ActionDataProviderUtil {
162
162
  }
163
163
  }
164
164
  }
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWRhdGEtcHJvdmlkZXIudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMvYWN0aW9uLWRhdGEtcHJvdmlkZXIudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQWEsWUFBWSxFQUFFLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUUxRCxPQUFPLEVBQUMsdUJBQXVCLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBSXpFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUUzQyxNQUFNLE9BQU8sc0JBQXNCO0lBQ3hCLE1BQU0sQ0FBQyxlQUFlLENBQU8sR0FBd0I7UUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzRSxJQUFJLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sZ0JBQWdCLENBQUM7U0FDM0I7UUFDRCxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRSxPQUFPLFlBQVksQ0FBQyxXQUFXLENBQUM7WUFDNUIsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsVUFBVSxDQUNOLEdBQUcsRUFBRSxDQUNELElBQUksZ0JBQWdCLENBQ2hCLDRGQUE0RixHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEtBQUssR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsaUJBQWlCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxHQUFHLEVBQ2hOLCtCQUErQixDQUNsQyxDQUNSLENBQUM7SUFDWixDQUFDO0lBRU0sTUFBTSxDQUFDLGNBQWMsQ0FBTyxHQUF3QjtRQUN2RCxPQUFPLENBQ0gsc0JBQXNCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNw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VSxFQUFFO2dCQUNqRCxPQUFPLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDckk7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxNQUFNLENBQUMscUJBQXFCLENBQU8sR0FBd0I7UUFDOUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxZQUFZLEtBQUssV0FBVyxFQUFFO1lBQ3pDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDLFlBQTJDLENBQUM7WUFDM0UsSUFBSSxPQUFPLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7Z0JBQ2pELE9BQU8sR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUNySTtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsc0JBQXNCLENBQU8sUUFBa0IsRUFBRSxZQUFrQztRQUM3RixJQUFJLFlBQVksRUFBRSxXQUFXLEVBQUU7WUFDM0IsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNwRDthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0b3J9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge09ic2VydmFibGUsIGlzT2JzZXJ2YWJsZSwgdGhyb3dFcnJvcn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7TWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIsIE1lZGl1c1F1ZXJ5UmVzdWx0fSBmcm9tICcuLi9hcGkvbW9kZWxzJztcbmltcG9ydCB7SU1uZ0NydWRBcGlTZXJ2aWNlLCBJTW5nR2V0QWxsQXBpU2VydmljZX0gZnJvbSAnLi4vYXBpL3NlcnZpY2VzJztcbmltcG9ydCB7QWN0aW9uQ29udGV4dH0gZnJvbSAnLi4vY29tcG9uZW50cy9hY3Rpb24vbW9kZWxzJztcbmltcG9ydCB7SURhdGFQcm92aWRlciwgSUVkaXRvckRhdGFQcm92aWRlciwgSVRhYmxlRGF0YVByb3ZpZGVyfSBmcm9tICcuLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge01uZ0ludGVybmFsRXJyb3J9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25EYXRhUHJvdmlkZXJVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIHJ1bkdldEFsbE9yRmFpbDxULCBTPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pOiBPYnNlcnZhYmxlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PiB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlckV4ZWMgPSBBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkdldEFsbERhdGFQcm92aWRlcihjdHgpO1xuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlKGRhdGFQcm92aWRlckV4ZWMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YVByb3ZpZGVyRXhlYztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJ2aWNlRXhlYyA9IEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuR2V0QWxsU2VydmljZShjdHgpO1xuICAgICAgICByZXR1cm4gaXNPYnNlcnZhYmxlKHNlcnZpY2VFeGVjKVxuICAgICAgICAgICAgPyBzZXJ2aWNlRXhlY1xuICAgICAgICAgICAgOiB0aHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBuZXcgTW5nSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYERhdGEgcHJvdmlkZXIgYW5kIHNlcnZpY2UgaW5zdGFuY2UgY291bGQgbm90IGV4dHJhY3QgZmV0Y2ggZnVuY3Rpb24gdG8gZXhlY3V0ZSBpbiBhY3Rpb24gJHtjdHguaW5zdGFuY2UuYWN0aW9uLmFjdGlvbk5hbWVMb25nfSAoJHtjdHguaW5zdGFuY2UuYWN0aW9uLm1vZGVsPy50eXBlTmFtZX0pIGZvciBpdGVtIGlkICR7Y3R4LnBhcmFtZXRlcnM/Lml0ZW1JZH0uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdGlvbkRhdGFQcm92aWRlclV0aWxzIGVycm9yJ1xuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bkZldGNoT3JGYWlsPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPik6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5GZXRjaChjdHgpID8/XG4gICAgICAgICAgICB0aHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgICAgIG5ldyBNbmdJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYERhdGEgcHJvdmlkZXIgYW5kIHNlcnZpY2UgaW5zdGFuY2UgY291bGQgbm90IGV4dHJhY3QgZmV0Y2ggZnVuY3Rpb24gdG8gZXhlY3V0ZSBpbiBhY3Rpb24gJHtjdHguaW5zdGFuY2UuYWN0aW9uLmFjdGlvbk5hbWVMb25nfSAoJHtjdHguaW5zdGFuY2UuYWN0aW9uLm1vZGVsPy50eXBlTmFtZX0pIGZvciBpdGVtIGlkICR7Y3R4LnBhcmFtZXRlcnM/Lml0ZW1JZH0uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBY3Rpb25EYXRhUHJvdmlkZXJVdGlscyBlcnJvcidcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuRmV0Y2g8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KTogT2JzZXJ2YWJsZTxUPiB8IG51bGw7XG4gICAgcHVibGljIHN0YXRpYyBydW5GZXRjaDxULCBTPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4sIGZhbGxiYWNrOiBPYnNlcnZhYmxlPFQgfCBudWxsIHwgdW5kZWZpbmVkPik6IE9ic2VydmFibGU8VCB8IG51bGwgfCB1bmRlZmluZWQ+O1xuICAgIHB1YmxpYyBzdGF0aWMgcnVuRmV0Y2g8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+LCBmYWxsYmFjaz86IE9ic2VydmFibGU8VCB8IG51bGwgfCB1bmRlZmluZWQ+KTogT2JzZXJ2YWJsZTxUIHwgbnVsbCB8IHVuZGVmaW5lZD4gfCBudWxsIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyRXhlYyA9IEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuRmV0Y2hEYXRhUHJvdmlkZXIoY3R4KTtcbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZShkYXRhUHJvdmlkZXJFeGVjKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFQcm92aWRlckV4ZWM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VydmljZUV4ZWMgPSBBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkdldEJ5SWRTZXJ2aWNlKGN0eCk7XG4gICAgICAgIHJldHVybiBpc09ic2VydmFibGUoc2VydmljZUV4ZWMpID8gc2VydmljZUV4ZWMgOiBmYWxsYmFjayA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuQ3JlYXRlT3JGYWlsPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPik6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5DcmVhdGUoY3R4KSA/P1xuICAgICAgICAgICAgdGhyb3dFcnJvcihcbiAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICBuZXcgTW5nSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBEYXRhIHByb3ZpZGVyIGFuZCBzZXJ2aWNlIGluc3RhbmNlIGNvdWxkIG5vdCBleHRyYWN0IGNyZWF0ZSBmdW5jdGlvbiB0byBleGVjdXRlIGluIGFjdGlvbiAke2N0eC5pbnN0YW5jZS5hY3Rpb24uYWN0aW9uTmFtZUxvbmd9ICgke2N0eC5pbnN0YW5jZS5hY3Rpb24ubW9kZWw/LnR5cGVOYW1lfSkgZm9yIGl0ZW0gJHtjdHgucGFyYW1ldGVycz8uaXRlbX0uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBY3Rpb25EYXRhUHJvdmlkZXJVdGlscyBlcnJvcidcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuQ3JlYXRlPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPik6IE9ic2VydmFibGU8VD4gfCBudWxsO1xuICAgIHB1YmxpYyBzdGF0aWMgcnVuQ3JlYXRlPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPiwgZmFsbGJhY2s6IE9ic2VydmFibGU8VCB8IG51bGwgfCB1bmRlZmluZWQ+KTogT2JzZXJ2YWJsZTxUIHwgbnVsbCB8IHVuZGVmaW5lZD47XG4gICAgcHVibGljIHN0YXRpYyBydW5DcmVhdGU8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+LCBmYWxsYmFjaz86IE9ic2VydmFibGU8VCB8IG51bGwgfCB1bmRlZmluZWQ+KTogT2JzZXJ2YWJsZTxUIHwgbnVsbCB8IHVuZGVmaW5lZD4gfCBudWxsIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyRXhlYyA9IEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuQ3JlYXRlRGF0YVByb3ZpZGVyKGN0eCk7XG4gICAgICAgIGlmIChpc09ic2VydmFibGUoZGF0YVByb3ZpZGVyRXhlYykpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhUHJvdmlkZXJFeGVjO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcnZpY2VFeGVjID0gQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5DcmVhdGVTZXJ2aWNlKGN0eCk7XG4gICAgICAgIHJldHVybiBpc09ic2VydmFibGUoc2VydmljZUV4ZWMpID8gc2VydmljZUV4ZWMgOiBmYWxsYmFjayA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuVXBkYXRlT3JGYWlsPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPik6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5VcGRhdGUoY3R4KSA/P1xuICAgICAgICAgICAgdGhyb3dFcnJvcihcbiAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICBuZXcgTW5nSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBEYXRhIHByb3ZpZGVyIGFuZCBzZXJ2aWNlIGluc3RhbmNlIGNvdWxkIG5vdCBleHRyYWN0IHVwZGF0ZSBmdW5jdGlvbiB0byBleGVjdXRlIGluIGFjdGlvbiAke2N0eC5pbnN0YW5jZS5hY3Rpb24uYWN0aW9uTmFtZUxvbmd9ICgke2N0eC5pbnN0YW5jZS5hY3Rpb24ubW9kZWw/LnR5cGVOYW1lfSkgZm9yIGl0ZW0gaWQgJHtjdHgucGFyYW1ldGVycz8uaXRlbUlkfS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdGlvbkRhdGFQcm92aWRlclV0aWxzIGVycm9yJ1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBydW5VcGRhdGU8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KTogT2JzZXJ2YWJsZTxUPiB8IG51bGw7XG4gICAgcHVibGljIHN0YXRpYyBydW5VcGRhdGU8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+LCBmYWxsYmFjazogT2JzZXJ2YWJsZTxUIHwgbnVsbCB8IHVuZGVmaW5lZD4pOiBPYnNlcnZhYmxlPFQgfCBudWxsIHwgdW5kZWZpbmVkPjtcbiAgICBwdWJsaWMgc3RhdGljIHJ1blVwZGF0ZTxULCBTPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4sIGZhbGxiYWNrPzogT2JzZXJ2YWJsZTxUIHwgbnVsbCB8IHVuZGVmaW5lZD4pOiBPYnNlcnZhYmxlPFQgfCBudWxsIHwgdW5kZWZpbmVkPiB8IG51bGwge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXJFeGVjID0gQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5VcGRhdGVEYXRhUHJvdmlkZXIoY3R4KTtcbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZShkYXRhUHJvdmlkZXJFeGVjKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFQcm92aWRlckV4ZWM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VydmljZUV4ZWMgPSBBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1blVwZGF0ZVNlcnZpY2UoY3R4KTtcbiAgICAgICAgcmV0dXJuIGlzT2JzZXJ2YWJsZShzZXJ2aWNlRXhlYykgPyBzZXJ2aWNlRXhlYyA6IGZhbGxiYWNrID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBydW5EZWxldGVPckZhaWw8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KTogT2JzZXJ2YWJsZTxUIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXJFeGVjID0gQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5EZWxldGVEYXRhUHJvdmlkZXIoY3R4KTtcbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZShkYXRhUHJvdmlkZXJFeGVjKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFQcm92aWRlckV4ZWM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VydmljZUV4ZWMgPSBBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkRlbGV0ZVNlcnZpY2UoY3R4KTtcbiAgICAgICAgcmV0dXJuIGlzT2JzZXJ2YWJsZShzZXJ2aWNlRXhlYylcbiAgICAgICAgICAgID8gc2VydmljZUV4ZWNcbiAgICAgICAgICAgIDogdGhyb3dFcnJvcihcbiAgICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgbmV3IE1uZ0ludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBEYXRhIHByb3ZpZGVyIGFuZCBzZXJ2aWNlIGluc3RhbmNlIGNvdWxkIG5vdCBleHRyYWN0IGRlbGV0ZSBmdW5jdGlvbiB0byBleGVjdXRlIGluIGFjdGlvbiAke2N0eC5pbnN0YW5jZS5hY3Rpb24uYWN0aW9uTmFtZUxvbmd9ICgke2N0eC5pbnN0YW5jZS5hY3Rpb24ubW9kZWw/LnR5cGVOYW1lfSkgZm9yIGl0ZW0gaWQgJHtjdHgucGFyYW1ldGVycz8uaXRlbUlkfS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnQWN0aW9uRGF0YVByb3ZpZGVyVXRpbHMgZXJyb3InXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuR2V0QWxsU2VydmljZTxUPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgdW5rbm93bj4pOiBPYnNlcnZhYmxlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PiB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIGN0eC5zZXJ2aWNlSW5zdGFuY2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBnZXRBbGxTZXJ2aWNlSW5zdGFuY2UgPSBjdHguc2VydmljZUluc3RhbmNlIGFzIElNbmdHZXRBbGxBcGlTZXJ2aWNlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZ2V0QWxsU2VydmljZUluc3RhbmNlLmdldEFsbFBvc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtID0gY3R4LnBhcmFtZXRlcnM/LnF1ZXJ5UGFyYW0gPz8gTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlKCkuYnVpbGQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QWxsU2VydmljZUluc3RhbmNlLmdldEFsbFBvc3QocXVlcnlQYXJhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBydW5HZXRCeUlkU2VydmljZTxUPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgdW5rbm93bj4pOiBPYnNlcnZhYmxlPFQ+IHwgbnVsbCB7XG4gICAgICAgIGlmICh0eXBlb2YgY3R4LnNlcnZpY2VJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNydWRTZXJ2aWNlSW5zdGFuY2UgPSBjdHguc2VydmljZUluc3RhbmNlIGFzIElNbmdDcnVkQXBpU2VydmljZTxUPjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3J1ZFNlcnZpY2VJbnN0YW5jZS5nZXRCeUlkR2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5wYXJhbWV0ZXJzPy5pdGVtSWQgPyBjcnVkU2VydmljZUluc3RhbmNlLmdldEJ5SWRHZXQoY3R4LnBhcmFtZXRlcnMuaXRlbUlkKSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBydW5DcmVhdGVTZXJ2aWNlPFQ+KGN0eDogQWN0aW9uQ29udGV4dDxULCB1bmtub3duPik6IE9ic2VydmFibGU8VD4gfCBudWxsIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjdHguc2VydmljZUluc3RhbmNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3J1ZFNlcnZpY2VJbnN0YW5jZSA9IGN0eC5zZXJ2aWNlSW5zdGFuY2UgYXMgSU1uZ0NydWRBcGlTZXJ2aWNlPFQ+O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnVkU2VydmljZUluc3RhbmNlLmNyZWF0ZVBvc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LnBhcmFtZXRlcnM/Lml0ZW0gPyBjcnVkU2VydmljZUluc3RhbmNlLmNyZWF0ZVBvc3QoY3R4LnBhcmFtZXRlcnMuaXRlbSkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuVXBkYXRlU2VydmljZTxUPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgdW5rbm93bj4pOiBPYnNlcnZhYmxlPFQ+IHwgbnVsbCB7XG4gICAgICAgIGlmICh0eXBlb2YgY3R4LnNlcnZpY2VJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNydWRTZXJ2aWNlSW5zdGFuY2UgPSBjdHguc2VydmljZUluc3RhbmNlIGFzIElNbmdDcnVkQXBpU2VydmljZTxUPjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3J1ZFNlcnZpY2VJbnN0YW5jZS51cGRhdGVQdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LnBhcmFtZXRlcnM/Lml0ZW1JZCAmJiBjdHgucGFyYW1ldGVycy5pdGVtID8gY3J1ZFNlcnZpY2VJbnN0YW5jZS51cGRhdGVQdXQoY3R4LnBhcmFtZXRlcnMuaXRlbUlkLCBjdHgucGFyYW1ldGVycy5pdGVtKSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBydW5EZWxldGVTZXJ2aWNlPFQ+KGN0eDogQWN0aW9uQ29udGV4dDxULCB1bmtub3duPik6IE9ic2VydmFibGU8VCB8IG51bGw+IHwgbnVsbCB7XG4gICAgICAgIGlmICh0eXBlb2YgY3R4LnNlcnZpY2VJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNydWRTZXJ2aWNlSW5zdGFuY2UgPSBjdHguc2VydmljZUluc3RhbmNlIGFzIElNbmdDcnVkQXBpU2VydmljZTxUPjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3J1ZFNlcnZpY2VJbnN0YW5jZS5yZW1vdmVEZWxldGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LnBhcmFtZXRlcnM/Lml0ZW1JZCA/IGNydWRTZXJ2aWNlSW5zdGFuY2UucmVtb3ZlRGVsZXRlKGN0eC5wYXJhbWV0ZXJzLml0ZW1JZCwgY3R4LnBhcmFtZXRlcnMuaXRlbSkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuR2V0QWxsRGF0YVByb3ZpZGVyPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPik6IE9ic2VydmFibGU8TWVkaXVzUXVlcnlSZXN1bHQ8VD4+IHwgbnVsbCB7XG4gICAgICAgIGlmICh0eXBlb2YgY3R4LmRhdGFQcm92aWRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGN0eC5kYXRhUHJvdmlkZXJbJ2dldEFsbCcgYXMga2V5b2Ygb2JqZWN0XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgdGFibGVEYXRhUHJvdmlkZXIgPSBjdHguZGF0YVByb3ZpZGVyIGFzIElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+O1xuICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbSA9IGN0eC5wYXJhbWV0ZXJzPy5xdWVyeVBhcmFtID8/IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZSgpLmJ1aWxkKCk7XG4gICAgICAgICAgICByZXR1cm4gdGFibGVEYXRhUHJvdmlkZXIuZ2V0QWxsKHF1ZXJ5UGFyYW0sIGN0eC5zZXJ2aWNlSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuRmV0Y2hEYXRhUHJvdmlkZXI8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KTogT2JzZXJ2YWJsZTxUPiB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIGN0eC5kYXRhUHJvdmlkZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBlZGl0b3JEYXRhUHJvdmlkZXIgPSBjdHguZGF0YVByb3ZpZGVyIGFzIElFZGl0b3JEYXRhUHJvdmlkZXI8VCwgYW55PjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWRpdG9yRGF0YVByb3ZpZGVyLmZldGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5wYXJhbWV0ZXJzPy5pdGVtSWQgPyBlZGl0b3JEYXRhUHJvdmlkZXIuZmV0Y2goY3R4LnBhcmFtZXRlcnMuaXRlbUlkLCBjdHguc2VydmljZUluc3RhbmNlLCBjdHgucGFyYW1ldGVycy5sb2NhbGUpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bkNyZWF0ZURhdGFQcm92aWRlcjxULCBTPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pOiBPYnNlcnZhYmxlPFQ+IHwgbnVsbCB7XG4gICAgICAgIGlmICh0eXBlb2YgY3R4LmRhdGFQcm92aWRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRvckRhdGFQcm92aWRlciA9IGN0eC5kYXRhUHJvdmlkZXIgYXMgSUVkaXRvckRhdGFQcm92aWRlcjxULCBhbnk+O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlZGl0b3JEYXRhUHJvdmlkZXIuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5wYXJhbWV0ZXJzPy5pdGVtID8gZWRpdG9yRGF0YVByb3ZpZGVyLmNyZWF0ZShjdHgucGFyYW1ldGVycy5pdGVtLCBjdHguc2VydmljZUluc3RhbmNlKSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBydW5VcGRhdGVEYXRhUHJvdmlkZXI8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KTogT2JzZXJ2YWJsZTxUPiB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIGN0eC5kYXRhUHJvdmlkZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBlZGl0b3JEYXRhUHJvdmlkZXIgPSBjdHguZGF0YVByb3ZpZGVyIGFzIElFZGl0b3JEYXRhUHJvdmlkZXI8VCwgYW55PjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWRpdG9yRGF0YVByb3ZpZGVyLnVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdHgucGFyYW1ldGVycz8uaXRlbUlkID8gZWRpdG9yRGF0YVByb3ZpZGVyLnVwZGF0ZShjdHgucGFyYW1ldGVycy5pdGVtSWQsIGN0eC5wYXJhbWV0ZXJzLml0ZW0sIGN0eC5zZXJ2aWNlSW5zdGFuY2UpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bkRlbGV0ZURhdGFQcm92aWRlcjxULCBTPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pOiBPYnNlcnZhYmxlPFQgfCBudWxsPiB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIGN0eC5kYXRhUHJvdmlkZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBlZGl0b3JEYXRhUHJvdmlkZXIgPSBjdHguZGF0YVByb3ZpZGVyIGFzIElFZGl0b3JEYXRhUHJvdmlkZXI8VCwgYW55PjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWRpdG9yRGF0YVByb3ZpZGVyLmRlbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdHgucGFyYW1ldGVycz8uaXRlbUlkID8gZWRpdG9yRGF0YVByb3ZpZGVyLmRlbGV0ZShjdHgucGFyYW1ldGVycy5pdGVtSWQsIGN0eC5wYXJhbWV0ZXJzLml0ZW0sIGN0eC5zZXJ2aWNlSW5zdGFuY2UpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHNlcnZpY2UgaW5zdGFuY2Ugb2YgZGF0YSBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhUHJvdmlkZXIgRGF0YSBwcm92aWRlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERhdGFQcm92aWRlclNlcnZpY2U8VCwgUz4oaW5qZWN0b3I6IEluamVjdG9yLCBkYXRhUHJvdmlkZXI/OiBJRGF0YVByb3ZpZGVyPFQsIFM+KTogUyB8IG51bGwge1xuICAgICAgICBpZiAoZGF0YVByb3ZpZGVyPy5zZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGluamVjdG9yLmdldDxTPihkYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWRhdGEtcHJvdmlkZXIudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMvYWN0aW9uLWRhdGEtcHJvdmlkZXIudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQWEsWUFBWSxFQUFFLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUUxRCxPQUFPLEVBQUMsdUJBQXVCLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBSXpFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFekMsTUFBTSxPQUFPLHNCQUFzQjtJQUN4QixNQUFNLENBQUMsZUFBZSxDQUFPLEdBQXdCO1FBQ3hELE1BQU0sZ0JBQWdCLEdBQUcsc0JBQXNCLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0UsSUFBSSxZQUFZLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUNoQyxPQUFPLGdCQUFnQixDQUFDO1NBQzNCO1FBQ0QsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakUsT0FBTyxZQUFZLENBQUMsV0FBVyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDLFVBQVUsQ0FDTixHQUFHLEVBQUUsQ0FDRCxJQUFJLGNBQWMsQ0FDZCw0RkFBNEYsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxLQUFLLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLGlCQUFpQixHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sR0FBRyxFQUNoTixHQUFHLENBQUMsZUFBZSxFQUNuQixFQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUMsQ0FDdkIsQ0FDUixDQUFDO0lBQ1osQ0FBQztJQUVNLE1BQU0sQ0FBQyxjQUFjLENBQU8sR0FBd0I7UUFDdkQsT0FBTyxDQUNILHNC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USxDQUFDLEdBQUcsQ0FBSSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDcEQ7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdG9yfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtPYnNlcnZhYmxlLCBpc09ic2VydmFibGUsIHRocm93RXJyb3J9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge01lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLCBNZWRpdXNRdWVyeVJlc3VsdH0gZnJvbSAnLi4vYXBpL21vZGVscyc7XG5pbXBvcnQge0lNbmdDcnVkQXBpU2VydmljZSwgSU1uZ0dldEFsbEFwaVNlcnZpY2V9IGZyb20gJy4uL2FwaS9zZXJ2aWNlcyc7XG5pbXBvcnQge0FjdGlvbkNvbnRleHR9IGZyb20gJy4uL2NvbXBvbmVudHMvYWN0aW9uL21vZGVscyc7XG5pbXBvcnQge0lEYXRhUHJvdmlkZXIsIElFZGl0b3JEYXRhUHJvdmlkZXIsIElUYWJsZURhdGFQcm92aWRlcn0gZnJvbSAnLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtNbmdBY3Rpb25FcnJvcn0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGNsYXNzIEFjdGlvbkRhdGFQcm92aWRlclV0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgcnVuR2V0QWxsT3JGYWlsPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPik6IE9ic2VydmFibGU8TWVkaXVzUXVlcnlSZXN1bHQ8VD4+IHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyRXhlYyA9IEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuR2V0QWxsRGF0YVByb3ZpZGVyKGN0eCk7XG4gICAgICAgIGlmIChpc09ic2VydmFibGUoZGF0YVByb3ZpZGVyRXhlYykpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhUHJvdmlkZXJFeGVjO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcnZpY2VFeGVjID0gQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5HZXRBbGxTZXJ2aWNlKGN0eCk7XG4gICAgICAgIHJldHVybiBpc09ic2VydmFibGUoc2VydmljZUV4ZWMpXG4gICAgICAgICAgICA/IHNlcnZpY2VFeGVjXG4gICAgICAgICAgICA6IHRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIG5ldyBNbmdBY3Rpb25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYERhdGEgcHJvdmlkZXIgYW5kIHNlcnZpY2UgaW5zdGFuY2UgY291bGQgbm90IGV4dHJhY3QgZmV0Y2ggZnVuY3Rpb24gdG8gZXhlY3V0ZSBpbiBhY3Rpb24gJHtjdHguaW5zdGFuY2UuYWN0aW9uLmFjdGlvbk5hbWVMb25nfSAoJHtjdHguaW5zdGFuY2UuYWN0aW9uLm1vZGVsPy50eXBlTmFtZX0pIGZvciBpdGVtIGlkICR7Y3R4LnBhcmFtZXRlcnM/Lml0ZW1JZH0uYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmNvbnRleHRMb25nTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge2FjdGlvbkNvbnRleHQ6IGN0eH1cbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBydW5GZXRjaE9yRmFpbDxULCBTPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuRmV0Y2goY3R4KSA/P1xuICAgICAgICAgICAgdGhyb3dFcnJvcihcbiAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICBuZXcgTW5nQWN0aW9uRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRGF0YSBwcm92aWRlciBhbmQgc2VydmljZSBpbnN0YW5jZSBjb3VsZCBub3QgZXh0cmFjdCBmZXRjaCBmdW5jdGlvbiB0byBleGVjdXRlIGluIGFjdGlvbiAke2N0eC5pbnN0YW5jZS5hY3Rpb24uYWN0aW9uTmFtZUxvbmd9ICgke2N0eC5pbnN0YW5jZS5hY3Rpb24ubW9kZWw/LnR5cGVOYW1lfSkgZm9yIGl0ZW0gaWQgJHtjdHgucGFyYW1ldGVycz8uaXRlbUlkfS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmNvbnRleHRMb25nTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHthY3Rpb25Db250ZXh0OiBjdHh9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bkZldGNoPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPik6IE9ic2VydmFibGU8VD4gfCBudWxsO1xuICAgIHB1YmxpYyBzdGF0aWMgcnVuRmV0Y2g8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+LCBmYWxsYmFjazogT2JzZXJ2YWJsZTxUIHwgbnVsbCB8IHVuZGVmaW5lZD4pOiBPYnNlcnZhYmxlPFQgfCBudWxsIHwgdW5kZWZpbmVkPjtcbiAgICBwdWJsaWMgc3RhdGljIHJ1bkZldGNoPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPiwgZmFsbGJhY2s/OiBPYnNlcnZhYmxlPFQgfCBudWxsIHwgdW5kZWZpbmVkPik6IE9ic2VydmFibGU8VCB8IG51bGwgfCB1bmRlZmluZWQ+IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlckV4ZWMgPSBBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkZldGNoRGF0YVByb3ZpZGVyKGN0eCk7XG4gICAgICAgIGlmIChpc09ic2VydmFibGUoZGF0YVByb3ZpZGVyRXhlYykpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhUHJvdmlkZXJFeGVjO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcnZpY2VFeGVjID0gQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5HZXRCeUlkU2VydmljZShjdHgpO1xuICAgICAgICByZXR1cm4gaXNPYnNlcnZhYmxlKHNlcnZpY2VFeGVjKSA/IHNlcnZpY2VFeGVjIDogZmFsbGJhY2sgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bkNyZWF0ZU9yRmFpbDxULCBTPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuQ3JlYXRlKGN0eCkgPz9cbiAgICAgICAgICAgIHRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgbmV3IE1uZ0FjdGlvbkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYERhdGEgcHJvdmlkZXIgYW5kIHNlcnZpY2UgaW5zdGFuY2UgY291bGQgbm90IGV4dHJhY3QgY3JlYXRlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgaW4gYWN0aW9uICR7Y3R4Lmluc3RhbmNlLmFjdGlvbi5hY3Rpb25OYW1lTG9uZ30gKCR7Y3R4Lmluc3RhbmNlLmFjdGlvbi5tb2RlbD8udHlwZU5hbWV9KSBmb3IgaXRlbSAke2N0eC5wYXJhbWV0ZXJzPy5pdGVtfS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmNvbnRleHRMb25nTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHthY3Rpb25Db250ZXh0OiBjdHh9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bkNyZWF0ZTxULCBTPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pOiBPYnNlcnZhYmxlPFQ+IHwgbnVsbDtcbiAgICBwdWJsaWMgc3RhdGljIHJ1bkNyZWF0ZTxULCBTPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4sIGZhbGxiYWNrOiBPYnNlcnZhYmxlPFQgfCBudWxsIHwgdW5kZWZpbmVkPik6IE9ic2VydmFibGU8VCB8IG51bGwgfCB1bmRlZmluZWQ+O1xuICAgIHB1YmxpYyBzdGF0aWMgcnVuQ3JlYXRlPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPiwgZmFsbGJhY2s/OiBPYnNlcnZhYmxlPFQgfCBudWxsIHwgdW5kZWZpbmVkPik6IE9ic2VydmFibGU8VCB8IG51bGwgfCB1bmRlZmluZWQ+IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlckV4ZWMgPSBBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkNyZWF0ZURhdGFQcm92aWRlcihjdHgpO1xuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlKGRhdGFQcm92aWRlckV4ZWMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YVByb3ZpZGVyRXhlYztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJ2aWNlRXhlYyA9IEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuQ3JlYXRlU2VydmljZShjdHgpO1xuICAgICAgICByZXR1cm4gaXNPYnNlcnZhYmxlKHNlcnZpY2VFeGVjKSA/IHNlcnZpY2VFeGVjIDogZmFsbGJhY2sgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJ1blVwZGF0ZU9yRmFpbDxULCBTPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuVXBkYXRlKGN0eCkgPz9cbiAgICAgICAgICAgIHRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgbmV3IE1uZ0FjdGlvbkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYERhdGEgcHJvdmlkZXIgYW5kIHNlcnZpY2UgaW5zdGFuY2UgY291bGQgbm90IGV4dHJhY3QgdXBkYXRlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgaW4gYWN0aW9uICR7Y3R4Lmluc3RhbmNlLmFjdGlvbi5hY3Rpb25OYW1lTG9uZ30gKCR7Y3R4Lmluc3RhbmNlLmFjdGlvbi5tb2RlbD8udHlwZU5hbWV9KSBmb3IgaXRlbSBpZCAke2N0eC5wYXJhbWV0ZXJzPy5pdGVtSWR9LmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguY29udGV4dExvbmdOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAge2FjdGlvbkNvbnRleHQ6IGN0eH1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuVXBkYXRlPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPik6IE9ic2VydmFibGU8VD4gfCBudWxsO1xuICAgIHB1YmxpYyBzdGF0aWMgcnVuVXBkYXRlPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPiwgZmFsbGJhY2s6IE9ic2VydmFibGU8VCB8IG51bGwgfCB1bmRlZmluZWQ+KTogT2JzZXJ2YWJsZTxUIHwgbnVsbCB8IHVuZGVmaW5lZD47XG4gICAgcHVibGljIHN0YXRpYyBydW5VcGRhdGU8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+LCBmYWxsYmFjaz86IE9ic2VydmFibGU8VCB8IG51bGwgfCB1bmRlZmluZWQ+KTogT2JzZXJ2YWJsZTxUIHwgbnVsbCB8IHVuZGVmaW5lZD4gfCBudWxsIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyRXhlYyA9IEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuVXBkYXRlRGF0YVByb3ZpZGVyKGN0eCk7XG4gICAgICAgIGlmIChpc09ic2VydmFibGUoZGF0YVByb3ZpZGVyRXhlYykpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhUHJvdmlkZXJFeGVjO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcnZpY2VFeGVjID0gQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5VcGRhdGVTZXJ2aWNlKGN0eCk7XG4gICAgICAgIHJldHVybiBpc09ic2VydmFibGUoc2VydmljZUV4ZWMpID8gc2VydmljZUV4ZWMgOiBmYWxsYmFjayA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuRGVsZXRlT3JGYWlsPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPik6IE9ic2VydmFibGU8VCB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyRXhlYyA9IEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuRGVsZXRlRGF0YVByb3ZpZGVyKGN0eCk7XG4gICAgICAgIGlmIChpc09ic2VydmFibGUoZGF0YVByb3ZpZGVyRXhlYykpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhUHJvdmlkZXJFeGVjO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcnZpY2VFeGVjID0gQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5EZWxldGVTZXJ2aWNlKGN0eCk7XG4gICAgICAgIHJldHVybiBpc09ic2VydmFibGUoc2VydmljZUV4ZWMpXG4gICAgICAgICAgICA/IHNlcnZpY2VFeGVjXG4gICAgICAgICAgICA6IHRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIG5ldyBNbmdBY3Rpb25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYERhdGEgcHJvdmlkZXIgYW5kIHNlcnZpY2UgaW5zdGFuY2UgY291bGQgbm90IGV4dHJhY3QgZGVsZXRlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgaW4gYWN0aW9uICR7Y3R4Lmluc3RhbmNlLmFjdGlvbi5hY3Rpb25OYW1lTG9uZ30gKCR7Y3R4Lmluc3RhbmNlLmFjdGlvbi5tb2RlbD8udHlwZU5hbWV9KSBmb3IgaXRlbSBpZCAke2N0eC5wYXJhbWV0ZXJzPy5pdGVtSWR9LmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5jb250ZXh0TG9uZ05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHthY3Rpb25Db250ZXh0OiBjdHh9XG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuR2V0QWxsU2VydmljZTxUPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgdW5rbm93bj4pOiBPYnNlcnZhYmxlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PiB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIGN0eC5zZXJ2aWNlSW5zdGFuY2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBnZXRBbGxTZXJ2aWNlSW5zdGFuY2UgPSBjdHguc2VydmljZUluc3RhbmNlIGFzIElNbmdHZXRBbGxBcGlTZXJ2aWNlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZ2V0QWxsU2VydmljZUluc3RhbmNlLmdldEFsbFBvc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtID0gY3R4LnBhcmFtZXRlcnM/LnF1ZXJ5UGFyYW0gPz8gTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlKCkuYnVpbGQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QWxsU2VydmljZUluc3RhbmNlLmdldEFsbFBvc3QocXVlcnlQYXJhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBydW5HZXRCeUlkU2VydmljZTxUPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgdW5rbm93bj4pOiBPYnNlcnZhYmxlPFQ+IHwgbnVsbCB7XG4gICAgICAgIGlmICh0eXBlb2YgY3R4LnNlcnZpY2VJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNydWRTZXJ2aWNlSW5zdGFuY2UgPSBjdHguc2VydmljZUluc3RhbmNlIGFzIElNbmdDcnVkQXBpU2VydmljZTxUPjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3J1ZFNlcnZpY2VJbnN0YW5jZS5nZXRCeUlkR2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5wYXJhbWV0ZXJzPy5pdGVtSWQgPyBjcnVkU2VydmljZUluc3RhbmNlLmdldEJ5SWRHZXQoY3R4LnBhcmFtZXRlcnMuaXRlbUlkKSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBydW5DcmVhdGVTZXJ2aWNlPFQ+KGN0eDogQWN0aW9uQ29udGV4dDxULCB1bmtub3duPik6IE9ic2VydmFibGU8VD4gfCBudWxsIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjdHguc2VydmljZUluc3RhbmNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3J1ZFNlcnZpY2VJbnN0YW5jZSA9IGN0eC5zZXJ2aWNlSW5zdGFuY2UgYXMgSU1uZ0NydWRBcGlTZXJ2aWNlPFQ+O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnVkU2VydmljZUluc3RhbmNlLmNyZWF0ZVBvc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LnBhcmFtZXRlcnM/Lml0ZW0gPyBjcnVkU2VydmljZUluc3RhbmNlLmNyZWF0ZVBvc3QoY3R4LnBhcmFtZXRlcnMuaXRlbSkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuVXBkYXRlU2VydmljZTxUPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgdW5rbm93bj4pOiBPYnNlcnZhYmxlPFQ+IHwgbnVsbCB7XG4gICAgICAgIGlmICh0eXBlb2YgY3R4LnNlcnZpY2VJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNydWRTZXJ2aWNlSW5zdGFuY2UgPSBjdHguc2VydmljZUluc3RhbmNlIGFzIElNbmdDcnVkQXBpU2VydmljZTxUPjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3J1ZFNlcnZpY2VJbnN0YW5jZS51cGRhdGVQdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LnBhcmFtZXRlcnM/Lml0ZW1JZCAmJiBjdHgucGFyYW1ldGVycy5pdGVtID8gY3J1ZFNlcnZpY2VJbnN0YW5jZS51cGRhdGVQdXQoY3R4LnBhcmFtZXRlcnMuaXRlbUlkLCBjdHgucGFyYW1ldGVycy5pdGVtKSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBydW5EZWxldGVTZXJ2aWNlPFQ+KGN0eDogQWN0aW9uQ29udGV4dDxULCB1bmtub3duPik6IE9ic2VydmFibGU8VCB8IG51bGw+IHwgbnVsbCB7XG4gICAgICAgIGlmICh0eXBlb2YgY3R4LnNlcnZpY2VJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNydWRTZXJ2aWNlSW5zdGFuY2UgPSBjdHguc2VydmljZUluc3RhbmNlIGFzIElNbmdDcnVkQXBpU2VydmljZTxUPjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3J1ZFNlcnZpY2VJbnN0YW5jZS5yZW1vdmVEZWxldGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LnBhcmFtZXRlcnM/Lml0ZW1JZCA/IGNydWRTZXJ2aWNlSW5zdGFuY2UucmVtb3ZlRGVsZXRlKGN0eC5wYXJhbWV0ZXJzLml0ZW1JZCwgY3R4LnBhcmFtZXRlcnMuaXRlbSkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuR2V0QWxsRGF0YVByb3ZpZGVyPFQsIFM+KGN0eDogQWN0aW9uQ29udGV4dDxULCBTPik6IE9ic2VydmFibGU8TWVkaXVzUXVlcnlSZXN1bHQ8VD4+IHwgbnVsbCB7XG4gICAgICAgIGlmICh0eXBlb2YgY3R4LmRhdGFQcm92aWRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGN0eC5kYXRhUHJvdmlkZXJbJ2dldEFsbCcgYXMga2V5b2Ygb2JqZWN0XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgdGFibGVEYXRhUHJvdmlkZXIgPSBjdHguZGF0YVByb3ZpZGVyIGFzIElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+O1xuICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbSA9IGN0eC5wYXJhbWV0ZXJzPy5xdWVyeVBhcmFtID8/IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZSgpLmJ1aWxkKCk7XG4gICAgICAgICAgICByZXR1cm4gdGFibGVEYXRhUHJvdmlkZXIuZ2V0QWxsKHF1ZXJ5UGFyYW0sIGN0eC5zZXJ2aWNlSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcnVuRmV0Y2hEYXRhUHJvdmlkZXI8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KTogT2JzZXJ2YWJsZTxUPiB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIGN0eC5kYXRhUHJvdmlkZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBlZGl0b3JEYXRhUHJvdmlkZXIgPSBjdHguZGF0YVByb3ZpZGVyIGFzIElFZGl0b3JEYXRhUHJvdmlkZXI8VCwgYW55PjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWRpdG9yRGF0YVByb3ZpZGVyLmZldGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5wYXJhbWV0ZXJzPy5pdGVtSWQgPyBlZGl0b3JEYXRhUHJvdmlkZXIuZmV0Y2goY3R4LnBhcmFtZXRlcnMuaXRlbUlkLCBjdHguc2VydmljZUluc3RhbmNlLCBjdHgucGFyYW1ldGVycy5sb2NhbGUpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bkNyZWF0ZURhdGFQcm92aWRlcjxULCBTPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pOiBPYnNlcnZhYmxlPFQ+IHwgbnVsbCB7XG4gICAgICAgIGlmICh0eXBlb2YgY3R4LmRhdGFQcm92aWRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRvckRhdGFQcm92aWRlciA9IGN0eC5kYXRhUHJvdmlkZXIgYXMgSUVkaXRvckRhdGFQcm92aWRlcjxULCBhbnk+O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlZGl0b3JEYXRhUHJvdmlkZXIuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5wYXJhbWV0ZXJzPy5pdGVtID8gZWRpdG9yRGF0YVByb3ZpZGVyLmNyZWF0ZShjdHgucGFyYW1ldGVycy5pdGVtLCBjdHguc2VydmljZUluc3RhbmNlKSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBydW5VcGRhdGVEYXRhUHJvdmlkZXI8VCwgUz4oY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KTogT2JzZXJ2YWJsZTxUPiB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIGN0eC5kYXRhUHJvdmlkZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBlZGl0b3JEYXRhUHJvdmlkZXIgPSBjdHguZGF0YVByb3ZpZGVyIGFzIElFZGl0b3JEYXRhUHJvdmlkZXI8VCwgYW55PjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWRpdG9yRGF0YVByb3ZpZGVyLnVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdHgucGFyYW1ldGVycz8uaXRlbUlkID8gZWRpdG9yRGF0YVByb3ZpZGVyLnVwZGF0ZShjdHgucGFyYW1ldGVycy5pdGVtSWQsIGN0eC5wYXJhbWV0ZXJzLml0ZW0sIGN0eC5zZXJ2aWNlSW5zdGFuY2UpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bkRlbGV0ZURhdGFQcm92aWRlcjxULCBTPihjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pOiBPYnNlcnZhYmxlPFQgfCBudWxsPiB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIGN0eC5kYXRhUHJvdmlkZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBlZGl0b3JEYXRhUHJvdmlkZXIgPSBjdHguZGF0YVByb3ZpZGVyIGFzIElFZGl0b3JEYXRhUHJvdmlkZXI8VCwgYW55PjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWRpdG9yRGF0YVByb3ZpZGVyLmRlbGV0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdHgucGFyYW1ldGVycz8uaXRlbUlkID8gZWRpdG9yRGF0YVByb3ZpZGVyLmRlbGV0ZShjdHgucGFyYW1ldGVycy5pdGVtSWQsIGN0eC5wYXJhbWV0ZXJzLml0ZW0sIGN0eC5zZXJ2aWNlSW5zdGFuY2UpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHNlcnZpY2UgaW5zdGFuY2Ugb2YgZGF0YSBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhUHJvdmlkZXIgRGF0YSBwcm92aWRlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERhdGFQcm92aWRlclNlcnZpY2U8VCwgUz4oaW5qZWN0b3I6IEluamVjdG9yLCBkYXRhUHJvdmlkZXI/OiBJRGF0YVByb3ZpZGVyPFQsIFM+KTogUyB8IG51bGwge1xuICAgICAgICBpZiAoZGF0YVByb3ZpZGVyPy5zZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGluamVjdG9yLmdldDxTPihkYXRhUHJvdmlkZXIuc2VydmljZVR5cGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,247 @@
1
+ import { HttpErrorResponse } from '@angular/common/http';
2
+ import { AMngErrorBase, LogLevelEnum, MngActionError, MngHttpError, MngInternalError } from '../models';
3
+ import { StringUtil } from './string.util';
4
+ export class ErrorUtil {
5
+ /**
6
+ * Converts RxJS subscription error to MngError.
7
+ * @param error Error.
8
+ * @param name Optional name to write in mngError.
9
+ * @param details Optional details of error.
10
+ */
11
+ static fromSubscribeError(error, name, details) {
12
+ const opts = {
13
+ name,
14
+ details,
15
+ location: window?.location?.href
16
+ };
17
+ if (error instanceof HttpErrorResponse) {
18
+ return new MngHttpError(error.message ?? 'Http Error occurred', error, opts);
19
+ }
20
+ else {
21
+ opts.cause = error;
22
+ return new MngInternalError(error.message ?? 'Internal Error occurred', opts);
23
+ }
24
+ }
25
+ /**
26
+ * Checks if error is Http error (Angular or Mng).
27
+ * @param error
28
+ */
29
+ static isHttpErrorResponse(error) {
30
+ return error instanceof HttpErrorResponse || error instanceof MngHttpError || (error instanceof MngActionError && error.httpError);
31
+ }
32
+ /**
33
+ * Gets HttpErrorResponse from error (Angular or Mng).
34
+ * @param error Error.
35
+ */
36
+ static getHttpErrorResponse(error) {
37
+ if (error instanceof HttpErrorResponse) {
38
+ return error;
39
+ }
40
+ else if (error instanceof MngHttpError) {
41
+ return error.httpError;
42
+ }
43
+ else if (error instanceof MngActionError) {
44
+ return error.httpError ?? null;
45
+ }
46
+ else {
47
+ return null;
48
+ }
49
+ }
50
+ /**
51
+ * Gets HttpErrorResponse status from error (Angular or Mng).
52
+ * @param error Error.
53
+ */
54
+ static getHttpErrorResponseStatus(error) {
55
+ return ErrorUtil.getHttpErrorResponse(error)?.status ?? null;
56
+ }
57
+ /**
58
+ * Get error log level. All is error, except if error is http error with status >=400 and <500.
59
+ * @param error Error.
60
+ */
61
+ static getErrorLogLevel(error) {
62
+ if (ErrorUtil.isHttpErrorResponse(error)) {
63
+ const status = ErrorUtil.getHttpErrorResponseStatus(error);
64
+ if (status && status >= 400 && status < 500) {
65
+ return LogLevelEnum.Warning;
66
+ }
67
+ }
68
+ return LogLevelEnum.Error;
69
+ }
70
+ /**
71
+ * Get error name (prototype name or type from mng error if name is not provided).
72
+ * @param error Error.
73
+ */
74
+ static getErrorName(error) {
75
+ if (error instanceof AMngErrorBase) {
76
+ return error.name ?? error.type;
77
+ }
78
+ else {
79
+ return error.name;
80
+ }
81
+ }
82
+ /**
83
+ * Writes http error to string with all headers and body.
84
+ * @param error Http response error.
85
+ * @param opts Options for hiding parts of error:
86
+ * - hideMessage Hides message of error (message include url, status and status text!).
87
+ * - hideHeaders Hides headers.
88
+ * - hideBody Hides JSON representation of body.
89
+ */
90
+ static httpErrorResponseToString(error, opts) {
91
+ let str = opts?.hideMessage ? '' : `${error.message}\n`; // message should already include url, status, etc.
92
+ if (!opts?.hideHeaders) {
93
+ str += `Http Response Headers: ${error.headers.keys().reduce((acc, key) => `${acc}[${key}: ${error.headers.get(key)}]`, '')}`;
94
+ }
95
+ if (!opts?.hideBody) {
96
+ str += `\nHttp Response Body: ${StringUtil.stringify(error.error)}`;
97
+ }
98
+ return str;
99
+ }
100
+ /**
101
+ * Error to string.
102
+ * @param error Error.
103
+ * @param opts Options for hiding parts of error:
104
+ * - hideMessage Hides message of error.
105
+ * - hideName Hides error name.
106
+ * - hideCause Hides cause of an error (if present, see @link(errorCauseToString) for other options).
107
+ * - hideStack Hides stack of an error (if present).
108
+ * - hideDetails Hides JSON detail's representation of error (if present).
109
+ * - hideLocation Hides location (URL) where error was thrown.
110
+ * - hideHttp Hides http error portion of error if http error response (see @link(httpErrorResponseToString) for other options).
111
+ */
112
+ static errorToString(error, opts) {
113
+ if (error instanceof AMngErrorBase) {
114
+ return ErrorUtil.mngErrorToString(error, opts);
115
+ }
116
+ else if (error instanceof HttpErrorResponse) {
117
+ return ErrorUtil.httpErrorResponseToString(error, opts);
118
+ }
119
+ const strBlocks = [];
120
+ if (!opts?.hideMessage) {
121
+ strBlocks.push(error.message);
122
+ }
123
+ if (error.name) {
124
+ strBlocks.push(`Error name: ${error.name}`);
125
+ }
126
+ if (!opts?.hideCause) {
127
+ strBlocks.push(ErrorUtil.errorCauseToString(error, opts));
128
+ }
129
+ if (!opts?.hideStack && error.stack) {
130
+ strBlocks.push(`Stack trace:\n${error.stack}`);
131
+ }
132
+ return strBlocks.filter(s => s.trim().length > 0).join('\n');
133
+ }
134
+ /**
135
+ * Mng error to string.
136
+ * @param error Mng error.
137
+ * @param opts Options for hiding parts of error:
138
+ * - hideMessage Hides message of error.
139
+ * - hideName Hides error name.
140
+ * - hideCause Hides cause of an error (if present, see @link(errorCauseToString) for other options).
141
+ * - hideStack Hides stack of an error (if present).
142
+ * - hideDetails Hides JSON detail's representation of error (if present).
143
+ * - hideLocation Hides location (URL) where error was thrown.
144
+ * - hideHttp Hides http error portion of error if http error response (see @link(httpErrorResponseToString) for other options).
145
+ * - hideItems Hides all item information (http body, action context data).
146
+ * - hideActionData See @link(mngActionErrorContextToString) for additional info.
147
+ * - hideQueryParams See @link(mngActionErrorContextToString) for additional info.
148
+ */
149
+ static mngErrorToString(error, opts) {
150
+ const strBlocks = [];
151
+ if (!opts?.hideMessage) {
152
+ strBlocks.push(`${error.message}${error.messageCode ? ` (code: ${error.messageCode})` : ''}`);
153
+ }
154
+ if (!opts?.hideName) {
155
+ strBlocks.push(`Error name: ${error.name ?? error.type} ${error.name ? `(${error.type})` : ''}`);
156
+ }
157
+ if (!opts?.hideLocation && error.location) {
158
+ strBlocks.push(`Location: ${error.location}`);
159
+ }
160
+ let isHttp = false;
161
+ if (!opts?.hideHttp && error instanceof MngHttpError) {
162
+ strBlocks.push(ErrorUtil.httpErrorResponseToString(error.httpError, {
163
+ hideBody: opts?.hideItems || opts?.hideBody,
164
+ hideHeaders: opts?.hideHeaders,
165
+ hideMessage: error.message.indexOf(error.httpError.message) >= 0
166
+ }));
167
+ isHttp = true;
168
+ }
169
+ if (error instanceof MngActionError) {
170
+ if (error.actionContext) {
171
+ strBlocks.push(ErrorUtil.mngActionErrorContextToString(error, opts));
172
+ }
173
+ if (!opts?.hideHttp && error.httpError) {
174
+ strBlocks.push(ErrorUtil.httpErrorResponseToString(error.httpError, {
175
+ hideBody: opts?.hideItems || opts?.hideBody,
176
+ hideHeaders: opts?.hideHeaders,
177
+ hideMessage: error.message.indexOf(error.httpError.message) >= 0
178
+ }));
179
+ isHttp = true;
180
+ }
181
+ }
182
+ if (!opts?.hideDetails && error.details) {
183
+ strBlocks.push(`Details: ${StringUtil.stringify(error.details)}`);
184
+ }
185
+ if (!opts?.hideCause && (!isHttp || !(error.cause instanceof HttpErrorResponse))) {
186
+ strBlocks.push(ErrorUtil.errorCauseToString(error, opts));
187
+ }
188
+ if (!opts?.hideStack && error.stack) {
189
+ strBlocks.push(`Stack trace:\n${error.stack}`);
190
+ }
191
+ return strBlocks.filter(s => s.trim().length > 0).join('\n');
192
+ }
193
+ /**
194
+ * Writes Mng action error info from context as string.
195
+ * @param error Mng action error.
196
+ * @param opts Options for hiding parts of error:
197
+ * - hideItems Hides all item related information (item, form item, submit item, ...).
198
+ * - hideActionData Hides action data.
199
+ * - hideQueryParams Hides query params.
200
+ */
201
+ static mngActionErrorContextToString(error, opts) {
202
+ let paramsMessage = '';
203
+ if (error.actionContext?.parameters) {
204
+ if (error.actionContext?.parameters.itemId) {
205
+ paramsMessage += `[itemId: ${error.actionContext.parameters.itemId}]`;
206
+ }
207
+ if (!opts?.hideItems && error.actionContext?.parameters.item) {
208
+ paramsMessage += `[item: ${StringUtil.stringify(error.actionContext.parameters.item)}]`;
209
+ }
210
+ if (!opts?.hideActionData && error.actionContext?.parameters.actionData) {
211
+ paramsMessage += Object.entries(error.actionContext?.parameters.actionData).reduce((acc, [key, value]) => `${acc}[actionData ${key}: ${StringUtil.stringify(value)}]`, '');
212
+ }
213
+ if (!opts?.hideQueryParams && error.actionContext?.parameters.queryParam) {
214
+ paramsMessage += `[queryParam: ${StringUtil.stringify(error.actionContext.parameters.queryParam)}]`;
215
+ }
216
+ if (!opts?.hideItems && error.actionContext?.parameters.formItem) {
217
+ paramsMessage += `[formItem: ${StringUtil.stringify(error.actionContext.parameters.formItem)}]`;
218
+ }
219
+ if (!opts?.hideItems && error.actionContext?.parameters.submitResult) {
220
+ paramsMessage += `[formItem: ${StringUtil.stringify(error.actionContext.parameters.submitResult)}]`;
221
+ }
222
+ if (error.actionContext?.parameters.locale) {
223
+ paramsMessage += `[locale: ${StringUtil.stringify(error.actionContext.parameters.locale)}]`;
224
+ }
225
+ }
226
+ return paramsMessage;
227
+ }
228
+ /**
229
+ * Writes cause of an error as string.
230
+ * @param error Error.
231
+ * @param opts Options for hiding parts of error:
232
+ * - causeOnErrorOnly Prints only if cause is instance of error.
233
+ * - causeAsJson Print error cause as a JSON (by default, if error only message and name will be printed).
234
+ */
235
+ static errorCauseToString(error, opts) {
236
+ // if already logged as http error, check that cause is not also http error (cause it is usually duplicated)
237
+ if (error.cause && (!opts?.causeOnErrorOnly || error.cause instanceof Error)) {
238
+ const stringify = opts?.causeAsJson || !(error.cause instanceof Error);
239
+ if (!opts?.causeOnErrorOnly || error.cause instanceof Error) {
240
+ return ('Caused by: ' +
241
+ (stringify ? StringUtil.stringify(error.cause) : `${error.cause.message}${error.cause.name ? ` (${error.cause.name})` : ''}`));
242
+ }
243
+ }
244
+ return '';
245
+ }
246
+ }
247
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMvZXJyb3IudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQXVCLFlBQVksRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMzSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE1BQU0sT0FBTyxTQUFTO0lBQ2xCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQVUsRUFBRSxJQUFhLEVBQUUsT0FBYTtRQUNyRSxNQUFNLElBQUksR0FBd0I7WUFDOUIsSUFBSTtZQUNKLE9BQU87WUFDUCxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJO1NBQ25DLENBQUM7UUFFRixJQUFJLEtBQUssWUFBWSxpQkFBaUIsRUFBRTtZQUNwQyxPQUFPLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUkscUJBQXFCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2hGO2FBQU07WUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixPQUFPLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSx5QkFBeUIsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNqRjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBVTtRQUN4QyxPQUFPLEtBQUssWUFBWSxpQkFBaUIsSUFBSSxLQUFLLFlBQVksWUFBWSxJQUFJLENBQUMsS0FBSyxZQUFZLGNBQWMsSUFBSyxLQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNKLENBQUM7SUFFRDs7O09B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QUFDLENBQUMsQ0FBQyxLQUFNLEtBQUssQ0FBQyxLQUFlLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ2pLLENBQUM7YUFDTDtTQUNKO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmltcG9ydCB7QU1uZ0Vycm9yQmFzZSwgTG9nTGV2ZWxFbnVtLCBNbmdBY3Rpb25FcnJvciwgTW5nRXJyb3JCYXNlT3B0aW9ucywgTW5nSHR0cEVycm9yLCBNbmdJbnRlcm5hbEVycm9yfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtTdHJpbmdVdGlsfSBmcm9tICcuL3N0cmluZy51dGlsJztcblxuZXhwb3J0IGNsYXNzIEVycm9yVXRpbCB7XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgUnhKUyBzdWJzY3JpcHRpb24gZXJyb3IgdG8gTW5nRXJyb3IuXG4gICAgICogQHBhcmFtIGVycm9yIEVycm9yLlxuICAgICAqIEBwYXJhbSBuYW1lIE9wdGlvbmFsIG5hbWUgdG8gd3JpdGUgaW4gbW5nRXJyb3IuXG4gICAgICogQHBhcmFtIGRldGFpbHMgT3B0aW9uYWwgZGV0YWlscyBvZiBlcnJvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21TdWJzY3JpYmVFcnJvcihlcnJvcjogYW55LCBuYW1lPzogc3RyaW5nLCBkZXRhaWxzPzogYW55KTogQU1uZ0Vycm9yQmFzZSB7XG4gICAgICAgIGNvbnN0IG9wdHM6IE1uZ0Vycm9yQmFzZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGV0YWlscyxcbiAgICAgICAgICAgIGxvY2F0aW9uOiB3aW5kb3c/LmxvY2F0aW9uPy5ocmVmXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW5nSHR0cEVycm9yKGVycm9yLm1lc3NhZ2UgPz8gJ0h0dHAgRXJyb3Igb2NjdXJyZWQnLCBlcnJvciwgb3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRzLmNhdXNlID0gZXJyb3I7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1uZ0ludGVybmFsRXJyb3IoZXJyb3IubWVzc2FnZSA/PyAnSW50ZXJuYWwgRXJyb3Igb2NjdXJyZWQnLCBvcHRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBlcnJvciBpcyBIdHRwIGVycm9yIChBbmd1bGFyIG9yIE1uZykuXG4gICAgICogQHBhcmFtIGVycm9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0h0dHBFcnJvclJlc3BvbnNlKGVycm9yOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgfHwgZXJyb3IgaW5zdGFuY2VvZiBNbmdIdHRwRXJyb3IgfHwgKGVycm9yIGluc3RhbmNlb2YgTW5nQWN0aW9uRXJyb3IgJiYgKGVycm9yIGFzIE1uZ0FjdGlvbkVycm9yKS5odHRwRXJyb3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgSHR0cEVycm9yUmVzcG9uc2UgZnJvbSBlcnJvciAoQW5ndWxhciBvciBNbmcpLlxuICAgICAqIEBwYXJhbSBlcnJvciBFcnJvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEh0dHBFcnJvclJlc3BvbnNlKGVycm9yOiBhbnkpOiBIdHRwRXJyb3JSZXNwb25zZSB8IG51bGwge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgTW5nSHR0cEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3IuaHR0cEVycm9yO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgTW5nQWN0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvci5odHRwRXJyb3IgPz8gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBIdHRwRXJyb3JSZXNwb25zZSBzdGF0dXMgZnJvbSBlcnJvciAoQW5ndWxhciBvciBNbmcpLlxuICAgICAqIEBwYXJhbSBlcnJvciBFcnJvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEh0dHBFcnJvclJlc3BvbnNlU3RhdHVzKGVycm9yOiBhbnkpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIEVycm9yVXRpbC5nZXRIdHRwRXJyb3JSZXNwb25zZShlcnJvcik/LnN0YXR1cyA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBlcnJvciBsb2cgbGV2ZWwuIEFsbCBpcyBlcnJvciwgZXhjZXB0IGlmIGVycm9yIGlzIGh0dHAgZXJyb3Igd2l0aCBzdGF0dXMgPj00MDAgYW5kIDw1MDAuXG4gICAgICogQHBhcmFtIGVycm9yIEVycm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RXJyb3JMb2dMZXZlbChlcnJvcjogYW55KTogTG9nTGV2ZWxFbnVtIHtcbiAgICAgICAgaWYgKEVycm9yVXRpbC5pc0h0dHBFcnJvclJlc3BvbnNlKGVycm9yKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gRXJyb3JVdGlsLmdldEh0dHBFcnJvclJlc3BvbnNlU3RhdHVzKGVycm9yKTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgJiYgc3RhdHVzID49IDQwMCAmJiBzdGF0dXMgPCA1MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTG9nTGV2ZWxFbnVtLldhcm5pbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIExvZ0xldmVsRW51bS5FcnJvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZXJyb3IgbmFtZSAocHJvdG90eXBlIG5hbWUgb3IgdHlwZSBmcm9tIG1uZyBlcnJvciBpZiBuYW1lIGlzIG5vdCBwcm92aWRlZCkuXG4gICAgICogQHBhcmFtIGVycm9yIEVycm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RXJyb3JOYW1lKGVycm9yOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBTW5nRXJyb3JCYXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3IubmFtZSA/PyBlcnJvci50eXBlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yLm5hbWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgaHR0cCBlcnJvciB0byBzdHJpbmcgd2l0aCBhbGwgaGVhZGVycyBhbmQgYm9keS5cbiAgICAgKiBAcGFyYW0gZXJyb3IgSHR0cCByZXNwb25zZSBlcnJvci5cbiAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIGZvciBoaWRpbmcgcGFydHMgb2YgZXJyb3I6XG4gICAgICogIC0gaGlkZU1lc3NhZ2UgSGlkZXMgbWVzc2FnZSBvZiBlcnJvciAobWVzc2FnZSBpbmNsdWRlIHVybCwgc3RhdHVzIGFuZCBzdGF0dXMgdGV4dCEpLlxuICAgICAqICAtIGhpZGVIZWFkZXJzIEhpZGVzIGhlYWRlcnMuXG4gICAgICogIC0gaGlkZUJvZHkgSGlkZXMgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBib2R5LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaHR0cEVycm9yUmVzcG9uc2VUb1N0cmluZyhlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UsIG9wdHM/OiBIdHRwRXJyb3JSZXNwb25zZVRvU3RyaW5nT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBzdHIgPSBvcHRzPy5oaWRlTWVzc2FnZSA/ICcnIDogYCR7ZXJyb3IubWVzc2FnZX1cXG5gOyAvLyBtZXNzYWdlIHNob3VsZCBhbHJlYWR5IGluY2x1ZGUgdXJsLCBzdGF0dXMsIGV0Yy5cbiAgICAgICAgaWYgKCFvcHRzPy5oaWRlSGVhZGVycykge1xuICAgICAgICAgICAgc3RyICs9IGBIdHRwIFJlc3BvbnNlIEhlYWRlcnM6ICR7ZXJyb3IuaGVhZGVycy5rZXlzKCkucmVkdWNlKChhY2MsIGtleSkgPT4gYCR7YWNjfVske2tleX06ICR7ZXJyb3IuaGVhZGVycy5nZXQoa2V5KX1dYCwgJycpfWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRzPy5oaWRlQm9keSkge1xuICAgICAgICAgICAgc3RyICs9IGBcXG5IdHRwIFJlc3BvbnNlIEJvZHk6ICR7U3RyaW5nVXRpbC5zdHJpbmdpZnkoZXJyb3IuZXJyb3IpfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFcnJvciB0byBzdHJpbmcuXG4gICAgICogQHBhcmFtIGVycm9yIEVycm9yLlxuICAgICAqIEBwYXJhbSBvcHRzIE9wdGlvbnMgZm9yIGhpZGluZyBwYXJ0cyBvZiBlcnJvcjpcbiAgICAgKiAtIGhpZGVNZXNzYWdlIEhpZGVzIG1lc3NhZ2Ugb2YgZXJyb3IuXG4gICAgICogLSBoaWRlTmFtZSBIaWRlcyBlcnJvciBuYW1lLlxuICAgICAqIC0gaGlkZUNhdXNlIEhpZGVzIGNhdXNlIG9mIGFuIGVycm9yIChpZiBwcmVzZW50LCBzZWUgQGxpbmsoZXJyb3JDYXVzZVRvU3RyaW5nKSBmb3Igb3RoZXIgb3B0aW9ucykuXG4gICAgICogLSBoaWRlU3RhY2sgSGlkZXMgc3RhY2sgb2YgYW4gZXJyb3IgKGlmIHByZXNlbnQpLlxuICAgICAqIC0gaGlkZURldGFpbHMgSGlkZXMgSlNPTiBkZXRhaWwncyByZXByZXNlbnRhdGlvbiBvZiBlcnJvciAoaWYgcHJlc2VudCkuXG4gICAgICogLSBoaWRlTG9jYXRpb24gSGlkZXMgbG9jYXRpb24gKFVSTCkgd2hlcmUgZXJyb3Igd2FzIHRocm93bi5cbiAgICAgKiAtIGhpZGVIdHRwIEhpZGVzIGh0dHAgZXJyb3IgcG9ydGlvbiBvZiBlcnJvciBpZiBodHRwIGVycm9yIHJlc3BvbnNlIChzZWUgQGxpbmsoaHR0cEVycm9yUmVzcG9uc2VUb1N0cmluZykgZm9yIG90aGVyIG9wdGlvbnMpLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZXJyb3JUb1N0cmluZyhlcnJvcjogRXJyb3IsIG9wdHM/OiBFcnJvclRvU3RyaW5nT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFNbmdFcnJvckJhc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBFcnJvclV0aWwubW5nRXJyb3JUb1N0cmluZyhlcnJvciwgb3B0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgcmV0dXJuIEVycm9yVXRpbC5odHRwRXJyb3JSZXNwb25zZVRvU3RyaW5nKGVycm9yLCBvcHRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0ckJsb2Nrczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKCFvcHRzPy5oaWRlTWVzc2FnZSkge1xuICAgICAgICAgICAgc3RyQmxvY2tzLnB1c2goZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yLm5hbWUpIHtcbiAgICAgICAgICAgIHN0ckJsb2Nrcy5wdXNoKGBFcnJvciBuYW1lOiAke2Vycm9yLm5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRzPy5oaWRlQ2F1c2UpIHtcbiAgICAgICAgICAgIHN0ckJsb2Nrcy5wdXNoKEVycm9yVXRpbC5lcnJvckNhdXNlVG9TdHJpbmcoZXJyb3IsIG9wdHMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdHM/LmhpZGVTdGFjayAmJiBlcnJvci5zdGFjaykge1xuICAgICAgICAgICAgc3RyQmxvY2tzLnB1c2goYFN0YWNrIHRyYWNlOlxcbiR7ZXJyb3Iuc3RhY2t9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RyQmxvY2tzLmZpbHRlcihzID0+IHMudHJpbSgpLmxlbmd0aCA+IDApLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1uZyBlcnJvciB0byBzdHJpbmcuXG4gICAgICogQHBhcmFtIGVycm9yIE1uZyBlcnJvci5cbiAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIGZvciBoaWRpbmcgcGFydHMgb2YgZXJyb3I6XG4gICAgICogLSBoaWRlTWVzc2FnZSBIaWRlcyBtZXNzYWdlIG9mIGVycm9yLlxuICAgICAqIC0gaGlkZU5hbWUgSGlkZXMgZXJyb3IgbmFtZS5cbiAgICAgKiAtIGhpZGVDYXVzZSBIaWRlcyBjYXVzZSBvZiBhbiBlcnJvciAoaWYgcHJlc2VudCwgc2VlIEBsaW5rKGVycm9yQ2F1c2VUb1N0cmluZykgZm9yIG90aGVyIG9wdGlvbnMpLlxuICAgICAqIC0gaGlkZVN0YWNrIEhpZGVzIHN0YWNrIG9mIGFuIGVycm9yIChpZiBwcmVzZW50KS5cbiAgICAgKiAtIGhpZGVEZXRhaWxzIEhpZGVzIEpTT04gZGV0YWlsJ3MgcmVwcmVzZW50YXRpb24gb2YgZXJyb3IgKGlmIHByZXNlbnQpLlxuICAgICAqIC0gaGlkZUxvY2F0aW9uIEhpZGVzIGxvY2F0aW9uIChVUkwpIHdoZXJlIGVycm9yIHdhcyB0aHJvd24uXG4gICAgICogLSBoaWRlSHR0cCBIaWRlcyBodHRwIGVycm9yIHBvcnRpb24gb2YgZXJyb3IgaWYgaHR0cCBlcnJvciByZXNwb25zZSAoc2VlIEBsaW5rKGh0dHBFcnJvclJlc3BvbnNlVG9TdHJpbmcpIGZvciBvdGhlciBvcHRpb25zKS5cbiAgICAgKiAtIGhpZGVJdGVtcyBIaWRlcyBhbGwgaXRlbSBpbmZvcm1hdGlvbiAoaHR0cCBib2R5LCBhY3Rpb24gY29udGV4dCBkYXRhKS5cbiAgICAgKiAtIGhpZGVBY3Rpb25EYXRhIFNlZSBAbGluayhtbmdBY3Rpb25FcnJvckNvbnRleHRUb1N0cmluZykgZm9yIGFkZGl0aW9uYWwgaW5mby5cbiAgICAgKiAtIGhpZGVRdWVyeVBhcmFtcyBTZWUgQGxpbmsobW5nQWN0aW9uRXJyb3JDb250ZXh0VG9TdHJpbmcpIGZvciBhZGRpdGlvbmFsIGluZm8uXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBtbmdFcnJvclRvU3RyaW5nKGVycm9yOiBBTW5nRXJyb3JCYXNlLCBvcHRzPzogTW5nRXJyb3JUb1N0cmluZ09wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzdHJCbG9ja3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICghb3B0cz8uaGlkZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHN0ckJsb2Nrcy5wdXNoKGAke2Vycm9yLm1lc3NhZ2V9JHtlcnJvci5tZXNzYWdlQ29kZSA/IGAgKGNvZGU6ICR7ZXJyb3IubWVzc2FnZUNvZGV9KWAgOiAnJ31gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdHM/LmhpZGVOYW1lKSB7XG4gICAgICAgICAgICBzdHJCbG9ja3MucHVzaChgRXJyb3IgbmFtZTogJHtlcnJvci5uYW1lID8/IGVycm9yLnR5cGV9ICR7ZXJyb3IubmFtZSA/IGAoJHtlcnJvci50eXBlfSlgIDogJyd9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRzPy5oaWRlTG9jYXRpb24gJiYgZXJyb3IubG9jYXRpb24pIHtcbiAgICAgICAgICAgIHN0ckJsb2Nrcy5wdXNoKGBMb2NhdGlvbjogJHtlcnJvci5sb2NhdGlvbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc0h0dHAgPSBmYWxzZTtcbiAgICAgICAgaWYgKCFvcHRzPy5oaWRlSHR0cCAmJiBlcnJvciBpbnN0YW5jZW9mIE1uZ0h0dHBFcnJvcikge1xuICAgICAgICAgICAgc3RyQmxvY2tzLnB1c2goXG4gICAgICAgICAgICAgICAgRXJyb3JVdGlsLmh0dHBFcnJvclJlc3BvbnNlVG9TdHJpbmcoZXJyb3IuaHR0cEVycm9yLCB7XG4gICAgICAgICAgICAgICAgICAgIGhpZGVCb2R5OiBvcHRzPy5oaWRlSXRlbXMgfHwgb3B0cz8uaGlkZUJvZHksXG4gICAgICAgICAgICAgICAgICAgIGhpZGVIZWFkZXJzOiBvcHRzPy5oaWRlSGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgaGlkZU1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UuaW5kZXhPZihlcnJvci5odHRwRXJyb3IubWVzc2FnZSkgPj0gMFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaXNIdHRwID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBNbmdBY3Rpb25FcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLmFjdGlvbkNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBzdHJCbG9ja3MucHVzaChFcnJvclV0aWwubW5nQWN0aW9uRXJyb3JDb250ZXh0VG9TdHJpbmcoZXJyb3IsIG9wdHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0cz8uaGlkZUh0dHAgJiYgZXJyb3IuaHR0cEVycm9yKSB7XG4gICAgICAgICAgICAgICAgc3RyQmxvY2tzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIEVycm9yVXRpbC5odHRwRXJyb3JSZXNwb25zZVRvU3RyaW5nKGVycm9yLmh0dHBFcnJvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZUJvZHk6IG9wdHM/LmhpZGVJdGVtcyB8fCBvcHRzPy5oaWRlQm9keSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVIZWFkZXJzOiBvcHRzPy5oaWRlSGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVNZXNzYWdlOiBlcnJvci5tZXNzYWdlLmluZGV4T2YoZXJyb3IuaHR0cEVycm9yLm1lc3NhZ2UpID49IDBcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlzSHR0cCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9wdHM/LmhpZGVEZXRhaWxzICYmIGVycm9yLmRldGFpbHMpIHtcbiAgICAgICAgICAgIHN0ckJsb2Nrcy5wdXNoKGBEZXRhaWxzOiAke1N0cmluZ1V0aWwuc3RyaW5naWZ5KGVycm9yLmRldGFpbHMpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0cz8uaGlkZUNhdXNlICYmICghaXNIdHRwIHx8ICEoZXJyb3IuY2F1c2UgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkpKSB7XG4gICAgICAgICAgICBzdHJCbG9ja3MucHVzaChFcnJvclV0aWwuZXJyb3JDYXVzZVRvU3RyaW5nKGVycm9yLCBvcHRzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRzPy5oaWRlU3RhY2sgJiYgZXJyb3Iuc3RhY2spIHtcbiAgICAgICAgICAgIHN0ckJsb2Nrcy5wdXNoKGBTdGFjayB0cmFjZTpcXG4ke2Vycm9yLnN0YWNrfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0ckJsb2Nrcy5maWx0ZXIocyA9PiBzLnRyaW0oKS5sZW5ndGggPiAwKS5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgTW5nIGFjdGlvbiBlcnJvciBpbmZvIGZyb20gY29udGV4dCBhcyBzdHJpbmcuXG4gICAgICogQHBhcmFtIGVycm9yIE1uZyBhY3Rpb24gZXJyb3IuXG4gICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyBmb3IgaGlkaW5nIHBhcnRzIG9mIGVycm9yOlxuICAgICAqIC0gaGlkZUl0ZW1zIEhpZGVzIGFsbCBpdGVtIHJlbGF0ZWQgaW5mb3JtYXRpb24gKGl0ZW0sIGZvcm0gaXRlbSwgc3VibWl0IGl0ZW0sIC4uLikuXG4gICAgICogLSBoaWRlQWN0aW9uRGF0YSBIaWRlcyBhY3Rpb24gZGF0YS5cbiAgICAgKiAtIGhpZGVRdWVyeVBhcmFtcyBIaWRlcyBxdWVyeSBwYXJhbXMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBtbmdBY3Rpb25FcnJvckNvbnRleHRUb1N0cmluZyhlcnJvcjogTW5nQWN0aW9uRXJyb3IsIG9wdHM/OiBNbmdBY3Rpb25FcnJvckNvbnRleHRUb1N0cmluZ09wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcGFyYW1zTWVzc2FnZSA9ICcnO1xuICAgICAgICBpZiAoZXJyb3IuYWN0aW9uQ29udGV4dD8ucGFyYW1ldGVycykge1xuICAgICAgICAgICAgaWYgKGVycm9yLmFjdGlvbkNvbnRleHQ/LnBhcmFtZXRlcnMuaXRlbUlkKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zTWVzc2FnZSArPSBgW2l0ZW1JZDogJHtlcnJvci5hY3Rpb25Db250ZXh0LnBhcmFtZXRlcnMuaXRlbUlkfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRzPy5oaWRlSXRlbXMgJiYgZXJyb3IuYWN0aW9uQ29udGV4dD8ucGFyYW1ldGVycy5pdGVtKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zTWVzc2FnZSArPSBgW2l0ZW06ICR7U3RyaW5nVXRpbC5zdHJpbmdpZnkoZXJyb3IuYWN0aW9uQ29udGV4dC5wYXJhbWV0ZXJzLml0ZW0pfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRzPy5oaWRlQWN0aW9uRGF0YSAmJiBlcnJvci5hY3Rpb25Db250ZXh0Py5wYXJhbWV0ZXJzLmFjdGlvbkRhdGEpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXNNZXNzYWdlICs9IE9iamVjdC5lbnRyaWVzKGVycm9yLmFjdGlvbkNvbnRleHQ/LnBhcmFtZXRlcnMuYWN0aW9uRGF0YSkucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+IGAke2FjY31bYWN0aW9uRGF0YSAke2tleX06ICR7U3RyaW5nVXRpbC5zdHJpbmdpZnkodmFsdWUpfV1gLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW9wdHM/LmhpZGVRdWVyeVBhcmFtcyAmJiBlcnJvci5hY3Rpb25Db250ZXh0Py5wYXJhbWV0ZXJzLnF1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgICAgICBwYXJhbXNNZXNzYWdlICs9IGBbcXVlcnlQYXJhbTogJHtTdHJpbmdVdGlsLnN0cmluZ2lmeShlcnJvci5hY3Rpb25Db250ZXh0LnBhcmFtZXRlcnMucXVlcnlQYXJhbSl9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW9wdHM/LmhpZGVJdGVtcyAmJiBlcnJvci5hY3Rpb25Db250ZXh0Py5wYXJhbWV0ZXJzLmZvcm1JdGVtKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zTWVzc2FnZSArPSBgW2Zvcm1JdGVtOiAke1N0cmluZ1V0aWwuc3RyaW5naWZ5KGVycm9yLmFjdGlvbkNvbnRleHQucGFyYW1ldGVycy5mb3JtSXRlbSl9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW9wdHM/LmhpZGVJdGVtcyAmJiBlcnJvci5hY3Rpb25Db250ZXh0Py5wYXJhbWV0ZXJzLnN1Ym1pdFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHBhcmFtc01lc3NhZ2UgKz0gYFtmb3JtSXRlbTogJHtTdHJpbmdVdGlsLnN0cmluZ2lmeShlcnJvci5hY3Rpb25Db250ZXh0LnBhcmFtZXRlcnMuc3VibWl0UmVzdWx0KX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvci5hY3Rpb25Db250ZXh0Py5wYXJhbWV0ZXJzLmxvY2FsZSkge1xuICAgICAgICAgICAgICAgIHBhcmFtc01lc3NhZ2UgKz0gYFtsb2NhbGU6ICR7U3RyaW5nVXRpbC5zdHJpbmdpZnkoZXJyb3IuYWN0aW9uQ29udGV4dC5wYXJhbWV0ZXJzLmxvY2FsZSl9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyYW1zTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgY2F1c2Ugb2YgYW4gZXJyb3IgYXMgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBlcnJvciBFcnJvci5cbiAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIGZvciBoaWRpbmcgcGFydHMgb2YgZXJyb3I6XG4gICAgICogLSBjYXVzZU9uRXJyb3JPbmx5IFByaW50cyBvbmx5IGlmIGNhdXNlIGlzIGluc3RhbmNlIG9mIGVycm9yLlxuICAgICAqIC0gY2F1c2VBc0pzb24gUHJpbnQgZXJyb3IgY2F1c2UgYXMgYSBKU09OIChieSBkZWZhdWx0LCBpZiBlcnJvciBvbmx5IG1lc3NhZ2UgYW5kIG5hbWUgd2lsbCBiZSBwcmludGVkKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGVycm9yQ2F1c2VUb1N0cmluZyhlcnJvcjogRXJyb3IsIG9wdHM/OiBFcnJvckNhdXNlVG9TdHJpbmdPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgLy8gaWYgYWxyZWFkeSBsb2dnZWQgYXMgaHR0cCBlcnJvciwgY2hlY2sgdGhhdCBjYXVzZSBpcyBub3QgYWxzbyBodHRwIGVycm9yIChjYXVzZSBpdCBpcyB1c3VhbGx5IGR1cGxpY2F0ZWQpXG4gICAgICAgIGlmIChlcnJvci5jYXVzZSAmJiAoIW9wdHM/LmNhdXNlT25FcnJvck9ubHkgfHwgZXJyb3IuY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ2lmeSA9IG9wdHM/LmNhdXNlQXNKc29uIHx8ICEoZXJyb3IuY2F1c2UgaW5zdGFuY2VvZiBFcnJvcik7XG4gICAgICAgICAgICBpZiAoIW9wdHM/LmNhdXNlT25FcnJvck9ubHkgfHwgZXJyb3IuY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdDYXVzZWQgYnk6ICcgK1xuICAgICAgICAgICAgICAgICAgICAoc3RyaW5naWZ5ID8gU3RyaW5nVXRpbC5zdHJpbmdpZnkoZXJyb3IuY2F1c2UpIDogYCR7KGVycm9yLmNhdXNlIGFzIEVycm9yKS5tZXNzYWdlfSR7KGVycm9yLmNhdXNlIGFzIEVycm9yKS5uYW1lID8gYCAoJHsoZXJyb3IuY2F1c2UgYXMgRXJyb3IpLm5hbWV9KWAgOiAnJ31gKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRXJyb3JUb1N0cmluZ09wdGlvbnMgPSBNbmdFcnJvclRvU3RyaW5nT3B0aW9ucztcblxuZXhwb3J0IHR5cGUgTW5nRXJyb3JUb1N0cmluZ09wdGlvbnMgPSBFcnJvclRvU3RyaW5nT3B0aW9uc0Jhc2UgJlxuICAgIEh0dHBFcnJvclJlc3BvbnNlVG9TdHJpbmdPcHRpb25zICZcbiAgICBNbmdBY3Rpb25FcnJvckNvbnRleHRUb1N0cmluZ09wdGlvbnMgJlxuICAgIEVycm9yQ2F1c2VUb1N0cmluZ09wdGlvbnMgJiB7XG4gICAgICAgIGhpZGVEZXRhaWxzPzogYm9vbGVhbjtcbiAgICAgICAgaGlkZUxvY2F0aW9uPzogYm9vbGVhbjtcbiAgICB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yVG9TdHJpbmdPcHRpb25zQmFzZSB7XG4gICAgaGlkZU5hbWU/OiBib29sZWFuO1xuICAgIGhpZGVTdGFjaz86IGJvb2xlYW47XG4gICAgaGlkZUNhdXNlPzogYm9vbGVhbjtcbiAgICBoaWRlSHR0cD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cEVycm9yUmVzcG9uc2VUb1N0cmluZ09wdGlvbnMge1xuICAgIGhpZGVNZXNzYWdlPzogYm9vbGVhbjtcbiAgICBoaWRlSGVhZGVycz86IGJvb2xlYW47XG4gICAgaGlkZUJvZHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1uZ0FjdGlvbkVycm9yQ29udGV4dFRvU3RyaW5nT3B0aW9ucyB7XG4gICAgaGlkZUl0ZW1zPzogYm9vbGVhbjtcbiAgICBoaWRlQWN0aW9uRGF0YT86IGJvb2xlYW47XG4gICAgaGlkZVF1ZXJ5UGFyYW1zPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckNhdXNlVG9TdHJpbmdPcHRpb25zIHtcbiAgICBjYXVzZU9uRXJyb3JPbmx5PzogYm9vbGVhbjtcbiAgICBjYXVzZUFzSnNvbj86IGJvb2xlYW47XG59XG4iXX0=