@tuki-io/tuki-widgets 0.0.201 → 0.0.202

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 (191) hide show
  1. package/README.md +24 -24
  2. package/esm2020/contact-center/cc-readiness/cc-readiness.module.mjs +1 -1
  3. package/esm2020/contact-center/cc-readiness/cc-readiness.service.mjs +1 -1
  4. package/esm2020/contact-center/cc-readiness/widgets/licences-requirement/licences-requirement.component.mjs +3 -3
  5. package/esm2020/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.mjs +3 -3
  6. package/esm2020/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.mjs +2 -2
  7. package/esm2020/di2mt/widgets/upgrade-overview/cards/pending-activation-users/pending-activation-users.component.mjs +17 -17
  8. package/esm2020/lib/widgets.component.mjs +9 -9
  9. package/esm2020/lib/widgets.module.mjs +1 -1
  10. package/esm2020/lib/widgets.service.mjs +1 -1
  11. package/esm2020/public-api.mjs +1 -1
  12. package/esm2020/user-creation/src/app.constants.mjs +16 -2
  13. package/esm2020/user-creation/src/classes/notification.mjs +32 -0
  14. package/esm2020/user-creation/src/classes/site.mjs +1 -1
  15. package/esm2020/user-creation/src/environments/environment.mjs +11 -0
  16. package/esm2020/user-creation/src/interfaces/user-creation-wizard.interfaces.mjs +199 -0
  17. package/esm2020/user-creation/src/shared/components/notification/notification.component.mjs +38 -0
  18. package/esm2020/user-creation/src/shared/material.module.mjs +35 -7
  19. package/esm2020/user-creation/src/shared/pipes/truncate.pipe.mjs +30 -0
  20. package/esm2020/user-creation/src/shared/services/notification.service.mjs +62 -0
  21. package/esm2020/user-creation/src/shared/services/user-creation-api.service.mjs +43 -19
  22. package/esm2020/user-creation/src/shared/services/utils.mjs +1 -1
  23. package/esm2020/user-creation/src/shared/shared.module.mjs +27 -4
  24. package/esm2020/user-creation/src/user-creation.module.mjs +40 -7
  25. package/esm2020/user-creation/src/utils/app-loader/app-loader.mjs +14 -0
  26. package/esm2020/user-creation/src/utils/build-savable-end-user.mjs +147 -0
  27. package/esm2020/user-creation/src/utils/device-default-prefix.mjs +13 -0
  28. package/esm2020/user-creation/src/utils/device-name-validation.mjs +23 -0
  29. package/esm2020/user-creation/src/utils/model.mjs +19 -0
  30. package/esm2020/user-creation/src/utils/parse-device-name-rule.mjs +26 -0
  31. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.mjs +512 -20
  32. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-overview-step/user-overview-step.component.mjs +3 -3
  33. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.mjs +80 -34
  34. package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.mjs +83 -19
  35. package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.mjs +599 -124
  36. package/esm2020/user-device-manage/public-api.mjs +1 -1
  37. package/esm2020/user-device-manage/src/app.constants.mjs +1 -1
  38. package/esm2020/user-device-manage/src/classes/device.mjs +1 -1
  39. package/esm2020/user-device-manage/src/classes/deviceProfile.mjs +1 -1
  40. package/esm2020/user-device-manage/src/classes/line-association-interface.mjs +1 -1
  41. package/esm2020/user-device-manage/src/classes/line-association.mjs +1 -1
  42. package/esm2020/user-device-manage/src/classes/line-call-info-display.mjs +1 -1
  43. package/esm2020/user-device-manage/src/classes/line-directory.mjs +1 -1
  44. package/esm2020/user-device-manage/src/classes/line.mjs +1 -1
  45. package/esm2020/user-device-manage/src/classes/notification.mjs +1 -1
  46. package/esm2020/user-device-manage/src/classes/recording-options.mjs +1 -1
  47. package/esm2020/user-device-manage/src/classes/simplified-user.mjs +1 -1
  48. package/esm2020/user-device-manage/src/classes/site-defaults.mjs +1 -1
  49. package/esm2020/user-device-manage/src/classes/translation-pattern.mjs +1 -1
  50. package/esm2020/user-device-manage/src/classes/types.mjs +1 -1
  51. package/esm2020/user-device-manage/src/common-functions.mjs +1 -1
  52. package/esm2020/user-device-manage/src/confirm-dialog/info-dialog.component.mjs +3 -3
  53. package/esm2020/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.mjs +3 -3
  54. package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.mjs +3 -3
  55. package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.mjs +3 -3
  56. package/esm2020/user-device-manage/src/device-associated-line/device-associated-line.component.mjs +1 -1
  57. package/esm2020/user-device-manage/src/device-info/device-info.component.mjs +3 -3
  58. package/esm2020/user-device-manage/src/device-manage-widget.component.mjs +2 -2
  59. package/esm2020/user-device-manage/src/environments/environment.mjs +1 -1
  60. package/esm2020/user-device-manage/src/interseptors/auth.interceptor.mjs +1 -1
  61. package/esm2020/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
  62. package/esm2020/user-device-manage/src/material.module.mjs +1 -1
  63. package/esm2020/user-device-manage/src/notifications/notification.component.mjs +3 -3
  64. package/esm2020/user-device-manage/src/pipes/mac-address.pipe.mjs +1 -1
  65. package/esm2020/user-device-manage/src/services/api.service.mjs +1 -1
  66. package/esm2020/user-device-manage/src/services/device.service.mjs +1 -1
  67. package/esm2020/user-device-manage/src/services/dns.service.mjs +1 -1
  68. package/esm2020/user-device-manage/src/services/line.service.mjs +1 -1
  69. package/esm2020/user-device-manage/src/services/notification.service.mjs +1 -1
  70. package/esm2020/user-device-manage/src/services/removeKynFromIBM.service.mjs +1 -1
  71. package/esm2020/user-device-manage/src/services/site-settings.service.mjs +1 -1
  72. package/esm2020/user-device-manage/src/services/sorting-utils.service.mjs +1 -1
  73. package/esm2020/user-device-manage/src/services/user.service.mjs +1 -1
  74. package/esm2020/user-device-manage/src/services/utils.service.mjs +1 -1
  75. package/esm2020/user-device-manage/src/services/validation.service.mjs +1 -1
  76. package/esm2020/user-device-manage/src/shared/tk-page-section/page-section.component.mjs +1 -1
  77. package/esm2020/user-device-manage/src/utils/app-loader/app-loader.mjs +3 -3
  78. package/esm2020/user-manage/public-api.mjs +1 -1
  79. package/esm2020/user-manage/src/app.constants.mjs +1 -1
  80. package/esm2020/user-manage/src/classes/device.mjs +1 -1
  81. package/esm2020/user-manage/src/classes/line-association-interface.mjs +1 -1
  82. package/esm2020/user-manage/src/classes/line-association.mjs +1 -1
  83. package/esm2020/user-manage/src/classes/line-call-info-display.mjs +1 -1
  84. package/esm2020/user-manage/src/classes/line-directory.mjs +1 -1
  85. package/esm2020/user-manage/src/classes/line.mjs +1 -1
  86. package/esm2020/user-manage/src/classes/notification.mjs +1 -1
  87. package/esm2020/user-manage/src/classes/pagination.mjs +1 -1
  88. package/esm2020/user-manage/src/classes/recording-options.mjs +1 -1
  89. package/esm2020/user-manage/src/classes/simplified-user.mjs +1 -1
  90. package/esm2020/user-manage/src/classes/table-data.mjs +1 -1
  91. package/esm2020/user-manage/src/classes/translation-pattern.mjs +1 -1
  92. package/esm2020/user-manage/src/classes/user-list.mjs +1 -1
  93. package/esm2020/user-manage/src/common-functions.mjs +1 -1
  94. package/esm2020/user-manage/src/device-list/device-list.component.mjs +3 -3
  95. package/esm2020/user-manage/src/device-list/device-row/device-row.component.mjs +3 -3
  96. package/esm2020/user-manage/src/environments/environment.mjs +1 -1
  97. package/esm2020/user-manage/src/interseptors/auth.interceptor.mjs +1 -1
  98. package/esm2020/user-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
  99. package/esm2020/user-manage/src/material.module.mjs +1 -1
  100. package/esm2020/user-manage/src/notifications/notification.component.mjs +3 -3
  101. package/esm2020/user-manage/src/removeKynFromIBM.service.mjs +1 -1
  102. package/esm2020/user-manage/src/services/api.service.mjs +1 -1
  103. package/esm2020/user-manage/src/services/dns.service.mjs +1 -1
  104. package/esm2020/user-manage/src/services/line.service.mjs +1 -1
  105. package/esm2020/user-manage/src/services/notification.service.mjs +1 -1
  106. package/esm2020/user-manage/src/services/removeKynFromIBM.service.mjs +1 -1
  107. package/esm2020/user-manage/src/services/site-settings.service.mjs +1 -1
  108. package/esm2020/user-manage/src/services/sorting-utils.service.mjs +1 -1
  109. package/esm2020/user-manage/src/services/user.service.mjs +1 -1
  110. package/esm2020/user-manage/src/services/utils.service.mjs +1 -1
  111. package/esm2020/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.mjs +3 -3
  112. package/esm2020/user-manage/src/user-info/user-info.component.mjs +3 -3
  113. package/esm2020/user-manage/src/user-manage-widget.component.mjs +2 -2
  114. package/esm2020/user-manage/src/user-manage.module.mjs +1 -1
  115. package/esm2020/user-manage/src/utils/app-loader/app-loader.mjs +3 -3
  116. package/esm2020/user-manage/src/utils/pagination/pagination.component.mjs +3 -3
  117. package/esm2020/users-list/public-api.mjs +1 -1
  118. package/esm2020/users-list/src/app.constants.mjs +1 -1
  119. package/esm2020/users-list/src/classes/app-location.mjs +1 -1
  120. package/esm2020/users-list/src/classes/device.mjs +1 -1
  121. package/esm2020/users-list/src/classes/line.mjs +1 -1
  122. package/esm2020/users-list/src/classes/move-user.mjs +1 -1
  123. package/esm2020/users-list/src/classes/notification.mjs +1 -1
  124. package/esm2020/users-list/src/classes/simlified-user.mjs +1 -1
  125. package/esm2020/users-list/src/classes/table-data.mjs +1 -1
  126. package/esm2020/users-list/src/classes/user-list.mjs +1 -1
  127. package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user/device-move-user-wizard.component.mjs +3 -3
  128. package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user-tab/devices-move-user-wizard-tab.component.mjs +3 -3
  129. package/esm2020/users-list/src/move-user-wizard/move-user-wizard.component.mjs +3 -3
  130. package/esm2020/users-list/src/services/api-webex.service.mjs +1 -1
  131. package/esm2020/users-list/src/services/api.service.mjs +1 -1
  132. package/esm2020/users-list/src/services/dns.service.mjs +1 -1
  133. package/esm2020/users-list/src/services/events-communication.service.mjs +1 -1
  134. package/esm2020/users-list/src/services/notification.service.mjs +1 -1
  135. package/esm2020/users-list/src/services/removeKynFromIBM.service.mjs +1 -1
  136. package/esm2020/users-list/src/services/site-settings.service.mjs +1 -1
  137. package/esm2020/users-list/src/services/user.service.mjs +1 -1
  138. package/esm2020/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.mjs +3 -3
  139. package/esm2020/users-list/src/utils/app-loader/app-loader.mjs +3 -3
  140. package/esm2020/users-list/src/utils/common-functions.mjs +1 -1
  141. package/esm2020/users-list/src/utils/utils.service.mjs +1 -1
  142. package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs +2 -2
  143. package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
  144. package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +20 -20
  145. package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
  146. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +2129 -325
  147. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  148. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs +18 -18
  149. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
  150. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs +18 -18
  151. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
  152. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +10 -10
  153. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
  154. package/fesm2015/tuki-io-tuki-widgets.mjs +8 -8
  155. package/fesm2015/tuki-io-tuki-widgets.mjs.map +1 -1
  156. package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs +2 -2
  157. package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
  158. package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +20 -20
  159. package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
  160. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +2084 -314
  161. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  162. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs +18 -18
  163. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
  164. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs +18 -18
  165. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
  166. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +10 -10
  167. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
  168. package/fesm2020/tuki-io-tuki-widgets.mjs +8 -8
  169. package/fesm2020/tuki-io-tuki-widgets.mjs.map +1 -1
  170. package/package.json +1 -1
  171. package/user-creation/src/app.constants.d.ts +10 -0
  172. package/user-creation/src/classes/notification.d.ts +18 -0
  173. package/user-creation/src/environments/environment.d.ts +9 -0
  174. package/user-creation/src/interfaces/user-creation-wizard.interfaces.d.ts +554 -0
  175. package/user-creation/src/shared/components/notification/notification.component.d.ts +19 -0
  176. package/user-creation/src/shared/material.module.d.ts +5 -1
  177. package/user-creation/src/shared/pipes/truncate.pipe.d.ts +7 -0
  178. package/user-creation/src/shared/services/notification.service.d.ts +18 -0
  179. package/user-creation/src/shared/services/user-creation-api.service.d.ts +8 -2
  180. package/user-creation/src/shared/shared.module.d.ts +3 -1
  181. package/user-creation/src/user-creation.module.d.ts +17 -10
  182. package/user-creation/src/utils/app-loader/app-loader.d.ts +6 -0
  183. package/user-creation/src/utils/build-savable-end-user.d.ts +23 -0
  184. package/user-creation/src/utils/device-default-prefix.d.ts +5 -0
  185. package/user-creation/src/utils/device-name-validation.d.ts +6 -0
  186. package/user-creation/src/utils/model.d.ts +1 -0
  187. package/user-creation/src/utils/parse-device-name-rule.d.ts +8 -0
  188. package/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.d.ts +83 -7
  189. package/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.d.ts +11 -4
  190. package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.d.ts +18 -0
  191. package/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.d.ts +71 -56
@@ -1,11 +1,38 @@
1
1
  import { inject, Injectable } from "@angular/core";
2
2
  import { UserCreationApiService } from "../../shared/services/user-creation-api.service";
3
+ import { catchError, forkJoin, map, of, Subject, switchMap, tap } from "rxjs";
4
+ import Big from "big.js";
5
+ import { SiteDefaults } from "../../classes/site";
6
+ import { Site } from "../../classes/site";
7
+ import { DnRangeType, EndUser, } from "../../interfaces/user-creation-wizard.interfaces";
8
+ import { buildSavableEndUser } from "../../utils/build-savable-end-user";
9
+ import { applyDefaultDevicePrefixIfMissing } from "../../utils/device-default-prefix";
10
+ import { parseDeviceNameRegexBody } from "../../utils/parse-device-name-rule";
3
11
  import * as i0 from "@angular/core";
