@rosoftlab/core 1.0.0-alpha-0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. package/README.md +27 -0
  2. package/esm2022/lib/base-components/base-form-edit.component.mjs +239 -0
  3. package/esm2022/lib/base-components/field-error-display/field-error-display.component.mjs +15 -0
  4. package/esm2022/lib/base-components/index.mjs +4 -0
  5. package/esm2022/lib/base-components/page-not-found/page-not-found.component.mjs +15 -0
  6. package/esm2022/lib/base-components/under-construction/under-construction.component.mjs +12 -0
  7. package/esm2022/lib/configurations.mjs +8 -0
  8. package/esm2022/lib/constants/symbols.mjs +3 -0
  9. package/esm2022/lib/converters/date/date.converter.mjs +20 -0
  10. package/esm2022/lib/core.mjs +8 -0
  11. package/esm2022/lib/decorators/attribute.decorator.mjs +87 -0
  12. package/esm2022/lib/decorators/base-datastore-config.decorator.mjs +7 -0
  13. package/esm2022/lib/decorators/base-model-config.decorator.mjs +10 -0
  14. package/esm2022/lib/decorators/custom.type.decorator.mjs +11 -0
  15. package/esm2022/lib/directives/translated-content.directive.mjs +97 -0
  16. package/esm2022/lib/directives/translated-element.directive.mjs +20 -0
  17. package/esm2022/lib/grid-layout-format.enum.mjs +15 -0
  18. package/esm2022/lib/index.mjs +26 -0
  19. package/esm2022/lib/interceptors/cache.interceptor.mjs +52 -0
  20. package/esm2022/lib/interceptors/index.mjs +2 -0
  21. package/esm2022/lib/interfaces/attribute-decorator-options.interface.mjs +2 -0
  22. package/esm2022/lib/interfaces/datastore-config.interface.mjs +2 -0
  23. package/esm2022/lib/interfaces/model-config.interface.mjs +2 -0
  24. package/esm2022/lib/interfaces/overrides.interface.mjs +2 -0
  25. package/esm2022/lib/interfaces/property-converter.interface.mjs +2 -0
  26. package/esm2022/lib/models/base-meta.model.mjs +7 -0
  27. package/esm2022/lib/models/base-query-data.mjs +13 -0
  28. package/esm2022/lib/models/base.model.mjs +158 -0
  29. package/esm2022/lib/models/error-response.model.mjs +9 -0
  30. package/esm2022/lib/models/rule.mjs +6 -0
  31. package/esm2022/lib/pipes/Nl2brPipe.pipe.mjs +21 -0
  32. package/esm2022/lib/pipes/input-error.pipe.mjs +38 -0
  33. package/esm2022/lib/providers.mjs +12 -0
  34. package/esm2022/lib/resolvers/dynamically-class-resolver.mjs +22 -0
  35. package/esm2022/lib/resolvers/dynamically-service-resolver.mjs +22 -0
  36. package/esm2022/lib/resolvers/index.mjs +3 -0
  37. package/esm2022/lib/rsl-base-module.mjs +64 -0
  38. package/esm2022/lib/services/base-datastore.service.mjs +342 -0
  39. package/esm2022/lib/services/base.service.mjs +99 -0
  40. package/esm2022/lib/services/cache.service.mjs +35 -0
  41. package/esm2022/lib/services/datastore.service.mjs +26 -0
  42. package/esm2022/lib/services/dialog.service.mjs +150 -0
  43. package/esm2022/lib/services/index.mjs +6 -0
  44. package/esm2022/lib/services/translate-loader.service.mjs +34 -0
  45. package/esm2022/lib/utils.mjs +27 -0
  46. package/esm2022/lib/validators/pattern-validator.mjs +15 -0
  47. package/esm2022/public-api.mjs +5 -0
  48. package/esm2022/rosoftlab-core.mjs +5 -0
  49. package/fesm2022/rosoftlab-core.mjs +1637 -0
  50. package/fesm2022/rosoftlab-core.mjs.map +1 -0
  51. package/index.d.ts +5 -0
  52. package/lib/base-components/base-form-edit.component.d.ts +56 -0
  53. package/lib/base-components/field-error-display/field-error-display.component.d.ts +7 -0
  54. package/lib/base-components/index.d.ts +3 -0
  55. package/lib/base-components/page-not-found/page-not-found.component.d.ts +8 -0
  56. package/lib/base-components/under-construction/under-construction.component.d.ts +6 -0
  57. package/lib/configurations.d.ts +6 -0
  58. package/lib/constants/symbols.d.ts +1 -0
  59. package/lib/converters/date/date.converter.d.ts +5 -0
  60. package/lib/core.d.ts +7 -0
  61. package/lib/decorators/attribute.decorator.d.ts +3 -0
  62. package/lib/decorators/base-datastore-config.decorator.d.ts +1 -0
  63. package/lib/decorators/base-model-config.decorator.d.ts +1 -0
  64. package/lib/decorators/custom.type.decorator.d.ts +1 -0
  65. package/lib/directives/translated-content.directive.d.ts +21 -0
  66. package/lib/directives/translated-element.directive.d.ts +10 -0
  67. package/lib/grid-layout-format.enum.d.ts +12 -0
  68. package/lib/index.d.ts +25 -0
  69. package/lib/interceptors/cache.interceptor.d.ts +13 -0
  70. package/lib/interceptors/index.d.ts +1 -0
  71. package/lib/interfaces/attribute-decorator-options.interface.d.ts +8 -0
  72. package/lib/interfaces/datastore-config.interface.d.ts +8 -0
  73. package/lib/interfaces/model-config.interface.d.ts +10 -0
  74. package/lib/interfaces/overrides.interface.d.ts +5 -0
  75. package/lib/interfaces/property-converter.interface.d.ts +4 -0
  76. package/lib/models/base-meta.model.d.ts +5 -0
  77. package/lib/models/base-query-data.d.ts +7 -0
  78. package/lib/models/base.model.d.ts +31 -0
  79. package/lib/models/error-response.model.d.ts +17 -0
  80. package/lib/models/rule.d.ts +5 -0
  81. package/lib/pipes/Nl2brPipe.pipe.d.ts +7 -0
  82. package/lib/pipes/input-error.pipe.d.ts +10 -0
  83. package/lib/providers.d.ts +2 -0
  84. package/lib/resolvers/dynamically-class-resolver.d.ts +3 -0
  85. package/lib/resolvers/dynamically-service-resolver.d.ts +3 -0
  86. package/lib/resolvers/index.d.ts +2 -0
  87. package/lib/rsl-base-module.d.ts +13 -0
  88. package/lib/services/base-datastore.service.d.ts +47 -0
  89. package/lib/services/base.service.d.ts +27 -0
  90. package/lib/services/cache.service.d.ts +11 -0
  91. package/lib/services/datastore.service.d.ts +12 -0
  92. package/lib/services/dialog.service.d.ts +21 -0
  93. package/lib/services/index.d.ts +5 -0
  94. package/lib/services/translate-loader.service.d.ts +14 -0
  95. package/lib/utils.d.ts +2 -0
  96. package/lib/validators/pattern-validator.d.ts +4 -0
  97. package/package.json +36 -0
  98. package/public-api.d.ts +1 -0
