@stemy/ngx-utils 12.1.3 → 13.0.2

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 (156) hide show
  1. package/esm2020/ngx-utils/common-types.mjs +116 -0
  2. package/esm2020/ngx-utils/components/dynamic-table/dynamic-table.component.mjs +407 -0
  3. package/esm2020/ngx-utils/components/pagination-menu/pagination-menu.component.mjs +191 -0
  4. package/esm2020/ngx-utils/components/unordered-list/unordered-list.component.mjs +261 -0
  5. package/esm2020/ngx-utils/directives/async-method.base.mjs +68 -0
  6. package/esm2020/ngx-utils/directives/async-method.directive.mjs +28 -0
  7. package/esm2020/ngx-utils/directives/background.directive.mjs +51 -0
  8. package/esm2020/ngx-utils/directives/dynamic-table-template.directive.mjs +20 -0
  9. package/esm2020/ngx-utils/directives/global-template.directive.mjs +30 -0
  10. package/esm2020/ngx-utils/directives/icon.directive.mjs +71 -0
  11. package/esm2020/ngx-utils/directives/ngx-template-outlet.directive.mjs +90 -0
  12. package/esm2020/ngx-utils/directives/pagination-item.directive.mjs +33 -0
  13. package/esm2020/ngx-utils/directives/pagination.directive.mjs +83 -0
  14. package/esm2020/ngx-utils/directives/resource-if.directive.mjs +50 -0
  15. package/esm2020/ngx-utils/directives/sticky-class.directive.mjs +34 -0
  16. package/esm2020/ngx-utils/directives/sticky.directive.mjs +59 -0
  17. package/esm2020/ngx-utils/directives/unordered-list-item.directive.mjs +77 -0
  18. package/esm2020/ngx-utils/directives/unordered-list-template.directive.mjs +26 -0
  19. package/esm2020/ngx-utils/ngx-utils.module.mjs +322 -0
  20. package/esm2020/ngx-utils/pipes/chunk.pipe.mjs +25 -0
  21. package/esm2020/ngx-utils/pipes/entries.pipe.mjs +28 -0
  22. package/esm2020/ngx-utils/pipes/extra-item-properties.pipe.mjs +31 -0
  23. package/esm2020/ngx-utils/pipes/filter.pipe.mjs +42 -0
  24. package/esm2020/ngx-utils/pipes/find.pipe.mjs +29 -0
  25. package/esm2020/ngx-utils/pipes/format-number.pipe.mjs +21 -0
  26. package/esm2020/ngx-utils/pipes/get-offset.pipe.mjs +17 -0
  27. package/esm2020/ngx-utils/pipes/get-type.pipe.mjs +16 -0
  28. package/esm2020/ngx-utils/pipes/global-template.pipe.mjs +41 -0
  29. package/esm2020/ngx-utils/pipes/group-by.pipe.mjs +27 -0
  30. package/esm2020/ngx-utils/pipes/is-type.pipe.mjs +16 -0
  31. package/esm2020/ngx-utils/pipes/join.pipe.mjs +19 -0
  32. package/esm2020/ngx-utils/pipes/keys.pipe.mjs +22 -0
  33. package/esm2020/ngx-utils/pipes/map.pipe.mjs +29 -0
  34. package/esm2020/ngx-utils/pipes/max.pipe.mjs +26 -0
  35. package/esm2020/ngx-utils/pipes/min.pipe.mjs +26 -0
  36. package/esm2020/ngx-utils/pipes/reduce.pipe.mjs +30 -0
  37. package/esm2020/ngx-utils/pipes/remap.pipe.mjs +32 -0
  38. package/esm2020/ngx-utils/pipes/replace.pipe.mjs +16 -0
  39. package/esm2020/ngx-utils/pipes/reverse.pipe.mjs +24 -0
  40. package/esm2020/ngx-utils/pipes/round.pipe.mjs +21 -0
  41. package/esm2020/ngx-utils/pipes/safe-html.pipe.mjs +34 -0
  42. package/esm2020/ngx-utils/pipes/translate.pipe.mjs +86 -0
  43. package/esm2020/ngx-utils/pipes/values.pipe.mjs +22 -0
  44. package/esm2020/ngx-utils/plugins/resize-event.plugin.mjs +59 -0
  45. package/esm2020/ngx-utils/plugins/scroll-event.plugin.mjs +39 -0
  46. package/esm2020/ngx-utils/services/acl.service.mjs +81 -0
  47. package/esm2020/ngx-utils/services/api.service.mjs +38 -0
  48. package/esm2020/ngx-utils/services/auth.service.mjs +14 -0
  49. package/esm2020/ngx-utils/services/base-http.client.mjs +47 -0
  50. package/esm2020/ngx-utils/services/base-http.service.mjs +298 -0
  51. package/esm2020/ngx-utils/services/config.service.mjs +129 -0
  52. package/esm2020/ngx-utils/services/error-handler.service.mjs +49 -0
  53. package/esm2020/ngx-utils/services/events.service.mjs +26 -0
  54. package/esm2020/ngx-utils/services/formatter.service.mjs +47 -0
  55. package/esm2020/ngx-utils/services/global-template.service.mjs +37 -0
  56. package/esm2020/ngx-utils/services/icon.service.mjs +26 -0
  57. package/esm2020/ngx-utils/services/language.service.mjs +113 -0
  58. package/esm2020/ngx-utils/services/open-api.service.mjs +40 -0
  59. package/esm2020/ngx-utils/services/promise.service.mjs +55 -0
  60. package/esm2020/ngx-utils/services/state.service.mjs +173 -0
  61. package/esm2020/ngx-utils/services/static-language.service.mjs +166 -0
  62. package/esm2020/ngx-utils/services/storage.service.mjs +49 -0
  63. package/esm2020/ngx-utils/services/toaster.service.mjs +32 -0
  64. package/esm2020/ngx-utils/services/translated-url.serializer.mjs +73 -0
  65. package/esm2020/ngx-utils/services/universal.service.mjs +78 -0
  66. package/esm2020/ngx-utils/utils/ajax-request-handler.mjs +40 -0
  67. package/esm2020/ngx-utils/utils/array.utils.mjs +100 -0
  68. package/esm2020/ngx-utils/utils/auth.guard.mjs +181 -0
  69. package/esm2020/ngx-utils/utils/canvas.utils.mjs +388 -0
  70. package/esm2020/ngx-utils/utils/date.utils.mjs +28 -0
  71. package/esm2020/ngx-utils/utils/file.utils.mjs +90 -0
  72. package/esm2020/ngx-utils/utils/generic-value.mjs +20 -0
  73. package/esm2020/ngx-utils/utils/geometry.mjs +132 -0
  74. package/esm2020/ngx-utils/utils/initializer.mjs +20 -0
  75. package/esm2020/ngx-utils/utils/loader.utils.mjs +55 -0
  76. package/esm2020/ngx-utils/utils/math.utils.mjs +15 -0
  77. package/esm2020/ngx-utils/utils/object.utils.mjs +261 -0
  78. package/esm2020/ngx-utils/utils/observable.utils.mjs +63 -0
  79. package/esm2020/ngx-utils/utils/reflect.utils.mjs +33 -0
  80. package/esm2020/ngx-utils/utils/set.utils.mjs +20 -0
  81. package/esm2020/ngx-utils/utils/string.utils.mjs +28 -0
  82. package/esm2020/ngx-utils/utils/timer.utils.mjs +52 -0
  83. package/esm2020/ngx-utils/utils/unique.utils.mjs +24 -0
  84. package/esm2020/ngx-utils/utils/vector.mjs +77 -0
  85. package/esm2020/public_api.mjs +85 -0
  86. package/esm2020/stemy-ngx-utils.mjs +5 -0
  87. package/fesm2015/stemy-ngx-utils.mjs +5990 -0
  88. package/fesm2015/stemy-ngx-utils.mjs.map +1 -0
  89. package/fesm2020/stemy-ngx-utils.mjs +5650 -0
  90. package/fesm2020/stemy-ngx-utils.mjs.map +1 -0
  91. package/ngx-utils/components/dynamic-table/dynamic-table.component.d.ts +3 -0
  92. package/ngx-utils/components/pagination-menu/pagination-menu.component.d.ts +3 -0
  93. package/ngx-utils/components/unordered-list/unordered-list.component.d.ts +3 -0
  94. package/ngx-utils/directives/async-method.base.d.ts +3 -0
  95. package/ngx-utils/directives/async-method.directive.d.ts +3 -0
  96. package/ngx-utils/directives/background.directive.d.ts +3 -0
  97. package/ngx-utils/directives/dynamic-table-template.directive.d.ts +3 -0
  98. package/ngx-utils/directives/global-template.directive.d.ts +3 -0
  99. package/ngx-utils/directives/icon.directive.d.ts +3 -0
  100. package/ngx-utils/directives/ngx-template-outlet.directive.d.ts +3 -0
  101. package/ngx-utils/directives/pagination-item.directive.d.ts +3 -0
  102. package/ngx-utils/directives/pagination.directive.d.ts +3 -0
  103. package/ngx-utils/directives/resource-if.directive.d.ts +3 -0
  104. package/ngx-utils/directives/sticky-class.directive.d.ts +3 -0
  105. package/ngx-utils/directives/sticky.directive.d.ts +3 -0
  106. package/ngx-utils/directives/unordered-list-item.directive.d.ts +3 -0
  107. package/ngx-utils/directives/unordered-list-template.directive.d.ts +3 -0
  108. package/ngx-utils/pipes/chunk.pipe.d.ts +3 -0
  109. package/ngx-utils/pipes/entries.pipe.d.ts +3 -0
  110. package/ngx-utils/pipes/extra-item-properties.pipe.d.ts +3 -0
  111. package/ngx-utils/pipes/filter.pipe.d.ts +3 -0
  112. package/ngx-utils/pipes/find.pipe.d.ts +3 -0
  113. package/ngx-utils/pipes/format-number.pipe.d.ts +3 -0
  114. package/ngx-utils/pipes/get-offset.pipe.d.ts +3 -0
  115. package/ngx-utils/pipes/get-type.pipe.d.ts +3 -0
  116. package/ngx-utils/pipes/global-template.pipe.d.ts +3 -0
  117. package/ngx-utils/pipes/group-by.pipe.d.ts +3 -0
  118. package/ngx-utils/pipes/is-type.pipe.d.ts +3 -0
  119. package/ngx-utils/pipes/join.pipe.d.ts +3 -0
  120. package/ngx-utils/pipes/keys.pipe.d.ts +3 -0
  121. package/ngx-utils/pipes/map.pipe.d.ts +3 -0
  122. package/ngx-utils/pipes/max.pipe.d.ts +3 -0
  123. package/ngx-utils/pipes/min.pipe.d.ts +3 -0
  124. package/ngx-utils/pipes/reduce.pipe.d.ts +3 -0
  125. package/ngx-utils/pipes/remap.pipe.d.ts +3 -0
  126. package/ngx-utils/pipes/replace.pipe.d.ts +3 -0
  127. package/ngx-utils/pipes/reverse.pipe.d.ts +3 -0
  128. package/ngx-utils/pipes/round.pipe.d.ts +3 -0
  129. package/ngx-utils/pipes/safe-html.pipe.d.ts +3 -0
  130. package/ngx-utils/pipes/translate.pipe.d.ts +4 -0
  131. package/ngx-utils/pipes/values.pipe.d.ts +3 -0
  132. package/ngx-utils/plugins/resize-event.plugin.d.ts +4 -1
  133. package/ngx-utils/plugins/scroll-event.plugin.d.ts +4 -1
  134. package/ngx-utils/services/acl.service.d.ts +3 -0
  135. package/ngx-utils/services/api.service.d.ts +3 -0
  136. package/ngx-utils/services/base-http.client.d.ts +3 -0
  137. package/ngx-utils/services/base-http.service.d.ts +3 -0
  138. package/ngx-utils/services/config.service.d.ts +3 -0
  139. package/ngx-utils/services/error-handler.service.d.ts +3 -0
  140. package/ngx-utils/services/events.service.d.ts +3 -0
  141. package/ngx-utils/services/formatter.service.d.ts +3 -0
  142. package/ngx-utils/services/global-template.service.d.ts +3 -0
  143. package/ngx-utils/services/icon.service.d.ts +3 -0
  144. package/ngx-utils/services/language.service.d.ts +3 -0
  145. package/ngx-utils/services/open-api.service.d.ts +3 -0
  146. package/ngx-utils/services/promise.service.d.ts +3 -0
  147. package/ngx-utils/services/state.service.d.ts +3 -0
  148. package/ngx-utils/services/static-language.service.d.ts +3 -0
  149. package/ngx-utils/services/storage.service.d.ts +3 -0
  150. package/ngx-utils/services/toaster.service.d.ts +3 -0
  151. package/ngx-utils/services/translated-url.serializer.d.ts +3 -0
  152. package/ngx-utils/services/universal.service.d.ts +3 -0
  153. package/ngx-utils/utils/auth.guard.d.ts +3 -0
  154. package/package.json +37 -19
  155. package/public_api.d.ts +1 -0
  156. package/stemy-ngx-utils.d.ts +1 -2