4
12
  export class UserCreationWizardService {
13
+ get currentSite() {
14
+ return this._currentSite;
15
+ }
16
+ get firstLineRoutePartition() {
17
+ return this.lines[0]?.directoryNumber?.routePartitionName ?? '';
18
+ }
19
+ get siteDefaultRoutePartition() {
20
+ return this.siteDefaults?.routePartition || '';
21
+ }
22
+ get routePartitionNamesList() {
23
+ return this.siteDefaults ? this.siteDefaults.routePartitionFilter : [];
24
+ }
5
25
  constructor() {
6
- this.api = inject(UserCreationApiService);
26
+ this.userCreationApiService = inject(UserCreationApiService);
7
27
  this.ldapTableColumns = ['userId', 'firstName', 'lastName', 'email', 'add'];
8
28
  this.userCreationTypes = ['CUCM', 'MT'];
29
+ this.template = null;
30
+ this.endUser = null;
31
+ this.lines = [];
32
+ this.devices = [];
33
+ this.deviceProfiles = [];
34
+ this.templateLinesSnapshot = null;
35
+ this._currentSite = null;
9
36
  this.siteOptions = [];
10
37
  this.templateOptions = [];
11
38
  this.lineOptions = [];
@@ -15,40 +42,89 @@ export class UserCreationWizardService {
15
42
  this.overviewUsers = [];
16
43
  this.overviewLines = [];
17
44
  this.overviewDevices = [];
45
+ this.overviewDeviceProfiles = [];
46
+ this.userDetailsFormValue = null;
18
47
  this.userDetailsForm = {
19
48
  userId: '',
20
49
  firstName: '',
21
50
  lastName: '',
22
- email: ''
51
+ email: '',
23
52
  };
24
53
  this.lineSelections = [];
25
54
  this.deviceEntries = [];
55
+ this.availableNumbers = [];
56
+ this.deviceTypes = [];
57
+ this.siteDefaults = null;
58
+ this.originalSiteDefaults = null;
59
+ this.templateLines = [];
60
+ this.templateDevices = [];
61
+ this.templateUserDetails = {};
26
62
  this.selectedSite = null;
27
- this.selectedTemplate = null;
63
+ this.selectedTemplateName = null;
64
+ this.selectedTemplateId = null;
28
65
  this.selectedUserCreationType = 'CUCM';
29
- this.addedLdapUserIds = new Set();
30
- this.loadPlaceholderData();
66
+ this.availableDidPatternsMappedToDn = {};
67
+ this.deviceDefaultsLoadedSubject = new Subject();
68
+ this.deviceDefaultsLoaded$ = this.deviceDefaultsLoadedSubject.asObservable();
69
+ this.selectedLdapUser = null;
70
+ this.ldapUsersTotal = 0;
71
+ // this.loadPlaceholderData();
72
+ }
73
+ get isLdapIntegrated() {
74
+ return !!this.endUser?.ldapIntegrated;
75
+ }
76
+ selectLdapUser(user) {
77
+ this.selectedLdapUser = user;
78
+ if (this.endUser) {
79
+ this.endUser.ldapIntegrated = true;
80
+ this.endUser.userid = user.userid;
81
+ this.endUser.firstName = user.firstName ?? '';
82
+ this.endUser.lastName = user.lastName ?? '';
83
+ this.endUser.email = user.email ?? '';
84
+ }
85
+ this.userDetailsForm = {
86
+ userId: user.userid,
87
+ firstName: user.firstName ?? '',
88
+ lastName: user.lastName ?? '',
89
+ email: user.email ?? '',
90
+ };
91
+ this.rebuildOverviewUsers();
31
92
  }
32
- addLdapUser(row) {
93
+ clearLdapUserSelection() {
94
+ this.selectedLdapUser = null;
95
+ if (this.endUser) {
96
+ this.endUser.ldapIntegrated = false;
97
+ this.endUser.userid = '';
98
+ this.endUser.firstName = '';
99
+ this.endUser.lastName = '';
100
+ this.endUser.email = '';
101
+ }
33
102
  this.userDetailsForm = {
34
- userId: row.userId,
35
- firstName: row.firstName,
36
- lastName: row.lastName,
37
- email: row.email
103
+ userId: '',
104
+ firstName: '',
105
+ lastName: '',
106
+ email: '',
38
107
  };
39
- this.addedLdapUserIds.add(row.userId);
40
108
  this.rebuildOverviewUsers();
41
109
  }
42
- isLdapUserAdded(row) {
43
- return this.addedLdapUserIds.has(row.userId);
110
+ isLdapUserRowSelected(row) {
111
+ return this.selectedLdapUser?.userid === row.userid;
112
+ }
113
+ setLdapUsersResult(users, total) {
114
+ this.ldapUsers = users;
115
+ this.ldapUsersTotal = total;
44
116
  }
45
117
  setSelectedSite(site) {
46
- this.selectedSite = site;
118
+ this.selectedSite = site || null;
47
119
  }
48
120
  setSelectedTemplate(template) {
49
- this.selectedTemplate = template;
121
+ this.selectedTemplateName = template?.name || null;
122
+ this.selectedTemplateId = template?.id || null;
50
123
  this.rebuildOverviewUsers();
51
124
  }
125
+ setCurrentSite(site) {
126
+ this._currentSite = site;
127
+ }
52
128
  resetTemplateDrivenData() {
53
129
  this.lineOptions = [];
54
130
  this.routePartitionOptions = [];
@@ -59,69 +135,124 @@ export class UserCreationWizardService {
59
135
  this.rebuildOverviewDevices();
60
136
  }
61
137
  applyTemplateTokenPayload(payload) {
62
- const template = this.extractTemplateFromTokenPayload(payload);
63
- const endUser = template?.endUser || {};
64
- const linesFromTemplate = Array.isArray(endUser.lines) ? endUser.lines : [];
65
- const devicesFromTemplate = Array.isArray(endUser.devices) ? endUser.devices : [];
138
+ this.template = this.extractTemplateFromTokenPayload(payload);
139
+ this.endUser = new EndUser(this.template?.endUser);
140
+ this.lines = this.endUser && Array.isArray(this.endUser.lines) ? this.endUser.lines : [];
141
+ this.devices = this.endUser && Array.isArray(this.endUser.devices) ? this.endUser.devices : [];
142
+ this.deviceProfiles = this.endUser && Array.isArray(this.endUser.deviceProfiles) ? this.endUser.deviceProfiles : [];
143
+ this.initTemplateDnsNamesForLines();
144
+ // this.userDetailsForm = {
145
+ // userId: this.valueToString(this.endUser?.userid ?? ''),
146
+ // firstName: this.valueToString(this.endUser?.firstName ?? ''),
147
+ // lastName: this.valueToString(this.endUser?.lastName ?? ''),
148
+ // email: this.valueToString(this.endUser?.email ?? '')
149
+ // };
150
+ // const mappedLineOptions: LineOption[] = linesFromTemplate
151
+ // .map(line => ({
152
+ // number: this.valueToString(line?.directoryNumber?.directoryNumber),
153
+ // did: this.valueToString(line?.didPatterns?.[0]?.pattern || line?.directoryNumber?.directoryNumber),
154
+ // css: this.valueToString(
155
+ // typeof line?.callingSearchSpace === 'string'
156
+ // ? line.callingSearchSpace
157
+ // : line?.callingSearchSpace?.name
158
+ // ),
159
+ // description: this.valueToString(line?.description)
160
+ // }))
161
+ // .filter(line => line.number.trim().length > 0);
162
+ this.devices.forEach(device => {
163
+ this.initDeviceWithSiteInfo(device);
164
+ applyDefaultDevicePrefixIfMissing(device);
165
+ });
166
+ this.deviceProfiles.forEach(device => this.initDeviceWithSiteInfo(device));
167
+ this.lines.forEach(line => this.initLineWithSiteInfo(line));
168
+ this.captureTemplateLinesSnapshot();
169
+ if (this.selectedSite) {
170
+ this.loadDeviceDefaultsForDevices(this.selectedSite).subscribe();
171
+ }
172
+ // if (mappedLineOptions.length) {
173
+ // this.lineOptions = this.uniqueByNumber(mappedLineOptions);
174
+ // this.lineSelections = this.lineOptions.map(line => ({
175
+ // lineNumber: line.number,
176
+ // routePartitionName: linesFromTemplate.find(
177
+ // source => (source?.directoryNumber?.directoryNumber || '') === line.number
178
+ // )?.directoryNumber?.routePartitionName || null
179
+ // }));
180
+ // } else {
181
+ // const lineAssociations = devicesFromTemplate.flatMap(device => device.lineAssociations || []);
182
+ // const associatedLineOptions: LineOption[] = lineAssociations
183
+ // .map(association => {
184
+ // const number = association?.directoryNumber?.directoryNumber || '';
185
+ // return {
186
+ // number,
187
+ // did: number,
188
+ // css: '',
189
+ // description: ''
190
+ // };
191
+ // })
192
+ // .filter(line => line.number.trim().length > 0);
193
+ // this.lineOptions = this.uniqueByNumber(associatedLineOptions);
194
+ // this.lineSelections = this.lineOptions.map(line => ({
195
+ // lineNumber: line.number,
196
+ // routePartitionName: lineAssociations.find(
197
+ // source => (source?.directoryNumber?.directoryNumber || '') === line.number
198
+ // )?.directoryNumber?.routePartitionName || null
199
+ // }));
200
+ // this.templateLines.forEach((line: any) => this.initLineWithSiteInfo(line));
201
+ // this.initTemplateDnsNamesForLines(this.templateLines);
202
+ // }
203
+ // const routePartitions = this.lineSelections
204
+ // .map(line => line.routePartitionName)
205
+ // .filter((value): value is string => !!value && value.trim().length > 0);
206
+ // this.routePartitionOptions = this.uniqueStrings(routePartitions);
207
+ // this.deviceEntries = devicesFromTemplate.map(device => ({
208
+ // deviceType: this.valueToString(device.deviceType),
209
+ // protocol: this.valueToString(device.protocol),
210
+ // buttonTemplate: this.valueToString(device.buttonTemplate),
211
+ // name: this.valueToString(device.name)
212
+ // }));
213
+ // this.deviceRows = this.deviceEntries.map((_, index) => index + 1);
214
+ // this.rebuildOverviewUsers();
215
+ // this.rebuildOverviewLines();
216
+ // this.rebuildOverviewDevices();
217
+ }
218
+ setSelectedUserCreationType(type) {
219
+ this.selectedUserCreationType = type;
220
+ }
221
+ resetUserDetailsStepState() {
222
+ this.userDetailsFormValue = null;
66
223
  this.userDetailsForm = {
67
- userId: this.valueToString(endUser.userid),
68
- firstName: this.valueToString(endUser.firstName),
69
- lastName: this.valueToString(endUser.lastName),
70
- email: this.valueToString(endUser.email)
224
+ userId: '',
225
+ firstName: '',
226
+ lastName: '',
227
+ email: '',
71
228
  };
72
- const mappedLineOptions = linesFromTemplate
73
- .map(line => ({
74
- number: this.valueToString(line?.directoryNumber?.directoryNumber),
75
- did: this.valueToString(line?.didPatterns?.[0]?.pattern || line?.directoryNumber?.directoryNumber),
76
- css: this.valueToString(typeof line?.callingSearchSpace === 'string'
77
- ? line.callingSearchSpace
78
- : line?.callingSearchSpace?.name),
79
- description: this.valueToString(line?.description)
80
- }))
81
- .filter(line => line.number.trim().length > 0);
82
- if (mappedLineOptions.length) {
83
- this.lineOptions = this.uniqueByNumber(mappedLineOptions);
84
- this.lineSelections = this.lineOptions.map(line => ({
85
- lineNumber: line.number,
86
- routePartitionName: linesFromTemplate.find(source => (source?.directoryNumber?.directoryNumber || '') === line.number)?.directoryNumber?.routePartitionName || null
87
- }));
229
+ this.selectedLdapUser = null;
230
+ this.ldapUsers = [];
231
+ this.ldapUsersTotal = 0;
232
+ if (this.templateLinesSnapshot) {
233
+ this.lines = JSON.parse(JSON.stringify(this.templateLinesSnapshot));
88
234
  }
89
- else {
90
- const lineAssociations = devicesFromTemplate.flatMap(device => device.lineAssociations || []);
91
- const associatedLineOptions = lineAssociations
92
- .map(association => {
93
- const number = association?.directoryNumber?.directoryNumber || '';
94
- return {
95
- number,
96
- did: number,
97
- css: '',
98
- description: ''
99
- };
100
- })
101
- .filter(line => line.number.trim().length > 0);
102
- this.lineOptions = this.uniqueByNumber(associatedLineOptions);
103
- this.lineSelections = this.lineOptions.map(line => ({
104
- lineNumber: line.number,
105
- routePartitionName: lineAssociations.find(source => (source?.directoryNumber?.directoryNumber || '') === line.number)?.directoryNumber?.routePartitionName || null
106
- }));
235
+ this.devices.forEach(device => {
236
+ device.name = '';
237
+ });
238
+ this.deviceProfiles.forEach(profile => {
239
+ profile.name = '';
240
+ });
241
+ if (this.endUser) {
242
+ this.endUser.userid = '';
243
+ this.endUser.firstName = '';
244
+ this.endUser.lastName = '';
245
+ this.endUser.email = '';
246
+ this.endUser.ldapIntegrated = false;
247
+ this.endUser.lines = this.lines;
107
248
  }
108
- const routePartitions = this.lineSelections
109
- .map(line => line.routePartitionName)
110
- .filter((value) => !!value && value.trim().length > 0);
111
- this.routePartitionOptions = this.uniqueStrings(routePartitions);
112
- this.deviceEntries = devicesFromTemplate.map(device => ({
113
- deviceType: this.valueToString(device.deviceType),
114
- protocol: this.valueToString(device.protocol),
115
- buttonTemplate: this.valueToString(device.buttonTemplate),
116
- name: this.valueToString(device.name)
117
- }));
118
- this.deviceRows = this.deviceEntries.map((_, index) => index + 1);
119
- this.rebuildOverviewUsers();
249
+ this.overviewUsers = [];
120
250
  this.rebuildOverviewLines();
121
251
  this.rebuildOverviewDevices();
252
+ this.rebuildOverviewDeviceProfiles();
122
253
  }
123
- setSelectedUserCreationType(type) {
124
- this.selectedUserCreationType = type;
254
+ captureTemplateLinesSnapshot() {
255
+ this.templateLinesSnapshot = JSON.parse(JSON.stringify(this.lines));
125
256
  }
126
257
  setUserDetailsField(field, value) {
127
258
  this.userDetailsForm = {
@@ -130,6 +261,47 @@ export class UserCreationWizardService {
130
261
  };
131
262
  this.rebuildOverviewUsers();
132
263
  }
264
+ applyUserDetailsFormValue(formValue) {
265
+ this.userDetailsFormValue = formValue;
266
+ this.userDetailsForm = {
267
+ userId: formValue.userId || '',
268
+ firstName: formValue.firstName || '',
269
+ lastName: formValue.lastName || '',
270
+ email: formValue.email || '',
271
+ };
272
+ formValue.lines?.forEach((lineValue, index) => {
273
+ const line = this.lines[index];
274
+ if (!line?.directoryNumber) {
275
+ return;
276
+ }
277
+ line.directoryNumber.directoryNumber = lineValue.number || '';
278
+ line.directoryNumber.routePartitionName = lineValue.routePartition || '';
279
+ });
280
+ formValue.devices?.forEach((deviceValue, index) => {
281
+ const device = this.devices[index];
282
+ if (!device) {
283
+ return;
284
+ }
285
+ device.name = deviceValue.name || '';
286
+ });
287
+ formValue.deviceProfiles?.forEach((profileValue, index) => {
288
+ const profile = this.deviceProfiles[index];
289
+ if (!profile) {
290
+ return;
291
+ }
292
+ profile.name = profileValue.name || '';
293
+ });
294
+ if (this.endUser) {
295
+ this.endUser.userid = formValue.userId || '';
296
+ this.endUser.firstName = formValue.firstName || '';
297
+ this.endUser.lastName = formValue.lastName || '';
298
+ this.endUser.email = formValue.email || '';
299
+ }
300
+ this.rebuildOverviewUsers();
301
+ this.rebuildOverviewLines();
302
+ this.rebuildOverviewDevices();
303
+ this.rebuildOverviewDeviceProfiles();
304
+ }
133
305
  setLineSelection(index, lineNumber) {
134
306
  if (!this.lineSelections[index]) {
135
307
  return;
@@ -179,63 +351,83 @@ export class UserCreationWizardService {
179
351
  }
180
352
  return entry.name || '';
181
353
  }
182
- // Placeholder bootstrap until backend APIs are connected.
183
- loadPlaceholderData() {
184
- this.siteOptions = ['Site 1', 'Site 2', 'Site 3'];
185
- this.templateOptions = ['8851 + CSF'];
186
- this.lineOptions = [
187
- {
188
- number: '557046',
189
- did: '+13125557046',
190
- css: 'Atlanta_internal_css',
191
- description: ''
192
- },
193
- {
194
- number: '557047',
195
- did: '+13125557047',
196
- css: 'Atlanta_internal_css',
197
- description: ''
198
- },
199
- {
200
- number: '557048',
201
- did: '+13125557048',
202
- css: 'Atlanta_internal_css',
203
- description: ''
354
+ getSiteAllData(siteId) {
355
+ return this.userCreationApiService.getSiteAllData(siteId).pipe(tap((res) => {
356
+ if (res && res[0]) {
357
+ const site = new Site(res[0]);
358
+ this.selectedSite = site.id;
204
359
  }
205
- ];
206
- this.routePartitionOptions = ['Atlanta_internal_PT', 'Beijing_national_PT'];
207
- this.deviceRows = [1, 2];
208
- this.ldapUsers = [
209
- { userId: 'John.Doe', firstName: 'John', lastName: 'Doe', email: 'john.doe@car.west.io' },
210
- { userId: 'Jane.Smith', firstName: 'Jane', lastName: 'Smith', email: 'jane.smith@car.west.io' }
211
- ];
212
- this.lineSelections = [
213
- {
214
- lineNumber: null,
215
- routePartitionName: this.routePartitionOptions[0] || null
360
+ if (res && res[1]) {
361
+ this.siteDefaults = new SiteDefaults(res[1], false);
362
+ this.originalSiteDefaults = new SiteDefaults(res[1], false);
363
+ this.routePartitionOptions = [...this.routePartitionNamesList];
216
364
  }
217
- ];
218
- this.deviceEntries = [
219
- {
220
- deviceType: 'Cisco 8851',
221
- protocol: 'SIP',
222
- buttonTemplate: 'Standard 8851 SIP',
223
- name: ''
224
- },
225
- {
226
- deviceType: 'Cisco Unified Client Services Framework',
227
- protocol: 'SIP',
228
- buttonTemplate: 'Standard Client Services Framework',
229
- name: ''
365
+ if (res && res[2]) {
366
+ this.deviceTypes = res[2];
230
367
  }
231
- ];
232
- this.selectedTemplate = this.selectedTemplate ?? null;
233
- this.rebuildOverviewUsers();
234
- this.rebuildOverviewLines();
235
- this.rebuildOverviewDevices();
368
+ }), switchMap(res => this.loadDeviceDefaultsForDevices(siteId).pipe(map(() => res))));
369
+ }
370
+ loadDeviceDefaultsForDevices(siteId) {
371
+ const deviceTypes = this.getUniqueDeviceTypes();
372
+ if (!deviceTypes.length) {
373
+ return of(undefined);
374
+ }
375
+ const requests = deviceTypes.map(deviceType => this.userCreationApiService.getDeviceDefaults(String(siteId), deviceType).pipe(tap(defaults => this.applyDeviceDefaultsToType(deviceType, defaults)), catchError(() => of(null))));
376
+ return forkJoin(requests).pipe(tap(() => this.deviceDefaultsLoadedSubject.next()), map(() => undefined));
377
+ }
378
+ getUniqueDeviceTypes() {
379
+ const types = [
380
+ ...this.devices.map(device => device.deviceType),
381
+ ...this.deviceProfiles.map(profile => profile.deviceType),
382
+ ].filter((type) => !!type && type.trim().length > 0);
383
+ return [...new Set(types)];
384
+ }
385
+ applyDeviceDefaultsToType(deviceType, defaults) {
386
+ const nameValidationRegex = parseDeviceNameRegexBody(defaults.deviceNameRegex);
387
+ const targets = [...this.devices, ...this.deviceProfiles].filter(device => device.deviceType === deviceType);
388
+ targets.forEach(device => {
389
+ device.deviceDefaults = defaults;
390
+ device.nameValidationRegex = nameValidationRegex;
391
+ device.nameValidationCaption = defaults.deviceNameExplained;
392
+ });
393
+ }
394
+ getDeviceNamePrefix(deviceIndex, isProfile = false) {
395
+ const device = isProfile ? this.deviceProfiles[deviceIndex] : this.devices[deviceIndex];
396
+ const prefix = device?.prefix?.trim();
397
+ return prefix || null;
398
+ }
399
+ getDeviceNameValidationCaption(deviceIndex, isProfile = false) {
400
+ const device = isProfile ? this.deviceProfiles[deviceIndex] : this.devices[deviceIndex];
401
+ return device?.nameValidationCaption || device?.deviceDefaults?.deviceNameExplained || '';
402
+ }
403
+ getDeviceNameValidationOptions(deviceIndex, isProfile = false) {
404
+ const device = isProfile ? this.deviceProfiles[deviceIndex] : this.devices[deviceIndex];
405
+ const regex = device?.nameValidationRegex?.trim() ||
406
+ parseDeviceNameRegexBody(device?.deviceDefaults?.deviceNameRegex);
407
+ if (!regex) {
408
+ return null;
409
+ }
410
+ return {
411
+ regex,
412
+ caption: this.getDeviceNameValidationCaption(deviceIndex, isProfile),
413
+ };
414
+ }
415
+ getNumberRange(siteId, routePartition) {
416
+ this.availableDidPatternsMappedToDn = {};
417
+ const pageSize = 9999;
418
+ const params = { dntype: DnRangeType.extension, routepartition: routePartition, size: pageSize, page: 0 };
419
+ this.availableNumbers = [];
420
+ return this.userCreationApiService.getAvailableDnInRanges(siteId, params)
421
+ .pipe(map((res) => {
422
+ res.availableNumberList.forEach((availableNumber) => {
423
+ this.setAvailableDidMappedToDn(availableNumber);
424
+ this.availableNumbers = [...this.availableNumbers, ...this.getUnwrapNumberRange(availableNumber)];
425
+ });
426
+ }));
427
+ // .pipe(this.handleError(true, false));
236
428
  }
237
429
  rebuildOverviewUsers() {
238
- const userTemplate = this.selectedTemplate || '';
430
+ const userTemplate = this.selectedTemplateName || '';
239
431
  const hasUserData = Object.values(this.userDetailsForm).some(value => value.trim().length > 0);
240
432
  this.overviewUsers = hasUserData
241
433
  ? [{
@@ -248,6 +440,23 @@ export class UserCreationWizardService {
248
440
  : [];
249
441
  }
250
442
  rebuildOverviewLines() {
443
+ const formLines = this.userDetailsFormValue?.lines;
444
+ if (formLines?.length) {
445
+ this.overviewLines = formLines
446
+ .filter(line => !!line?.number?.trim())
447
+ .map((lineValue, index) => {
448
+ const templateLine = this.lines[index];
449
+ const css = this.valueToString(templateLine?.callingSearchSpace);
450
+ return {
451
+ number: lineValue.number,
452
+ did: lineValue.lineNumber || lineValue.number,
453
+ routePartitionName: lineValue.routePartition || '',
454
+ css,
455
+ description: this.valueToString(templateLine?.description),
456
+ };
457
+ });
458
+ return;
459
+ }
251
460
  this.overviewLines = this.lineSelections
252
461
  .map(selection => {
253
462
  if (!selection?.lineNumber) {
@@ -269,6 +478,18 @@ export class UserCreationWizardService {
269
478
  }
270
479
  rebuildOverviewDevices() {
271
480
  const selectedLineNumbers = this.overviewLines.map(line => line.number).join(', ');
481
+ const formDevices = this.userDetailsFormValue?.devices;
482
+ if (formDevices?.length) {
483
+ this.overviewDevices = formDevices
484
+ .filter(device => !!device.deviceType?.trim() || !!device.name?.trim())
485
+ .map(device => ({
486
+ name: device.name || '',
487
+ deviceType: device.deviceType || '',
488
+ lines: selectedLineNumbers,
489
+ description: `${device.protocol || ''} / ${device.buttonTemplate || ''}`.trim(),
490
+ }));
491
+ return;
492
+ }
272
493
  this.overviewDevices = this.deviceEntries
273
494
  .map((device, index) => ({
274
495
  device,
@@ -282,6 +503,22 @@ export class UserCreationWizardService {
282
503
  description: `${device.protocol} / ${device.buttonTemplate}`
283
504
  }));
284
505
  }
506
+ rebuildOverviewDeviceProfiles() {
507
+ const selectedLineNumbers = this.overviewLines.map(line => line.number).join(', ');
508
+ const formProfiles = this.userDetailsFormValue?.deviceProfiles;
509
+ if (!formProfiles?.length) {
510
+ this.overviewDeviceProfiles = [];
511
+ return;
512
+ }
513
+ this.overviewDeviceProfiles = formProfiles
514
+ .filter(profile => !!profile.deviceType?.trim() || !!profile.name?.trim())
515
+ .map(profile => ({
516
+ name: profile.name || '',
517
+ deviceType: profile.deviceType || '',
518
+ lines: selectedLineNumbers,
519
+ description: `${profile.protocol || ''} / ${profile.buttonTemplate || ''}`.trim(),
520
+ }));
521
+ }
285
522
  extractTemplateFromTokenPayload(payload) {
286
523
  if (!payload || typeof payload !== 'object') {
287
524
  return null;
@@ -308,14 +545,252 @@ export class UserCreationWizardService {
308
545
  valueToString(value) {
309
546
  return typeof value === 'string' ? value : '';
310
547
  }
548
+ getUnwrapNumberRange(availableNumber) {
549
+ let unwrapNumberRange = this.unwrapNumberRange(availableNumber.phoneNumberRange.from, availableNumber.phoneNumberRange.to)
550
+ .map((unwrappedNumber) => {
551
+ const dn = availableNumber.phoneNumberRange.prefix + unwrappedNumber;
552
+ let str = dn;
553
+ if (this.availableDidPatternsMappedToDn[dn] && this.availableDidPatternsMappedToDn[dn].length > 0) {
554
+ if (this.availableDidPatternsMappedToDn[dn][0]['mappedDids'] && this.availableDidPatternsMappedToDn[dn][0]['mappedDids'].length > 0) {
555
+ str += ' DID: ' + (this.availableDidPatternsMappedToDn[dn][0]['mappedDids'].length > 1 ? 'multiple' :
556
+ this.availableDidPatternsMappedToDn[dn][0]['mappedDids'][0]);
557
+ }
558
+ if (this.availableDidPatternsMappedToDn[dn][0]['vm']) {
559
+ str += ' In Use - VM';
560
+ }
561
+ }
562
+ return str;
563
+ });
564
+ unwrapNumberRange = unwrapNumberRange.filter((unwrappedNumber) => !availableNumber.usedNumbers.includes(unwrappedNumber));
565
+ return unwrapNumberRange;
566
+ }
567
+ unwrapNumberRange(start, end) {
568
+ const regExp = /(^0+)/;
569
+ let leadingZeros = '';
570
+ const matches = start.match(regExp);
571
+ if (matches) {
572
+ leadingZeros = matches[1];
573
+ }
574
+ const startNumeric = new Big(start);
575
+ const endNumeric = new Big(end);
576
+ return Array.from({ length: Number(endNumeric.minus(startNumeric).plus(new Big(1)).toFixed(0)) }, (v, k) => {
577
+ const number = String(startNumeric.plus(new Big(k.toString())).toFixed(0));
578
+ if ((leadingZeros + number).length > start.length) {
579
+ leadingZeros = leadingZeros.substr(1);
580
+ }
581
+ return leadingZeros + number;
582
+ });
583
+ }
584
+ setAvailableDidMappedToDn(availableNumber) {
585
+ if (availableNumber.unUsedNumbersWithDids && availableNumber.unUsedNumbersWithDids.length) {
586
+ availableNumber.unUsedNumbersWithDids.forEach((numberWithDids) => {
587
+ const dn = numberWithDids['unUsedNumber'];
588
+ this.availableDidPatternsMappedToDn[dn] = [{}];
589
+ if (numberWithDids['translationPatternList'] && numberWithDids['translationPatternList'].length > 0) {
590
+ this.availableDidPatternsMappedToDn[dn] = numberWithDids['translationPatternList'];
591
+ this.availableDidPatternsMappedToDn[dn][0]['mappedDids'] = [{}];
592
+ if (numberWithDids['mappedDids'] && numberWithDids['mappedDids'].length > 0) {
593
+ this.availableDidPatternsMappedToDn[dn][0]['mappedDids'] = numberWithDids['mappedDids'];
594
+ }
595
+ }
596
+ this.availableDidPatternsMappedToDn[dn][0]['vm'] = numberWithDids['vm'];
597
+ });
598
+ }
599
+ }
311
600
  // TODO: replace placeholders with real API integration.
312
601
  loadDataFromApi() {
313
602
  // this.api.getWizardBootstrapData().subscribe(...)
314
603
  }
604
+ initLineWithSiteInfo(line) {
605
+ line.directoryNumber.routePartitionName = this.siteDefaults?.routePartition || '';
606
+ let callingSearchSpaceVal = this.siteDefaults?.lineCss || '';
607
+ line.callingSearchSpace = callingSearchSpaceVal;
608
+ }
609
+ // private initTemplateDnsNamesForLines(userLines: TemplateLineLike[]): void {
610
+ // const routePartition = this.siteDefaults?.routePartition || '';
611
+ // if (userLines && userLines.length > 0) {
612
+ // userLines.forEach((line, index) => {
613
+ // line && line.directoryNumber && (line.directoryNumber.templateDirectoryNumber = line.directoryNumber.directoryNumber);
614
+ // line && line.directoryNumber && (line.directoryNumber.directoryNumber = '');
615
+ // return line;
616
+ // });
617
+ // // const routePartition = this.siteDefaults?.routePartition || '';
618
+ // // if (line.lineAssociations && line.lineAssociations.length) {
619
+ // // this.setLineAssociationsForDevice(line, routePartition);
620
+ // // }
621
+ // }
622
+ // this.templateDevices.forEach(device => {
623
+ // if (device.lineAssociations && device.lineAssociations.length) {
624
+ // this.setLineAssociationsForDevice(device, routePartition);
625
+ // }
626
+ // });
627
+ // }
628
+ setLineAssociationsForDevice(device, routePartition) {
629
+ const lineAssociations = device.lineAssociations || [];
630
+ if (lineAssociations && lineAssociations.length) {
631
+ lineAssociations.forEach(lineAssociation => {
632
+ lineAssociation && lineAssociation.directoryNumber && (lineAssociation.directoryNumber.templateDirectoryNumber = lineAssociation.directoryNumber.directoryNumber || '');
633
+ lineAssociation && lineAssociation.directoryNumber && (lineAssociation.directoryNumber.routePartitionName = routePartition);
634
+ lineAssociation && lineAssociation.logMissedCall && (lineAssociation.logMissedCall = lineAssociation.logMissedCall || 'false');
635
+ });
636
+ }
637
+ }
638
+ initDeviceWithSiteInfo(device) {
639
+ device.newName = device.name;
640
+ device.name = '';
641
+ if (!device['enabledExtensionMobility']) {
642
+ device.enabledExtensionMobility = this.siteDefaults?.enableEm ?? false;
643
+ }
644
+ else if (device['enabledExtensionMobility'].toString() === 'Yes') {
645
+ device.enabledExtensionMobility = true;
646
+ }
647
+ else if (device['enabledExtensionMobility'].toString() === 'No') {
648
+ device.enabledExtensionMobility = false;
649
+ }
650
+ if (device.location) {
651
+ const replacedValue = this.replaceDynamicValueSiteInfo(device.location, this.currentSite?.shortName ?? '') ?? null;
652
+ device.location = replacedValue;
653
+ }
654
+ if (device.location) {
655
+ const replacedValue = this.replaceDynamicValueSiteInfo(device.devicePoolName, this.currentSite?.shortName ?? '') ?? null;
656
+ device.devicePoolName = replacedValue;
657
+ }
658
+ if (device.location) {
659
+ const replacedValue = this.replaceDynamicValueSiteInfo(device.callingSearchSpaceName, this.currentSite?.shortName ?? '') ?? null;
660
+ device.callingSearchSpaceName = replacedValue;
661
+ }
662
+ if (device.extraOptions) {
663
+ const replacedValue = this.replaceDynamicValueSiteInfo(device.extraOptions.aarCss, this.currentSite?.shortName ?? '') ?? null;
664
+ device.extraOptions.aarCss = replacedValue;
665
+ }
666
+ if (!device.description && this.siteDefaults) {
667
+ device.description = this.siteDefaults.deviceDescription;
668
+ }
669
+ }
670
+ replaceDynamicValueSiteInfo(fieldValue, siteShortName) {
671
+ if (fieldValue) {
672
+ fieldValue = this.replaceDynamicValueFormat(fieldValue);
673
+ const paramsToReplaces = { 'SiteShortName': siteShortName };
674
+ return this.mutliStringReplace(paramsToReplaces, fieldValue);
675
+ }
676
+ return null;
677
+ }
678
+ replaceDynamicValueFormat(str) {
679
+ str = str.replace(/\[FN\]/ig, '[FN]').replace(/\[LN\]/ig, '[LN]').replace(/\[ID\]/ig, '[UserId]')
680
+ .replace(/\[UserId\]/ig, '[UserId]').replace(/<Match User ID>/ig, '[UserId]')
681
+ .replace(/\[Email\]/ig, '[Email]').replace(/\[DN\(/ig, '[DN(')
682
+ .replace(/\[SiteShortName\]/ig, '[SiteShortName]').replace(/\$\(SiteShortName\)/ig, '[SiteShortName]')
683
+ .replace(/\$\{SiteShortName\}/ig, '[SiteShortName]').replace(/{SiteShortName}/ig, '[SiteShortName]')
684
+ .replace(/\[FN\(/ig, '[FN(').replace(/\[LN\(/ig, '[LN(')
685
+ .replace(/\[ID\(/ig, '[ID(');
686
+ return str;
687
+ }
688
+ mutliStringReplace(object, input, directoryNumber, user) {
689
+ var val = input;
690
+ if (val.includes('[DN]') && directoryNumber && !directoryNumber.includes('Line')) {
691
+ val = val.replace('[DN]', directoryNumber);
692
+ }
693
+ var indexOfDN = val.indexOf('[DN(');
694
+ if (indexOfDN !== -1 && directoryNumber) {
695
+ var digit = val.substring(indexOfDN + 4, val.indexOf(')', indexOfDN + 4));
696
+ var digitCount = Number(digit) || 0;
697
+ var dnDigit = (digitCount > val.length) ? directoryNumber : directoryNumber.substring(directoryNumber.length - digitCount, directoryNumber.length);
698
+ val = val.replace('[DN(' + digit + ')]', dnDigit);
699
+ }
700
+ var indexOfFN = val.indexOf('[FN(');
701
+ if (indexOfFN !== -1 && user && user.firstName) {
702
+ var digit = val.substring(indexOfFN + 4, val.indexOf(')', indexOfFN + 4));
703
+ var fnDigit = user.firstName.substring(0, digit);
704
+ val = val.replace('[FN(' + digit + ')]', fnDigit);
705
+ }
706
+ var indexOfLN = val.indexOf('[LN(');
707
+ if (indexOfLN !== -1 && user && user.lastName) {
708
+ var digit = val.substring(indexOfLN + 4, val.indexOf(')', indexOfLN + 4));
709
+ var lnDigit = user.lastName.substring(0, digit);
710
+ val = val.replace('[LN(' + digit + ')]', lnDigit);
711
+ }
712
+ var indexOfID = val.indexOf('[ID(');
713
+ if (indexOfID !== -1 && user && user.userid) {
714
+ var digit = val.substring(indexOfID + 4, val.indexOf(')', indexOfID + 4));
715
+ var idDigit = user.userid.substring(0, digit);
716
+ val = val.replace('[ID(' + digit + ')]', idDigit);
717
+ }
718
+ var entries = Object.entries(object);
719
+ entries.forEach((para) => {
720
+ var find = '[' + para[0] + ']';
721
+ var replacement = para[1] != null ? String(para[1]) : '';
722
+ val = val.split(find).join(replacement);
723
+ });
724
+ return val;
725
+ }
726
+ initTemplateDnsNamesForLines() {
727
+ if (this.lines && this.lines.length > 0) {
728
+ this.lines.forEach((line, index) => {
729
+ line.directoryNumber.templateDirectoryNumber = line.directoryNumber.directoryNumber;
730
+ line.directoryNumber.directoryNumber = '';
731
+ return line;
732
+ });
733
+ const routePartition = this.siteDefaults?.routePartition || '';
734
+ this.devices.forEach(device => {
735
+ if (device.lineAssociations && device.lineAssociations.length) {
736
+ this.setLineAssociationsForDevice(device, routePartition);
737
+ }
738
+ });
739
+ this.deviceProfiles.forEach(deviceProfile => {
740
+ if (deviceProfile.lineAssociations && deviceProfile.lineAssociations.length) {
741
+ this.setLineAssociationsForDevice(deviceProfile, routePartition);
742
+ }
743
+ });
744
+ if (this.endUser?.singleNumberReach && this.endUser.singleNumberReach.associatedLines && this.endUser.singleNumberReach.associatedLines.length) {
745
+ if (this.endUser.singleNumberReach.associatedLines && this.endUser.singleNumberReach.associatedLines.length) {
746
+ this.endUser.singleNumberReach.associatedLines.map(lineAssociation => {
747
+ lineAssociation.directoryNumber.templateDirectoryNumber = lineAssociation.directoryNumber.directoryNumber;
748
+ lineAssociation.directoryNumber.routePartitionName = routePartition;
749
+ });
750
+ }
751
+ if (this.endUser.singleNumberReach.remoteDestinations && this.endUser.singleNumberReach.remoteDestinations.length) {
752
+ this.endUser.singleNumberReach.remoteDestinations.forEach(remoteDestination => {
753
+ if (remoteDestination.lineAssociations && remoteDestination.lineAssociations.length) {
754
+ remoteDestination.lineAssociations.map(lineAssociation => {
755
+ lineAssociation.directoryNumber.templateDirectoryNumber = lineAssociation.directoryNumber.directoryNumber;
756
+ lineAssociation.directoryNumber.routePartitionName = routePartition;
757
+ });
758
+ }
759
+ });
760
+ }
761
+ }
762
+ }
763
+ }
764
+ buildSavableEndUser() {
765
+ if (!this.endUser) {
766
+ throw new Error('No template user loaded');
767
+ }
768
+ return buildSavableEndUser(this.endUser, this.lines, this.devices, this.deviceProfiles, this.userDetailsForm, {
769
+ resolveDeviceName: (index, device) => this.resolveDeviceNameForSave(index, device),
770
+ resolveDeviceProfileName: (index, profile) => this.resolveDeviceNameForSave(index, profile),
771
+ });
772
+ }
773
+ resolveDeviceNameForSave(_index, device) {
774
+ const rawName = (device.name || device.newName || '').trim();
775
+ if (!rawName) {
776
+ return '';
777
+ }
778
+ const prefix = device.prefix?.trim();
779
+ if (prefix && !rawName.toUpperCase().startsWith(prefix.toUpperCase())) {
780
+ return `${prefix}${rawName}`;
781
+ }
782
+ return rawName;
783
+ }
784
+ saveNewUser() {
785
+ const user = this.buildSavableEndUser();
786
+ const siteId = String(this.selectedSite ?? '');
787
+ const templateId = String(this.selectedTemplateId ?? '');
788
+ return this.userCreationApiService.saveTemplateUser(user, templateId, siteId);
789
+ }
315
790
  }
316
791
  UserCreationWizardService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserCreationWizardService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
317
792
  UserCreationWizardService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserCreationWizardService });
318
793
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserCreationWizardService, decorators: [{
319
794
  type: Injectable
320
795
  }], ctorParameters: function () { return []; } });
321
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jcmVhdGlvbi13aXphcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy91c2VyLWNyZWF0aW9uL3NyYy93aWRnZXRzL3VzZXItY3JlYXRpb24td2l6YXJkL3VzZXItY3JlYXRpb24td2l6YXJkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7O0FBeUZ6RixNQUFNLE9BQU8seUJBQXlCO0lBOEJsQztRQTdCaUIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTdDLHFCQUFnQixHQUFhLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pGLHNCQUFpQixHQUF1QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVoRSxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUMzQixvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUMvQixnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0IsMEJBQXFCLEdBQWEsRUFBRSxDQUFDO1FBQ3JDLGVBQVUsR0FBYSxFQUFFLENBQUM7UUFDMUIsY0FBUyxHQUFrQixFQUFFLENBQUM7UUFDOUIsa0JBQWEsR0FBc0IsRUFBRSxDQUFDO1FBQ3RDLGtCQUFhLEdBQXNCLEVBQUUsQ0FBQztRQUN0QyxvQkFBZSxHQUF3QixFQUFFLENBQUM7UUFDMUMsb0JBQWUsR0FBb0I7WUFDL0IsTUFBTSxFQUFFLEVBQUU7WUFDVixTQUFTLEVBQUUsRUFBRTtZQUNiLFFBQVEsRUFBRSxFQUFFO1lBQ1osS0FBSyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBQ0YsbUJBQWMsR0FBc0IsRUFBRSxDQUFDO1FBQ3ZDLGtCQUFhLEdBQWtCLEVBQUUsQ0FBQztRQUVsQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMscUJBQWdCLEdBQWtCLElBQUksQ0FBQztRQUN2Qyw2QkFBd0IsR0FBcUIsTUFBTSxDQUFDO1FBRW5DLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFHbEQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFnQjtRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ25CLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNsQixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7WUFDeEIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1lBQ3RCLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztTQUNuQixDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELGVBQWUsQ0FBQyxHQUFnQjtRQUM1QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxlQUFlLENBQUMsSUFBbUI7UUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUVELG1CQUFtQixDQUFDLFFBQXVCO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELHVCQUF1QjtRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxPQUFZO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvRCxNQUFNLE9BQU8sR0FBd0IsUUFBUSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDN0QsTUFBTSxpQkFBaUIsR0FBdUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRyxNQUFNLG1CQUFtQixHQUF5QixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRXhHLElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUMxQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQ2hELFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDOUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztTQUMzQyxDQUFDO1FBRUYsTUFBTSxpQkFBaUIsR0FBaUIsaUJBQWlCO2FBQ3BELEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDVixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQztZQUNsRSxHQUFHLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJLElBQUksRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO1lBQ2xHLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUNuQixPQUFPLElBQUksRUFBRSxrQkFBa0IsS0FBSyxRQUFRO2dCQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQjtnQkFDekIsQ0FBQyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQ3ZDO1lBQ0QsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQztTQUNyRCxDQUFDLENBQUM7YUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVuRCxJQUFJLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtZQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEQsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUN2QixrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQ3RDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLGVBQWUsSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUM3RSxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsSUFBSSxJQUFJO2FBQ2pELENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTTtZQUNILE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlGLE1BQU0scUJBQXFCLEdBQWlCLGdCQUFnQjtpQkFDdkQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUNmLE1BQU0sTUFBTSxHQUFHLFdBQVcsRUFBRSxlQUFlLEVBQUUsZUFBZSxJQUFJLEVBQUUsQ0FBQztnQkFDbkUsT0FBTztvQkFDSCxNQUFNO29CQUNOLEdBQUcsRUFBRSxNQUFNO29CQUNYLEdBQUcsRUFBRSxFQUFFO29CQUNQLFdBQVcsRUFBRSxFQUFFO2lCQUNsQixDQUFDO1lBQ04sQ0FBQyxDQUFDO2lCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRW5ELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRCxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ3ZCLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FDckMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsZUFBZSxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQzdFLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixJQUFJLElBQUk7YUFDakQsQ0FBQyxDQUFDLENBQUM7U0FDUDtRQUVELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjO2FBQ3RDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzthQUNwQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDakQsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUM3QyxjQUFjLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQ3pELElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDeEMsQ0FBQyxDQUFDLENBQUM7UUFDSixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxJQUFzQjtRQUM5QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUE0QixFQUFFLEtBQWE7UUFDM0QsSUFBSSxDQUFDLGVBQWUsR0FBRztZQUNuQixHQUFHLElBQUksQ0FBQyxlQUFlO1lBQ3ZCLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSztTQUNqQixDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWEsRUFBRSxVQUF5QjtRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ3pCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDN0IsVUFBVTtTQUNiLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsMEJBQTBCLENBQUMsS0FBYSxFQUFFLGtCQUFpQztRQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ3pCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDN0Isa0JBQWtCO1NBQ3JCLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWEsRUFBRSxJQUFZO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzVCLE9BQU87U0FDVjtRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUM5RCxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUM5QyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDWCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ3hCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDNUIsSUFBSSxFQUFFLGNBQWM7U0FDdkIsQ0FBQztRQUNGLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFhO1FBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sT0FBTyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUM7WUFDdEQsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUN0RDtRQUVELE9BQU8sS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxtQkFBbUI7UUFDZixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNmO2dCQUNJLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixHQUFHLEVBQUUsY0FBYztnQkFDbkIsR0FBRyxFQUFFLHNCQUFzQjtnQkFDM0IsV0FBVyxFQUFFLEVBQUU7YUFDbEI7WUFDRDtnQkFDSSxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsR0FBRyxFQUFFLGNBQWM7Z0JBQ25CLEdBQUcsRUFBRSxzQkFBc0I7Z0JBQzNCLFdBQVcsRUFBRSxFQUFFO2FBQ2xCO1lBQ0Q7Z0JBQ0ksTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEdBQUcsRUFBRSxjQUFjO2dCQUNuQixHQUFHLEVBQUUsc0JBQXNCO2dCQUMzQixXQUFXLEVBQUUsRUFBRTthQUNsQjtTQUNKLENBQUM7UUFDRixJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRztZQUNiLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFO1lBQ3pGLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixFQUFFO1NBQ2xHLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxHQUFHO1lBQ2xCO2dCQUNJLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixrQkFBa0IsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSTthQUM1RDtTQUNKLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxHQUFHO1lBQ2pCO2dCQUNJLFVBQVUsRUFBRSxZQUFZO2dCQUN4QixRQUFRLEVBQUUsS0FBSztnQkFDZixjQUFjLEVBQUUsbUJBQW1CO2dCQUNuQyxJQUFJLEVBQUUsRUFBRTthQUNYO1lBQ0Q7Z0JBQ0ksVUFBVSxFQUFFLHlDQUF5QztnQkFDckQsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsY0FBYyxFQUFFLG9DQUFvQztnQkFDcEQsSUFBSSxFQUFFLEVBQUU7YUFDWDtTQUNKLENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQztRQUN0RCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7UUFDakQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVc7WUFDNUIsQ0FBQyxDQUFDLENBQUM7b0JBQ0MsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTTtvQkFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUztvQkFDekMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUTtvQkFDdkMsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztvQkFDakMsWUFBWTtpQkFDZixDQUFDO1lBQ0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNiLENBQUM7SUFFTyxvQkFBb0I7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYzthQUNuQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDYixJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRTtnQkFDeEIsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekYsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDZixPQUFPLElBQUksQ0FBQzthQUNmO1lBQ0QsT0FBTztnQkFDSCxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07Z0JBQzNCLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDckIsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUN2RixHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUc7Z0JBQ3JCLFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVzthQUN4QyxDQUFDO1FBQ04sQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUEyQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTyxzQkFBc0I7UUFDMUIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYTthQUNwQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JCLE1BQU07WUFDTixXQUFXLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQztTQUNoRCxDQUFDLENBQUM7YUFDRixNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQ3pHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLElBQUksRUFBRSxXQUFXO1lBQ2pCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixLQUFLLEVBQUUsbUJBQW1CO1lBQzFCLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLE1BQU0sTUFBTSxDQUFDLGNBQWMsRUFBRTtTQUMvRCxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFTywrQkFBK0IsQ0FBQyxPQUFZO1FBQ2hELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO1lBQ3pDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO1NBQzdCO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0MsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFtQjtRQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQy9CLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN2QixPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGFBQWEsQ0FBQyxLQUFlO1FBQ2pDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBYztRQUNoQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVELHdEQUF3RDtJQUN4RCxlQUFlO1FBQ1gsbURBQW1EO0lBQ3ZELENBQUM7O3VIQS9WUSx5QkFBeUI7MkhBQXpCLHlCQUF5Qjs0RkFBekIseUJBQXlCO2tCQURyQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVXNlckNyZWF0aW9uQXBpU2VydmljZSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvc2VydmljZXMvdXNlci1jcmVhdGlvbi1hcGkuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMZGFwVXNlclJvdyB7XHJcbiAgICB1c2VySWQ6IHN0cmluZztcclxuICAgIGZpcnN0TmFtZTogc3RyaW5nO1xyXG4gICAgbGFzdE5hbWU6IHN0cmluZztcclxuICAgIGVtYWlsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcnZpZXdVc2VyUm93IGV4dGVuZHMgTGRhcFVzZXJSb3cge1xyXG4gICAgdXNlclRlbXBsYXRlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgT3ZlcnZpZXdMaW5lUm93IHtcclxuICAgIG51bWJlcjogc3RyaW5nO1xyXG4gICAgZGlkOiBzdHJpbmc7XHJcbiAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IHN0cmluZztcclxuICAgIGNzczogc3RyaW5nO1xyXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPdmVydmlld0RldmljZVJvdyB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBkZXZpY2VUeXBlOiBzdHJpbmc7XHJcbiAgICBsaW5lczogc3RyaW5nO1xyXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgVXNlckNyZWF0aW9uVHlwZSA9ICdDVUNNJyB8ICdNVCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJEZXRhaWxzRm9ybSB7XHJcbiAgICB1c2VySWQ6IHN0cmluZztcclxuICAgIGZpcnN0TmFtZTogc3RyaW5nO1xyXG4gICAgbGFzdE5hbWU6IHN0cmluZztcclxuICAgIGVtYWlsOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGluZU9wdGlvbiB7XHJcbiAgICBudW1iZXI6IHN0cmluZztcclxuICAgIGRpZDogc3RyaW5nO1xyXG4gICAgY3NzOiBzdHJpbmc7XHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGVkTGluZVJvdyB7XHJcbiAgICBsaW5lTnVtYmVyOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcm91dGVQYXJ0aXRpb25OYW1lOiBzdHJpbmcgfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERldmljZUVudHJ5IHtcclxuICAgIGRldmljZVR5cGU6IHN0cmluZztcclxuICAgIHByb3RvY29sOiBzdHJpbmc7XHJcbiAgICBidXR0b25UZW1wbGF0ZTogc3RyaW5nO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgVGVtcGxhdGVMaW5lTGlrZSB7XHJcbiAgICBkaXJlY3RvcnlOdW1iZXI/OiB7XHJcbiAgICAgICAgZGlyZWN0b3J5TnVtYmVyPzogc3RyaW5nO1xyXG4gICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICB9O1xyXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgY2FsbGluZ1NlYXJjaFNwYWNlPzogc3RyaW5nIHwgeyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbDtcclxuICAgIGRpZFBhdHRlcm5zPzogQXJyYXk8eyBwYXR0ZXJuPzogc3RyaW5nIHwgbnVsbCB9PiB8IG51bGw7XHJcbn1cclxuXHJcbmludGVyZmFjZSBUZW1wbGF0ZURldmljZUxpa2Uge1xyXG4gICAgZGV2aWNlVHlwZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICBwcm90b2NvbD86IHN0cmluZyB8IG51bGw7XHJcbiAgICBidXR0b25UZW1wbGF0ZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGxpbmVBc3NvY2lhdGlvbnM/OiBBcnJheTx7XHJcbiAgICAgICAgZGlyZWN0b3J5TnVtYmVyPzoge1xyXG4gICAgICAgICAgICBkaXJlY3RvcnlOdW1iZXI/OiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICAgICAgfTtcclxuICAgIH0+O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgVGVtcGxhdGVFbmRVc2VyTGlrZSB7XHJcbiAgICB1c2VyaWQ/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgZmlyc3ROYW1lPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGxhc3ROYW1lPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGxpbmVzPzogVGVtcGxhdGVMaW5lTGlrZVtdIHwgbnVsbDtcclxuICAgIGRldmljZXM/OiBUZW1wbGF0ZURldmljZUxpa2VbXSB8IG51bGw7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFVzZXJDcmVhdGlvbldpemFyZFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcGkgPSBpbmplY3QoVXNlckNyZWF0aW9uQXBpU2VydmljZSk7XHJcblxyXG4gICAgcmVhZG9ubHkgbGRhcFRhYmxlQ29sdW1uczogc3RyaW5nW10gPSBbJ3VzZXJJZCcsICdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAnZW1haWwnLCAnYWRkJ107XHJcbiAgICByZWFkb25seSB1c2VyQ3JlYXRpb25UeXBlczogVXNlckNyZWF0aW9uVHlwZVtdID0gWydDVUNNJywgJ01UJ107XHJcblxyXG4gICAgc2l0ZU9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsaW5lT3B0aW9uczogTGluZU9wdGlvbltdID0gW107XHJcbiAgICByb3V0ZVBhcnRpdGlvbk9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBkZXZpY2VSb3dzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgbGRhcFVzZXJzOiBMZGFwVXNlclJvd1tdID0gW107XHJcbiAgICBvdmVydmlld1VzZXJzOiBPdmVydmlld1VzZXJSb3dbXSA9IFtdO1xyXG4gICAgb3ZlcnZpZXdMaW5lczogT3ZlcnZpZXdMaW5lUm93W10gPSBbXTtcclxuICAgIG92ZXJ2aWV3RGV2aWNlczogT3ZlcnZpZXdEZXZpY2VSb3dbXSA9IFtdO1xyXG4gICAgdXNlckRldGFpbHNGb3JtOiBVc2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgdXNlcklkOiAnJyxcclxuICAgICAgICBmaXJzdE5hbWU6ICcnLFxyXG4gICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICBlbWFpbDogJydcclxuICAgIH07XHJcbiAgICBsaW5lU2VsZWN0aW9uczogU2VsZWN0ZWRMaW5lUm93W10gPSBbXTtcclxuICAgIGRldmljZUVudHJpZXM6IERldmljZUVudHJ5W10gPSBbXTtcclxuXHJcbiAgICBzZWxlY3RlZFNpdGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgc2VsZWN0ZWRUZW1wbGF0ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBzZWxlY3RlZFVzZXJDcmVhdGlvblR5cGU6IFVzZXJDcmVhdGlvblR5cGUgPSAnQ1VDTSc7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhZGRlZExkYXBVc2VySWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkUGxhY2Vob2xkZXJEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkTGRhcFVzZXIocm93OiBMZGFwVXNlclJvdyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXNlckRldGFpbHNGb3JtID0ge1xyXG4gICAgICAgICAgICB1c2VySWQ6IHJvdy51c2VySWQsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogcm93LmZpcnN0TmFtZSxcclxuICAgICAgICAgICAgbGFzdE5hbWU6IHJvdy5sYXN0TmFtZSxcclxuICAgICAgICAgICAgZW1haWw6IHJvdy5lbWFpbFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5hZGRlZExkYXBVc2VySWRzLmFkZChyb3cudXNlcklkKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNMZGFwVXNlckFkZGVkKHJvdzogTGRhcFVzZXJSb3cpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRlZExkYXBVc2VySWRzLmhhcyhyb3cudXNlcklkKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFNpdGUoc2l0ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTaXRlID0gc2l0ZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gdGVtcGxhdGU7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0VGVtcGxhdGVEcml2ZW5EYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGluZU9wdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLnJvdXRlUGFydGl0aW9uT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLmRldmljZUVudHJpZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmRldmljZVJvd3MgPSBbXTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlUZW1wbGF0ZVRva2VuUGF5bG9hZChwYXlsb2FkOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZXh0cmFjdFRlbXBsYXRlRnJvbVRva2VuUGF5bG9hZChwYXlsb2FkKTtcclxuICAgICAgICBjb25zdCBlbmRVc2VyOiBUZW1wbGF0ZUVuZFVzZXJMaWtlID0gdGVtcGxhdGU/LmVuZFVzZXIgfHwge307XHJcbiAgICAgICAgY29uc3QgbGluZXNGcm9tVGVtcGxhdGU6IFRlbXBsYXRlTGluZUxpa2VbXSA9IEFycmF5LmlzQXJyYXkoZW5kVXNlci5saW5lcykgPyBlbmRVc2VyLmxpbmVzIDogW107XHJcbiAgICAgICAgY29uc3QgZGV2aWNlc0Zyb21UZW1wbGF0ZTogVGVtcGxhdGVEZXZpY2VMaWtlW10gPSBBcnJheS5pc0FycmF5KGVuZFVzZXIuZGV2aWNlcykgPyBlbmRVc2VyLmRldmljZXMgOiBbXTtcclxuXHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy52YWx1ZVRvU3RyaW5nKGVuZFVzZXIudXNlcmlkKSxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiB0aGlzLnZhbHVlVG9TdHJpbmcoZW5kVXNlci5maXJzdE5hbWUpLFxyXG4gICAgICAgICAgICBsYXN0TmFtZTogdGhpcy52YWx1ZVRvU3RyaW5nKGVuZFVzZXIubGFzdE5hbWUpLFxyXG4gICAgICAgICAgICBlbWFpbDogdGhpcy52YWx1ZVRvU3RyaW5nKGVuZFVzZXIuZW1haWwpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgbWFwcGVkTGluZU9wdGlvbnM6IExpbmVPcHRpb25bXSA9IGxpbmVzRnJvbVRlbXBsYXRlXHJcbiAgICAgICAgICAgIC5tYXAobGluZSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiB0aGlzLnZhbHVlVG9TdHJpbmcobGluZT8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIpLFxyXG4gICAgICAgICAgICAgICAgZGlkOiB0aGlzLnZhbHVlVG9TdHJpbmcobGluZT8uZGlkUGF0dGVybnM/LlswXT8ucGF0dGVybiB8fCBsaW5lPy5kaXJlY3RvcnlOdW1iZXI/LmRpcmVjdG9yeU51bWJlciksXHJcbiAgICAgICAgICAgICAgICBjc3M6IHRoaXMudmFsdWVUb1N0cmluZyhcclxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgbGluZT8uY2FsbGluZ1NlYXJjaFNwYWNlID09PSAnc3RyaW5nJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGxpbmUuY2FsbGluZ1NlYXJjaFNwYWNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbGluZT8uY2FsbGluZ1NlYXJjaFNwYWNlPy5uYW1lXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMudmFsdWVUb1N0cmluZyhsaW5lPy5kZXNjcmlwdGlvbilcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lLm51bWJlci50cmltKCkubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgIGlmIChtYXBwZWRMaW5lT3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5saW5lT3B0aW9ucyA9IHRoaXMudW5pcXVlQnlOdW1iZXIobWFwcGVkTGluZU9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zID0gdGhpcy5saW5lT3B0aW9ucy5tYXAobGluZSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcjogbGluZS5udW1iZXIsXHJcbiAgICAgICAgICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IGxpbmVzRnJvbVRlbXBsYXRlLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlID0+IChzb3VyY2U/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyIHx8ICcnKSA9PT0gbGluZS5udW1iZXJcclxuICAgICAgICAgICAgICAgICk/LmRpcmVjdG9yeU51bWJlcj8ucm91dGVQYXJ0aXRpb25OYW1lIHx8IG51bGxcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVBc3NvY2lhdGlvbnMgPSBkZXZpY2VzRnJvbVRlbXBsYXRlLmZsYXRNYXAoZGV2aWNlID0+IGRldmljZS5saW5lQXNzb2NpYXRpb25zIHx8IFtdKTtcclxuICAgICAgICAgICAgY29uc3QgYXNzb2NpYXRlZExpbmVPcHRpb25zOiBMaW5lT3B0aW9uW10gPSBsaW5lQXNzb2NpYXRpb25zXHJcbiAgICAgICAgICAgICAgICAubWFwKGFzc29jaWF0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1iZXIgPSBhc3NvY2lhdGlvbj8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaWQ6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3NzOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGxpbmUgPT4gbGluZS5udW1iZXIudHJpbSgpLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5saW5lT3B0aW9ucyA9IHRoaXMudW5pcXVlQnlOdW1iZXIoYXNzb2NpYXRlZExpbmVPcHRpb25zKTtcclxuICAgICAgICAgICAgdGhpcy5saW5lU2VsZWN0aW9ucyA9IHRoaXMubGluZU9wdGlvbnMubWFwKGxpbmUgPT4gKHtcclxuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmUubnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lOiBsaW5lQXNzb2NpYXRpb25zLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlID0+IChzb3VyY2U/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyIHx8ICcnKSA9PT0gbGluZS5udW1iZXJcclxuICAgICAgICAgICAgICAgICk/LmRpcmVjdG9yeU51bWJlcj8ucm91dGVQYXJ0aXRpb25OYW1lIHx8IG51bGxcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgcm91dGVQYXJ0aXRpb25zID0gdGhpcy5saW5lU2VsZWN0aW9uc1xyXG4gICAgICAgICAgICAubWFwKGxpbmUgPT4gbGluZS5yb3V0ZVBhcnRpdGlvbk5hbWUpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+ICEhdmFsdWUgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApO1xyXG4gICAgICAgIHRoaXMucm91dGVQYXJ0aXRpb25PcHRpb25zID0gdGhpcy51bmlxdWVTdHJpbmdzKHJvdXRlUGFydGl0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMuZGV2aWNlRW50cmllcyA9IGRldmljZXNGcm9tVGVtcGxhdGUubWFwKGRldmljZSA9PiAoe1xyXG4gICAgICAgICAgICBkZXZpY2VUeXBlOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLmRldmljZVR5cGUpLFxyXG4gICAgICAgICAgICBwcm90b2NvbDogdGhpcy52YWx1ZVRvU3RyaW5nKGRldmljZS5wcm90b2NvbCksXHJcbiAgICAgICAgICAgIGJ1dHRvblRlbXBsYXRlOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLmJ1dHRvblRlbXBsYXRlKSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy52YWx1ZVRvU3RyaW5nKGRldmljZS5uYW1lKVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICB0aGlzLmRldmljZVJvd3MgPSB0aGlzLmRldmljZUVudHJpZXMubWFwKChfLCBpbmRleCkgPT4gaW5kZXggKyAxKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3TGluZXMoKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFVzZXJDcmVhdGlvblR5cGUodHlwZTogVXNlckNyZWF0aW9uVHlwZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VyQ3JlYXRpb25UeXBlID0gdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VyRGV0YWlsc0ZpZWxkKGZpZWxkOiBrZXlvZiBVc2VyRGV0YWlsc0Zvcm0sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy51c2VyRGV0YWlsc0Zvcm0sXHJcbiAgICAgICAgICAgIFtmaWVsZF06IHZhbHVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TGluZVNlbGVjdGlvbihpbmRleDogbnVtYmVyLCBsaW5lTnVtYmVyOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSxcclxuICAgICAgICAgICAgbGluZU51bWJlclxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFJvdXRlUGFydGl0aW9uU2VsZWN0aW9uKGluZGV4OiBudW1iZXIsIHJvdXRlUGFydGl0aW9uTmFtZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0sXHJcbiAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERldmljZU5hbWUoaW5kZXg6IG51bWJlciwgbmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0uZGV2aWNlVHlwZSB8fCAnJztcclxuICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IGRldmljZVR5cGUuaW5jbHVkZXMoJzg4NTEnKVxyXG4gICAgICAgICAgICA/IG5hbWUucmVwbGFjZSgvXlNFUFxccyovaSwgJycpXHJcbiAgICAgICAgICAgIDogbmFtZTtcclxuICAgICAgICB0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmRldmljZUVudHJpZXNbaW5kZXhdLFxyXG4gICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGV2aWNlRGlzcGxheU5hbWUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmRldmljZUVudHJpZXNbaW5kZXhdO1xyXG4gICAgICAgIGlmICghZW50cnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVudHJ5LmRldmljZVR5cGU/LmluY2x1ZGVzKCc4ODUxJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGBTRVAgJHtlbnRyeS5uYW1lIHx8ICcnfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IDEpIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZU51bWJlciA9IHRoaXMubGluZVNlbGVjdGlvbnNbMF0/LmxpbmVOdW1iZXI7XHJcbiAgICAgICAgICAgIHJldHVybiBsaW5lTnVtYmVyID8gYENTRiR7bGluZU51bWJlcn1gIDogJ0NTRltETl0nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVudHJ5Lm5hbWUgfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGxhY2Vob2xkZXIgYm9vdHN0cmFwIHVudGlsIGJhY2tlbmQgQVBJcyBhcmUgY29ubmVjdGVkLlxyXG4gICAgbG9hZFBsYWNlaG9sZGVyRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNpdGVPcHRpb25zID0gWydTaXRlIDEnLCAnU2l0ZSAyJywgJ1NpdGUgMyddO1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVPcHRpb25zID0gWyc4ODUxICsgQ1NGJ107XHJcbiAgICAgICAgdGhpcy5saW5lT3B0aW9ucyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiAnNTU3MDQ2JyxcclxuICAgICAgICAgICAgICAgIGRpZDogJysxMzEyNTU1NzA0NicsXHJcbiAgICAgICAgICAgICAgICBjc3M6ICdBdGxhbnRhX2ludGVybmFsX2NzcycsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJydcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiAnNTU3MDQ3JyxcclxuICAgICAgICAgICAgICAgIGRpZDogJysxMzEyNTU1NzA0NycsXHJcbiAgICAgICAgICAgICAgICBjc3M6ICdBdGxhbnRhX2ludGVybmFsX2NzcycsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJydcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyOiAnNTU3MDQ4JyxcclxuICAgICAgICAgICAgICAgIGRpZDogJysxMzEyNTU1NzA0OCcsXHJcbiAgICAgICAgICAgICAgICBjc3M6ICdBdGxhbnRhX2ludGVybmFsX2NzcycsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJydcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgPSBbJ0F0bGFudGFfaW50ZXJuYWxfUFQnLCAnQmVpamluZ19uYXRpb25hbF9QVCddO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlUm93cyA9IFsxLCAyXTtcclxuICAgICAgICB0aGlzLmxkYXBVc2VycyA9IFtcclxuICAgICAgICAgICAgeyB1c2VySWQ6ICdKb2huLkRvZScsIGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0RvZScsIGVtYWlsOiAnam9obi5kb2VAY2FyLndlc3QuaW8nIH0sXHJcbiAgICAgICAgICAgIHsgdXNlcklkOiAnSmFuZS5TbWl0aCcsIGZpcnN0TmFtZTogJ0phbmUnLCBsYXN0TmFtZTogJ1NtaXRoJywgZW1haWw6ICdqYW5lLnNtaXRoQGNhci53ZXN0LmlvJyB9XHJcbiAgICAgICAgXTtcclxuICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lOiB0aGlzLnJvdXRlUGFydGl0aW9uT3B0aW9uc1swXSB8fCBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlRW50cmllcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogJ0Npc2NvIDg4NTEnLFxyXG4gICAgICAgICAgICAgICAgcHJvdG9jb2w6ICdTSVAnLFxyXG4gICAgICAgICAgICAgICAgYnV0dG9uVGVtcGxhdGU6ICdTdGFuZGFyZCA4ODUxIFNJUCcsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiAnQ2lzY28gVW5pZmllZCBDbGllbnQgU2VydmljZXMgRnJhbWV3b3JrJyxcclxuICAgICAgICAgICAgICAgIHByb3RvY29sOiAnU0lQJyxcclxuICAgICAgICAgICAgICAgIGJ1dHRvblRlbXBsYXRlOiAnU3RhbmRhcmQgQ2xpZW50IFNlcnZpY2VzIEZyYW1ld29yaycsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPz8gbnVsbDtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVidWlsZE92ZXJ2aWV3VXNlcnMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdXNlclRlbXBsYXRlID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlIHx8ICcnO1xyXG4gICAgICAgIGNvbnN0IGhhc1VzZXJEYXRhID0gT2JqZWN0LnZhbHVlcyh0aGlzLnVzZXJEZXRhaWxzRm9ybSkuc29tZSh2YWx1ZSA9PiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCk7XHJcbiAgICAgICAgdGhpcy5vdmVydmlld1VzZXJzID0gaGFzVXNlckRhdGFcclxuICAgICAgICAgICAgPyBbe1xyXG4gICAgICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJEZXRhaWxzRm9ybS51c2VySWQsXHJcbiAgICAgICAgICAgICAgICBmaXJzdE5hbWU6IHRoaXMudXNlckRldGFpbHNGb3JtLmZpcnN0TmFtZSxcclxuICAgICAgICAgICAgICAgIGxhc3ROYW1lOiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5sYXN0TmFtZSxcclxuICAgICAgICAgICAgICAgIGVtYWlsOiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5lbWFpbCxcclxuICAgICAgICAgICAgICAgIHVzZXJUZW1wbGF0ZVxyXG4gICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICA6IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVidWlsZE92ZXJ2aWV3TGluZXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vdmVydmlld0xpbmVzID0gdGhpcy5saW5lU2VsZWN0aW9uc1xyXG4gICAgICAgICAgICAubWFwKHNlbGVjdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbj8ubGluZU51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRMaW5lID0gdGhpcy5saW5lT3B0aW9ucy5maW5kKGxpbmUgPT4gbGluZS5udW1iZXIgPT09IHNlbGVjdGlvbi5saW5lTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRMaW5lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcjogc2VsZWN0ZWRMaW5lLm51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICBkaWQ6IHNlbGVjdGVkTGluZS5kaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lOiBzZWxlY3Rpb24ucm91dGVQYXJ0aXRpb25OYW1lIHx8IHRoaXMucm91dGVQYXJ0aXRpb25PcHRpb25zWzBdIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNzczogc2VsZWN0ZWRMaW5lLmNzcyxcclxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogc2VsZWN0ZWRMaW5lLmRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuZmlsdGVyKChsaW5lKTogbGluZSBpcyBPdmVydmlld0xpbmVSb3cgPT4gISFsaW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYnVpbGRPdmVydmlld0RldmljZXMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRMaW5lTnVtYmVycyA9IHRoaXMub3ZlcnZpZXdMaW5lcy5tYXAobGluZSA9PiBsaW5lLm51bWJlcikuam9pbignLCAnKTtcclxuICAgICAgICB0aGlzLm92ZXJ2aWV3RGV2aWNlcyA9IHRoaXMuZGV2aWNlRW50cmllc1xyXG4gICAgICAgICAgICAubWFwKChkZXZpY2UsIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgZGV2aWNlLFxyXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuZ2V0RGV2aWNlRGlzcGxheU5hbWUoaW5kZXgpXHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAuZmlsdGVyKCh7IGRldmljZSwgZGlzcGxheU5hbWUgfSkgPT4gZGlzcGxheU5hbWUudHJpbSgpLmxlbmd0aCA+IDAgfHwgZGV2aWNlLmRldmljZVR5cGUudHJpbSgpLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIC5tYXAoKHsgZGV2aWNlLCBkaXNwbGF5TmFtZSB9KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbmFtZTogZGlzcGxheU5hbWUsXHJcbiAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiBkZXZpY2UuZGV2aWNlVHlwZSxcclxuICAgICAgICAgICAgICAgIGxpbmVzOiBzZWxlY3RlZExpbmVOdW1iZXJzLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke2RldmljZS5wcm90b2NvbH0gLyAke2RldmljZS5idXR0b25UZW1wbGF0ZX1gXHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4dHJhY3RUZW1wbGF0ZUZyb21Ub2tlblBheWxvYWQocGF5bG9hZDogYW55KTogYW55IHtcclxuICAgICAgICBpZiAoIXBheWxvYWQgfHwgdHlwZW9mIHBheWxvYWQgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZFswXSB8fCBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmaXJzdEtleSA9IE9iamVjdC5rZXlzKHBheWxvYWQpWzBdO1xyXG4gICAgICAgIHJldHVybiBmaXJzdEtleSA/IHBheWxvYWRbZmlyc3RLZXldIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVuaXF1ZUJ5TnVtYmVyKGxpbmVzOiBMaW5lT3B0aW9uW10pOiBMaW5lT3B0aW9uW10ge1xyXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgICAgICByZXR1cm4gbGluZXMuZmlsdGVyKGxpbmUgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMobGluZS5udW1iZXIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2Vlbi5hZGQobGluZS5udW1iZXIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVuaXF1ZVN0cmluZ3MoaXRlbXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoaXRlbXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHZhbHVlVG9TdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBUT0RPOiByZXBsYWNlIHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgQVBJIGludGVncmF0aW9uLlxyXG4gICAgbG9hZERhdGFGcm9tQXBpKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIHRoaXMuYXBpLmdldFdpemFyZEJvb3RzdHJhcERhdGEoKS5zdWJzY3JpYmUoLi4uKVxyXG4gICAgfVxyXG59Il19
796
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jcmVhdGlvbi13aXphcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy91c2VyLWNyZWF0aW9uL3NyYy93aWRnZXRzL3VzZXItY3JlYXRpb24td2l6YXJkL3VzZXItY3JlYXRpb24td2l6YXJkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFJekYsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRixPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUM7QUFDekIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQXdDLE1BQU0sb0JBQW9CLENBQUM7QUFDaEYsT0FBTyxFQW9CSCxXQUFXLEVBRVgsT0FBTyxHQUNWLE1BQU0sa0RBQWtELENBQUM7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7O0FBRzlFLE1BQU0sT0FBTyx5QkFBeUI7SUFjbEMsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFzQ0QsSUFBSSx1QkFBdUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsSUFB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SSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRCxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyRDtRQUNELElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDM0MsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoRCxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyRDtRQUNELElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDekMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsR0FB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QUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1NBQzlGLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxNQUFjLEVBQUUsTUFBdUI7UUFDcEUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0QsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3JDLElBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRTtZQUNuRSxPQUFPLEdBQUcsTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVNLFdBQVc7UUFDZCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEYsQ0FBQzs7dUhBMzRCUSx5QkFBeUI7MkhBQXpCLHlCQUF5Qjs0RkFBekIseUJBQXlCO2tCQURyQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVXNlckNyZWF0aW9uQXBpU2VydmljZSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvc2VydmljZXMvdXNlci1jcmVhdGlvbi1hcGkuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBBUEkgfSBmcm9tIFwiLi4vLi4vYXBwLmNvbnN0YW50c1wiO1xyXG4vLyBpbXBvcnQgeyBBdmFpbGFibGVQaG9uZU51bWJlclJhbmdlSW50ZXJmYWNlLCBBdmFpbGFibGVSYW5nZUludGVyZmFjZSwgRG5SYW5nZVR5cGUsIExpbmVJbnRlcmZhY2UgfSBmcm9tIFwicHJvamVjdHMvdHVraS93aWRnZXRzL3VzZXJzLWxpc3Qvc3JjL2NsYXNzZXMvbGluZVwiO1xyXG5pbXBvcnQgeyBBUElTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9hcGkvYXBpLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZm9ya0pvaW4sIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IEJpZyBmcm9tIFwiYmlnLmpzXCI7XHJcbmltcG9ydCB7IFNpdGVEZWZhdWx0cyB9IGZyb20gXCIuLi8uLi9jbGFzc2VzL3NpdGVcIjtcclxuaW1wb3J0IHsgU2l0ZSwgU2l0ZUludGVyZmFjZSwgU2l0ZVRlbXBsYXRlSW50ZXJmYWNlIH0gZnJvbSBcIi4uLy4uL2NsYXNzZXMvc2l0ZVwiO1xyXG5pbXBvcnQge1xyXG4gICAgRGV2aWNlRW50cnksXHJcbiAgICBFbmRVc2VySW50ZXJmYWNlLFxyXG4gICAgTGluZU9wdGlvbixcclxuICAgIE92ZXJ2aWV3RGV2aWNlUm93LFxyXG4gICAgT3ZlcnZpZXdMaW5lUm93LFxyXG4gICAgT3ZlcnZpZXdVc2VyUm93LFxyXG4gICAgU2VsZWN0ZWRMaW5lUm93LFxyXG4gICAgVGVtcGxhdGVEZXZpY2VMaWtlLFxyXG4gICAgVGVtcGxhdGVFbmRVc2VyTGlrZSxcclxuICAgIFRlbXBsYXRlTGluZUxpa2UsXHJcbiAgICBVc2VyQ3JlYXRpb25UeXBlLFxyXG4gICAgVXNlckRldGFpbHNGb3JtLFxyXG4gICAgVXNlckRldGFpbHNGb3JtVmFsdWUsXHJcbiAgICBVc2VyVGVtcGxhdGVJbnRlcmZhY2UsXHJcbiAgICBMaW5lSW50ZXJmYWNlLFxyXG4gICAgRGV2aWNlSW50ZXJmYWNlLFxyXG4gICAgRGV2aWNlRGVmYXVsdHNJbnRlcmZhY2UsXHJcbiAgICBBdmFpbGFibGVQaG9uZU51bWJlclJhbmdlSW50ZXJmYWNlLFxyXG4gICAgQXZhaWxhYmxlUmFuZ2VJbnRlcmZhY2UsXHJcbiAgICBEblJhbmdlVHlwZSxcclxuICAgIExpc3RVc2VySW50ZXJmYWNlLFxyXG4gICAgRW5kVXNlcixcclxufSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy91c2VyLWNyZWF0aW9uLXdpemFyZC5pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IGJ1aWxkU2F2YWJsZUVuZFVzZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvYnVpbGQtc2F2YWJsZS1lbmQtdXNlclwiO1xyXG5pbXBvcnQgeyBhcHBseURlZmF1bHREZXZpY2VQcmVmaXhJZk1pc3NpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvZGV2aWNlLWRlZmF1bHQtcHJlZml4XCI7XHJcbmltcG9ydCB7IHBhcnNlRGV2aWNlTmFtZVJlZ2V4Qm9keSB9IGZyb20gXCIuLi8uLi91dGlscy9wYXJzZS1kZXZpY2UtbmFtZS1ydWxlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBVc2VyQ3JlYXRpb25XaXphcmRTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlckNyZWF0aW9uQXBpU2VydmljZSA9IGluamVjdChVc2VyQ3JlYXRpb25BcGlTZXJ2aWNlKTtcclxuXHJcbiAgICByZWFkb25seSBsZGFwVGFibGVDb2x1bW5zOiBzdHJpbmdbXSA9IFsndXNlcklkJywgJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsICdlbWFpbCcsICdhZGQnXTtcclxuICAgIHJlYWRvbmx5IHVzZXJDcmVhdGlvblR5cGVzOiBVc2VyQ3JlYXRpb25UeXBlW10gPSBbJ0NVQ00nLCAnTVQnXTtcclxuXHJcbiAgICBwcml2YXRlIHRlbXBsYXRlOiBVc2VyVGVtcGxhdGVJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcclxuICAgIHB1YmxpYyBlbmRVc2VyOiBFbmRVc2VySW50ZXJmYWNlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwdWJsaWMgbGluZXM6IExpbmVJbnRlcmZhY2VbXSA9IFtdO1xyXG4gICAgcHVibGljIGRldmljZXM6IERldmljZUludGVyZmFjZVtdID0gW107XHJcbiAgICBwdWJsaWMgZGV2aWNlUHJvZmlsZXM6IERldmljZUludGVyZmFjZVtdID0gW107XHJcbiAgICBwcml2YXRlIHRlbXBsYXRlTGluZXNTbmFwc2hvdDogTGluZUludGVyZmFjZVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIF9jdXJyZW50U2l0ZTogU2l0ZSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGdldCBjdXJyZW50U2l0ZSgpOiBTaXRlIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHNpdGVPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgdGVtcGxhdGVPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGluZU9wdGlvbnM6IExpbmVPcHRpb25bXSA9IFtdO1xyXG4gICAgcm91dGVQYXJ0aXRpb25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZGV2aWNlUm93czogbnVtYmVyW10gPSBbXTtcclxuICAgIGxkYXBVc2VyczogTGlzdFVzZXJJbnRlcmZhY2VbXSA9IFtdO1xyXG4gICAgb3ZlcnZpZXdVc2VyczogT3ZlcnZpZXdVc2VyUm93W10gPSBbXTtcclxuICAgIG92ZXJ2aWV3TGluZXM6IE92ZXJ2aWV3TGluZVJvd1tdID0gW107XHJcbiAgICBvdmVydmlld0RldmljZXM6IE92ZXJ2aWV3RGV2aWNlUm93W10gPSBbXTtcclxuICAgIG92ZXJ2aWV3RGV2aWNlUHJvZmlsZXM6IE92ZXJ2aWV3RGV2aWNlUm93W10gPSBbXTtcclxuICAgIHVzZXJEZXRhaWxzRm9ybVZhbHVlOiBVc2VyRGV0YWlsc0Zvcm1WYWx1ZSB8IG51bGwgPSBudWxsO1xyXG4gICAgdXNlckRldGFpbHNGb3JtOiBVc2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgdXNlcklkOiAnJyxcclxuICAgICAgICBmaXJzdE5hbWU6ICcnLFxyXG4gICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICBlbWFpbDogJycsXHJcbiAgICB9O1xyXG4gICAgbGluZVNlbGVjdGlvbnM6IFNlbGVjdGVkTGluZVJvd1tdID0gW107XHJcbiAgICBkZXZpY2VFbnRyaWVzOiBEZXZpY2VFbnRyeVtdID0gW107XHJcbiAgICBhdmFpbGFibGVOdW1iZXJzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZGV2aWNlVHlwZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBzaXRlRGVmYXVsdHM6IFNpdGVEZWZhdWx0cyB8IG51bGwgPSBudWxsO1xyXG4gICAgb3JpZ2luYWxTaXRlRGVmYXVsdHM6IFNpdGVEZWZhdWx0cyB8IG51bGwgPSBudWxsO1xyXG4gICAgdGVtcGxhdGVMaW5lczogVGVtcGxhdGVMaW5lTGlrZVtdID0gW107XHJcbiAgICB0ZW1wbGF0ZURldmljZXM6IFRlbXBsYXRlRGV2aWNlTGlrZVtdID0gW107XHJcbiAgICB0ZW1wbGF0ZVVzZXJEZXRhaWxzOiBUZW1wbGF0ZUVuZFVzZXJMaWtlID0ge307XHJcblxyXG4gICAgc2VsZWN0ZWRTaXRlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHNlbGVjdGVkVGVtcGxhdGVOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIHNlbGVjdGVkVGVtcGxhdGVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICBzZWxlY3RlZFVzZXJDcmVhdGlvblR5cGU6IFVzZXJDcmVhdGlvblR5cGUgPSAnQ1VDTSc7XHJcbiAgICBhdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG46IGFueSA9IHt9O1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlRGVmYXVsdHNMb2FkZWRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHJlYWRvbmx5IGRldmljZURlZmF1bHRzTG9hZGVkJCA9IHRoaXMuZGV2aWNlRGVmYXVsdHNMb2FkZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIGdldCBmaXJzdExpbmVSb3V0ZVBhcnRpdGlvbigpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVzWzBdPy5kaXJlY3RvcnlOdW1iZXI/LnJvdXRlUGFydGl0aW9uTmFtZSA/PyAnJztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2l0ZURlZmF1bHRSb3V0ZVBhcnRpdGlvbigpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpdGVEZWZhdWx0cz8ucm91dGVQYXJ0aXRpb24gfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvdXRlUGFydGl0aW9uTmFtZXNMaXN0KCk6IHN0cmluZ1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaXRlRGVmYXVsdHMgPyB0aGlzLnNpdGVEZWZhdWx0cy5yb3V0ZVBhcnRpdGlvbkZpbHRlciA6IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdGVkTGRhcFVzZXI6IExpc3RVc2VySW50ZXJmYWNlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsZGFwVXNlcnNUb3RhbCA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLy8gdGhpcy5sb2FkUGxhY2Vob2xkZXJEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzTGRhcEludGVncmF0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5lbmRVc2VyPy5sZGFwSW50ZWdyYXRlZDtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RMZGFwVXNlcih1c2VyOiBMaXN0VXNlckludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMZGFwVXNlciA9IHVzZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuZW5kVXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIubGRhcEludGVncmF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIudXNlcmlkID0gdXNlci51c2VyaWQ7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5maXJzdE5hbWUgPSB1c2VyLmZpcnN0TmFtZSA/PyAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmxhc3ROYW1lID0gdXNlci5sYXN0TmFtZSA/PyAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmVtYWlsID0gdXNlci5lbWFpbCA/PyAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIHVzZXJJZDogdXNlci51c2VyaWQsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogdXNlci5maXJzdE5hbWUgPz8gJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiB1c2VyLmxhc3ROYW1lID8/ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogdXNlci5lbWFpbCA/PyAnJyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3VXNlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckxkYXBVc2VyU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMZGFwVXNlciA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuZW5kVXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIubGRhcEludGVncmF0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLnVzZXJpZCA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIuZmlyc3ROYW1lID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5sYXN0TmFtZSA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIuZW1haWwgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm0gPSB7XHJcbiAgICAgICAgICAgIHVzZXJJZDogJycsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgZW1haWw6ICcnLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzTGRhcFVzZXJSb3dTZWxlY3RlZChyb3c6IExpc3RVc2VySW50ZXJmYWNlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMZGFwVXNlcj8udXNlcmlkID09PSByb3cudXNlcmlkO1xyXG4gICAgfVxyXG5cclxuICAgIHNldExkYXBVc2Vyc1Jlc3VsdCh1c2VyczogTGlzdFVzZXJJbnRlcmZhY2VbXSwgdG90YWw6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGRhcFVzZXJzID0gdXNlcnM7XHJcbiAgICAgICAgdGhpcy5sZGFwVXNlcnNUb3RhbCA9IHRvdGFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRTZWxlY3RlZFNpdGUoc2l0ZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTaXRlID0gc2l0ZSB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNlbGVjdGVkVGVtcGxhdGUodGVtcGxhdGU/OiBVc2VyVGVtcGxhdGVJbnRlcmZhY2UgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGU/Lm5hbWUgfHwgbnVsbDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVJZCA9IHRlbXBsYXRlPy5pZCB8fCBudWxsO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3VXNlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Q3VycmVudFNpdGUoc2l0ZTogU2l0ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRTaXRlID0gc2l0ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXNldFRlbXBsYXRlRHJpdmVuRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxpbmVPcHRpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zID0gW107XHJcbiAgICAgICAgdGhpcy5kZXZpY2VFbnRyaWVzID0gW107XHJcbiAgICAgICAgdGhpcy5kZXZpY2VSb3dzID0gW107XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5VGVtcGxhdGVUb2tlblBheWxvYWQocGF5bG9hZDogVXNlclRlbXBsYXRlSW50ZXJmYWNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMuZXh0cmFjdFRlbXBsYXRlRnJvbVRva2VuUGF5bG9hZChwYXlsb2FkKTtcclxuICAgICAgICB0aGlzLmVuZFVzZXIgPSBuZXcgRW5kVXNlcih0aGlzLnRlbXBsYXRlPy5lbmRVc2VyKTtcclxuICAgICAgICB0aGlzLmxpbmVzID0gdGhpcy5lbmRVc2VyICYmIEFycmF5LmlzQXJyYXkodGhpcy5lbmRVc2VyLmxpbmVzKSA/IHRoaXMuZW5kVXNlci5saW5lcyA6IFtdO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlcyA9IHRoaXMuZW5kVXNlciAmJiBBcnJheS5pc0FycmF5KHRoaXMuZW5kVXNlci5kZXZpY2VzKSA/IHRoaXMuZW5kVXNlci5kZXZpY2VzIDogW107XHJcbiAgICAgICAgdGhpcy5kZXZpY2VQcm9maWxlcyA9IHRoaXMuZW5kVXNlciAmJiBBcnJheS5pc0FycmF5KHRoaXMuZW5kVXNlci5kZXZpY2VQcm9maWxlcykgPyB0aGlzLmVuZFVzZXIuZGV2aWNlUHJvZmlsZXMgOiBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0VGVtcGxhdGVEbnNOYW1lc0ZvckxpbmVzKCk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMudXNlckRldGFpbHNGb3JtID0ge1xyXG4gICAgICAgIC8vICAgICB1c2VySWQ6IHRoaXMudmFsdWVUb1N0cmluZyh0aGlzLmVuZFVzZXI/LnVzZXJpZCA/PyAnJyksXHJcbiAgICAgICAgLy8gICAgIGZpcnN0TmFtZTogdGhpcy52YWx1ZVRvU3RyaW5nKHRoaXMuZW5kVXNlcj8uZmlyc3ROYW1lID8/ICcnKSxcclxuICAgICAgICAvLyAgICAgbGFzdE5hbWU6IHRoaXMudmFsdWVUb1N0cmluZyh0aGlzLmVuZFVzZXI/Lmxhc3ROYW1lID8/ICcnKSxcclxuICAgICAgICAvLyAgICAgZW1haWw6IHRoaXMudmFsdWVUb1N0cmluZyh0aGlzLmVuZFVzZXI/LmVtYWlsID8/ICcnKVxyXG4gICAgICAgIC8vIH07XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IG1hcHBlZExpbmVPcHRpb25zOiBMaW5lT3B0aW9uW10gPSBsaW5lc0Zyb21UZW1wbGF0ZVxyXG4gICAgICAgIC8vICAgICAubWFwKGxpbmUgPT4gKHtcclxuICAgICAgICAvLyAgICAgICAgIG51bWJlcjogdGhpcy52YWx1ZVRvU3RyaW5nKGxpbmU/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyKSxcclxuICAgICAgICAvLyAgICAgICAgIGRpZDogdGhpcy52YWx1ZVRvU3RyaW5nKGxpbmU/LmRpZFBhdHRlcm5zPy5bMF0/LnBhdHRlcm4gfHwgbGluZT8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIpLFxyXG4gICAgICAgIC8vICAgICAgICAgY3NzOiB0aGlzLnZhbHVlVG9TdHJpbmcoXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdHlwZW9mIGxpbmU/LmNhbGxpbmdTZWFyY2hTcGFjZSA9PT0gJ3N0cmluZydcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgPyBsaW5lLmNhbGxpbmdTZWFyY2hTcGFjZVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICA6IGxpbmU/LmNhbGxpbmdTZWFyY2hTcGFjZT8ubmFtZVxyXG4gICAgICAgIC8vICAgICAgICAgKSxcclxuICAgICAgICAvLyAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZhbHVlVG9TdHJpbmcobGluZT8uZGVzY3JpcHRpb24pXHJcbiAgICAgICAgLy8gICAgIH0pKVxyXG4gICAgICAgIC8vICAgICAuZmlsdGVyKGxpbmUgPT4gbGluZS5udW1iZXIudHJpbSgpLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICB0aGlzLmRldmljZXMuZm9yRWFjaChkZXZpY2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmluaXREZXZpY2VXaXRoU2l0ZUluZm8oZGV2aWNlKTtcclxuICAgICAgICAgICAgYXBwbHlEZWZhdWx0RGV2aWNlUHJlZml4SWZNaXNzaW5nKGRldmljZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5kZXZpY2VQcm9maWxlcy5mb3JFYWNoKGRldmljZSA9PiB0aGlzLmluaXREZXZpY2VXaXRoU2l0ZUluZm8oZGV2aWNlKSk7XHJcbiAgICAgICAgdGhpcy5saW5lcy5mb3JFYWNoKGxpbmUgPT4gdGhpcy5pbml0TGluZVdpdGhTaXRlSW5mbyhsaW5lKSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FwdHVyZVRlbXBsYXRlTGluZXNTbmFwc2hvdCgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFNpdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkRGV2aWNlRGVmYXVsdHNGb3JEZXZpY2VzKHRoaXMuc2VsZWN0ZWRTaXRlKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIChtYXBwZWRMaW5lT3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5saW5lT3B0aW9ucyA9IHRoaXMudW5pcXVlQnlOdW1iZXIobWFwcGVkTGluZU9wdGlvbnMpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLmxpbmVTZWxlY3Rpb25zID0gdGhpcy5saW5lT3B0aW9ucy5tYXAobGluZSA9PiAoe1xyXG4gICAgICAgIC8vICAgICAgICAgbGluZU51bWJlcjogbGluZS5udW1iZXIsXHJcbiAgICAgICAgLy8gICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IGxpbmVzRnJvbVRlbXBsYXRlLmZpbmQoXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc291cmNlID0+IChzb3VyY2U/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyIHx8ICcnKSA9PT0gbGluZS5udW1iZXJcclxuICAgICAgICAvLyAgICAgICAgICk/LmRpcmVjdG9yeU51bWJlcj8ucm91dGVQYXJ0aXRpb25OYW1lIHx8IG51bGxcclxuICAgICAgICAvLyAgICAgfSkpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGxpbmVBc3NvY2lhdGlvbnMgPSBkZXZpY2VzRnJvbVRlbXBsYXRlLmZsYXRNYXAoZGV2aWNlID0+IGRldmljZS5saW5lQXNzb2NpYXRpb25zIHx8IFtdKTtcclxuICAgICAgICAvLyAgICAgY29uc3QgYXNzb2NpYXRlZExpbmVPcHRpb25zOiBMaW5lT3B0aW9uW10gPSBsaW5lQXNzb2NpYXRpb25zXHJcbiAgICAgICAgLy8gICAgICAgICAubWFwKGFzc29jaWF0aW9uID0+IHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCBudW1iZXIgPSBhc3NvY2lhdGlvbj8uZGlyZWN0b3J5TnVtYmVyPy5kaXJlY3RvcnlOdW1iZXIgfHwgJyc7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgbnVtYmVyLFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBkaWQ6IG51bWJlcixcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgY3NzOiAnJyxcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfTtcclxuICAgICAgICAvLyAgICAgICAgIH0pXHJcbiAgICAgICAgLy8gICAgICAgICAuZmlsdGVyKGxpbmUgPT4gbGluZS5udW1iZXIudHJpbSgpLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICAvLyAgICAgdGhpcy5saW5lT3B0aW9ucyA9IHRoaXMudW5pcXVlQnlOdW1iZXIoYXNzb2NpYXRlZExpbmVPcHRpb25zKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5saW5lU2VsZWN0aW9ucyA9IHRoaXMubGluZU9wdGlvbnMubWFwKGxpbmUgPT4gKHtcclxuICAgICAgICAvLyAgICAgICAgIGxpbmVOdW1iZXI6IGxpbmUubnVtYmVyLFxyXG4gICAgICAgIC8vICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lOiBsaW5lQXNzb2NpYXRpb25zLmZpbmQoXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc291cmNlID0+IChzb3VyY2U/LmRpcmVjdG9yeU51bWJlcj8uZGlyZWN0b3J5TnVtYmVyIHx8ICcnKSA9PT0gbGluZS5udW1iZXJcclxuICAgICAgICAvLyAgICAgICAgICk/LmRpcmVjdG9yeU51bWJlcj8ucm91dGVQYXJ0aXRpb25OYW1lIHx8IG51bGxcclxuICAgICAgICAvLyAgICAgfSkpO1xyXG5cclxuICAgICAgICAvLyAgICAgdGhpcy50ZW1wbGF0ZUxpbmVzLmZvckVhY2goKGxpbmU6IGFueSkgPT4gdGhpcy5pbml0TGluZVdpdGhTaXRlSW5mbyhsaW5lKSk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuaW5pdFRlbXBsYXRlRG5zTmFtZXNGb3JMaW5lcyh0aGlzLnRlbXBsYXRlTGluZXMpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gY29uc3Qgcm91dGVQYXJ0aXRpb25zID0gdGhpcy5saW5lU2VsZWN0aW9uc1xyXG4gICAgICAgIC8vICAgICAubWFwKGxpbmUgPT4gbGluZS5yb3V0ZVBhcnRpdGlvbk5hbWUpXHJcbiAgICAgICAgLy8gICAgIC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+ICEhdmFsdWUgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApO1xyXG4gICAgICAgIC8vIHRoaXMucm91dGVQYXJ0aXRpb25PcHRpb25zID0gdGhpcy51bmlxdWVTdHJpbmdzKHJvdXRlUGFydGl0aW9ucyk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuZGV2aWNlRW50cmllcyA9IGRldmljZXNGcm9tVGVtcGxhdGUubWFwKGRldmljZSA9PiAoe1xyXG4gICAgICAgIC8vICAgICBkZXZpY2VUeXBlOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLmRldmljZVR5cGUpLFxyXG4gICAgICAgIC8vICAgICBwcm90b2NvbDogdGhpcy52YWx1ZVRvU3RyaW5nKGRldmljZS5wcm90b2NvbCksXHJcbiAgICAgICAgLy8gICAgIGJ1dHRvblRlbXBsYXRlOiB0aGlzLnZhbHVlVG9TdHJpbmcoZGV2aWNlLmJ1dHRvblRlbXBsYXRlKSxcclxuICAgICAgICAvLyAgICAgbmFtZTogdGhpcy52YWx1ZVRvU3RyaW5nKGRldmljZS5uYW1lKVxyXG4gICAgICAgIC8vIH0pKTtcclxuICAgICAgICAvLyB0aGlzLmRldmljZVJvd3MgPSB0aGlzLmRldmljZUVudHJpZXMubWFwKChfLCBpbmRleCkgPT4gaW5kZXggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5yZWJ1aWxkT3ZlcnZpZXdVc2VycygpO1xyXG4gICAgICAgIC8vIHRoaXMucmVidWlsZE92ZXJ2aWV3TGluZXMoKTtcclxuICAgICAgICAvLyB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZFVzZXJDcmVhdGlvblR5cGUodHlwZTogVXNlckNyZWF0aW9uVHlwZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VyQ3JlYXRpb25UeXBlID0gdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVzZXRVc2VyRGV0YWlsc1N0ZXBTdGF0ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybVZhbHVlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAgICAgdXNlcklkOiAnJyxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgbGFzdE5hbWU6ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogJycsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTGRhcFVzZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGRhcFVzZXJzID0gW107XHJcbiAgICAgICAgdGhpcy5sZGFwVXNlcnNUb3RhbCA9IDA7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlTGluZXNTbmFwc2hvdCkge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnRlbXBsYXRlTGluZXNTbmFwc2hvdCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kZXZpY2VzLmZvckVhY2goZGV2aWNlID0+IHtcclxuICAgICAgICAgICAgZGV2aWNlLm5hbWUgPSAnJztcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRldmljZVByb2ZpbGVzLmZvckVhY2gocHJvZmlsZSA9PiB7XHJcbiAgICAgICAgICAgIHByb2ZpbGUubmFtZSA9ICcnO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5lbmRVc2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci51c2VyaWQgPSAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmZpcnN0TmFtZSA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIubGFzdE5hbWUgPSAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmVtYWlsID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci5sZGFwSW50ZWdyYXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIubGluZXMgPSB0aGlzLmxpbmVzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vdmVydmlld1VzZXJzID0gW107XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlUHJvZmlsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhcHR1cmVUZW1wbGF0ZUxpbmVzU25hcHNob3QoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUxpbmVzU25hcHNob3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMubGluZXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VyRGV0YWlsc0ZpZWxkKGZpZWxkOiBrZXlvZiBVc2VyRGV0YWlsc0Zvcm0sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy51c2VyRGV0YWlsc0Zvcm0sXHJcbiAgICAgICAgICAgIFtmaWVsZF06IHZhbHVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlVc2VyRGV0YWlsc0Zvcm1WYWx1ZShmb3JtVmFsdWU6IFVzZXJEZXRhaWxzRm9ybVZhbHVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VyRGV0YWlsc0Zvcm1WYWx1ZSA9IGZvcm1WYWx1ZTtcclxuICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSA9IHtcclxuICAgICAgICAgICAgdXNlcklkOiBmb3JtVmFsdWUudXNlcklkIHx8ICcnLFxyXG4gICAgICAgICAgICBmaXJzdE5hbWU6IGZvcm1WYWx1ZS5maXJzdE5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiBmb3JtVmFsdWUubGFzdE5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgIGVtYWlsOiBmb3JtVmFsdWUuZW1haWwgfHwgJycsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZm9ybVZhbHVlLmxpbmVzPy5mb3JFYWNoKChsaW5lVmFsdWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmxpbmVzW2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKCFsaW5lPy5kaXJlY3RvcnlOdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaW5lLmRpcmVjdG9yeU51bWJlci5kaXJlY3RvcnlOdW1iZXIgPSBsaW5lVmFsdWUubnVtYmVyIHx8ICcnO1xyXG4gICAgICAgICAgICBsaW5lLmRpcmVjdG9yeU51bWJlci5yb3V0ZVBhcnRpdGlvbk5hbWUgPSBsaW5lVmFsdWUucm91dGVQYXJ0aXRpb24gfHwgJyc7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGZvcm1WYWx1ZS5kZXZpY2VzPy5mb3JFYWNoKChkZXZpY2VWYWx1ZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGV2aWNlID0gdGhpcy5kZXZpY2VzW2luZGV4XTtcclxuICAgICAgICAgICAgaWYgKCFkZXZpY2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZXZpY2UubmFtZSA9IGRldmljZVZhbHVlLm5hbWUgfHwgJyc7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGZvcm1WYWx1ZS5kZXZpY2VQcm9maWxlcz8uZm9yRWFjaCgocHJvZmlsZVZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5kZXZpY2VQcm9maWxlc1tpbmRleF07XHJcbiAgICAgICAgICAgIGlmICghcHJvZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByb2ZpbGUubmFtZSA9IHByb2ZpbGVWYWx1ZS5uYW1lIHx8ICcnO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5lbmRVc2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlci51c2VyaWQgPSBmb3JtVmFsdWUudXNlcklkIHx8ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIuZmlyc3ROYW1lID0gZm9ybVZhbHVlLmZpcnN0TmFtZSB8fCAnJztcclxuICAgICAgICAgICAgdGhpcy5lbmRVc2VyLmxhc3ROYW1lID0gZm9ybVZhbHVlLmxhc3ROYW1lIHx8ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFVzZXIuZW1haWwgPSBmb3JtVmFsdWUuZW1haWwgfHwgJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld1VzZXJzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdMaW5lcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpO1xyXG4gICAgICAgIHRoaXMucmVidWlsZE92ZXJ2aWV3RGV2aWNlUHJvZmlsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRMaW5lU2VsZWN0aW9uKGluZGV4OiBudW1iZXIsIGxpbmVOdW1iZXI6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5saW5lU2VsZWN0aW9uc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdLFxyXG4gICAgICAgICAgICBsaW5lTnVtYmVyXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkT3ZlcnZpZXdEZXZpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Um91dGVQYXJ0aXRpb25TZWxlY3Rpb24oaW5kZXg6IG51bWJlciwgcm91dGVQYXJ0aXRpb25OYW1lOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGluZVNlbGVjdGlvbnNbaW5kZXhdID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmxpbmVTZWxlY3Rpb25zW2luZGV4XSxcclxuICAgICAgICAgICAgcm91dGVQYXJ0aXRpb25OYW1lXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0xpbmVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGV2aWNlTmFtZShpbmRleDogbnVtYmVyLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkZXZpY2VUeXBlID0gdGhpcy5kZXZpY2VFbnRyaWVzW2luZGV4XS5kZXZpY2VUeXBlIHx8ICcnO1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gZGV2aWNlVHlwZS5pbmNsdWRlcygnODg1MScpXHJcbiAgICAgICAgICAgID8gbmFtZS5yZXBsYWNlKC9eU0VQXFxzKi9pLCAnJylcclxuICAgICAgICAgICAgOiBuYW1lO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0gPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGV2aWNlRW50cmllc1tpbmRleF0sXHJcbiAgICAgICAgICAgIG5hbWU6IG5vcm1hbGl6ZWROYW1lXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRPdmVydmlld0RldmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXZpY2VEaXNwbGF5TmFtZShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZGV2aWNlRW50cmllc1tpbmRleF07XHJcbiAgICAgICAgaWYgKCFlbnRyeSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW50cnkuZGV2aWNlVHlwZT8uaW5jbHVkZXMoJzg4NTEnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYFNFUCAke2VudHJ5Lm5hbWUgfHwgJyd9YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lTnVtYmVyID0gdGhpcy5saW5lU2VsZWN0aW9uc1swXT8ubGluZU51bWJlcjtcclxuICAgICAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXIgPyBgQ1NGJHtsaW5lTnVtYmVyfWAgOiAnQ1NGW0ROXSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZW50cnkubmFtZSB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0U2l0ZUFsbERhdGEoc2l0ZUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbkFwaVNlcnZpY2UuZ2V0U2l0ZUFsbERhdGEoc2l0ZUlkKS5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlc1swXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpdGUgPSBuZXcgU2l0ZShyZXNbMF0gYXMgU2l0ZUludGVyZmFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNpdGUgPSBzaXRlLmlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXNbMV0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNpdGVEZWZhdWx0cyA9IG5ldyBTaXRlRGVmYXVsdHMocmVzWzFdLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbFNpdGVEZWZhdWx0cyA9IG5ldyBTaXRlRGVmYXVsdHMocmVzWzFdLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnMgPSBbLi4udGhpcy5yb3V0ZVBhcnRpdGlvbk5hbWVzTGlzdF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlc1syXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV2aWNlVHlwZXMgPSByZXNbMl0gYXMgc3RyaW5nW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAocmVzID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWREZXZpY2VEZWZhdWx0c0ZvckRldmljZXMoc2l0ZUlkKS5waXBlKG1hcCgoKSA9PiByZXMpKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9hZERldmljZURlZmF1bHRzRm9yRGV2aWNlcyhzaXRlSWQ6IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IGRldmljZVR5cGVzID0gdGhpcy5nZXRVbmlxdWVEZXZpY2VUeXBlcygpO1xyXG4gICAgICAgIGlmICghZGV2aWNlVHlwZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVxdWVzdHMgPSBkZXZpY2VUeXBlcy5tYXAoZGV2aWNlVHlwZSA9PlxyXG4gICAgICAgICAgICB0aGlzLnVzZXJDcmVhdGlvbkFwaVNlcnZpY2UuZ2V0RGV2aWNlRGVmYXVsdHMoU3RyaW5nKHNpdGVJZCksIGRldmljZVR5cGUpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YXAoZGVmYXVsdHMgPT4gdGhpcy5hcHBseURldmljZURlZmF1bHRzVG9UeXBlKGRldmljZVR5cGUsIGRlZmF1bHRzKSksXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKHJlcXVlc3RzKS5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5kZXZpY2VEZWZhdWx0c0xvYWRlZFN1YmplY3QubmV4dCgpKSxcclxuICAgICAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VW5pcXVlRGV2aWNlVHlwZXMoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIGNvbnN0IHR5cGVzID0gW1xyXG4gICAgICAgICAgICAuLi50aGlzLmRldmljZXMubWFwKGRldmljZSA9PiBkZXZpY2UuZGV2aWNlVHlwZSksXHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGV2aWNlUHJvZmlsZXMubWFwKHByb2ZpbGUgPT4gcHJvZmlsZS5kZXZpY2VUeXBlKSxcclxuICAgICAgICBdLmZpbHRlcigodHlwZSk6IHR5cGUgaXMgc3RyaW5nID0+ICEhdHlwZSAmJiB0eXBlLnRyaW0oKS5sZW5ndGggPiAwKTtcclxuICAgICAgICByZXR1cm4gWy4uLm5ldyBTZXQodHlwZXMpXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5RGV2aWNlRGVmYXVsdHNUb1R5cGUoZGV2aWNlVHlwZTogc3RyaW5nLCBkZWZhdWx0czogRGV2aWNlRGVmYXVsdHNJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBuYW1lVmFsaWRhdGlvblJlZ2V4ID0gcGFyc2VEZXZpY2VOYW1lUmVnZXhCb2R5KGRlZmF1bHRzLmRldmljZU5hbWVSZWdleCk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IFsuLi50aGlzLmRldmljZXMsIC4uLnRoaXMuZGV2aWNlUHJvZmlsZXNdLmZpbHRlcihcclxuICAgICAgICAgICAgZGV2aWNlID0+IGRldmljZS5kZXZpY2VUeXBlID09PSBkZXZpY2VUeXBlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKGRldmljZSA9PiB7XHJcbiAgICAgICAgICAgIGRldmljZS5kZXZpY2VEZWZhdWx0cyA9IGRlZmF1bHRzO1xyXG4gICAgICAgICAgICBkZXZpY2UubmFtZVZhbGlkYXRpb25SZWdleCA9IG5hbWVWYWxpZGF0aW9uUmVnZXg7XHJcbiAgICAgICAgICAgIGRldmljZS5uYW1lVmFsaWRhdGlvbkNhcHRpb24gPSBkZWZhdWx0cy5kZXZpY2VOYW1lRXhwbGFpbmVkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERldmljZU5hbWVQcmVmaXgoZGV2aWNlSW5kZXg6IG51bWJlciwgaXNQcm9maWxlID0gZmFsc2UpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBkZXZpY2UgPSBpc1Byb2ZpbGUgPyB0aGlzLmRldmljZVByb2ZpbGVzW2RldmljZUluZGV4XSA6IHRoaXMuZGV2aWNlc1tkZXZpY2VJbmRleF07XHJcbiAgICAgICAgY29uc3QgcHJlZml4ID0gZGV2aWNlPy5wcmVmaXg/LnRyaW0oKTtcclxuICAgICAgICByZXR1cm4gcHJlZml4IHx8IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGV2aWNlTmFtZVZhbGlkYXRpb25DYXB0aW9uKGRldmljZUluZGV4OiBudW1iZXIsIGlzUHJvZmlsZSA9IGZhbHNlKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBkZXZpY2UgPSBpc1Byb2ZpbGUgPyB0aGlzLmRldmljZVByb2ZpbGVzW2RldmljZUluZGV4XSA6IHRoaXMuZGV2aWNlc1tkZXZpY2VJbmRleF07XHJcbiAgICAgICAgcmV0dXJuIGRldmljZT8ubmFtZVZhbGlkYXRpb25DYXB0aW9uIHx8IGRldmljZT8uZGV2aWNlRGVmYXVsdHM/LmRldmljZU5hbWVFeHBsYWluZWQgfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGV2aWNlTmFtZVZhbGlkYXRpb25PcHRpb25zKGRldmljZUluZGV4OiBudW1iZXIsIGlzUHJvZmlsZSA9IGZhbHNlKToge1xyXG4gICAgICAgIHJlZ2V4OiBzdHJpbmc7XHJcbiAgICAgICAgY2FwdGlvbjogc3RyaW5nO1xyXG4gICAgfSB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGRldmljZSA9IGlzUHJvZmlsZSA/IHRoaXMuZGV2aWNlUHJvZmlsZXNbZGV2aWNlSW5kZXhdIDogdGhpcy5kZXZpY2VzW2RldmljZUluZGV4XTtcclxuICAgICAgICBjb25zdCByZWdleCA9XHJcbiAgICAgICAgICAgIGRldmljZT8ubmFtZVZhbGlkYXRpb25SZWdleD8udHJpbSgpIHx8XHJcbiAgICAgICAgICAgIHBhcnNlRGV2aWNlTmFtZVJlZ2V4Qm9keShkZXZpY2U/LmRldmljZURlZmF1bHRzPy5kZXZpY2VOYW1lUmVnZXgpO1xyXG4gICAgICAgIGlmICghcmVnZXgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJlZ2V4LFxyXG4gICAgICAgICAgICBjYXB0aW9uOiB0aGlzLmdldERldmljZU5hbWVWYWxpZGF0aW9uQ2FwdGlvbihkZXZpY2VJbmRleCwgaXNQcm9maWxlKSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROdW1iZXJSYW5nZShzaXRlSWQ6IHN0cmluZywgcm91dGVQYXJ0aXRpb246IHN0cmluZyk6IE9ic2VydmFibGU8QXZhaWxhYmxlUmFuZ2VJbnRlcmZhY2U+IHtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9EbiA9IHt9O1xyXG4gICAgICAgIGNvbnN0IHBhZ2VTaXplID0gOTk5OTtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7ZG50eXBlOiBEblJhbmdlVHlwZS5leHRlbnNpb24sIHJvdXRlcGFydGl0aW9uOiByb3V0ZVBhcnRpdGlvbiwgc2l6ZTogcGFnZVNpemUsIHBhZ2U6IDB9O1xyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTnVtYmVycyA9IFtdO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVhdGlvbkFwaVNlcnZpY2UuZ2V0QXZhaWxhYmxlRG5JblJhbmdlcyhzaXRlSWQsIHBhcmFtcylcclxuICAgICAgICAucGlwZShtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJlcy5hdmFpbGFibGVOdW1iZXJMaXN0LmZvckVhY2goKGF2YWlsYWJsZU51bWJlcjogQXZhaWxhYmxlUGhvbmVOdW1iZXJSYW5nZUludGVyZmFjZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBdmFpbGFibGVEaWRNYXBwZWRUb0RuKGF2YWlsYWJsZU51bWJlcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF2YWlsYWJsZU51bWJlcnMgPSBbLi4udGhpcy5hdmFpbGFibGVOdW1iZXJzLCAuLi50aGlzLmdldFVud3JhcE51bWJlclJhbmdlKGF2YWlsYWJsZU51bWJlcildO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICAgLy8gLnBpcGUodGhpcy5oYW5kbGVFcnJvcih0cnVlLCBmYWxzZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVidWlsZE92ZXJ2aWV3VXNlcnMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdXNlclRlbXBsYXRlID0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlTmFtZSB8fCAnJztcclxuICAgICAgICBjb25zdCBoYXNVc2VyRGF0YSA9IE9iamVjdC52YWx1ZXModGhpcy51c2VyRGV0YWlsc0Zvcm0pLnNvbWUodmFsdWUgPT4gdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApO1xyXG4gICAgICAgIHRoaXMub3ZlcnZpZXdVc2VycyA9IGhhc1VzZXJEYXRhXHJcbiAgICAgICAgICAgID8gW3tcclxuICAgICAgICAgICAgICAgIHVzZXJJZDogdGhpcy51c2VyRGV0YWlsc0Zvcm0udXNlcklkLFxyXG4gICAgICAgICAgICAgICAgZmlyc3ROYW1lOiB0aGlzLnVzZXJEZXRhaWxzRm9ybS5maXJzdE5hbWUsXHJcbiAgICAgICAgICAgICAgICBsYXN0TmFtZTogdGhpcy51c2VyRGV0YWlsc0Zvcm0ubGFzdE5hbWUsXHJcbiAgICAgICAgICAgICAgICBlbWFpbDogdGhpcy51c2VyRGV0YWlsc0Zvcm0uZW1haWwsXHJcbiAgICAgICAgICAgICAgICB1c2VyVGVtcGxhdGVcclxuICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgOiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYnVpbGRPdmVydmlld0xpbmVzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGZvcm1MaW5lcyA9IHRoaXMudXNlckRldGFpbHNGb3JtVmFsdWU/LmxpbmVzO1xyXG4gICAgICAgIGlmIChmb3JtTGluZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLm92ZXJ2aWV3TGluZXMgPSBmb3JtTGluZXNcclxuICAgICAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiAhIWxpbmU/Lm51bWJlcj8udHJpbSgpKVxyXG4gICAgICAgICAgICAgICAgLm1hcCgobGluZVZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlTGluZSA9IHRoaXMubGluZXNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzcyA9IHRoaXMudmFsdWVUb1N0cmluZyh0ZW1wbGF0ZUxpbmU/LmNhbGxpbmdTZWFyY2hTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiBsaW5lVmFsdWUubnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaWQ6IGxpbmVWYWx1ZS5saW5lTnVtYmVyIHx8IGxpbmVWYWx1ZS5udW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlUGFydGl0aW9uTmFtZTogbGluZVZhbHVlLnJvdXRlUGFydGl0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZhbHVlVG9TdHJpbmcodGVtcGxhdGVMaW5lPy5kZXNjcmlwdGlvbiksXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm92ZXJ2aWV3TGluZXMgPSB0aGlzLmxpbmVTZWxlY3Rpb25zXHJcbiAgICAgICAgICAgIC5tYXAoc2VsZWN0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uPy5saW5lTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZExpbmUgPSB0aGlzLmxpbmVPcHRpb25zLmZpbmQobGluZSA9PiBsaW5lLm51bWJlciA9PT0gc2VsZWN0aW9uLmxpbmVOdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZExpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiBzZWxlY3RlZExpbmUubnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpZDogc2VsZWN0ZWRMaW5lLmRpZCxcclxuICAgICAgICAgICAgICAgICAgICByb3V0ZVBhcnRpdGlvbk5hbWU6IHNlbGVjdGlvbi5yb3V0ZVBhcnRpdGlvbk5hbWUgfHwgdGhpcy5yb3V0ZVBhcnRpdGlvbk9wdGlvbnNbMF0gfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgY3NzOiBzZWxlY3RlZExpbmUuY3NzLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzZWxlY3RlZExpbmUuZGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpOiBsaW5lIGlzIE92ZXJ2aWV3TGluZVJvdyA9PiAhIWxpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVidWlsZE92ZXJ2aWV3RGV2aWNlcygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZExpbmVOdW1iZXJzID0gdGhpcy5vdmVydmlld0xpbmVzLm1hcChsaW5lID0+IGxpbmUubnVtYmVyKS5qb2luKCcsICcpO1xyXG4gICAgICAgIGNvbnN0IGZvcm1EZXZpY2VzID0gdGhpcy51c2VyRGV0YWlsc0Zvcm1WYWx1ZT8uZGV2aWNlcztcclxuICAgICAgICBpZiAoZm9ybURldmljZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLm92ZXJ2aWV3RGV2aWNlcyA9IGZvcm1EZXZpY2VzXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGRldmljZSA9PiAhIWRldmljZS5kZXZpY2VUeXBlPy50cmltKCkgfHwgISFkZXZpY2UubmFtZT8udHJpbSgpKVxyXG4gICAgICAgICAgICAgICAgLm1hcChkZXZpY2UgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBkZXZpY2UubmFtZSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiBkZXZpY2UuZGV2aWNlVHlwZSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICBsaW5lczogc2VsZWN0ZWRMaW5lTnVtYmVycyxcclxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7ZGV2aWNlLnByb3RvY29sIHx8ICcnfSAvICR7ZGV2aWNlLmJ1dHRvblRlbXBsYXRlIHx8ICcnfWAudHJpbSgpLFxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm92ZXJ2aWV3RGV2aWNlcyA9IHRoaXMuZGV2aWNlRW50cmllc1xyXG4gICAgICAgICAgICAubWFwKChkZXZpY2UsIGluZGV4KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgZGV2aWNlLFxyXG4gICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuZ2V0RGV2aWNlRGlzcGxheU5hbWUoaW5kZXgpXHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAuZmlsdGVyKCh7IGRldmljZSwgZGlzcGxheU5hbWUgfSkgPT4gZGlzcGxheU5hbWUudHJpbSgpLmxlbmd0aCA+IDAgfHwgZGV2aWNlLmRldmljZVR5cGUudHJpbSgpLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIC5tYXAoKHsgZGV2aWNlLCBkaXNwbGF5TmFtZSB9KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbmFtZTogZGlzcGxheU5hbWUsXHJcbiAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiBkZXZpY2UuZGV2aWNlVHlwZSxcclxuICAgICAgICAgICAgICAgIGxpbmVzOiBzZWxlY3RlZExpbmVOdW1iZXJzLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke2RldmljZS5wcm90b2NvbH0gLyAke2RldmljZS5idXR0b25UZW1wbGF0ZX1gXHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYnVpbGRPdmVydmlld0RldmljZVByb2ZpbGVzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTGluZU51bWJlcnMgPSB0aGlzLm92ZXJ2aWV3TGluZXMubWFwKGxpbmUgPT4gbGluZS5udW1iZXIpLmpvaW4oJywgJyk7XHJcbiAgICAgICAgY29uc3QgZm9ybVByb2ZpbGVzID0gdGhpcy51c2VyRGV0YWlsc0Zvcm1WYWx1ZT8uZGV2aWNlUHJvZmlsZXM7XHJcbiAgICAgICAgaWYgKCFmb3JtUHJvZmlsZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLm92ZXJ2aWV3RGV2aWNlUHJvZmlsZXMgPSBbXTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vdmVydmlld0RldmljZVByb2ZpbGVzID0gZm9ybVByb2ZpbGVzXHJcbiAgICAgICAgICAgIC5maWx0ZXIocHJvZmlsZSA9PiAhIXByb2ZpbGUuZGV2aWNlVHlwZT8udHJpbSgpIHx8ICEhcHJvZmlsZS5uYW1lPy50cmltKCkpXHJcbiAgICAgICAgICAgIC5tYXAocHJvZmlsZSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbmFtZTogcHJvZmlsZS5uYW1lIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogcHJvZmlsZS5kZXZpY2VUeXBlIHx8ICcnLFxyXG4gICAgICAgICAgICAgICAgbGluZXM6IHNlbGVjdGVkTGluZU51bWJlcnMsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7cHJvZmlsZS5wcm90b2NvbCB8fCAnJ30gLyAke3Byb2ZpbGUuYnV0dG9uVGVtcGxhdGUgfHwgJyd9YC50cmltKCksXHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4dHJhY3RUZW1wbGF0ZUZyb21Ub2tlblBheWxvYWQocGF5bG9hZDogYW55KTogYW55IHtcclxuICAgICAgICBpZiAoIXBheWxvYWQgfHwgdHlwZW9mIHBheWxvYWQgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZFswXSB8fCBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmaXJzdEtleSA9IE9iamVjdC5rZXlzKHBheWxvYWQpWzBdO1xyXG4gICAgICAgIHJldHVybiBmaXJzdEtleSA/IHBheWxvYWRbZmlyc3RLZXldIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVuaXF1ZUJ5TnVtYmVyKGxpbmVzOiBMaW5lT3B0aW9uW10pOiBMaW5lT3B0aW9uW10ge1xyXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgICAgICByZXR1cm4gbGluZXMuZmlsdGVyKGxpbmUgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMobGluZS5udW1iZXIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2Vlbi5hZGQobGluZS5udW1iZXIpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVuaXF1ZVN0cmluZ3MoaXRlbXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoaXRlbXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHZhbHVlVG9TdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFVud3JhcE51bWJlclJhbmdlKGF2YWlsYWJsZU51bWJlcjogYW55KTogc3RyaW5nW10ge1xyXG4gICAgICAgIGxldCB1bndyYXBOdW1iZXJSYW5nZSA9IHRoaXMudW53cmFwTnVtYmVyUmFuZ2UoYXZhaWxhYmxlTnVtYmVyLnBob25lTnVtYmVyUmFuZ2UuZnJvbSwgYXZhaWxhYmxlTnVtYmVyLnBob25lTnVtYmVyUmFuZ2UudG8pXHJcbiAgICAgICAgICAgIC5tYXAoKHVud3JhcHBlZE51bWJlcjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRuID0gYXZhaWxhYmxlTnVtYmVyLnBob25lTnVtYmVyUmFuZ2UucHJlZml4ICsgdW53cmFwcGVkTnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgc3RyID0gZG47XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9Ebltkbl0gJiYgdGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG5bZG5dLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9Ebltkbl1bMF1bJ21hcHBlZERpZHMnXSAmJiB0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9Ebltkbl1bMF1bJ21hcHBlZERpZHMnXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzdHIgKz0gJyAgICAgICAgRElEOiAgJyArICh0aGlzLmF2YWlsYWJsZURpZFBhdHRlcm5zTWFwcGVkVG9Ebltkbl1bMF1bJ21hcHBlZERpZHMnXS5sZW5ndGggPiAxID8gJ211bHRpcGxlJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG5bZG5dWzBdWydtYXBwZWREaWRzJ11bMF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXZhaWxhYmxlRGlkUGF0dGVybnNNYXBwZWRUb0RuW2RuXVswXVsndm0nXSkge1xyXG4gICAgICAgICAgICAgICAgc3RyICs9ICcgICAgICAgIEluIFVzZSAtIFZNJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB1bndyYXBOdW1iZXJSYW5nZSA9IHVud3JhcE51bWJlclJhbmdlLmZpbHRlcigodW53cmFwcGVkTnVtYmVyOiBzdHJpbmcpID0+ICFhdmFpbGFibGVOdW1iZXIudXNlZE51bWJlcnMuaW5jbHVkZXModW53cmFwcGVkTnVtYmVyKSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHVud3JhcE51bWJlclJhbmdlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdW53cmFwTnVtYmVyUmFuZ2Uoc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgY29uc3QgcmVnRXhwID0gLyheMCspLztcclxuICAgICAgICBsZXQgbGVhZGluZ1plcm9zID0gJyc7XHJcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHN0YXJ0Lm1hdGNoKHJlZ0V4cCk7XHJcbiAgICAgICAgaWYgKG1hdGNoZXMpIHtcclxuICAgICAgICAgICAgbGVhZGluZ1plcm9zID0gbWF0Y2hlc1sxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhcnROdW1lcmljID0gbmV3IEJpZyhzdGFydCk7XHJcbiAgICAgICAgY29uc3QgZW5kTnVtZXJpYyA9IG5ldyBCaWcoZW5kKTtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOiBOdW1iZXIoZW5kTnVtZXJpYy5taW51cyhzdGFydE51bWVyaWMpLnBsdXMobmV3IEJpZygxKSkudG9GaXhlZCgwKSl9LCAodiwgazogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bWJlciA9IFN0cmluZyhzdGFydE51bWVyaWMucGx1cyhuZXcgQmlnKGsudG9TdHJpbmcoKSkpLnRvRml4ZWQoMCkpO1xyXG4gICAgICAgICAgICBpZiAoKGxlYWRpbmdaZXJvcyArIG51bWJlcikubGVuZ3RoID4gc3RhcnQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxlYWRpbmdaZXJvcyA9IGxlYWRpbmdaZXJvcy5zdWJzdHIoMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGxlYWRpbmdaZXJvcyArIG51bWJlcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0QXZhaWxhYmxlRGlkTWFwcGVkVG9EbihhdmFpbGFibGVOdW1iZXI6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChhdmFpbGFibGVOdW1iZXIudW5Vc2VkTnVtYmVyc1dpdGhEaWRzICYmIGF2YWlsYWJsZU51bWJlci51blVzZWROdW1iZXJzV2l0aERpZHMubGVuZ3RoKSB7XHJcblxyXG4gICAgICAgICAgICBhdmFpbGFibGVOdW1iZXIudW5Vc2VkTnVtYmVyc1dpdGhEaWRzLmZvckVhY2goKG51bWJlcldpdGhEaWRzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZG4gPSBudW1iZXJXaXRoRGlkc1sndW5Vc2VkTnVtYmVyJ107XHJcbiAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlRGlkUGF0dGVybnNNYXBwZWRUb0RuW2RuXSA9IFt7fV07XHJcbiAgICAgICAgICAgIGlmIChudW1iZXJXaXRoRGlkc1sndHJhbnNsYXRpb25QYXR0ZXJuTGlzdCddICYmIG51bWJlcldpdGhEaWRzWyd0cmFuc2xhdGlvblBhdHRlcm5MaXN0J10ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG5bZG5dID0gbnVtYmVyV2l0aERpZHNbJ3RyYW5zbGF0aW9uUGF0dGVybkxpc3QnXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlRGlkUGF0dGVybnNNYXBwZWRUb0RuW2RuXVswXVsnbWFwcGVkRGlkcyddID0gW3t9XTtcclxuICAgICAgICAgICAgICAgIGlmIChudW1iZXJXaXRoRGlkc1snbWFwcGVkRGlkcyddICYmIG51bWJlcldpdGhEaWRzWydtYXBwZWREaWRzJ10ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVEaWRQYXR0ZXJuc01hcHBlZFRvRG5bZG5dWzBdWydtYXBwZWREaWRzJ10gPSBudW1iZXJXaXRoRGlkc1snbWFwcGVkRGlkcyddO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlRGlkUGF0dGVybnNNYXBwZWRUb0RuW2RuXVswXVsndm0nXSA9IG51bWJlcldpdGhEaWRzWyd2bSddO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVE9ETzogcmVwbGFjZSBwbGFjZWhvbGRlcnMgd2l0aCByZWFsIEFQSSBpbnRlZ3JhdGlvbi5cclxuICAgIGxvYWREYXRhRnJvbUFwaSgpOiB2b2lkIHtcclxuICAgICAgICAvLyB0aGlzLmFwaS5nZXRXaXphcmRCb290c3RyYXBEYXRhKCkuc3Vic2NyaWJlKC4uLilcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRMaW5lV2l0aFNpdGVJbmZvKGxpbmU6IExpbmVJbnRlcmZhY2UpIHtcclxuICAgICAgICBsaW5lLmRpcmVjdG9yeU51bWJlci5yb3V0ZVBhcnRpdGlvbk5hbWUgPSB0aGlzLnNpdGVEZWZhdWx0cz8ucm91dGVQYXJ0aXRpb24gfHwgJyc7XHJcbiAgICBcclxuICAgICAgICBsZXQgY2FsbGluZ1NlYXJjaFNwYWNlVmFsID0gdGhpcy5zaXRlRGVmYXVsdHM/LmxpbmVDc3MgfHwgJyc7XHJcbiAgICAgICAgbGluZS5jYWxsaW5nU2VhcmNoU3BhY2UgPSBjYWxsaW5nU2VhcmNoU3BhY2VWYWw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBpbml0VGVtcGxhdGVEbnNOYW1lc0ZvckxpbmVzKHVzZXJMaW5lczogVGVtcGxhdGVMaW5lTGlrZVtdKTogdm9pZCB7XHJcbiAgICAvLyAgICAgY29uc3Qgcm91dGVQYXJ0aXRpb24gPSB0aGlzLnNpdGVEZWZhdWx0cz8ucm91dGVQYXJ0aXRpb24gfHwgJyc7XHJcbiAgICAvLyAgICAgaWYgKHVzZXJMaW5lcyAmJiB1c2VyTGluZXMubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICB1c2VyTGluZXMuZm9yRWFjaCgobGluZSwgaW5kZXgpID0+IHtcclxuICAgIC8vICAgICAgICAgICAgIGxpbmUgJiYgbGluZS5kaXJlY3RvcnlOdW1iZXIgJiYgKGxpbmUuZGlyZWN0b3J5TnVtYmVyLnRlbXBsYXRlRGlyZWN0b3J5TnVtYmVyID0gbGluZS5kaXJlY3RvcnlOdW1iZXIuZGlyZWN0b3J5TnVtYmVyKTtcclxuICAgIC8vICAgICAgICAgICAgIGxpbmUgJiYgbGluZS5kaXJlY3RvcnlOdW1iZXIgJiYgKGxpbmUuZGlyZWN0b3J5TnVtYmVyLmRpcmVjdG9yeU51bWJlciA9ICcnKTtcclxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBsaW5lO1xyXG4gICAgLy8gICAgICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgICAgIC8vIGNvbnN0IHJvdXRlUGFydGl0aW9uID0gdGhpcy5zaXRlRGVmYXVsdHM/LnJvdXRlUGFydGl0aW9uIHx8ICcnO1xyXG4gICAgLy8gICAgICAgICAvLyBpZiAobGluZS5saW5lQXNzb2NpYXRpb25zICYmIGxpbmUubGluZUFzc29jaWF0aW9ucy5sZW5ndGgpIHtcclxuICAgIC8vICAgICAgICAgLy8gdGhpcy5zZXRMaW5lQXNzb2NpYXRpb25zRm9yRGV2aWNlKGxpbmUsIHJvdXRlUGFydGl0aW9uKTtcclxuICAgIC8vICAgICAgICAgLy8gfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICB0aGlzLnRlbXBsYXRlRGV2aWNlcy5mb3JFYWNoKGRldmljZSA9PiB7XHJcbiAgICAvLyAgICAgICAgIGlmIChkZXZpY2UubGluZUFzc29jaWF0aW9ucyAmJiBkZXZpY2UubGluZUFzc29jaWF0aW9ucy5sZW5ndGgpIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuc2V0TGluZUFzc29jaWF0aW9uc0ZvckRldmljZShkZXZpY2UsIHJvdXRlUGFydGl0aW9uKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG4gICAgXHJcbiAgICBcclxuICAgIHByaXZhdGUgc2V0TGluZUFzc29jaWF0aW9uc0ZvckRldmljZShkZXZpY2U6IFRlbXBsYXRlRGV2aWNlTGlrZSwgcm91dGVQYXJ0aXRpb246IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGxpbmVBc3NvY2lhdGlvbnMgPSBkZXZpY2UubGluZUFzc29jaWF0aW9ucyB8fCBbXTtcclxuICAgICAgICBpZihsaW5lQXNzb2NpYXRpb25zICYmIGxpbmVBc3NvY2lhdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxpbmVBc3NvY2lhdGlvbnMuZm9yRWFjaChsaW5lQXNzb2NpYXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgbGluZUFzc29jaWF0aW9uICYmIGxpbmVBc3NvY2lhdGlvbi5kaXJlY3RvcnlOdW1iZXIgJiYgKGxpbmVBc3NvY2lhdGlvbi5kaXJlY3RvcnlOdW1iZXIudGVtcGxhdGVEaXJlY3RvcnlOdW1iZXIgPSBsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyLmRpcmVjdG9yeU51bWJlciB8fCAnJyk7XHJcbiAgICAgICAgICAgICAgICBsaW5lQXNzb2NpYXRpb24gJiYgbGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlciAmJiAobGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlci5yb3V0ZVBhcnRpdGlvbk5hbWUgPSByb3V0ZVBhcnRpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBsaW5lQXNzb2NpYXRpb24gJiYgbGluZUFzc29jaWF0aW9uLmxvZ01pc3NlZENhbGwgJiYgKGxpbmVBc3NvY2lhdGlvbi5sb2dNaXNzZWRDYWxsID0gbGluZUFzc29jaWF0aW9uLmxvZ01pc3NlZENhbGwgfHwgJ2ZhbHNlJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXREZXZpY2VXaXRoU2l0ZUluZm8oZGV2aWNlOiBEZXZpY2VJbnRlcmZhY2UpIHtcclxuICAgICAgICBkZXZpY2UubmV3TmFtZSA9IGRldmljZS5uYW1lO1xyXG4gICAgICAgIGRldmljZS5uYW1lID0gJyc7XHJcbiAgICAgICAgaWYgKCFkZXZpY2VbJ2VuYWJsZWRFeHRlbnNpb25Nb2JpbGl0eSddKSB7XHJcbiAgICAgICAgZGV2aWNlLmVuYWJsZWRFeHRlbnNpb25Nb2JpbGl0eSA9IHRoaXMuc2l0ZURlZmF1bHRzPy5lbmFibGVFbSA/PyBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRldmljZVsnZW5hYmxlZEV4dGVuc2lvbk1vYmlsaXR5J10udG9TdHJpbmcoKSA9PT0gJ1llcycpIHtcclxuICAgICAgICBkZXZpY2UuZW5hYmxlZEV4dGVuc2lvbk1vYmlsaXR5ID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRldmljZVsnZW5hYmxlZEV4dGVuc2lvbk1vYmlsaXR5J10udG9TdHJpbmcoKSA9PT0gJ05vJykge1xyXG4gICAgICAgIGRldmljZS5lbmFibGVkRXh0ZW5zaW9uTW9iaWxpdHkgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkZXZpY2UubG9jYXRpb24pIHtcclxuICAgICAgICAgICAgY29uc3QgcmVwbGFjZWRWYWx1ZSA9IHRoaXMucmVwbGFjZUR5bmFtaWNWYWx1ZVNpdGVJbmZvKGRldmljZS5sb2NhdGlvbiwgdGhpcy5jdXJyZW50U2l0ZT8uc2hvcnROYW1lID8/ICcnKSA/PyBudWxsO1xyXG4gICAgICAgICAgICBkZXZpY2UubG9jYXRpb24gPSByZXBsYWNlZFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGV2aWNlLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VkVmFsdWUgPSB0aGlzLnJlcGxhY2VEeW5hbWljVmFsdWVTaXRlSW5mbyhkZXZpY2UuZGV2aWNlUG9vbE5hbWUsIHRoaXMuY3VycmVudFNpdGU/LnNob3J0TmFtZSA/PyAnJykgPz8gbnVsbDtcclxuICAgICAgICAgICAgZGV2aWNlLmRldmljZVBvb2xOYW1lID0gcmVwbGFjZWRWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRldmljZS5sb2NhdGlvbikge1xyXG4gICAgICAgICAgICBjb25zdCByZXBsYWNlZFZhbHVlID0gdGhpcy5yZXBsYWNlRHluYW1pY1ZhbHVlU2l0ZUluZm8oZGV2aWNlLmNhbGxpbmdTZWFyY2hTcGFjZU5hbWUsIHRoaXMuY3VycmVudFNpdGU/LnNob3J0TmFtZSA/PyAnJykgPz8gbnVsbDtcclxuICAgICAgICAgICAgZGV2aWNlLmNhbGxpbmdTZWFyY2hTcGFjZU5hbWUgPSByZXBsYWNlZFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGV2aWNlLmV4dHJhT3B0aW9ucykge1xyXG4gICAgICAgICAgICBjb25zdCByZXBsYWNlZFZhbHVlID0gdGhpcy5yZXBsYWNlRHluYW1pY1ZhbHVlU2l0ZUluZm8oZGV2aWNlLmV4dHJhT3B0aW9ucy5hYXJDc3MsIHRoaXMuY3VycmVudFNpdGU/LnNob3J0TmFtZSA/PyAnJykgPz8gbnVsbDtcclxuICAgICAgICAgICAgZGV2aWNlLmV4dHJhT3B0aW9ucy5hYXJDc3MgPSByZXBsYWNlZFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWRldmljZS5kZXNjcmlwdGlvbiAmJiB0aGlzLnNpdGVEZWZhdWx0cykge1xyXG4gICAgICAgICAgICBkZXZpY2UuZGVzY3JpcHRpb24gPSB0aGlzLnNpdGVEZWZhdWx0cy5kZXZpY2VEZXNjcmlwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXBsYWNlRHluYW1pY1ZhbHVlU2l0ZUluZm8oZmllbGRWYWx1ZTogYW55LCBzaXRlU2hvcnROYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICBpZiAoZmllbGRWYWx1ZSkge1xyXG4gICAgICAgIGZpZWxkVmFsdWUgPSB0aGlzLnJlcGxhY2VEeW5hbWljVmFsdWVGb3JtYXQoZmllbGRWYWx1ZSk7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zVG9SZXBsYWNlcyA9IHsgJ1NpdGVTaG9ydE5hbWUnOiBzaXRlU2hvcnROYW1lIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubXV0bGlTdHJpbmdSZXBsYWNlKHBhcmFtc1RvUmVwbGFjZXMsIGZpZWxkVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlcGxhY2VEeW5hbWljVmFsdWVGb3JtYXQoc3RyOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXFtGTlxcXS9pZywgJ1tGTl0nKS5yZXBsYWNlKC9cXFtMTlxcXS9pZywgJ1tMTl0nKS5yZXBsYWNlKC9cXFtJRFxcXS9pZywgJ1tVc2VySWRdJylcclxuICAgICAgICAucmVwbGFjZSgvXFxbVXNlcklkXFxdL2lnLCAnW1VzZXJJZF0nKS5yZXBsYWNlKC88TWF0Y2ggVXNlciBJRD4vaWcsICdbVXNlcklkXScpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcW0VtYWlsXFxdL2lnLCAnW0VtYWlsXScpLnJlcGxhY2UoL1xcW0ROXFwoL2lnLCAnW0ROKCcpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcW1NpdGVTaG9ydE5hbWVcXF0vaWcsICdbU2l0ZVNob3J0TmFtZV0nKS5yZXBsYWNlKC9cXCRcXChTaXRlU2hvcnROYW1lXFwpL2lnLCAnW1NpdGVTaG9ydE5hbWVdJylcclxuICAgICAgICAucmVwbGFjZSgvXFwkXFx7U2l0ZVNob3J0TmFtZVxcfS9pZywgJ1tTaXRlU2hvcnROYW1lXScpLnJlcGxhY2UoL3tTaXRlU2hvcnROYW1lfS9pZywgJ1tTaXRlU2hvcnROYW1lXScpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcW0ZOXFwoL2lnLCAnW0ZOKCcpLnJlcGxhY2UoL1xcW0xOXFwoL2lnLCAnW0xOKCcpXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcW0lEXFwoL2lnLCAnW0lEKCcpO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG11dGxpU3RyaW5nUmVwbGFjZShvYmplY3Q6IGFueSwgaW5wdXQ6IHN0cmluZywgZGlyZWN0b3J5TnVtYmVyPzogc3RyaW5nLCB1c2VyPzogYW55KTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgdmFsID0gaW5wdXQ7XHJcblxyXG4gICAgICAgIGlmICh2YWwuaW5jbHVkZXMoJ1tETl0nKSAmJiBkaXJlY3RvcnlOdW1iZXIgJiYgIWRpcmVjdG9yeU51bWJlci5pbmNsdWRlcygnTGluZScpKSB7XHJcbiAgICAgICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKCdbRE5dJywgZGlyZWN0b3J5TnVtYmVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBpbmRleE9mRE4gPSB2YWwuaW5kZXhPZignW0ROKCcpO1xyXG4gICAgICAgIGlmIChpbmRleE9mRE4gIT09IC0xICYmIGRpcmVjdG9yeU51bWJlcikge1xyXG4gICAgICAgICAgICB2YXIgZGlnaXQgPSB2YWwuc3Vic3RyaW5nKGluZGV4T2ZETiArIDQsIHZhbC5pbmRleE9mKCcpJywgaW5kZXhPZkROICsgNCkpO1xyXG4gICAgICAgICAgICB2YXIgZGlnaXRDb3VudCA9IE51bWJlcihkaWdpdCkgfHwgMDtcclxuICAgICAgICAgICAgdmFyIGRuRGlnaXQgPSAoZGlnaXRDb3VudCA+IHZhbC5sZW5ndGgpID8gZGlyZWN0b3J5TnVtYmVyIDogZGlyZWN0b3J5TnVtYmVyLnN1YnN0cmluZyhkaXJlY3RvcnlOdW1iZXIubGVuZ3RoIC0gZGlnaXRDb3VudCwgZGlyZWN0b3J5TnVtYmVyLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKCdbRE4oJyArIGRpZ2l0ICsgJyldJywgZG5EaWdpdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaW5kZXhPZkZOID0gdmFsLmluZGV4T2YoJ1tGTignKTtcclxuICAgICAgICBpZiAoaW5kZXhPZkZOICE9PSAtMSAmJiB1c2VyICYmIHVzZXIuZmlyc3ROYW1lKSB7XHJcbiAgICAgICAgICAgIHZhciBkaWdpdCA9IHZhbC5zdWJzdHJpbmcoaW5kZXhPZkZOICsgNCwgdmFsLmluZGV4T2YoJyknLCBpbmRleE9mRk4gKyA0KSk7XHJcbiAgICAgICAgICAgIHZhciBmbkRpZ2l0ID0gdXNlci5maXJzdE5hbWUuc3Vic3RyaW5nKDAsIGRpZ2l0KTtcclxuICAgICAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoJ1tGTignICsgZGlnaXQgKyAnKV0nLCBmbkRpZ2l0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGluZGV4T2ZMTiA9IHZhbC5pbmRleE9mKCdbTE4oJyk7XHJcbiAgICAgICAgaWYgKGluZGV4T2ZMTiAhPT0gLTEgJiYgdXNlciAmJiB1c2VyLmxhc3ROYW1lKSB7XHJcbiAgICAgICAgICAgIHZhciBkaWdpdCA9IHZhbC5zdWJzdHJpbmcoaW5kZXhPZkxOICsgNCwgdmFsLmluZGV4T2YoJyknLCBpbmRleE9mTE4gKyA0KSk7XHJcbiAgICAgICAgICAgIHZhciBsbkRpZ2l0ID0gdXNlci5sYXN0TmFtZS5zdWJzdHJpbmcoMCwgZGlnaXQpO1xyXG4gICAgICAgICAgICB2YWwgPSB2YWwucmVwbGFjZSgnW0xOKCcgKyBkaWdpdCArICcpXScsIGxuRGlnaXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaW5kZXhPZklEID0gdmFsLmluZGV4T2YoJ1tJRCgnKTtcclxuICAgICAgICBpZiAoaW5kZXhPZklEICE9PSAtMSAmJiB1c2VyICYmIHVzZXIudXNlcmlkKSB7XHJcbiAgICAgICAgICAgIHZhciBkaWdpdCA9IHZhbC5zdWJzdHJpbmcoaW5kZXhPZklEICsgNCwgdmFsLmluZGV4T2YoJyknLCBpbmRleE9mSUQgKyA0KSk7XHJcbiAgICAgICAgICAgIHZhciBpZERpZ2l0ID0gdXNlci51c2VyaWQuc3Vic3RyaW5nKDAsIGRpZ2l0KTtcclxuICAgICAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoJ1tJRCgnICsgZGlnaXQgKyAnKV0nLCBpZERpZ2l0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMob2JqZWN0KTtcclxuICAgICAgICBlbnRyaWVzLmZvckVhY2goKHBhcmEpID0+IHtcclxuICAgICAgICAgICAgdmFyIGZpbmQgPSAnWycgKyBwYXJhWzBdICsgJ10nO1xyXG4gICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBwYXJhWzFdICE9IG51bGwgPyBTdHJpbmcocGFyYVsxXSkgOiAnJztcclxuICAgICAgICAgICAgdmFsID0gdmFsLnNwbGl0KGZpbmQpLmpvaW4ocmVwbGFjZW1lbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0VGVtcGxhdGVEbnNOYW1lc0ZvckxpbmVzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmxpbmVzICYmIHRoaXMubGluZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVzLmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsaW5lLmRpcmVjdG9yeU51bWJlci50ZW1wbGF0ZURpcmVjdG9yeU51bWJlciA9IGxpbmUuZGlyZWN0b3J5TnVtYmVyLmRpcmVjdG9yeU51bWJlcjtcclxuICAgICAgICAgICAgICAgIGxpbmUuZGlyZWN0b3J5TnVtYmVyLmRpcmVjdG9yeU51bWJlciA9ICcnO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmU7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgcm91dGVQYXJ0aXRpb24gPSB0aGlzLnNpdGVEZWZhdWx0cz8ucm91dGVQYXJ0aXRpb24gfHwgJyc7XHJcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlcy5mb3JFYWNoKGRldmljZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLmxpbmVBc3NvY2lhdGlvbnMgJiYgZGV2aWNlLmxpbmVBc3NvY2lhdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldExpbmVBc3NvY2lhdGlvbnNGb3JEZXZpY2UoZGV2aWNlLCByb3V0ZVBhcnRpdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmRldmljZVByb2ZpbGVzLmZvckVhY2goZGV2aWNlUHJvZmlsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGV2aWNlUHJvZmlsZS5saW5lQXNzb2NpYXRpb25zICYmIGRldmljZVByb2ZpbGUubGluZUFzc29jaWF0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGluZUFzc29jaWF0aW9uc0ZvckRldmljZShkZXZpY2VQcm9maWxlLCByb3V0ZVBhcnRpdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZW5kVXNlcj8uc2luZ2xlTnVtYmVyUmVhY2ggJiYgdGhpcy5lbmRVc2VyLnNpbmdsZU51bWJlclJlYWNoLmFzc29jaWF0ZWRMaW5lcyAmJiB0aGlzLmVuZFVzZXIuc2luZ2xlTnVtYmVyUmVhY2guYXNzb2NpYXRlZExpbmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZW5kVXNlci5zaW5nbGVOdW1iZXJSZWFjaC5hc3NvY2lhdGVkTGluZXMgJiYgdGhpcy5lbmRVc2VyLnNpbmdsZU51bWJlclJlYWNoLmFzc29jaWF0ZWRMaW5lcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZFVzZXIuc2luZ2xlTnVtYmVyUmVhY2guYXNzb2NpYXRlZExpbmVzLm1hcChsaW5lQXNzb2NpYXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyLnRlbXBsYXRlRGlyZWN0b3J5TnVtYmVyID0gbGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlci5kaXJlY3RvcnlOdW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVBc3NvY2lhdGlvbi5kaXJlY3RvcnlOdW1iZXIucm91dGVQYXJ0aXRpb25OYW1lID0gcm91dGVQYXJ0aXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmRVc2VyLnNpbmdsZU51bWJlclJlYWNoLnJlbW90ZURlc3RpbmF0aW9ucyAmJiB0aGlzLmVuZFVzZXIuc2luZ2xlTnVtYmVyUmVhY2gucmVtb3RlRGVzdGluYXRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kVXNlci5zaW5nbGVOdW1iZXJSZWFjaC5yZW1vdGVEZXN0aW5hdGlvbnMuZm9yRWFjaChyZW1vdGVEZXN0aW5hdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdGVEZXN0aW5hdGlvbi5saW5lQXNzb2NpYXRpb25zICYmIHJlbW90ZURlc3RpbmF0aW9uLmxpbmVBc3NvY2lhdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVEZXN0aW5hdGlvbi5saW5lQXNzb2NpYXRpb25zLm1hcChsaW5lQXNzb2NpYXRpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVBc3NvY2lhdGlvbi5kaXJlY3RvcnlOdW1iZXIudGVtcGxhdGVEaXJlY3RvcnlOdW1iZXIgPSBsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyLmRpcmVjdG9yeU51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQXNzb2NpYXRpb24uZGlyZWN0b3J5TnVtYmVyLnJvdXRlUGFydGl0aW9uTmFtZSA9IHJvdXRlUGFydGl0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBidWlsZFNhdmFibGVFbmRVc2VyKCk6IEVuZFVzZXJJbnRlcmZhY2Uge1xyXG4gICAgICAgIGlmICghdGhpcy5lbmRVc2VyKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdGVtcGxhdGUgdXNlciBsb2FkZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJ1aWxkU2F2YWJsZUVuZFVzZXIoXHJcbiAgICAgICAgICAgIHRoaXMuZW5kVXNlcixcclxuICAgICAgICAgICAgdGhpcy5saW5lcyxcclxuICAgICAgICAgICAgdGhpcy5kZXZpY2VzLFxyXG4gICAgICAgICAgICB0aGlzLmRldmljZVByb2ZpbGVzLFxyXG4gICAgICAgICAgICB0aGlzLnVzZXJEZXRhaWxzRm9ybSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZURldmljZU5hbWU6IChpbmRleCwgZGV2aWNlKSA9PiB0aGlzLnJlc29sdmVEZXZpY2VOYW1lRm9yU2F2ZShpbmRleCwgZGV2aWNlKSxcclxuICAgICAgICAgICAgICAgIHJlc29sdmVEZXZpY2VQcm9maWxlTmFtZTogKGluZGV4LCBwcm9maWxlKSA9PiB0aGlzLnJlc29sdmVEZXZpY2VOYW1lRm9yU2F2ZShpbmRleCwgcHJvZmlsZSksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVzb2x2ZURldmljZU5hbWVGb3JTYXZlKF9pbmRleDogbnVtYmVyLCBkZXZpY2U6IERldmljZUludGVyZmFjZSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgcmF3TmFtZSA9IChkZXZpY2UubmFtZSB8fCBkZXZpY2UubmV3TmFtZSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgIGlmICghcmF3TmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGRldmljZS5wcmVmaXg/LnRyaW0oKTtcclxuICAgICAgICBpZiAocHJlZml4ICYmICFyYXdOYW1lLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChwcmVmaXgudG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke3Jhd05hbWV9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJhd05hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNhdmVOZXdVc2VyKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IHRoaXMuYnVpbGRTYXZhYmxlRW5kVXNlcigpO1xyXG4gICAgICAgIGNvbnN0IHNpdGVJZCA9IFN0cmluZyh0aGlzLnNlbGVjdGVkU2l0ZSA/PyAnJyk7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVJZCA9IFN0cmluZyh0aGlzLnNlbGVjdGVkVGVtcGxhdGVJZCA/PyAnJyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlckNyZWF0aW9uQXBpU2VydmljZS5zYXZlVGVtcGxhdGVVc2VyKHVzZXIsIHRlbXBsYXRlSWQsIHNpdGVJZCk7XHJcbiAgICB9XHJcbn0iXX0=