@ironcode/vas-lib 1.8.0-alpha.1 → 1.8.0-alpha.11

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 (249) hide show
  1. package/cjs/lib/control-value/index.d.ts +1 -0
  2. package/cjs/lib/control-value/index.d.ts.map +1 -1
  3. package/cjs/lib/control-value/index.js +1 -0
  4. package/cjs/lib/control-value/index.js.map +1 -1
  5. package/cjs/lib/control-value/vas-camera-control-value.model.js +1 -2
  6. package/cjs/lib/control-value/vas-camera-control-value.model.js.map +1 -1
  7. package/cjs/lib/control-value/vas-function-control-value.dto.d.ts +7 -0
  8. package/cjs/lib/control-value/vas-function-control-value.dto.d.ts.map +1 -0
  9. package/cjs/lib/control-value/vas-function-control-value.dto.js +3 -0
  10. package/cjs/lib/control-value/vas-function-control-value.dto.js.map +1 -0
  11. package/cjs/lib/controls-config/index.d.ts +1 -0
  12. package/cjs/lib/controls-config/index.d.ts.map +1 -1
  13. package/cjs/lib/controls-config/index.js +1 -0
  14. package/cjs/lib/controls-config/index.js.map +1 -1
  15. package/cjs/lib/controls-config/vas-control-config-direction.enum.js +1 -1
  16. package/cjs/lib/controls-config/vas-control-config-direction.enum.js.map +1 -1
  17. package/cjs/lib/controls-config/vas-function-control-config.dto.d.ts +6 -0
  18. package/cjs/lib/controls-config/vas-function-control-config.dto.d.ts.map +1 -0
  19. package/cjs/lib/controls-config/vas-function-control-config.dto.js +3 -0
  20. package/cjs/lib/controls-config/vas-function-control-config.dto.js.map +1 -0
  21. package/cjs/lib/elastic/index.d.ts +2 -0
  22. package/cjs/lib/elastic/index.d.ts.map +1 -0
  23. package/cjs/lib/elastic/index.js +5 -0
  24. package/cjs/lib/elastic/index.js.map +1 -0
  25. package/cjs/lib/elastic/job.elastic-doc.d.ts +14 -0
  26. package/cjs/lib/elastic/job.elastic-doc.d.ts.map +1 -0
  27. package/cjs/lib/elastic/job.elastic-doc.js +3 -0
  28. package/cjs/lib/elastic/job.elastic-doc.js.map +1 -0
  29. package/cjs/lib/entity/index.d.ts +3 -0
  30. package/cjs/lib/entity/index.d.ts.map +1 -1
  31. package/cjs/lib/entity/index.js +3 -0
  32. package/cjs/lib/entity/index.js.map +1 -1
  33. package/cjs/lib/entity/vas-account.dto.js +1 -1
  34. package/cjs/lib/entity/vas-account.dto.js.map +1 -1
  35. package/cjs/lib/entity/vas-base.model.d.ts +5 -4
  36. package/cjs/lib/entity/vas-base.model.d.ts.map +1 -1
  37. package/cjs/lib/entity/vas-base.model.js +1 -1
  38. package/cjs/lib/entity/vas-base.model.js.map +1 -1
  39. package/cjs/lib/entity/vas-contact.model.d.ts +1 -0
  40. package/cjs/lib/entity/vas-contact.model.d.ts.map +1 -1
  41. package/cjs/lib/entity/vas-contact.model.js +22 -1
  42. package/cjs/lib/entity/vas-contact.model.js.map +1 -1
  43. package/cjs/lib/entity/vas-control.model.d.ts +6 -4
  44. package/cjs/lib/entity/vas-control.model.d.ts.map +1 -1
  45. package/cjs/lib/entity/vas-control.model.js +23 -3
  46. package/cjs/lib/entity/vas-control.model.js.map +1 -1
  47. package/cjs/lib/entity/vas-field.dto.d.ts +5 -1
  48. package/cjs/lib/entity/vas-field.dto.d.ts.map +1 -1
  49. package/cjs/lib/entity/vas-field.dto.js.map +1 -1
  50. package/cjs/lib/entity/vas-field.model.d.ts +10 -9
  51. package/cjs/lib/entity/vas-field.model.d.ts.map +1 -1
  52. package/cjs/lib/entity/vas-field.model.js +40 -27
  53. package/cjs/lib/entity/vas-field.model.js.map +1 -1
  54. package/cjs/lib/entity/vas-file.dto.js +1 -2
  55. package/cjs/lib/entity/vas-file.dto.js.map +1 -1
  56. package/cjs/lib/entity/vas-file.model.d.ts +1 -0
  57. package/cjs/lib/entity/vas-file.model.d.ts.map +1 -1
  58. package/cjs/lib/entity/vas-file.model.js +10 -0
  59. package/cjs/lib/entity/vas-file.model.js.map +1 -1
  60. package/cjs/lib/entity/vas-fire-user.model.d.ts +1 -1
  61. package/cjs/lib/entity/vas-fire-user.model.d.ts.map +1 -1
  62. package/cjs/lib/entity/vas-fire-user.model.js.map +1 -1
  63. package/cjs/lib/entity/vas-form-config.model.d.ts +3 -13
  64. package/cjs/lib/entity/vas-form-config.model.d.ts.map +1 -1
  65. package/cjs/lib/entity/vas-form-config.model.js.map +1 -1
  66. package/cjs/lib/entity/vas-form.model.d.ts +5 -0
  67. package/cjs/lib/entity/vas-form.model.d.ts.map +1 -1
  68. package/cjs/lib/entity/vas-form.model.js +21 -1
  69. package/cjs/lib/entity/vas-form.model.js.map +1 -1
  70. package/cjs/lib/entity/vas-group.model.d.ts +1 -0
  71. package/cjs/lib/entity/vas-group.model.d.ts.map +1 -1
  72. package/cjs/lib/entity/vas-group.model.js +11 -0
  73. package/cjs/lib/entity/vas-group.model.js.map +1 -1
  74. package/cjs/lib/entity/vas-invitation.js +1 -1
  75. package/cjs/lib/entity/vas-invitation.js.map +1 -1
  76. package/cjs/lib/entity/vas-job-email.model.d.ts +2 -0
  77. package/cjs/lib/entity/vas-job-email.model.d.ts.map +1 -1
  78. package/cjs/lib/entity/vas-job-email.model.js +15 -9
  79. package/cjs/lib/entity/vas-job-email.model.js.map +1 -1
  80. package/cjs/lib/entity/vas-job.dto.d.ts +10 -2
  81. package/cjs/lib/entity/vas-job.dto.d.ts.map +1 -1
  82. package/cjs/lib/entity/vas-job.dto.js.map +1 -1
  83. package/cjs/lib/entity/vas-job.model.d.ts +13 -4
  84. package/cjs/lib/entity/vas-job.model.d.ts.map +1 -1
  85. package/cjs/lib/entity/vas-job.model.js +39 -14
  86. package/cjs/lib/entity/vas-job.model.js.map +1 -1
  87. package/cjs/lib/entity/vas-lookup.model.d.ts +35 -0
  88. package/cjs/lib/entity/vas-lookup.model.d.ts.map +1 -0
  89. package/cjs/lib/entity/vas-lookup.model.js +73 -0
  90. package/cjs/lib/entity/vas-lookup.model.js.map +1 -0
  91. package/cjs/lib/entity/vas-note.model.d.ts +1 -0
  92. package/cjs/lib/entity/vas-note.model.d.ts.map +1 -1
  93. package/cjs/lib/entity/vas-note.model.js +9 -0
  94. package/cjs/lib/entity/vas-note.model.js.map +1 -1
  95. package/cjs/lib/entity/vas-report.dto.d.ts +1 -1
  96. package/cjs/lib/entity/vas-report.dto.d.ts.map +1 -1
  97. package/cjs/lib/entity/vas-report.dto.js.map +1 -1
  98. package/cjs/lib/entity/vas-report.model.d.ts +5 -2
  99. package/cjs/lib/entity/vas-report.model.d.ts.map +1 -1
  100. package/cjs/lib/entity/vas-report.model.js +15 -4
  101. package/cjs/lib/entity/vas-report.model.js.map +1 -1
  102. package/cjs/lib/entity/vas-task.dto.d.ts +1 -0
  103. package/cjs/lib/entity/vas-task.dto.d.ts.map +1 -1
  104. package/cjs/lib/entity/vas-task.dto.js.map +1 -1
  105. package/cjs/lib/entity/vas-task.model.d.ts +3 -1
  106. package/cjs/lib/entity/vas-task.model.d.ts.map +1 -1
  107. package/cjs/lib/entity/vas-task.model.js +16 -2
  108. package/cjs/lib/entity/vas-task.model.js.map +1 -1
  109. package/cjs/lib/entity/vas-user.model.d.ts +2 -2
  110. package/cjs/lib/entity/vas-user.model.d.ts.map +1 -1
  111. package/cjs/lib/entity/vas-user.model.js +1 -1
  112. package/cjs/lib/entity/vas-user.model.js.map +1 -1
  113. package/cjs/lib/entity/vas-vehicle.model.d.ts +1 -0
  114. package/cjs/lib/entity/vas-vehicle.model.d.ts.map +1 -1
  115. package/cjs/lib/entity/vas-vehicle.model.js +12 -0
  116. package/cjs/lib/entity/vas-vehicle.model.js.map +1 -1
  117. package/cjs/lib/utils/find-form-control.js.map +1 -1
  118. package/cjs/lib/utils/get-value-by-path.d.ts.map +1 -1
  119. package/cjs/lib/utils/get-value-by-path.js.map +1 -1
  120. package/cjs/lib/utils/is-array-string.d.ts +1 -1
  121. package/cjs/lib/utils/is-array-string.d.ts.map +1 -1
  122. package/cjs/lib/utils/omit.d.ts +8 -0
  123. package/cjs/lib/utils/omit.d.ts.map +1 -0
  124. package/cjs/lib/utils/omit.js +26 -0
  125. package/cjs/lib/utils/omit.js.map +1 -0
  126. package/cjs/lib/utils/only.d.ts +8 -0
  127. package/cjs/lib/utils/only.d.ts.map +1 -0
  128. package/cjs/lib/utils/only.js +26 -0
  129. package/cjs/lib/utils/only.js.map +1 -0
  130. package/cjs/public-api.d.ts +1 -0
  131. package/cjs/public-api.d.ts.map +1 -1
  132. package/cjs/public-api.js +1 -0
  133. package/cjs/public-api.js.map +1 -1
  134. package/{fesm2020 → fesm2022}/ironcode-vas-lib.mjs +879 -63
  135. package/fesm2022/ironcode-vas-lib.mjs.map +1 -0
  136. package/lib/control-value/index.d.ts +1 -0
  137. package/lib/control-value/vas-function-control-value.dto.d.ts +6 -0
  138. package/lib/controls-config/index.d.ts +1 -0
  139. package/lib/controls-config/vas-function-control-config.dto.d.ts +5 -0
  140. package/lib/elastic/index.d.ts +1 -0
  141. package/lib/elastic/job.elastic-doc.d.ts +13 -0
  142. package/lib/entity/index.d.ts +3 -0
  143. package/lib/entity/vas-base.model.d.ts +5 -4
  144. package/lib/entity/vas-contact.model.d.ts +1 -0
  145. package/lib/entity/vas-control.model.d.ts +6 -4
  146. package/lib/entity/vas-field.dto.d.ts +5 -1
  147. package/lib/entity/vas-field.model.d.ts +10 -9
  148. package/lib/entity/vas-file.model.d.ts +1 -0
  149. package/lib/entity/vas-fire-user.model.d.ts +1 -1
  150. package/lib/entity/vas-form-config.model.d.ts +3 -13
  151. package/lib/entity/vas-form.model.d.ts +5 -0
  152. package/lib/entity/vas-group.model.d.ts +1 -0
  153. package/lib/entity/vas-job-email.model.d.ts +2 -0
  154. package/lib/entity/vas-job.dto.d.ts +10 -2
  155. package/lib/entity/vas-job.model.d.ts +13 -4
  156. package/lib/entity/vas-lookup.model.d.ts +34 -0
  157. package/lib/entity/vas-note.model.d.ts +1 -0
  158. package/lib/entity/vas-report.dto.d.ts +1 -1
  159. package/lib/entity/vas-report.model.d.ts +5 -2
  160. package/lib/entity/vas-task.dto.d.ts +9 -0
  161. package/lib/entity/vas-task.model.d.ts +36 -0
  162. package/lib/entity/vas-user.model.d.ts +2 -2
  163. package/lib/entity/vas-vehicle.model.d.ts +1 -0
  164. package/lib/utils/is-array-string.d.ts +1 -1
  165. package/lib/utils/only.d.ts +7 -0
  166. package/package.json +4 -11
  167. package/public-api.d.ts +1 -0
  168. package/cjs/package.json +0 -66
  169. package/esm2020/ironcode-vas-lib.mjs +0 -5
  170. package/esm2020/lib/control-value/index.mjs +0 -2
  171. package/esm2020/lib/control-value/vas-camera-control-value.model.mjs +0 -8
  172. package/esm2020/lib/controls-config/index.mjs +0 -4
  173. package/esm2020/lib/controls-config/vas-control-config-direction.enum.mjs +0 -8
  174. package/esm2020/lib/controls-config/vas-control-config.model.mjs +0 -2
  175. package/esm2020/lib/controls-config/vas-select-control-config.model.mjs +0 -2
  176. package/esm2020/lib/entity/index.mjs +0 -65
  177. package/esm2020/lib/entity/vas-access-group.dto.mjs +0 -2
  178. package/esm2020/lib/entity/vas-account-config.dto.mjs +0 -2
  179. package/esm2020/lib/entity/vas-account-object.dto.mjs +0 -2
  180. package/esm2020/lib/entity/vas-account-object.model.mjs +0 -24
  181. package/esm2020/lib/entity/vas-account.dto.mjs +0 -7
  182. package/esm2020/lib/entity/vas-base.dto.mjs +0 -2
  183. package/esm2020/lib/entity/vas-base.model.mjs +0 -34
  184. package/esm2020/lib/entity/vas-branch.dto.mjs +0 -2
  185. package/esm2020/lib/entity/vas-branch.model.mjs +0 -68
  186. package/esm2020/lib/entity/vas-contact-type.dto.mjs +0 -2
  187. package/esm2020/lib/entity/vas-contact.dto.mjs +0 -2
  188. package/esm2020/lib/entity/vas-contact.model.mjs +0 -84
  189. package/esm2020/lib/entity/vas-control-type.dto.mjs +0 -2
  190. package/esm2020/lib/entity/vas-control-type.model.mjs +0 -52
  191. package/esm2020/lib/entity/vas-control.dto.mjs +0 -2
  192. package/esm2020/lib/entity/vas-control.model.mjs +0 -171
  193. package/esm2020/lib/entity/vas-field.dto.mjs +0 -2
  194. package/esm2020/lib/entity/vas-field.model.mjs +0 -97
  195. package/esm2020/lib/entity/vas-file.dto.mjs +0 -9
  196. package/esm2020/lib/entity/vas-file.model.mjs +0 -125
  197. package/esm2020/lib/entity/vas-fire-user.dto.mjs +0 -2
  198. package/esm2020/lib/entity/vas-fire-user.model.mjs +0 -102
  199. package/esm2020/lib/entity/vas-form-config.dto.mjs +0 -2
  200. package/esm2020/lib/entity/vas-form-config.model.mjs +0 -31
  201. package/esm2020/lib/entity/vas-form.dto.mjs +0 -2
  202. package/esm2020/lib/entity/vas-form.model.mjs +0 -194
  203. package/esm2020/lib/entity/vas-group.dto.mjs +0 -2
  204. package/esm2020/lib/entity/vas-group.model.mjs +0 -97
  205. package/esm2020/lib/entity/vas-instruction-job-field.dto.mjs +0 -2
  206. package/esm2020/lib/entity/vas-instruction-job-field.model.mjs +0 -48
  207. package/esm2020/lib/entity/vas-instruction-job.dto.mjs +0 -2
  208. package/esm2020/lib/entity/vas-instruction-job.model.mjs +0 -81
  209. package/esm2020/lib/entity/vas-instruction-provider.dto.mjs +0 -2
  210. package/esm2020/lib/entity/vas-instruction-provider.model.mjs +0 -66
  211. package/esm2020/lib/entity/vas-instruction.dto.mjs +0 -2
  212. package/esm2020/lib/entity/vas-instruction.model.mjs +0 -52
  213. package/esm2020/lib/entity/vas-invitation.mjs +0 -88
  214. package/esm2020/lib/entity/vas-job-data.dto.mjs +0 -2
  215. package/esm2020/lib/entity/vas-job-data.model.mjs +0 -21
  216. package/esm2020/lib/entity/vas-job-email.dto.mjs +0 -2
  217. package/esm2020/lib/entity/vas-job-email.model.mjs +0 -79
  218. package/esm2020/lib/entity/vas-job-status.dto.mjs +0 -2
  219. package/esm2020/lib/entity/vas-job-type.dto.mjs +0 -2
  220. package/esm2020/lib/entity/vas-job.dto.mjs +0 -2
  221. package/esm2020/lib/entity/vas-job.model.mjs +0 -496
  222. package/esm2020/lib/entity/vas-lookup-type.dto.mjs +0 -2
  223. package/esm2020/lib/entity/vas-lookup.dto.mjs +0 -2
  224. package/esm2020/lib/entity/vas-membership.dto.mjs +0 -2
  225. package/esm2020/lib/entity/vas-membership.model.mjs +0 -62
  226. package/esm2020/lib/entity/vas-note.dto.mjs +0 -2
  227. package/esm2020/lib/entity/vas-note.model.mjs +0 -59
  228. package/esm2020/lib/entity/vas-report-layout.dto.mjs +0 -2
  229. package/esm2020/lib/entity/vas-report-layout.model.mjs +0 -22
  230. package/esm2020/lib/entity/vas-report-request.dto.mjs +0 -2
  231. package/esm2020/lib/entity/vas-report-request.model.mjs +0 -44
  232. package/esm2020/lib/entity/vas-report.dto.mjs +0 -2
  233. package/esm2020/lib/entity/vas-report.model.mjs +0 -57
  234. package/esm2020/lib/entity/vas-restricted-account-object.dto.mjs +0 -2
  235. package/esm2020/lib/entity/vas-restricted-account-object.model.mjs +0 -24
  236. package/esm2020/lib/entity/vas-task-type.dto.mjs +0 -2
  237. package/esm2020/lib/entity/vas-user.dto.mjs +0 -2
  238. package/esm2020/lib/entity/vas-user.model.mjs +0 -42
  239. package/esm2020/lib/entity/vas-vehicle.dto.mjs +0 -2
  240. package/esm2020/lib/entity/vas-vehicle.model.mjs +0 -57
  241. package/esm2020/lib/model/geo-location.mjs +0 -12
  242. package/esm2020/lib/model/index.mjs +0 -3
  243. package/esm2020/lib/model/vas-time-range.model.mjs +0 -2
  244. package/esm2020/lib/utils/get-value-by-path.mjs +0 -64
  245. package/esm2020/lib/utils/is-array-string.mjs +0 -4
  246. package/esm2020/public-api.mjs +0 -5
  247. package/fesm2015/ironcode-vas-lib.mjs +0 -2359
  248. package/fesm2015/ironcode-vas-lib.mjs.map +0 -1
  249. package/fesm2020/ironcode-vas-lib.mjs.map +0 -1