@@ -0,0 +1,22 @@
1
+ export function DynamicallyModelResolver(modelsImport, className = undefined) {
2
+ return (route, state) => {
3
+ if (className == undefined)
4
+ className = route.paramMap.get('className');
5
+ const instance = getInstance(className, modelsImport);
6
+ if (!instance) {
7
+ throw new Error(`Invalid className: ${className}`);
8
+ }
9
+ return instance;
10
+ };
11
+ }
12
+ function getInstance(className, modelsImport) {
13
+ return modelsImport.then((module) => module[toProperCase(className)]);
14
+ // return modelsImport.then((module) => ({ modelInstance: module[toProperCase(className)] })
15
+ // );
16
+ }
17
+ function toProperCase(str) {
18
+ return str.replace(/\w\S*/g, (txt) => {
19
+ return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();
20
+ });
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pY2FsbHktY2xhc3MtcmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yb3NvZnRsYWIvY29yZS9zcmMvbGliL3Jlc29sdmVycy9keW5hbWljYWxseS1jbGFzcy1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxNQUFNLFVBQVUsd0JBQXdCLENBQXNCLFlBQWlCLEVBQUUsWUFBZ0MsU0FBUztJQUN0SCxPQUFPLENBQUMsS0FBNkIsRUFBRSxLQUEwQixFQUFFLEVBQUU7UUFDakUsSUFBSSxTQUFTLElBQUksU0FBUztZQUN0QixTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFJLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsU0FBUyxFQUFFLENBQUMsQ0FBQztTQUN0RDtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBSSxTQUFpQixFQUFFLFlBQWlCO0lBQ3hELE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsNEZBQTRGO0lBQzVGLEtBQUs7QUFDVCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsR0FBVztJQUM3QixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUU7UUFDekMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEUsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgUmVzb2x2ZUZuLCBSb3V0ZXJTdGF0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSAnLi4vY29yZSc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gRHluYW1pY2FsbHlNb2RlbFJlc29sdmVyPFQgZXh0ZW5kcyBCYXNlTW9kZWw+KG1vZGVsc0ltcG9ydDogYW55LCBjbGFzc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCk6IFJlc29sdmVGbjxUPiB7XHJcbiAgICByZXR1cm4gKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCkgPT4ge1xyXG4gICAgICAgIGlmIChjbGFzc05hbWUgPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICBjbGFzc05hbWUgPSByb3V0ZS5wYXJhbU1hcC5nZXQoJ2NsYXNzTmFtZScpO1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0SW5zdGFuY2U8VD4oY2xhc3NOYW1lLCBtb2RlbHNJbXBvcnQpO1xyXG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNsYXNzTmFtZTogJHtjbGFzc05hbWV9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcclxuICAgIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEluc3RhbmNlPFQ+KGNsYXNzTmFtZTogc3RyaW5nLCBtb2RlbHNJbXBvcnQ6IGFueSk6IFByb21pc2U8VD4ge1xyXG4gICAgcmV0dXJuIG1vZGVsc0ltcG9ydC50aGVuKChtb2R1bGUpID0+IG1vZHVsZVt0b1Byb3BlckNhc2UoY2xhc3NOYW1lKV0pO1xyXG4gICAgLy8gcmV0dXJuIG1vZGVsc0ltcG9ydC50aGVuKChtb2R1bGUpID0+ICh7IG1vZGVsSW5zdGFuY2U6IG1vZHVsZVt0b1Byb3BlckNhc2UoY2xhc3NOYW1lKV0gfSlcclxuICAgIC8vICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvUHJvcGVyQ2FzZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcd1xcUyovZywgKHR4dDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHR4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHR4dC5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKTtcclxuICAgIH0pO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,22 @@
1
+ export function DynamicallyServiceResolver(serviceImport, serviceName) {
2
+ return (route, state) => {
3
+ const instance = getInstance(serviceName, serviceImport);
4
+ if (!instance) {
5
+ throw new Error(`Invalid className: ${serviceName}`);
6
+ }
7
+ return instance;
8
+ };
9
+ }
10
+ function getInstance(serviceName, serviceImport) {
11
+ return serviceImport.then((module) => module[toProperCase(serviceName)]); // return Promise.all([serviceImport]).then(
12
+ // (module) => ({
13
+ // serviceInstance: module[toProperCase(serviceName)],
14
+ // })
15
+ // );
16
+ }
17
+ function toProperCase(str) {
18
+ return str.replace(/\w\S*/g, (txt) => {
19
+ return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();
20
+ });
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pY2FsbHktc2VydmljZS1yZXNvbHZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jvc29mdGxhYi9jb3JlL3NyYy9saWIvcmVzb2x2ZXJzL2R5bmFtaWNhbGx5LXNlcnZpY2UtcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxVQUFVLDBCQUEwQixDQUFnRCxhQUFrQixFQUFFLFdBQW1CO0lBQy9ILE9BQU8sQ0FBQyxLQUE2QixFQUFFLEtBQTBCLEVBQUUsRUFBRTtRQUNuRSxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUksV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixXQUFXLEVBQUUsQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFJLFdBQW1CLEVBQUUsYUFBa0I7SUFDN0QsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLDRDQUE0QztJQUN2SCxtQkFBbUI7SUFDbkIsMERBQTBEO0lBQzFELE9BQU87SUFDUCxLQUFLO0FBQ1AsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEdBQVc7SUFDL0IsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFO1FBQzNDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIFJlc29sdmVGbiwgUm91dGVyU3RhdGVTbmFwc2hvdCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCYXNlTW9kZWwsIEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBEeW5hbWljYWxseVNlcnZpY2VSZXNvbHZlcjxUIGV4dGVuZHMgQmFzZU1vZGVsLCBVIGV4dGVuZHMgQmFzZVNlcnZpY2U8VD4+KHNlcnZpY2VJbXBvcnQ6IGFueSwgc2VydmljZU5hbWU6IHN0cmluZyk6IFJlc29sdmVGbjxVPiB7XG4gIHJldHVybiAocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRJbnN0YW5jZTxVPihzZXJ2aWNlTmFtZSwgc2VydmljZUltcG9ydCk7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNsYXNzTmFtZTogJHtzZXJ2aWNlTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZTxVPihzZXJ2aWNlTmFtZTogc3RyaW5nLCBzZXJ2aWNlSW1wb3J0OiBhbnkpOiBQcm9taXNlPFU+IHtcbiAgcmV0dXJuIHNlcnZpY2VJbXBvcnQudGhlbigobW9kdWxlKSA9PiBtb2R1bGVbdG9Qcm9wZXJDYXNlKHNlcnZpY2VOYW1lKV0pOyAgLy8gcmV0dXJuIFByb21pc2UuYWxsKFtzZXJ2aWNlSW1wb3J0XSkudGhlbihcbiAgLy8gICAobW9kdWxlKSA9PiAoe1xuICAvLyAgICAgc2VydmljZUluc3RhbmNlOiBtb2R1bGVbdG9Qcm9wZXJDYXNlKHNlcnZpY2VOYW1lKV0sXG4gIC8vICAgfSlcbiAgLy8gKTtcbn1cblxuZnVuY3Rpb24gdG9Qcm9wZXJDYXNlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHdcXFMqL2csICh0eHQ6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiB0eHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCk7XG4gIH0pO1xufVxuIl19
@@ -0,0 +1,3 @@
1
+ export { DynamicallyModelResolver } from './dynamically-class-resolver';
2
+ export { DynamicallyServiceResolver } from './dynamically-service-resolver';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yb3NvZnRsYWIvY29yZS9zcmMvbGliL3Jlc29sdmVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IER5bmFtaWNhbGx5TW9kZWxSZXNvbHZlciB9IGZyb20gJy4vZHluYW1pY2FsbHktY2xhc3MtcmVzb2x2ZXInXHJcbmV4cG9ydCB7IER5bmFtaWNhbGx5U2VydmljZVJlc29sdmVyIH0gZnJvbSAnLi9keW5hbWljYWxseS1zZXJ2aWNlLXJlc29sdmVyJ1xyXG5cclxuIl19
@@ -0,0 +1,64 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { HttpClient, HttpClientModule } from '@angular/common/http';
3
+ import { NgModule } from '@angular/core';
4
+ import { ReactiveFormsModule } from '@angular/forms';
5
+ import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
6
+ import { Configurations } from './configurations';
7
+ import { PROVIDERS } from './providers';
8
+ import { TranslateloaderService } from './services/translate-loader.service';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@ngx-translate/core";
11
+ export class RslBaseModule {
12
+ static forRoot(config) {
13
+ return {
14
+ ngModule: RslBaseModule,
15
+ providers: [
16
+ PROVIDERS,
17
+ { provide: Configurations, useValue: config }
18
+ ]
19
+ };
20
+ }
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: RslBaseModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
22
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.1", ngImport: i0, type: RslBaseModule, imports: [CommonModule, i1.TranslateModule, ReactiveFormsModule], exports: [HttpClientModule,
23
+ TranslateModule] }); }
24
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: RslBaseModule, providers: [
25
+ PROVIDERS
26
+ ], imports: [CommonModule,
27
+ TranslateModule.forRoot({
28
+ loader: {
29
+ provide: TranslateLoader,
30
+ useClass: TranslateloaderService,
31
+ deps: [HttpClient]
32
+ },
33
+ // missingTranslationHandler: { provide: MissingTranslationHandler, useClass: MyMissingTranslationHandler },
34
+ useDefaultLang: false,
35
+ }),
36
+ ReactiveFormsModule, HttpClientModule,
37
+ TranslateModule] }); }
38
+ }
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: RslBaseModule, decorators: [{
40
+ type: NgModule,
41
+ args: [{
42
+ imports: [
43
+ CommonModule,
44
+ TranslateModule.forRoot({
45
+ loader: {
46
+ provide: TranslateLoader,
47
+ useClass: TranslateloaderService,
48
+ deps: [HttpClient]
49
+ },
50
+ // missingTranslationHandler: { provide: MissingTranslationHandler, useClass: MyMissingTranslationHandler },
51
+ useDefaultLang: false,
52
+ }),
53
+ ReactiveFormsModule
54
+ ],
55
+ providers: [
56
+ PROVIDERS
57
+ ],
58
+ exports: [
59
+ HttpClientModule,
60
+ TranslateModule,
61
+ ]
62
+ }]
63
+ }] });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNsLWJhc2UtbW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcm9zb2Z0bGFiL2NvcmUvc3JjL2xpYi9yc2wtYmFzZS1tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRSxPQUFPLEVBQXVCLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7QUF3QjdFLE1BQU0sT0FBTyxhQUFhO0lBQ2pCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBc0I7UUFDMUMsT0FBTztZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFNBQVMsRUFBRTtnQkFDVCxTQUFTO2dCQUNULEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFO2FBQzlDO1NBQ0YsQ0FBQztJQUNKLENBQUM7OEdBVFUsYUFBYTsrR0FBYixhQUFhLFlBcEJ0QixZQUFZLHNCQVVaLG1CQUFtQixhQU1uQixnQkFBZ0I7WUFDaEIsZUFBZTsrR0FHTixhQUFhLGFBUmI7WUFDVCxTQUFTO1NBQ1YsWUFkQyxZQUFZO1lBQ1osZUFBZSxDQUFDLE9BQU8sQ0FBQztnQkFDdEIsTUFBTSxFQUFFO29CQUNOLE9BQU8sRUFBRSxlQUFlO29CQUN4QixRQUFRLEVBQUUsc0JBQXNCO29CQUNoQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUM7aUJBQ25CO2dCQUNELDRHQUE0RztnQkFDNUcsY0FBYyxFQUFFLEtBQUs7YUFDdEIsQ0FBQztZQUNGLG1CQUFtQixFQU1uQixnQkFBZ0I7WUFDaEIsZUFBZTs7MkZBR04sYUFBYTtrQkF0QnpCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osZUFBZSxDQUFDLE9BQU8sQ0FBQzs0QkFDdEIsTUFBTSxFQUFFO2dDQUNOLE9BQU8sRUFBRSxlQUFlO2dDQUN4QixRQUFRLEVBQUUsc0JBQXNCO2dDQUNoQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUM7NkJBQ25COzRCQUNELDRHQUE0Rzs0QkFDNUcsY0FBYyxFQUFFLEtBQUs7eUJBQ3RCLENBQUM7d0JBQ0YsbUJBQW1CO3FCQUNwQjtvQkFDRCxTQUFTLEVBQUU7d0JBQ1QsU0FBUztxQkFDVjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsZ0JBQWdCO3dCQUNoQixlQUFlO3FCQUNoQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBDbGllbnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZUxvYWRlciwgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25zIH0gZnJvbSAnLi9jb25maWd1cmF0aW9ucyc7XHJcbmltcG9ydCB7IFBST1ZJREVSUyB9IGZyb20gJy4vcHJvdmlkZXJzJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlbG9hZGVyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdHJhbnNsYXRlLWxvYWRlci5zZXJ2aWNlJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgVHJhbnNsYXRlTW9kdWxlLmZvclJvb3Qoe1xyXG4gICAgICBsb2FkZXI6IHtcclxuICAgICAgICBwcm92aWRlOiBUcmFuc2xhdGVMb2FkZXIsXHJcbiAgICAgICAgdXNlQ2xhc3M6IFRyYW5zbGF0ZWxvYWRlclNlcnZpY2UsXHJcbiAgICAgICAgZGVwczogW0h0dHBDbGllbnRdXHJcbiAgICAgIH0sXHJcbiAgICAgIC8vIG1pc3NpbmdUcmFuc2xhdGlvbkhhbmRsZXI6IHsgcHJvdmlkZTogTWlzc2luZ1RyYW5zbGF0aW9uSGFuZGxlciwgdXNlQ2xhc3M6IE15TWlzc2luZ1RyYW5zbGF0aW9uSGFuZGxlciB9LFxyXG4gICAgICB1c2VEZWZhdWx0TGFuZzogZmFsc2UsXHJcbiAgICB9KSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGVcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgUFJPVklERVJTXHJcbiAgXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICBIdHRwQ2xpZW50TW9kdWxlLFxyXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFJzbEJhc2VNb2R1bGUge1xyXG4gIHB1YmxpYyBzdGF0aWMgZm9yUm9vdChjb25maWc6IENvbmZpZ3VyYXRpb25zKTogTW9kdWxlV2l0aFByb3ZpZGVyczxSc2xCYXNlTW9kdWxlPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZ01vZHVsZTogUnNsQmFzZU1vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgUFJPVklERVJTLFxyXG4gICAgICAgIHsgcHJvdmlkZTogQ29uZmlndXJhdGlvbnMsIHVzZVZhbHVlOiBjb25maWcgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,342 @@
1
+ import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import { compare } from 'fast-json-patch';
4
+ import * as qs from 'qs';
5
+ import { Observable, throwError } from 'rxjs';
6
+ import { catchError, map } from 'rxjs/operators';
7
+ import { BaseQueryData } from '../models/base-query-data';
8
+ import { CacheService } from './cache.service';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/common/http";
11
+ import * as i2 from "./cache.service";
12
+ export class BaseDatastore {
13
+ // tslint:enable:max-line-length
14
+ get getDirtyAttributes() {
15
+ if (this.datastoreConfig.overrides
16
+ && this.datastoreConfig.overrides.getDirtyAttributes) {
17
+ return this.datastoreConfig.overrides.getDirtyAttributes;
18
+ }
19
+ else {
20
+ return BaseDatastore.getDirtyAttributes;
21
+ }
22
+ }
23
+ get getAllAttributes() {
24
+ if (this.datastoreConfig.overrides
25
+ && this.datastoreConfig.overrides.getAllAttributes) {
26
+ return this.datastoreConfig.overrides.getAllAttributes;
27
+ }
28
+ else {
29
+ return BaseDatastore.getAllAttributes;
30
+ }
31
+ }
32
+ // protected config: DatastoreConfig;
33
+ static getDirtyAttributes(attributesMetadata) {
34
+ const dirtyData = {};
35
+ for (const propertyName in attributesMetadata) {
36
+ if (attributesMetadata.hasOwnProperty(propertyName)) {
37
+ const metadata = attributesMetadata[propertyName];
38
+ if (metadata.hasDirtyAttributes) {
39
+ const attributeName = metadata.serializedName != null ? metadata.serializedName : propertyName;
40
+ dirtyData[attributeName] = metadata.serialisationValue ? metadata.serialisationValue : metadata.newValue;
41
+ }
42
+ }
43
+ }
44
+ return dirtyData;
45
+ }
46
+ static getAllAttributes(attributesMetadata) {
47
+ const dirtyData = {};
48
+ for (const propertyName in attributesMetadata) {
49
+ if (attributesMetadata.hasOwnProperty(propertyName)) {
50
+ const metadata = attributesMetadata[propertyName];
51
+ const attributeName = metadata.serializedName != null ? metadata.serializedName : propertyName;
52
+ dirtyData[attributeName] = metadata.serialisationValue ? metadata.serialisationValue : metadata.newValue;
53
+ }
54
+ }
55
+ return dirtyData;
56
+ }
57
+ constructor(httpClient, cacheService) {
58
+ this.httpClient = httpClient;
59
+ this.cacheService = cacheService;
60
+ // tslint:disable-next-line:variable-name
61
+ this._store = {};
62
+ // tslint:enable:max-line-length
63
+ // tslint:disable-next-line:ban-types
64
+ this.toQueryString = this.datastoreConfig.overrides
65
+ && this.datastoreConfig.overrides.toQueryString ?
66
+ this.datastoreConfig.overrides.toQueryString : this._toQueryString;
67
+ }
68
+ findAll(modelType, params, headers, customUrl) {
69
+ const customHeadhers = this.buildHeaders(headers);
70
+ const htmlParams = this.buildParams(modelType, params);
71
+ const url = this.buildUrl(modelType, customUrl);
72
+ const response = this.httpClient.get(url, { headers: customHeadhers, params: htmlParams, withCredentials: true })
73
+ .pipe(map(res => this.extractQueryData(res, modelType)), catchError(this.handleError));
74
+ return response;
75
+ }
76
+ findRecord(modelType, id, params, headers, customUrl) {
77
+ const customHeadhers = this.buildHeaders(headers);
78
+ let url = this.buildUrl(modelType, customUrl);
79
+ if (id) {
80
+ url += '/' + id;
81
+ }
82
+ const htmlParams = this.buildParams(modelType, params);
83
+ const response = this.httpClient.get(url, { headers: customHeadhers, params: htmlParams, withCredentials: true })
84
+ .pipe(map(res => this.entityToModel(res, modelType, undefined)), catchError(this.handleError));
85
+ return response;
86
+ }
87
+ getCustom(modelType, params, headers, customUrl, customResponseType) {
88
+ const customHeadhers = this.buildHeaders(headers);
89
+ const url = this.buildUrl(modelType, customUrl);
90
+ const htmlParams = this.buildParams(modelType, params);
91
+ if (!customResponseType)
92
+ customResponseType = 'json';
93
+ return this.httpClient.get(url, { headers: customHeadhers, params: htmlParams, withCredentials: true, responseType: customResponseType });
94
+ }
95
+ postCustom(modelType, body, params, headers, customUrl) {
96
+ const customHeadhers = this.buildHeaders(headers);
97
+ const url = this.buildUrl(modelType, customUrl);
98
+ const htmlParams = this.buildParams(modelType, params);
99
+ return this.httpClient.post(url, body, { headers: customHeadhers, params: htmlParams, reportProgress: true, withCredentials: true });
100
+ }
101
+ patchCustom(modelType, body, params, headers, customUrl) {
102
+ const customHeadhers = this.buildHeaders(headers);
103
+ const url = this.buildUrl(modelType, customUrl);
104
+ const htmlParams = this.buildParams(modelType, params);
105
+ return this.httpClient.patch(url, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
106
+ }
107
+ createRecord(modelType, data) {
108
+ return new modelType(this, data);
109
+ }
110
+ saveRecord(attributesMetadata, model, params, headers, customUrl, customBody) {
111
+ const modelType = model.constructor;
112
+ const modelConfig = model.modelConfig;
113
+ const customHeadhers = this.buildHeaders(headers);
114
+ const url = this.buildUrl(modelType, customUrl);
115
+ const htmlParams = this.buildParams(modelType, params);
116
+ let httpCall;
117
+ const body = customBody || this.modelToEntity(model, attributesMetadata);
118
+ if (model.id) {
119
+ // tslint:disable-next-line:max-line-length
120
+ httpCall = this.httpClient.patch(url + '/' + model.id, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
121
+ }
122
+ else {
123
+ httpCall = this.httpClient.post(url, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
124
+ }
125
+ return httpCall
126
+ .pipe(map(res => {
127
+ this.cacheService.clearCacheContainingKeyword(url);
128
+ const data = this.resetMetadataAttributes(res, attributesMetadata, modelType);
129
+ return this.entityToModel(data, modelType);
130
+ }), catchError(this.handleError));
131
+ }
132
+ patchRecord(attributesMetadata, model, origModel, params, headers, customUrl) {
133
+ const modelType = model.constructor;
134
+ const modelConfig = model.modelConfig;
135
+ const customHeadhers = this.buildHeaders(headers);
136
+ const url = this.buildUrl(modelType, customUrl);
137
+ const htmlParams = this.buildParams(modelType, params);
138
+ let httpCall;
139
+ let origData = { id: '' };
140
+ if (origModel)
141
+ origData = this.modelToEntity(origModel, origModel.attributeMetadata, true);
142
+ const newData = this.modelToEntity(model, attributesMetadata, true);
143
+ newData.id = origData.id;
144
+ const patch = compare(origData, newData);
145
+ if (patch.length > 0) {
146
+ httpCall = this.httpClient.patch(url + '/' + model.id, patch, { headers: customHeadhers, params: htmlParams, withCredentials: true });
147
+ return httpCall
148
+ .pipe(map(res => {
149
+ this.cacheService.clearCacheContainingKeyword(url);
150
+ const data = this.resetMetadataAttributes(res, attributesMetadata, modelType);
151
+ return this.entityToModel(data, modelType);
152
+ }), catchError(this.handleError));
153
+ }
154
+ else {
155
+ return new Observable((observer) => {
156
+ observer.next(model);
157
+ observer.complete();
158
+ });
159
+ }
160
+ }
161
+ // getPatch<T extends BaseModel>(
162
+ // model: T,
163
+ // origModel: T): any {
164
+ // }
165
+ replaceRecord(attributesMetadata, model, params, headers, customUrl, customBody) {
166
+ const modelType = model.constructor;
167
+ const modelConfig = model.modelConfig;
168
+ const customHeadhers = this.buildHeaders(headers);
169
+ const url = this.buildUrl(modelType, customUrl);
170
+ const htmlParams = this.buildParams(modelType, params);
171
+ let httpCall;
172
+ const body = customBody || this.modelToEntity(model, attributesMetadata, true);
173
+ if (model.id) {
174
+ httpCall = this.httpClient.put(url + '/' + model.id, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
175
+ }
176
+ else {
177
+ httpCall = this.httpClient.post(url, body, { headers: customHeadhers, params: htmlParams, withCredentials: true });
178
+ }
179
+ return httpCall
180
+ .pipe(map(res => {
181
+ this.cacheService.clearCacheContainingKeyword(url);
182
+ const data = this.resetMetadataAttributes(res, attributesMetadata, modelType);
183
+ return this.entityToModel(data, modelType);
184
+ }), catchError(this.handleError));
185
+ }
186
+ deleteRecord(modelType, id, headers, customUrl) {
187
+ const customHeadhers = this.buildHeaders(headers);
188
+ let url = this.buildUrl(modelType, customUrl);
189
+ if (!url.includes('share')) {
190
+ url = url + '/' + id;
191
+ }
192
+ // const idParam = new HttpParams().set('id', id);
193
+ return this.httpClient.delete(url, { headers: customHeadhers, withCredentials: true })
194
+ .pipe(map(res => {
195
+ this.cacheService.clearCacheContainingKeyword(url);
196
+ return res;
197
+ }), catchError(this.handleError));
198
+ }
199
+ buildUrl(modelType, customUrl) {
200
+ if (customUrl) {
201
+ return customUrl;
202
+ }
203
+ const modelConfig = Reflect.getMetadata('BaseModelConfig', modelType);
204
+ const baseUrl = modelConfig.baseUrl || this.datastoreConfig.baseUrl;
205
+ const apiVersion = modelConfig.apiVersion || this.datastoreConfig.apiVersion;
206
+ const modelEndpointUrl = modelConfig.modelEndpointUrl || modelConfig.type;
207
+ const url = [baseUrl, apiVersion, modelEndpointUrl].filter((x) => x).join('/');
208
+ return url;
209
+ }
210
+ extractQueryData(res, modelType) {
211
+ let result;
212
+ const body = res;
213
+ const models = [];
214
+ for (const data of body.data) {
215
+ const model = this.entityToModel(data, modelType, undefined);
216
+ models.push(model);
217
+ }
218
+ result = new BaseQueryData(models, this.parseMeta(body, modelType));
219
+ return result;
220
+ }
221
+ deserializeModel(modelType, data) {
222
+ data = this.transformSerializedNamesToPropertyNames(modelType, data);
223
+ return new modelType(this, data);
224
+ }
225
+ handleError(error) {
226
+ if (error.error instanceof ErrorEvent) {
227
+ // A client-side or network error occurred. Handle it accordingly.
228
+ // console.error('An error occurred:', error.error.message);
229
+ }
230
+ else {
231
+ // The backend returned an unsuccessful response code.
232
+ // The response body may contain clues as to what went wrong,
233
+ // console.error(
234
+ // 'Backend returned code ${error.status}, ' +
235
+ // 'body was: ${error.error}');
236
+ }
237
+ // return an observable with a user-facing error message
238
+ return throwError(error);
239
+ }
240
+ parseMeta(body, modelType) {
241
+ const metaModel = Reflect.getMetadata('BaseModelConfig', modelType).meta;
242
+ return new metaModel(body);
243
+ }
244
+ resetMetadataAttributes(res, attributesMetadata, modelType) {
245
+ // TODO check why is attributesMetadata from the arguments never used
246
+ for (const propertyName in attributesMetadata) {
247
+ if (attributesMetadata.hasOwnProperty(propertyName)) {
248
+ const metadata = attributesMetadata[propertyName];
249
+ if (metadata.hasDirtyAttributes) {
250
+ metadata.hasDirtyAttributes = false;
251
+ }
252
+ }
253
+ }
254
+ if (res) {
255
+ res.attributeMetadata = attributesMetadata;
256
+ }
257
+ return res;
258
+ }
259
+ get datastoreConfig() {
260
+ const configFromDecorator = Reflect.getMetadata('BaseDatastoreConfig', this.constructor);
261
+ return Object.assign(configFromDecorator, this.config);
262
+ }
263
+ transformSerializedNamesToPropertyNames(modelType, attributes) {
264
+ const serializedNameToPropertyName = this.getModelPropertyNames(modelType.prototype);
265
+ const properties = {};
266
+ Object.keys(serializedNameToPropertyName).forEach((serializedName) => {
267
+ if (attributes[serializedName] !== null && attributes[serializedName] !== undefined) {
268
+ properties[serializedNameToPropertyName[serializedName]] = attributes[serializedName];
269
+ }
270
+ });
271
+ return properties;
272
+ }
273
+ getModelPropertyNames(model) {
274
+ return Reflect.getMetadata('AttributeMapping', model);
275
+ }
276
+ buildHeaders(customHeaders) {
277
+ const headers = {
278
+ Accept: 'application/json-patch+json',
279
+ // 'Content-Type': 'application/vnd.api+json',
280
+ 'Content-Type': 'application/json-patch+json'
281
+ };
282
+ if (customHeaders && customHeaders.keys().length) {
283
+ // tslint:disable-next-line:variable-name
284
+ Object.assign({}, headers, customHeaders.keys().map(header_name => {
285
+ headers['' + header_name] = customHeaders.get(header_name);
286
+ }));
287
+ }
288
+ return new HttpHeaders(headers);
289
+ }
290
+ buildParams(modelType, params) {
291
+ let httpParams = new HttpParams();
292
+ if (params) {
293
+ Object.keys(params)
294
+ .filter(key => {
295
+ const v = params[key];
296
+ return (Array.isArray(v) || typeof v === 'string') ?
297
+ (v.length > 0) :
298
+ (v !== null && v !== undefined);
299
+ })
300
+ .forEach(key => {
301
+ httpParams = httpParams.set(key, params[key]);
302
+ });
303
+ }
304
+ const modelConfig = Reflect.getMetadata('BaseModelConfig', modelType);
305
+ httpParams = httpParams.set('bypassCache', modelConfig.bypassCache || false);
306
+ return httpParams;
307
+ }
308
+ entityToModel(res, modelType, model) {
309
+ return this.extractRecordDataJson(res, modelType, model);
310
+ }
311
+ extractRecordDataJson(res, modelType, model) {
312
+ const body = res;
313
+ if (!body) {
314
+ throw new Error('no body in response');
315
+ }
316
+ if (model) {
317
+ Object.assign(model, body);
318
+ }
319
+ const deserializedModel = model || this.deserializeModel(modelType, body.data || body);
320
+ return deserializedModel;
321
+ }
322
+ modelToEntity(model, attributesMetadata, allAttributes = false) {
323
+ let attributes;
324
+ if (allAttributes) {
325
+ attributes = this.getAllAttributes(attributesMetadata, model);
326
+ }
327
+ else {
328
+ attributes = this.getDirtyAttributes(attributesMetadata, model);
329
+ }
330
+ // this.getRelationships(model, attributes);
331
+ return attributes;
332
+ }
333
+ _toQueryString(params) {
334
+ return qs.stringify(params, { arrayFormat: 'brackets' });
335
+ }
336
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: BaseDatastore, deps: [{ token: i1.HttpClient }, { token: i2.CacheService }], target: i0.ɵɵFactoryTarget.Injectable }); }
337
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: BaseDatastore }); }
338
+ }
339
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: BaseDatastore, decorators: [{
340
+ type: Injectable
341
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.CacheService }]; } });
342
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYXRhc3RvcmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jvc29mdGxhYi9jb3JlL3NyYy9saWIvc2VydmljZXMvYmFzZS1kYXRhc3RvcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFxQixXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLFVBQVUsRUFBWSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBSS9DLE1BQU0sT0FBTyxhQUFhO0lBU3hCLGdDQUFnQztJQUVoQyxJQUFZLGtCQUFrQjtRQUM1QixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUztlQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRTtZQUN0RCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDO1NBQzFEO2FBQU07WUFDTCxPQUFPLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztTQUN6QztJQUNILENBQUM7SUFFRCxJQUFXLGdCQUFnQjtRQUN6QixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUztlQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxn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LEtBQUssQ0FBQyxDQUFDO1NBQy9EO2FBQU07WUFDTCxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ2pFO1FBQ0QsNENBQTRDO1FBQzVDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFDTyxjQUFjLENBQUMsTUFBVztRQUNoQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQzs4R0E5Y1UsYUFBYTtrSEFBYixhQUFhOzsyRkFBYixhQUFhO2tCQUR6QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGNvbXBhcmUgfSBmcm9tICdmYXN0LWpzb24tcGF0Y2gnO1xyXG5pbXBvcnQgKiBhcyBxcyBmcm9tICdxcyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRGF0YXN0b3JlQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9kYXRhc3RvcmUtY29uZmlnLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IE1vZGVsQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9tb2RlbC1jb25maWcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgQmFzZVF1ZXJ5RGF0YSB9IGZyb20gJy4uL21vZGVscy9iYXNlLXF1ZXJ5LWRhdGEnO1xyXG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvYmFzZS5tb2RlbCc7XHJcbmltcG9ydCB7IENhY2hlU2VydmljZSB9IGZyb20gJy4vY2FjaGUuc2VydmljZSc7XHJcbmV4cG9ydCB0eXBlIE1vZGVsVHlwZTxUIGV4dGVuZHMgQmFzZU1vZGVsPiA9IG5ldyAoZGF0YXN0b3JlOiBCYXNlRGF0YXN0b3JlLCBkYXRhOiBhbnkpID0+IFQ7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCYXNlRGF0YXN0b3JlIHtcclxuICBwcm90ZWN0ZWQgY29uZmlnITogRGF0YXN0b3JlQ29uZmlnO1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfc3RvcmU6IHsgW3R5cGU6IHN0cmluZ106IHsgW2lkOiBzdHJpbmddOiBCYXNlTW9kZWwgfSB9ID0ge307XHJcbiAgLy8gdHNsaW50OmVuYWJsZTptYXgtbGluZS1sZW5ndGhcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YmFuLXR5cGVzXHJcbiAgcHJpdmF0ZSB0b1F1ZXJ5U3RyaW5nOiBGdW5jdGlvbiA9IHRoaXMuZGF0YXN0b3JlQ29uZmlnLm92ZXJyaWRlc1xyXG4gICAgJiYgdGhpcy5kYXRhc3RvcmVDb25maWcub3ZlcnJpZGVzLnRvUXVlcnlTdHJpbmcgP1xyXG4gICAgdGhpcy5kYXRhc3RvcmVDb25maWcub3ZlcnJpZGVzLnRvUXVlcnlTdHJpbmcgOiB0aGlzLl90b1F1ZXJ5U3RyaW5nO1xyXG4gIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXHJcblxyXG4gIHByaXZhdGUgZ2V0IGdldERpcnR5QXR0cmlidXRlcygpIHtcclxuICAgIGlmICh0aGlzLmRhdGFzdG9yZUNvbmZpZy5vdmVycmlkZXNcclxuICAgICAgJiYgdGhpcy5kYXRhc3RvcmVDb25maWcub3ZlcnJpZGVzLmdldERpcnR5QXR0cmlidXRlcykge1xyXG4gICAgICByZXR1cm4gdGhpcy5kYXRhc3RvcmVDb25maWcub3ZlcnJpZGVzLmdldERpcnR5QXR0cmlidXRlcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBCYXNlRGF0YXN0b3JlLmdldERpcnR5QXR0cmlidXRlcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZ2V0QWxsQXR0cmlidXRlcygpIHtcclxuICAgIGlmICh0aGlzLmRhdGFzdG9yZUNvbmZpZy5vdmVycmlkZXNcclxuICAgICAgJiYgdGhpcy5kYXRhc3RvcmVDb25maWcub3ZlcnJpZGVzLmdldEFsbEF0dHJpYnV0ZXMpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGF0YXN0b3JlQ29uZmlnLm92ZXJyaWRlcy5nZXRBbGxBdHRyaWJ1dGVzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIEJhc2VEYXRhc3RvcmUuZ2V0QWxsQXR0cmlidXRlcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHByb3RlY3RlZCBjb25maWc6IERhdGFzdG9yZUNvbmZpZztcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RGlydHlBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNNZXRhZGF0YTogYW55KTogeyBzdHJpbmc6IGFueSB9IHtcclxuICAgIGNvbnN0IGRpcnR5RGF0YTogYW55ID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gYXR0cmlidXRlc01ldGFkYXRhKSB7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGVzTWV0YWRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSkge1xyXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiBhbnkgPSBhdHRyaWJ1dGVzTWV0YWRhdGFbcHJvcGVydHlOYW1lXTtcclxuXHJcbiAgICAgICAgaWYgKG1ldGFkYXRhLmhhc0RpcnR5QXR0cmlidXRlcykge1xyXG4gICAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IG1ldGFkYXRhLnNlcmlhbGl6ZWROYW1lICE9IG51bGwgPyBtZXRhZGF0YS5zZXJpYWxpemVkTmFtZSA6IHByb3BlcnR5TmFtZTtcclxuICAgICAgICAgIGRpcnR5RGF0YVthdHRyaWJ1dGVOYW1lXSA9IG1ldGFkYXRhLnNlcmlhbGlzYXRpb25WYWx1ZSA/IG1ldGFkYXRhLnNlcmlhbGlzYXRpb25WYWx1ZSA6IG1ldGFkYXRhLm5ld1ZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRpcnR5RGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGdldEFsbEF0dHJpYnV0ZXMoYXR0cmlidXRlc01ldGFkYXRhOiBhbnkpOiB7IHN0cmluZzogYW55IH0ge1xyXG4gICAgY29uc3QgZGlydHlEYXRhOiBhbnkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBhdHRyaWJ1dGVzTWV0YWRhdGEpIHtcclxuICAgICAgaWYgKGF0dHJpYnV0ZXNNZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7XHJcbiAgICAgICAgY29uc3QgbWV0YWRhdGE6IGFueSA9IGF0dHJpYnV0ZXNNZXRhZGF0YVtwcm9wZXJ0eU5hbWVdO1xyXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBtZXRhZGF0YS5zZXJpYWxpemVkTmFtZSAhPSBudWxsID8gbWV0YWRhdGEuc2VyaWFsaXplZE5hbWUgOiBwcm9wZXJ0eU5hbWU7XHJcbiAgICAgICAgZGlydHlEYXRhW2F0dHJpYnV0ZU5hbWVdID0gbWV0YWRhdGEuc2VyaWFsaXNhdGlvblZhbHVlID8gbWV0YWRhdGEuc2VyaWFsaXNhdGlvblZhbHVlIDogbWV0YWRhdGEubmV3VmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkaXJ0eURhdGE7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxyXG4gICAgcHJvdGVjdGVkIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBmaW5kQWxsPFQgZXh0ZW5kcyBCYXNlTW9kZWw+KFxyXG4gICAgbW9kZWxUeXBlOiBNb2RlbFR5cGU8VD4sXHJcbiAgICBwYXJhbXM/OiBhbnksXHJcbiAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMsXHJcbiAgICBjdXN0b21Vcmw/OiBzdHJpbmdcclxuICApOiBPYnNlcnZhYmxlPEJhc2VRdWVyeURhdGE8VD4+IHtcclxuICAgIGNvbnN0IGN1c3RvbUhlYWRoZXJzOiBIdHRwSGVhZGVycyA9IHRoaXMuYnVpbGRIZWFkZXJzKGhlYWRlcnMpO1xyXG4gICAgY29uc3QgaHRtbFBhcmFtcyA9IHRoaXMuYnVpbGRQYXJhbXMobW9kZWxUeXBlLCBwYXJhbXMpO1xyXG4gICAgY29uc3QgdXJsOiBzdHJpbmcgPSB0aGlzLmJ1aWxkVXJsKG1vZGVsVHlwZSwgY3VzdG9tVXJsKTtcclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuaHR0cENsaWVudC5nZXQodXJsLFxyXG4gICAgICB7IGhlYWRlcnM6IGN1c3RvbUhlYWRoZXJzLCBwYXJhbXM6IGh0bWxQYXJhbXMsIHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAocmVzID0+IHRoaXMuZXh0cmFjdFF1ZXJ5RGF0YShyZXMsIG1vZGVsVHlwZSkpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgKTtcclxuICAgIHJldHVybiByZXNwb25zZTtcclxuXHJcbiAgfVxyXG5cclxuICBmaW5kUmVjb3JkPFQgZXh0ZW5kcyBCYXNlTW9kZWw+KFxyXG4gICAgbW9kZWxUeXBlOiBNb2RlbFR5cGU8VD4sXHJcbiAgICBpZD86IHN0cmluZyxcclxuICAgIHBhcmFtcz86IGFueSxcclxuICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyxcclxuICAgIGN1c3RvbVVybD86IHN0cmluZ1xyXG4gICk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgY29uc3QgY3VzdG9tSGVhZGhlcnM6IEh0dHBIZWFkZXJzID0gdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycyk7XHJcbiAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJ1aWxkVXJsKG1vZGVsVHlwZSwgY3VzdG9tVXJsKTtcclxuICAgIGlmIChpZCkge1xyXG4gICAgICB1cmwgKz0gJy8nICsgaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaHRtbFBhcmFtcyA9IHRoaXMuYnVpbGRQYXJhbXMobW9kZWxUeXBlLCBwYXJhbXMpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmh0dHBDbGllbnQuZ2V0KHVybCwgeyBoZWFkZXJzOiBjdXN0b21IZWFkaGVycywgcGFyYW1zOiBodG1sUGFyYW1zLCB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSlcclxuICAgICAgLnBpcGUobWFwKHJlcyA9PiB0aGlzLmVudGl0eVRvTW9kZWwocmVzLCBtb2RlbFR5cGUsIHVuZGVmaW5lZCkpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgKTtcclxuICAgIHJldHVybiByZXNwb25zZTtcclxuXHJcbiAgfVxyXG4gIGdldEN1c3RvbTxVLCBUIGV4dGVuZHMgQmFzZU1vZGVsPihtb2RlbFR5cGU6IE1vZGVsVHlwZTxUPixcclxuICAgIHBhcmFtcz86IGFueSxcclxuICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyxcclxuICAgIGN1c3RvbVVybD86IHN0cmluZyxcclxuICAgIGN1c3RvbVJlc3BvbnNlVHlwZT86IGFueSk6IE9ic2VydmFibGU8VT4ge1xyXG4gICAgY29uc3QgY3VzdG9tSGVhZGhlcnM6IEh0dHBIZWFkZXJzID0gdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycyk7XHJcbiAgICBjb25zdCB1cmw6IHN0cmluZyA9IHRoaXMuYnVpbGRVcmwobW9kZWxUeXBlLCBjdXN0b21VcmwpO1xyXG4gICAgY29uc3QgaHRtbFBhcmFtcyA9IHRoaXMuYnVpbGRQYXJhbXMobW9kZWxUeXBlLCBwYXJhbXMpO1xyXG4gICAgaWYgKCFjdXN0b21SZXNwb25zZVR5cGUpXHJcbiAgICAgIGN1c3RvbVJlc3BvbnNlVHlwZSA9ICdqc29uJztcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PFU+KHVybCwgeyBoZWFkZXJzOiBjdXN0b21IZWFkaGVycywgcGFyYW1zOiBodG1sUGFyYW1zLCB3aXRoQ3JlZGVudGlhbHM6IHRydWUsIHJlc3BvbnNlVHlwZTogY3VzdG9tUmVzcG9uc2VUeXBlIH0pO1xyXG4gIH1cclxuXHJcbiAgcG9zdEN1c3RvbTxVLCBUIGV4dGVuZHMgQmFzZU1vZGVsPihtb2RlbFR5cGU6IE1vZGVsVHlwZTxUPixcclxuICAgIGJvZHk6IGFueSxcclxuICAgIHBhcmFtcz86IGFueSxcclxuICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyxcclxuICAgIGN1c3RvbVVybD86IHN0cmluZyk6IE9ic2VydmFibGU8VT4ge1xyXG4gICAgY29uc3QgY3VzdG9tSGVhZGhlcnM6IEh0dHBIZWFkZXJzID0gdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycyk7XHJcbiAgICBjb25zdCB1cmw6IHN0cmluZyA9IHRoaXMuYnVpbGRVcmwobW9kZWxUeXBlLCBjdXN0b21VcmwpO1xyXG4gICAgY29uc3QgaHRtbFBhcmFtcyA9IHRoaXMuYnVpbGRQYXJhbXMobW9kZWxUeXBlLCBwYXJhbXMpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PFU+KHVybCwgYm9keSwgeyBoZWFkZXJzOiBjdXN0b21IZWFkaGVycywgcGFyYW1zOiBodG1sUGFyYW1zLCByZXBvcnRQcm9ncmVzczogdHJ1ZSwgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcGF0Y2hDdXN0b208VSwgVCBleHRlbmRzIEJhc2VNb2RlbD4obW9kZWxUeXBlOiBNb2RlbFR5cGU8VD4sXHJcbiAgICBib2R5OiBhbnksXHJcbiAgICBwYXJhbXM/OiBhbnksXHJcbiAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMsXHJcbiAgICBjdXN0b21Vcmw/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFU+IHtcclxuICAgIGNvbnN0IGN1c3RvbUhlYWRoZXJzOiBIdHRwSGVhZGVycyA9IHRoaXMuYnVpbGRIZWFkZXJzKGhlYWRlcnMpO1xyXG4gICAgY29uc3QgdXJsOiBzdHJpbmcgPSB0aGlzLmJ1aWxkVXJsKG1vZGVsVHlwZSwgY3VzdG9tVXJsKTtcclxuICAgIGNvbnN0IGh0bWxQYXJhbXMgPSB0aGlzLmJ1aWxkUGFyYW1zKG1vZGVsVHlwZSwgcGFyYW1zKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucGF0Y2g8VT4odXJsLCBib2R5LCB7IGhlYWRlcnM6IGN1c3RvbUhlYWRoZXJzLCBwYXJhbXM6IGh0bWxQYXJhbXMsIHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KTtcclxuICB9XHJcbiAgY3JlYXRlUmVjb3JkPFQgZXh0ZW5kcyBCYXNlTW9kZWw+KG1vZGVsVHlwZTogTW9kZWxUeXBlPFQ+LCBkYXRhPzogYW55KTogVCB7XHJcbiAgICByZXR1cm4gbmV3IG1vZGVsVHlwZSh0aGlzLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIHNhdmVSZWNvcmQ8VCBleHRlbmRzIEJhc2VNb2RlbD4oXHJcbiAgICBhdHRyaWJ1dGVzTWV0YWRhdGE6IGFueSwgbW9kZWw6IFQsXHJcbiAgICBwYXJhbXM/OiBhbnksXHJcbiAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMsXHJcbiAgICBjdXN0b21Vcmw/OiBzdHJpbmcsXHJcbiAgICBjdXN0b21Cb2R5PzogYW55XHJcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICBjb25zdCBtb2RlbFR5cGUgPSBtb2RlbC5jb25zdHJ1Y3RvciBhcyBNb2RlbFR5cGU8VD47XHJcbiAgICBjb25zdCBtb2RlbENvbmZpZzogTW9kZWxDb25maWcgPSBtb2RlbC5tb2RlbENvbmZpZztcclxuICAgIGNvbnN0IGN1c3RvbUhlYWRoZXJzOiBIdHRwSGVhZGVycyA9IHRoaXMuYnVpbGRIZWFkZXJzKGhlYWRlcnMpO1xyXG4gICAgY29uc3QgdXJsOiBzdHJpbmcgPSB0aGlzLmJ1aWxkVXJsKG1vZGVsVHlwZSwgY3VzdG9tVXJsKTtcclxuICAgIGNvbnN0IGh0bWxQYXJhbXMgPSB0aGlzLmJ1aWxkUGFyYW1zKG1vZGVsVHlwZSwgcGFyYW1zKTtcclxuXHJcbiAgICBsZXQgaHR0cENhbGw6IE9ic2VydmFibGU8YW55PjtcclxuXHJcbiAgICBjb25zdCBib2R5ID0gY3VzdG9tQm9keSB8fCB0aGlzLm1vZGVsVG9FbnRpdHkobW9kZWwsIGF0dHJpYnV0ZXNNZXRhZGF0YSk7XHJcblxyXG4gICAgaWYgKG1vZGVsLmlkKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgaHR0cENhbGwgPSB0aGlzLmh0dHBDbGllbnQucGF0Y2godXJsICsgJy8nICsgbW9kZWwuaWQsIGJvZHksIHsgaGVhZGVyczogY3VzdG9tSGVhZGhlcnMsIHBhcmFtczogaHRtbFBhcmFtcywgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaHR0cENhbGwgPSB0aGlzLmh0dHBDbGllbnQucG9zdCh1cmwsIGJvZHksIHsgaGVhZGVyczogY3VzdG9tSGVhZGhlcnMsIHBhcmFtczogaHRtbFBhcmFtcywgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBodHRwQ2FsbFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAocmVzID0+IHtcclxuICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGVDb250YWluaW5nS2V5d29yZCh1cmwpO1xyXG4gICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVzZXRNZXRhZGF0YUF0dHJpYnV0ZXMocmVzLCBhdHRyaWJ1dGVzTWV0YWRhdGEsIG1vZGVsVHlwZSk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbnRpdHlUb01vZGVsKGRhdGEsIG1vZGVsVHlwZSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcGF0Y2hSZWNvcmQ8VCBleHRlbmRzIEJhc2VNb2RlbD4oXHJcbiAgICBhdHRyaWJ1dGVzTWV0YWRhdGE6IGFueSwgbW9kZWw6IFQsXHJcbiAgICBvcmlnTW9kZWw6IFQsXHJcbiAgICBwYXJhbXM/OiBhbnksXHJcbiAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMsXHJcbiAgICBjdXN0b21Vcmw/OiBzdHJpbmdcclxuICApOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIGNvbnN0IG1vZGVsVHlwZSA9IG1vZGVsLmNvbnN0cnVjdG9yIGFzIE1vZGVsVHlwZTxUPjtcclxuICAgIGNvbnN0IG1vZGVsQ29uZmlnOiBNb2RlbENvbmZpZyA9IG1vZGVsLm1vZGVsQ29uZmlnO1xyXG4gICAgY29uc3QgY3VzdG9tSGVhZGhlcnM6IEh0dHBIZWFkZXJzID0gdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycyk7XHJcbiAgICBjb25zdCB1cmw6IHN0cmluZyA9IHRoaXMuYnVpbGRVcmwobW9kZWxUeXBlLCBjdXN0b21VcmwpO1xyXG4gICAgY29uc3QgaHRtbFBhcmFtcyA9IHRoaXMuYnVpbGRQYXJhbXMobW9kZWxUeXBlLCBwYXJhbXMpO1xyXG5cclxuICAgIGxldCBodHRwQ2FsbDogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gICAgbGV0IG9yaWdEYXRhID0geyBpZDogJycgfTtcclxuICAgIGlmIChvcmlnTW9kZWwpXHJcbiAgICAgIG9yaWdEYXRhID0gdGhpcy5tb2RlbFRvRW50aXR5KG9yaWdNb2RlbCwgb3JpZ01vZGVsLmF0dHJpYnV0ZU1ldGFkYXRhLCB0cnVlKTtcclxuICAgIGNvbnN0IG5ld0RhdGEgPSB0aGlzLm1vZGVsVG9FbnRpdHkobW9kZWwsIGF0dHJpYnV0ZXNNZXRhZGF0YSwgdHJ1ZSk7XHJcbiAgICBuZXdEYXRhLmlkID0gb3JpZ0RhdGEuaWQ7XHJcbiAgICBjb25zdCBwYXRjaCA9IGNvbXBhcmUob3JpZ0RhdGEsIG5ld0RhdGEpO1xyXG4gICAgaWYgKHBhdGNoLmxlbmd0aCA+IDApIHtcclxuICAgICAgaHR0cENhbGwgPSB0aGlzLmh0dHBDbGllbnQucGF0Y2godXJsICsgJy8nICsgbW9kZWwuaWQsIHBhdGNoLCB7IGhlYWRlcnM6IGN1c3RvbUhlYWRoZXJzLCBwYXJhbXM6IGh0bWxQYXJhbXMsIHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KTtcclxuXHJcbiAgICAgIHJldHVybiBodHRwQ2FsbFxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgbWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGVDb250YWluaW5nS2V5d29yZCh1cmwpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZXNldE1ldGFkYXRhQXR0cmlidXRlcyhyZXMsIGF0dHJpYnV0ZXNNZXRhZGF0YSwgbW9kZWxUeXBlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50aXR5VG9Nb2RlbChkYXRhLCBtb2RlbFR5cGUpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSA9PiB7XHJcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChtb2RlbCk7XHJcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vIGdldFBhdGNoPFQgZXh0ZW5kcyBCYXNlTW9kZWw+KFxyXG4gIC8vICAgbW9kZWw6IFQsXHJcbiAgLy8gICBvcmlnTW9kZWw6IFQpOiBhbnkge1xyXG5cclxuICAvLyB9XHJcbiAgcmVwbGFjZVJlY29yZDxUIGV4dGVuZHMgQmFzZU1vZGVsPihcclxuICAgIGF0dHJpYnV0ZXNNZXRhZGF0YTogYW55LCBtb2RlbDogVCxcclxuICAgIHBhcmFtcz86IGFueSxcclxuICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyxcclxuICAgIGN1c3RvbVVybD86IHN0cmluZyxcclxuICAgIGN1c3RvbUJvZHk/OiBhbnlcclxuICApOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIGNvbnN0IG1vZGVsVHlwZSA9IG1vZGVsLmNvbnN0cnVjdG9yIGFzIE1vZGVsVHlwZTxUPjtcclxuICAgIGNvbnN0IG1vZGVsQ29uZmlnOiBNb2RlbENvbmZpZyA9IG1vZGVsLm1vZGVsQ29uZmlnO1xyXG4gICAgY29uc3QgY3VzdG9tSGVhZGhlcnM6IEh0dHBIZWFkZXJzID0gdGhpcy5idWlsZEhlYWRlcnMoaGVhZGVycyk7XHJcbiAgICBjb25zdCB1cmw6IHN0cmluZyA9IHRoaXMuYnVpbGRVcmwobW9kZWxUeXBlLCBjdXN0b21VcmwpO1xyXG4gICAgY29uc3QgaHRtbFBhcmFtcyA9IHRoaXMuYnVpbGRQYXJhbXMobW9kZWxUeXBlLCBwYXJhbXMpO1xyXG5cclxuICAgIGxldCBodHRwQ2FsbDogT2JzZXJ2YWJsZTxhbnk+O1xyXG5cclxuICAgIGNvbnN0IGJvZHkgPSBjdXN0b21Cb2R5IHx8IHRoaXMubW9kZWxUb0VudGl0eShtb2RlbCwgYXR0cmlidXRlc01ldGFkYXRhLCB0cnVlKTtcclxuXHJcbiAgICBpZiAobW9kZWwuaWQpIHtcclxuICAgICAgaHR0cENhbGwgPSB0aGlzLmh0dHBDbGllbnQucHV0KHVybCArICcvJyArIG1vZGVsLmlkLCBib2R5LCB7IGhlYWRlcnM6IGN1c3RvbUhlYWRoZXJzLCBwYXJhbXM6IGh0bWxQYXJhbXMsIHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGh0dHBDYWxsID0gdGhpcy5odHRwQ2xpZW50LnBvc3QodXJsLCBib2R5LCB7IGhlYWRlcnM6IGN1c3RvbUhlYWRoZXJzLCBwYXJhbXM6IGh0bWxQYXJhbXMsIHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaHR0cENhbGxcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlQ29udGFpbmluZ0tleXdvcmQodXJsKTtcclxuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlc2V0TWV0YWRhdGFBdHRyaWJ1dGVzKHJlcywgYXR0cmlidXRlc01ldGFkYXRhLCBtb2RlbFR5cGUpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZW50aXR5VG9Nb2RlbChkYXRhLCBtb2RlbFR5cGUpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICAgKTtcclxuICB9XHJcblxyXG5cclxuICBkZWxldGVSZWNvcmQ8VCBleHRlbmRzIEJhc2VNb2RlbD4oXHJcbiAgICBtb2RlbFR5cGU6IE1vZGVsVHlwZTxUPixcclxuICAgIGlkOiBzdHJpbmcsXHJcbiAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMsXHJcbiAgICBjdXN0b21Vcmw/OiBzdHJpbmdcclxuICApOiBPYnNlcnZhYmxlPHt9PiB7XHJcbiAgICBjb25zdCBjdXN0b21IZWFkaGVyczogSHR0cEhlYWRlcnMgPSB0aGlzLmJ1aWxkSGVhZGVycyhoZWFkZXJzKTtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYnVpbGRVcmwobW9kZWxUeXBlLCBjdXN0b21VcmwpO1xyXG4gICAgaWYgKCF1cmwuaW5jbHVkZXMoJ3NoYXJlJykpIHtcclxuICAgICAgdXJsID0gdXJsICsgJy8nICsgaWQ7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zdCBpZFBhcmFtID0gbmV3IEh0dHBQYXJhbXMoKS5zZXQoJ2lkJywgaWQpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5kZWxldGUodXJsLCB7IGhlYWRlcnM6IGN1c3RvbUhlYWRoZXJzLCB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlQ29udGFpbmluZ0tleXdvcmQodXJsKTtcclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGJ1aWxkVXJsPFQgZXh0ZW5kcyBCYXNlTW9kZWw+KFxyXG4gICAgbW9kZWxUeXBlOiBNb2RlbFR5cGU8VD4sXHJcbiAgICBjdXN0b21Vcmw/OiBzdHJpbmdcclxuICApOiBzdHJpbmcge1xyXG5cclxuICAgIGlmIChjdXN0b21VcmwpIHtcclxuICAgICAgcmV0dXJuIGN1c3RvbVVybDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtb2RlbENvbmZpZzogTW9kZWxDb25maWcgPSBSZWZsZWN0LmdldE1ldGFkYXRhKCdCYXNlTW9kZWxDb25maWcnLCBtb2RlbFR5cGUpO1xyXG5cclxuICAgIGNvbnN0IGJhc2VVcmwgPSBtb2RlbENvbmZpZy5iYXNlVXJsIHx8IHRoaXMuZGF0YXN0b3JlQ29uZmlnLmJhc2VVcmw7XHJcbiAgICBjb25zdCBhcGlWZXJzaW9uID0gbW9kZWxDb25maWcuYXBpVmVyc2lvbiB8fCB0aGlzLmRhdGFzdG9yZUNvbmZpZy5hcGlWZXJzaW9uO1xyXG4gICAgY29uc3QgbW9kZWxFbmRwb2ludFVybDogc3RyaW5nID0gbW9kZWxDb25maWcubW9kZWxFbmRwb2ludFVybCB8fCBtb2RlbENvbmZpZy50eXBlO1xyXG5cclxuICAgIGNvbnN0IHVybDogc3RyaW5nID0gW2Jhc2VVcmwsIGFwaVZlcnNpb24sIG1vZGVsRW5kcG9pbnRVcmxdLmZpbHRlcigoeCkgPT4geCkuam9pbignLycpO1xyXG5cclxuICAgIHJldHVybiB1cmw7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZXh0cmFjdFF1ZXJ5RGF0YTxUIGV4dGVuZHMgQmFzZU1vZGVsPihcclxuICAgIHJlczogYW55LFxyXG4gICAgbW9kZWxUeXBlOiBNb2RlbFR5cGU8VD5cclxuICApOiBCYXNlUXVlcnlEYXRhPFQ+IHtcclxuICAgIGxldCByZXN1bHQ7XHJcbiAgICBjb25zdCBib2R5OiBhbnkgPSByZXM7XHJcbiAgICBjb25zdCBtb2RlbHM6IFRbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgZGF0YSBvZiBib2R5LmRhdGEpIHtcclxuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLmVudGl0eVRvTW9kZWwoZGF0YSwgbW9kZWxUeXBlLCB1bmRlZmluZWQpO1xyXG4gICAgICBtb2RlbHMucHVzaChtb2RlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzdWx0ID0gbmV3IEJhc2VRdWVyeURhdGEobW9kZWxzLCB0aGlzLnBhcnNlTWV0YShib2R5LCBtb2RlbFR5cGUpKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZGVzZXJpYWxpemVNb2RlbDxUIGV4dGVuZHMgQmFzZU1vZGVsPihtb2RlbFR5cGU6IE1vZGVsVHlwZTxUPiwgZGF0YTogYW55KSB7XHJcbiAgICBkYXRhID0gdGhpcy50cmFuc2Zvcm1TZXJpYWxpemVkTmFtZXNUb1Byb3BlcnR5TmFtZXMobW9kZWxUeXBlLCBkYXRhKTtcclxuICAgIHJldHVybiBuZXcgbW9kZWxUeXBlKHRoaXMsIGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGhhbmRsZUVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gICAgaWYgKGVycm9yLmVycm9yIGluc3RhbmNlb2YgRXJyb3JFdmVudCkge1xyXG4gICAgICAvLyBBIGNsaWVudC1zaWRlIG9yIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQuIEhhbmRsZSBpdCBhY2NvcmRpbmdseS5cclxuICAgICAgLy8gY29uc29sZS5lcnJvcignQW4gZXJyb3Igb2NjdXJyZWQ6JywgZXJyb3IuZXJyb3IubWVzc2FnZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUaGUgYmFja2VuZCByZXR1cm5lZCBhbiB1bnN1Y2Nlc3NmdWwgcmVzcG9uc2UgY29kZS5cclxuICAgICAgLy8gVGhlIHJlc3BvbnNlIGJvZHkgbWF5IGNvbnRhaW4gY2x1ZXMgYXMgdG8gd2hhdCB3ZW50IHdyb25nLFxyXG4gICAgICAvLyBjb25zb2xlLmVycm9yKFxyXG4gICAgICAvLyAgICdCYWNrZW5kIHJldHVybmVkIGNvZGUgJHtlcnJvci5zdGF0dXN9LCAnICtcclxuICAgICAgLy8gICAnYm9keSB3YXM6ICR7ZXJyb3IuZXJyb3J9Jyk7XHJcbiAgICB9XHJcbiAgICAvLyByZXR1cm4gYW4gb2JzZXJ2YWJsZSB3aXRoIGEgdXNlci1mYWNpbmcgZXJyb3IgbWVzc2FnZVxyXG4gICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHBhcnNlTWV0YShib2R5OiBhbnksIG1vZGVsVHlwZTogTW9kZWxUeXBlPEJhc2VNb2RlbD4pOiBhbnkge1xyXG4gICAgY29uc3QgbWV0YU1vZGVsOiBhbnkgPSBSZWZsZWN0LmdldE1ldGFkYXRhKCdCYXNlTW9kZWxDb25maWcnLCBtb2RlbFR5cGUpLm1ldGE7XHJcbiAgICByZXR1cm4gbmV3IG1ldGFNb2RlbChib2R5KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXNldE1ldGFkYXRhQXR0cmlidXRlczxUIGV4dGVuZHMgQmFzZU1vZGVsPihyZXM6IFQsIGF0dHJpYnV0ZXNNZXRhZGF0YTogYW55LCBtb2RlbFR5cGU6IE1vZGVsVHlwZTxUPikge1xyXG4gICAgLy8gVE9ETyBjaGVjayB3aHkgaXMgYXR0cmlidXRlc01ldGFkYXRhIGZyb20gdGhlIGFyZ3VtZW50cyBuZXZlciB1c2VkXHJcblxyXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gYXR0cmlidXRlc01ldGFkYXRhKSB7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGVzTWV0YWRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSkge1xyXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiBhbnkgPSBhdHRyaWJ1dGVzTWV0YWRhdGFbcHJvcGVydHlOYW1lXTtcclxuXHJcbiAgICAgICAgaWYgKG1ldGFkYXRhLmhhc0RpcnR5QXR0cmlidXRlcykge1xyXG4gICAgICAgICAgbWV0YWRhdGEuaGFzRGlydHlBdHRyaWJ1dGVzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcykge1xyXG4gICAgICByZXMuYXR0cmlidXRlTWV0YWRhdGEgPSBhdHRyaWJ1dGVzTWV0YWRhdGE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkYXRhc3RvcmVDb25maWcoKTogRGF0YXN0b3JlQ29uZmlnIHtcclxuICAgIGNvbnN0IGNvbmZpZ0Zyb21EZWNvcmF0b3I6IERhdGFzdG9yZUNvbmZpZyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoJ0Jhc2VEYXRhc3RvcmVDb25maWcnLCB0aGlzLmNvbnN0cnVjdG9yKTtcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGNvbmZpZ0Zyb21EZWNvcmF0b3IsIHRoaXMuY29uZmlnKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCB0cmFuc2Zvcm1TZXJpYWxpemVkTmFtZXNUb1Byb3BlcnR5TmFtZXM8VCBleHRlbmRzIEJhc2VNb2RlbD4obW9kZWxUeXBlOiBNb2RlbFR5cGU8VD4sIGF0dHJpYnV0ZXM6IGFueSkge1xyXG4gICAgY29uc3Qgc2VyaWFsaXplZE5hbWVUb1Byb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWxQcm9wZXJ0eU5hbWVzKG1vZGVsVHlwZS5wcm90b3R5cGUpO1xyXG4gICAgY29uc3QgcHJvcGVydGllczogYW55ID0ge307XHJcblxyXG4gICAgT2JqZWN0LmtleXMoc2VyaWFsaXplZE5hbWVUb1Byb3BlcnR5TmFtZSkuZm9yRWFjaCgoc2VyaWFsaXplZE5hbWUpID0+IHtcclxuICAgICAgaWYgKGF0dHJpYnV0ZXNbc2VyaWFsaXplZE5hbWVdICE9PSBudWxsICYmIGF0dHJpYnV0ZXNbc2VyaWFsaXplZE5hbWVdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBwcm9wZXJ0aWVzW3NlcmlhbGl6ZWROYW1lVG9Qcm9wZXJ0eU5hbWVbc2VyaWFsaXplZE5hbWVdXSA9IGF0dHJpYnV0ZXNbc2VyaWFsaXplZE5hbWVdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcHJvcGVydGllcztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRNb2RlbFByb3BlcnR5TmFtZXMobW9kZWw6IEJhc2VNb2RlbCkge1xyXG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0TWV0YWRhdGEoJ0F0dHJpYnV0ZU1hcHBpbmcnLCBtb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYnVpbGRIZWFkZXJzKGN1c3RvbUhlYWRlcnM/OiBIdHRwSGVhZGVycyk6IEh0dHBIZWFkZXJzIHtcclxuICAgIGNvbnN0IGhlYWRlcnM6IGFueSA9IHtcclxuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcclxuICAgICAgLy8gJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi92bmQuYXBpK2pzb24nLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbidcclxuICAgIH07XHJcbiAgICBpZiAoY3VzdG9tSGVhZGVycyAmJiBjdXN0b21IZWFkZXJzLmtleXMoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcclxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgaGVhZGVycywgY3VzdG9tSGVhZGVycy5rZXlzKCkubWFwKGhlYWRlcl9uYW1lID0+IHtcclxuICAgICAgICBoZWFkZXJzWycnICsgaGVhZGVyX25hbWVdID0gY3VzdG9tSGVhZGVycy5nZXQoaGVhZGVyX25hbWUpO1xyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IEh0dHBIZWFkZXJzKGhlYWRlcnMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGJ1aWxkUGFyYW1zPFQgZXh0ZW5kcyBCYXNlTW9kZWw+KG1vZGVsVHlwZTogTW9kZWxUeXBlPFQ+LFxyXG4gICAgcGFyYW1zOiBhbnkpOiBIdHRwUGFyYW1zIHtcclxuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgT2JqZWN0LmtleXMocGFyYW1zKVxyXG4gICAgICAgIC5maWx0ZXIoa2V5ID0+IHtcclxuICAgICAgICAgIGNvbnN0IHYgPSBwYXJhbXNba2V5XTtcclxuICAgICAgICAgIHJldHVybiAoQXJyYXkuaXNBcnJheSh2KSB8fCB0eXBlb2YgdiA9PT0gJ3N0cmluZycpID9cclxuICAgICAgICAgICAgKHYubGVuZ3RoID4gMCkgOlxyXG4gICAgICAgICAgICAodiAhPT0gbnVsbCAmJiB2ICE9PSB1bmRlZmluZWQpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLnNldChrZXksIHBhcmFtc1trZXldKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1vZGVsQ29uZmlnOiBNb2RlbENvbmZpZyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoJ0Jhc2VNb2RlbENvbmZpZycsIG1vZGVsVHlwZSk7XHJcbiAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5zZXQoJ2J5cGFzc0NhY2hlJywgbW9kZWxDb25maWcuYnlwYXNzQ2FjaGUgfHwgZmFsc2UpO1xyXG4gICAgcmV0dXJuIGh0dHBQYXJhbXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJvdGVjdGVkIGVudGl0eVRvTW9kZWw8VCBleHRlbmRzIEJhc2VNb2RlbD4oXHJcbiAgICByZXM6IGFueSxcclxuICAgIG1vZGVsVHlwZTogTW9kZWxUeXBlPFQ+LFxyXG4gICAgbW9kZWw/OiBUXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdGhpcy5leHRyYWN0UmVjb3JkRGF0YUpzb24ocmVzLCBtb2RlbFR5cGUsIG1vZGVsKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGV4dHJhY3RSZWNvcmREYXRhSnNvbjxUIGV4dGVuZHMgQmFzZU1vZGVsPihcclxuICAgIHJlczogUmVzcG9uc2UsXHJcbiAgICBtb2RlbFR5cGU6IE1vZGVsVHlwZTxUPixcclxuICAgIG1vZGVsPzogVFxyXG4gICk6IFQge1xyXG4gICAgY29uc3QgYm9keTogYW55ID0gcmVzO1xyXG4gICAgaWYgKCFib2R5KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gYm9keSBpbiByZXNwb25zZScpO1xyXG4gICAgfVxyXG4gICAgaWYgKG1vZGVsKSB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24obW9kZWwsIGJvZHkpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGVzZXJpYWxpemVkTW9kZWwgPSBtb2RlbCB8fCB0aGlzLmRlc2VyaWFsaXplTW9kZWwobW9kZWxUeXBlLCBib2R5LmRhdGEgfHwgYm9keSk7XHJcbiAgICByZXR1cm4gZGVzZXJpYWxpemVkTW9kZWw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW9kZWxUb0VudGl0eTxUIGV4dGVuZHMgQmFzZU1vZGVsPihcclxuICAgIG1vZGVsOiBULFxyXG4gICAgYXR0cmlidXRlc01ldGFkYXRhOiBhbnksXHJcbiAgICBhbGxBdHRyaWJ1dGVzOiBib29sZWFuID0gZmFsc2VcclxuICApOiBhbnkge1xyXG4gICAgbGV0IGF0dHJpYnV0ZXM7XHJcbiAgICBpZiAoYWxsQXR0cmlidXRlcykge1xyXG4gICAgICBhdHRyaWJ1dGVzID0gdGhpcy5nZXRBbGxBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNNZXRhZGF0YSwgbW9kZWwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXR0cmlidXRlcyA9IHRoaXMuZ2V0RGlydHlBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNNZXRhZGF0YSwgbW9kZWwpO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5nZXRSZWxhdGlvbnNoaXBzKG1vZGVsLCBhdHRyaWJ1dGVzKTtcclxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xyXG4gIH1cclxuICBwcml2YXRlIF90b1F1ZXJ5U3RyaW5nKHBhcmFtczogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBxcy5zdHJpbmdpZnkocGFyYW1zLCB7IGFycmF5Rm9ybWF0OiAnYnJhY2tldHMnIH0pO1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiJdfQ==