ngx-material-entity 15.3.0 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/classes/entity.model.d.ts +2 -2
  2. package/components/confirm-dialog/confirm-dialog-data.d.ts +1 -1
  3. package/components/edit-page/edit-page.component.d.ts +4 -2
  4. package/components/edit-page/page-edit-data.builder.d.ts +1 -1
  5. package/components/input/array/array-string-chips-input/array-string-chips-input.component.d.ts +1 -0
  6. package/components/input/array/array-table.class.d.ts +4 -2
  7. package/components/input/base-input.component.d.ts +5 -1
  8. package/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.d.ts +1 -1
  9. package/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.d.ts +1 -1
  10. package/components/input/file/file-default-input/file-default-input.component.d.ts +0 -2
  11. package/components/input/file/file-image-input/file-image-input.component.d.ts +3 -2
  12. package/components/input/file/file-input/file-input.component.d.ts +4 -2
  13. package/components/input/input.component.d.ts +9 -4
  14. package/components/input/input.module.d.ts +2 -1
  15. package/components/table/display-column-value/base-display-column-value.component.d.ts +1 -1
  16. package/components/table/display-column-value/display-column-value.component.d.ts +1 -1
  17. package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +3 -1
  18. package/components/table/table-data.builder.d.ts +1 -1
  19. package/components/table/table-data.d.ts +1 -1
  20. package/components/table/table.component.d.ts +1 -1
  21. package/decorators/base/decorator-types.enum.d.ts +1 -1
  22. package/decorators/base/property-decorator.data.d.ts +1 -1
  23. package/decorators/file/file-decorator.data.d.ts +1 -1
  24. package/decorators/number/number-decorator.data.d.ts +1 -1
  25. package/decorators/string/string-decorator.data.d.ts +1 -1
  26. package/encapsulation/jszip.utilities.d.ts +1 -1
  27. package/encapsulation/uuid.utilities.d.ts +11 -0
  28. package/esm2022/classes/base.builder.mjs +44 -0
  29. package/esm2022/classes/entity.model.mjs +26 -0
  30. package/esm2022/components/confirm-dialog/confirm-dialog-data.builder.mjs +58 -0
  31. package/esm2022/components/confirm-dialog/confirm-dialog.component.mjs +60 -0
  32. package/esm2022/components/edit-page/edit-page.component.mjs +291 -0
  33. package/esm2022/components/input/array/array-date-input/array-date-input.component.mjs +23 -0
  34. package/esm2022/components/input/array/array-date-range-input/array-date-range-input.component.mjs +49 -0
  35. package/esm2022/components/input/array/array-date-time-input/array-date-time-input.component.mjs +49 -0
  36. package/esm2022/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +50 -0
  37. package/esm2022/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +69 -0
  38. package/esm2022/components/input/array/array-table.class.mjs +100 -0
  39. package/esm2022/components/input/base-input.component.mjs +88 -0
  40. package/esm2022/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +21 -0
  41. package/esm2022/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +17 -0
  42. package/esm2022/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +21 -0
  43. package/esm2022/components/input/custom/custom.component.mjs +28 -0
  44. package/esm2022/components/input/date/date-input/date-input.component.mjs +19 -0
  45. package/esm2022/components/input/date/date-range-input/date-range-input.component.mjs +68 -0
  46. package/esm2022/components/input/date/date-time-input/date-time-input.component.mjs +69 -0
  47. package/esm2022/components/input/file/file-default-input/file-default-input.component.mjs +18 -0
  48. package/esm2022/components/input/file/file-image-input/file-image-input.component.mjs +101 -0
  49. package/esm2022/components/input/file/file-input/dragDrop.directive.mjs +62 -0
  50. package/esm2022/components/input/file/file-input/file-input.component.mjs +206 -0
  51. package/esm2022/components/input/input.component.mjs +849 -0
  52. package/esm2022/components/input/input.module.mjs +172 -0
  53. package/esm2022/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +23 -0
  54. package/esm2022/components/input/number/number-input/number-input.component.mjs +16 -0
  55. package/esm2022/components/input/number/number-slider-input/number-slider-input.component.mjs +17 -0
  56. package/esm2022/components/input/relations/references-many-input/references-many-input.component.mjs +102 -0
  57. package/esm2022/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +36 -0
  58. package/esm2022/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +23 -0
  59. package/esm2022/components/input/string/string-input/string-input.component.mjs +16 -0
  60. package/esm2022/components/input/string/string-password-input/string-password-input.component.mjs +39 -0
  61. package/esm2022/components/input/string/string-textbox-input/string-textbox-input.component.mjs +17 -0
  62. package/esm2022/components/table/create-dialog/create-dialog-data.builder.mjs +42 -0
  63. package/esm2022/components/table/create-dialog/create-entity-dialog-data.builder.mjs +32 -0
  64. package/esm2022/components/table/create-dialog/create-entity-dialog.component.mjs +107 -0
  65. package/esm2022/components/table/display-column-value/base-display-column-value.component.mjs +28 -0
  66. package/esm2022/components/table/display-column-value/display-column-value.component.mjs +37 -0
  67. package/esm2022/components/table/edit-dialog/edit-data.builder.mjs +106 -0
  68. package/esm2022/components/table/edit-dialog/edit-entity-dialog.component.mjs +209 -0
  69. package/esm2022/components/table/edit-dialog/edit-entity.builder.mjs +39 -0
  70. package/esm2022/components/table/table-data.builder.mjs +269 -0
  71. package/esm2022/components/table/table.component.mjs +348 -0
  72. package/esm2022/decorators/array/array-decorator-internal.data.mjs +286 -0
  73. package/esm2022/decorators/array/array-decorator.data.mjs +21 -0
  74. package/esm2022/decorators/base/property-decorator-internal.data.mjs +82 -0
  75. package/esm2022/decorators/base/property-decorator.data.mjs +56 -0
  76. package/esm2022/decorators/boolean/boolean-decorator-internal.data.mjs +43 -0
  77. package/esm2022/decorators/boolean/boolean-decorator.data.mjs +11 -0
  78. package/esm2022/decorators/custom/custom-decorator-internal.data.mjs +35 -0
  79. package/{esm2020 → esm2022}/decorators/date/date-decorator-internal.data.mjs +43 -1
  80. package/esm2022/decorators/date/date-decorator.data.mjs +11 -0
  81. package/esm2022/decorators/file/file-decorator-internal.data.mjs +143 -0
  82. package/esm2022/decorators/file/file-decorator.data.mjs +64 -0
  83. package/esm2022/decorators/has-many/has-many-decorator-internal.data.mjs +42 -0
  84. package/esm2022/decorators/number/number-decorator-internal.data.mjs +76 -0
  85. package/esm2022/decorators/number/number-decorator.data.mjs +11 -0
  86. package/esm2022/decorators/object/object-decorator-internal.data.mjs +20 -0
  87. package/esm2022/decorators/object/object-decorator.data.mjs +22 -0
  88. package/esm2022/decorators/references-many/references-many-decorator-internal.data.mjs +48 -0
  89. package/esm2022/decorators/references-one/references-one-decorator-internal.data.mjs +24 -0
  90. package/esm2022/decorators/string/string-decorator-internal.data.mjs +114 -0
  91. package/esm2022/decorators/string/string-decorator.data.mjs +11 -0
  92. package/esm2022/encapsulation/uuid.utilities.mjs +15 -0
  93. package/esm2022/services/entity.service.mjs +276 -0
  94. package/esm2022/utilities/date.utilities.mjs +159 -0
  95. package/esm2022/utilities/entity.utilities.mjs +905 -0
  96. package/esm2022/utilities/file.utilities.mjs +180 -0
  97. package/{fesm2020 → fesm2022}/ngx-material-entity.mjs +1355 -484
  98. package/fesm2022/ngx-material-entity.mjs.map +1 -0
  99. package/package.json +11 -17
  100. package/utilities/date.utilities.d.ts +1 -1
  101. package/utilities/entity.utilities.d.ts +7 -3
  102. package/utilities/file.utilities.d.ts +6 -2
  103. package/esm2020/classes/base.builder.mjs +0 -42
  104. package/esm2020/classes/entity.model.mjs +0 -22
  105. package/esm2020/components/confirm-dialog/confirm-dialog-data.builder.mjs +0 -44
  106. package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +0 -57
  107. package/esm2020/components/edit-page/edit-page.component.mjs +0 -274
  108. package/esm2020/components/input/array/array-date-input/array-date-input.component.mjs +0 -26
  109. package/esm2020/components/input/array/array-date-range-input/array-date-range-input.component.mjs +0 -50
  110. package/esm2020/components/input/array/array-date-time-input/array-date-time-input.component.mjs +0 -49
  111. package/esm2020/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +0 -49
  112. package/esm2020/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +0 -70
  113. package/esm2020/components/input/array/array-table.class.mjs +0 -93
  114. package/esm2020/components/input/base-input.component.mjs +0 -64
  115. package/esm2020/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +0 -21
  116. package/esm2020/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +0 -17
  117. package/esm2020/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +0 -21
  118. package/esm2020/components/input/custom/custom.component.mjs +0 -26
  119. package/esm2020/components/input/date/date-input/date-input.component.mjs +0 -22
  120. package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +0 -71
  121. package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +0 -71
  122. package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +0 -23
  123. package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +0 -98
  124. package/esm2020/components/input/file/file-input/dragDrop.directive.mjs +0 -63
  125. package/esm2020/components/input/file/file-input/file-input.component.mjs +0 -195
  126. package/esm2020/components/input/input.component.mjs +0 -746
  127. package/esm2020/components/input/input.module.mjs +0 -169
  128. package/esm2020/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +0 -26
  129. package/esm2020/components/input/number/number-input/number-input.component.mjs +0 -16
  130. package/esm2020/components/input/number/number-slider-input/number-slider-input.component.mjs +0 -17
  131. package/esm2020/components/input/relations/references-many-input/references-many-input.component.mjs +0 -100
  132. package/esm2020/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +0 -34
  133. package/esm2020/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +0 -26
  134. package/esm2020/components/input/string/string-input/string-input.component.mjs +0 -16
  135. package/esm2020/components/input/string/string-password-input/string-password-input.component.mjs +0 -42
  136. package/esm2020/components/input/string/string-textbox-input/string-textbox-input.component.mjs +0 -17
  137. package/esm2020/components/table/create-dialog/create-dialog-data.builder.mjs +0 -32
  138. package/esm2020/components/table/create-dialog/create-entity-dialog-data.builder.mjs +0 -26
  139. package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +0 -100
  140. package/esm2020/components/table/display-column-value/base-display-column-value.component.mjs +0 -27
  141. package/esm2020/components/table/display-column-value/display-column-value.component.mjs +0 -33
  142. package/esm2020/components/table/edit-dialog/edit-data.builder.mjs +0 -76
  143. package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +0 -195
  144. package/esm2020/components/table/edit-dialog/edit-entity.builder.mjs +0 -29
  145. package/esm2020/components/table/table-data.builder.mjs +0 -205
  146. package/esm2020/components/table/table.component.mjs +0 -333
  147. package/esm2020/decorators/array/array-decorator-internal.data.mjs +0 -150
  148. package/esm2020/decorators/array/array-decorator.data.mjs +0 -7
  149. package/esm2020/decorators/base/property-decorator-internal.data.mjs +0 -58
  150. package/esm2020/decorators/base/property-decorator.data.mjs +0 -6
  151. package/esm2020/decorators/boolean/boolean-decorator-internal.data.mjs +0 -33
  152. package/esm2020/decorators/boolean/boolean-decorator.data.mjs +0 -7
  153. package/esm2020/decorators/custom/custom-decorator-internal.data.mjs +0 -27
  154. package/esm2020/decorators/date/date-decorator.data.mjs +0 -7
  155. package/esm2020/decorators/file/file-decorator-internal.data.mjs +0 -97
  156. package/esm2020/decorators/file/file-decorator.data.mjs +0 -7
  157. package/esm2020/decorators/has-many/has-many-decorator-internal.data.mjs +0 -32
  158. package/esm2020/decorators/number/number-decorator-internal.data.mjs +0 -54
  159. package/esm2020/decorators/number/number-decorator.data.mjs +0 -7
  160. package/esm2020/decorators/object/object-decorator-internal.data.mjs +0 -14
  161. package/esm2020/decorators/object/object-decorator.data.mjs +0 -7
  162. package/esm2020/decorators/references-many/references-many-decorator-internal.data.mjs +0 -30
  163. package/esm2020/decorators/references-one/references-one-decorator-internal.data.mjs +0 -16
  164. package/esm2020/decorators/string/string-decorator-internal.data.mjs +0 -72
  165. package/esm2020/decorators/string/string-decorator.data.mjs +0 -7
  166. package/esm2020/services/entity.service.mjs +0 -274
  167. package/esm2020/utilities/date.utilities.mjs +0 -159
  168. package/esm2020/utilities/entity.utilities.mjs +0 -896
  169. package/esm2020/utilities/file.utilities.mjs +0 -176
  170. package/fesm2015/ngx-material-entity.mjs +0 -6300
  171. package/fesm2015/ngx-material-entity.mjs.map +0 -1
  172. package/fesm2020/ngx-material-entity.mjs.map +0 -1
  173. /package/{esm2020 → esm2022}/components/confirm-dialog/confirm-dialog-data.mjs +0 -0
  174. /package/{esm2020 → esm2022}/components/edit-page/edit-data.route.mjs +0 -0
  175. /package/{esm2020 → esm2022}/components/edit-page/page-edit-data.builder.mjs +0 -0
  176. /package/{esm2020 → esm2022}/components/get-validation-error-message.function.mjs +0 -0
  177. /package/{esm2020 → esm2022}/components/table/create-dialog/create-entity-dialog-data.mjs +0 -0
  178. /package/{esm2020 → esm2022}/components/table/default.actions.mjs +0 -0
  179. /package/{esm2020 → esm2022}/components/table/edit-dialog/edit-entity-data.mjs +0 -0
  180. /package/{esm2020 → esm2022}/components/table/table-data.mjs +0 -0
  181. /package/{esm2020 → esm2022}/decorators/array/array.decorator.mjs +0 -0
  182. /package/{esm2020 → esm2022}/decorators/base/base-property.decorator.mjs +0 -0
  183. /package/{esm2020 → esm2022}/decorators/base/decorator-types.enum.mjs +0 -0
  184. /package/{esm2020 → esm2022}/decorators/base/dropdown-value.interface.mjs +0 -0
  185. /package/{esm2020 → esm2022}/decorators/boolean/boolean.decorator.mjs +0 -0
  186. /package/{esm2020 → esm2022}/decorators/custom/custom-decorator.data.mjs +0 -0
  187. /package/{esm2020 → esm2022}/decorators/custom/custom.decorator.mjs +0 -0
  188. /package/{esm2020 → esm2022}/decorators/date/date.decorator.mjs +0 -0
  189. /package/{esm2020 → esm2022}/decorators/file/file.decorator.mjs +0 -0
  190. /package/{esm2020 → esm2022}/decorators/has-many/has-many-decorator.data.mjs +0 -0
  191. /package/{esm2020 → esm2022}/decorators/has-many/has-many.decorator.mjs +0 -0
  192. /package/{esm2020 → esm2022}/decorators/number/number.decorator.mjs +0 -0
  193. /package/{esm2020 → esm2022}/decorators/object/object.decorator.mjs +0 -0
  194. /package/{esm2020 → esm2022}/decorators/references-many/references-many-decorator.data.mjs +0 -0
  195. /package/{esm2020 → esm2022}/decorators/references-many/references-many.decorator.mjs +0 -0
  196. /package/{esm2020 → esm2022}/decorators/references-one/references-one-decorator.data.mjs +0 -0
  197. /package/{esm2020 → esm2022}/decorators/references-one/references-one.decorator.mjs +0 -0
  198. /package/{esm2020 → esm2022}/decorators/string/string.decorator.mjs +0 -0
  199. /package/{esm2020 → esm2022}/encapsulation/js-2-xml.utilities.mjs +0 -0
  200. /package/{esm2020 → esm2022}/encapsulation/jszip.utilities.mjs +0 -0
  201. /package/{esm2020 → esm2022}/encapsulation/lodash.utilities.mjs +0 -0
  202. /package/{esm2020 → esm2022}/encapsulation/reflect.utilities.mjs +0 -0
  203. /package/{esm2020 → esm2022}/functions/default-false.function.mjs +0 -0
  204. /package/{esm2020 → esm2022}/functions/default-true.function.mjs +0 -0
  205. /package/{esm2020 → esm2022}/functions/is-async-function.function.mjs +0 -0
  206. /package/{esm2020 → esm2022}/mocks/placeholder-data.png.mjs +0 -0
  207. /package/{esm2020 → esm2022}/ngx-material-entity.mjs +0 -0
  208. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  209. /package/{esm2020 → esm2022}/services/unsaved-changes.guard.mjs +0 -0
  210. /package/{esm2020 → esm2022}/utilities/selection.utilities.mjs +0 -0