@@ -1,496 +0,0 @@
1
- import { isFileDto } from './vas-file.dto';
2
- import { UUID } from 'angular2-uuid';
3
- import moment from 'moment';
4
- import { getValueByPath } from '../utils/get-value-by-path';
5
- import { VasFieldModel } from './vas-field.model';
6
- import { VasRestrictedAccountObjectModel } from './vas-restricted-account-object.model';
7
- import { getEmptyGeoLocation } from '../model/geo-location';
8
- import { isCameraControlValueV1 } from '../control-value/vas-camera-control-value.model';
9
- import { isArrayString } from '../utils/is-array-string';
10
- /**
11
- * JobModel
12
- */
13
- export class VasJobModel extends VasRestrictedAccountObjectModel {
14
- constructor(id, created, serverCreated, createdBy, modified, serverModified, modifiedBy, createdByName, modifiedByName, account, accessGroup, reference, jobDate, jobStatus, jobType, assigneeId, formId, timeZoneOffset, pendingFields, childModified, version, fields, files, createdByDisplayName, modifiedByDisplayName, geoLocation) {
15
- super(id, created, serverCreated, createdBy, modified, serverModified, modifiedBy, createdByName, modifiedByName, account, accessGroup);
16
- this.id = id;
17
- this.created = created;
18
- this.serverCreated = serverCreated;
19
- this.createdBy = createdBy;
20
- this.modified = modified;
21
- this.serverModified = serverModified;
22
- this.modifiedBy = modifiedBy;
23
- this.createdByName = createdByName;
24
- this.modifiedByName = modifiedByName;
25
- this.account = account;
26
- this.accessGroup = accessGroup;
27
- this.reference = reference;
28
- this.jobDate = jobDate;
29
- this.jobStatus = jobStatus;
30
- this.jobType = jobType;
31
- this.assigneeId = assigneeId;
32
- this.formId = formId;
33
- this.timeZoneOffset = timeZoneOffset;
34
- this.pendingFields = pendingFields;
35
- this.childModified = childModified;
36
- this.version = version;
37
- this.fields = fields;
38
- this.files = files;
39
- this.createdByDisplayName = createdByDisplayName;
40
- this.modifiedByDisplayName = modifiedByDisplayName;
41
- this.geoLocation = geoLocation;
42
- }
43
- /**
44
- * Returns this with the dynamic interface
45
- * @return {VasJobModelDynamicInterface}
46
- */
47
- get $this() {
48
- return this;
49
- }
50
- /**
51
- * Returns a list of Job dynamic properties i.e. those that are added by the
52
- * dynamic forms
53
- */
54
- get dynamicProperties() {
55
- const nativeProps = this.staticProperties;
56
- return Object
57
- .getOwnPropertyNames(this)
58
- .filter(prop => !nativeProps.includes(prop));
59
- }
60
- /**
61
- * Returns the list of properties of the Job type
62
- */
63
- get staticProperties() {
64
- return Object.getOwnPropertyNames(VasJobModel.empty());
65
- }
66
- /**
67
- * @return {VasJobModel}
68
- */
69
- static empty() {
70
- return new VasJobModel('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', moment().utcOffset(), 0, '', 0, [], [], '', '', getEmptyGeoLocation());
71
- }
72
- static fromDto(dto) {
73
- const model = new VasJobModel(dto.id || '', dto.created || '', dto.serverCreated || '', dto.createdBy || '', dto.modified || '', dto.serverModified || '', dto.modifiedBy || '', dto.createdByName || '', dto.modifiedByName || '', dto.account || '', dto.accessGroup || '', dto.reference || '', dto.jobDate || '', dto.jobStatus || '', dto.jobType || '', dto.assigneeId || '', dto.formId || '', dto.timeZoneOffset || moment().utcOffset(), dto.pendingFields || 0, dto.childModified || '', dto.version || 0, dto.fields || [], dto.files || [], dto.createdByDisplayName || '', dto.modifiedByDisplayName || '', dto.geoLocation || getEmptyGeoLocation());
74
- const emptyKeys = model.staticProperties;
75
- Object
76
- .keys(dto)
77
- .filter(key => emptyKeys.indexOf(key) === -1)
78
- .forEach((key) => model.$this[key] = dto[key]);
79
- return model;
80
- }
81
- /**
82
- * This method will instantiate a new JobModel. The difference with this
83
- * method of instantiation is that we are coming from a relation frame i.e.
84
- * the job has a list of {@link VasFieldDto} instead of a Job document.
85
- *
86
- */
87
- static fromRelational(dto, form) {
88
- const model = new VasJobModel(dto.id || '', dto.created || '', dto.serverCreated || '', dto.createdBy || '', dto.modified || '', dto.serverModified || '', dto.modifiedBy || '', dto.createdByName || '', dto.modifiedByName || '', dto.account || '', dto.accessGroup || '', dto.reference || '', dto.jobDate || '', dto.jobStatus || '', dto.jobType || '', dto.assigneeId || '', dto.formId || '', dto.timeZoneOffset || moment().utcOffset(), dto.pendingFields || 0, dto.childModified || '', dto.version || 0, dto.fields || [], dto.files || [], dto.createdByDisplayName || '', dto.modifiedByDisplayName || '', dto.geoLocation || getEmptyGeoLocation());
89
- form.groups
90
- .forEach(group => {
91
- group.controls
92
- .forEach(control => {
93
- const field = dto.fields?.find(f => f.control === control.id);
94
- if (!field) {
95
- return;
96
- }
97
- model.getGroup(group.name)[control.name] = field.value;
98
- });
99
- });
100
- return model;
101
- }
102
- /**
103
- * @param {VasFormModel} formModel
104
- * @return {Record<string, VasFieldDtoValue>}
105
- */
106
- getFields(formModel) {
107
- const fields = {};
108
- formModel.groups
109
- .forEach(group => {
110
- group.controls.forEach(control => {
111
- (fields)[control.reportTemplateName] =
112
- this.getValueByPath([group.name, control.name]);
113
- });
114
- });
115
- return fields;
116
- }
117
- /**
118
- * Will return an object whose keys are the names of all fields in the job.
119
- * This method is similar to `getFields` except that this method will only
120
- * return values where a value was set, as opposed to `getFields` which will
121
- * return a value for every control even if not value was set, because it uses
122
- * the form to drive the logic. Note also this method will return values for
123
- * any Fields in the fields array.
124
- * @return {Record<string, VasFieldDtoValue>}
125
- */
126
- getFields2() {
127
- let fields = {};
128
- this.dynamicProperties
129
- .forEach((groupName) => {
130
- Object
131
- .keys(this.$this[groupName])
132
- .forEach(controlName => {
133
- fields[controlName] = this.getValueByPath([groupName, controlName]);
134
- });
135
- }, {});
136
- this.fields.forEach(field => fields[field.controlName] = field.value);
137
- return fields;
138
- }
139
- /**
140
- * Returns an object describing how many attachments were added to this job
141
- * (camera controls and files), and how many have not been uploaded yet.
142
- *
143
- * @param formModel instance of {@link VasFormModel} that was used when the
144
- * job was created
145
- */
146
- getFilesUploadStatus(formModel) {
147
- const pathsWithValue = formModel
148
- .getCameraControlPaths()
149
- .map(path => {
150
- const value = this.getValueByPath(path);
151
- if (value && !!value.id) {
152
- return path;
153
- }
154
- return null;
155
- })
156
- .filter(path => path !== null ? path : null)
157
- .filter(isArrayString);
158
- let total = pathsWithValue.length;
159
- total += this.files.length;
160
- // calculate the number of camera images still to upload
161
- let pending = pathsWithValue
162
- .map(path => this.getValueByPath(path))
163
- .map((value) => {
164
- if (isFileDto(value)) {
165
- return value.id && value.status !== 'COMPLETE';
166
- }
167
- else if (isCameraControlValueV1(value)) {
168
- // if url is not set, it hasn't been uploaded
169
- return value.id && !value.url;
170
- }
171
- return false;
172
- })
173
- .filter(hasUploaded => hasUploaded)
174
- .length;
175
- // add total from files that are pending
176
- pending += this.files
177
- .filter(value => value.status !== 'COMPLETE')
178
- .length;
179
- return {
180
- pending,
181
- total
182
- };
183
- }
184
- /**
185
- * This method will return the dynamic property from the JobModel that
186
- * represent a group (from a form).
187
- *
188
- * @param name the name of the group
189
- * @param init if true (default) and group is not found, initialise an empty
190
- * group, otherwise throw an error
191
- */
192
- getGroup(name, init = true) {
193
- let prop;
194
- if (this.staticProperties.includes(name)) {
195
- throw Error(`invalid group name ${name}, not a dynamic property`);
196
- }
197
- else if (this.$this[name] === undefined) {
198
- if (init) {
199
- prop = this.$this[name] = {};
200
- }
201
- else {
202
- throw Error(`invalid group name ${name}, not found`);
203
- }
204
- }
205
- else {
206
- prop = this.$this[name];
207
- if (typeof prop !== 'object') {
208
- throw Error(`invalid group name ${name}, not an object`);
209
- }
210
- }
211
- return prop;
212
- }
213
- /**
214
- * @param path path segments
215
- */
216
- getValueByPath(path = []) {
217
- return getValueByPath(path, this.$this);
218
- }
219
- /**
220
- * In order to understand why we need this method it is important to
221
- * understand that within the system, Jobs can be represented in one of two
222
- * ways, document and relational.
223
- *
224
- * The important distinction is how values submitted by a form are stored.
225
- *
226
- * Jobs stored as documents (JSON objects) will store user values, as dynamic
227
- * properties of the document.
228
- *
229
- * Whereas, Jobs stored as relational, will store user values in an array of
230
- * {@link VasFieldDto} objects.
231
- *
232
- * Depending on where we are in the system, either one of these approaches can
233
- * be more useful than the other.
234
- *
235
- * This method, assumes that the JobModel has been instantiated from a
236
- * document representation, and serves to hydrate the fields array. In order
237
- * to achieve this, knowledge of the {@link VasFormDto} that created the job
238
- * is required.
239
- *
240
- *
241
- * Job in document representation
242
- * {
243
- * id: <guid>,
244
- * reference: "something"
245
- * <other static job properties>...
246
- * foo: {
247
- * bar: "value"
248
- * }
249
- * }
250
- *
251
- * Job in relational representation
252
- * {
253
- * id: <guid>,
254
- * reference: "something"
255
- * <other static job properties>...
256
- * <will not have dynamic properties>...
257
- * fields: [
258
- * {
259
- * id: <guid>,
260
- * <other field properties>,
261
- * value: "value"
262
- * }
263
- * ]
264
- * }
265
- *
266
- *
267
- * @param formModel the VasFormModel that was used to create the job
268
- * @param controlFieldIdMap This is used to determine the id each field.
269
- * Either one will be found in the map, or a new one is generated.
270
- * @param controlNames if a value is provided, it will be used
271
- * to filter the fields that are returned.
272
- * @return {Array<VasFieldDto>}
273
- */
274
- hydrateFields(formModel, controlFieldIdMap = new Map(), controlNames) {
275
- const fields = [];
276
- formModel.groups
277
- .forEach(group => {
278
- group.controls.forEach(control => {
279
- if (!control.name.startsWith('fields.')) {
280
- return;
281
- }
282
- if (controlNames && !controlNames.includes(control.name)) {
283
- return;
284
- }
285
- fields.push(VasFieldModel.fromDto({
286
- // if the controlId exists in the map, use the associated fieldId,
287
- // otherwise generate a new id for the field.
288
- id: controlFieldIdMap.get(control.id) || UUID.UUID(),
289
- account: this.account,
290
- job: this.id,
291
- createdBy: this.createdBy,
292
- created: this.created,
293
- modifiedBy: this.modifiedBy,
294
- modified: this.modified,
295
- control: control.id,
296
- value: this.getValueByPath([group.name, control.name])
297
- }));
298
- });
299
- });
300
- this.fields = fields;
301
- }
302
- /**
303
- * A very non sophisticated way to set values in the job via paths
304
- *
305
- * For example:
306
- *
307
- * setValueByPath('value', ['foo', 'bar']);
308
- *
309
- * will make results in job
310
- * {
311
- * foo: {
312
- * bar: 'value'
313
- * }
314
- * }
315
- *
316
- * @param value the value to set
317
- * @param path path segments
318
- */
319
- setValueByPath(value, path = []) {
320
- switch (path.length) {
321
- case 0: {
322
- return;
323
- }
324
- case 1: {
325
- this[path[0]] = value;
326
- return;
327
- }
328
- case 2: {
329
- // eslint-disable-next-line max-len
330
- this.$this[path[0]][path[1]] = value;
331
- return;
332
- }
333
- case 3: {
334
- // eslint-disable-next-line max-len
335
- this.$this[path[0]][path[1]][path[2]] = value;
336
- return;
337
- }
338
- default: {
339
- throw Error('path has too many segments');
340
- }
341
- }
342
- }
343
- /**
344
- * @param staticOnly if true, will only output values for the static
345
- * properties in the dto
346
- */
347
- toDto(staticOnly = false) {
348
- if (staticOnly) {
349
- return {
350
- id: this.id,
351
- created: this.created,
352
- createdBy: this.createdBy,
353
- modified: this.modified,
354
- modifiedBy: this.modifiedBy,
355
- serverCreated: this.serverCreated,
356
- serverModified: this.serverModified,
357
- createdByName: this.createdByName,
358
- modifiedByName: this.modifiedByName,
359
- account: this.account,
360
- accessGroup: this.accessGroup,
361
- reference: this.reference,
362
- jobDate: this.jobDate,
363
- jobStatus: this.jobStatus,
364
- jobType: this.jobType,
365
- assigneeId: this.assigneeId,
366
- formId: this.formId,
367
- timeZoneOffset: this.timeZoneOffset,
368
- pendingFields: this.pendingFields,
369
- childModified: this.childModified,
370
- version: this.version,
371
- fields: this.fields,
372
- files: this.files,
373
- createdByDisplayName: this.createdByDisplayName,
374
- modifiedByDisplayName: this.modifiedByDisplayName,
375
- geoLocation: this.geoLocation
376
- };
377
- }
378
- const dto = {};
379
- [...this.staticProperties, ...this.dynamicProperties]
380
- .forEach(prop => dto[prop] = this.$this[prop]);
381
- return dto;
382
- }
383
- /**
384
- * This method will parse a syntax that allows us to build strings from the
385
- * values of from the job model. For example if the job model was:
386
- *
387
- * {
388
- * foo: 'bar'
389
- * }
390
- *
391
- * and we pass "i am foo {foo}", the result would be:
392
- *
393
- * "i am foo bar"
394
- *
395
- * we can also use moment to parse dates, for example if the job model was:
396
- *
397
- * {
398
- * created: "2022-01-01T00:00:00+0000"
399
- * }
400
- *
401
- * and we pass "{created|date:YY-MM-DD}", the result would be:
402
- *
403
- * "2022-01-01"
404
- *
405
- * @param {string} value a string with the syntax
406
- * @param {ParseSyntaxOptions} options
407
- * @return the results of parsing the syntax on this job
408
- */
409
- parseSyntax(value, options = {
410
- timeZoneOffset: 0
411
- }) {
412
- if (!value || typeof value !== 'string') {
413
- return '';
414
- }
415
- return value.replace(/({[^}]*})/g, (match, token) => {
416
- const syntax = token.substring(1, token.length - 1);
417
- let [key, filter] = syntax.split('|');
418
- key = (key || '').trim();
419
- filter = (filter || '').trim();
420
- let filterName, filterArg = '';
421
- if (filter) {
422
- const splitIndex = filter.indexOf(':');
423
- if (splitIndex !== -1) {
424
- filterName = filter.substring(0, splitIndex);
425
- filterArg = filter.substring(splitIndex + 1);
426
- }
427
- else {
428
- filterName = filter;
429
- filterArg = '';
430
- }
431
- filterName = (filterName || '').trim();
432
- filterArg = (filterArg || '').trim();
433
- }
434
- const path = key.split('.');
435
- const objectKey = path.shift() || '';
436
- let result = '';
437
- if (objectKey === 'job') {
438
- result = (this.getValueByPath(path) || '').toString();
439
- }
440
- else if (objectKey === 'fields') {
441
- result = (getValueByPath(['fields.' + path.shift(), ...path], this.getFields2()) || '').toString();
442
- }
443
- else if (objectKey.length) {
444
- if (options.objects) {
445
- if (options.objects[objectKey] === undefined) {
446
- console.debug(`objectKey ${objectKey} is not present in options.object`);
447
- result = '';
448
- }
449
- else {
450
- result = (getValueByPath(path, options.objects[objectKey]) || '')
451
- .toString();
452
- }
453
- }
454
- else {
455
- console.debug(`objectKey ${objectKey} was used but options.object is not set`);
456
- return '';
457
- }
458
- }
459
- else {
460
- return '';
461
- }
462
- if (filterName && result) {
463
- switch (filterName) {
464
- case 'date': {
465
- return moment(result)
466
- .utcOffset(options.timeZoneOffset)
467
- .format(filterArg || '');
468
- }
469
- default: {
470
- console.warn('unknown filter %s', filterName);
471
- }
472
- }
473
- }
474
- return result;
475
- }).trim();
476
- }
477
- ;
478
- /**
479
- * @return {object}
480
- */
481
- toApiDto() {
482
- return {
483
- ...super.toApiDto(),
484
- reference: this.reference || '~',
485
- jobDate: this.jobDate || '~',
486
- jobType: this.jobType || '~',
487
- accessGroup: this.accessGroup || '~',
488
- jobStatus: this.jobStatus || '~',
489
- assigneeId: this.assigneeId || '~',
490
- timeZoneOffset: this.timeZoneOffset || 0,
491
- pendingFields: this.pendingFields || 0,
492
- lastForm: this.formId || '~'
493
- };
494
- }
495
- }
496
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWpvYi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Zhcy1saWIvc3JjL2xpYi9lbnRpdHkvdmFzLWpvYi5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdsRCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQWUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQThCLE1BQU0saURBQWlELENBQUM7QUFDckgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBcUJ6RDs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsK0JBQStCO0lBRTlELFlBQ2tCLEVBQVUsRUFDVixPQUFlLEVBQ2YsYUFBcUIsRUFDckIsU0FBaUIsRUFDakIsUUFBZ0IsRUFDaEIsY0FBc0IsRUFDdEIsVUFBa0IsRUFDbEIsYUFBcUIsRUFDckIsY0FBc0IsRUFDdEIsT0FBZSxFQUNmLFdBQW1CLEVBQzVCLFNBQWlCLEVBQ2pCLE9BQWUsRUFDZixTQUFpQixFQUNqQixPQUFlLEVBQ2YsVUFBa0IsRUFDbEIsTUFBYyxFQUNkLGNBQXNCLEVBQ3RCLGFBQXFCLEVBQ3JCLGFBQXFCLEVBQ3JCLE9BQWUsRUFDZixNQUEwQixFQUMxQixLQUF3QixFQUN4QixvQkFBNEIsRUFDNUIscUJBQTZCLEVBQzdCLFdBQXdCO1FBRS9CLEtBQUssQ0FD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QyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQzVCO29CQUNELE9BQU8sQ0FBQyxDQUFDO3dCQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLENBQUM7cUJBQy9DO2lCQUNGO2FBQ0Y7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFBQSxDQUFDO0lBRUY7O09BRUc7SUFDTSxRQUFRO1FBQ2YsT0FBTztZQUNMLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHO1lBQ2hDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLEdBQUc7WUFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksR0FBRztZQUM1QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxHQUFHO1lBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLEdBQUc7WUFDaEMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksR0FBRztZQUNsQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDO1lBQ3hDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUM7WUFDdEMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksR0FBRztTQUM3QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNGaWxlRHRvLCBWYXNGaWxlRHRvIH0gZnJvbSAnLi92YXMtZmlsZS5kdG8nO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gJ2FuZ3VsYXIyLXV1aWQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgZ2V0VmFsdWVCeVBhdGggfSBmcm9tICcuLi91dGlscy9nZXQtdmFsdWUtYnktcGF0aCc7XG5pbXBvcnQgeyBWYXNCYXNlRHRvIH0gZnJvbSAnLi92YXMtYmFzZS5kdG8nO1xuaW1wb3J0IHsgVmFzRmllbGREdG8sIFZhc0ZpZWxkRHRvVmFsdWUgfSBmcm9tICcuL3Zhcy1maWVsZC5kdG8nO1xuaW1wb3J0IHsgVmFzRmllbGRNb2RlbCB9IGZyb20gJy4vdmFzLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IFZhc0Zvcm1Nb2RlbCB9IGZyb20gJy4vdmFzLWZvcm0ubW9kZWwnO1xuaW1wb3J0IHsgVmFzSm9iRHRvIH0gZnJvbSAnLi92YXMtam9iLmR0byc7XG5pbXBvcnQgeyBWYXNSZXN0cmljdGVkQWNjb3VudE9iamVjdE1vZGVsIH0gZnJvbSAnLi92YXMtcmVzdHJpY3RlZC1hY2NvdW50LW9iamVjdC5tb2RlbCc7XG5pbXBvcnQgeyBHZW9Mb2NhdGlvbiwgZ2V0RW1wdHlHZW9Mb2NhdGlvbiB9IGZyb20gJy4uL21vZGVsL2dlby1sb2NhdGlvbic7XG5pbXBvcnQgeyBpc0NhbWVyYUNvbnRyb2xWYWx1ZVYxLCBWYXNDYW1lcmFDb250cm9sVmFsdWVNb2RlbCB9IGZyb20gJy4uL2NvbnRyb2wtdmFsdWUvdmFzLWNhbWVyYS1jb250cm9sLXZhbHVlLm1vZGVsJztcbmltcG9ydCB7IGlzQXJyYXlTdHJpbmcgfSBmcm9tICcuLi91dGlscy9pcy1hcnJheS1zdHJpbmcnO1xuaW1wb3J0IHsgVmFzRm9ybUR0byB9IGZyb20gJy4vdmFzLWZvcm0uZHRvJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFZhc0pvYk1vZGVsRHluYW1pY0ludGVyZmFjZSB7XG4gIFtzOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZVN5bnRheE9wdGlvbnMge1xuICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCB0byBhZGp1c3QgYW55IGRhdGV0aW1lIHZhbHVlcyB0aGF0IGFyZSByZWZlcmVuY2VkXG4gIC8vIGluIHRoZSBzeW50YXggc3RyaW5nLiBTZWVcbiAgLy8gaHR0cHM6Ly9tb21lbnRqc2NvbS5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvbW9tZW50LzAzLW1hbmlwdWxhdGluZy8wOS11dGMtb2Zmc2V0L1xuICAvLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgYG1vbWVudGAgd2lsbCBoYW5kbGUgdGhlIHZhbHVlLlxuICB0aW1lWm9uZU9mZnNldDogbnVtYmVyLFxuICAvLyB0aGlzIGRpY3Rpb25hcnkgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250YWluIG90aGVyIG9iamVjdHMgdG8gYmUgcmVmZXJlbmNlZFxuICAvLyBpbiB0aGUgc3ludGF4LiBGb3IgZXhhbXBsZSBpZiB3ZSBoYXZlIHtqb2IuZm9vfSB0aGlzIHdpbGwgcmVmZXJlbmNlIHRoZVxuICAvLyBqb2IncyBgZm9vYCBwcm9wZXJ0eSwgaG93ZXZlciBpZiB3ZSBoYXZlIFwicmVwb3J0TGF5b3V0LnRpdGxlXCIgdGhpcyB3aWxsXG4gIC8vIGV4cGVjdCB0byBmaW5kIGEgcHJvcGVydHkgb2YgYG9iamVjdHNgIGNhbGxlZCBgcmVwb3J0TGF5b3V0YCB3aGljaCB3aWxsXG4gIC8vIGhhdmUgYSBwcm9wZXJ0eSBjYWxsZWQgYHRpdGxlYFxuICBvYmplY3RzPzogUmVjb3JkPHN0cmluZywgUGFydGlhbDxWYXNCYXNlRHRvPiB8IFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+Pjtcbn1cblxuLyoqXG4gKiBKb2JNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgVmFzSm9iTW9kZWwgZXh0ZW5kcyBWYXNSZXN0cmljdGVkQWNjb3VudE9iamVjdE1vZGVsIHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgY3JlYXRlZDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJ2ZXJDcmVhdGVkOiBzdHJpbmcsXG4gICAgcHVibGljIG92ZXJyaWRlIGNyZWF0ZWRCeTogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBtb2RpZmllZDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJ2ZXJNb2RpZmllZDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBtb2RpZmllZEJ5OiBzdHJpbmcsXG4gICAgcHVibGljIG92ZXJyaWRlIGNyZWF0ZWRCeU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgbW9kaWZpZWRCeU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgYWNjb3VudDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBhY2Nlc3NHcm91cDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWZlcmVuY2U6IHN0cmluZyxcbiAgICBwdWJsaWMgam9iRGF0ZTogc3RyaW5nLFxuICAgIHB1YmxpYyBqb2JTdGF0dXM6IHN0cmluZyxcbiAgICBwdWJsaWMgam9iVHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyBhc3NpZ25lZUlkOiBzdHJpbmcsXG4gICAgcHVibGljIGZvcm1JZDogc3RyaW5nLFxuICAgIHB1YmxpYyB0aW1lWm9uZU9mZnNldDogbnVtYmVyLFxuICAgIHB1YmxpYyBwZW5kaW5nRmllbGRzOiBudW1iZXIsXG4gICAgcHVibGljIGNoaWxkTW9kaWZpZWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgdmVyc2lvbjogbnVtYmVyLFxuICAgIHB1YmxpYyBmaWVsZHM6IEFycmF5PFZhc0ZpZWxkRHRvPixcbiAgICBwdWJsaWMgZmlsZXM6IEFycmF5PFZhc0ZpbGVEdG8+LFxuICAgIHB1YmxpYyBjcmVhdGVkQnlEaXNwbGF5TmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyBtb2RpZmllZEJ5RGlzcGxheU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgZ2VvTG9jYXRpb246IEdlb0xvY2F0aW9uXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgaWQsXG4gICAgICBjcmVhdGVkLFxuICAgICAgc2VydmVyQ3JlYXRlZCxcbiAgICAgIGNyZWF0ZWRCeSxcbiAgICAgIG1vZGlmaWVkLFxuICAgICAgc2VydmVyTW9kaWZpZWQsXG4gICAgICBtb2RpZmllZEJ5LFxuICAgICAgY3JlYXRlZEJ5TmFtZSxcbiAgICAgIG1vZGlmaWVkQnlOYW1lLFxuICAgICAgYWNjb3VudCxcbiAgICAgIGFjY2Vzc0dyb3VwXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoaXMgd2l0aCB0aGUgZHluYW1pYyBpbnRlcmZhY2VcbiAgICogQHJldHVybiB7VmFzSm9iTW9kZWxEeW5hbWljSW50ZXJmYWNlfVxuICAgKi9cbiAgZ2V0ICR0aGlzKCk6IFZhc0pvYk1vZGVsRHluYW1pY0ludGVyZmFjZSB7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIEpvYiBkeW5hbWljIHByb3BlcnRpZXMgaS5lLiB0aG9zZSB0aGF0IGFyZSBhZGRlZCBieSB0aGVcbiAgICogZHluYW1pYyBmb3Jtc1xuICAgKi9cbiAgZ2V0IGR5bmFtaWNQcm9wZXJ0aWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IG5hdGl2ZVByb3BzID0gdGhpcy5zdGF0aWNQcm9wZXJ0aWVzO1xuICAgIHJldHVybiBPYmplY3RcbiAgICAgIC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpXG4gICAgICAuZmlsdGVyKHByb3AgPT4gIW5hdGl2ZVByb3BzLmluY2x1ZGVzKHByb3ApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgb2YgdGhlIEpvYiB0eXBlXG4gICAqL1xuICBnZXQgc3RhdGljUHJvcGVydGllcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoVmFzSm9iTW9kZWwuZW1wdHkoKSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7VmFzSm9iTW9kZWx9XG4gICAqL1xuICBzdGF0aWMgZW1wdHkoKTogVmFzSm9iTW9kZWwge1xuICAgIHJldHVybiBuZXcgVmFzSm9iTW9kZWwoXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgbW9tZW50KCkudXRjT2Zmc2V0KCksXG4gICAgICAwLFxuICAgICAgJycsXG4gICAgICAwLFxuICAgICAgW10sXG4gICAgICBbXSxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICBnZXRFbXB0eUdlb0xvY2F0aW9uKClcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGZyb21EdG8oZHRvOiBQYXJ0aWFsPFZhc0pvYkR0bz4pOiBWYXNKb2JNb2RlbCB7XG4gICAgY29uc3QgbW9kZWwgPSBuZXcgVmFzSm9iTW9kZWwoXG4gICAgICBkdG8uaWQgfHwgJycsXG4gICAgICBkdG8uY3JlYXRlZCB8fCAnJyxcbiAgICAgIGR0by5zZXJ2ZXJDcmVhdGVkIHx8ICcnLFxuICAgICAgZHRvLmNyZWF0ZWRCeSB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZCB8fCAnJyxcbiAgICAgIGR0by5zZXJ2ZXJNb2RpZmllZCB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZEJ5IHx8ICcnLFxuICAgICAgZHRvLmNyZWF0ZWRCeU5hbWUgfHwgJycsXG4gICAgICBkdG8ubW9kaWZpZWRCeU5hbWUgfHwgJycsXG4gICAgICBkdG8uYWNjb3VudCB8fCAnJyxcbiAgICAgIGR0by5hY2Nlc3NHcm91cCB8fCAnJyxcbiAgICAgIGR0by5yZWZlcmVuY2UgfHwgJycsXG4gICAgICBkdG8uam9iRGF0ZSB8fCAnJyxcbiAgICAgIGR0by5qb2JTdGF0dXMgfHwgJycsXG4gICAgICBkdG8uam9iVHlwZSB8fCAnJyxcbiAgICAgIGR0by5hc3NpZ25lZUlkIHx8ICcnLFxuICAgICAgZHRvLmZvcm1JZCB8fCAnJyxcbiAgICAgIGR0by50aW1lWm9uZU9mZnNldCB8fCBtb21lbnQoKS51dGNPZmZzZXQoKSxcbiAgICAgIGR0by5wZW5kaW5nRmllbGRzIHx8IDAsXG4gICAgICBkdG8uY2hpbGRNb2RpZmllZCB8fCAnJyxcbiAgICAgIGR0by52ZXJzaW9uIHx8IDAsXG4gICAgICBkdG8uZmllbGRzIHx8IFtdLFxuICAgICAgZHRvLmZpbGVzIHx8IFtdLFxuICAgICAgZHRvLmNyZWF0ZWRCeURpc3BsYXlOYW1lIHx8ICcnLFxuICAgICAgZHRvLm1vZGlmaWVkQnlEaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgIGR0by5nZW9Mb2NhdGlvbiB8fCBnZXRFbXB0eUdlb0xvY2F0aW9uKClcbiAgICApO1xuICAgIGNvbnN0IGVtcHR5S2V5cyA9IG1vZGVsLnN0YXRpY1Byb3BlcnRpZXM7XG4gICAgT2JqZWN0XG4gICAgICAua2V5cyhkdG8pXG4gICAgICAuZmlsdGVyKGtleSA9PiBlbXB0eUtleXMuaW5kZXhPZihrZXkpID09PSAtMSlcbiAgICAgIC5mb3JFYWNoKChrZXk6IHN0cmluZykgPT5cbiAgICAgICAgbW9kZWwuJHRoaXNba2V5XSA9IChkdG8gYXMgVmFzSm9iTW9kZWxEeW5hbWljSW50ZXJmYWNlKVtrZXldXG4gICAgICApO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGluc3RhbnRpYXRlIGEgbmV3IEpvYk1vZGVsLiBUaGUgZGlmZmVyZW5jZSB3aXRoIHRoaXNcbiAgICogbWV0aG9kIG9mIGluc3RhbnRpYXRpb24gaXMgdGhhdCB3ZSBhcmUgY29taW5nIGZyb20gYSByZWxhdGlvbiBmcmFtZSBpLmUuXG4gICAqIHRoZSBqb2IgaGFzIGEgbGlzdCBvZiB7QGxpbmsgVmFzRmllbGREdG99IGluc3RlYWQgb2YgYSBKb2IgZG9jdW1lbnQuXG4gICAqXG4gICAqL1xuICBzdGF0aWMgZnJvbVJlbGF0aW9uYWwoXG4gICAgZHRvOiBQYXJ0aWFsPFZhc0pvYkR0bz4sXG4gICAgZm9ybTogVmFzRm9ybUR0b1xuICApOiBWYXNKb2JNb2RlbCB7XG4gICAgY29uc3QgbW9kZWwgPSBuZXcgVmFzSm9iTW9kZWwoXG4gICAgICBkdG8uaWQgfHwgJycsXG4gICAgICBkdG8uY3JlYXRlZCB8fCAnJyxcbiAgICAgIGR0by5zZXJ2ZXJDcmVhdGVkIHx8ICcnLFxuICAgICAgZHRvLmNyZWF0ZWRCeSB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZCB8fCAnJyxcbiAgICAgIGR0by5zZXJ2ZXJNb2RpZmllZCB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZEJ5IHx8ICcnLFxuICAgICAgZHRvLmNyZWF0ZWRCeU5hbWUgfHwgJycsXG4gICAgICBkdG8ubW9kaWZpZWRCeU5hbWUgfHwgJycsXG4gICAgICBkdG8uYWNjb3VudCB8fCAnJyxcbiAgICAgIGR0by5hY2Nlc3NHcm91cCB8fCAnJyxcbiAgICAgIGR0by5yZWZlcmVuY2UgfHwgJycsXG4gICAgICBkdG8uam9iRGF0ZSB8fCAnJyxcbiAgICAgIGR0by5qb2JTdGF0dXMgfHwgJycsXG4gICAgICBkdG8uam9iVHlwZSB8fCAnJyxcbiAgICAgIGR0by5hc3NpZ25lZUlkIHx8ICcnLFxuICAgICAgZHRvLmZvcm1JZCB8fCAnJyxcbiAgICAgIGR0by50aW1lWm9uZU9mZnNldCB8fCBtb21lbnQoKS51dGNPZmZzZXQoKSxcbiAgICAgIGR0by5wZW5kaW5nRmllbGRzIHx8IDAsXG4gICAgICBkdG8uY2hpbGRNb2RpZmllZCB8fCAnJyxcbiAgICAgIGR0by52ZXJzaW9uIHx8IDAsXG4gICAgICBkdG8uZmllbGRzIHx8IFtdLFxuICAgICAgZHRvLmZpbGVzIHx8IFtdLFxuICAgICAgZHRvLmNyZWF0ZWRCeURpc3BsYXlOYW1lIHx8ICcnLFxuICAgICAgZHRvLm1vZGlmaWVkQnlEaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgIGR0by5nZW9Mb2NhdGlvbiB8fCBnZXRFbXB0eUdlb0xvY2F0aW9uKClcbiAgICApO1xuXG4gICAgZm9ybS5ncm91cHNcbiAgICAgIC5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgZ3JvdXAuY29udHJvbHNcbiAgICAgICAgICAuZm9yRWFjaChjb250cm9sID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZHRvLmZpZWxkcz8uZmluZChmID0+IGYuY29udHJvbCA9PT0gY29udHJvbC5pZCk7XG4gICAgICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vZGVsLmdldEdyb3VwKGdyb3VwLm5hbWUpW2NvbnRyb2wubmFtZV0gPSBmaWVsZC52YWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Zhc0Zvcm1Nb2RlbH0gZm9ybU1vZGVsXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+fVxuICAgKi9cbiAgZ2V0RmllbGRzKGZvcm1Nb2RlbDogVmFzRm9ybU1vZGVsKTogUmVjb3JkPHN0cmluZywgVmFzRmllbGREdG9WYWx1ZT4ge1xuICAgIGNvbnN0IGZpZWxkczogeyBba2V5OiBzdHJpbmddOiBWYXNGaWVsZER0b1ZhbHVlIH0gPSB7fTtcbiAgICBmb3JtTW9kZWwuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgIGdyb3VwLmNvbnRyb2xzLmZvckVhY2goY29udHJvbCA9PiB7XG4gICAgICAgICAgKGZpZWxkcylbY29udHJvbC5yZXBvcnRUZW1wbGF0ZU5hbWVdID1cbiAgICAgICAgICAgIHRoaXMuZ2V0VmFsdWVCeVBhdGgoW2dyb3VwLm5hbWUsIGNvbnRyb2wubmFtZV0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIHJldHVybiBmaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogV2lsbCByZXR1cm4gYW4gb2JqZWN0IHdob3NlIGtleXMgYXJlIHRoZSBuYW1lcyBvZiBhbGwgZmllbGRzIGluIHRoZSBqb2IuXG4gICAqIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gYGdldEZpZWxkc2AgZXhjZXB0IHRoYXQgdGhpcyBtZXRob2Qgd2lsbCBvbmx5XG4gICAqIHJldHVybiB2YWx1ZXMgd2hlcmUgYSB2YWx1ZSB3YXMgc2V0LCBhcyBvcHBvc2VkIHRvIGBnZXRGaWVsZHNgIHdoaWNoIHdpbGxcbiAgICogcmV0dXJuIGEgdmFsdWUgZm9yIGV2ZXJ5IGNvbnRyb2wgZXZlbiBpZiBub3QgdmFsdWUgd2FzIHNldCwgYmVjYXVzZSBpdCB1c2VzXG4gICAqIHRoZSBmb3JtIHRvIGRyaXZlIHRoZSBsb2dpYy4gTm90ZSBhbHNvIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHZhbHVlcyBmb3JcbiAgICogYW55IEZpZWxkcyBpbiB0aGUgZmllbGRzIGFycmF5LlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPn1cbiAgICovXG4gIGdldEZpZWxkczIoKTogUmVjb3JkPHN0cmluZywgVmFzRmllbGREdG9WYWx1ZT4ge1xuICAgIGxldCBmaWVsZHM6IHsgW2tleTogc3RyaW5nXTogVmFzRmllbGREdG9WYWx1ZSB9ID0ge307XG4gICAgdGhpcy5keW5hbWljUHJvcGVydGllc1xuICAgICAgLmZvckVhY2goKGdyb3VwTmFtZSkgPT4ge1xuICAgICAgICBPYmplY3RcbiAgICAgICAgICAua2V5cyh0aGlzLiR0aGlzW2dyb3VwTmFtZV0pXG4gICAgICAgICAgLmZvckVhY2goY29udHJvbE5hbWUgPT4ge1xuICAgICAgICAgICAgZmllbGRzW2NvbnRyb2xOYW1lXSA9IHRoaXMuZ2V0VmFsdWVCeVBhdGgoW2dyb3VwTmFtZSwgY29udHJvbE5hbWVdKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0sIHt9KTtcbiAgICB0aGlzLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IGZpZWxkc1tmaWVsZC5jb250cm9sTmFtZV0gPSBmaWVsZC52YWx1ZSk7XG4gICAgcmV0dXJuIGZpZWxkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCBkZXNjcmliaW5nIGhvdyBtYW55IGF0dGFjaG1lbnRzIHdlcmUgYWRkZWQgdG8gdGhpcyBqb2JcbiAgICogKGNhbWVyYSBjb250cm9scyBhbmQgZmlsZXMpLCBhbmQgaG93IG1hbnkgaGF2ZSBub3QgYmVlbiB1cGxvYWRlZCB5ZXQuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JtTW9kZWwgaW5zdGFuY2Ugb2Yge0BsaW5rIFZhc0Zvcm1Nb2RlbH0gdGhhdCB3YXMgdXNlZCB3aGVuIHRoZVxuICAgKiBqb2Igd2FzIGNyZWF0ZWRcbiAgICovXG4gIGdldEZpbGVzVXBsb2FkU3RhdHVzKFxuICAgIGZvcm1Nb2RlbDogVmFzRm9ybU1vZGVsXG4gICk6IHsgcGVuZGluZzogbnVtYmVyOyB0b3RhbDogbnVtYmVyIH0ge1xuXG4gICAgY29uc3QgcGF0aHNXaXRoVmFsdWU6IEFycmF5PEFycmF5PHN0cmluZz4+ID0gZm9ybU1vZGVsXG4gICAgICAuZ2V0Q2FtZXJhQ29udHJvbFBhdGhzKClcbiAgICAgIC5tYXAocGF0aCA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlOiBWYXNGaWxlRHRvIHwgVmFzQ2FtZXJhQ29udHJvbFZhbHVlTW9kZWwgPVxuICAgICAgICAgIHRoaXMuZ2V0VmFsdWVCeVBhdGgocGF0aCkgYXMgYW55O1xuICAgICAgICBpZiAodmFsdWUgJiYgISF2YWx1ZS5pZCkge1xuICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIocGF0aCA9PiBwYXRoICE9PSBudWxsID8gcGF0aCA6IG51bGwpXG4gICAgICAuZmlsdGVyKGlzQXJyYXlTdHJpbmcpO1xuXG4gICAgbGV0IHRvdGFsID0gcGF0aHNXaXRoVmFsdWUubGVuZ3RoO1xuXG4gICAgdG90YWwgKz0gdGhpcy5maWxlcy5sZW5ndGg7XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjYW1lcmEgaW1hZ2VzIHN0aWxsIHRvIHVwbG9hZFxuICAgIGxldCBwZW5kaW5nID0gcGF0aHNXaXRoVmFsdWVcbiAgICAgIC5tYXAocGF0aCA9PiB0aGlzLmdldFZhbHVlQnlQYXRoKHBhdGgpIGFzIGFueSlcbiAgICAgIC5tYXAoKHZhbHVlOiBWYXNGaWxlRHRvIHwgVmFzQ2FtZXJhQ29udHJvbFZhbHVlTW9kZWwpID0+IHtcbiAgICAgICAgaWYgKGlzRmlsZUR0byh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUuaWQgJiYgdmFsdWUuc3RhdHVzICE9PSAnQ09NUExFVEUnO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ2FtZXJhQ29udHJvbFZhbHVlVjEodmFsdWUpKSB7XG4gICAgICAgICAgLy8gaWYgdXJsIGlzIG5vdCBzZXQsIGl0IGhhc24ndCBiZWVuIHVwbG9hZGVkXG4gICAgICAgICAgcmV0dXJuIHZhbHVlLmlkICYmICF2YWx1ZS51cmw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoaGFzVXBsb2FkZWQgPT4gaGFzVXBsb2FkZWQpXG4gICAgICAubGVuZ3RoO1xuXG4gICAgLy8gYWRkIHRvdGFsIGZyb20gZmlsZXMgdGhhdCBhcmUgcGVuZGluZ1xuICAgIHBlbmRpbmcgKz0gdGhpcy5maWxlc1xuICAgICAgLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZS5zdGF0dXMgIT09ICdDT01QTEVURScpXG4gICAgICAubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBlbmRpbmcsXG4gICAgICB0b3RhbFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGR5bmFtaWMgcHJvcGVydHkgZnJvbSB0aGUgSm9iTW9kZWwgdGhhdFxuICAgKiByZXByZXNlbnQgYSBncm91cCAoZnJvbSBhIGZvcm0pLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZ3JvdXBcbiAgICogQHBhcmFtIGluaXQgaWYgdHJ1ZSAoZGVmYXVsdCkgYW5kIGdyb3VwIGlzIG5vdCBmb3VuZCwgaW5pdGlhbGlzZSBhbiBlbXB0eVxuICAgKiBncm91cCwgb3RoZXJ3aXNlIHRocm93IGFuIGVycm9yXG4gICAqL1xuICBnZXRHcm91cChuYW1lOiBzdHJpbmcsIGluaXQgPSB0cnVlKTogUmVjb3JkPHN0cmluZywgVmFzRmllbGREdG9WYWx1ZT4ge1xuICAgIGxldCBwcm9wO1xuICAgIGlmICh0aGlzLnN0YXRpY1Byb3BlcnRpZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgIHRocm93IEVycm9yKGBpbnZhbGlkIGdyb3VwIG5hbWUgJHtuYW1lfSwgbm90IGEgZHluYW1pYyBwcm9wZXJ0eWApO1xuICAgIH0gZWxzZSBpZiAodGhpcy4kdGhpc1tuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoaW5pdCkge1xuICAgICAgICBwcm9wID0gdGhpcy4kdGhpc1tuYW1lXSA9IHt9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYGludmFsaWQgZ3JvdXAgbmFtZSAke25hbWV9LCBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcCA9IHRoaXMuJHRoaXNbbmFtZV07XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IEVycm9yKGBpbnZhbGlkIGdyb3VwIG5hbWUgJHtuYW1lfSwgbm90IGFuIG9iamVjdGApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCBwYXRoIHNlZ21lbnRzXG4gICAqL1xuICBnZXRWYWx1ZUJ5UGF0aDxUIGV4dGVuZHMgVmFzRmllbGREdG9WYWx1ZT4oXG4gICAgcGF0aDogc3RyaW5nW10gPSBbXVxuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVCeVBhdGgocGF0aCwgdGhpcy4kdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSW4gb3JkZXIgdG8gdW5kZXJzdGFuZCB3aHkgd2UgbmVlZCB0aGlzIG1ldGhvZCBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICogdW5kZXJzdGFuZCB0aGF0IHdpdGhpbiB0aGUgc3lzdGVtLCBKb2JzIGNhbiBiZSByZXByZXNlbnRlZCBpbiBvbmUgb2YgdHdvXG4gICAqIHdheXMsIGRvY3VtZW50IGFuZCByZWxhdGlvbmFsLlxuICAgKlxuICAgKiBUaGUgaW1wb3J0YW50IGRpc3RpbmN0aW9uIGlzIGhvdyB2YWx1ZXMgc3VibWl0dGVkIGJ5IGEgZm9ybSBhcmUgc3RvcmVkLlxuICAgKlxuICAgKiBKb2JzIHN0b3JlZCBhcyBkb2N1bWVudHMgKEpTT04gb2JqZWN0cykgd2lsbCBzdG9yZSB1c2VyIHZhbHVlcywgYXMgZHluYW1pY1xuICAgKiBwcm9wZXJ0aWVzIG9mIHRoZSBkb2N1bWVudC5cbiAgICpcbiAgICogV2hlcmVhcywgSm9icyBzdG9yZWQgYXMgcmVsYXRpb25hbCwgd2lsbCBzdG9yZSB1c2VyIHZhbHVlcyBpbiBhbiBhcnJheSBvZlxuICAgKiB7QGxpbmsgVmFzRmllbGREdG99IG9iamVjdHMuXG4gICAqXG4gICAqIERlcGVuZGluZyBvbiB3aGVyZSB3ZSBhcmUgaW4gdGhlIHN5c3RlbSwgZWl0aGVyIG9uZSBvZiB0aGVzZSBhcHByb2FjaGVzIGNhblxuICAgKiBiZSBtb3JlIHVzZWZ1bCB0aGFuIHRoZSBvdGhlci5cbiAgICpcbiAgICogVGhpcyBtZXRob2QsIGFzc3VtZXMgdGhhdCB0aGUgSm9iTW9kZWwgaGFzIGJlZW4gaW5zdGFudGlhdGVkIGZyb20gYVxuICAgKiBkb2N1bWVudCByZXByZXNlbnRhdGlvbiwgYW5kIHNlcnZlcyB0byBoeWRyYXRlIHRoZSBmaWVsZHMgYXJyYXkuIEluIG9yZGVyXG4gICAqIHRvIGFjaGlldmUgdGhpcywga25vd2xlZGdlIG9mIHRoZSB7QGxpbmsgVmFzRm9ybUR0b30gdGhhdCBjcmVhdGVkIHRoZSBqb2JcbiAgICogaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqXG4gICAqIEpvYiBpbiBkb2N1bWVudCByZXByZXNlbnRhdGlvblxuICAgKiB7XG4gICAqICAgaWQ6IDxndWlkPixcbiAgICogICByZWZlcmVuY2U6IFwic29tZXRoaW5nXCJcbiAgICogICA8b3RoZXIgc3RhdGljIGpvYiBwcm9wZXJ0aWVzPi4uLlxuICAgKiAgIGZvbzoge1xuICAgKiAgICAgYmFyOiBcInZhbHVlXCJcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogSm9iIGluIHJlbGF0aW9uYWwgcmVwcmVzZW50YXRpb25cbiAgICoge1xuICAgKiAgIGlkOiA8Z3VpZD4sXG4gICAqICAgcmVmZXJlbmNlOiBcInNvbWV0aGluZ1wiXG4gICAqICAgPG90aGVyIHN0YXRpYyBqb2IgcHJvcGVydGllcz4uLi5cbiAgICogICA8d2lsbCBub3QgaGF2ZSBkeW5hbWljIHByb3BlcnRpZXM+Li4uXG4gICAqICAgZmllbGRzOiBbXG4gICAqICAgICB7XG4gICAqICAgICAgIGlkOiA8Z3VpZD4sXG4gICAqICAgICAgIDxvdGhlciBmaWVsZCBwcm9wZXJ0aWVzPixcbiAgICogICAgICAgdmFsdWU6IFwidmFsdWVcIlxuICAgKiAgICAgfVxuICAgKiAgIF1cbiAgICogfVxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybU1vZGVsIHRoZSBWYXNGb3JtTW9kZWwgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIGpvYlxuICAgKiBAcGFyYW0gY29udHJvbEZpZWxkSWRNYXAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgaWQgZWFjaCBmaWVsZC5cbiAgICogRWl0aGVyIG9uZSB3aWxsIGJlIGZvdW5kIGluIHRoZSBtYXAsIG9yIGEgbmV3IG9uZSBpcyBnZW5lcmF0ZWQuXG4gICAqIEBwYXJhbSBjb250cm9sTmFtZXMgaWYgYSB2YWx1ZSBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkXG4gICAqIHRvIGZpbHRlciB0aGUgZmllbGRzIHRoYXQgYXJlIHJldHVybmVkLlxuICAgKiBAcmV0dXJuIHtBcnJheTxWYXNGaWVsZER0bz59XG4gICAqL1xuICBoeWRyYXRlRmllbGRzKFxuICAgIGZvcm1Nb2RlbDogVmFzRm9ybU1vZGVsLFxuICAgIGNvbnRyb2xGaWVsZElkTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKSxcbiAgICBjb250cm9sTmFtZXM/OiBBcnJheTxzdHJpbmc+XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGZpZWxkczogQXJyYXk8VmFzRmllbGREdG8+ID0gW107XG4gICAgZm9ybU1vZGVsLmdyb3Vwc1xuICAgICAgLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICBncm91cC5jb250cm9scy5mb3JFYWNoKGNvbnRyb2wgPT4ge1xuXG4gICAgICAgICAgaWYgKCFjb250cm9sLm5hbWUuc3RhcnRzV2l0aCgnZmllbGRzLicpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbnRyb2xOYW1lcyAmJiAhY29udHJvbE5hbWVzLmluY2x1ZGVzKGNvbnRyb2wubmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWVsZHMucHVzaChWYXNGaWVsZE1vZGVsLmZyb21EdG8oe1xuICAgICAgICAgICAgLy8gaWYgdGhlIGNvbnRyb2xJZCBleGlzdHMgaW4gdGhlIG1hcCwgdXNlIHRoZSBhc3NvY2lhdGVkIGZpZWxkSWQsXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgZ2VuZXJhdGUgYSBuZXcgaWQgZm9yIHRoZSBmaWVsZC5cbiAgICAgICAgICAgIGlkOiBjb250cm9sRmllbGRJZE1hcC5nZXQoY29udHJvbC5pZCkgfHwgVVVJRC5VVUlEKCksXG4gICAgICAgICAgICBhY2NvdW50OiB0aGlzLmFjY291bnQsXG4gICAgICAgICAgICBqb2I6IHRoaXMuaWQsXG4gICAgICAgICAgICBjcmVhdGVkQnk6IHRoaXMuY3JlYXRlZEJ5LFxuICAgICAgICAgICAgY3JlYXRlZDogdGhpcy5jcmVhdGVkLFxuICAgICAgICAgICAgbW9kaWZpZWRCeTogdGhpcy5tb2RpZmllZEJ5LFxuICAgICAgICAgICAgbW9kaWZpZWQ6IHRoaXMubW9kaWZpZWQsXG4gICAgICAgICAgICBjb250cm9sOiBjb250cm9sLmlkLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0VmFsdWVCeVBhdGgoXG4gICAgICAgICAgICAgIFtncm91cC5uYW1lLCBjb250cm9sLm5hbWVdXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIHRoaXMuZmllbGRzID0gZmllbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgdmVyeSBub24gc29waGlzdGljYXRlZCB3YXkgdG8gc2V0IHZhbHVlcyBpbiB0aGUgam9iIHZpYSBwYXRoc1xuICAgKlxuICAgKiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogc2V0VmFsdWVCeVBhdGgoJ3ZhbHVlJywgWydmb28nLCAnYmFyJ10pO1xuICAgKlxuICAgKiB3aWxsIG1ha2UgcmVzdWx0cyBpbiBqb2JcbiAgICoge1xuICAgKiAgIGZvbzoge1xuICAgKiAgICAgYmFyOiAndmFsdWUnXG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0XG4gICAqIEBwYXJhbSBwYXRoIHBhdGggc2VnbWVudHNcbiAgICovXG4gIHNldFZhbHVlQnlQYXRoKHZhbHVlOiBWYXNGaWVsZER0b1ZhbHVlLCBwYXRoOiBzdHJpbmdbXSA9IFtdKTogdm9pZCB7XG4gICAgc3dpdGNoIChwYXRoLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgMToge1xuICAgICAgICAodGhpcyBhcyBhbnkpW3BhdGhbMF1dID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgMjoge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAodGhpcy4kdGhpc1twYXRoWzBdXSBhcyBSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPilbcGF0aFsxXV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAzOiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICgodGhpcy4kdGhpc1twYXRoWzBdXSBhcyBSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPilbcGF0aFsxXV0gYXMgUmVjb3JkPHN0cmluZywgVmFzRmllbGREdG9WYWx1ZT4pW3BhdGhbMl1dID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ3BhdGggaGFzIHRvbyBtYW55IHNlZ21lbnRzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzdGF0aWNPbmx5IGlmIHRydWUsIHdpbGwgb25seSBvdXRwdXQgdmFsdWVzIGZvciB0aGUgc3RhdGljXG4gICAqIHByb3BlcnRpZXMgaW4gdGhlIGR0b1xuICAgKi9cbiAgcHVibGljIHRvRHRvKHN0YXRpY09ubHkgPSBmYWxzZSk6IFZhc0pvYkR0byB7XG5cbiAgICBpZiAoc3RhdGljT25seSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIGNyZWF0ZWQ6IHRoaXMuY3JlYXRlZCxcbiAgICAgICAgY3JlYXRlZEJ5OiB0aGlzLmNyZWF0ZWRCeSxcbiAgICAgICAgbW9kaWZpZWQ6IHRoaXMubW9kaWZpZWQsXG4gICAgICAgIG1vZGlmaWVkQnk6IHRoaXMubW9kaWZpZWRCeSxcbiAgICAgICAgc2VydmVyQ3JlYXRlZDogdGhpcy5zZXJ2ZXJDcmVhdGVkLFxuICAgICAgICBzZXJ2ZXJNb2RpZmllZDogdGhpcy5zZXJ2ZXJNb2RpZmllZCxcbiAgICAgICAgY3JlYXRlZEJ5TmFtZTogdGhpcy5jcmVhdGVkQnlOYW1lLFxuICAgICAgICBtb2RpZmllZEJ5TmFtZTogdGhpcy5tb2RpZmllZEJ5TmFtZSxcbiAgICAgICAgYWNjb3VudDogdGhpcy5hY2NvdW50LFxuICAgICAgICBhY2Nlc3NHcm91cDogdGhpcy5hY2Nlc3NHcm91cCxcbiAgICAgICAgcmVmZXJlbmNlOiB0aGlzLnJlZmVyZW5jZSxcbiAgICAgICAgam9iRGF0ZTogdGhpcy5qb2JEYXRlLFxuICAgICAgICBqb2JTdGF0dXM6IHRoaXMuam9iU3RhdHVzLFxuICAgICAgICBqb2JUeXBlOiB0aGlzLmpvYlR5cGUsXG4gICAgICAgIGFzc2lnbmVlSWQ6IHRoaXMuYXNzaWduZWVJZCxcbiAgICAgICAgZm9ybUlkOiB0aGlzLmZvcm1JZCxcbiAgICAgICAgdGltZVpvbmVPZmZzZXQ6IHRoaXMudGltZVpvbmVPZmZzZXQsXG4gICAgICAgIHBlbmRpbmdGaWVsZHM6IHRoaXMucGVuZGluZ0ZpZWxkcyxcbiAgICAgICAgY2hpbGRNb2RpZmllZDogdGhpcy5jaGlsZE1vZGlmaWVkLFxuICAgICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICAgIGZpZWxkczogdGhpcy5maWVsZHMsXG4gICAgICAgIGZpbGVzOiB0aGlzLmZpbGVzLFxuICAgICAgICBjcmVhdGVkQnlEaXNwbGF5TmFtZTogdGhpcy5jcmVhdGVkQnlEaXNwbGF5TmFtZSxcbiAgICAgICAgbW9kaWZpZWRCeURpc3BsYXlOYW1lOiB0aGlzLm1vZGlmaWVkQnlEaXNwbGF5TmFtZSxcbiAgICAgICAgZ2VvTG9jYXRpb246IHRoaXMuZ2VvTG9jYXRpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZHRvID0ge30gYXMgVmFzSm9iTW9kZWxEeW5hbWljSW50ZXJmYWNlO1xuICAgIFsuLi50aGlzLnN0YXRpY1Byb3BlcnRpZXMsIC4uLnRoaXMuZHluYW1pY1Byb3BlcnRpZXNdXG4gICAgICAuZm9yRWFjaChwcm9wID0+IGR0b1twcm9wXSA9IHRoaXMuJHRoaXNbcHJvcF0pO1xuXG4gICAgcmV0dXJuIGR0byBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBwYXJzZSBhIHN5bnRheCB0aGF0IGFsbG93cyB1cyB0byBidWlsZCBzdHJpbmdzIGZyb20gdGhlXG4gICAqIHZhbHVlcyBvZiBmcm9tIHRoZSBqb2IgbW9kZWwuIEZvciBleGFtcGxlIGlmIHRoZSBqb2IgbW9kZWwgd2FzOlxuICAgKlxuICAgKiB7XG4gICAqICAgZm9vOiAnYmFyJ1xuICAgKiB9XG4gICAqXG4gICAqIGFuZCB3ZSBwYXNzIFwiaSBhbSBmb28ge2Zvb31cIiwgdGhlIHJlc3VsdCB3b3VsZCBiZTpcbiAgICpcbiAgICogXCJpIGFtIGZvbyBiYXJcIlxuICAgKlxuICAgKiB3ZSBjYW4gYWxzbyB1c2UgbW9tZW50IHRvIHBhcnNlIGRhdGVzLCBmb3IgZXhhbXBsZSBpZiB0aGUgam9iIG1vZGVsIHdhczpcbiAgICpcbiAgICoge1xuICAgKiAgIGNyZWF0ZWQ6IFwiMjAyMi0wMS0wMVQwMDowMDowMCswMDAwXCJcbiAgICogfVxuICAgKlxuICAgKiBhbmQgd2UgcGFzcyBcIntjcmVhdGVkfGRhdGU6WVktTU0tRER9XCIsIHRoZSByZXN1bHQgd291bGQgYmU6XG4gICAqXG4gICAqIFwiMjAyMi0wMS0wMVwiXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBhIHN0cmluZyB3aXRoIHRoZSBzeW50YXhcbiAgICogQHBhcmFtIHtQYXJzZVN5bnRheE9wdGlvbnN9IG9wdGlvbnNcbiAgICogQHJldHVybiB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIHRoZSBzeW50YXggb24gdGhpcyBqb2JcbiAgICovXG4gIHBhcnNlU3ludGF4KFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUGFyc2VTeW50YXhPcHRpb25zID0ge1xuICAgICAgdGltZVpvbmVPZmZzZXQ6IDBcbiAgICB9XG4gICk6IHN0cmluZyB7XG5cbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyh7W159XSp9KS9nLCAobWF0Y2g6IHN0cmluZywgdG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgY29uc3Qgc3ludGF4ID0gdG9rZW4uc3Vic3RyaW5nKDEsIHRva2VuLmxlbmd0aCAtIDEpO1xuXG4gICAgICBsZXQgW2tleSwgZmlsdGVyXSA9IHN5bnRheC5zcGxpdCgnfCcpO1xuICAgICAga2V5ID0gKGtleSB8fCAnJykudHJpbSgpO1xuICAgICAgZmlsdGVyID0gKGZpbHRlciB8fCAnJykudHJpbSgpO1xuXG4gICAgICBsZXQgZmlsdGVyTmFtZSwgZmlsdGVyQXJnOiBzdHJpbmcgPSAnJztcbiAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgY29uc3Qgc3BsaXRJbmRleCA9IGZpbHRlci5pbmRleE9mKCc6Jyk7XG4gICAgICAgIGlmIChzcGxpdEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGZpbHRlck5hbWUgPSBmaWx0ZXIuc3Vic3RyaW5nKDAsIHNwbGl0SW5kZXgpO1xuICAgICAgICAgIGZpbHRlckFyZyA9IGZpbHRlci5zdWJzdHJpbmcoc3BsaXRJbmRleCArIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbHRlck5hbWUgPSBmaWx0ZXI7XG4gICAgICAgICAgZmlsdGVyQXJnID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZmlsdGVyTmFtZSA9IChmaWx0ZXJOYW1lIHx8ICcnKS50cmltKCk7XG4gICAgICAgIGZpbHRlckFyZyA9IChmaWx0ZXJBcmcgfHwgJycpLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGggPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgIGNvbnN0IG9iamVjdEtleSA9IHBhdGguc2hpZnQoKSB8fCAnJztcbiAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgIGlmIChvYmplY3RLZXkgPT09ICdqb2InKSB7XG4gICAgICAgIHJlc3VsdCA9ICh0aGlzLmdldFZhbHVlQnlQYXRoKHBhdGgpIHx8ICcnKS50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmIChvYmplY3RLZXkgPT09ICdmaWVsZHMnKSB7XG4gICAgICAgIHJlc3VsdCA9IChnZXRWYWx1ZUJ5UGF0aChcbiAgICAgICAgICBbJ2ZpZWxkcy4nICsgcGF0aC5zaGlmdCgpLCAuLi5wYXRoXSxcbiAgICAgICAgICB0aGlzLmdldEZpZWxkczIoKVxuICAgICAgICApIHx8ICcnKS50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmIChvYmplY3RLZXkubGVuZ3RoKSB7XG4gICAgICAgIGlmIChvcHRpb25zLm9iamVjdHMpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5vYmplY3RzW29iamVjdEtleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICAgICAgICAgYG9iamVjdEtleSAke29iamVjdEtleX0gaXMgbm90IHByZXNlbnQgaW4gb3B0aW9ucy5vYmplY3RgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzdWx0ID0gJyc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IChnZXRWYWx1ZUJ5UGF0aChwYXRoLCBvcHRpb25zLm9iamVjdHNbb2JqZWN0S2V5XSkgfHwgJycpXG4gICAgICAgICAgICAgIC50b1N0cmluZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgICAgYG9iamVjdEtleSAke29iamVjdEtleX0gd2FzIHVzZWQgYnV0IG9wdGlvbnMub2JqZWN0IGlzIG5vdCBzZXRgXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuXG4gICAgICBpZiAoZmlsdGVyTmFtZSAmJiByZXN1bHQpIHtcbiAgICAgICAgc3dpdGNoIChmaWx0ZXJOYW1lKSB7XG4gICAgICAgICAgY2FzZSAnZGF0ZSc6IHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQocmVzdWx0KVxuICAgICAgICAgICAgICAudXRjT2Zmc2V0KG9wdGlvbnMudGltZVpvbmVPZmZzZXQpXG4gICAgICAgICAgICAgIC5mb3JtYXQoZmlsdGVyQXJnIHx8ICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCd1bmtub3duIGZpbHRlciAlcycsIGZpbHRlck5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLnRyaW0oKTtcbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgb3ZlcnJpZGUgdG9BcGlEdG8oKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci50b0FwaUR0bygpLFxuICAgICAgcmVmZXJlbmNlOiB0aGlzLnJlZmVyZW5jZSB8fCAnficsXG4gICAgICBqb2JEYXRlOiB0aGlzLmpvYkRhdGUgfHwgJ34nLFxuICAgICAgam9iVHlwZTogdGhpcy5qb2JUeXBlIHx8ICd+JyxcbiAgICAgIGFjY2Vzc0dyb3VwOiB0aGlzLmFjY2Vzc0dyb3VwIHx8ICd+JyxcbiAgICAgIGpvYlN0YXR1czogdGhpcy5qb2JTdGF0dXMgfHwgJ34nLFxuICAgICAgYXNzaWduZWVJZDogdGhpcy5hc3NpZ25lZUlkIHx8ICd+JyxcbiAgICAgIHRpbWVab25lT2Zmc2V0OiB0aGlzLnRpbWVab25lT2Zmc2V0IHx8IDAsXG4gICAgICBwZW5kaW5nRmllbGRzOiB0aGlzLnBlbmRpbmdGaWVsZHMgfHwgMCxcbiAgICAgIGxhc3RGb3JtOiB0aGlzLmZvcm1JZCB8fCAnfidcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWxvb2t1cC10eXBlLmR0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Zhcy1saWIvc3JjL2xpYi9lbnRpdHkvdmFzLWxvb2t1cC10eXBlLmR0by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmFzQWNjb3VudE9iamVjdER0byB9IGZyb20gJy4vdmFzLWFjY291bnQtb2JqZWN0LmR0byc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFzTG9va3VwVHlwZUR0byBleHRlbmRzIFZhc0FjY291bnRPYmplY3REdG8ge1xuICB0aXRsZTogc3RyaW5nO1xuICBzZXF1ZW5jZTogbnVtYmVyO1xuICBjYXRlZ29yeUdyb3VwczogQXJyYXk8c3RyaW5nPjtcbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWxvb2t1cC5kdG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YXMtbGliL3NyYy9saWIvZW50aXR5L3Zhcy1sb29rdXAuZHRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWYXNBY2NvdW50T2JqZWN0RHRvIH0gZnJvbSAnLi92YXMtYWNjb3VudC1vYmplY3QuZHRvJztcblxuZXhwb3J0IGludGVyZmFjZSBWYXNMb29rdXBEdG8gZXh0ZW5kcyBWYXNBY2NvdW50T2JqZWN0RHRvIHtcbiAgaWQ6IHN0cmluZztcbiAgY3JlYXRlZDogc3RyaW5nO1xuICBzZXJ2ZXJDcmVhdGVkOiBzdHJpbmc7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICBzZXJ2ZXJNb2RpZmllZDogc3RyaW5nO1xuICBtb2RpZmllZEJ5OiBzdHJpbmc7XG4gIGFjY291bnQ6IHN0cmluZztcbiAgYWNjZXNzR3JvdXA6IHN0cmluZztcbiAgbG9va3VwVHlwZTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHNlcXVlbmNlOiBudW1iZXI7XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLW1lbWJlcnNoaXAuZHRvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFzLWxpYi9zcmMvbGliL2VudGl0eS92YXMtbWVtYmVyc2hpcC5kdG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZhc0FjY291bnRPYmplY3REdG8gfSBmcm9tICcuL3Zhcy1hY2NvdW50LW9iamVjdC5kdG8nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZhc01lbWJlcnNoaXBEdG8gZXh0ZW5kcyBWYXNBY2NvdW50T2JqZWN0RHRvIHtcbiAgdXNlcjogc3RyaW5nO1xuICBhZG1pbjogYm9vbGVhbjtcbiAgbG9va3VwVHlwZXM6IEFycmF5PHN0cmluZz47XG4gIGNvbnRhY3RUeXBlczogQXJyYXk8c3RyaW5nPjtcbiAgYWNjZXNzR3JvdXBzOiBBcnJheTxzdHJpbmc+O1xuICBqb2JTdGF0dXNlczogQXJyYXk8c3RyaW5nPjtcbiAgam9iVHlwZXM6IEFycmF5PHN0cmluZz47XG4gIHRhc2tUeXBlczogQXJyYXk8c3RyaW5nPjtcbn1cbiJdfQ==