@@ -0,0 +1,116 @@
1
+ import { InjectionToken, TemplateRef } from "@angular/core";
2
+ import { ReflectUtils } from "./utils/reflect.utils";
3
+ import { ObjectUtils } from "./utils/object.utils";
4
+ export class CanvasColor {
5
+ constructor(r, g, b, a = 255) {
6
+ this.r = r;
7
+ this.g = g;
8
+ this.b = b;
9
+ this.a = a;
10
+ }
11
+ }
12
+ export const ICON_SERVICE = new InjectionToken("icon-service");
13
+ export const LANGUAGE_SERVICE = new InjectionToken("language-service");
14
+ export const AUTH_SERVICE = new InjectionToken("auth-service");
15
+ // --- Storage Service ---
16
+ export var StorageMode;
17
+ (function (StorageMode) {
18
+ StorageMode[StorageMode["Local"] = 0] = "Local";
19
+ StorageMode[StorageMode["Session"] = 1] = "Session";
20
+ })(StorageMode || (StorageMode = {}));
21
+ export const TOASTER_SERVICE = new InjectionToken("toaster-service");
22
+ export const PROMISE_SERVICE = new InjectionToken("promise-service");
23
+ // --- Unordered list ---
24
+ export class UnorederedListTemplate extends TemplateRef {
25
+ }
26
+ // --- Reflect utils ---
27
+ export function FactoryDependencies(...dependencies) {
28
+ return function (target, method) {
29
+ ReflectUtils.defineMetadata("factoryDependencies", dependencies, target, method);
30
+ };
31
+ }
32
+ export class PaginationItemContext {
33
+ constructor(item, parallelItem, count, index, dataIndex) {
34
+ this.item = item;
35
+ this.parallelItem = parallelItem;
36
+ this.count = count;
37
+ this.index = index;
38
+ this.dataIndex = dataIndex;
39
+ }
40
+ get first() {
41
+ return this.index === 0;
42
+ }
43
+ get last() {
44
+ return this.index === this.count - 1;
45
+ }
46
+ get even() {
47
+ return this.index % 2 === 0;
48
+ }
49
+ get odd() {
50
+ return !this.even;
51
+ }
52
+ // Support for old dynamic table implementation
53
+ get row() {
54
+ console.log("DynamicTable row is deprecated use item instead");
55
+ return this.item;
56
+ }
57
+ // Support for old dynamic table implementation
58
+ get parallelRow() {
59
+ console.log("DynamicTable parallelRow is deprecated use parallelItem instead");
60
+ return this.parallelItem;
61
+ }
62
+ filter(filterRx) {
63
+ const keys = Object.keys(this.item);
64
+ for (const key of keys) {
65
+ const value = this.item[key];
66
+ if (ObjectUtils.isNullOrUndefined(value) || ObjectUtils.isObject(value))
67
+ continue;
68
+ const testValue = ObjectUtils.isString(value) ? value : value.toString();
69
+ if (testValue.match(filterRx))
70
+ return true;
71
+ }
72
+ return false;
73
+ }
74
+ }
75
+ export class HttpPromise extends Promise {
76
+ constructor(rejectHandler, executor) {
77
+ super(executor);
78
+ this.rejectHandler = rejectHandler;
79
+ this.attachCount = 0;
80
+ this.runCount = 0;
81
+ }
82
+ then(onFulfilled, onRejected) {
83
+ this.attachCount++;
84
+ return super.then(value => {
85
+ this.runCount++;
86
+ return onFulfilled ? onFulfilled(value) : null;
87
+ }, (reason) => {
88
+ const result = onRejected ? onRejected(reason) : null;
89
+ this.hasRejectHandler = this.hasRejectHandler || (onRejected && result !== false);
90
+ this.runCount++;
91
+ this.rejectHandler(this.runCount == this.attachCount && !this.hasRejectHandler ? reason : null);
92
+ return result;
93
+ });
94
+ }
95
+ catch(onRejected) {
96
+ return this.then(null, onRejected);
97
+ }
98
+ }
99
+ export const EXPRESS_REQUEST = new InjectionToken("express-request");
100
+ export const API_SERVICE = new InjectionToken("api-service");
101
+ // --- Resource if ---
102
+ export class ResourceIfContext {
103
+ }
104
+ // --- ConfigService ---
105
+ export class IConfiguration {
106
+ }
107
+ export const CONFIG_SERVICE = new InjectionToken("config-service");
108
+ export const BASE_CONFIG = new InjectionToken("base-config");
109
+ export const SCRIPT_PARAMS = new InjectionToken("script-params");
110
+ export const ROOT_ELEMENT = new InjectionToken("app-root-element");
111
+ export const ERROR_HANDLER = new InjectionToken("error-handler-callback");
112
+ export const GLOBAL_TEMPLATES = new InjectionToken("global-templates");
113
+ // --- Valued promise ---
114
+ export class ValuedPromise extends Promise {
115
+ }
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25neC11dGlscy9jb21tb24tdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLGNBQWMsRUFBOEIsV0FBVyxFQUFPLE1BQU0sZUFBZSxDQUFDO0FBSTFHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFTakQsTUFBTSxPQUFPLFdBQVc7SUFDcEIsWUFBbUIsQ0FBUyxFQUFTLENBQVMsRUFBUyxDQUFTLEVBQVMsSUFBWSxHQUFHO1FBQXJFLE1BQUMsR0FBRCxDQUFDLENBQVE7UUFBUyxNQUFDLEdBQUQsQ0FBQyxDQUFRO1FBQVMsTUFBQyxHQUFELENBQUMsQ0FBUTtRQUFTLE1BQUMsR0FBRCxDQUFDLENBQWM7SUFFeEYsQ0FBQztDQUNKO0FBU0QsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQyxJQUFJLGNBQWMsQ0FBZSxjQUFjLENBQUMsQ0FBQztBQW9DM0csTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQXFDLElBQUksY0FBYyxDQUFtQixrQkFBa0IsQ0FBQyxDQUFDO0FBb0IzSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlDLElBQUksY0FBYyxDQUFlLGNBQWMsQ0FBQyxDQUFDO0FBbUIzRywwQkFBMEI7QUFDMUIsTUFBTSxDQUFOLElBQVksV0FHWDtBQUhELFdBQVksV0FBVztJQUNuQiwrQ0FBSyxDQUFBO0lBQ0wsbURBQU8sQ0FBQTtBQUNYLENBQUMsRUFIVyxXQUFXLEtBQVgsV0FBVyxRQUd0QjtBQVVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBb0MsSUFBSSxjQUFjLENBQWtCLGlCQUFpQixDQUFDLENBQUM7QUFjdkgsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLElBQUksY0FBYyxDQUFrQixpQkFBaUIsQ0FBQyxDQUFD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QUFXLEdBQUcsSUFBSSxjQUFjLENBQWlCLGFBQWEsQ0FBQyxDQUFDO0FBRTdFLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLGNBQWMsQ0FBTSxlQUFlLENBQUMsQ0FBQztBQUV0RSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWdDLElBQUksY0FBYyxDQUFjLGtCQUFrQixDQUFDLENBQUM7QUFLN0csTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLElBQUksY0FBYyxDQUF1Qix3QkFBd0IsQ0FBQyxDQUFDO0FBY2hHLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUF1QixrQkFBa0IsQ0FBQyxDQUFDO0FBaUI3Rix5QkFBeUI7QUFDekIsTUFBTSxPQUFPLGFBQWlCLFNBQVEsT0FBVTtDQUUvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RXZlbnRFbWl0dGVyLCBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0b3IsIE5nWm9uZSwgUHJvdmlkZXIsIFRlbXBsYXRlUmVmLCBUeXBlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVyc30gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7QWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgRGF0YSwgUm91dGUsIFVybFRyZWV9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHtSZXF1ZXN0fSBmcm9tIFwiZXhwcmVzc1wiO1xyXG5pbXBvcnQge1JlZmxlY3RVdGlsc30gZnJvbSBcIi4vdXRpbHMvcmVmbGVjdC51dGlsc1wiO1xyXG5pbXBvcnQge09iamVjdFV0aWxzfSBmcm9tIFwiLi91dGlscy9vYmplY3QudXRpbHNcIjtcclxuXHJcbi8vIC0tLSBVdGlsc1xyXG5leHBvcnQgaW50ZXJmYWNlIElSZXNvbHZlRmFjdG9yeSB7XHJcbiAgICBmdW5jOiBGdW5jdGlvbjtcclxuICAgIHR5cGU/OiBhbnk7XHJcbiAgICBwYXJhbXM/OiBhbnlbXTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENhbnZhc0NvbG9yIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByOiBudW1iZXIsIHB1YmxpYyBnOiBudW1iZXIsIHB1YmxpYyBiOiBudW1iZXIsIHB1YmxpYyBhOiBudW1iZXIgPSAyNTUpIHtcclxuXHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIC0tLSBJY29uIHNlcnZpY2UgLS0tXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUljb25TZXJ2aWNlIHtcclxuICAgIGlzRGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgICBpY29uc0xvYWRlZDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgICBnZXRJY29uKGljb246IHN0cmluZywgYWN0aXZlSWNvbjogc3RyaW5nLCBhY3RpdmU6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBJQ09OX1NFUlZJQ0U6IEluamVjdGlvblRva2VuPElJY29uU2VydmljZT4gPSBuZXcgSW5qZWN0aW9uVG9rZW48SUljb25TZXJ2aWNlPihcImljb24tc2VydmljZVwiKTtcclxuXHJcbi8vIC0tLSBMYW5ndWFnZSBzZXJ2aWNlIC0tLVxyXG5leHBvcnQgaW50ZXJmYWNlIElUcmFuc2xhdGlvbiB7XHJcbiAgICBsYW5nOiBzdHJpbmc7XHJcbiAgICB0cmFuc2xhdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUcmFuc2xhdGlvbnMge1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElMYW5ndWFnZVNldHRpbmdzIHtcclxuICAgIGxhbmd1YWdlczogc3RyaW5nW107XHJcbiAgICBkZXZMYW5ndWFnZXM6IHN0cmluZ1tdO1xyXG4gICAgZGVmYXVsdExhbmd1YWdlOiBzdHJpbmc7XHJcbiAgICBzZXR0aW5ncz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTGFuZ3VhZ2VTZXJ2aWNlIHtcclxuICAgIGN1cnJlbnRMYW5ndWFnZTogc3RyaW5nO1xyXG4gICAgZWRpdExhbmd1YWdlOiBzdHJpbmc7XHJcbiAgICBkaXNhYmxlVHJhbnNsYXRpb25zOiBib29sZWFuO1xyXG4gICAgZGVmYXVsdExhbmd1YWdlOiBzdHJpbmc7XHJcbiAgICBkaWN0aW9uYXJ5OiBJVHJhbnNsYXRpb25zO1xyXG4gICAgcmVhZG9ubHkgbGFuZ3VhZ2VzOiBSZWFkb25seUFycmF5PHN0cmluZz47XHJcbiAgICByZWFkb25seSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50O1xyXG4gICAgcmVwbGFjZUxhbmd1YWdlcyhsYW5ndWFnZXM6IHN0cmluZ1tdKTogdm9pZDtcclxuICAgIGFkZExhbmd1YWdlcyhsYW5ndWFnZXM6IHN0cmluZ1tdKTogdm9pZDtcclxuICAgIGdldFRyYW5zbGF0aW9uU3luYyhrZXk6IHN0cmluZywgcGFyYW1zPzogYW55KTogc3RyaW5nO1xyXG4gICAgZ2V0VHJhbnNsYXRpb24oa2V5OiBzdHJpbmcsIHBhcmFtcz86IGFueSk6IFByb21pc2U8c3RyaW5nPjtcclxuICAgIGdldFRyYW5zbGF0aW9ucyguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8SVRyYW5zbGF0aW9ucz47XHJcbiAgICBnZXRUcmFuc2xhdGlvbkZyb21PYmplY3QodHJhbnNsYXRpb25zOiBJVHJhbnNsYXRpb25zLCBwYXJhbXM/OiBhbnksIGxhbmc/OiBzdHJpbmcpOiBzdHJpbmc7XHJcbiAgICBnZXRUcmFuc2xhdGlvbkZyb21BcnJheSh0cmFuc2xhdGlvbnM6IElUcmFuc2xhdGlvbltdLCBwYXJhbXM/OiBhbnksIGxhbmc/OiBzdHJpbmcpOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBMQU5HVUFHRV9TRVJWSUNFOiBJbmplY3Rpb25Ub2tlbjxJTGFuZ3VhZ2VTZXJ2aWNlPiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJTGFuZ3VhZ2VTZXJ2aWNlPihcImxhbmd1YWdlLXNlcnZpY2VcIik7XHJcblxyXG4vLyAtLS0gQXV0aCBTZXJ2aWNlIC0tLVxyXG5leHBvcnQgaW50ZXJmYWNlIElBdXRoU2VydmljZSB7XHJcbiAgICBpc0F1dGhlbnRpY2F0ZWQ6IGJvb2xlYW47XHJcbiAgICB1c2VyQ2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgICBjaGVja0F1dGhlbnRpY2F0ZWQoKTogUHJvbWlzZTxib29sZWFuPjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUm91dGVWYWxpZGF0b3IgPSAoYXV0aDogSUF1dGhTZXJ2aWNlLCByb3V0ZT86IElSb3V0ZSwgbmV4dD86IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpID0+IFByb21pc2U8Ym9vbGVhbj47XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSb3V0ZURhdGEgZXh0ZW5kcyBEYXRhIHtcclxuICAgIHJldHVyblN0YXRlPzogc3RyaW5nW107XHJcbiAgICBndWFyZHM/OiBBcnJheTxJUmVzb2x2ZUZhY3RvcnkgfCBSb3V0ZVZhbGlkYXRvcj47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJvdXRlIGV4dGVuZHMgUm91dGUge1xyXG4gICAgZGF0YT86IElSb3V0ZURhdGE7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBBVVRIX1NFUlZJQ0U6IEluamVjdGlvblRva2VuPElBdXRoU2VydmljZT4gPSBuZXcgSW5qZWN0aW9uVG9rZW48SUF1dGhTZXJ2aWNlPihcImF1dGgtc2VydmljZVwiKTtcclxuXHJcbi8vIC0tLSBBY2wgU2VydmljZSAtLS1cclxuZXhwb3J0IGludGVyZmFjZSBJQWNsQ29tcG9uZW50IHtcclxuICAgIG9uVXNlckluaXRpYWxpemVkKCk6IHZvaWQ7XHJcbiAgICBvblVzZXJDaGFuZ2VkKCk6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJvdXRlU3RhdGVJbmZvIHtcclxuICAgIHJvdXRlOiBJUm91dGU7XHJcbiAgICBndWFyZDogYW55O1xyXG4gICAgZGlydHk6IGJvb2xlYW47XHJcbiAgICBmaXJzdDogYm9vbGVhbjtcclxuICAgIGNvbXBvbmVudD86IGFueTtcclxufVxyXG5cclxuLy8gLS0tIFN0YXRlIFNlcnZpY2UgLS0tXHJcbmV4cG9ydCB0eXBlIE5hdmlnYXRpb25VcmxQYXJhbSA9IGFueVtdIHwgc3RyaW5nIHwgVXJsVHJlZTtcclxuXHJcbi8vIC0tLSBTdG9yYWdlIFNlcnZpY2UgLS0tXHJcbmV4cG9ydCBlbnVtIFN0b3JhZ2VNb2RlIHtcclxuICAgIExvY2FsLFxyXG4gICAgU2Vzc2lvblxyXG59XHJcblxyXG4vLyAtLS0gVG9hc3RlciBTZXJ2aWNlIC0tLVxyXG5leHBvcnQgaW50ZXJmYWNlIElUb2FzdGVyU2VydmljZSB7XHJcbiAgICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIHBhcmFtcz86IGFueSwgdGl0bGU/OiBzdHJpbmcpOiB2b2lkO1xyXG4gICAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIHBhcmFtcz86IGFueSwgdGl0bGU/OiBzdHJpbmcpOiB2b2lkO1xyXG4gICAgc3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcsIHBhcmFtcz86IGFueSwgdGl0bGU/OiBzdHJpbmcpOiB2b2lkO1xyXG4gICAgd2FybmluZyhtZXNzYWdlOiBzdHJpbmcsIHBhcmFtcz86IGFueSwgdGl0bGU/OiBzdHJpbmcpOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgVE9BU1RFUl9TRVJWSUNFOiBJbmplY3Rpb25Ub2tlbjxJVG9hc3RlclNlcnZpY2U+ID0gbmV3IEluamVjdGlvblRva2VuPElUb2FzdGVyU2VydmljZT4oXCJ0b2FzdGVyLXNlcnZpY2VcIik7XHJcblxyXG4vLyAtLS0gUHJvbWlzZSBTZXJ2aWNlIC0tLVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUHJvbWlzZVNlcnZpY2Uge1xyXG4gICAgem9uZTogTmdab25lO1xyXG4gICAgY291bnQ6IG51bWJlcjtcclxuICAgIG9uQ2hhbmdlZDogRXZlbnRFbWl0dGVyPG51bWJlcj47XHJcbiAgICBjcmVhdGU8VD4oZXhlY3V0b3I6IChyZXNvbHZlOiAodmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZCkgPT4gdm9pZCk6IFByb21pc2U8VD47XHJcbiAgICBhbGwocHJvbWlzZXM6IFByb21pc2U8YW55PltdKTogUHJvbWlzZTxhbnk+O1xyXG4gICAgcmVzb2x2ZTxUPih2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KTogUHJvbWlzZTxUPjtcclxuICAgIHJlamVjdDxUPih2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KTogUHJvbWlzZTxUPjtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFBST01JU0VfU0VSVklDRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJUHJvbWlzZVNlcnZpY2U+KFwicHJvbWlzZS1zZXJ2aWNlXCIpO1xyXG5cclxuLy8gLS0tIEFzeW5jIG1ldGhvZCAtLS1cclxuZXhwb3J0IGludGVyZmFjZSBJQXN5bmNNZXNzYWdlIHtcclxuICAgIG1lc3NhZ2U6IHN0cmluZztcclxuICAgIGNvbnRleHQ/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEFzeW5jTWV0aG9kID0gKGNvbnRleHQ/OiBhbnkpID0+IFByb21pc2U8SUFzeW5jTWVzc2FnZT47XHJcblxyXG4vLyAtLS0gVW5vcmRlcmVkIGxpc3QgLS0tXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBVbm9yZWRlcmVkTGlzdFRlbXBsYXRlIGV4dGVuZHMgVGVtcGxhdGVSZWY8YW55PiB7XHJcbiAgICBhYnN0cmFjdCB0eXBlOiBzdHJpbmc7XHJcbiAgICBhYnN0cmFjdCBzZWxlY3Rvcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVub3JkZXJlZExpc3RUZW1wbGF0ZXMge1xyXG4gICAgW3R5cGU6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFVub3JkZXJlZExpc3RTdHlsZSA9IFwidGFibGVcIiB8IFwibGlzdFwiO1xyXG5cclxuLy8gLS0tIEFqYXggcmVxdWVzdCAgLS0tXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFqYXhSZXF1ZXN0RGV0YWlscyB7XHJcbiAgICByZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCxcclxuICAgIG1ldGhvZDogc3RyaW5nO1xyXG4gICAgdXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEFqYXhSZXF1ZXN0Q2FsbGJhY2sgPSAoZGV0YWlsczogSUFqYXhSZXF1ZXN0RGV0YWlscywgcGFyYW1zOiBhbnkpID0+IHZvaWQ7XHJcblxyXG4vLyAtLS0gTG9hZGVyIHV0aWxzIC0tLVxyXG5leHBvcnQgaW50ZXJmYWNlIElTY3JpcHRQcm9taXNlcyB7XHJcbiAgICBbc3JjOiBzdHJpbmddOiBQcm9taXNlPEhUTUxTY3JpcHRFbGVtZW50PjtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIElTdHlsZVByb21pc2VzIHtcclxuICAgIFtzcmM6IHN0cmluZ106IFByb21pc2U8SFRNTExpbmtFbGVtZW50PjtcclxufVxyXG5cclxuLy8gLS0tIE9ic2VydmFibGUgdXRpbHMgLS0tXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaE9ic2VydmFibGUge1xyXG4gICAgc2VhcmNoOiBzdHJpbmc7XHJcbiAgICBnZXRTZWFyY2hSZXN1bHRzKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPjtcclxufVxyXG5cclxuLy8gLS0tIFJlZmxlY3QgdXRpbHMgLS0tXHJcbmV4cG9ydCBmdW5jdGlvbiBGYWN0b3J5RGVwZW5kZW5jaWVzKC4uLmRlcGVuZGVuY2llczogQXJyYXk8SW5qZWN0aW9uVG9rZW48YW55PiB8IFByb3ZpZGVyPik6IE1ldGhvZERlY29yYXRvciB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogYW55LCBtZXRob2Q6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIFJlZmxlY3RVdGlscy5kZWZpbmVNZXRhZGF0YShcImZhY3RvcnlEZXBlbmRlbmNpZXNcIiwgZGVwZW5kZW5jaWVzLCB0YXJnZXQsIG1ldGhvZCk7XHJcbiAgICB9O1xyXG59XHJcblxyXG4vLyAtLS0gVGltZXIgdXRpbHMgLS0tXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRpbWVyIHtcclxuICAgIGlkPzogYW55O1xyXG4gICAgZnVuYz86IEZ1bmN0aW9uO1xyXG4gICAgdGltZT86IG51bWJlcjtcclxuICAgIHJ1bj86ICgpID0+IHZvaWQ7XHJcbiAgICBzZXQ/OiAoZnVuYzogRnVuY3Rpb24sIHRpbWU6IG51bWJlcikgPT4gdm9pZDtcclxuICAgIGNsZWFyPzogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuLy8gLS0tIEV4dHJhSXRlbVByb3BlcnRpZXMgLS0tXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUV4dHJhUHJvcGVydGllcyB7XHJcbiAgICBbcHJvcDogc3RyaW5nXTogYW55O1xyXG59XHJcblxyXG4vLyAtLS0gR3JvdXAgYnkgLS0tXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdyb3VwTWFwIHtcclxuICAgIFtjb2x1bW46IHN0cmluZ106IGFueTtcclxufVxyXG5cclxuLy8gLS0tIFRyYW5zbGF0ZSAtLS1cclxuZXhwb3J0IHR5cGUgVHJhbnNsYXRpb25RdWVyeSA9IHN0cmluZyB8IElUcmFuc2xhdGlvbnMgfCBJVHJhbnNsYXRpb25bXTtcclxuXHJcbi8vIC0tLSBQYWdpbmF0aW9uIC0tLVxyXG5leHBvcnQgaW50ZXJmYWNlIElQYWdlSW5mbyB7XHJcbiAgICB0ZXh0OiBzdHJpbmc7XHJcbiAgICBudW1iZXI6IG51bWJlcjtcclxuICAgIGFjdGl2ZTogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUGFnaW5hdGlvbkRhdGEge1xyXG4gICAgdG90YWw6IG51bWJlcjtcclxuICAgIGl0ZW1zOiBhbnlbXTtcclxuICAgIG1ldGE/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFBhZ2luYXRpb25EYXRhTG9hZGVyID0gKHBhZ2U6IG51bWJlciwgaXRlbXNQZXJQYWdlOiBudW1iZXIpID0+IFByb21pc2U8SVBhZ2luYXRpb25EYXRhPjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQYWdpbmF0aW9uSXRlbUNvbnRleHQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpdGVtOiBhbnksIHB1YmxpYyBwYXJhbGxlbEl0ZW06IGFueSwgcHVibGljIGNvdW50OiBudW1iZXIsIHB1YmxpYyBpbmRleDogbnVtYmVyLCBwdWJsaWMgZGF0YUluZGV4OiBudW1iZXIpIHtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZmlyc3QoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhc3QoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IHRoaXMuY291bnQgLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBldmVuKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4ICUgMiA9PT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb2RkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5ldmVuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN1cHBvcnQgZm9yIG9sZCBkeW5hbWljIHRhYmxlIGltcGxlbWVudGF0aW9uXHJcbiAgICBnZXQgcm93KCk6IGFueSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEeW5hbWljVGFibGUgcm93IGlzIGRlcHJlY2F0ZWQgdXNlIGl0ZW0gaW5zdGVhZFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN1cHBvcnQgZm9yIG9sZCBkeW5hbWljIHRhYmxlIGltcGxlbWVudGF0aW9uXHJcbiAgICBnZXQgcGFyYWxsZWxSb3coKTogYW55IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkR5bmFtaWNUYWJsZSBwYXJhbGxlbFJvdyBpcyBkZXByZWNhdGVkIHVzZSBwYXJhbGxlbEl0ZW0gaW5zdGVhZFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJhbGxlbEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyKGZpbHRlclJ4OiBSZWdFeHApOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5pdGVtKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtW2tleV07XHJcbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc051bGxPclVuZGVmaW5lZCh2YWx1ZSkgfHwgT2JqZWN0VXRpbHMuaXNPYmplY3QodmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgdGVzdFZhbHVlID0gT2JqZWN0VXRpbHMuaXNTdHJpbmcodmFsdWUpID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBpZiAodGVzdFZhbHVlLm1hdGNoKGZpbHRlclJ4KSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gLS0tIEh0dHAgc2VydmljZSAtLS1cclxuZXhwb3J0IGludGVyZmFjZSBJSHR0cEhlYWRlcnMge1xyXG4gICAgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUh0dHBQYXJhbXMge1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSZXF1ZXN0T3B0aW9ucyB7XHJcbiAgICBtZXRob2Q/OiBzdHJpbmc7XHJcbiAgICBib2R5PzogYW55O1xyXG4gICAgaGVhZGVycz86IElIdHRwSGVhZGVycyB8IEh0dHBIZWFkZXJzO1xyXG4gICAgb3JpZ2luYWxIZWFkZXJzPzogSUh0dHBIZWFkZXJzO1xyXG4gICAgcGFyYW1zPzogSUh0dHBQYXJhbXM7XHJcbiAgICBvYnNlcnZlPzogXCJib2R5XCIgfCBcInJlc3BvbnNlXCI7XHJcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XHJcbiAgICByZXNwb25zZVR5cGU/OiBcImFycmF5YnVmZmVyXCIgfCBcImJsb2JcIiB8IFwianNvblwiIHwgXCJ0ZXh0XCI7XHJcbiAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xyXG4gICAgdGltZW91dD86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJSXNzdWVDb250ZXh0IHtcclxuICAgIHVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQcm9ncmVzcyB7XHJcbiAgICBwZXJjZW50YWdlPzogbnVtYmVyO1xyXG4gICAgbG9hZGVkPzogbnVtYmVyO1xyXG4gICAgdG90YWw/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFByb2dyZXNzTGlzdGVuZXIgPSAocHJvZ3Jlc3M6IElQcm9ncmVzcykgPT4gdm9pZDtcclxuXHJcbmV4cG9ydCB0eXBlIFByb21pc2VFeGVjdXRvciA9IChyZXNvbHZlOiAodmFsdWU/OiBhbnkgfCBQcm9taXNlTGlrZTxhbnk+KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XHJcblxyXG5leHBvcnQgY2xhc3MgSHR0cFByb21pc2UgZXh0ZW5kcyBQcm9taXNlPGFueT4ge1xyXG5cclxuICAgIHByb3RlY3RlZCByZWplY3RIYW5kbGVyOiAocmVhc29uPzogSHR0cEVycm9yUmVzcG9uc2UpID0+IHZvaWQ7XHJcbiAgICBwcm90ZWN0ZWQgaGFzUmVqZWN0SGFuZGxlcjogYm9vbGVhbjtcclxuICAgIHByb3RlY3RlZCBhdHRhY2hDb3VudDogbnVtYmVyO1xyXG4gICAgcHJvdGVjdGVkIHJ1bkNvdW50OiBudW1iZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVqZWN0SGFuZGxlcjogKHJlYXNvbj86IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB2b2lkLCBleGVjdXRvcjogUHJvbWlzZUV4ZWN1dG9yKSB7XHJcbiAgICAgICAgc3VwZXIoZXhlY3V0b3IpO1xyXG4gICAgICAgIHRoaXMucmVqZWN0SGFuZGxlciA9IHJlamVjdEhhbmRsZXI7XHJcbiAgICAgICAgdGhpcy5hdHRhY2hDb3VudCA9IDA7XHJcbiAgICAgICAgdGhpcy5ydW5Db3VudCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhlbjxUUmVzdWx0MSwgVFJlc3VsdDI+KG9uRnVsZmlsbGVkPzogKCh2YWx1ZTogYW55KSA9PiAoUHJvbWlzZUxpa2U8VFJlc3VsdDE+IHwgVFJlc3VsdDEpKSB8IG51bGwgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZWplY3RlZD86ICgocmVhc29uOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gKFByb21pc2VMaWtlPFRSZXN1bHQyPiB8IFRSZXN1bHQyKSkgfCBudWxsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XHJcbiAgICAgICAgdGhpcy5hdHRhY2hDb3VudCsrO1xyXG4gICAgICAgIHJldHVybiBzdXBlci50aGVuKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ydW5Db3VudCsrO1xyXG4gICAgICAgICAgICByZXR1cm4gb25GdWxmaWxsZWQgPyBvbkZ1bGZpbGxlZCh2YWx1ZSkgOiBudWxsO1xyXG4gICAgICAgIH0sIChyZWFzb246IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gb25SZWplY3RlZCA/IG9uUmVqZWN0ZWQocmVhc29uKSA6IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuaGFzUmVqZWN0SGFuZGxlciA9IHRoaXMuaGFzUmVqZWN0SGFuZGxlciB8fCAob25SZWplY3RlZCAmJiByZXN1bHQgIT09IGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5ydW5Db3VudCsrO1xyXG4gICAgICAgICAgICB0aGlzLnJlamVjdEhhbmRsZXIodGhpcy5ydW5Db3VudCA9PSB0aGlzLmF0dGFjaENvdW50ICYmICF0aGlzLmhhc1JlamVjdEhhbmRsZXIgPyByZWFzb24gOiBudWxsKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjYXRjaDxUUmVzdWx0ID0gbmV2ZXI+KG9uUmVqZWN0ZWQ/OiAoKHJlYXNvbjogSHR0cEVycm9yUmVzcG9uc2UpID0+IChQcm9taXNlTGlrZTxUUmVzdWx0PiB8IFRSZXN1bHQpKSB8IG51bGwgfCB1bmRlZmluZWQpOiBQcm9taXNlPGFueSB8IFRSZXN1bHQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0ZWQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElIdHRwU2VydmljZSB7XHJcbiAgICBsYW5ndWFnZTogSUxhbmd1YWdlU2VydmljZTtcclxuICAgIHVybCh1cmw6IHN0cmluZyk6IHN0cmluZztcclxuICAgIG1ha2VMaXN0UGFyYW1zKHBhZ2U6IG51bWJlciwgaXRlbXNQZXJQYWdlOiBudW1iZXIsIG9yZGVyQnk/OiBzdHJpbmcsIG9yZGVyRGVzY2VuZGluZz86IGJvb2xlYW4sIGZpbHRlcj86IHN0cmluZyk6IElIdHRwUGFyYW1zO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgRVhQUkVTU19SRVFVRVNUID0gbmV3IEluamVjdGlvblRva2VuPFJlcXVlc3Q+KFwiZXhwcmVzcy1yZXF1ZXN0XCIpO1xyXG5cclxuLy8gLS0tIEFwaSBzZXJ2aWNlIC0tLVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQXBpU2VydmljZSBleHRlbmRzIElIdHRwU2VydmljZSB7XHJcbiAgICBjYWNoZTogYW55O1xyXG4gICAgY2xpZW50OiBIdHRwQ2xpZW50O1xyXG4gICAgZ2V0KHVybDogc3RyaW5nLCBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxhbnk+O1xyXG4gICAgZGVsZXRlKHVybDogc3RyaW5nLCBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxhbnk+O1xyXG4gICAgcG9zdCh1cmw6IHN0cmluZywgYm9keT86IGFueSwgb3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8YW55PjtcclxuICAgIHB1dCh1cmw6IHN0cmluZywgYm9keT86IGFueSwgb3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8YW55PjtcclxuICAgIHBhdGNoKHVybDogc3RyaW5nLCBib2R5PzogYW55LCBvcHRpb25zPzogSVJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxhbnk+O1xyXG4gICAgdXBsb2FkKHVybDogc3RyaW5nLCBib2R5OiBhbnksIGxpc3RlbmVyPzogUHJvZ3Jlc3NMaXN0ZW5lciwgb3B0aW9ucz86IElSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8YW55PjtcclxuICAgIGxpc3QodXJsOiBzdHJpbmcsIHBhcmFtczogSUh0dHBQYXJhbXMpOiBQcm9taXNlPElQYWdpbmF0aW9uRGF0YT47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBBUElfU0VSVklDRTogSW5qZWN0aW9uVG9rZW48SUFwaVNlcnZpY2U+ID0gbmV3IEluamVjdGlvblRva2VuPElBcGlTZXJ2aWNlPihcImFwaS1zZXJ2aWNlXCIpO1xyXG5cclxuLy8gLS0tIE9wZW5BcGkgc2VydmljZSAtLS1cclxuZXhwb3J0IGludGVyZmFjZSBJT3BlbkFwaVNjaGVtYVByb3BlcnR5IHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICB0eXBlPzogc3RyaW5nO1xyXG4gICAgZm9ybWF0Pzogc3RyaW5nO1xyXG4gICAgY29sdW1uPzogYm9vbGVhbjtcclxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzPzogYW55O1xyXG4gICAgJHJlZj86IHN0cmluZztcclxuICAgIGl0ZW1zPzogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eTtcclxuICAgIGVudW0/OiBzdHJpbmdbXTtcclxuICAgIFtrZXk6IHN0cmluZ106IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJT3BlbkFwaVNjaGVtYSB7XHJcbiAgICBwcm9wZXJ0aWVzOiB7XHJcbiAgICAgICAgW25hbWU6IHN0cmluZ106IElPcGVuQXBpU2NoZW1hUHJvcGVydHk7XHJcbiAgICB9O1xyXG4gICAgcmVxdWlyZWQ6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElPcGVuQXBpU2NoZW1hcyB7XHJcbiAgICBbbmFtZTogc3RyaW5nXTogSU9wZW5BcGlTY2hlbWE7XHJcbn1cclxuXHJcbi8vIC0tLSBEeW5hbWljIHRhYmxlIC0tLVxyXG5leHBvcnQgaW50ZXJmYWNlIElUYWJsZUNvbHVtbnMge1xyXG4gICAgW2NvbHVtbjogc3RyaW5nXTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUYWJsZVRlbXBsYXRlIHtcclxuICAgIGNvbHVtbjogc3RyaW5nIHwgc3RyaW5nW107XHJcbiAgICBwdXJlOiBib29sZWFuO1xyXG4gICAgcmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUYWJsZVRlbXBsYXRlcyB7XHJcbiAgICBbY29sdW1uOiBzdHJpbmddOiBJVGFibGVUZW1wbGF0ZTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgVGFibGVEYXRhTG9hZGVyID0gKHBhZ2U6IG51bWJlciwgcm93c1BlclBhZ2U6IG51bWJlciwgb3JkZXJCeTogc3RyaW5nLCBvcmRlckRlc2NlbmRpbmc6IGJvb2xlYW4sIGZpbHRlcjogc3RyaW5nKSA9PiBQcm9taXNlPElQYWdpbmF0aW9uRGF0YT47XHJcblxyXG4vLyAtLS0gUmVzb3VyY2UgaWYgLS0tXHJcbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUlmQ29udGV4dCB7XHJcbiAgICByZXNvdXJjZTogc3RyaW5nO1xyXG4gICAgdXJsOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8vIC0tLSBDb25maWdTZXJ2aWNlIC0tLVxyXG5leHBvcnQgY2xhc3MgSUNvbmZpZ3VyYXRpb24ge1xyXG4gICAgYmFzZVVybD86IHN0cmluZztcclxuICAgIGJhc2VEb21haW4/OiBzdHJpbmc7XHJcbiAgICB0cmFuc2xhdGlvblVybD86IHN0cmluZztcclxuICAgIFtrZXk6IHN0cmluZ106IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29uZmlnU2VydmljZSB7XHJcbiAgICBjb25maWc6IElDb25maWd1cmF0aW9uO1xyXG4gICAgcmVhZG9ubHkgbG9hZDogKCkgPT4gUHJvbWlzZTxJQ29uZmlndXJhdGlvbj47XHJcbiAgICBwcmVwYXJlVXJsKHVybDogc3RyaW5nLCBlbmRpbmc6IHN0cmluZyk6IHN0cmluZztcclxuICAgIGdldENvbmZpZ1ZhbHVlKGtleTogc3RyaW5nKTogYW55O1xyXG4gICAgZ2V0UXVlcnlQYXJhbWV0ZXIobmFtZTogc3RyaW5nLCB1cmw/OiBzdHJpbmcpOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBDT05GSUdfU0VSVklDRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJQ29uZmlnU2VydmljZT4oXCJjb25maWctc2VydmljZVwiKTtcclxuXHJcbmV4cG9ydCBjb25zdCBCQVNFX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJQ29uZmlndXJhdGlvbj4oXCJiYXNlLWNvbmZpZ1wiKTtcclxuXHJcbmV4cG9ydCBjb25zdCBTQ1JJUFRfUEFSQU1TID0gbmV3IEluamVjdGlvblRva2VuPGFueT4oXCJzY3JpcHQtcGFyYW1zXCIpO1xyXG5cclxuZXhwb3J0IGNvbnN0IFJPT1RfRUxFTUVOVDogSW5qZWN0aW9uVG9rZW48SFRNTEVsZW1lbnQ+ID0gbmV3IEluamVjdGlvblRva2VuPEhUTUxFbGVtZW50PihcImFwcC1yb290LWVsZW1lbnRcIik7XHJcblxyXG4vLyAtLS0gRXJyb3IgaGFuZGxlciBzZXJ2aWNlIC0tLVxyXG5leHBvcnQgdHlwZSBFcnJvckhhbmRsZXJDYWxsYmFjayA9IChlcnJvcjogc3RyaW5nKSA9PiBhbnk7XHJcblxyXG5leHBvcnQgY29uc3QgRVJST1JfSEFORExFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxFcnJvckhhbmRsZXJDYWxsYmFjaz4oXCJlcnJvci1oYW5kbGVyLWNhbGxiYWNrXCIpO1xyXG5cclxuLy8gLS0tIEdsb2JhbCB0ZW1wbGF0ZXMgc2VydmljZVxyXG5cclxuZXhwb3J0IHR5cGUgR2xvYmFsQ29tcG9uZW50TW9kaWZpZXIgPSAoY29tcG9uZW50OiBhbnkpID0+IGFueTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdsb2JhbFRlbXBsYXRlcyB7XHJcbiAgICByZWFkb25seSB0ZW1wbGF0ZXNVcGRhdGVkOiBFdmVudEVtaXR0ZXI8dm9pZD47XHJcbiAgICBnZXQoaWQ6IHN0cmluZywgY29tcG9uZW50PzogYW55KTogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIGFkZChpZDogc3RyaW5nLCB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pik6IHZvaWQ7XHJcbiAgICByZW1vdmUoaWQ6IHN0cmluZyk6IHZvaWQ7XHJcbiAgICBhZGRDb21wb25lbnRNb2RpZmllcihpZDogc3RyaW5nLCBtb2RpZmllcjogR2xvYmFsQ29tcG9uZW50TW9kaWZpZXIpOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgR0xPQkFMX1RFTVBMQVRFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxFcnJvckhhbmRsZXJDYWxsYmFjaz4oXCJnbG9iYWwtdGVtcGxhdGVzXCIpO1xyXG5cclxuLy8gLS0tIE1vZHVsZSAtLS1cclxuZXhwb3J0IHR5cGUgQXBwSW5pdGlhbGl6ZXJGdW5jID0gKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNb2R1bGVDb25maWcge1xyXG4gICAgYXBpU2VydmljZT86IFR5cGU8SUFwaVNlcnZpY2U+XHJcbiAgICBhdXRoU2VydmljZT86IFR5cGU8SUF1dGhTZXJ2aWNlPjtcclxuICAgIGljb25TZXJ2aWNlPzogVHlwZTxJSWNvblNlcnZpY2U+O1xyXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlPzogVHlwZTxJTGFuZ3VhZ2VTZXJ2aWNlPjtcclxuICAgIHRvYXN0ZXJTZXJ2aWNlPzogVHlwZTxJVG9hc3RlclNlcnZpY2U+O1xyXG4gICAgcHJvbWlzZVNlcnZpY2U/OiBUeXBlPElQcm9taXNlU2VydmljZT47XHJcbiAgICBjb25maWdTZXJ2aWNlPzogVHlwZTxJQ29uZmlnU2VydmljZT47XHJcbiAgICBnbG9iYWxUZW1wbGF0ZXM/OiBUeXBlPElHbG9iYWxUZW1wbGF0ZXM+O1xyXG4gICAgaW5pdGlhbGl6ZUFwcD86IChpbmplY3RvcjogSW5qZWN0b3IpID0+IEFwcEluaXRpYWxpemVyRnVuYztcclxufVxyXG5cclxuLy8gLS0tIFZhbHVlZCBwcm9taXNlIC0tLVxyXG5leHBvcnQgY2xhc3MgVmFsdWVkUHJvbWlzZTxUPiBleHRlbmRzIFByb21pc2U8VD4ge1xyXG4gICAgdmFsdWU6IFQ7XHJcbn1cclxuIl19
@@ -0,0 +1,407 @@
1
+ import { Component, ContentChild, ContentChildren, Input, QueryList, TemplateRef, ViewChild } from "@angular/core";
2
+ import { PaginationItemContext } from "../../common-types";
3
+ import { ObjectUtils } from "../../utils/object.utils";
4
+ import { DynamicTableTemplateDirective } from "../../directives/dynamic-table-template.directive";
5
+ import { PaginationDirective } from "../../directives/pagination.directive";
6
+ import { UniqueUtils } from "../../utils/unique.utils";
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../../directives/pagination.directive";
9
+ import * as i2 from "@angular/common";
10
+ import * as i3 from "@angular/forms";
11
+ import * as i4 from "../../directives/ngx-template-outlet.directive";
12
+ import * as i5 from "../pagination-menu/pagination-menu.component";
13
+ import * as i6 from "../../directives/icon.directive";
14
+ import * as i7 from "../../directives/pagination-item.directive";
15
+ import * as i8 from "../../pipes/translate.pipe";
16
+ const _c0 = ["rowTemplate"];
17
+ const _c1 = ["wrapperTemplate"];
18
+ const _c2 = ["filterTemplate"];
19
+ const _c3 = ["columnsTemplate"];
20
+ const _c4 = ["defaultRowTemplate"];
21
+ const _c5 = ["defaultWrapperTemplate"];
22
+ const _c6 = ["defaultFilterTemplate"];
23
+ const _c7 = ["pagination"];
24
+ function DynamicTableComponent_ng_template_2_div_0_label_1_Template(rf, ctx) { if (rf & 1) {
25
+ i0.ɵɵelementStart(0, "label");
26
+ i0.ɵɵtext(1);
27
+ i0.ɵɵpipe(2, "translate");
28
+ i0.ɵɵelementEnd();
29
+ } if (rf & 2) {
30
+ const ctx_r13 = i0.ɵɵnextContext(3);
31
+ i0.ɵɵattribute("for", ctx_r13.tableId);
32
+ i0.ɵɵadvance(1);
33
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 2, ctx_r13.label));
34
+ } }
35
+ function DynamicTableComponent_ng_template_2_div_0_Template(rf, ctx) { if (rf & 1) {
36
+ const _r16 = i0.ɵɵgetCurrentView();
37
+ i0.ɵɵelementStart(0, "div", 11);
38
+ i0.ɵɵtemplate(1, DynamicTableComponent_ng_template_2_div_0_label_1_Template, 3, 4, "label", 12);
39
+ i0.ɵɵelementStart(2, "input", 13);
40
+ i0.ɵɵlistener("ngModelChange", function DynamicTableComponent_ng_template_2_div_0_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r16); const table_r11 = i0.ɵɵnextContext().$implicit; return table_r11.setFilter($event); });
41
+ i0.ɵɵpipe(3, "translate");
42
+ i0.ɵɵelementEnd()();
43
+ } if (rf & 2) {
44
+ const table_r11 = i0.ɵɵnextContext().$implicit;
45
+ const ctx_r12 = i0.ɵɵnextContext();
46
+ i0.ɵɵadvance(1);
47
+ i0.ɵɵproperty("ngIf", ctx_r12.label);
48
+ i0.ɵɵadvance(1);
49
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(3, 4, ctx_r12.placeholder))("ngModel", table_r11.filter);
50
+ i0.ɵɵattribute("id", ctx_r12.tableId);
51
+ } }
52
+ function DynamicTableComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {
53
+ i0.ɵɵtemplate(0, DynamicTableComponent_ng_template_2_div_0_Template, 4, 6, "div", 10);
54
+ } if (rf & 2) {
55
+ const table_r11 = ctx.$implicit;
56
+ i0.ɵɵproperty("ngIf", table_r11.showFilter);
57
+ } }
58
+ function DynamicTableComponent_ng_template_7_ng_template_0_Template(rf, ctx) { if (rf & 1) {
59
+ i0.ɵɵelementStart(0, "span");
60
+ i0.ɵɵtext(1);
61
+ i0.ɵɵelementEnd();
62
+ } if (rf & 2) {
63
+ const column_r26 = ctx.column;
64
+ const item_r27 = ctx.item;
65
+ i0.ɵɵadvance(1);
66
+ i0.ɵɵtextInterpolate(item_r27[column_r26] == undefined || item_r27[column_r26] == null ? "-" : item_r27[column_r26]);
67
+ } }
68
+ function DynamicTableComponent_ng_template_7_ng_template_2_Template(rf, ctx) { if (rf & 1) {
69
+ i0.ɵɵelementContainer(0, 3);
70
+ } if (rf & 2) {
71
+ const ctx_r28 = i0.ɵɵnextContext();
72
+ const template_r20 = ctx_r28.template;
73
+ const context_r18 = ctx_r28.$implicit;
74
+ i0.ɵɵproperty("ngxTemplateOutlet", template_r20.ref)("context", context_r18);
75
+ } }
76
+ function DynamicTableComponent_ng_template_7_td_4_Template(rf, ctx) { if (rf & 1) {
77
+ i0.ɵɵelementStart(0, "td", 17);
78
+ i0.ɵɵelementContainer(1, 3);
79
+ i0.ɵɵelementEnd();
80
+ } if (rf & 2) {
81
+ const ctx_r29 = i0.ɵɵnextContext();
82
+ const column_r19 = ctx_r29.column;
83
+ const template_r20 = ctx_r29.template;
84
+ const context_r18 = ctx_r29.$implicit;
85
+ const _r21 = i0.ɵɵreference(1);
86
+ i0.ɵɵproperty("ngClass", "column-" + column_r19);
87
+ i0.ɵɵadvance(1);
88
+ i0.ɵɵproperty("ngxTemplateOutlet", !template_r20 ? _r21 : template_r20.ref)("context", context_r18);
89
+ } }
90
+ function DynamicTableComponent_ng_template_7_Template(rf, ctx) { if (rf & 1) {
91
+ i0.ɵɵtemplate(0, DynamicTableComponent_ng_template_7_ng_template_0_Template, 2, 1, "ng-template", null, 14, i0.ɵɵtemplateRefExtractor);
92
+ i0.ɵɵtemplate(2, DynamicTableComponent_ng_template_7_ng_template_2_Template, 1, 2, "ng-template", null, 15, i0.ɵɵtemplateRefExtractor);
93
+ i0.ɵɵtemplate(4, DynamicTableComponent_ng_template_7_td_4_Template, 2, 3, "td", 16);
94
+ } if (rf & 2) {
95
+ const template_r20 = ctx.template;
96
+ const _r23 = i0.ɵɵreference(3);
97
+ i0.ɵɵadvance(4);
98
+ i0.ɵɵproperty("ngIf", !template_r20 || !template_r20.pure)("ngIfElse", _r23);
99
+ } }
100
+ const _c8 = function (a0, a1) { return { template: a0, column: a1 }; };
101
+ function DynamicTableComponent_ng_template_9_ng_container_0_Template(rf, ctx) { if (rf & 1) {
102
+ i0.ɵɵelementContainer(0, 19);
103
+ } if (rf & 2) {
104
+ const column_r32 = ctx.$implicit;
105
+ const context_r30 = i0.ɵɵnextContext().$implicit;
106
+ const ctx_r31 = i0.ɵɵnextContext();
107
+ const _r3 = i0.ɵɵreference(8);
108
+ i0.ɵɵproperty("ngxTemplateOutlet", _r3)("context", context_r30)("additionalContext", i0.ɵɵpureFunction2(3, _c8, ctx_r31.templates[column_r32], column_r32));
109
+ } }
110
+ function DynamicTableComponent_ng_template_9_Template(rf, ctx) { if (rf & 1) {
111
+ i0.ɵɵtemplate(0, DynamicTableComponent_ng_template_9_ng_container_0_Template, 1, 6, "ng-container", 18);
112
+ } if (rf & 2) {
113
+ const ctx_r6 = i0.ɵɵnextContext();
114
+ i0.ɵɵproperty("ngForOf", ctx_r6.cols);
115
+ } }
116
+ function DynamicTableComponent_ng_template_11_Template(rf, ctx) { if (rf & 1) {
117
+ i0.ɵɵelementStart(0, "tr");
118
+ i0.ɵɵelementContainer(1, 3);
119
+ i0.ɵɵelementEnd();
120
+ } if (rf & 2) {
121
+ const context_r34 = ctx.$implicit;
122
+ i0.ɵɵnextContext();
123
+ const _r5 = i0.ɵɵreference(10);
124
+ i0.ɵɵadvance(1);
125
+ i0.ɵɵproperty("ngxTemplateOutlet", _r5)("context", context_r34);
126
+ } }
127
+ function DynamicTableComponent_ng_template_13_th_3_a_1_i_4_Template(rf, ctx) { if (rf & 1) {
128
+ i0.ɵɵelement(0, "i", 26);
129
+ } if (rf & 2) {
130
+ const column_r37 = i0.ɵɵnextContext(2).$implicit;
131
+ const ctx_r40 = i0.ɵɵnextContext(2);
132
+ i0.ɵɵproperty("icon", ctx_r40.orderDescending ? "sort-desc" : "sort-asc")("ngClass", ctx_r40.orderBy == column_r37 ? ctx_r40.orderDescending ? "sort-desc" : "sort-asc" : "");
133
+ } }
134
+ function DynamicTableComponent_ng_template_13_th_3_a_1_Template(rf, ctx) { if (rf & 1) {
135
+ const _r44 = i0.ɵɵgetCurrentView();
136
+ i0.ɵɵelementStart(0, "a", 24);
137
+ i0.ɵɵlistener("click", function DynamicTableComponent_ng_template_13_th_3_a_1_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r44); const column_r37 = i0.ɵɵnextContext().$implicit; const ctx_r42 = i0.ɵɵnextContext(2); return ctx_r42.setOrder(column_r37); });
138
+ i0.ɵɵelementStart(1, "span");
139
+ i0.ɵɵtext(2);
140
+ i0.ɵɵpipe(3, "translate");
141
+ i0.ɵɵelementEnd();
142
+ i0.ɵɵtemplate(4, DynamicTableComponent_ng_template_13_th_3_a_1_i_4_Template, 1, 2, "i", 25);
143
+ i0.ɵɵelementEnd();
144
+ } if (rf & 2) {
145
+ const column_r37 = i0.ɵɵnextContext().$implicit;
146
+ const ctx_r38 = i0.ɵɵnextContext(2);
147
+ i0.ɵɵadvance(2);
148
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 2, "label." + column_r37));
149
+ i0.ɵɵadvance(2);
150
+ i0.ɵɵproperty("ngIf", ctx_r38.orderBy == column_r37);
151
+ } }
152
+ function DynamicTableComponent_ng_template_13_th_3_span_2_Template(rf, ctx) { if (rf & 1) {
153
+ i0.ɵɵelementStart(0, "span");
154
+ i0.ɵɵtext(1);
155
+ i0.ɵɵpipe(2, "translate");
156
+ i0.ɵɵelementEnd();
157
+ } if (rf & 2) {
158
+ const column_r37 = i0.ɵɵnextContext().$implicit;
159
+ i0.ɵɵadvance(1);
160
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 1, "label." + column_r37));
161
+ } }
162
+ function DynamicTableComponent_ng_template_13_th_3_Template(rf, ctx) { if (rf & 1) {
163
+ i0.ɵɵelementStart(0, "th", 17);
164
+ i0.ɵɵtemplate(1, DynamicTableComponent_ng_template_13_th_3_a_1_Template, 5, 4, "a", 23);
165
+ i0.ɵɵtemplate(2, DynamicTableComponent_ng_template_13_th_3_span_2_Template, 3, 3, "span", 12);
166
+ i0.ɵɵelementEnd();
167
+ } if (rf & 2) {
168
+ const column_r37 = ctx.$implicit;
169
+ const ctx_r35 = i0.ɵɵnextContext(2);
170
+ i0.ɵɵproperty("ngClass", "column-" + column_r37);
171
+ i0.ɵɵadvance(1);
172
+ i0.ɵɵproperty("ngIf", ctx_r35.orders[column_r37]);
173
+ i0.ɵɵadvance(1);
174
+ i0.ɵɵproperty("ngIf", !ctx_r35.orders[column_r37]);
175
+ } }
176
+ function DynamicTableComponent_ng_template_13_ng_container_5_Template(rf, ctx) { if (rf & 1) {
177
+ i0.ɵɵelementContainer(0, 19);
178
+ } if (rf & 2) {
179
+ const context_r47 = ctx.$implicit;
180
+ const ctx_r36 = i0.ɵɵnextContext(2);
181
+ i0.ɵɵproperty("ngxTemplateOutlet", ctx_r36.rowTemplate)("context", context_r47)("additionalContext", ctx_r36);
182
+ } }
183
+ function DynamicTableComponent_ng_template_13_Template(rf, ctx) { if (rf & 1) {
184
+ i0.ɵɵelementStart(0, "table", 20)(1, "thead")(2, "tr");
185
+ i0.ɵɵtemplate(3, DynamicTableComponent_ng_template_13_th_3_Template, 3, 3, "th", 21);
186
+ i0.ɵɵelementEnd()();
187
+ i0.ɵɵelementStart(4, "tbody");
188
+ i0.ɵɵtemplate(5, DynamicTableComponent_ng_template_13_ng_container_5_Template, 1, 3, "ng-container", 22);
189
+ i0.ɵɵelementEnd()();
190
+ } if (rf & 2) {
191
+ const ctx_r10 = i0.ɵɵnextContext();
192
+ i0.ɵɵadvance(3);
193
+ i0.ɵɵproperty("ngForOf", ctx_r10.cols);
194
+ } }
195
+ export class DynamicTableComponent {
196
+ constructor() {
197
+ this.loadData = (page, itemsPerPage) => {
198
+ const orderBy = this.orders[this.orderBy];
199
+ return this.dataLoader(page, itemsPerPage, orderBy, this.orderDescending, this.filter);
200
+ };
201
+ this.dataLoader = this.loadLocalData;
202
+ this.placeholder = "";
203
+ this.tableId = UniqueUtils.uuid();
204
+ this.templates = {};
205
+ this.filter = "";
206
+ this.orders = {};
207
+ }
208
+ get items() {
209
+ return !this.pagination ? [] : this.pagination.items;
210
+ }
211
+ static compare(orderBy, a, b) {
212
+ a = a.item ? a.item[orderBy] : null;
213
+ b = b.item ? b.item[orderBy] : null;
214
+ return ObjectUtils.compare(a, b);
215
+ }
216
+ ngAfterContentInit() {
217
+ this.templates = this.templateDirectives.reduce((result, directive) => {
218
+ if (ObjectUtils.isArray(directive.column)) {
219
+ directive.column.forEach(column => {
220
+ result[column] = directive;
221
+ });
222
+ return result;
223
+ }
224
+ if (!ObjectUtils.isString(directive.column) || directive.column.length == 0)
225
+ return result;
226
+ result[directive.column] = directive;
227
+ return result;
228
+ }, {});
229
+ }
230
+ ngAfterViewInit() {
231
+ this.rowTemplate = this.rowTemplate || this.defaultRowTemplate;
232
+ this.filterTemplate = this.filterTemplate || this.defaultFilterTemplate;
233
+ }
234
+ ngOnChanges(changes) {
235
+ if (changes.columns) {
236
+ const columns = changes.columns.currentValue || [];
237
+ this.orders = ObjectUtils.isArray(columns) ? columns.reduce((result, column) => {
238
+ result[column] = column;
239
+ return result;
240
+ }, {}) : columns;
241
+ this.cols = Object.keys(this.orders);
242
+ this.orderBy = this.orderBy in this.orders ? this.orderBy : this.columns[0];
243
+ }
244
+ if (changes.orderBy && this.orders) {
245
+ this.orderBy = this.orderBy in this.orders ? this.orderBy : this.columns[0];
246
+ }
247
+ if (!changes.data && !changes.parallelData && !changes.itemsPerPage && !changes.orderBy && !changes.orderDescending)
248
+ return;
249
+ this.refresh();
250
+ }
251
+ refresh() {
252
+ if (!this.pagination)
253
+ return;
254
+ this.pagination.refresh();
255
+ }
256
+ setFilter(filter) {
257
+ this.filter = filter;
258
+ this.refresh();
259
+ }
260
+ setOrder(column) {
261
+ this.orderDescending = column == this.orderBy && !this.orderDescending;
262
+ this.orderBy = column;
263
+ this.refresh();
264
+ }
265
+ loadLocalData(page, rowsPerPage, orderBy, orderDescending, filter) {
266
+ if (!this.data) {
267
+ return Promise.resolve({
268
+ total: 0,
269
+ items: []
270
+ });
271
+ }
272
+ const compare = orderDescending
273
+ ? (a, b) => DynamicTableComponent.compare(orderBy, b, a)
274
+ : (a, b) => DynamicTableComponent.compare(orderBy, a, b);
275
+ const from = (page - 1) * rowsPerPage;
276
+ const dataLength = this.data.length;
277
+ const length = Math.min(rowsPerPage, dataLength - from);
278
+ const parallelData = this.parallelData || [];
279
+ let data = this.data.map((item, ix) => {
280
+ return new PaginationItemContext(item, parallelData[ix] || {}, dataLength, ix, ix);
281
+ });
282
+ if (ObjectUtils.isString(filter) && filter.length > 0) {
283
+ const filterRx = new RegExp(filter, "gi");
284
+ data = data.filter(c => c.filter(filterRx));
285
+ }
286
+ const items = orderBy ? data.sort(compare).splice(from, length) : data.splice(from, length);
287
+ items.forEach((context, ix) => {
288
+ context.index = from + ix;
289
+ });
290
+ return Promise.resolve({
291
+ total: dataLength,
292
+ items: items
293
+ });
294
+ }
295
+ }
296
+ DynamicTableComponent.ɵfac = function DynamicTableComponent_Factory(t) { return new (t || DynamicTableComponent)(); };
297
+ DynamicTableComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DynamicTableComponent, selectors: [["dynamic-table"]], contentQueries: function DynamicTableComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
298
+ i0.ɵɵcontentQuery(dirIndex, _c0, 7);
299
+ i0.ɵɵcontentQuery(dirIndex, _c1, 7);
300
+ i0.ɵɵcontentQuery(dirIndex, _c2, 7);
301
+ i0.ɵɵcontentQuery(dirIndex, DynamicTableTemplateDirective, 4);
302
+ } if (rf & 2) {
303
+ let _t;
304
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.rowTemplate = _t.first);
305
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.wrapperTemplate = _t.first);
306
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.filterTemplate = _t.first);
307
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.templateDirectives = _t);
308
+ } }, viewQuery: function DynamicTableComponent_Query(rf, ctx) { if (rf & 1) {
309
+ i0.ɵɵviewQuery(_c3, 7);
310
+ i0.ɵɵviewQuery(_c4, 7);
311
+ i0.ɵɵviewQuery(_c5, 7);
312
+ i0.ɵɵviewQuery(_c6, 7);
313
+ i0.ɵɵviewQuery(_c7, 5);
314
+ } if (rf & 2) {
315
+ let _t;
316
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.columnsTemplate = _t.first);
317
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.defaultRowTemplate = _t.first);
318
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.defaultWrapperTemplate = _t.first);
319
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.defaultFilterTemplate = _t.first);
320
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.pagination = _t.first);
321
+ } }, inputs: { label: "label", placeholder: "placeholder", dataLoader: "dataLoader", data: "data", parallelData: "parallelData", columns: "columns", showFilter: "showFilter", itemsPerPage: "itemsPerPage", updateTime: "updateTime", maxPages: "maxPages", directionLinks: "directionLinks", boundaryLinks: "boundaryLinks", orderBy: "orderBy", orderDescending: "orderDescending" }, features: [i0.ɵɵNgOnChangesFeature], decls: 17, vars: 13, consts: [[1, "dynamic-table", 3, "pagination", "itemsPerPage", "updateTime"], ["pagination", "pagination"], ["defaultFilterTemplate", ""], [3, "ngxTemplateOutlet", "context"], [3, "maxSize", "directionLinks", "boundaryLinks"], [1, "table-responsive"], ["columnTemplate", ""], ["columnsTemplate", ""], ["defaultRowTemplate", ""], ["defaultWrapperTemplate", ""], ["class", "table-search", 4, "ngIf"], [1, "table-search"], [4, "ngIf"], ["type", "text", 1, "form-control", 3, "placeholder", "ngModel", "ngModelChange"], ["defaultTemplate", ""], ["pureTemplate", ""], [3, "ngClass", 4, "ngIf", "ngIfElse"], [3, "ngClass"], [3, "ngxTemplateOutlet", "context", "additionalContext", 4, "ngFor", "ngForOf"], [3, "ngxTemplateOutlet", "context", "additionalContext"], [1, "table", "table-striped"], [3, "ngClass", 4, "ngFor", "ngForOf"], [3, "ngxTemplateOutlet", "context", "additionalContext", 4, "paginationItem"], [3, "click", 4, "ngIf"], [3, "click"], [3, "icon", "ngClass", 4, "ngIf"], [3, "icon", "ngClass"]], template: function DynamicTableComponent_Template(rf, ctx) { if (rf & 1) {
322
+ i0.ɵɵelementStart(0, "div", 0, 1);
323
+ i0.ɵɵtemplate(2, DynamicTableComponent_ng_template_2_Template, 1, 1, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor);
324
+ i0.ɵɵelementContainer(4, 3);
325
+ i0.ɵɵelement(5, "pagination-menu", 4);
326
+ i0.ɵɵelementStart(6, "div", 5);
327
+ i0.ɵɵtemplate(7, DynamicTableComponent_ng_template_7_Template, 5, 2, "ng-template", null, 6, i0.ɵɵtemplateRefExtractor);
328
+ i0.ɵɵtemplate(9, DynamicTableComponent_ng_template_9_Template, 1, 1, "ng-template", null, 7, i0.ɵɵtemplateRefExtractor);
329
+ i0.ɵɵtemplate(11, DynamicTableComponent_ng_template_11_Template, 2, 2, "ng-template", null, 8, i0.ɵɵtemplateRefExtractor);
330
+ i0.ɵɵtemplate(13, DynamicTableComponent_ng_template_13_Template, 6, 1, "ng-template", null, 9, i0.ɵɵtemplateRefExtractor);
331
+ i0.ɵɵelementContainer(15, 3);
332
+ i0.ɵɵelementEnd();
333
+ i0.ɵɵelement(16, "pagination-menu", 4);
334
+ i0.ɵɵelementEnd();
335
+ } if (rf & 2) {
336
+ const _r1 = i0.ɵɵreference(3);
337
+ const _r9 = i0.ɵɵreference(14);
338
+ i0.ɵɵproperty("pagination", ctx.loadData)("itemsPerPage", ctx.itemsPerPage)("updateTime", ctx.updateTime);
339
+ i0.ɵɵadvance(4);
340
+ i0.ɵɵproperty("ngxTemplateOutlet", ctx.filterTemplate || _r1)("context", ctx);
341
+ i0.ɵɵadvance(1);
342
+ i0.ɵɵproperty("maxSize", ctx.maxPages)("directionLinks", ctx.directionLinks)("boundaryLinks", ctx.boundaryLinks);
343
+ i0.ɵɵadvance(10);
344
+ i0.ɵɵproperty("ngxTemplateOutlet", ctx.wrapperTemplate || _r9)("context", ctx);
345
+ i0.ɵɵadvance(1);
346
+ i0.ɵɵproperty("maxSize", ctx.maxPages)("directionLinks", ctx.directionLinks)("boundaryLinks", ctx.boundaryLinks);
347
+ } }, directives: [i1.PaginationDirective, i2.NgIf, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgModel, i4.NgxTemplateOutletDirective, i5.PaginationMenuComponent, i2.NgClass, i2.NgForOf, i6.IconDirective, i7.PaginationItemDirective], pipes: [i8.TranslatePipe], encapsulation: 2 });
348
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DynamicTableComponent, [{
349
+ type: Component,
350
+ args: [{ selector: "dynamic-table", template: "<div class=\"dynamic-table\" #pagination=\"pagination\" [pagination]=\"loadData\" [itemsPerPage]=\"itemsPerPage\" [updateTime]=\"updateTime\">\r\n <ng-template #defaultFilterTemplate let-table>\r\n <div class=\"table-search\" *ngIf=\"table.showFilter\">\r\n <label *ngIf=\"label\" [attr.for]=\"tableId\">{{ label | translate }}</label>\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n [attr.id]=\"tableId\"\r\n [placeholder]=\"placeholder | translate\"\r\n [ngModel]=\"table.filter\"\r\n (ngModelChange)=\"table.setFilter($event)\"/>\r\n </div>\r\n </ng-template>\r\n <ng-container [ngxTemplateOutlet]=\"filterTemplate || defaultFilterTemplate\" [context]=\"this\"></ng-container>\r\n <pagination-menu [maxSize]=\"maxPages\" [directionLinks]=\"directionLinks\" [boundaryLinks]=\"boundaryLinks\"></pagination-menu>\r\n <div class=\"table-responsive\">\r\n\r\n <ng-template #columnTemplate let-context let-column=\"column\" let-template=\"template\">\r\n <ng-template #defaultTemplate let-column=\"column\" let-item=\"item\">\r\n <span>{{ item[column] == undefined || item[column] == null ? '-' : item[column] }}</span>\r\n </ng-template>\r\n <ng-template #pureTemplate>\r\n <ng-container [ngxTemplateOutlet]=\"template.ref\" [context]=\"context\"></ng-container>\r\n </ng-template>\r\n <td [ngClass]=\"'column-' + column\" *ngIf=\"!template || !template.pure; else pureTemplate\">\r\n <ng-container [ngxTemplateOutlet]=\"!template ? defaultTemplate : template.ref\" [context]=\"context\"></ng-container>\r\n </td>\r\n </ng-template>\r\n\r\n <ng-template #columnsTemplate let-context>\r\n <ng-container *ngFor=\"let column of cols\"\r\n [ngxTemplateOutlet]=\"columnTemplate\"\r\n [context]=\"context\"\r\n [additionalContext]=\"{\r\n template: templates[column],\r\n column: column\r\n }\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template #defaultRowTemplate let-context>\r\n <tr>\r\n <ng-container [ngxTemplateOutlet]=\"columnsTemplate\" [context]=\"context\"></ng-container>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template #defaultWrapperTemplate>\r\n <table class=\"table table-striped\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of cols\" [ngClass]=\"'column-' + column\">\r\n <a *ngIf=\"orders[column]\" (click)=\"setOrder(column)\">\r\n <span>{{ 'label.' + column | translate }}</span>\r\n <i *ngIf=\"orderBy == column\"\r\n [icon]=\"orderDescending ? 'sort-desc' : 'sort-asc'\"\r\n [ngClass]=\"orderBy == column ? (orderDescending ? 'sort-desc': 'sort-asc') : ''\"></i>\r\n </a>\r\n <span *ngIf=\"!orders[column]\">{{ 'label.' + column | translate }}</span>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *paginationItem=\"let context\"\r\n [ngxTemplateOutlet]=\"rowTemplate\"\r\n [context]=\"context\"\r\n [additionalContext]=\"this\"></ng-container>\r\n </tbody>\r\n </table>\r\n </ng-template>\r\n\r\n <ng-container [ngxTemplateOutlet]=\"wrapperTemplate || defaultWrapperTemplate\"\r\n [context]=\"this\"></ng-container>\r\n </div>\r\n <pagination-menu [maxSize]=\"maxPages\" [directionLinks]=\"directionLinks\" [boundaryLinks]=\"boundaryLinks\"></pagination-menu>\r\n</div>\r\n" }]
351
+ }], function () { return []; }, { label: [{
352
+ type: Input
353
+ }], placeholder: [{
354
+ type: Input
355
+ }], dataLoader: [{
356
+ type: Input
357
+ }], data: [{
358
+ type: Input
359
+ }], parallelData: [{
360
+ type: Input
361
+ }], columns: [{
362
+ type: Input
363
+ }], showFilter: [{
364
+ type: Input
365
+ }], itemsPerPage: [{
366
+ type: Input
367
+ }], updateTime: [{
368
+ type: Input
369
+ }], maxPages: [{
370
+ type: Input
371
+ }], directionLinks: [{
372
+ type: Input
373
+ }], boundaryLinks: [{
374
+ type: Input
375
+ }], orderBy: [{
376
+ type: Input
377
+ }], orderDescending: [{
378
+ type: Input
379
+ }], rowTemplate: [{
380
+ type: ContentChild,
381
+ args: ["rowTemplate", { static: true }]
382
+ }], wrapperTemplate: [{
383
+ type: ContentChild,
384
+ args: ["wrapperTemplate", { static: true }]
385
+ }], filterTemplate: [{
386
+ type: ContentChild,
387
+ args: ["filterTemplate", { static: true }]
388
+ }], columnsTemplate: [{
389
+ type: ViewChild,
390
+ args: ["columnsTemplate", { static: true }]
391
+ }], defaultRowTemplate: [{
392
+ type: ViewChild,
393
+ args: ["defaultRowTemplate", { static: true }]
394
+ }], defaultWrapperTemplate: [{
395
+ type: ViewChild,
396
+ args: ["defaultWrapperTemplate", { static: true }]
397
+ }], defaultFilterTemplate: [{
398
+ type: ViewChild,
399
+ args: ["defaultFilterTemplate", { static: true }]
400
+ }], pagination: [{
401
+ type: ViewChild,
402
+ args: ["pagination"]
403
+ }], templateDirectives: [{
404
+ type: ContentChildren,
405
+ args: [DynamicTableTemplateDirective]
406
+ }] }); })();
407
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL2NvbXBvbmVudHMvZHluYW1pYy10YWJsZS9keW5hbWljLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9uZ3gtdXRpbHMvY29tcG9uZW50cy9keW5hbWljLXRhYmxlL2R5bmFtaWMtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLEtBQUssRUFFTCxTQUFTLEVBRVQsV0FBVyxFQUNYLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUgscUJBQXFCLEVBRXhCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLG1EQUFtRCxDQUFDO0FBQ2hHLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQ25CekMsNkJBQTBDO0lBQUEsWUFBdUI7O0lBQUEsaUJBQVE7OztJQUFwRCxzQ0FBb0I7SUFBQyxlQUF1QjtJQUF2Qix5REFBdUI7Ozs7SUFEckUsK0JBQW1EO0lBQy9DLCtGQUF5RTtJQUN6RSxpQ0FLa0Q7SUFBM0MsbU5BQWlCLDJCQUF1QixJQUFDOztJQUxoRCxpQkFLa0QsRUFBQTs7OztJQU4xQyxlQUFXO0lBQVgsb0NBQVc7SUFJWixlQUF1QztJQUF2Qyx1RUFBdUMsNkJBQUE7SUFEdkMscUNBQW1COzs7SUFKOUIscUZBUU07OztJQVJxQiwyQ0FBc0I7OztJQWdCekMsNEJBQU07SUFBQSxZQUE0RTtJQUFBLGlC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SSxFQUFDO1lBSTlDLGVBQWU7a0JBRGQsU0FBUzttQkFBQyxpQkFBaUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7WUFJNUMsa0JBQWtCO2tCQURqQixTQUFTO21CQUFDLG9CQUFvQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztZQUkvQyxzQkFBc0I7a0JBRHJCLFNBQVM7bUJBQUMsd0JBQXdCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO1lBSW5ELHFCQUFxQjtrQkFEcEIsU0FBUzttQkFBQyx1QkFBdUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7WUFJMUMsVUFBVTtrQkFEakIsU0FBUzttQkFBQyxZQUFZO1lBSWYsa0JBQWtCO2tCQUR6QixlQUFlO21CQUFDLDZCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgQ29udGVudENoaWxkLFxyXG4gICAgQ29udGVudENoaWxkcmVuLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBRdWVyeUxpc3QsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgVGVtcGxhdGVSZWYsXHJcbiAgICBWaWV3Q2hpbGRcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gICAgSVBhZ2luYXRpb25EYXRhLFxyXG4gICAgSVRhYmxlQ29sdW1ucyxcclxuICAgIElUYWJsZVRlbXBsYXRlcyxcclxuICAgIFBhZ2luYXRpb25JdGVtQ29udGV4dCxcclxuICAgIFRhYmxlRGF0YUxvYWRlclxyXG59IGZyb20gXCIuLi8uLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4uLy4uL3V0aWxzL29iamVjdC51dGlsc1wiO1xyXG5pbXBvcnQge0R5bmFtaWNUYWJsZVRlbXBsYXRlRGlyZWN0aXZlfSBmcm9tIFwiLi4vLi4vZGlyZWN0aXZlcy9keW5hbWljLXRhYmxlLXRlbXBsYXRlLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQge1BhZ2luYXRpb25EaXJlY3RpdmV9IGZyb20gXCIuLi8uLi9kaXJlY3RpdmVzL3BhZ2luYXRpb24uZGlyZWN0aXZlXCI7XHJcbmltcG9ydCB7VW5pcXVlVXRpbHN9IGZyb20gXCIuLi8uLi91dGlscy91bmlxdWUudXRpbHNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwiZHluYW1pYy10YWJsZVwiLFxyXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9keW5hbWljLXRhYmxlLmNvbXBvbmVudC5odG1sXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEeW5hbWljVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICAgIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgZGF0YUxvYWRlcjogVGFibGVEYXRhTG9hZGVyO1xyXG4gICAgQElucHV0KCkgZGF0YTogYW55W107XHJcbiAgICBASW5wdXQoKSBwYXJhbGxlbERhdGE6IGFueVtdO1xyXG4gICAgQElucHV0KCkgY29sdW1uczogSVRhYmxlQ29sdW1ucyB8IHN0cmluZ1tdO1xyXG4gICAgQElucHV0KCkgc2hvd0ZpbHRlcjogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGl0ZW1zUGVyUGFnZTogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgdXBkYXRlVGltZTogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgbWF4UGFnZXM6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGRpcmVjdGlvbkxpbmtzOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgYm91bmRhcnlMaW5rczogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIG9yZGVyQnk6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIG9yZGVyRGVzY2VuZGluZzogYm9vbGVhbjtcclxuXHJcbiAgICB0YWJsZUlkOiBzdHJpbmc7XHJcbiAgICB0ZW1wbGF0ZXM6IElUYWJsZVRlbXBsYXRlcztcclxuICAgIGZpbHRlcjogc3RyaW5nO1xyXG4gICAgb3JkZXJzOiBJVGFibGVDb2x1bW5zO1xyXG4gICAgY29sczogc3RyaW5nW107XHJcblxyXG4gICAgZ2V0IGl0ZW1zKCk6IGFueVtdIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMucGFnaW5hdGlvbiA/IFtdIDogdGhpcy5wYWdpbmF0aW9uLml0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoXCJyb3dUZW1wbGF0ZVwiLCB7c3RhdGljOiB0cnVlfSlcclxuICAgIHJvd1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoXCJ3cmFwcGVyVGVtcGxhdGVcIiwge3N0YXRpYzogdHJ1ZX0pXHJcbiAgICB3cmFwcGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZChcImZpbHRlclRlbXBsYXRlXCIsIHtzdGF0aWM6IHRydWV9KVxyXG4gICAgZmlsdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgQFZpZXdDaGlsZChcImNvbHVtbnNUZW1wbGF0ZVwiLCB7c3RhdGljOiB0cnVlfSlcclxuICAgIGNvbHVtbnNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICBAVmlld0NoaWxkKFwiZGVmYXVsdFJvd1RlbXBsYXRlXCIsIHtzdGF0aWM6IHRydWV9KVxyXG4gICAgZGVmYXVsdFJvd1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoXCJkZWZhdWx0V3JhcHBlclRlbXBsYXRlXCIsIHtzdGF0aWM6IHRydWV9KVxyXG4gICAgZGVmYXVsdFdyYXBwZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICBAVmlld0NoaWxkKFwiZGVmYXVsdEZpbHRlclRlbXBsYXRlXCIsIHtzdGF0aWM6IHRydWV9KVxyXG4gICAgZGVmYXVsdEZpbHRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoXCJwYWdpbmF0aW9uXCIpXHJcbiAgICBwcml2YXRlIHBhZ2luYXRpb246IFBhZ2luYXRpb25EaXJlY3RpdmU7XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZHJlbihEeW5hbWljVGFibGVUZW1wbGF0ZURpcmVjdGl2ZSlcclxuICAgIHByaXZhdGUgdGVtcGxhdGVEaXJlY3RpdmVzOiBRdWVyeUxpc3Q8RHluYW1pY1RhYmxlVGVtcGxhdGVEaXJlY3RpdmU+O1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNvbXBhcmUob3JkZXJCeTogc3RyaW5nLCBhOiBQYWdpbmF0aW9uSXRlbUNvbnRleHQsIGI6IFBhZ2luYXRpb25JdGVtQ29udGV4dCk6IG51bWJlciB7XHJcbiAgICAgICAgYSA9IGEuaXRlbSA/IGEuaXRlbVtvcmRlckJ5XSA6IG51bGw7XHJcbiAgICAgICAgYiA9IGIuaXRlbSA/IGIuaXRlbVtvcmRlckJ5XSA6IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdFV0aWxzLmNvbXBhcmUoYSwgYik7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhTG9hZGVyID0gdGhpcy5sb2FkTG9jYWxEYXRhO1xyXG4gICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMudGFibGVJZCA9IFVuaXF1ZVV0aWxzLnV1aWQoKTtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuZmlsdGVyID0gXCJcIjtcclxuICAgICAgICB0aGlzLm9yZGVycyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlcyA9IHRoaXMudGVtcGxhdGVEaXJlY3RpdmVzLnJlZHVjZSgocmVzdWx0LCBkaXJlY3RpdmUpID0+IHtcclxuICAgICAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzQXJyYXkoZGlyZWN0aXZlLmNvbHVtbikpIHtcclxuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5jb2x1bW4uZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtjb2x1bW5dID0gZGlyZWN0aXZlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghT2JqZWN0VXRpbHMuaXNTdHJpbmcoZGlyZWN0aXZlLmNvbHVtbikgfHwgZGlyZWN0aXZlLmNvbHVtbi5sZW5ndGggPT0gMCkgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgcmVzdWx0W2RpcmVjdGl2ZS5jb2x1bW5dID0gZGlyZWN0aXZlO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0sIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yb3dUZW1wbGF0ZSA9IHRoaXMucm93VGVtcGxhdGUgfHwgdGhpcy5kZWZhdWx0Um93VGVtcGxhdGU7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJUZW1wbGF0ZSA9IHRoaXMuZmlsdGVyVGVtcGxhdGUgfHwgdGhpcy5kZWZhdWx0RmlsdGVyVGVtcGxhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLmNvbHVtbnMpIHtcclxuICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IGNoYW5nZXMuY29sdW1ucy5jdXJyZW50VmFsdWUgfHwgW107XHJcbiAgICAgICAgICAgIHRoaXMub3JkZXJzID0gT2JqZWN0VXRpbHMuaXNBcnJheShjb2x1bW5zKSA/IGNvbHVtbnMucmVkdWNlKChyZXN1bHQsIGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2NvbHVtbl0gPSBjb2x1bW47XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9LCB7fSkgOiBjb2x1bW5zO1xyXG4gICAgICAgICAgICB0aGlzLmNvbHMgPSBPYmplY3Qua2V5cyh0aGlzLm9yZGVycyk7XHJcbiAgICAgICAgICAgIHRoaXMub3JkZXJCeSA9IHRoaXMub3JkZXJCeSBpbiB0aGlzLm9yZGVycyA/IHRoaXMub3JkZXJCeSA6IHRoaXMuY29sdW1uc1swXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNoYW5nZXMub3JkZXJCeSAmJiB0aGlzLm9yZGVycykge1xyXG4gICAgICAgICAgICB0aGlzLm9yZGVyQnkgPSB0aGlzLm9yZGVyQnkgaW4gdGhpcy5vcmRlcnMgPyB0aGlzLm9yZGVyQnkgOiB0aGlzLmNvbHVtbnNbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY2hhbmdlcy5kYXRhICYmICFjaGFuZ2VzLnBhcmFsbGVsRGF0YSAmJiAhY2hhbmdlcy5pdGVtc1BlclBhZ2UgJiYgIWNoYW5nZXMub3JkZXJCeSAmJiAhY2hhbmdlcy5vcmRlckRlc2NlbmRpbmcpIHJldHVybjtcclxuICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5wYWdpbmF0aW9uKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnJlZnJlc2goKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjtcclxuICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRPcmRlcihjb2x1bW46IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub3JkZXJEZXNjZW5kaW5nID0gY29sdW1uID09IHRoaXMub3JkZXJCeSAmJiAhdGhpcy5vcmRlckRlc2NlbmRpbmc7XHJcbiAgICAgICAgdGhpcy5vcmRlckJ5ID0gY29sdW1uO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWREYXRhID0gKHBhZ2U6IG51bWJlciwgaXRlbXNQZXJQYWdlOiBudW1iZXIpOiBQcm9taXNlPElQYWdpbmF0aW9uRGF0YT4gPT4ge1xyXG4gICAgICAgIGNvbnN0IG9yZGVyQnkgPSB0aGlzLm9yZGVyc1t0aGlzLm9yZGVyQnldO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFMb2FkZXIocGFnZSwgaXRlbXNQZXJQYWdlLCBvcmRlckJ5LCB0aGlzLm9yZGVyRGVzY2VuZGluZywgdGhpcy5maWx0ZXIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIGxvYWRMb2NhbERhdGEocGFnZTogbnVtYmVyLCByb3dzUGVyUGFnZTogbnVtYmVyLCBvcmRlckJ5OiBzdHJpbmcsIG9yZGVyRGVzY2VuZGluZzogYm9vbGVhbiwgZmlsdGVyOiBzdHJpbmcpOiBQcm9taXNlPElQYWdpbmF0aW9uRGF0YT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5kYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xyXG4gICAgICAgICAgICAgICAgdG90YWw6IDAsXHJcbiAgICAgICAgICAgICAgICBpdGVtczogW11cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbXBhcmU6IChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyID0gb3JkZXJEZXNjZW5kaW5nXHJcbiAgICAgICAgICAgID8gKGEsIGIpID0+IER5bmFtaWNUYWJsZUNvbXBvbmVudC5jb21wYXJlKG9yZGVyQnksIGIsIGEpXHJcbiAgICAgICAgICAgIDogKGEsIGIpID0+IER5bmFtaWNUYWJsZUNvbXBvbmVudC5jb21wYXJlKG9yZGVyQnksIGEsIGIpO1xyXG4gICAgICAgIGNvbnN0IGZyb20gPSAocGFnZSAtIDEpICogcm93c1BlclBhZ2U7XHJcbiAgICAgICAgY29uc3QgZGF0YUxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5taW4ocm93c1BlclBhZ2UsIGRhdGFMZW5ndGggLSBmcm9tKTtcclxuICAgICAgICBjb25zdCBwYXJhbGxlbERhdGEgPSB0aGlzLnBhcmFsbGVsRGF0YSB8fCBbXTtcclxuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuZGF0YS5tYXAoKGl0ZW0sIGl4KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbkl0ZW1Db250ZXh0KGl0ZW0sIHBhcmFsbGVsRGF0YVtpeF0gfHwge30sIGRhdGFMZW5ndGgsIGl4LCBpeCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzU3RyaW5nKGZpbHRlcikgJiYgZmlsdGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsdGVyUnggPSBuZXcgUmVnRXhwKGZpbHRlciwgXCJnaVwiKTtcclxuICAgICAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKGMgPT4gYy5maWx0ZXIoZmlsdGVyUngpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSBvcmRlckJ5ID8gZGF0YS5zb3J0KGNvbXBhcmUpLnNwbGljZShmcm9tLCBsZW5ndGgpIDogZGF0YS5zcGxpY2UoZnJvbSwgbGVuZ3RoKTtcclxuICAgICAgICBpdGVtcy5mb3JFYWNoKChjb250ZXh0LCBpeCkgPT4ge1xyXG4gICAgICAgICAgICBjb250ZXh0LmluZGV4ID0gZnJvbSArIGl4O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xyXG4gICAgICAgICAgICB0b3RhbDogZGF0YUxlbmd0aCxcclxuICAgICAgICAgICAgaXRlbXM6IGl0ZW1zXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImR5bmFtaWMtdGFibGVcIiAjcGFnaW5hdGlvbj1cInBhZ2luYXRpb25cIiBbcGFnaW5hdGlvbl09XCJsb2FkRGF0YVwiIFtpdGVtc1BlclBhZ2VdPVwiaXRlbXNQZXJQYWdlXCIgW3VwZGF0ZVRpbWVdPVwidXBkYXRlVGltZVwiPlxyXG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RmlsdGVyVGVtcGxhdGUgbGV0LXRhYmxlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1zZWFyY2hcIiAqbmdJZj1cInRhYmxlLnNob3dGaWx0ZXJcIj5cclxuICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBbYXR0ci5mb3JdPVwidGFibGVJZFwiPnt7IGxhYmVsIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cInRhYmxlSWRcIlxyXG4gICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInRhYmxlLmZpbHRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0YWJsZS5zZXRGaWx0ZXIoJGV2ZW50KVwiLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctY29udGFpbmVyIFtuZ3hUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJUZW1wbGF0ZSB8fCBkZWZhdWx0RmlsdGVyVGVtcGxhdGVcIiBbY29udGV4dF09XCJ0aGlzXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8cGFnaW5hdGlvbi1tZW51IFttYXhTaXplXT1cIm1heFBhZ2VzXCIgW2RpcmVjdGlvbkxpbmtzXT1cImRpcmVjdGlvbkxpbmtzXCIgW2JvdW5kYXJ5TGlua3NdPVwiYm91bmRhcnlMaW5rc1wiPjwvcGFnaW5hdGlvbi1tZW51PlxyXG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNjb2x1bW5UZW1wbGF0ZSBsZXQtY29udGV4dCBsZXQtY29sdW1uPVwiY29sdW1uXCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGVtcGxhdGUgbGV0LWNvbHVtbj1cImNvbHVtblwiIGxldC1pdGVtPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbVtjb2x1bW5dID09IHVuZGVmaW5lZCB8fCBpdGVtW2NvbHVtbl0gPT0gbnVsbCA/ICctJyA6IGl0ZW1bY29sdW1uXSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwdXJlVGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ3hUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZS5yZWZcIiBbY29udGV4dF09XCJjb250ZXh0XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDx0ZCBbbmdDbGFzc109XCInY29sdW1uLScgKyBjb2x1bW5cIiAqbmdJZj1cIiF0ZW1wbGF0ZSB8fCAhdGVtcGxhdGUucHVyZTsgZWxzZSBwdXJlVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25neFRlbXBsYXRlT3V0bGV0XT1cIiF0ZW1wbGF0ZSA/IGRlZmF1bHRUZW1wbGF0ZSA6IHRlbXBsYXRlLnJlZlwiIFtjb250ZXh0XT1cImNvbnRleHRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2NvbHVtbnNUZW1wbGF0ZSBsZXQtY29udGV4dD5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ3hUZW1wbGF0ZU91dGxldF09XCJjb2x1bW5UZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2FkZGl0aW9uYWxDb250ZXh0XT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZXNbY29sdW1uXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJvd1RlbXBsYXRlIGxldC1jb250ZXh0PlxyXG4gICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ3hUZW1wbGF0ZU91dGxldF09XCJjb2x1bW5zVGVtcGxhdGVcIiBbY29udGV4dF09XCJjb250ZXh0XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0V3JhcHBlclRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkXCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sc1wiIFtuZ0NsYXNzXT1cIidjb2x1bW4tJyArIGNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSAqbmdJZj1cIm9yZGVyc1tjb2x1bW5dXCIgKGNsaWNrKT1cInNldE9yZGVyKGNvbHVtbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdsYWJlbC4nICsgY29sdW1uIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJvcmRlckJ5ID09IGNvbHVtblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJvcmRlckRlc2NlbmRpbmcgPyAnc29ydC1kZXNjJyA6ICdzb3J0LWFzYydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwib3JkZXJCeSA9PSBjb2x1bW4gPyAob3JkZXJEZXNjZW5kaW5nID8gJ3NvcnQtZGVzYyc6ICdzb3J0LWFzYycpIDogJydcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhb3JkZXJzW2NvbHVtbl1cIj57eyAnbGFiZWwuJyArIGNvbHVtbiB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpwYWdpbmF0aW9uSXRlbT1cImxldCBjb250ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25neFRlbXBsYXRlT3V0bGV0XT1cInJvd1RlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthZGRpdGlvbmFsQ29udGV4dF09XCJ0aGlzXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25neFRlbXBsYXRlT3V0bGV0XT1cIndyYXBwZXJUZW1wbGF0ZSB8fCBkZWZhdWx0V3JhcHBlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjb250ZXh0XT1cInRoaXNcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHBhZ2luYXRpb24tbWVudSBbbWF4U2l6ZV09XCJtYXhQYWdlc1wiIFtkaXJlY3Rpb25MaW5rc109XCJkaXJlY3Rpb25MaW5rc1wiIFtib3VuZGFyeUxpbmtzXT1cImJvdW5kYXJ5TGlua3NcIj48L3BhZ2luYXRpb24tbWVudT5cclxuPC9kaXY+XHJcbiJdfQ==