@@ -1,176 +0,0 @@
1
- import { JSZipUtilities } from '../encapsulation/jszip.utilities';
2
- import { LodashUtilities } from '../encapsulation/lodash.utilities';
3
- /**
4
- * Provides functionality regarding files.
5
- */
6
- export class FileUtilities {
7
- /**
8
- * Gets the accept value for the html input.
9
- *
10
- * @param mimeTypes - The mimeTypes to get the accept string from.
11
- * @returns A comma separated string of all the provided mime types.
12
- */
13
- static getAcceptString(mimeTypes) {
14
- if (!mimeTypes?.length) {
15
- return '*';
16
- }
17
- return mimeTypes.join(', ');
18
- }
19
- // TODO: Find a way to use blobs with jest
20
- /* istanbul ignore next */
21
- /**
22
- * Reads a url to display the given file.
23
- *
24
- * @param file - The file to get the url from.
25
- * @returns A promise of the url. Undefined if no file was provided.
26
- */
27
- static async getDataURLFromFile(file) {
28
- if (!file) {
29
- return undefined;
30
- }
31
- return new Promise((resolve, reject) => {
32
- const reader = new FileReader();
33
- reader.onload = e => resolve(e.target?.result);
34
- reader.onerror = e => reject(e);
35
- reader.readAsDataURL(file);
36
- });
37
- }
38
- // TODO: Find a way to use blobs with jest
39
- /* istanbul ignore next */
40
- /**
41
- * Gets a file from the given url.
42
- *
43
- * @param url - The url to get the file from.
44
- * @returns A promise of the File.
45
- */
46
- static async getFileFromUrl(url) {
47
- const res = await fetch(url);
48
- if (!res.ok) {
49
- // TODO make error more robust
50
- throw new Error(`Error fetching the file from the url ${url}`);
51
- }
52
- return await res.blob();
53
- }
54
- // TODO: Find a way to use blobs with jest
55
- /* istanbul ignore next */
56
- /**
57
- * Gets the file data with the blob from the given File Data.
58
- *
59
- * @param data - The File Data to get the file data with blob from.
60
- * @returns FileDataWithFile.
61
- */
62
- static async getFileData(data) {
63
- if (data.file) {
64
- return {
65
- file: data.file,
66
- name: data.name,
67
- url: data.url,
68
- type: data.type,
69
- size: data.size
70
- };
71
- }
72
- else {
73
- return {
74
- file: await FileUtilities.getFileFromUrl(data.url),
75
- name: data.name,
76
- url: data.url,
77
- type: data.type,
78
- size: data.size
79
- };
80
- }
81
- }
82
- // TODO: Find a way to use blobs with jest
83
- /* istanbul ignore next */
84
- /**
85
- * Downloads a single file from the given File Data.
86
- *
87
- * @param fileData - The file data. Needs to contain a blob.
88
- */
89
- static downloadSingleFile(fileData) {
90
- this.downLoadBlob(fileData.file, fileData.name);
91
- }
92
- // TODO: Find a way to use blobs with jest
93
- /* istanbul ignore next */
94
- /**
95
- * Downloads a blob.
96
- *
97
- * @param blob - The blob to download.
98
- * @param name - The name of the downloaded file.
99
- */
100
- static downLoadBlob(blob, name) {
101
- const a = document.createElement('a');
102
- const objectUrl = URL.createObjectURL(blob);
103
- a.href = objectUrl;
104
- if (name) {
105
- a.download = name;
106
- }
107
- a.click();
108
- URL.revokeObjectURL(objectUrl);
109
- }
110
- // TODO: Find a way to use blobs with jest
111
- /* istanbul ignore next */
112
- /**
113
- * Downloads multiple files as a zip with the given name.
114
- *
115
- * @param name - The name of the zip file to generate.
116
- * @param multiFileData - The file data array to put in the zip.
117
- */
118
- static async downloadMultipleFiles(name, multiFileData) {
119
- const zip = JSZipUtilities.new();
120
- for (let i = 0; i < multiFileData.length; i++) {
121
- multiFileData[i] = await FileUtilities.getFileData(multiFileData[i]);
122
- zip.file(multiFileData[i].name, multiFileData[i].file);
123
- }
124
- const zipBlob = await zip.generateAsync({ type: 'blob' });
125
- const fileData = {
126
- name: name,
127
- file: zipBlob,
128
- type: 'application/zip',
129
- size: zipBlob.size
130
- };
131
- FileUtilities.downloadSingleFile(fileData);
132
- }
133
- /**
134
- * Checks if the given file has a valid mime type.
135
- *
136
- * @param type - The type of the file to check.
137
- * @param allowedMimeTypes - The allowed mime types.
138
- * @returns Whether or not the given file has a valid mime type.
139
- */
140
- static isMimeTypeValid(type, allowedMimeTypes) {
141
- if (allowedMimeTypes.includes('*')) {
142
- return true;
143
- }
144
- for (const t of allowedMimeTypes) {
145
- if (t === type) {
146
- return true;
147
- }
148
- if (t.endsWith('*') && type.startsWith(t.split('*')[0])) {
149
- return true;
150
- }
151
- }
152
- return false;
153
- }
154
- /**
155
- * Transform the given value to Megabytes.
156
- *
157
- * @param value - The original value.
158
- * @param unit - If the value is B, KB or GB.
159
- * @returns The given value as bytes.
160
- */
161
- static transformToMegaBytes(value, unit) {
162
- const bytes = this.transformToBytes(LodashUtilities.cloneDeep(value), unit);
163
- return bytes / 1000000;
164
- }
165
- static transformToBytes(value, unit) {
166
- switch (unit) {
167
- case 'B':
168
- return value;
169
- case 'KB':
170
- return value * 1000;
171
- case 'GB':
172
- return value * 1000000000;
173
- }
174
- }
175
- }
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS51dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy91dGlsaXRpZXMvZmlsZS51dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGNBQWMsRUFBTyxNQUFNLGtDQUFrQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRTs7R0FFRztBQUNILE1BQU0sT0FBZ0IsYUFBYTtJQUMvQjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBb0I7UUFDdkMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUU7WUFDcEIsT0FBTyxHQUFHLENBQUM7U0FDZDtRQUNELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLDBCQUEwQjtJQUMxQjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBVztRQUN2QyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1AsT0FBTyxTQUFTLENBQUM7U0FDcEI7UUFDRCxPQUFPLElBQUksT0FBTyxDQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzNDLE1BQU0sTUFBTSxHQUFlLElBQUksVUFBVSxFQUFFLENBQUM7WUFDNUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQWdCLENBQUMsQ0FBQztZQUN6RCxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENB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O2dCQUNKLE9BQU8sS0FBSyxDQUFDO1lBQ2pCLEtBQUssSUFBSTtnQkFDTCxPQUFPLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDeEIsS0FBSyxJQUFJO2dCQUNMLE9BQU8sS0FBSyxHQUFHLFVBQVUsQ0FBQztTQUNqQztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZpbGVEYXRhV2l0aEZpbGUgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2ZpbGUvZmlsZS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBGaWxlRGF0YSB9IGZyb20gJy4uL2RlY29yYXRvcnMvZmlsZS9maWxlLWRlY29yYXRvci5kYXRhJztcbmltcG9ydCB7IEpTWmlwVXRpbGl0aWVzLCBaaXAgfSBmcm9tICcuLi9lbmNhcHN1bGF0aW9uL2pzemlwLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBMb2Rhc2hVdGlsaXRpZXMgfSBmcm9tICcuLi9lbmNhcHN1bGF0aW9uL2xvZGFzaC51dGlsaXRpZXMnO1xuXG4vKipcbiAqIFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgcmVnYXJkaW5nIGZpbGVzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmlsZVV0aWxpdGllcyB7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYWNjZXB0IHZhbHVlIGZvciB0aGUgaHRtbCBpbnB1dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtaW1lVHlwZXMgLSBUaGUgbWltZVR5cGVzIHRvIGdldCB0aGUgYWNjZXB0IHN0cmluZyBmcm9tLlxuICAgICAqIEByZXR1cm5zIEEgY29tbWEgc2VwYXJhdGVkIHN0cmluZyBvZiBhbGwgdGhlIHByb3ZpZGVkIG1pbWUgdHlwZXMuXG4gICAgICovXG4gICAgc3RhdGljIGdldEFjY2VwdFN0cmluZyhtaW1lVHlwZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghbWltZVR5cGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAnKic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbWVUeXBlcy5qb2luKCcsICcpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEZpbmQgYSB3YXkgdG8gdXNlIGJsb2JzIHdpdGggamVzdFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgLyoqXG4gICAgICogUmVhZHMgYSB1cmwgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gZmlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdG8gZ2V0IHRoZSB1cmwgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb2YgdGhlIHVybC4gVW5kZWZpbmVkIGlmIG5vIGZpbGUgd2FzIHByb3ZpZGVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBnZXREYXRhVVJMRnJvbUZpbGUoZmlsZT86IEJsb2IpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBlID0+IHJlc29sdmUoZS50YXJnZXQ/LnJlc3VsdCBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlID0+IHJlamVjdChlKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIHVzZSBibG9icyB3aXRoIGplc3RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIC8qKlxuICAgICAqIEdldHMgYSBmaWxlIGZyb20gdGhlIGdpdmVuIHVybC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmwgLSBUaGUgdXJsIHRvIGdldCB0aGUgZmlsZSBmcm9tLlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSBvZiB0aGUgRmlsZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZXRGaWxlRnJvbVVybCh1cmw6IHN0cmluZyk6IFByb21pc2U8QmxvYj4ge1xuICAgICAgICBjb25zdCByZXM6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICAgIC8vIFRPRE8gbWFrZSBlcnJvciBtb3JlIHJvYnVzdFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBmZXRjaGluZyB0aGUgZmlsZSBmcm9tIHRoZSB1cmwgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcy5ibG9iKCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogRmluZCBhIHdheSB0byB1c2UgYmxvYnMgd2l0aCBqZXN0XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaWxlIGRhdGEgd2l0aCB0aGUgYmxvYiBmcm9tIHRoZSBnaXZlbiBGaWxlIERhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBGaWxlIERhdGEgdG8gZ2V0IHRoZSBmaWxlIGRhdGEgd2l0aCBibG9iIGZyb20uXG4gICAgICogQHJldHVybnMgRmlsZURhdGFXaXRoRmlsZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZ2V0RmlsZURhdGEoZGF0YTogRmlsZURhdGEpOiBQcm9taXNlPEZpbGVEYXRhV2l0aEZpbGU+IHtcbiAgICAgICAgaWYgKGRhdGEuZmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmaWxlOiBkYXRhLmZpbGUsXG4gICAgICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLFxuICAgICAgICAgICAgICAgIHVybDogZGF0YS51cmwsXG4gICAgICAgICAgICAgICAgdHlwZTogZGF0YS50eXBlLFxuICAgICAgICAgICAgICAgIHNpemU6IGRhdGEuc2l6ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZmlsZTogYXdhaXQgRmlsZVV0aWxpdGllcy5nZXRGaWxlRnJvbVVybChkYXRhLnVybCBhcyBzdHJpbmcpLFxuICAgICAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSxcbiAgICAgICAgICAgICAgICB1cmw6IGRhdGEudXJsLFxuICAgICAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgICBzaXplOiBkYXRhLnNpemVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIHVzZSBibG9icyB3aXRoIGplc3RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIC8qKlxuICAgICAqIERvd25sb2FkcyBhIHNpbmdsZSBmaWxlIGZyb20gdGhlIGdpdmVuIEZpbGUgRGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlRGF0YSAtIFRoZSBmaWxlIGRhdGEuIE5lZWRzIHRvIGNvbnRhaW4gYSBibG9iLlxuICAgICAqL1xuICAgIHN0YXRpYyBkb3dubG9hZFNpbmdsZUZpbGUoZmlsZURhdGE6IEZpbGVEYXRhV2l0aEZpbGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kb3duTG9hZEJsb2IoZmlsZURhdGEuZmlsZSwgZmlsZURhdGEubmFtZSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogRmluZCBhIHdheSB0byB1c2UgYmxvYnMgd2l0aCBqZXN0XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvKipcbiAgICAgKiBEb3dubG9hZHMgYSBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJsb2IgLSBUaGUgYmxvYiB0byBkb3dubG9hZC5cbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBkb3dubG9hZGVkIGZpbGUuXG4gICAgICovXG4gICAgc3RhdGljIGRvd25Mb2FkQmxvYihibG9iOiBCbG9iLCBuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGE6IEhUTUxBbmNob3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBjb25zdCBvYmplY3RVcmw6IHN0cmluZyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIGEuaHJlZiA9IG9iamVjdFVybDtcbiAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIGEuZG93bmxvYWQgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGEuY2xpY2soKTtcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChvYmplY3RVcmwpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEZpbmQgYSB3YXkgdG8gdXNlIGJsb2JzIHdpdGggamVzdFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgLyoqXG4gICAgICogRG93bmxvYWRzIG11bHRpcGxlIGZpbGVzIGFzIGEgemlwIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB6aXAgZmlsZSB0byBnZW5lcmF0ZS5cbiAgICAgKiBAcGFyYW0gbXVsdGlGaWxlRGF0YSAtIFRoZSBmaWxlIGRhdGEgYXJyYXkgdG8gcHV0IGluIHRoZSB6aXAuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGRvd25sb2FkTXVsdGlwbGVGaWxlcyhuYW1lOiBzdHJpbmcsIG11bHRpRmlsZURhdGE6IEZpbGVEYXRhW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgemlwOiBaaXAgPSBKU1ppcFV0aWxpdGllcy5uZXcoKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG11bHRpRmlsZURhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG11bHRpRmlsZURhdGFbaV0gPSBhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKG11bHRpRmlsZURhdGFbaV0pO1xuICAgICAgICAgICAgemlwLmZpbGUobXVsdGlGaWxlRGF0YVtpXS5uYW1lLCAobXVsdGlGaWxlRGF0YVtpXSBhcyBGaWxlRGF0YVdpdGhGaWxlKS5maWxlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB6aXBCbG9iOiBCbG9iID0gYXdhaXQgemlwLmdlbmVyYXRlQXN5bmMoeyB0eXBlOiAnYmxvYicgfSk7XG4gICAgICAgIGNvbnN0IGZpbGVEYXRhOiBGaWxlRGF0YVdpdGhGaWxlID0ge1xuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGZpbGU6IHppcEJsb2IsXG4gICAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vemlwJyxcbiAgICAgICAgICAgIHNpemU6IHppcEJsb2Iuc2l6ZVxuICAgICAgICB9O1xuICAgICAgICBGaWxlVXRpbGl0aWVzLmRvd25sb2FkU2luZ2xlRmlsZShmaWxlRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGhhcyBhIHZhbGlkIG1pbWUgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGZpbGUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIGFsbG93ZWRNaW1lVHlwZXMgLSBUaGUgYWxsb3dlZCBtaW1lIHR5cGVzLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBmaWxlIGhhcyBhIHZhbGlkIG1pbWUgdHlwZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNNaW1lVHlwZVZhbGlkKHR5cGU6IHN0cmluZywgYWxsb3dlZE1pbWVUeXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGFsbG93ZWRNaW1lVHlwZXMuaW5jbHVkZXMoJyonKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB0IG9mIGFsbG93ZWRNaW1lVHlwZXMpIHtcbiAgICAgICAgICAgIGlmICh0ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodC5lbmRzV2l0aCgnKicpICYmIHR5cGUuc3RhcnRzV2l0aCh0LnNwbGl0KCcqJylbMF0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSB0aGUgZ2l2ZW4gdmFsdWUgdG8gTWVnYWJ5dGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG9yaWdpbmFsIHZhbHVlLlxuICAgICAqIEBwYXJhbSB1bml0IC0gSWYgdGhlIHZhbHVlIGlzIEIsIEtCIG9yIEdCLlxuICAgICAqIEByZXR1cm5zIFRoZSBnaXZlbiB2YWx1ZSBhcyBieXRlcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgdHJhbnNmb3JtVG9NZWdhQnl0ZXModmFsdWU6IG51bWJlciwgdW5pdDogJ0InIHwgJ0tCJyB8ICdHQicpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBieXRlczogbnVtYmVyID0gdGhpcy50cmFuc2Zvcm1Ub0J5dGVzKExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWUpLCB1bml0KTtcbiAgICAgICAgcmV0dXJuIGJ5dGVzIC8gMTAwMDAwMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyB0cmFuc2Zvcm1Ub0J5dGVzKHZhbHVlOiBudW1iZXIsIHVuaXQ6ICdCJyB8ICdLQicgfCAnR0InKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdCJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBjYXNlICdLQic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICogMTAwMDtcbiAgICAgICAgICAgIGNhc2UgJ0dCJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKiAxMDAwMDAwMDAwO1xuICAgICAgICB9XG4gICAgfVxufSJdfQ==