@c8y/ngx-components 1018.0.116 → 1018.0.137

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 (47) hide show
  1. package/context-dashboard/context-dashboard.model.d.ts +5 -0
  2. package/core/application/app-switcher.service.d.ts +1 -0
  3. package/core/dashboard/dashboard.model.d.ts +5 -0
  4. package/ecosystem/application-plugins/plugin-list.component.d.ts +1 -1
  5. package/esm2020/context-dashboard/context-dashboard.component.mjs +3 -3
  6. package/esm2020/context-dashboard/context-dashboard.model.mjs +1 -1
  7. package/esm2020/context-dashboard/dashboard-detail.component.mjs +1 -1
  8. package/esm2020/context-dashboard/report-dashboard/report-dashboard-list.component.mjs +3 -3
  9. package/esm2020/core/application/app-switcher.service.mjs +5 -1
  10. package/esm2020/core/common/group.service.mjs +2 -11
  11. package/esm2020/core/dashboard/dashboard.model.mjs +1 -1
  12. package/esm2020/core/dashboard/widgets-dashboard.component.mjs +5 -4
  13. package/esm2020/core/realtime/measurement-realtime.service.mjs +4 -2
  14. package/esm2020/device-profile/device-profile.component.mjs +4 -2
  15. package/esm2020/ecosystem/application-plugins/plugin-list.component.mjs +15 -7
  16. package/esm2020/register-device/device-registration-view.component.mjs +3 -3
  17. package/esm2020/widgets/implementations/kpi/kpi-widget-view/kpi-widget-view.component.mjs +2 -2
  18. package/fesm2015/c8y-ngx-components-context-dashboard.mjs +4 -4
  19. package/fesm2015/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  20. package/fesm2015/c8y-ngx-components-device-profile.mjs +3 -1
  21. package/fesm2015/c8y-ngx-components-device-profile.mjs.map +1 -1
  22. package/fesm2015/c8y-ngx-components-ecosystem-application-plugins.mjs +14 -8
  23. package/fesm2015/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  24. package/fesm2015/c8y-ngx-components-ecosystem.mjs +14 -8
  25. package/fesm2015/c8y-ngx-components-ecosystem.mjs.map +1 -1
  26. package/fesm2015/c8y-ngx-components-register-device.mjs +2 -2
  27. package/fesm2015/c8y-ngx-components-register-device.mjs.map +1 -1
  28. package/fesm2015/c8y-ngx-components-widgets-implementations-kpi.mjs +1 -1
  29. package/fesm2015/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
  30. package/fesm2015/c8y-ngx-components.mjs +34 -32
  31. package/fesm2015/c8y-ngx-components.mjs.map +1 -1
  32. package/fesm2020/c8y-ngx-components-context-dashboard.mjs +4 -4
  33. package/fesm2020/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  34. package/fesm2020/c8y-ngx-components-device-profile.mjs +3 -1
  35. package/fesm2020/c8y-ngx-components-device-profile.mjs.map +1 -1
  36. package/fesm2020/c8y-ngx-components-ecosystem-application-plugins.mjs +14 -6
  37. package/fesm2020/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  38. package/fesm2020/c8y-ngx-components-ecosystem.mjs +14 -6
  39. package/fesm2020/c8y-ngx-components-ecosystem.mjs.map +1 -1
  40. package/fesm2020/c8y-ngx-components-register-device.mjs +2 -2
  41. package/fesm2020/c8y-ngx-components-register-device.mjs.map +1 -1
  42. package/fesm2020/c8y-ngx-components-widgets-implementations-kpi.mjs +1 -1
  43. package/fesm2020/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
  44. package/fesm2020/c8y-ngx-components.mjs +33 -32
  45. package/fesm2020/c8y-ngx-components.mjs.map +1 -1
  46. package/package.json +1 -1
  47. package/widgets/implementations/kpi/kpi-widget-view/kpi-widget-view.component.d.ts +2 -2
@@ -114,7 +114,7 @@ export class PluginListComponent {
114
114
  if (updateType === 'install') {
115
115
  this.appsDisabled.clear();
116
116
  for (const app of apps) {
117
- if (await this.isPluginInstalledInApp(plugin, app)) {
117
+ if (this.isPluginInstalledInApp(plugin, app)) {
118
118
  this.appsDisabled.add(app.id);
119
119
  }
120
120
  }
@@ -122,7 +122,7 @@ export class PluginListComponent {
122
122
  if (updateType === 'uninstall') {
123
123
  const installedApps = [];
124
124
  for (const app of apps) {
125
- if (await this.isPluginInstalledInApp(plugin, app)) {
125
+ if (this.isPluginInstalledInApp(plugin, app)) {
126
126
  installedApps.push(app);
127
127
  }
128
128
  }
@@ -130,11 +130,18 @@ export class PluginListComponent {
130
130
  }
131
131
  return apps;
132
132
  }
133
- async isPluginInstalledInApp(plugin, app) {
133
+ isPluginInstalledInApp(plugin, app) {
134
134
  const appRemotes = this.pluginsService.getMFRemotes(app) || {};
135
- return Object.keys(appRemotes).some(remote => this.getInstalledPluginContextPathWithoutVersion(remote) === plugin.contextPath);
135
+ for (const [remoteName, modules] of Object.entries(appRemotes)) {
136
+ const pluginFromThisPackageIsInstalled = this.getPluginContextPathWithoutVersion(remoteName) === plugin.contextPath;
137
+ const specificPluginModuleIsInstalled = modules.some(module => module === plugin.module);
138
+ if (pluginFromThisPackageIsInstalled && specificPluginModuleIsInstalled) {
139
+ return true;
140
+ }
141
+ }
142
+ return false;
136
143
  }
137
- getInstalledPluginContextPathWithoutVersion(remote) {
144
+ getPluginContextPathWithoutVersion(remote) {
138
145
  return remote.split('@')[0];
139
146
  }
140
147
  async handleRemotesUpdate(application, plugin, updateType) {
@@ -179,7 +186,8 @@ export class PluginListComponent {
179
186
  ariaDescribedby: 'modal-body',
180
187
  ariaLabelledBy: 'modal-title',
181
188
  initialState,
182
- ignoreBackdropClick: true
189
+ ignoreBackdropClick: true,
190
+ keyboard: false
183
191
  }).content.result;
184
192
  }
185
193
  catch (er) {
@@ -205,4 +213,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
205
213
  }], selectedItems: [{
206
214
  type: Output
207
215
  }] } });
208
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZWNvc3lzdGVtL2FwcGxpY2F0aW9uLXBsdWdpbnMvcGx1Z2luLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vZWNvc3lzdGVtL2FwcGxpY2F0aW9uLXBsdWdpbnMvcGx1Z2luLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQTRCLGVBQWUsRUFBZ0IsTUFBTSxhQUFhLENBQUM7QUFDdEYsT0FBTyxFQUNMLFlBQVksRUFFWixnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLE9BQU8sRUFDUixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7Ozs7QUFPL0YsTUFBTSxPQUFPLG1CQUFtQjtJQWlCOUIsWUFDVSxnQkFBa0MsRUFDbEMsY0FBOEIsRUFDOUIsY0FBOEIsRUFDOUIsWUFBMEIsRUFDMUIsZ0JBQWtDLEVBQ2xDLGdCQUFrQztRQUxsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIs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LFVBQVUsQ0FDdEIsWUFHQztRQUVELElBQUk7WUFDRixPQUFPLE1BQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUU7Z0JBQzNELEtBQUssRUFBRSxVQUFVO2dCQUNqQixlQUFlLEVBQUUsWUFBWTtnQkFDN0IsY0FBYyxFQUFFLGFBQWE7Z0JBQzdCLFlBQVk7Z0JBQ1osbUJBQW1CLEVBQUUsSUFBSTthQUMxQixDQUFDLENBQUMsT0FDSixDQUFDLE1BQU0sQ0FBQztTQUNWO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDWCxPQUFPO1NBQ1I7SUFDSCxDQUFDOztnSEFyTlUsbUJBQW1CO29HQUFuQixtQkFBbUIsZ1BDcEJoQyx1d0RBOENBOzJGRDFCYSxtQkFBbUI7a0JBSi9CLFNBQVM7K0JBQ0UsaUJBQWlCOzBQQU1sQixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFJRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucywgQXBwbGljYXRpb25UeXBlLCBJQXBwbGljYXRpb24gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBBbGVydFNlcnZpY2UsXG4gIEFwcGxpY2F0aW9uUGx1Z2luLFxuICBHYWluc2lnaHRTZXJ2aWNlLFxuICBQbHVnaW5zU2VydmljZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEVjb3N5c3RlbVNlcnZpY2UsIFBST0RVQ1RfRVhQRVJJRU5DRSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZWNvc3lzdGVtL3NoYXJlZCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBcHBzVG9VcGRhdGVSZW1vdGVzU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9hcHBzLXRvLXVwZGF0ZS1yZW1vdGVzLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXBkYXRlVHlwZSB9IGZyb20gJy4vYXBwcy10by11cGRhdGUtcmVtb3Rlcy1zZWxlY3QubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktcGx1Z2luLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGx1Z2luLWxpc3QuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFBsdWdpbkxpc3RDb21wb25lbnQge1xuICBDVVJSRU5UX0xPQ0FUSU9OID0gbG9jYXRpb24uaHJlZjtcblxuICBASW5wdXQoKSBwbHVnaW5zJDogT2JzZXJ2YWJsZTxBcHBsaWNhdGlvblBsdWdpbltdPjtcbiAgQElucHV0KCkgZW1wdHlMaXN0VGV4dCA9ICcnO1xuICBASW5wdXQoKSBzZWxlY3RhYmxlOiBib29sZWFuO1xuICAvKipcbiAgICogU2hvd3MgdGhlIGluc3RhbGwgYnV0dG9uIGZvciBlYWNoIHBsdWdpbiBzZXBhcmF0ZWx5LiBDdXJyZW50bHkgdXNlZCBpbiBwYWNrYWdlLWRldGFpbHMgdmlldy5cbiAgICovXG4gIEBJbnB1dCgpIGluc3RhbGxhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhY2thZ2U6IElBcHBsaWNhdGlvbjtcbiAgQE91dHB1dCgpIHNlbGVjdGVkSXRlbXM6IEV2ZW50RW1pdHRlcjxBcHBsaWNhdGlvblBsdWdpbltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcmVtb3RlUGx1Z2lucyQ6IEJlaGF2aW9yU3ViamVjdDxBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnM+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7fSk7XG4gIHNlbGVjdGVkUGx1Z2luczogeyBba2V5OiBzdHJpbmddOiBBcHBsaWNhdGlvblBsdWdpbiB9ID0ge307XG4gIHVwZGF0aW5nUGx1Z2luSWQ6IFJlY29yZDxVcGRhdGVUeXBlLCBzdHJpbmc+ID0geyBpbnN0YWxsOiAnJywgdW5pbnN0YWxsOiAnJyB9O1xuICBhcHBzRGlzYWJsZWQ6IFNldDxJQXBwbGljYXRpb25bJ2lkJ10+ID0gbmV3IFNldDxJQXBwbGljYXRpb25bJ2lkJ10+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlY29zeXN0ZW1TZXJ2aWNlOiBFY29zeXN0ZW1TZXJ2aWNlLFxuICAgIHByaXZhdGUgYnNNb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGx1Z2luc1NlcnZpY2U6IFBsdWdpbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ2FpbnNpZ2h0U2VydmljZTogR2FpbnNpZ2h0U2VydmljZVxuICApIHt9XG5cbiAgdXBkYXRlU2VsZWN0ZWRJdGVtcyhzZWxlY3RlZDogYm9vbGVhbiwgcGx1Z2luOiBBcHBsaWNhdGlvblBsdWdpbikge1xuICAgIHRoaXMuc2VsZWN0ZWRQbHVnaW5zW3BsdWdpbi5pZF0gPSBzZWxlY3RlZCA/IHBsdWdpbiA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvbmx5SW5zdGFsbGVkUGx1Z2lucyA9IE9iamVjdC52YWx1ZXModGhpcy5zZWxlY3RlZFBsdWdpbnMpLmZpbHRlcihCb29sZWFuKTtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZW1pdChvbmx5SW5zdGFsbGVkUGx1Z2lucyk7XG4gIH1cblxuICBhc3luYyBpbnN0YWxsUGx1Z2luKHBsdWdpbjogQXBwbGljYXRpb25QbHVnaW4pIHtcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZUFwcFJlbW90ZXMocGx1Z2luLCAnaW5zdGFsbCcpO1xuICB9XG5cbiAgYXN5bmMgdW5pbnN0YWxsUGx1Z2luKHBsdWdpbjogQXBwbGljYXRpb25QbHVnaW4pIHtcbiAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KFBST0RVQ1RfRVhQRVJJRU5DRS5BUFBMSUNBVElPTlMuRVZFTlRTLlBBQ0tBR0VfUExVR0lOUywge1xuICAgICAgY29tcG9uZW50OiBQUk9EVUNUX0VYUEVSSUVOQ0UuQVBQTElDQVRJT05TLkNPTVBPTkVOVFMuUExVR0lOX0xJU1QsXG4gICAgICBhY3Rpb246IFBST0RVQ1RfRVhQRVJJRU5DRS5BUFBMSUNBVElPTlMuQUNUSU9OUy5JTlNUQUxMX1BMVUdJTixcbiAgICAgIHVybDogdGhpcy5DVVJSRU5UX0xPQ0FUSU9OXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVBcHBSZW1vdGVzKHBsdWdpbiwgJ3VuaW5zdGFsbCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBcHBSZW1vdGVzKHBsdWdpbjogQXBwbGljYXRpb25QbHVnaW4sIHVwZGF0ZVR5cGU6IFVwZGF0ZVR5cGUpIHtcbiAgICB0aGlzLnVwZGF0aW5nUGx1Z2luSWRbdXBkYXRlVHlwZV0gPSBwbHVnaW4/LmlkO1xuICAgIGxldCBpbml0aWFsU3RhdGU6IFBpY2s8XG4gICAgICBBcHBzVG9VcGRhdGVSZW1vdGVzU2VsZWN0Q29tcG9uZW50LFxuICAgICAgJ2FwcHMnIHwgJ3VwZGF0ZVR5cGUnIHwgJ3BsdWdpbk5hbWUnIHwgJ2FwcHNEaXNhYmxlZCdcbiAgICA+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcHBzID0gYXdhaXQgdGhpcy5nZXRBcHBzRm9yVXBkYXRlKHBsdWdpbiwgdXBkYXRlVHlwZSk7XG4gICAgICBpbml0aWFsU3RhdGUgPSB7XG4gICAgICAgIGFwcHMsXG4gICAgICAgIHVwZGF0ZVR5cGUsXG4gICAgICAgIHBsdWdpbk5hbWU6IHBsdWdpbi5uYW1lLFxuICAgICAgICBhcHBzRGlzYWJsZWQ6IHRoaXMuYXBwc0Rpc2FibGVkXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZSk7XG4gICAgICB0aGlzLnVwZGF0aW5nUGx1Z2luSWRbdXBkYXRlVHlwZV0gPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgc2VsZWN0ZWRBcHBzOiBJQXBwbGljYXRpb25bXTtcbiAgICB0cnkge1xuICAgICAgc2VsZWN0ZWRBcHBzID0gYXdhaXQgdGhpcy5zZWxlY3RBcHBzKGluaXRpYWxTdGF0ZSk7XG4gICAgICBpZiAoIXNlbGVjdGVkQXBwcykge1xuICAgICAgICB0aGlzLnVwZGF0aW5nUGx1Z2luSWRbdXBkYXRlVHlwZV0gPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gdW5yZWFjaGVkXG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZVR5cGUgPT09ICdpbnN0YWxsJykge1xuICAgICAgY29uc3QgbGljZW5zZXNWZXJpZmllZEJ5VXNlciA9IGF3YWl0IHRoaXMuZWNvc3lzdGVtU2VydmljZS52ZXJpZnlMaWNlbnNlcyhbcGx1Z2luXSk7XG4gICAgICBpZiAoIWxpY2Vuc2VzVmVyaWZpZWRCeVVzZXIpIHtcbiAgICAgICAgdGhpcy51cGRhdGluZ1BsdWdpbklkW3VwZGF0ZVR5cGVdID0gJyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFwcCBvZiBzZWxlY3RlZEFwcHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlUmVtb3Rlc1VwZGF0ZShhcHAsIHBsdWdpbiwgdXBkYXRlVHlwZSk7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NUZXh0ID1cbiAgICAgICAgICB1cGRhdGVUeXBlID09PSAnaW5zdGFsbCdcbiAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnUGx1Z2luIGluc3RhbGxlZCB0byBhcHAgXCJ7eyBhcHBOYW1lIH19XCIuJyksIHtcbiAgICAgICAgICAgICAgICBhcHBOYW1lOiBhcHAubmFtZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgICBnZXR0ZXh0KCdQbHVnaW4gdW5pbnN0YWxsZWQgZnJvbSBhcHAgXCJ7eyBhcHBOYW1lIH19XCIuJyksXG4gICAgICAgICAgICAgICAgeyBhcHBOYW1lOiBhcHAubmFtZSB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3Moc3VjY2Vzc1RleHQpO1xuICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KFBST0RVQ1RfRVhQRVJJRU5DRS5BUFBMSUNBVElPTlMuRVZFTlRTLlBBQ0tBR0VfUExVR0lOUywge1xuICAgICAgICAgIGNvbXBvbmVudDogUFJPRFVDVF9FWFBFUklFTkNFLkFQUExJQ0FUSU9OUy5DT01QT05FTlRTLlBMVUdJTl9MSVNULFxuICAgICAgICAgIHJlc3VsdDogUFJPRFVDVF9FWFBFUklFTkNFLkFQUExJQ0FUSU9OUy5SRVNVTFRTLlBMVUdJTl9JTlNUQUxMRUQsXG4gICAgICAgICAgdXJsOiB0aGlzLkNVUlJFTlRfTE9DQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChQUk9EVUNUX0VYUEVSSUVOQ0UuQVBQTElDQVRJT05TLkVWRU5UUy5QQUNLQUdFX1BMVUdJTlMsIHtcbiAgICAgICAgICBjb21wb25lbnQ6IFBST0RVQ1RfRVhQRVJJRU5DRS5BUFBMSUNBVElPTlMuQ09NUE9ORU5UUy5QTFVHSU5fTElTVCxcbiAgICAgICAgICByZXN1bHQ6IFBST0RVQ1RfRVhQRVJJRU5DRS5BUFBMSUNBVElPTlMuUkVTVUxUUy5TRVJWRVJfRkFJTFVSRSxcbiAgICAgICAgICB1cmw6IHRoaXMuQ1VSUkVOVF9MT0NBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGluZ1BsdWdpbklkW3VwZGF0ZVR5cGVdID0gJyc7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEFwcHNGb3JVcGRhdGUocGx1Z2luOiBBcHBsaWNhdGlvblBsdWdpbiwgdXBkYXRlVHlwZTogVXBkYXRlVHlwZSkge1xuICAgIGxldCBhcHBzID0gKGF3YWl0IHRoaXMuZWNvc3lzdGVtU2VydmljZS5nZXRXZWJBcHBsaWNhdGlvbnMoKSkuZmlsdGVyKFxuICAgICAgYXBwID0+IHRoaXMuZWNvc3lzdGVtU2VydmljZS5pc093bmVyKGFwcCkgJiYgYXBwLnR5cGUgIT09IEFwcGxpY2F0aW9uVHlwZS5FWFRFUk5BTFxuICAgICk7XG5cbiAgICBpZiAodXBkYXRlVHlwZSA9PT0gJ2luc3RhbGwnKSB7XG4gICAgICB0aGlzLmFwcHNEaXNhYmxlZC5jbGVhcigpO1xuICAgICAgZm9yIChjb25zdCBhcHAgb2YgYXBwcykge1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5pc1BsdWdpbkluc3RhbGxlZEluQXBwKHBsdWdpbiwgYXBwKSkge1xuICAgICAgICAgIHRoaXMuYXBwc0Rpc2FibGVkLmFkZChhcHAuaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZVR5cGUgPT09ICd1bmluc3RhbGwnKSB7XG4gICAgICBjb25zdCBpbnN0YWxsZWRBcHBzOiBJQXBwbGljYXRpb25bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhcHAgb2YgYXBwcykge1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5pc1BsdWdpbkluc3RhbGxlZEluQXBwKHBsdWdpbiwgYXBwKSkge1xuICAgICAgICAgIGluc3RhbGxlZEFwcHMucHVzaChhcHApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhcHBzID0gaW5zdGFsbGVkQXBwcztcbiAgICB9XG4gICAgcmV0dXJuIGFwcHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGlzUGx1Z2luSW5zdGFsbGVkSW5BcHAoXG4gICAgcGx1Z2luOiBBcHBsaWNhdGlvblBsdWdpbixcbiAgICBhcHA6IElBcHBsaWNhdGlvblxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhcHBSZW1vdGVzID0gdGhpcy5wbHVnaW5zU2VydmljZS5nZXRNRlJlbW90ZXMoYXBwKSB8fCB7fTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYXBwUmVtb3Rlcykuc29tZShcbiAgICAgIHJlbW90ZSA9PiB0aGlzLmdldEluc3RhbGxlZFBsdWdpbkNvbnRleHRQYXRoV2l0aG91dFZlcnNpb24ocmVtb3RlKSA9PT0gcGx1Z2luLmNvbnRleHRQYXRoXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5zdGFsbGVkUGx1Z2luQ29udGV4dFBhdGhXaXRob3V0VmVyc2lvbihyZW1vdGU6IHN0cmluZykge1xuICAgIHJldHVybiByZW1vdGUuc3BsaXQoJ0AnKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUmVtb3Rlc1VwZGF0ZShcbiAgICBhcHBsaWNhdGlvbjogSUFwcGxpY2F0aW9uLFxuICAgIHBsdWdpbjogQXBwbGljYXRpb25QbHVnaW4sXG4gICAgdXBkYXRlVHlwZTogVXBkYXRlVHlwZVxuICApIHtcbiAgICB0cnkge1xuICAgICAgLy8gV2hlbiByZW1vdGVzIG9iamVjdCBpcyBub3Qgc2V0IGluIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBvZiBhbiBhcHBsaWNhdGlvbi5cbiAgICAgIC8vIEZhbGxiYWNrIHRvIHNldEluaXRpYWxSZW1vdGVzIGlzIHRyaWdnZXJlZC5cbiAgICAgIGxldCB1cGRhdGVkUmVtb3RlcyA9IGF3YWl0ICh1cGRhdGVUeXBlID09PSAnaW5zdGFsbCdcbiAgICAgICAgPyB0aGlzLnBsdWdpbnNTZXJ2aWNlLmFkZFJlbW90ZXMoYXBwbGljYXRpb24sIHBsdWdpbilcbiAgICAgICAgOiB0aGlzLnBsdWdpbnNTZXJ2aWNlLnJlbW92ZVJlbW90ZXMoYXBwbGljYXRpb24sIHRoaXMuZ2V0QWxsUGx1Z2luc1RvUmVtb3ZlKHBsdWdpbikpKTtcbiAgICAgIGlmICghdXBkYXRlZFJlbW90ZXMpIHtcbiAgICAgICAgLy8gVE9ETyBkaXNjdXNzIGlmIHdlIG5lZWQgdG8gaGFuZGxlIGl0IGxpa2UgdGhhdC5cbiAgICAgICAgLy8gUmlnaHQgbm93IHJlbW90ZXMgZnJvbSB0aGUgY3VtdWxvY2l0eS5qc29uIGFyZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiByZW1vdGVzIG9iamVjdCBpcyBtaXNzaW5nIGluIHRoZSBjb25maWd1cmF0aW9uLlxuICAgICAgICB1cGRhdGVkUmVtb3RlcyA9IGF3YWl0IHRoaXMucGx1Z2luc1NlcnZpY2Uuc2V0SW5pdGlhbFJlbW90ZXMoYXBwbGljYXRpb24pO1xuICAgICAgICAvLyBGcmVzaCBhcHBsaWNhdGlvbiBNTyBpcyBuZWVkZWQsIGFmdGVyIGluaXRpYWwgc3RhdGUgd2FzIHNldC5cbiAgICAgICAgY29uc3QgYXBwID0gYXdhaXQgdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmdldEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uLmlkKTtcbiAgICAgICAgdXBkYXRlZFJlbW90ZXMgPSBhd2FpdCB0aGlzLnBsdWdpbnNTZXJ2aWNlLmFkZFJlbW90ZXMoYXBwLCBwbHVnaW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZW1pdFJlbW90ZXModXBkYXRlZFJlbW90ZXMpO1xuICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICBpZiAoZXIpIHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEFsbFBsdWdpbnNUb1JlbW92ZShwbHVnaW46IEFwcGxpY2F0aW9uUGx1Z2luKTogQXBwbGljYXRpb25QbHVnaW5bXSB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZS5hcHBsaWNhdGlvblZlcnNpb25zLm1hcChhdiA9PiAoe1xuICAgICAgaWQ6IGAke3BsdWdpbi5jb250ZXh0UGF0aH1AJHthdi52ZXJzaW9ufS8ke3BsdWdpbi5tb2R1bGV9YCxcbiAgICAgIG1vZHVsZTogcGx1Z2luLm1vZHVsZSxcbiAgICAgIHBhdGg6IHBsdWdpbi5wYXRoXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0UmVtb3RlcyhyZW1vdGVzOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMpOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMge1xuICAgIHRoaXMucmVtb3RlUGx1Z2lucyQubmV4dChyZW1vdGVzKTtcbiAgICByZXR1cm4geyAuLi50aGlzLnJlbW90ZVBsdWdpbnMkLnZhbHVlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbGVjdEFwcHMoXG4gICAgaW5pdGlhbFN0YXRlOiBQaWNrPFxuICAgICAgQXBwc1RvVXBkYXRlUmVtb3Rlc1NlbGVjdENvbXBvbmVudCxcbiAgICAgICdhcHBzJyB8ICd1cGRhdGVUeXBlJyB8ICdwbHVnaW5OYW1lJyB8ICdhcHBzRGlzYWJsZWQnXG4gICAgPlxuICApOiBQcm9taXNlPElBcHBsaWNhdGlvbltdPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCAoXG4gICAgICAgIHRoaXMuYnNNb2RhbFNlcnZpY2Uuc2hvdyhBcHBzVG9VcGRhdGVSZW1vdGVzU2VsZWN0Q29tcG9uZW50LCB7XG4gICAgICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnbW9kYWwtYm9keScsXG4gICAgICAgICAgYXJpYUxhYmVsbGVkQnk6ICdtb2RhbC10aXRsZScsXG4gICAgICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWVcbiAgICAgICAgfSkuY29udGVudCBhcyBBcHBzVG9VcGRhdGVSZW1vdGVzU2VsZWN0Q29tcG9uZW50XG4gICAgICApLnJlc3VsdDtcbiAgICB9IGNhdGNoIChlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuIiwiPGM4eS1saXN0LWdyb3VwIGNsYXNzPVwiYmctaW5oZXJpdFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHBsdWdpbnMkIHwgYXN5bmMpPy5sZW5ndGggIT09IDA7IGVsc2UgZW1wdHlMaXN0XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcGx1Z2luIG9mIHBsdWdpbnMkIHwgYXN5bmNcIj5cbiAgICAgIDxjOHktbGkgW25nQ2xhc3NdPVwieyBkaXNhYmxlZDogcGx1Z2luLmluc3RhbGxlZCB9XCIgY2xhc3M9XCJiZy1pbmhlcml0XCI+XG4gICAgICAgIDxjOHktcGx1Z2luLWxpc3QtaXRlbVxuICAgICAgICAgIChpc0l0ZW1TZWxlY3RlZCk9XCJ1cGRhdGVTZWxlY3RlZEl0ZW1zKCRldmVudCwgcGx1Z2luKVwiXG4gICAgICAgICAgW3BsdWdpbl09XCJwbHVnaW5cIlxuICAgICAgICAgIFtzZWxlY3RhYmxlXT1cInNlbGVjdGFibGVcIlxuICAgICAgICAgIGNsYXNzPVwiZC1mbGV4XCJcbiAgICAgICAgPjwvYzh5LXBsdWdpbi1saXN0LWl0ZW0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLWwtNDAgbS10LTRcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImluc3RhbGxhYmxlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ1bmluc3RhbGxQbHVnaW4ocGx1Z2luKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdidG4tcGVuZGluZyc6IHBsdWdpbi5pZCA9PT0gdXBkYXRpbmdQbHVnaW5JZC51bmluc3RhbGwgfVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidXBkYXRpbmdQbHVnaW5JZC51bmluc3RhbGwgJiYgcGx1Z2luLmlkICE9PSB1cGRhdGluZ1BsdWdpbklkLnVuaW5zdGFsbFwiXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGFuZ2VyIGJ0bi1zbSBtLWwtNFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdVbmluc3RhbGwgcGx1Z2luJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICBVbmluc3RhbGwgcGx1Z2luXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJpbnN0YWxsYWJsZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaW5zdGFsbFBsdWdpbihwbHVnaW4pXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2J0bi1wZW5kaW5nJzogcGx1Z2luLmlkID09PSB1cGRhdGluZ1BsdWdpbklkLmluc3RhbGwgfVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidXBkYXRpbmdQbHVnaW5JZC5pbnN0YWxsICYmIHBsdWdpbi5pZCAhPT0gdXBkYXRpbmdQbHVnaW5JZC5pbnN0YWxsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBtLWwtOFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdJbnN0YWxsIHBsdWdpbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgSW5zdGFsbCBwbHVnaW5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2M4eS1saT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2M4eS1saXN0LWdyb3VwPlxuPG5nLXRlbXBsYXRlICNlbXB0eUxpc3Q+XG4gIDxkaXYgY2xhc3M9XCJjOHktZW1wdHktc3RhdGUgdGV4dC1sZWZ0XCIgKm5nSWY9XCJlbXB0eUxpc3RUZXh0XCI+XG4gICAgPGgxIGM4eUljb249XCJwbHVnaW5cIj48L2gxPlxuICAgIDxwPlxuICAgICAge3sgZW1wdHlMaXN0VGV4dCB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvcD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZWNvc3lzdGVtL2FwcGxpY2F0aW9uLXBsdWdpbnMvcGx1Z2luLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vZWNvc3lzdGVtL2FwcGxpY2F0aW9uLXBsdWdpbnMvcGx1Z2luLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQTRCLGVBQWUsRUFBZ0IsTUFBTSxhQUFhLENBQUM7QUFDdEYsT0FBTyxFQUNMLFlBQVksRUFFWixnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLE9BQU8sRUFDUixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7Ozs7QUFPL0YsTUFBTSxPQUFPLG1CQUFtQjtJQWlCOUIsWUFDVSxnQkFBa0MsRUFDbEMsY0FBOEIsRUFDOUIsY0FBOEIsRUFDOUIsWUFBMEIsRUFDMUIsZ0JBQWtDLEVBQ2xDLGdCQUFrQztRQUxsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIs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O1NBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLFdBQVcsQ0FBQyxPQUFpQztRQUNuRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVSxDQUN0QixZQUdDO1FBRUQsSUFBSTtZQUNGLE9BQU8sTUFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsRUFBRTtnQkFDM0QsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLGVBQWUsRUFBRSxZQUFZO2dCQUM3QixjQUFjLEVBQUUsYUFBYTtnQkFDN0IsWUFBWTtnQkFDWixtQkFBbUIsRUFBRSxJQUFJO2dCQUN6QixRQUFRLEVBQUUsS0FBSzthQUNoQixDQUFDLENBQUMsT0FDSixDQUFDLE1BQU0sQ0FBQztTQUNWO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDWCxPQUFPO1NBQ1I7SUFDSCxDQUFDOztnSEExTlUsbUJBQW1CO29HQUFuQixtQkFBbUIsZ1BDcEJoQyx1d0RBOENBOzJGRDFCYSxtQkFBbUI7a0JBSi9CLFNBQVM7K0JBQ0UsaUJBQWlCOzBQQU1sQixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFJRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucywgQXBwbGljYXRpb25UeXBlLCBJQXBwbGljYXRpb24gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBBbGVydFNlcnZpY2UsXG4gIEFwcGxpY2F0aW9uUGx1Z2luLFxuICBHYWluc2lnaHRTZXJ2aWNlLFxuICBQbHVnaW5zU2VydmljZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEVjb3N5c3RlbVNlcnZpY2UsIFBST0RVQ1RfRVhQRVJJRU5DRSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZWNvc3lzdGVtL3NoYXJlZCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBcHBzVG9VcGRhdGVSZW1vdGVzU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9hcHBzLXRvLXVwZGF0ZS1yZW1vdGVzLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXBkYXRlVHlwZSB9IGZyb20gJy4vYXBwcy10by11cGRhdGUtcmVtb3Rlcy1zZWxlY3QubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktcGx1Z2luLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGx1Z2luLWxpc3QuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFBsdWdpbkxpc3RDb21wb25lbnQge1xuICBDVVJSRU5UX0xPQ0FUSU9OID0gbG9jYXRpb24uaHJlZjtcblxuICBASW5wdXQoKSBwbHVnaW5zJDogT2JzZXJ2YWJsZTxBcHBsaWNhdGlvblBsdWdpbltdPjtcbiAgQElucHV0KCkgZW1wdHlMaXN0VGV4dCA9ICcnO1xuICBASW5wdXQoKSBzZWxlY3RhYmxlOiBib29sZWFuO1xuICAvKipcbiAgICogU2hvd3MgdGhlIGluc3RhbGwgYnV0dG9uIGZvciBlYWNoIHBsdWdpbiBzZXBhcmF0ZWx5LiBDdXJyZW50bHkgdXNlZCBpbiBwYWNrYWdlLWRldGFpbHMgdmlldy5cbiAgICovXG4gIEBJbnB1dCgpIGluc3RhbGxhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhY2thZ2U6IElBcHBsaWNhdGlvbjtcbiAgQE91dHB1dCgpIHNlbGVjdGVkSXRlbXM6IEV2ZW50RW1pdHRlcjxBcHBsaWNhdGlvblBsdWdpbltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcmVtb3RlUGx1Z2lucyQ6IEJlaGF2aW9yU3ViamVjdDxBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnM+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7fSk7XG4gIHNlbGVjdGVkUGx1Z2luczogeyBba2V5OiBzdHJpbmddOiBBcHBsaWNhdGlvblBsdWdpbiB9ID0ge307XG4gIHVwZGF0aW5nUGx1Z2luSWQ6IFJlY29yZDxVcGRhdGVUeXBlLCBzdHJpbmc+ID0geyBpbnN0YWxsOiAnJywgdW5pbnN0YWxsOiAnJyB9O1xuICBhcHBzRGlzYWJsZWQ6IFNldDxJQXBwbGljYXRpb25bJ2lkJ10+ID0gbmV3IFNldDxJQXBwbGljYXRpb25bJ2lkJ10+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlY29zeXN0ZW1TZXJ2aWNlOiBFY29zeXN0ZW1TZXJ2aWNlLFxuICAgIHByaXZhdGUgYnNNb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGx1Z2luc1NlcnZpY2U6IFBsdWdpbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ2FpbnNpZ2h0U2VydmljZTogR2FpbnNpZ2h0U2VydmljZVxuICApIHt9XG5cbiAgdXBkYXRlU2VsZWN0ZWRJdGVtcyhzZWxlY3RlZDogYm9vbGVhbiwgcGx1Z2luOiBBcHBsaWNhdGlvblBsdWdpbikge1xuICAgIHRoaXMuc2VsZWN0ZWRQbHVnaW5zW3BsdWdpbi5pZF0gPSBzZWxlY3RlZCA/IHBsdWdpbiA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvbmx5SW5zdGFsbGVkUGx1Z2lucyA9IE9iamVjdC52YWx1ZXModGhpcy5zZWxlY3RlZFBsdWdpbnMpLmZpbHRlcihCb29sZWFuKTtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZW1pdChvbmx5SW5zdGFsbGVkUGx1Z2lucyk7XG4gIH1cblxuICBhc3luYyBpbnN0YWxsUGx1Z2luKHBsdWdpbjogQXBwbGljYXRpb25QbHVnaW4pIHtcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZUFwcFJlbW90ZXMocGx1Z2luLCAnaW5zdGFsbCcpO1xuICB9XG5cbiAgYXN5bmMgdW5pbnN0YWxsUGx1Z2luKHBsdWdpbjogQXBwbGljYXRpb25QbHVnaW4pIHtcbiAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KFBST0RVQ1RfRVhQRVJJRU5DRS5BUFBMSUNBVElPTlMuRVZFTlRTLlBBQ0tBR0VfUExVR0lOUywge1xuICAgICAgY29tcG9uZW50OiBQUk9EVUNUX0VYUEVSSUVOQ0UuQVBQTElDQVRJT05TLkNPTVBPTkVOVFMuUExVR0lOX0xJU1QsXG4gICAgICBhY3Rpb246IFBST0RVQ1RfRVhQRVJJRU5DRS5BUFBMSUNBVElPTlMuQUNUSU9OUy5JTlNUQUxMX1BMVUdJTixcbiAgICAgIHVybDogdGhpcy5DVVJSRU5UX0xPQ0FUSU9OXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVBcHBSZW1vdGVzKHBsdWdpbiwgJ3VuaW5zdGFsbCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBcHBSZW1vdGVzKHBsdWdpbjogQXBwbGljYXRpb25QbHVnaW4sIHVwZGF0ZVR5cGU6IFVwZGF0ZVR5cGUpIHtcbiAgICB0aGlzLnVwZGF0aW5nUGx1Z2luSWRbdXBkYXRlVHlwZV0gPSBwbHVnaW4/LmlkO1xuICAgIGxldCBpbml0aWFsU3RhdGU6IFBpY2s8XG4gICAgICBBcHBzVG9VcGRhdGVSZW1vdGVzU2VsZWN0Q29tcG9uZW50LFxuICAgICAgJ2FwcHMnIHwgJ3VwZGF0ZVR5cGUnIHwgJ3BsdWdpbk5hbWUnIHwgJ2FwcHNEaXNhYmxlZCdcbiAgICA+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcHBzID0gYXdhaXQgdGhpcy5nZXRBcHBzRm9yVXBkYXRlKHBsdWdpbiwgdXBkYXRlVHlwZSk7XG4gICAgICBpbml0aWFsU3RhdGUgPSB7XG4gICAgICAgIGFwcHMsXG4gICAgICAgIHVwZGF0ZVR5cGUsXG4gICAgICAgIHBsdWdpbk5hbWU6IHBsdWdpbi5uYW1lLFxuICAgICAgICBhcHBzRGlzYWJsZWQ6IHRoaXMuYXBwc0Rpc2FibGVkXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZSk7XG4gICAgICB0aGlzLnVwZGF0aW5nUGx1Z2luSWRbdXBkYXRlVHlwZV0gPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgc2VsZWN0ZWRBcHBzOiBJQXBwbGljYXRpb25bXTtcbiAgICB0cnkge1xuICAgICAgc2VsZWN0ZWRBcHBzID0gYXdhaXQgdGhpcy5zZWxlY3RBcHBzKGluaXRpYWxTdGF0ZSk7XG4gICAgICBpZiAoIXNlbGVjdGVkQXBwcykge1xuICAgICAgICB0aGlzLnVwZGF0aW5nUGx1Z2luSWRbdXBkYXRlVHlwZV0gPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gdW5yZWFjaGVkXG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZVR5cGUgPT09ICdpbnN0YWxsJykge1xuICAgICAgY29uc3QgbGljZW5zZXNWZXJpZmllZEJ5VXNlciA9IGF3YWl0IHRoaXMuZWNvc3lzdGVtU2VydmljZS52ZXJpZnlMaWNlbnNlcyhbcGx1Z2luXSk7XG4gICAgICBpZiAoIWxpY2Vuc2VzVmVyaWZpZWRCeVVzZXIpIHtcbiAgICAgICAgdGhpcy51cGRhdGluZ1BsdWdpbklkW3VwZGF0ZVR5cGVdID0gJyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFwcCBvZiBzZWxlY3RlZEFwcHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlUmVtb3Rlc1VwZGF0ZShhcHAsIHBsdWdpbiwgdXBkYXRlVHlwZSk7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NUZXh0ID1cbiAgICAgICAgICB1cGRhdGVUeXBlID09PSAnaW5zdGFsbCdcbiAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnUGx1Z2luIGluc3RhbGxlZCB0byBhcHAgXCJ7eyBhcHBOYW1lIH19XCIuJyksIHtcbiAgICAgICAgICAgICAgICBhcHBOYW1lOiBhcHAubmFtZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgICBnZXR0ZXh0KCdQbHVnaW4gdW5pbnN0YWxsZWQgZnJvbSBhcHAgXCJ7eyBhcHBOYW1lIH19XCIuJyksXG4gICAgICAgICAgICAgICAgeyBhcHBOYW1lOiBhcHAubmFtZSB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3Moc3VjY2Vzc1RleHQpO1xuICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KFBST0RVQ1RfRVhQRVJJRU5DRS5BUFBMSUNBVElPTlMuRVZFTlRTLlBBQ0tBR0VfUExVR0lOUywge1xuICAgICAgICAgIGNvbXBvbmVudDogUFJPRFVDVF9FWFBFUklFTkNFLkFQUExJQ0FUSU9OUy5DT01QT05FTlRTLlBMVUdJTl9MSVNULFxuICAgICAgICAgIHJlc3VsdDogUFJPRFVDVF9FWFBFUklFTkNFLkFQUExJQ0FUSU9OUy5SRVNVTFRTLlBMVUdJTl9JTlNUQUxMRUQsXG4gICAgICAgICAgdXJsOiB0aGlzLkNVUlJFTlRfTE9DQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChQUk9EVUNUX0VYUEVSSUVOQ0UuQVBQTElDQVRJT05TLkVWRU5UUy5QQUNLQUdFX1BMVUdJTlMsIHtcbiAgICAgICAgICBjb21wb25lbnQ6IFBST0RVQ1RfRVhQRVJJRU5DRS5BUFBMSUNBVElPTlMuQ09NUE9ORU5UUy5QTFVHSU5fTElTVCxcbiAgICAgICAgICByZXN1bHQ6IFBST0RVQ1RfRVhQRVJJRU5DRS5BUFBMSUNBVElPTlMuUkVTVUxUUy5TRVJWRVJfRkFJTFVSRSxcbiAgICAgICAgICB1cmw6IHRoaXMuQ1VSUkVOVF9MT0NBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGluZ1BsdWdpbklkW3VwZGF0ZVR5cGVdID0gJyc7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEFwcHNGb3JVcGRhdGUocGx1Z2luOiBBcHBsaWNhdGlvblBsdWdpbiwgdXBkYXRlVHlwZTogVXBkYXRlVHlwZSkge1xuICAgIGxldCBhcHBzID0gKGF3YWl0IHRoaXMuZWNvc3lzdGVtU2VydmljZS5nZXRXZWJBcHBsaWNhdGlvbnMoKSkuZmlsdGVyKFxuICAgICAgYXBwID0+IHRoaXMuZWNvc3lzdGVtU2VydmljZS5pc093bmVyKGFwcCkgJiYgYXBwLnR5cGUgIT09IEFwcGxpY2F0aW9uVHlwZS5FWFRFUk5BTFxuICAgICk7XG5cbiAgICBpZiAodXBkYXRlVHlwZSA9PT0gJ2luc3RhbGwnKSB7XG4gICAgICB0aGlzLmFwcHNEaXNhYmxlZC5jbGVhcigpO1xuICAgICAgZm9yIChjb25zdCBhcHAgb2YgYXBwcykge1xuICAgICAgICBpZiAodGhpcy5pc1BsdWdpbkluc3RhbGxlZEluQXBwKHBsdWdpbiwgYXBwKSkge1xuICAgICAgICAgIHRoaXMuYXBwc0Rpc2FibGVkLmFkZChhcHAuaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZVR5cGUgPT09ICd1bmluc3RhbGwnKSB7XG4gICAgICBjb25zdCBpbnN0YWxsZWRBcHBzOiBJQXBwbGljYXRpb25bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhcHAgb2YgYXBwcykge1xuICAgICAgICBpZiAodGhpcy5pc1BsdWdpbkluc3RhbGxlZEluQXBwKHBsdWdpbiwgYXBwKSkge1xuICAgICAgICAgIGluc3RhbGxlZEFwcHMucHVzaChhcHApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhcHBzID0gaW5zdGFsbGVkQXBwcztcbiAgICB9XG4gICAgcmV0dXJuIGFwcHM7XG4gIH1cblxuICBwcml2YXRlIGlzUGx1Z2luSW5zdGFsbGVkSW5BcHAocGx1Z2luOiBBcHBsaWNhdGlvblBsdWdpbiwgYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBhcHBSZW1vdGVzID0gdGhpcy5wbHVnaW5zU2VydmljZS5nZXRNRlJlbW90ZXMoYXBwKSB8fCB7fTtcblxuICAgIGZvciAoY29uc3QgW3JlbW90ZU5hbWUsIG1vZHVsZXNdIG9mIE9iamVjdC5lbnRyaWVzKGFwcFJlbW90ZXMpKSB7XG4gICAgICBjb25zdCBwbHVnaW5Gcm9tVGhpc1BhY2thZ2VJc0luc3RhbGxlZCA9XG4gICAgICAgIHRoaXMuZ2V0UGx1Z2luQ29udGV4dFBhdGhXaXRob3V0VmVyc2lvbihyZW1vdGVOYW1lKSA9PT0gcGx1Z2luLmNvbnRleHRQYXRoO1xuICAgICAgY29uc3Qgc3BlY2lmaWNQbHVnaW5Nb2R1bGVJc0luc3RhbGxlZCA9IG1vZHVsZXMuc29tZShtb2R1bGUgPT4gbW9kdWxlID09PSBwbHVnaW4ubW9kdWxlKTtcbiAgICAgIGlmIChwbHVnaW5Gcm9tVGhpc1BhY2thZ2VJc0luc3RhbGxlZCAmJiBzcGVjaWZpY1BsdWdpbk1vZHVsZUlzSW5zdGFsbGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGdldFBsdWdpbkNvbnRleHRQYXRoV2l0aG91dFZlcnNpb24ocmVtb3RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVtb3RlLnNwbGl0KCdAJylbMF07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVJlbW90ZXNVcGRhdGUoXG4gICAgYXBwbGljYXRpb246IElBcHBsaWNhdGlvbixcbiAgICBwbHVnaW46IEFwcGxpY2F0aW9uUGx1Z2luLFxuICAgIHVwZGF0ZVR5cGU6IFVwZGF0ZVR5cGVcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFdoZW4gcmVtb3RlcyBvYmplY3QgaXMgbm90IHNldCBpbiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3Qgb2YgYW4gYXBwbGljYXRpb24uXG4gICAgICAvLyBGYWxsYmFjayB0byBzZXRJbml0aWFsUmVtb3RlcyBpcyB0cmlnZ2VyZWQuXG4gICAgICBsZXQgdXBkYXRlZFJlbW90ZXMgPSBhd2FpdCAodXBkYXRlVHlwZSA9PT0gJ2luc3RhbGwnXG4gICAgICAgID8gdGhpcy5wbHVnaW5zU2VydmljZS5hZGRSZW1vdGVzKGFwcGxpY2F0aW9uLCBwbHVnaW4pXG4gICAgICAgIDogdGhpcy5wbHVnaW5zU2VydmljZS5yZW1vdmVSZW1vdGVzKGFwcGxpY2F0aW9uLCB0aGlzLmdldEFsbFBsdWdpbnNUb1JlbW92ZShwbHVnaW4pKSk7XG4gICAgICBpZiAoIXVwZGF0ZWRSZW1vdGVzKSB7XG4gICAgICAgIC8vIFRPRE8gZGlzY3VzcyBpZiB3ZSBuZWVkIHRvIGhhbmRsZSBpdCBsaWtlIHRoYXQuXG4gICAgICAgIC8vIFJpZ2h0IG5vdyByZW1vdGVzIGZyb20gdGhlIGN1bXVsb2NpdHkuanNvbiBhcmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gcmVtb3RlcyBvYmplY3QgaXMgbWlzc2luZyBpbiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICAgICAgdXBkYXRlZFJlbW90ZXMgPSBhd2FpdCB0aGlzLnBsdWdpbnNTZXJ2aWNlLnNldEluaXRpYWxSZW1vdGVzKGFwcGxpY2F0aW9uKTtcbiAgICAgICAgLy8gRnJlc2ggYXBwbGljYXRpb24gTU8gaXMgbmVlZGVkLCBhZnRlciBpbml0aWFsIHN0YXRlIHdhcyBzZXQuXG4gICAgICAgIGNvbnN0IGFwcCA9IGF3YWl0IHRoaXMuZWNvc3lzdGVtU2VydmljZS5nZXRBcHBsaWNhdGlvbihhcHBsaWNhdGlvbi5pZCk7XG4gICAgICAgIHVwZGF0ZWRSZW1vdGVzID0gYXdhaXQgdGhpcy5wbHVnaW5zU2VydmljZS5hZGRSZW1vdGVzKGFwcCwgcGx1Z2luKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmVtaXRSZW1vdGVzKHVwZGF0ZWRSZW1vdGVzKTtcbiAgICB9IGNhdGNoIChlcikge1xuICAgICAgaWYgKGVyKSB7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXIpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxQbHVnaW5zVG9SZW1vdmUocGx1Z2luOiBBcHBsaWNhdGlvblBsdWdpbik6IEFwcGxpY2F0aW9uUGx1Z2luW10ge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2UuYXBwbGljYXRpb25WZXJzaW9ucy5tYXAoYXYgPT4gKHtcbiAgICAgIGlkOiBgJHtwbHVnaW4uY29udGV4dFBhdGh9QCR7YXYudmVyc2lvbn0vJHtwbHVnaW4ubW9kdWxlfWAsXG4gICAgICBtb2R1bGU6IHBsdWdpbi5tb2R1bGUsXG4gICAgICBwYXRoOiBwbHVnaW4ucGF0aFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFJlbW90ZXMocmVtb3RlczogQXBwbGljYXRpb25SZW1vdGVQbHVnaW5zKTogQXBwbGljYXRpb25SZW1vdGVQbHVnaW5zIHtcbiAgICB0aGlzLnJlbW90ZVBsdWdpbnMkLm5leHQocmVtb3Rlcyk7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5yZW1vdGVQbHVnaW5zJC52YWx1ZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZWxlY3RBcHBzKFxuICAgIGluaXRpYWxTdGF0ZTogUGljazxcbiAgICAgIEFwcHNUb1VwZGF0ZVJlbW90ZXNTZWxlY3RDb21wb25lbnQsXG4gICAgICAnYXBwcycgfCAndXBkYXRlVHlwZScgfCAncGx1Z2luTmFtZScgfCAnYXBwc0Rpc2FibGVkJ1xuICAgID5cbiAgKTogUHJvbWlzZTxJQXBwbGljYXRpb25bXT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgKFxuICAgICAgICB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coQXBwc1RvVXBkYXRlUmVtb3Rlc1NlbGVjdENvbXBvbmVudCwge1xuICAgICAgICAgIGNsYXNzOiAnbW9kYWwtc20nLFxuICAgICAgICAgIGFyaWFEZXNjcmliZWRieTogJ21vZGFsLWJvZHknLFxuICAgICAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnbW9kYWwtdGl0bGUnLFxuICAgICAgICAgIGluaXRpYWxTdGF0ZSxcbiAgICAgICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlLFxuICAgICAgICAgIGtleWJvYXJkOiBmYWxzZVxuICAgICAgICB9KS5jb250ZW50IGFzIEFwcHNUb1VwZGF0ZVJlbW90ZXNTZWxlY3RDb21wb25lbnRcbiAgICAgICkucmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG4iLCI8Yzh5LWxpc3QtZ3JvdXAgY2xhc3M9XCJiZy1pbmhlcml0XCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIocGx1Z2lucyQgfCBhc3luYyk/Lmxlbmd0aCAhPT0gMDsgZWxzZSBlbXB0eUxpc3RcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwbHVnaW4gb2YgcGx1Z2lucyQgfCBhc3luY1wiPlxuICAgICAgPGM4eS1saSBbbmdDbGFzc109XCJ7IGRpc2FibGVkOiBwbHVnaW4uaW5zdGFsbGVkIH1cIiBjbGFzcz1cImJnLWluaGVyaXRcIj5cbiAgICAgICAgPGM4eS1wbHVnaW4tbGlzdC1pdGVtXG4gICAgICAgICAgKGlzSXRlbVNlbGVjdGVkKT1cInVwZGF0ZVNlbGVjdGVkSXRlbXMoJGV2ZW50LCBwbHVnaW4pXCJcbiAgICAgICAgICBbcGx1Z2luXT1cInBsdWdpblwiXG4gICAgICAgICAgW3NlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiXG4gICAgICAgICAgY2xhc3M9XCJkLWZsZXhcIlxuICAgICAgICA+PC9jOHktcGx1Z2luLWxpc3QtaXRlbT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInAtbC00MCBtLXQtNFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaW5zdGFsbGFibGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInVuaW5zdGFsbFBsdWdpbihwbHVnaW4pXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2J0bi1wZW5kaW5nJzogcGx1Z2luLmlkID09PSB1cGRhdGluZ1BsdWdpbklkLnVuaW5zdGFsbCB9XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ1cGRhdGluZ1BsdWdpbklkLnVuaW5zdGFsbCAmJiBwbHVnaW4uaWQgIT09IHVwZGF0aW5nUGx1Z2luSWQudW5pbnN0YWxsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgYnRuLXNtIG0tbC00XCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ1VuaW5zdGFsbCBwbHVnaW4nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIFVuaW5zdGFsbCBwbHVnaW5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImluc3RhbGxhYmxlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJpbnN0YWxsUGx1Z2luKHBsdWdpbilcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnYnRuLXBlbmRpbmcnOiBwbHVnaW4uaWQgPT09IHVwZGF0aW5nUGx1Z2luSWQuaW5zdGFsbCB9XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ1cGRhdGluZ1BsdWdpbklkLmluc3RhbGwgJiYgcGx1Z2luLmlkICE9PSB1cGRhdGluZ1BsdWdpbklkLmluc3RhbGxcIlxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIG0tbC04XCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0luc3RhbGwgcGx1Z2luJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICBJbnN0YWxsIHBsdWdpblxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYzh5LWxpPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvYzh5LWxpc3QtZ3JvdXA+XG48bmctdGVtcGxhdGUgI2VtcHR5TGlzdD5cbiAgPGRpdiBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZSB0ZXh0LWxlZnRcIiAqbmdJZj1cImVtcHR5TGlzdFRleHRcIj5cbiAgICA8aDEgYzh5SWNvbj1cInBsdWdpblwiPjwvaDE+XG4gICAgPHA+XG4gICAgICB7eyBlbXB0eUxpc3RUZXh0IHwgdHJhbnNsYXRlIH19XG4gICAgPC9wPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -125,9 +125,9 @@ export class DeviceRegistrationViewComponent {
125
125
  }
126
126
  }
127
127
  DeviceRegistrationViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceRegistrationViewComponent, deps: [{ token: i1.RegisterDeviceService }, { token: i2.DeviceBootstrapRealtimeService }, { token: i2.TenantUiService }, { token: i2.ModalService }, { token: i3.TranslateService }, { token: i2.OptionsService }], target: i0.ɵɵFactoryTarget.Component });
128
- DeviceRegistrationViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: DeviceRegistrationViewComponent, selector: "c8y-device-registration-view", ngImport: i0, template: "<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n <c8y-title>\n {{ 'Device registration' | translate }}\n <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n <small *ngIf=\"deviceRequestList.data.length > 1\">\n {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n </small>\n </c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item [icon]=\"'exchange'\" [label]=\"'Devices' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-connect'\"\n [label]=\"'Device registration' | translate\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n </c8y-action-bar-item>\n\n <ng-container *ngIf=\"limit$ | async as limitStatus\">\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"10\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{ 'Accept all' | translate }}\"\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n (click)=\"acceptAll()\"\n [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n >\n <i [c8yIcon]=\"'check'\"></i>\n {{ 'Accept all' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"9\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"loadAll()\"\n [disabled]=\"isLoading\"\n >\n <i [c8yIcon]=\"'refresh'\" [ngClass]=\"{ 'icon-spin': isLoading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <c8y-register-device-dropdown></c8y-register-device-dropdown>\n </c8y-action-bar-item>\n\n <c8y-help src=\"/users-guide/device-management/#connecting-devices\"></c8y-help>\n\n <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n <div class=\"card-group\" [ngClass]=\"gridOrList\">\n <!-- START interact-list sticky header START -->\n <div *ngIf=\"gridOrList === 'interact-list'\" class=\"page-sticky-header hidden-xs\">\n <div class=\"d-flex\">\n <div class=\"card-header p-l-40\">\n <p translate>Device</p>\n </div>\n <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n <p translate>Status</p>\n </div>\n <div class=\"card-block card-column-30 p-0\" *ngIf=\"showTokenInputBasedOnSecurityMode()\">\n <p translate>Security token</p>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Security token is required if the connected device uses it.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </div>\n <div class=\"card-footer card-column-50\">\n <div class=\"d-contents\" *ngIf=\"isManagementTenant; else noManagement\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-30\">\n {{ 'By`user`' | translate }}\n </div>\n <div class=\"card-column-20\">\n {{ 'Tenant ID' | translate }}\n </div>\n </div>\n <ng-template #noManagement>\n <div class=\"d-contents\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-50\">\n {{ 'By`user`' | translate }}\n </div>\n </div>\n </ng-template>\n </div>\n <div class=\"card-actions-group\" style=\"min-width: 176px\">\n <div class=\"btn btn-xs invisible\">\n <!--EMPTY by design-->\n </div>\n </div>\n </div>\n </div>\n <!-- END interact-list sticky header END -->\n\n <div *ngIf=\"limitStatus?.isReached\" class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <p class=\"alert alert-warning center-block\" role=\"alert\">\n <strong>\n {{ limitReachedInfo$ | async }}\n </strong>\n <br />\n <span translate>Please contact your platform administrator.</span>\n </p>\n </div>\n\n <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <div class=\"card\">\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i\n [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n [class]=\"statusProps[singleRequest.status].cls\"\n ></i>\n </div>\n <p class=\"card-title text-truncate\" title=\"{{ singleRequest.id }}\">\n {{ singleRequest.id }}\n </p>\n </div>\n\n <div class=\"card-block text-center card-column-30\">\n <span class=\"text-label-small\" translate>Status</span>\n <p>\n <i\n *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n c8yIcon=\"refresh\"\n class=\"icon-spin text-primary\"\n ></i>\n {{ statusProps[singleRequest.status].label | translate }}\n </p>\n </div>\n\n <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <div\n class=\"card-block text-center card-column-30 p-t-0\"\n [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n <span *ngIf=\"gridOrList !== 'interact-list'\" class=\"text-label-small\" translate>\n Security token\n </span>\n <input\n [(ngModel)]=\"singleRequest.securityToken\"\n type=\"text\"\n class=\"form-control\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n [required]=\"requireSecurityToken\"\n />\n </ng-container>\n </div>\n\n <div\n class=\"card-actions-group d-flex a-i-center j-c-center\"\n style=\"min-width: 176px\"\n >\n <button\n class=\"btn btn-sm\"\n [ngClass]=\"{\n 'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n 'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n }\"\n type=\"button\"\n title=\"{{\n singleRequest.status === status.PENDING_ACCEPTANCE\n ? ('Remove' | translate)\n : ('Cancel' | translate)\n }}\"\n (click)=\"delete(singleRequest.id)\"\n [disabled]=\"isLoading\"\n >\n <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n {{ 'Remove' | translate }}\n </span>\n <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n {{ 'Cancel' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n type=\"button\"\n title=\"{{ 'Accept' | translate }}\"\n (click)=\"accept(singleRequest)\"\n *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n [disabled]=\"\n isLoading ||\n limitStatus?.isReached ||\n (!singleRequest.securityToken && requireSecurityToken)\n \"\n >\n {{ 'Accept' | translate }}\n </button>\n </div>\n </ng-container>\n\n <div class=\"card-footer separator text-center card-column-50\">\n <small *ngIf=\"isManagementTenant; else noManagement\" class=\"d-contents\">\n <div class=\"d-contents\" *ngIf=\"singleRequest.creationTime && singleRequest.owner\">\n <span class=\"text-label-small\" translate>Created on`date`</span>\n <span class=\"card-column-50\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span class=\"card-column-30\">\n <span class=\"text-truncate\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n <span class=\"text-label-small m-l-4 m-r-4\" translate>in`tenant`</span>\n <span class=\"card-column-20\">{{ singleRequest.tenantId }}</span>\n </div>\n <div\n class=\"d-contents\"\n *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n >\n <div class=\"card-column-50\"></div>\n <div class=\"card-column-30\"></div>\n <span class=\"text-label-small\" translate>Created in`tenant`</span>\n <div class=\"card-column-20\">\n <span>\n {{ singleRequest.tenantId }}\n </span>\n </div>\n </div>\n </small>\n <ng-template #noManagement>\n <small class=\"d-contents\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>Created on`date`</span>\n <span class=\"card-column-50\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span class=\"card-column-50\">\n <span class=\"text-truncate\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n </small>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <c8y-load-more\n [paging]=\"deviceRequestList.paging\"\n [hidden]=\"true\"\n (onLoad)=\"updateList($event)\"\n ></c8y-load-more>\n </ng-container>\n\n <ng-template #noData>\n <div class=\"c8y-empty-state m-t-40 text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n <h3>\n {{ limitReachedInfo$ | async }}\n </h3>\n <p translate>Please contact your platform administrator.</p>\n </ng-container>\n <ng-template #limitNotReached>\n <h3 translate>No pending registrations to display.</h3>\n <p *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\" translate>\n Use the \"Register device\" dropdown in the top right corner.\n </p>\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i4.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.IfAllowedDirective, selector: "[c8yIfAllowed]", inputs: ["c8yIfAllowed", "c8yIfAllowedAllowAny"] }, { kind: "component", type: i2.LoadMoreComponent, selector: "c8y-load-more", inputs: ["paging", "useIntersection", "hidden", "container", "class", "maxIterations", "noMoreDataHint", "loadingTemplate", "hideNoMoreDataHint", "loadNextLabel", "loadingLabel"], outputs: ["onLoad"] }, { kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i2.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i2.ListDisplaySwitchComponent, selector: "c8y-list-display-switch", inputs: ["listKey", "listLength", "filterPipe"], outputs: ["onListClassChange"] }, { kind: "component", type: i7.RegisterDeviceDropdownComponent, selector: "c8y-register-device-dropdown" }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "c8yDate" }] });
128
+ DeviceRegistrationViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: DeviceRegistrationViewComponent, selector: "c8y-device-registration-view", ngImport: i0, template: "<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n <c8y-title>\n {{ 'Device registration' | translate }}\n <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n <small *ngIf=\"deviceRequestList.data.length > 1\">\n {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n </small>\n </c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item [icon]=\"'exchange'\" [label]=\"'Devices' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-connect'\"\n [label]=\"'Device registration' | translate\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n </c8y-action-bar-item>\n\n <ng-container *ngIf=\"limit$ | async as limitStatus\">\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"10\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{ 'Accept all' | translate }}\"\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n (click)=\"acceptAll()\"\n [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n >\n <i [c8yIcon]=\"'check'\"></i>\n {{ 'Accept all' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"9\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"loadAll()\"\n [disabled]=\"isLoading\"\n >\n <i [c8yIcon]=\"'refresh'\" [ngClass]=\"{ 'icon-spin': isLoading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <c8y-register-device-dropdown></c8y-register-device-dropdown>\n </c8y-action-bar-item>\n\n <c8y-help src=\"/users-guide/device-management/#connecting-devices\"></c8y-help>\n\n <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n <div class=\"card-group\" [ngClass]=\"gridOrList\">\n <!-- START interact-list sticky header START -->\n <div *ngIf=\"gridOrList === 'interact-list'\" class=\"page-sticky-header hidden-xs\">\n <div class=\"d-flex\">\n <div class=\"card-header p-l-40\">\n <p translate>Device</p>\n </div>\n <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n <p translate>Status</p>\n </div>\n <div class=\"card-block card-column-30 p-0\" *ngIf=\"showTokenInputBasedOnSecurityMode()\">\n <p translate>Security token</p>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Security token is required if the connected device uses it.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </div>\n <div class=\"card-footer card-column-50\">\n <div class=\"d-contents\" *ngIf=\"isManagementTenant; else noManagement\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-30\">\n {{ 'By`user`' | translate }}\n </div>\n <div class=\"card-column-20\">\n {{ 'Tenant ID' | translate }}\n </div>\n </div>\n <ng-template #noManagement>\n <div class=\"d-contents\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-50\">\n {{ 'By`user`' | translate }}\n </div>\n </div>\n </ng-template>\n </div>\n <div class=\"card-actions-group\" style=\"min-width: 176px\">\n <div class=\"btn btn-xs invisible\">\n <!--EMPTY by design-->\n </div>\n </div>\n </div>\n </div>\n <!-- END interact-list sticky header END -->\n\n <div *ngIf=\"limitStatus?.isReached\" class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <p class=\"alert alert-warning center-block\" role=\"alert\">\n <strong>\n {{ limitReachedInfo$ | async }}\n </strong>\n <br />\n <span translate>Please contact your platform administrator.</span>\n </p>\n </div>\n\n <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <div class=\"card\">\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i\n [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n [class]=\"statusProps[singleRequest.status].cls\"\n ></i>\n </div>\n <p class=\"card-title text-truncate\" title=\"{{ singleRequest.id }}\">\n {{ singleRequest.id }}\n </p>\n </div>\n\n <div class=\"card-block text-center card-column-30\">\n <span class=\"text-label-small\" translate>Status</span>\n <p>\n <i\n *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n c8yIcon=\"refresh\"\n class=\"icon-spin text-primary\"\n ></i>\n {{ statusProps[singleRequest.status].label | translate }}\n </p>\n </div>\n\n <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <div\n class=\"card-block text-center card-column-30 p-t-0\"\n [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n <span *ngIf=\"gridOrList !== 'interact-list'\" class=\"text-label-small\" translate>\n Security token\n </span>\n <input\n [(ngModel)]=\"singleRequest.securityToken\"\n type=\"text\"\n class=\"form-control\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n [required]=\"requireSecurityToken\"\n />\n </ng-container>\n </div>\n\n <div\n class=\"card-actions-group d-flex a-i-center j-c-center\"\n style=\"min-width: 176px\"\n >\n <button\n class=\"btn btn-sm\"\n [ngClass]=\"{\n 'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n 'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n }\"\n type=\"button\"\n title=\"{{\n singleRequest.status === status.PENDING_ACCEPTANCE\n ? ('Remove' | translate)\n : ('Cancel' | translate)\n }}\"\n (click)=\"delete(singleRequest.id)\"\n [disabled]=\"isLoading\"\n >\n <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n {{ 'Remove' | translate }}\n </span>\n <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n {{ 'Cancel' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n type=\"button\"\n title=\"{{ 'Accept' | translate }}\"\n (click)=\"accept(singleRequest)\"\n *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n [disabled]=\"\n isLoading ||\n limitStatus?.isReached ||\n (!singleRequest.securityToken && requireSecurityToken)\n \"\n >\n {{ 'Accept' | translate }}\n </button>\n </div>\n </ng-container>\n\n <div class=\"card-footer separator text-center card-column-50\">\n <small *ngIf=\"isManagementTenant; else noManagement\" class=\"d-contents\">\n <div class=\"d-contents\" *ngIf=\"singleRequest.creationTime && singleRequest.owner\">\n <span class=\"card-column-50\" >\n <span class=\"text-label-small m-l-4 m-r-4\" translate>Created on`date`</span>\n <span data-cy=\"device-registration--creation-date\">{{ singleRequest.creationTime | c8yDate }}</span>\n </span>\n <span class=\"card-column-30 text-truncate\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span data-cy=\"device-registration--created-by\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n <span class=\"card-column-20\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>in`tenant`</span>\n <span>{{ singleRequest.tenantId }}</span>\n </span>\n </div>\n <div\n class=\"d-contents\"\n *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n >\n <div class=\"card-column-50\"></div>\n <div class=\"card-column-30\"></div>\n <span class=\"text-label-small\" translate>Created in`tenant`</span>\n <div class=\"card-column-20\">\n <span>\n {{ singleRequest.tenantId }}\n </span>\n </div>\n </div>\n </small>\n <ng-template #noManagement>\n <small class=\"d-contents\">\n <span class=\"card-column-50\" >\n <span class=\"text-label-small m-l-4 m-r-4\" translate>Created on`date`</span>\n <span data-cy=\"device-registration--creation-date\">{{ singleRequest.creationTime | c8yDate }}</span>\n </span>\n <span class=\"card-column-50 text-truncate\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span data-cy=\"device-registration--created-by\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n </small>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <c8y-load-more\n [paging]=\"deviceRequestList.paging\"\n [hidden]=\"true\"\n (onLoad)=\"updateList($event)\"\n ></c8y-load-more>\n </ng-container>\n\n <ng-template #noData>\n <div class=\"c8y-empty-state m-t-40 text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n <h3>\n {{ limitReachedInfo$ | async }}\n </h3>\n <p translate>Please contact your platform administrator.</p>\n </ng-container>\n <ng-template #limitNotReached>\n <h3 translate>No pending registrations to display.</h3>\n <p *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\" translate>\n Use the \"Register device\" dropdown in the top right corner.\n </p>\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i4.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.IfAllowedDirective, selector: "[c8yIfAllowed]", inputs: ["c8yIfAllowed", "c8yIfAllowedAllowAny"] }, { kind: "component", type: i2.LoadMoreComponent, selector: "c8y-load-more", inputs: ["paging", "useIntersection", "hidden", "container", "class", "maxIterations", "noMoreDataHint", "loadingTemplate", "hideNoMoreDataHint", "loadNextLabel", "loadingLabel"], outputs: ["onLoad"] }, { kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i2.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i2.ListDisplaySwitchComponent, selector: "c8y-list-display-switch", inputs: ["listKey", "listLength", "filterPipe"], outputs: ["onListClassChange"] }, { kind: "component", type: i7.RegisterDeviceDropdownComponent, selector: "c8y-register-device-dropdown" }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "c8yDate" }] });
129
129
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceRegistrationViewComponent, decorators: [{
130
130
  type: Component,
131
- args: [{ selector: 'c8y-device-registration-view', template: "<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n <c8y-title>\n {{ 'Device registration' | translate }}\n <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n <small *ngIf=\"deviceRequestList.data.length > 1\">\n {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n </small>\n </c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item [icon]=\"'exchange'\" [label]=\"'Devices' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-connect'\"\n [label]=\"'Device registration' | translate\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n </c8y-action-bar-item>\n\n <ng-container *ngIf=\"limit$ | async as limitStatus\">\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"10\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{ 'Accept all' | translate }}\"\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n (click)=\"acceptAll()\"\n [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n >\n <i [c8yIcon]=\"'check'\"></i>\n {{ 'Accept all' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"9\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"loadAll()\"\n [disabled]=\"isLoading\"\n >\n <i [c8yIcon]=\"'refresh'\" [ngClass]=\"{ 'icon-spin': isLoading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <c8y-register-device-dropdown></c8y-register-device-dropdown>\n </c8y-action-bar-item>\n\n <c8y-help src=\"/users-guide/device-management/#connecting-devices\"></c8y-help>\n\n <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n <div class=\"card-group\" [ngClass]=\"gridOrList\">\n <!-- START interact-list sticky header START -->\n <div *ngIf=\"gridOrList === 'interact-list'\" class=\"page-sticky-header hidden-xs\">\n <div class=\"d-flex\">\n <div class=\"card-header p-l-40\">\n <p translate>Device</p>\n </div>\n <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n <p translate>Status</p>\n </div>\n <div class=\"card-block card-column-30 p-0\" *ngIf=\"showTokenInputBasedOnSecurityMode()\">\n <p translate>Security token</p>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Security token is required if the connected device uses it.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </div>\n <div class=\"card-footer card-column-50\">\n <div class=\"d-contents\" *ngIf=\"isManagementTenant; else noManagement\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-30\">\n {{ 'By`user`' | translate }}\n </div>\n <div class=\"card-column-20\">\n {{ 'Tenant ID' | translate }}\n </div>\n </div>\n <ng-template #noManagement>\n <div class=\"d-contents\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-50\">\n {{ 'By`user`' | translate }}\n </div>\n </div>\n </ng-template>\n </div>\n <div class=\"card-actions-group\" style=\"min-width: 176px\">\n <div class=\"btn btn-xs invisible\">\n <!--EMPTY by design-->\n </div>\n </div>\n </div>\n </div>\n <!-- END interact-list sticky header END -->\n\n <div *ngIf=\"limitStatus?.isReached\" class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <p class=\"alert alert-warning center-block\" role=\"alert\">\n <strong>\n {{ limitReachedInfo$ | async }}\n </strong>\n <br />\n <span translate>Please contact your platform administrator.</span>\n </p>\n </div>\n\n <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <div class=\"card\">\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i\n [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n [class]=\"statusProps[singleRequest.status].cls\"\n ></i>\n </div>\n <p class=\"card-title text-truncate\" title=\"{{ singleRequest.id }}\">\n {{ singleRequest.id }}\n </p>\n </div>\n\n <div class=\"card-block text-center card-column-30\">\n <span class=\"text-label-small\" translate>Status</span>\n <p>\n <i\n *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n c8yIcon=\"refresh\"\n class=\"icon-spin text-primary\"\n ></i>\n {{ statusProps[singleRequest.status].label | translate }}\n </p>\n </div>\n\n <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <div\n class=\"card-block text-center card-column-30 p-t-0\"\n [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n <span *ngIf=\"gridOrList !== 'interact-list'\" class=\"text-label-small\" translate>\n Security token\n </span>\n <input\n [(ngModel)]=\"singleRequest.securityToken\"\n type=\"text\"\n class=\"form-control\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n [required]=\"requireSecurityToken\"\n />\n </ng-container>\n </div>\n\n <div\n class=\"card-actions-group d-flex a-i-center j-c-center\"\n style=\"min-width: 176px\"\n >\n <button\n class=\"btn btn-sm\"\n [ngClass]=\"{\n 'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n 'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n }\"\n type=\"button\"\n title=\"{{\n singleRequest.status === status.PENDING_ACCEPTANCE\n ? ('Remove' | translate)\n : ('Cancel' | translate)\n }}\"\n (click)=\"delete(singleRequest.id)\"\n [disabled]=\"isLoading\"\n >\n <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n {{ 'Remove' | translate }}\n </span>\n <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n {{ 'Cancel' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n type=\"button\"\n title=\"{{ 'Accept' | translate }}\"\n (click)=\"accept(singleRequest)\"\n *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n [disabled]=\"\n isLoading ||\n limitStatus?.isReached ||\n (!singleRequest.securityToken && requireSecurityToken)\n \"\n >\n {{ 'Accept' | translate }}\n </button>\n </div>\n </ng-container>\n\n <div class=\"card-footer separator text-center card-column-50\">\n <small *ngIf=\"isManagementTenant; else noManagement\" class=\"d-contents\">\n <div class=\"d-contents\" *ngIf=\"singleRequest.creationTime && singleRequest.owner\">\n <span class=\"text-label-small\" translate>Created on`date`</span>\n <span class=\"card-column-50\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span class=\"card-column-30\">\n <span class=\"text-truncate\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n <span class=\"text-label-small m-l-4 m-r-4\" translate>in`tenant`</span>\n <span class=\"card-column-20\">{{ singleRequest.tenantId }}</span>\n </div>\n <div\n class=\"d-contents\"\n *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n >\n <div class=\"card-column-50\"></div>\n <div class=\"card-column-30\"></div>\n <span class=\"text-label-small\" translate>Created in`tenant`</span>\n <div class=\"card-column-20\">\n <span>\n {{ singleRequest.tenantId }}\n </span>\n </div>\n </div>\n </small>\n <ng-template #noManagement>\n <small class=\"d-contents\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>Created on`date`</span>\n <span class=\"card-column-50\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span class=\"card-column-50\">\n <span class=\"text-truncate\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n </small>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <c8y-load-more\n [paging]=\"deviceRequestList.paging\"\n [hidden]=\"true\"\n (onLoad)=\"updateList($event)\"\n ></c8y-load-more>\n </ng-container>\n\n <ng-template #noData>\n <div class=\"c8y-empty-state m-t-40 text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n <h3>\n {{ limitReachedInfo$ | async }}\n </h3>\n <p translate>Please contact your platform administrator.</p>\n </ng-container>\n <ng-template #limitNotReached>\n <h3 translate>No pending registrations to display.</h3>\n <p *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\" translate>\n Use the \"Register device\" dropdown in the top right corner.\n </p>\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n" }]
131
+ args: [{ selector: 'c8y-device-registration-view', template: "<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n <c8y-title>\n {{ 'Device registration' | translate }}\n <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n <small *ngIf=\"deviceRequestList.data.length > 1\">\n {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n </small>\n </c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item [icon]=\"'exchange'\" [label]=\"'Devices' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-connect'\"\n [label]=\"'Device registration' | translate\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n </c8y-action-bar-item>\n\n <ng-container *ngIf=\"limit$ | async as limitStatus\">\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"10\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{ 'Accept all' | translate }}\"\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n (click)=\"acceptAll()\"\n [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n >\n <i [c8yIcon]=\"'check'\"></i>\n {{ 'Accept all' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" [priority]=\"9\">\n <button\n class=\"btn btn-link\"\n type=\"button\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"loadAll()\"\n [disabled]=\"isLoading\"\n >\n <i [c8yIcon]=\"'refresh'\" [ngClass]=\"{ 'icon-spin': isLoading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\" *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <c8y-register-device-dropdown></c8y-register-device-dropdown>\n </c8y-action-bar-item>\n\n <c8y-help src=\"/users-guide/device-management/#connecting-devices\"></c8y-help>\n\n <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n <div class=\"card-group\" [ngClass]=\"gridOrList\">\n <!-- START interact-list sticky header START -->\n <div *ngIf=\"gridOrList === 'interact-list'\" class=\"page-sticky-header hidden-xs\">\n <div class=\"d-flex\">\n <div class=\"card-header p-l-40\">\n <p translate>Device</p>\n </div>\n <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n <p translate>Status</p>\n </div>\n <div class=\"card-block card-column-30 p-0\" *ngIf=\"showTokenInputBasedOnSecurityMode()\">\n <p translate>Security token</p>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Security token is required if the connected device uses it.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </div>\n <div class=\"card-footer card-column-50\">\n <div class=\"d-contents\" *ngIf=\"isManagementTenant; else noManagement\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-30\">\n {{ 'By`user`' | translate }}\n </div>\n <div class=\"card-column-20\">\n {{ 'Tenant ID' | translate }}\n </div>\n </div>\n <ng-template #noManagement>\n <div class=\"d-contents\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-50\">\n {{ 'By`user`' | translate }}\n </div>\n </div>\n </ng-template>\n </div>\n <div class=\"card-actions-group\" style=\"min-width: 176px\">\n <div class=\"btn btn-xs invisible\">\n <!--EMPTY by design-->\n </div>\n </div>\n </div>\n </div>\n <!-- END interact-list sticky header END -->\n\n <div *ngIf=\"limitStatus?.isReached\" class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <p class=\"alert alert-warning center-block\" role=\"alert\">\n <strong>\n {{ limitReachedInfo$ | async }}\n </strong>\n <br />\n <span translate>Please contact your platform administrator.</span>\n </p>\n </div>\n\n <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <div class=\"card\">\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i\n [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n [class]=\"statusProps[singleRequest.status].cls\"\n ></i>\n </div>\n <p class=\"card-title text-truncate\" title=\"{{ singleRequest.id }}\">\n {{ singleRequest.id }}\n </p>\n </div>\n\n <div class=\"card-block text-center card-column-30\">\n <span class=\"text-label-small\" translate>Status</span>\n <p>\n <i\n *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n c8yIcon=\"refresh\"\n class=\"icon-spin text-primary\"\n ></i>\n {{ statusProps[singleRequest.status].label | translate }}\n </p>\n </div>\n\n <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <div\n class=\"card-block text-center card-column-30 p-t-0\"\n [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n <span *ngIf=\"gridOrList !== 'interact-list'\" class=\"text-label-small\" translate>\n Security token\n </span>\n <input\n [(ngModel)]=\"singleRequest.securityToken\"\n type=\"text\"\n class=\"form-control\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n [required]=\"requireSecurityToken\"\n />\n </ng-container>\n </div>\n\n <div\n class=\"card-actions-group d-flex a-i-center j-c-center\"\n style=\"min-width: 176px\"\n >\n <button\n class=\"btn btn-sm\"\n [ngClass]=\"{\n 'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n 'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n }\"\n type=\"button\"\n title=\"{{\n singleRequest.status === status.PENDING_ACCEPTANCE\n ? ('Remove' | translate)\n : ('Cancel' | translate)\n }}\"\n (click)=\"delete(singleRequest.id)\"\n [disabled]=\"isLoading\"\n >\n <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n {{ 'Remove' | translate }}\n </span>\n <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n {{ 'Cancel' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n type=\"button\"\n title=\"{{ 'Accept' | translate }}\"\n (click)=\"accept(singleRequest)\"\n *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n [disabled]=\"\n isLoading ||\n limitStatus?.isReached ||\n (!singleRequest.securityToken && requireSecurityToken)\n \"\n >\n {{ 'Accept' | translate }}\n </button>\n </div>\n </ng-container>\n\n <div class=\"card-footer separator text-center card-column-50\">\n <small *ngIf=\"isManagementTenant; else noManagement\" class=\"d-contents\">\n <div class=\"d-contents\" *ngIf=\"singleRequest.creationTime && singleRequest.owner\">\n <span class=\"card-column-50\" >\n <span class=\"text-label-small m-l-4 m-r-4\" translate>Created on`date`</span>\n <span data-cy=\"device-registration--creation-date\">{{ singleRequest.creationTime | c8yDate }}</span>\n </span>\n <span class=\"card-column-30 text-truncate\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span data-cy=\"device-registration--created-by\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n <span class=\"card-column-20\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>in`tenant`</span>\n <span>{{ singleRequest.tenantId }}</span>\n </span>\n </div>\n <div\n class=\"d-contents\"\n *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n >\n <div class=\"card-column-50\"></div>\n <div class=\"card-column-30\"></div>\n <span class=\"text-label-small\" translate>Created in`tenant`</span>\n <div class=\"card-column-20\">\n <span>\n {{ singleRequest.tenantId }}\n </span>\n </div>\n </div>\n </small>\n <ng-template #noManagement>\n <small class=\"d-contents\">\n <span class=\"card-column-50\" >\n <span class=\"text-label-small m-l-4 m-r-4\" translate>Created on`date`</span>\n <span data-cy=\"device-registration--creation-date\">{{ singleRequest.creationTime | c8yDate }}</span>\n </span>\n <span class=\"card-column-50 text-truncate\">\n <span class=\"text-label-small m-l-4 m-r-4\" translate>by`user`</span>\n <span data-cy=\"device-registration--created-by\" title=\"{{ singleRequest.owner }}\">\n {{ singleRequest.owner }}\n </span>\n </span>\n </small>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <c8y-load-more\n [paging]=\"deviceRequestList.paging\"\n [hidden]=\"true\"\n (onLoad)=\"updateList($event)\"\n ></c8y-load-more>\n </ng-container>\n\n <ng-template #noData>\n <div class=\"c8y-empty-state m-t-40 text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n <h3>\n {{ limitReachedInfo$ | async }}\n </h3>\n <p translate>Please contact your platform administrator.</p>\n </ng-container>\n <ng-template #limitNotReached>\n <h3 translate>No pending registrations to display.</h3>\n <p *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\" translate>\n Use the \"Register device\" dropdown in the top right corner.\n </p>\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n" }]
132
132
  }], ctorParameters: function () { return [{ type: i1.RegisterDeviceService }, { type: i2.DeviceBootstrapRealtimeService }, { type: i2.TenantUiService }, { type: i2.ModalService }, { type: i3.TranslateService }, { type: i2.OptionsService }]; } });
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLXJlZ2lzdHJhdGlvbi12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3JlZ2lzdGVyLWRldmljZS9kZXZpY2UtcmVnaXN0cmF0aW9uLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vcmVnaXN0ZXItZGV2aWNlL2RldmljZS1yZWdpc3RyYXRpb24tdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLHdCQUF3QixFQUl6QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUNMLDhCQUE4QixFQUU5QixlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sRUFDTixPQUFPLEVBQ1AsY0FBYyxFQUNmLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7O0FBTXZELE1BQU0sT0FBTywrQkFBK0I7SUF3QzFDLFlBQ1UscUJBQTRDLEVBQzVDLHdCQUF3RCxFQUN4RCxlQUFnQyxFQUNoQyxZQUEwQixFQUMxQixnQkFBa0MsRUFDbEMsY0FBOEI7UUFMOUIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1Qyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQWdDO1FBQ3hELG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXZDeEMseUJBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQzdCLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGVBQVUsR0FBc0MsZUFBZSxDQUFDO1FBQ2hFLFdBQU0sR0FBRyx3QkFBd0IsQ0FBQztRQUV6QixnQkFBVyxHQUFHO1lBQ3JCLENBQUMsd0JBQXdCLENBQUMsc0JBQXNCLENBQUMsRUFBRTtnQkFDakQsS0FBSyxFQUFFLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztnQkFDeEMsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsR0FBRyxFQUFFLGFBQWE7YUFDbkI7WUFDRCxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixDQUFDLEVBQUU7Z0JBQzdDLEtBQUssRUFBRSxPQUFPLENBQUMsb0JBQW9CLENBQUM7Z0JBQ3BDLElBQUksRUFBRSxRQUFRO2dCQUNkLEdBQUcsRUFBRSxXQUFXO2FBQ2pCO1lBQ0QsQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDbkMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLElBQUksRUFBRSxjQUFjO2dCQUNwQixHQUFHLEVBQUUsY0FBYzthQUNwQjtZQUNELENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDO2dCQUN6QixJQUFJLEVBQUUsS0FBSztnQkFDWCxHQUFHLEVBQUUsYUFBYTthQUNuQjtTQUNGLENBQUM7UUFFTSxpQkFBWSxHQUFpQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLHlCQUFvQixHQUNuQyxJQUFJLGVBQWUsQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQVM1RCxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FDaEYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNWLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRTtnQkFDckIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hGLGVBQWU7YUFDaEIsQ0FBQztZQUNGLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtTQUNuQixDQUFDLENBQUMsQ0FDSixDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDO1FBQ2hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDdkMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsRUFDcEUsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQzFCLE9BQU8sQ0FDTCx1RkFBdUYsQ0FDeEYsRUFDRCxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FDdEIsQ0FDRixDQUNGLENBQUM7UUFDRixJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUTthQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNsQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsd0JBQXdCO2FBQzFCLFNBQVMsRUFBRTthQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2xDLFNBQVMsQ0FBQyxDQUFDLFNBQW1DLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQUk7UUFDYixJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBVTtRQUNyQixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUMvQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsRUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FDM0IsT0FBTyxDQUNMLHNGQUFzRixDQUN2RixFQUNELEVBQUUsRUFBRSxFQUFFLENBQ1AsRUFDRCxNQUFNLENBQUMsTUFBTSxFQUNiO1lBQ0UsRUFBRSxFQUFFLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztZQUNsQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUN6QixDQUNGLENBQUM7UUFFRixJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQTRCO1FBQ2pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQ25FLHdCQUF3QixDQUFDLGtCQUFrQixDQUM1QyxDQUFDO1FBQ0YsT0FBTyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsV0FBVyxDQUFDLFNBQTRDO1FBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCO1FBQzNCLE1BQU0sSUFBSSxHQUNSLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FDeEMscUJBQXFCLEVBQ3JCLHVCQUF1QixFQUN2Qiw4QkFBOEIsQ0FBQyxRQUFRLENBQ3hDLENBQW1DLENBQUM7UUFDdkMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxLQUFLLDhCQUE4QixDQUFDLFFBQVEsQ0FBQztJQUMvRSxDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQjtRQUN6QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUVELDRCQUE0QixDQUFDLElBQXlCO1FBQ3BELE9BQU8sQ0FDTCxJQUFJO1lBQ0osSUFBSSxDQUFDLE1BQU0sS0FBSyx3QkFBd0IsQ0FBQyxrQkFBa0I7WUFDM0QsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQ3pDLENBQUM7SUFDSixDQUFDO0lBRUQsaUNBQWlDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxLQUFLLDhCQUE4QixDQUFDLE9BQU8sQ0FBQztJQUN6RixDQUFDOzs0SEFyS1UsK0JBQStCO2dIQUEvQiwrQkFBK0Isb0VDM0I1Qyx5eVlBK1JBOzJGRHBRYSwrQkFBK0I7a0JBSjNDLFNBQVM7K0JBQ0UsOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGV2aWNlUmVnaXN0cmF0aW9uU2VjdXJpdHlNb2RlLFxuICBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMsXG4gIElEZXZpY2VSZWdpc3RyYXRpb24sXG4gIElEZXZpY2VSZWdpc3RyYXRpb25MaW1pdCxcbiAgUGFnaW5nXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRGV2aWNlQm9vdHN0cmFwUmVhbHRpbWVTZXJ2aWNlLFxuICBJUmVhbHRpbWVEZXZpY2VCb290c3RyYXAsXG4gIFRlbmFudFVpU2VydmljZSxcbiAgTW9kYWxTZXJ2aWNlLFxuICBTdGF0dXMsXG4gIGdldHRleHQsXG4gIE9wdGlvbnNTZXJ2aWNlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgUmVnaXN0ZXJEZXZpY2VTZXJ2aWNlIH0gZnJvbSAnLi9yZWdpc3Rlci1kZXZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBzb3J0QnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGV2aWNlLXJlZ2lzdHJhdGlvbi12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICdkZXZpY2UtcmVnaXN0cmF0aW9uLXZpZXcuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIERldmljZVJlZ2lzdHJhdGlvblZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGRldmljZVJlcXVlc3RzJDogT2JzZXJ2YWJsZTx7XG4gICAgZGF0YTogSURldmljZVJlZ2lzdHJhdGlvbltdO1xuICAgIHBhZ2luZz86IFBhZ2luZzxJRGV2aWNlUmVnaXN0cmF0aW9uPjtcbiAgfT47XG4gIGxpbWl0JDogT2JzZXJ2YWJsZTxJRGV2aWNlUmVnaXN0cmF0aW9uTGltaXQ+O1xuICBsaW1pdFJlYWNoZWRJbmZvJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICByZXF1aXJlU2VjdXJpdHlUb2tlbiA9IGZhbHNlO1xuICBpc01hbmFnZW1lbnRUZW5hbnQgPSBmYWxzZTtcbiAgaXNMb2FkaW5nID0gZmFsc2U7XG4gIGdyaWRPckxpc3Q6ICdpbnRlcmFjdC1saXN0JyB8ICdpbnRlcmFjdC1ncmlkJyA9ICdpbnRlcmFjdC1ncmlkJztcbiAgc3RhdHVzID0gRGV2aWNlUmVnaXN0cmF0aW9uU3RhdHVzO1xuXG4gIHJlYWRvbmx5IHN0YXR1c1Byb3BzID0ge1xuICAgIFtEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuV0FJVElOR19GT1JfQ09OTkVDVElPTl06IHtcbiAgICAgIGxhYmVsOiBnZXR0ZXh0KCdXYWl0aW5nIGZvciBjb25uZWN0aW9uJyksXG4gICAgICBpY29uOiAndW5saW5rJyxcbiAgICAgIGNsczogJ3RleHQtZGFuZ2VyJ1xuICAgIH0sXG4gICAgW0RldmljZVJlZ2lzdHJhdGlvblN0YXR1cy5QRU5ESU5HX0FDQ0VQVEFOQ0VdOiB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnUGVuZGluZyBhY2NlcHRhbmNlJyksXG4gICAgICBpY29uOiAnY2lyY2xlJyxcbiAgICAgIGNsczogJ3RleHQtaW5mbydcbiAgICB9LFxuICAgIFtEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuQUNDRVBURURdOiB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnQWNjZXB0ZWQnKSxcbiAgICAgIGljb246ICdjaGVjay1jaXJjbGUnLFxuICAgICAgY2xzOiAndGV4dC1zdWNjZXNzJ1xuICAgIH0sXG4gICAgW0RldmljZVJlZ2lzdHJhdGlvblN0YXR1cy5CTE9DS0VEXToge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ0Jsb2NrZWQnKSxcbiAgICAgIGljb246ICdiYW4nLFxuICAgICAgY2xzOiAndGV4dC1kYW5nZXInXG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmUkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZWN1cml0eVRva2VuUG9saWN5OiBCZWhhdmlvclN1YmplY3Q8RGV2aWNlUmVnaXN0cmF0aW9uU2VjdXJpdHlNb2RlPiA9XG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdChEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGUuT1BUSU9OQUwpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVnaXN0ZXJEZXZpY2VTZXJ2aWNlOiBSZWdpc3RlckRldmljZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBib290c3RyYXBSZWFsdGltZVNlcnZpY2U6IERldmljZUJvb3RzdHJhcFJlYWx0aW1lU2VydmljZSxcbiAgICBwcml2YXRlIHRlbmFudFVpU2VydmljZTogVGVuYW50VWlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvYWRBbGwoKTtcbiAgICB0aGlzLnNldElzTWFuYWdlbWVudFRlbmFudCgpO1xuICAgIHRoaXMuc2V0UmVxdWlyZVNlY3VyaXR5VG9rZW4oKTtcblxuICAgIHRoaXMuZGV2aWNlUmVxdWVzdHMkID0gdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UuZGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdHMkLnBpcGUoXG4gICAgICBtYXAocmVxID0+ICh7XG4gICAgICAgIGRhdGE6IHNvcnRCeShyZXEuZGF0YSwgW1xuICAgICAgICAgICh7IHN0YXR1cyB9KSA9PiAoc3RhdHVzID09PSBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFID8gMCA6IDEpLFxuICAgICAgICAgICctY3JlYXRpb25UaW1lJ1xuICAgICAgICBdKSxcbiAgICAgICAgcGFnaW5nOiByZXEucGFnaW5nXG4gICAgICB9KSlcbiAgICApO1xuICAgIHRoaXMubGltaXQkID0gdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UubGltaXQkO1xuICAgIHRoaXMubGltaXRSZWFjaGVkSW5mbyQgPSB0aGlzLmxpbWl0JC5waXBlKFxuICAgICAgZmlsdGVyKGRldmljZVJlZ2lzdHJhdGlvbkxpbWl0ID0+IGRldmljZVJlZ2lzdHJhdGlvbkxpbWl0LmlzUmVhY2hlZCksXG4gICAgICBzd2l0Y2hNYXAoKHsgbGltaXQgfSkgPT5cbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbShcbiAgICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICAgJ1lvdSByZWFjaGVkIHRoZSBsaW1pdCBvZiB7eyBtYXhEZXZpY2VzIH19IGRldmljZXMuIE5vIG1vcmUgZGV2aWNlcyBjYW4gYmUgcmVnaXN0ZXJlZC4nXG4gICAgICAgICAgKSxcbiAgICAgICAgICB7IG1heERldmljZXM6IGxpbWl0IH1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UubG9hZGluZyRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpXG4gICAgICAuc3Vic2NyaWJlKHZhbHVlID0+ICh0aGlzLmlzTG9hZGluZyA9IHZhbHVlKSk7XG5cbiAgICB0aGlzLmJvb3RzdHJhcFJlYWx0aW1lU2VydmljZVxuICAgICAgLm9uVXBkYXRlJCgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxuICAgICAgLnN1YnNjcmliZSgoYm9vdHN0cmFwOiBJUmVhbHRpbWVEZXZpY2VCb290c3RyYXApID0+IHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2Uub25EZXZpY2VCb290c3RyYXAoYm9vdHN0cmFwKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICB1cGRhdGVMaXN0KGRhdGEpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5pbnRlcm5hbExpc3RVcGRhdGUoZGF0YSk7XG4gIH1cblxuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICBnZXR0ZXh0KCdDYW5jZWwgZGV2aWNlIHJlZ2lzdHJhdGlvbicpLFxuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgIGdldHRleHQoXG4gICAgICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gY2FuY2VsIGRldmljZSByZWdpc3RyYXRpb24gZm9yIElEIFwie3tpZH19XCIuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/J1xuICAgICAgICApLFxuICAgICAgICB7IGlkIH1cbiAgICAgICksXG4gICAgICBTdGF0dXMuREFOR0VSLFxuICAgICAge1xuICAgICAgICBvazogZ2V0dGV4dCgnQ2FuY2VsIHJlZ2lzdHJhdGlvbicpLFxuICAgICAgICBjYW5jZWw6IGdldHRleHQoJ0Nsb3NlJylcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UucmVtb3ZlKGlkKTtcbiAgICB9XG4gIH1cblxuICBhY2NlcHQocmVxdWVzdDogSURldmljZVJlZ2lzdHJhdGlvbikge1xuICAgIHRoaXMucmVnaXN0ZXJEZXZpY2VTZXJ2aWNlLmFjY2VwdChyZXF1ZXN0KTtcbiAgfVxuXG4gIGFjY2VwdEFsbCgpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5hY2NlcHRBbGwoKTtcbiAgfVxuXG4gIGNhbkFjY2VwdEFsbCgpIHtcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdHMgPSB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5nZXRSZXF1ZXN0QnlTdGF0dXMoXG4gICAgICBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXG4gICAgKTtcbiAgICByZXR1cm4gIShwZW5kaW5nUmVxdWVzdHMubGVuZ3RoID4gMCAmJiAhdGhpcy5yZXF1aXJlU2VjdXJpdHlUb2tlbik7XG4gIH1cblxuICBsb2FkQWxsKCkge1xuICAgIHRoaXMucmVnaXN0ZXJEZXZpY2VTZXJ2aWNlLmxpc3QoKTtcbiAgfVxuXG4gIGRpc3BsYXlNb2RlKGxpc3RDbGFzczogJ2ludGVyYWN0LWxpc3QnIHwgJ2ludGVyYWN0LWdyaWQnKSB7XG4gICAgdGhpcy5ncmlkT3JMaXN0ID0gbGlzdENsYXNzO1xuICB9XG5cbiAgYXN5bmMgc2V0UmVxdWlyZVNlY3VyaXR5VG9rZW4oKSB7XG4gICAgY29uc3QgbW9kZTogRGV2aWNlUmVnaXN0cmF0aW9uU2VjdXJpdHlNb2RlID1cbiAgICAgIChhd2FpdCB0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldFRlbmFudE9wdGlvbjxEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGU+KFxuICAgICAgICAnZGV2aWNlLXJlZ2lzdHJhdGlvbicsXG4gICAgICAgICdzZWN1cml0eS10b2tlbi5wb2xpY3knLFxuICAgICAgICBEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGUuT1BUSU9OQUxcbiAgICAgICkpIGFzIERldmljZVJlZ2lzdHJhdGlvblNlY3VyaXR5TW9kZTtcbiAgICB0aGlzLl9zZWN1cml0eVRva2VuUG9saWN5Lm5leHQobW9kZSk7XG4gICAgdGhpcy5yZXF1aXJlU2VjdXJpdHlUb2tlbiA9IG1vZGUgPT09IERldmljZVJlZ2lzdHJhdGlvblNlY3VyaXR5TW9kZS5SRVFVSVJFRDtcbiAgfVxuXG4gIGFzeW5jIHNldElzTWFuYWdlbWVudFRlbmFudCgpIHtcbiAgICB0aGlzLmlzTWFuYWdlbWVudFRlbmFudCA9IGF3YWl0IHRoaXMudGVuYW50VWlTZXJ2aWNlLmlzTWFuYWdlbWVudFRlbmFudCgpO1xuICB9XG5cbiAgc2hvdWxkU2hvd1NlY3VyaXR5VG9rZW5JbnB1dChkYXRhOiBJRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGEgJiZcbiAgICAgIGRhdGEuc3RhdHVzID09PSBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFICYmXG4gICAgICB0aGlzLnNob3dUb2tlbklucHV0QmFzZWRPblNlY3VyaXR5TW9kZSgpXG4gICAgKTtcbiAgfVxuXG4gIHNob3dUb2tlbklucHV0QmFzZWRPblNlY3VyaXR5TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdXJpdHlUb2tlblBvbGljeS5nZXRWYWx1ZSgpICE9PSBEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGUuSUdOT1JFRDtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImRldmljZVJlcXVlc3RzJCB8IGFzeW5jIGFzIGRldmljZVJlcXVlc3RMaXN0XCI+XG4gIDxjOHktdGl0bGU+XG4gICAge3sgJ0RldmljZSByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgPHNtYWxsICpuZ0lmPVwiZGV2aWNlUmVxdWVzdExpc3QuZGF0YS5sZW5ndGggPT09IDFcIj4xIHt7ICduZXcgZGV2aWNlJyB8IHRyYW5zbGF0ZSB9fTwvc21hbGw+XG4gICAgPHNtYWxsICpuZ0lmPVwiZGV2aWNlUmVxdWVzdExpc3QuZGF0YS5sZW5ndGggPiAxXCI+XG4gICAgICB7eyBkZXZpY2VSZXF1ZXN0TGlzdC5kYXRhLmxlbmd0aCB9fSB7eyAnbmV3IGRldmljZXMnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9zbWFsbD5cbiAgPC9jOHktdGl0bGU+XG5cbiAgPGM4eS1icmVhZGNydW1iPlxuICAgIDxjOHktYnJlYWRjcnVtYi1pdGVtIFtpY29uXT1cIidleGNoYW5nZSdcIiBbbGFiZWxdPVwiJ0RldmljZXMnIHwgdHJhbnNsYXRlXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICAgIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgICBbaWNvbl09XCInYzh5LWRldmljZS1jb25uZWN0J1wiXG4gICAgICBbbGFiZWxdPVwiJ0RldmljZSByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8L2M4eS1icmVhZGNydW1iPlxuXG4gIDxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCIgaXRlbUNsYXNzPVwibmF2YmFyLWZvcm0gaGlkZGVuLXhzXCI+XG4gICAgPGM4eS1saXN0LWRpc3BsYXktc3dpdGNoIChvbkxpc3RDbGFzc0NoYW5nZSk9XCJkaXNwbGF5TW9kZSgkZXZlbnQpXCI+PC9jOHktbGlzdC1kaXNwbGF5LXN3aXRjaD5cbiAgPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaW1pdCQgfCBhc3luYyBhcyBsaW1pdFN0YXR1c1wiPlxuICAgIDxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiIFtwcmlvcml0eV09XCIxMFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB0aXRsZT1cInt7ICdBY2NlcHQgYWxsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICpjOHlJZkFsbG93ZWQ9XCJbJ1JPTEVfREVWSUNFX0NPTlRST0xfQURNSU4nXVwiXG4gICAgICAgIChjbGljayk9XCJhY2NlcHRBbGwoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJjYW5BY2NlcHRBbGwoKSB8fCBsaW1pdFN0YXR1cz8uaXNSZWFjaGVkXCJcbiAgICAgID5cbiAgICAgICAgPGkgW2M4eUljb25dPVwiJ2NoZWNrJ1wiPjwvaT5cbiAgICAgICAge3sgJ0FjY2VwdCBhbGwnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbiAgICA8Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIiBbcHJpb3JpdHldPVwiOVwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB0aXRsZT1cInt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgKGNsaWNrKT1cImxvYWRBbGwoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0xvYWRpbmdcIlxuICAgICAgPlxuICAgICAgICA8aSBbYzh5SWNvbl09XCIncmVmcmVzaCdcIiBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiBpc0xvYWRpbmcgfVwiPjwvaT5cbiAgICAgICAge3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuICAgIDxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiICpjOHlJZkFsbG93ZWQ9XCJbJ1JPTEVfREVWSUNFX0NPTlRST0xfQURNSU4nXVwiPlxuICAgICAgPGM4eS1yZWdpc3Rlci1kZXZpY2UtZHJvcGRvd24+PC9jOHktcmVnaXN0ZXItZGV2aWNlLWRyb3Bkb3duPlxuICAgIDwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuICAgIDxjOHktaGVscCBzcmM9XCIvdXNlcnMtZ3VpZGUvZGV2aWNlLW1hbmFnZW1lbnQvI2Nvbm5lY3RpbmctZGV2aWNlc1wiPjwvYzh5LWhlbHA+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGV2aWNlUmVxdWVzdExpc3QuZGF0YS5sZW5ndGggPiAwOyBlbHNlIG5vRGF0YVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZ3JvdXBcIiBbbmdDbGFzc109XCJncmlkT3JMaXN0XCI+XG4gICAgICAgIDwhLS0gU1RBUlQgaW50ZXJhY3QtbGlzdCBzdGlja3kgaGVhZGVyIFNUQVJUIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZ3JpZE9yTGlzdCA9PT0gJ2ludGVyYWN0LWxpc3QnXCIgY2xhc3M9XCJwYWdlLXN0aWNreS1oZWFkZXIgaGlkZGVuLXhzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtbC00MFwiPlxuICAgICAgICAgICAgICA8cCB0cmFuc2xhdGU+RGV2aWNlPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayBjYXJkLWNvbHVtbi0zMCBwLWwtMCBtLWwtOFwiPlxuICAgICAgICAgICAgICA8cCB0cmFuc2xhdGU+U3RhdHVzPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayBjYXJkLWNvbHVtbi0zMCBwLTBcIiAqbmdJZj1cInNob3dUb2tlbklucHV0QmFzZWRPblNlY3VyaXR5TW9kZSgpXCI+XG4gICAgICAgICAgICAgIDxwIHRyYW5zbGF0ZT5TZWN1cml0eSB0b2tlbjwvcD5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHBcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBwb3BvdmVyPVwie3tcbiAgICAgICAgICAgICAgICAgICdTZWN1cml0eSB0b2tlbiBpcyByZXF1aXJlZCBpZiB0aGUgY29ubmVjdGVkIGRldmljZSB1c2VzIGl0LicgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBjYXJkLWNvbHVtbi01MFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1jb250ZW50c1wiICpuZ0lmPVwiaXNNYW5hZ2VtZW50VGVuYW50OyBlbHNlIG5vTWFuYWdlbWVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbHVtbi01MFwiPlxuICAgICAgICAgICAgICAgICAge3sgJ0NyZWF0ZWQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTMwXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnQnlgdXNlcmAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTIwXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnVGVuYW50IElEJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub01hbmFnZW1lbnQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtY29udGVudHNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbHVtbi01MFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQ3JlYXRlZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdCeWB1c2VyYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1hY3Rpb25zLWdyb3VwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE3NnB4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4gYnRuLXhzIGludmlzaWJsZVwiPlxuICAgICAgICAgICAgICAgIDwhLS1FTVBUWSBieSBkZXNpZ24tLT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRU5EIGludGVyYWN0LWxpc3Qgc3RpY2t5IGhlYWRlciBFTkQgLS0+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImxpbWl0U3RhdHVzPy5pc1JlYWNoZWRcIiBjbGFzcz1cImNvbC14cy0xMiBjb2wtc20tNiBjb2wtbWQtNCBjb2wtbGctM1wiPlxuICAgICAgICAgIDxwIGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZyBjZW50ZXItYmxvY2tcIiByb2xlPVwiYWxlcnRcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgIHt7IGxpbWl0UmVhY2hlZEluZm8kIHwgYXN5bmMgfX1cbiAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+UGxlYXNlIGNvbnRhY3QgeW91ciBwbGF0Zm9ybSBhZG1pbmlzdHJhdG9yLjwvc3Bhbj5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNpbmdsZVJlcXVlc3Qgb2YgZGV2aWNlUmVxdWVzdExpc3QuZGF0YVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtMTIgY29sLXNtLTYgY29sLW1kLTQgY29sLWxnLTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBzZXBhcmF0b3JcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1pY29uXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBbYzh5SWNvbl09XCJzdGF0dXNQcm9wc1tzaW5nbGVSZXF1ZXN0LnN0YXR1c10uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJzdGF0dXNQcm9wc1tzaW5nbGVSZXF1ZXN0LnN0YXR1c10uY2xzXCJcbiAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlIHRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cInt7IHNpbmdsZVJlcXVlc3QuaWQgfX1cIj5cbiAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZVJlcXVlc3QuaWQgfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIHRleHQtY2VudGVyIGNhcmQtY29sdW1uLTMwXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCIgdHJhbnNsYXRlPlN0YXR1czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2luZ2xlUmVxdWVzdC5zdGF0dXMgPT09IHN0YXR1cy5XQUlUSU5HX0ZPUl9DT05ORUNUSU9OXCJcbiAgICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tc3BpbiB0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIHt7IHN0YXR1c1Byb3BzW3NpbmdsZVJlcXVlc3Quc3RhdHVzXS5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqYzh5SWZBbGxvd2VkPVwiWydST0xFX0RFVklDRV9DT05UUk9MX0FETUlOJ11cIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtYmxvY2sgdGV4dC1jZW50ZXIgY2FyZC1jb2x1bW4tMzAgcC10LTBcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncC1iLTAnOiAhc2hvdWxkU2hvd1NlY3VyaXR5VG9rZW5JbnB1dChzaW5nbGVSZXF1ZXN0KSB9XCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1Rva2VuSW5wdXRCYXNlZE9uU2VjdXJpdHlNb2RlKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93U2VjdXJpdHlUb2tlbklucHV0KHNpbmdsZVJlcXVlc3QpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JpZE9yTGlzdCAhPT0gJ2ludGVyYWN0LWxpc3QnXCIgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5IHRva2VuXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzaW5nbGVSZXF1ZXN0LnNlY3VyaXR5VG9rZW5cIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidlLmcuIHt7IGV4YW1wbGUgfX0nIHwgdHJhbnNsYXRlOiB7IGV4YW1wbGU6ICdBMWUzZ2g1ZHMnIH1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlU2VjdXJpdHlUb2tlblwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1hY3Rpb25zLWdyb3VwIGQtZmxleCBhLWktY2VudGVyIGotYy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDE3NnB4XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAnYnRuLWRhbmdlcic6IHNpbmdsZVJlcXVlc3Quc3RhdHVzID09PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFLFxuICAgICAgICAgICAgICAgICAgICAgICdidG4tZGVmYXVsdCc6IHNpbmdsZVJlcXVlc3Quc3RhdHVzICE9PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7e1xuICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZVJlcXVlc3Quc3RhdHVzID09PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICgnUmVtb3ZlJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKCdDYW5jZWwnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoc2luZ2xlUmVxdWVzdC5pZClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaW5nbGVSZXF1ZXN0LnN0YXR1cyA9PT0gc3RhdHVzLlBFTkRJTkdfQUNDRVBUQU5DRVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdSZW1vdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaW5nbGVSZXF1ZXN0LnN0YXR1cyAhPT0gc3RhdHVzLlBFTkRJTkdfQUNDRVBUQU5DRVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWNjZXB0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY2NlcHQoc2luZ2xlUmVxdWVzdClcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNpbmdsZVJlcXVlc3Quc3RhdHVzID09PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0U3RhdHVzPy5pc1JlYWNoZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoIXNpbmdsZVJlcXVlc3Quc2VjdXJpdHlUb2tlbiAmJiByZXF1aXJlU2VjdXJpdHlUb2tlbilcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0FjY2VwdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgc2VwYXJhdG9yIHRleHQtY2VudGVyIGNhcmQtY29sdW1uLTUwXCI+XG4gICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwiaXNNYW5hZ2VtZW50VGVuYW50OyBlbHNlIG5vTWFuYWdlbWVudFwiIGNsYXNzPVwiZC1jb250ZW50c1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtY29udGVudHNcIiAqbmdJZj1cInNpbmdsZVJlcXVlc3QuY3JlYXRpb25UaW1lICYmIHNpbmdsZVJlcXVlc3Qub3duZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCIgdHJhbnNsYXRlPkNyZWF0ZWQgb25gZGF0ZWA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb2x1bW4tNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBzaW5nbGVSZXF1ZXN0LmNyZWF0aW9uVGltZSB8IGM4eURhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1sLTQgbS1yLTRcIiB0cmFuc2xhdGU+YnlgdXNlcmA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb2x1bW4tMzBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cInt7IHNpbmdsZVJlcXVlc3Qub3duZXIgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZVJlcXVlc3Qub3duZXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tbC00IG0tci00XCIgdHJhbnNsYXRlPmluYHRlbmFudGA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb2x1bW4tMjBcIj57eyBzaW5nbGVSZXF1ZXN0LnRlbmFudElkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXNpbmdsZVJlcXVlc3QuY3JlYXRpb25UaW1lIHx8ICFzaW5nbGVSZXF1ZXN0Lm93bmVyXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTUwXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbHVtbi0zMFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGxcIiB0cmFuc2xhdGU+Q3JlYXRlZCBpbmB0ZW5hbnRgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb2x1bW4tMjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZVJlcXVlc3QudGVuYW50SWQgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vTWFuYWdlbWVudD5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImQtY29udGVudHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tbC00IG0tci00XCIgdHJhbnNsYXRlPkNyZWF0ZWQgb25gZGF0ZWA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb2x1bW4tNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBzaW5nbGVSZXF1ZXN0LmNyZWF0aW9uVGltZSB8IGM4eURhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1sLTQgbS1yLTRcIiB0cmFuc2xhdGU+YnlgdXNlcmA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb2x1bW4tNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cInt7IHNpbmdsZVJlcXVlc3Qub3duZXIgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZVJlcXVlc3Qub3duZXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjOHktbG9hZC1tb3JlXG4gICAgICAgIFtwYWdpbmddPVwiZGV2aWNlUmVxdWVzdExpc3QucGFnaW5nXCJcbiAgICAgICAgW2hpZGRlbl09XCJ0cnVlXCJcbiAgICAgICAgKG9uTG9hZCk9XCJ1cGRhdGVMaXN0KCRldmVudClcIlxuICAgICAgPjwvYzh5LWxvYWQtbW9yZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbm9EYXRhPlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZSBtLXQtNDAgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgPGgxIGNsYXNzPVwiYzh5LWljb24gYzh5LWljb24tZGV2aWNlLWNvbm5lY3QgYzh5LWljb24tZHVvY29sb3JcIj48L2gxPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGltaXRTdGF0dXM/LmlzUmVhY2hlZDsgZWxzZSBsaW1pdE5vdFJlYWNoZWRcIj5cbiAgICAgICAgICA8aDM+XG4gICAgICAgICAgICB7eyBsaW1pdFJlYWNoZWRJbmZvJCB8IGFzeW5jIH19XG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8cCB0cmFuc2xhdGU+UGxlYXNlIGNvbnRhY3QgeW91ciBwbGF0Zm9ybSBhZG1pbmlzdHJhdG9yLjwvcD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbGltaXROb3RSZWFjaGVkPlxuICAgICAgICAgIDxoMyB0cmFuc2xhdGU+Tm8gcGVuZGluZyByZWdpc3RyYXRpb25zIHRvIGRpc3BsYXkuPC9oMz5cbiAgICAgICAgICA8cCAqYzh5SWZBbGxvd2VkPVwiWydST0xFX0RFVklDRV9DT05UUk9MX0FETUlOJ11cIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICBVc2UgdGhlIFwiUmVnaXN0ZXIgZGV2aWNlXCIgZHJvcGRvd24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIuXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLXJlZ2lzdHJhdGlvbi12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3JlZ2lzdGVyLWRldmljZS9kZXZpY2UtcmVnaXN0cmF0aW9uLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vcmVnaXN0ZXItZGV2aWNlL2RldmljZS1yZWdpc3RyYXRpb24tdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLHdCQUF3QixFQUl6QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUNMLDhCQUE4QixFQUU5QixlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sRUFDTixPQUFPLEVBQ1AsY0FBYyxFQUNmLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7O0FBTXZELE1BQU0sT0FBTywrQkFBK0I7SUF3QzFDLFlBQ1UscUJBQTRDLEVBQzVDLHdCQUF3RCxFQUN4RCxlQUFnQyxFQUNoQyxZQUEwQixFQUMxQixnQkFBa0MsRUFDbEMsY0FBOEI7UUFMOUIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1Qyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQWdDO1FBQ3hELG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXZDeEMseUJBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQzdCLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGVBQVUsR0FBc0MsZUFBZSxDQUFDO1FBQ2hFLFdBQU0sR0FBRyx3QkFBd0IsQ0FBQztRQUV6QixnQkFBVyxHQUFHO1lBQ3JCLENBQUMsd0JBQXdCLENBQUMsc0JBQXNCLENBQUMsRUFBRTtnQkFDakQsS0FBSyxFQUFFLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztnQkFDeEMsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsR0FBRyxFQUFFLGFBQWE7YUFDbkI7WUFDRCxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixDQUFDLEVBQUU7Z0JBQzdDLEtBQUssRUFBRSxPQUFPLENBQUMsb0JBQW9CLENBQUM7Z0JBQ3BDLElBQUksRUFBRSxRQUFRO2dCQUNkLEdBQUcsRUFBRSxXQUFXO2FBQ2pCO1lBQ0QsQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDbkMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLElBQUksRUFBRSxjQUFjO2dCQUNwQixHQUFHLEVBQUUsY0FBYzthQUNwQjtZQUNELENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDO2dCQUN6QixJQUFJLEVBQUUsS0FBSztnQkFDWCxHQUFHLEVBQUUsYUFBYTthQUNuQjtTQUNGLENBQUM7UUFFTSxpQkFBWSxHQUFpQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLHlCQUFvQixHQUNuQyxJQUFJLGVBQWUsQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQVM1RCxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FDaEYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNWLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRTtnQkFDckIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hGLGVBQWU7YUFDaEIsQ0FBQztZQUNGLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtTQUNuQixDQUFDLENBQUMsQ0FDSixDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDO1FBQ2hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDdkMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsRUFDcEUsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQzFCLE9BQU8sQ0FDTCx1RkFBdUYsQ0FDeEYsRUFDRCxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FDdEIsQ0FDRixDQUNGLENBQUM7UUFDRixJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUTthQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNsQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsd0JBQXdCO2FBQzFCLFNBQVMsRUFBRTthQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2xDLFNBQVMsQ0FBQyxDQUFDLFNBQW1DLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQUk7UUFDYixJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBVTtRQUNyQixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUMvQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsRUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FDM0IsT0FBTyxDQUNMLHNGQUFzRixDQUN2RixFQUNELEVBQUUsRUFBRSxFQUFFLENBQ1AsRUFDRCxNQUFNLENBQUMsTUFBTSxFQUNiO1lBQ0UsRUFBRSxFQUFFLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztZQUNsQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUN6QixDQUNGLENBQUM7UUFFRixJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQTRCO1FBQ2pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQ25FLHdCQUF3QixDQUFDLGtCQUFrQixDQUM1QyxDQUFDO1FBQ0YsT0FBTyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsV0FBVyxDQUFDLFNBQTRDO1FBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCO1FBQzNCLE1BQU0sSUFBSSxHQUNSLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FDeEMscUJBQXFCLEVBQ3JCLHVCQUF1QixFQUN2Qiw4QkFBOEIsQ0FBQyxRQUFRLENBQ3hDLENBQW1DLENBQUM7UUFDdkMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxLQUFLLDhCQUE4QixDQUFDLFFBQVEsQ0FBQztJQUMvRSxDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQjtRQUN6QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUVELDRCQUE0QixDQUFDLElBQXlCO1FBQ3BELE9BQU8sQ0FDTCxJQUFJO1lBQ0osSUFBSSxDQUFDLE1BQU0sS0FBSyx3QkFBd0IsQ0FBQyxrQkFBa0I7WUFDM0QsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQ3pDLENBQUM7SUFDSixDQUFDO0lBRUQsaUNBQWlDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxLQUFLLDhCQUE4QixDQUFDLE9BQU8sQ0FBQztJQUN6RixDQUFDOzs0SEFyS1UsK0JBQStCO2dIQUEvQiwrQkFBK0Isb0VDM0I1Qyx1alpBaVNBOzJGRHRRYSwrQkFBK0I7a0JBSjNDLFNBQVM7K0JBQ0UsOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGV2aWNlUmVnaXN0cmF0aW9uU2VjdXJpdHlNb2RlLFxuICBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMsXG4gIElEZXZpY2VSZWdpc3RyYXRpb24sXG4gIElEZXZpY2VSZWdpc3RyYXRpb25MaW1pdCxcbiAgUGFnaW5nXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRGV2aWNlQm9vdHN0cmFwUmVhbHRpbWVTZXJ2aWNlLFxuICBJUmVhbHRpbWVEZXZpY2VCb290c3RyYXAsXG4gIFRlbmFudFVpU2VydmljZSxcbiAgTW9kYWxTZXJ2aWNlLFxuICBTdGF0dXMsXG4gIGdldHRleHQsXG4gIE9wdGlvbnNTZXJ2aWNlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgUmVnaXN0ZXJEZXZpY2VTZXJ2aWNlIH0gZnJvbSAnLi9yZWdpc3Rlci1kZXZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBzb3J0QnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGV2aWNlLXJlZ2lzdHJhdGlvbi12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICdkZXZpY2UtcmVnaXN0cmF0aW9uLXZpZXcuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIERldmljZVJlZ2lzdHJhdGlvblZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGRldmljZVJlcXVlc3RzJDogT2JzZXJ2YWJsZTx7XG4gICAgZGF0YTogSURldmljZVJlZ2lzdHJhdGlvbltdO1xuICAgIHBhZ2luZz86IFBhZ2luZzxJRGV2aWNlUmVnaXN0cmF0aW9uPjtcbiAgfT47XG4gIGxpbWl0JDogT2JzZXJ2YWJsZTxJRGV2aWNlUmVnaXN0cmF0aW9uTGltaXQ+O1xuICBsaW1pdFJlYWNoZWRJbmZvJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICByZXF1aXJlU2VjdXJpdHlUb2tlbiA9IGZhbHNlO1xuICBpc01hbmFnZW1lbnRUZW5hbnQgPSBmYWxzZTtcbiAgaXNMb2FkaW5nID0gZmFsc2U7XG4gIGdyaWRPckxpc3Q6ICdpbnRlcmFjdC1saXN0JyB8ICdpbnRlcmFjdC1ncmlkJyA9ICdpbnRlcmFjdC1ncmlkJztcbiAgc3RhdHVzID0gRGV2aWNlUmVnaXN0cmF0aW9uU3RhdHVzO1xuXG4gIHJlYWRvbmx5IHN0YXR1c1Byb3BzID0ge1xuICAgIFtEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuV0FJVElOR19GT1JfQ09OTkVDVElPTl06IHtcbiAgICAgIGxhYmVsOiBnZXR0ZXh0KCdXYWl0aW5nIGZvciBjb25uZWN0aW9uJyksXG4gICAgICBpY29uOiAndW5saW5rJyxcbiAgICAgIGNsczogJ3RleHQtZGFuZ2VyJ1xuICAgIH0sXG4gICAgW0RldmljZVJlZ2lzdHJhdGlvblN0YXR1cy5QRU5ESU5HX0FDQ0VQVEFOQ0VdOiB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnUGVuZGluZyBhY2NlcHRhbmNlJyksXG4gICAgICBpY29uOiAnY2lyY2xlJyxcbiAgICAgIGNsczogJ3RleHQtaW5mbydcbiAgICB9LFxuICAgIFtEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuQUNDRVBURURdOiB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnQWNjZXB0ZWQnKSxcbiAgICAgIGljb246ICdjaGVjay1jaXJjbGUnLFxuICAgICAgY2xzOiAndGV4dC1zdWNjZXNzJ1xuICAgIH0sXG4gICAgW0RldmljZVJlZ2lzdHJhdGlvblN0YXR1cy5CTE9DS0VEXToge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ0Jsb2NrZWQnKSxcbiAgICAgIGljb246ICdiYW4nLFxuICAgICAgY2xzOiAndGV4dC1kYW5nZXInXG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmUkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZWN1cml0eVRva2VuUG9saWN5OiBCZWhhdmlvclN1YmplY3Q8RGV2aWNlUmVnaXN0cmF0aW9uU2VjdXJpdHlNb2RlPiA9XG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdChEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGUuT1BUSU9OQUwpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVnaXN0ZXJEZXZpY2VTZXJ2aWNlOiBSZWdpc3RlckRldmljZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBib290c3RyYXBSZWFsdGltZVNlcnZpY2U6IERldmljZUJvb3RzdHJhcFJlYWx0aW1lU2VydmljZSxcbiAgICBwcml2YXRlIHRlbmFudFVpU2VydmljZTogVGVuYW50VWlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvYWRBbGwoKTtcbiAgICB0aGlzLnNldElzTWFuYWdlbWVudFRlbmFudCgpO1xuICAgIHRoaXMuc2V0UmVxdWlyZVNlY3VyaXR5VG9rZW4oKTtcblxuICAgIHRoaXMuZGV2aWNlUmVxdWVzdHMkID0gdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UuZGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdHMkLnBpcGUoXG4gICAgICBtYXAocmVxID0+ICh7XG4gICAgICAgIGRhdGE6IHNvcnRCeShyZXEuZGF0YSwgW1xuICAgICAgICAgICh7IHN0YXR1cyB9KSA9PiAoc3RhdHVzID09PSBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFID8gMCA6IDEpLFxuICAgICAgICAgICctY3JlYXRpb25UaW1lJ1xuICAgICAgICBdKSxcbiAgICAgICAgcGFnaW5nOiByZXEucGFnaW5nXG4gICAgICB9KSlcbiAgICApO1xuICAgIHRoaXMubGltaXQkID0gdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UubGltaXQkO1xuICAgIHRoaXMubGltaXRSZWFjaGVkSW5mbyQgPSB0aGlzLmxpbWl0JC5waXBlKFxuICAgICAgZmlsdGVyKGRldmljZVJlZ2lzdHJhdGlvbkxpbWl0ID0+IGRldmljZVJlZ2lzdHJhdGlvbkxpbWl0LmlzUmVhY2hlZCksXG4gICAgICBzd2l0Y2hNYXAoKHsgbGltaXQgfSkgPT5cbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbShcbiAgICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICAgJ1lvdSByZWFjaGVkIHRoZSBsaW1pdCBvZiB7eyBtYXhEZXZpY2VzIH19IGRldmljZXMuIE5vIG1vcmUgZGV2aWNlcyBjYW4gYmUgcmVnaXN0ZXJlZC4nXG4gICAgICAgICAgKSxcbiAgICAgICAgICB7IG1heERldmljZXM6IGxpbWl0IH1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UubG9hZGluZyRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpXG4gICAgICAuc3Vic2NyaWJlKHZhbHVlID0+ICh0aGlzLmlzTG9hZGluZyA9IHZhbHVlKSk7XG5cbiAgICB0aGlzLmJvb3RzdHJhcFJlYWx0aW1lU2VydmljZVxuICAgICAgLm9uVXBkYXRlJCgpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxuICAgICAgLnN1YnNjcmliZSgoYm9vdHN0cmFwOiBJUmVhbHRpbWVEZXZpY2VCb290c3RyYXApID0+IHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2Uub25EZXZpY2VCb290c3RyYXAoYm9vdHN0cmFwKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICB1cGRhdGVMaXN0KGRhdGEpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5pbnRlcm5hbExpc3RVcGRhdGUoZGF0YSk7XG4gIH1cblxuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICBnZXR0ZXh0KCdDYW5jZWwgZGV2aWNlIHJlZ2lzdHJhdGlvbicpLFxuICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgIGdldHRleHQoXG4gICAgICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gY2FuY2VsIGRldmljZSByZWdpc3RyYXRpb24gZm9yIElEIFwie3tpZH19XCIuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/J1xuICAgICAgICApLFxuICAgICAgICB7IGlkIH1cbiAgICAgICksXG4gICAgICBTdGF0dXMuREFOR0VSLFxuICAgICAge1xuICAgICAgICBvazogZ2V0dGV4dCgnQ2FuY2VsIHJlZ2lzdHJhdGlvbicpLFxuICAgICAgICBjYW5jZWw6IGdldHRleHQoJ0Nsb3NlJylcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgdGhpcy5yZWdpc3RlckRldmljZVNlcnZpY2UucmVtb3ZlKGlkKTtcbiAgICB9XG4gIH1cblxuICBhY2NlcHQocmVxdWVzdDogSURldmljZVJlZ2lzdHJhdGlvbikge1xuICAgIHRoaXMucmVnaXN0ZXJEZXZpY2VTZXJ2aWNlLmFjY2VwdChyZXF1ZXN0KTtcbiAgfVxuXG4gIGFjY2VwdEFsbCgpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5hY2NlcHRBbGwoKTtcbiAgfVxuXG4gIGNhbkFjY2VwdEFsbCgpIHtcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdHMgPSB0aGlzLnJlZ2lzdGVyRGV2aWNlU2VydmljZS5nZXRSZXF1ZXN0QnlTdGF0dXMoXG4gICAgICBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXG4gICAgKTtcbiAgICByZXR1cm4gIShwZW5kaW5nUmVxdWVzdHMubGVuZ3RoID4gMCAmJiAhdGhpcy5yZXF1aXJlU2VjdXJpdHlUb2tlbik7XG4gIH1cblxuICBsb2FkQWxsKCkge1xuICAgIHRoaXMucmVnaXN0ZXJEZXZpY2VTZXJ2aWNlLmxpc3QoKTtcbiAgfVxuXG4gIGRpc3BsYXlNb2RlKGxpc3RDbGFzczogJ2ludGVyYWN0LWxpc3QnIHwgJ2ludGVyYWN0LWdyaWQnKSB7XG4gICAgdGhpcy5ncmlkT3JMaXN0ID0gbGlzdENsYXNzO1xuICB9XG5cbiAgYXN5bmMgc2V0UmVxdWlyZVNlY3VyaXR5VG9rZW4oKSB7XG4gICAgY29uc3QgbW9kZTogRGV2aWNlUmVnaXN0cmF0aW9uU2VjdXJpdHlNb2RlID1cbiAgICAgIChhd2FpdCB0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldFRlbmFudE9wdGlvbjxEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGU+KFxuICAgICAgICAnZGV2aWNlLXJlZ2lzdHJhdGlvbicsXG4gICAgICAgICdzZWN1cml0eS10b2tlbi5wb2xpY3knLFxuICAgICAgICBEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGUuT1BUSU9OQUxcbiAgICAgICkpIGFzIERldmljZVJlZ2lzdHJhdGlvblNlY3VyaXR5TW9kZTtcbiAgICB0aGlzLl9zZWN1cml0eVRva2VuUG9saWN5Lm5leHQobW9kZSk7XG4gICAgdGhpcy5yZXF1aXJlU2VjdXJpdHlUb2tlbiA9IG1vZGUgPT09IERldmljZVJlZ2lzdHJhdGlvblNlY3VyaXR5TW9kZS5SRVFVSVJFRDtcbiAgfVxuXG4gIGFzeW5jIHNldElzTWFuYWdlbWVudFRlbmFudCgpIHtcbiAgICB0aGlzLmlzTWFuYWdlbWVudFRlbmFudCA9IGF3YWl0IHRoaXMudGVuYW50VWlTZXJ2aWNlLmlzTWFuYWdlbWVudFRlbmFudCgpO1xuICB9XG5cbiAgc2hvdWxkU2hvd1NlY3VyaXR5VG9rZW5JbnB1dChkYXRhOiBJRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGEgJiZcbiAgICAgIGRhdGEuc3RhdHVzID09PSBEZXZpY2VSZWdpc3RyYXRpb25TdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFICYmXG4gICAgICB0aGlzLnNob3dUb2tlbklucHV0QmFzZWRPblNlY3VyaXR5TW9kZSgpXG4gICAgKTtcbiAgfVxuXG4gIHNob3dUb2tlbklucHV0QmFzZWRPblNlY3VyaXR5TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdXJpdHlUb2tlblBvbGljeS5nZXRWYWx1ZSgpICE9PSBEZXZpY2VSZWdpc3RyYXRpb25TZWN1cml0eU1vZGUuSUdOT1JFRDtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImRldmljZVJlcXVlc3RzJCB8IGFzeW5jIGFzIGRldmljZVJlcXVlc3RMaXN0XCI+XG4gIDxjOHktdGl0bGU+XG4gICAge3sgJ0RldmljZSByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgPHNtYWxsICpuZ0lmPVwiZGV2aWNlUmVxdWVzdExpc3QuZGF0YS5sZW5ndGggPT09IDFcIj4xIHt7ICduZXcgZGV2aWNlJyB8IHRyYW5zbGF0ZSB9fTwvc21hbGw+XG4gICAgPHNtYWxsICpuZ0lmPVwiZGV2aWNlUmVxdWVzdExpc3QuZGF0YS5sZW5ndGggPiAxXCI+XG4gICAgICB7eyBkZXZpY2VSZXF1ZXN0TGlzdC5kYXRhLmxlbmd0aCB9fSB7eyAnbmV3IGRldmljZXMnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9zbWFsbD5cbiAgPC9jOHktdGl0bGU+XG5cbiAgPGM4eS1icmVhZGNydW1iPlxuICAgIDxjOHktYnJlYWRjcnVtYi1pdGVtIFtpY29uXT1cIidleGNoYW5nZSdcIiBbbGFiZWxdPVwiJ0RldmljZXMnIHwgdHJhbnNsYXRlXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICAgIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgICBbaWNvbl09XCInYzh5LWRldmljZS1jb25uZWN0J1wiXG4gICAgICBbbGFiZWxdPVwiJ0RldmljZSByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8L2M4eS1icmVhZGNydW1iPlxuXG4gIDxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCIgaXRlbUNsYXNzPVwibmF2YmFyLWZvcm0gaGlkZGVuLXhzXCI+XG4gICAgPGM4eS1saXN0LWRpc3BsYXktc3dpdGNoIChvbkxpc3RDbGFzc0NoYW5nZSk9XCJkaXNwbGF5TW9kZSgkZXZlbnQpXCI+PC9jOHktbGlzdC1kaXNwbGF5LXN3aXRjaD5cbiAgPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaW1pdCQgfCBhc3luYyBhcyBsaW1pdFN0YXR1c1wiPlxuICAgIDxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiIFtwcmlvcml0eV09XCIxMFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB0aXRsZT1cInt7ICdBY2NlcHQgYWxsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICpjOHlJZkFsbG93ZWQ9XCJbJ1JPTEVfREVWSUNFX0NPTlRST0xfQURNSU4nXVwiXG4gICAgICAgIChjbGljayk9XCJhY2NlcHRBbGwoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJjYW5BY2NlcHRBbGwoKSB8fCBsaW1pdFN0YXR1cz8uaXNSZWFjaGVkXCJcbiAgICAgID5cbiAgICAgICAgPGkgW2M4eUljb25dPVwiJ2NoZWNrJ1wiPjwvaT5cbiAgICAgICAge3sgJ0FjY2VwdCBhbGwnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbiAgICA8Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIiBbcHJpb3JpdHldPVwiOVwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB0aXRsZT1cInt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgKGNsaWNrKT1cImxvYWRBbGwoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0xvYWRpbmdcIlxuICAgICAgPlxuICAgICAgICA8aSBbYzh5SWNvbl09XCIncmVmcmVzaCdcIiBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiBpc0xvYWRpbmcgfVwiPjwvaT5cbiAgICAgICAge3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuICAgIDxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiICpjOHlJZkFsbG93ZWQ9XCJbJ1JPTEVfREVWSUNFX0NPTlRST0xfQURNSU4nXVwiPlxuICAgICAgPGM4eS1yZWdpc3Rlci1kZXZpY2UtZHJvcGRvd24+PC9jOHktcmVnaXN0ZXItZGV2aWNlLWRyb3Bkb3duPlxuICAgIDwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuICAgIDxjOHktaGVscCBzcmM9XCIvdXNlcnMtZ3VpZGUvZGV2aWNlLW1hbmFnZW1lbnQvI2Nvbm5lY3RpbmctZGV2aWNlc1wiPjwvYzh5LWhlbHA+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGV2aWNlUmVxdWVzdExpc3QuZGF0YS5sZW5ndGggPiAwOyBlbHNlIG5vRGF0YVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZ3JvdXBcIiBbbmdDbGFzc109XCJncmlkT3JMaXN0XCI+XG4gICAgICAgIDwhLS0gU1RBUlQgaW50ZXJhY3QtbGlzdCBzdGlja3kgaGVhZGVyIFNUQVJUIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZ3JpZE9yTGlzdCA9PT0gJ2ludGVyYWN0LWxpc3QnXCIgY2xhc3M9XCJwYWdlLXN0aWNreS1oZWFkZXIgaGlkZGVuLXhzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtbC00MFwiPlxuICAgICAgICAgICAgICA8cCB0cmFuc2xhdGU+RGV2aWNlPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayBjYXJkLWNvbHVtbi0zMCBwLWwtMCBtLWwtOFwiPlxuICAgICAgICAgICAgICA8cCB0cmFuc2xhdGU+U3RhdHVzPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayBjYXJkLWNvbHVtbi0zMCBwLTBcIiAqbmdJZj1cInNob3dUb2tlbklucHV0QmFzZWRPblNlY3VyaXR5TW9kZSgpXCI+XG4gICAgICAgICAgICAgIDxwIHRyYW5zbGF0ZT5TZWN1cml0eSB0b2tlbjwvcD5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHBcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBwb3BvdmVyPVwie3tcbiAgICAgICAgICAgICAgICAgICdTZWN1cml0eSB0b2tlbiBpcyByZXF1aXJlZCBpZiB0aGUgY29ubmVjdGVkIGRldmljZSB1c2VzIGl0LicgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBjYXJkLWNvbHVtbi01MFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1jb250ZW50c1wiICpuZ0lmPVwiaXNNYW5hZ2VtZW50VGVuYW50OyBlbHNlIG5vTWFuYWdlbWVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbHVtbi01MFwiPlxuICAgICAgICAgICAgICAgICAge3sgJ0NyZWF0ZWQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTMwXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnQnlgdXNlcmAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTIwXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnVGVuYW50IElEJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub01hbmFnZW1lbnQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtY29udGVudHNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbHVtbi01MFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQ3JlYXRlZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdCeWB1c2VyYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1hY3Rpb25zLWdyb3VwXCIgc3R5bGU9XCJtaW4td2lkdGg6IDE3NnB4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4gYnRuLXhzIGludmlzaWJsZVwiPlxuICAgICAgICAgICAgICAgIDwhLS1FTVBUWSBieSBkZXNpZ24tLT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRU5EIGludGVyYWN0LWxpc3Qgc3RpY2t5IGhlYWRlciBFTkQgLS0+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImxpbWl0U3RhdHVzPy5pc1JlYWNoZWRcIiBjbGFzcz1cImNvbC14cy0xMiBjb2wtc20tNiBjb2wtbWQtNCBjb2wtbGctM1wiPlxuICAgICAgICAgIDxwIGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZyBjZW50ZXItYmxvY2tcIiByb2xlPVwiYWxlcnRcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgIHt7IGxpbWl0UmVhY2hlZEluZm8kIHwgYXN5bmMgfX1cbiAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+UGxlYXNlIGNvbnRhY3QgeW91ciBwbGF0Zm9ybSBhZG1pbmlzdHJhdG9yLjwvc3Bhbj5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNpbmdsZVJlcXVlc3Qgb2YgZGV2aWNlUmVxdWVzdExpc3QuZGF0YVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtMTIgY29sLXNtLTYgY29sLW1kLTQgY29sLWxnLTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBzZXBhcmF0b3JcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1pY29uXCI+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBbYzh5SWNvbl09XCJzdGF0dXNQcm9wc1tzaW5nbGVSZXF1ZXN0LnN0YXR1c10uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJzdGF0dXNQcm9wc1tzaW5nbGVSZXF1ZXN0LnN0YXR1c10uY2xzXCJcbiAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlIHRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cInt7IHNpbmdsZVJlcXVlc3QuaWQgfX1cIj5cbiAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZVJlcXVlc3QuaWQgfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIHRleHQtY2VudGVyIGNhcmQtY29sdW1uLTMwXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCIgdHJhbnNsYXRlPlN0YXR1czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2luZ2xlUmVxdWVzdC5zdGF0dXMgPT09IHN0YXR1cy5XQUlUSU5HX0ZPUl9DT05ORUNUSU9OXCJcbiAgICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tc3BpbiB0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIHt7IHN0YXR1c1Byb3BzW3NpbmdsZVJlcXVlc3Quc3RhdHVzXS5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqYzh5SWZBbGxvd2VkPVwiWydST0xFX0RFVklDRV9DT05UUk9MX0FETUlOJ11cIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtYmxvY2sgdGV4dC1jZW50ZXIgY2FyZC1jb2x1bW4tMzAgcC10LTBcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncC1iLTAnOiAhc2hvdWxkU2hvd1NlY3VyaXR5VG9rZW5JbnB1dChzaW5nbGVSZXF1ZXN0KSB9XCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1Rva2VuSW5wdXRCYXNlZE9uU2VjdXJpdHlNb2RlKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93U2VjdXJpdHlUb2tlbklucHV0KHNpbmdsZVJlcXVlc3QpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JpZE9yTGlzdCAhPT0gJ2ludGVyYWN0LWxpc3QnXCIgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5IHRva2VuXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzaW5nbGVSZXF1ZXN0LnNlY3VyaXR5VG9rZW5cIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidlLmcuIHt7IGV4YW1wbGUgfX0nIHwgdHJhbnNsYXRlOiB7IGV4YW1wbGU6ICdBMWUzZ2g1ZHMnIH1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlU2VjdXJpdHlUb2tlblwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1hY3Rpb25zLWdyb3VwIGQtZmxleCBhLWktY2VudGVyIGotYy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDE3NnB4XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAnYnRuLWRhbmdlcic6IHNpbmdsZVJlcXVlc3Quc3RhdHVzID09PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFLFxuICAgICAgICAgICAgICAgICAgICAgICdidG4tZGVmYXVsdCc6IHNpbmdsZVJlcXVlc3Quc3RhdHVzICE9PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7e1xuICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZVJlcXVlc3Quc3RhdHVzID09PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICgnUmVtb3ZlJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKCdDYW5jZWwnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoc2luZ2xlUmVxdWVzdC5pZClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaW5nbGVSZXF1ZXN0LnN0YXR1cyA9PT0gc3RhdHVzLlBFTkRJTkdfQUNDRVBUQU5DRVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdSZW1vdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaW5nbGVSZXF1ZXN0LnN0YXR1cyAhPT0gc3RhdHVzLlBFTkRJTkdfQUNDRVBUQU5DRVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWNjZXB0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY2NlcHQoc2luZ2xlUmVxdWVzdClcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNpbmdsZVJlcXVlc3Quc3RhdHVzID09PSBzdGF0dXMuUEVORElOR19BQ0NFUFRBTkNFXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0U3RhdHVzPy5pc1JlYWNoZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoIXNpbmdsZVJlcXVlc3Quc2VjdXJpdHlUb2tlbiAmJiByZXF1aXJlU2VjdXJpdHlUb2tlbilcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0FjY2VwdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgc2VwYXJhdG9yIHRleHQtY2VudGVyIGNhcmQtY29sdW1uLTUwXCI+XG4gICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwiaXNNYW5hZ2VtZW50VGVuYW50OyBlbHNlIG5vTWFuYWdlbWVudFwiIGNsYXNzPVwiZC1jb250ZW50c1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtY29udGVudHNcIiAqbmdJZj1cInNpbmdsZVJlcXVlc3QuY3JlYXRpb25UaW1lICYmIHNpbmdsZVJlcXVlc3Qub3duZXJcIj5cbiAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtY29sdW1uLTUwXCIgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWwtNCBtLXItNFwiIHRyYW5zbGF0ZT5DcmVhdGVkIG9uYGRhdGVgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtY3k9XCJkZXZpY2UtcmVnaXN0cmF0aW9uLS1jcmVhdGlvbi1kYXRlXCI+e3sgc2luZ2xlUmVxdWVzdC5jcmVhdGlvblRpbWUgfCBjOHlEYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb2x1bW4tMzAgdGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWwtNCBtLXItNFwiIHRyYW5zbGF0ZT5ieWB1c2VyYDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWN5PVwiZGV2aWNlLXJlZ2lzdHJhdGlvbi0tY3JlYXRlZC1ieVwiIHRpdGxlPVwie3sgc2luZ2xlUmVxdWVzdC5vd25lciB9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc2luZ2xlUmVxdWVzdC5vd25lciB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtY29sdW1uLTIwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tbC00IG0tci00XCIgdHJhbnNsYXRlPmluYHRlbmFudGA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2luZ2xlUmVxdWVzdC50ZW5hbnRJZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXNpbmdsZVJlcXVlc3QuY3JlYXRpb25UaW1lIHx8ICFzaW5nbGVSZXF1ZXN0Lm93bmVyXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sdW1uLTUwXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbHVtbi0zMFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGxcIiB0cmFuc2xhdGU+Q3JlYXRlZCBpbmB0ZW5hbnRgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb2x1bW4tMjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZVJlcXVlc3QudGVuYW50SWQgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vTWFuYWdlbWVudD5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImQtY29udGVudHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLWNvbHVtbi01MFwiID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1sLTQgbS1yLTRcIiB0cmFuc2xhdGU+Q3JlYXRlZCBvbmBkYXRlYDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWN5PVwiZGV2aWNlLXJlZ2lzdHJhdGlvbi0tY3JlYXRpb24tZGF0ZVwiPnt7IHNpbmdsZVJlcXVlc3QuY3JlYXRpb25UaW1lIHwgYzh5RGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtY29sdW1uLTUwIHRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1sLTQgbS1yLTRcIiB0cmFuc2xhdGU+YnlgdXNlcmA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1jeT1cImRldmljZS1yZWdpc3RyYXRpb24tLWNyZWF0ZWQtYnlcIiB0aXRsZT1cInt7IHNpbmdsZVJlcXVlc3Qub3duZXIgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZVJlcXVlc3Qub3duZXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjOHktbG9hZC1tb3JlXG4gICAgICAgIFtwYWdpbmddPVwiZGV2aWNlUmVxdWVzdExpc3QucGFnaW5nXCJcbiAgICAgICAgW2hpZGRlbl09XCJ0cnVlXCJcbiAgICAgICAgKG9uTG9hZCk9XCJ1cGRhdGVMaXN0KCRldmVudClcIlxuICAgICAgPjwvYzh5LWxvYWQtbW9yZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbm9EYXRhPlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZSBtLXQtNDAgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgPGgxIGNsYXNzPVwiYzh5LWljb24gYzh5LWljb24tZGV2aWNlLWNvbm5lY3QgYzh5LWljb24tZHVvY29sb3JcIj48L2gxPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGltaXRTdGF0dXM/LmlzUmVhY2hlZDsgZWxzZSBsaW1pdE5vdFJlYWNoZWRcIj5cbiAgICAgICAgICA8aDM+XG4gICAgICAgICAgICB7eyBsaW1pdFJlYWNoZWRJbmZvJCB8IGFzeW5jIH19XG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8cCB0cmFuc2xhdGU+UGxlYXNlIGNvbnRhY3QgeW91ciBwbGF0Zm9ybSBhZG1pbmlzdHJhdG9yLjwvcD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbGltaXROb3RSZWFjaGVkPlxuICAgICAgICAgIDxoMyB0cmFuc2xhdGU+Tm8gcGVuZGluZyByZWdpc3RyYXRpb25zIHRvIGRpc3BsYXkuPC9oMz5cbiAgICAgICAgICA8cCAqYzh5SWZBbGxvd2VkPVwiWydST0xFX0RFVklDRV9DT05UUk9MX0FETUlOJ11cIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICBVc2UgdGhlIFwiUmVnaXN0ZXIgZGV2aWNlXCIgZHJvcGRvd24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIuXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
@@ -34,7 +34,7 @@ export class KpiWidgetViewComponent {
34
34
  this.assignContextFromContextDashboard(datapoint);
35
35
  const latestMeasurement$ = this.getLatestMeasurement$(datapoint);
36
36
  const lastTwoValues$ = this.getLastTwoValuesOfObservable$(latestMeasurement$);
37
- const previousValue$ = lastTwoValues$.pipe(map(res => res[0]), startWith(undefined));
37
+ const previousValue$ = lastTwoValues$.pipe(map(([previousVal]) => previousVal), startWith(undefined));
38
38
  const unit$ = latestMeasurement$.pipe(map(latestMeasurementValue => datapoint.unit || latestMeasurementValue.unit || ''), startWith(''), distinctUntilChanged());
39
39
  return combineLatest([
40
40
  latestMeasurement$,
@@ -131,4 +131,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
131
131
  }] }]; }, propDecorators: { config: [{
132
132
  type: Input
133
133
  }] } });
134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3BpLXdpZGdldC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2twaS9rcGktd2lkZ2V0LXZpZXcva3BpLXdpZGdldC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2twaS9rcGktd2lkZ2V0LXZpZXcva3BpLXdpZGdldC12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN4RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7OztBQVNsRixJQUFLLFVBSUo7QUFKRCxXQUFLLFVBQVU7SUFDYixvQ0FBc0IsQ0FBQTtJQUN0QixzQ0FBd0IsQ0FBQTtJQUN4QiwwQkFBWSxDQUFBO0FBQ2QsQ0FBQyxFQUpJLFVBQVUsS0FBVixVQUFVLFFBSWQ7QUFPRCxNQUFNLE9BQU8sc0JBQXNCO0lBYWpDLFlBQ1UsbUJBQStDLEVBQ25DLFNBQW9DO1FBRGhELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBNEI7UUFDbkMsY0FBUyxHQUFULFNBQVMsQ0FBMkI7UUFkakQsV0FBTSxHQUFvQixFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN0RCxXQUFNLEdBTUQsS0FBSyxDQUFDO1FBRVgsOERB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QXFCLGFBRXBCLENBQUMsMEJBQTBCLENBQUM7OzBCQWlCcEMsUUFBUTs0Q0FkRixNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZWFzdXJlbWVudFJlYWx0aW1lU2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgS1BJRGV0YWlscyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZGF0YXBvaW50LXNlbGVjdG9yJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE5FVkVSLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHBhaXJ3aXNlLCBzdGFydFdpdGgsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbnRleHREYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2NvbnRleHQtZGFzaGJvYXJkJztcbmltcG9ydCB7IEtwaVdpZGdldENvbmZpZyB9IGZyb20gJy4uL2twaS13aWRnZXQubW9kZWwnO1xuXG5pbnRlcmZhY2UgTWVhc3VyZW1lbnRWYWx1ZSB7XG4gIHVuaXQ/OiBzdHJpbmc7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGRhdGU6IHN0cmluZztcbn1cblxuZW51bSBDb2xvckNsYXNzIHtcbiAgZGFuZ2VyID0gJ3RleHQtZGFuZ2VyJyxcbiAgd2FybmluZyA9ICd0ZXh0LXdhcm5pbmcnLFxuICB1bmtub3duID0gJydcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWtwaS13aWRnZXQtdmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9rcGktd2lkZ2V0LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtNZWFzdXJlbWVudFJlYWx0aW1lU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgS3BpV2lkZ2V0Vmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGNvbmZpZzogS3BpV2lkZ2V0Q29uZmlnID0geyBkYXRhcG9pbnRzOiBbXSB9O1xuICBzdGF0ZSQ6IE9ic2VydmFibGU8e1xuICAgIGxhdGVzdE1lYXN1cmVtZW50OiBNZWFzdXJlbWVudFZhbHVlO1xuICAgIHByZXZpb3VzVmFsdWU6IE1lYXN1cmVtZW50VmFsdWU7XG4gICAgdHJlbmQ6IHN0cmluZztcbiAgICB1bml0OiBzdHJpbmc7XG4gICAgY29sb3JDbGFzczogQ29sb3JDbGFzcztcbiAgfT4gPSBORVZFUjtcblxuICAvLyB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBsb2FkaW5nIHN0YXRlIGFuZCBlbXB0eSBzdGF0ZVxuICBub0RhdGFJbml0aWFsbHlJbkRCID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtZWFzdXJlbWVudFJlYWx0aW1lOiBNZWFzdXJlbWVudFJlYWx0aW1lU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhc2hib2FyZDogQ29udGV4dERhc2hib2FyZENvbXBvbmVudFxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgZGF0YXBvaW50cyA9IHRoaXMuY29uZmlnLmRhdGFwb2ludHMgfHwgW107XG4gICAgY29uc3QgZGF0YXBvaW50OiBLUElEZXRhaWxzID0gZGF0YXBvaW50cy5maW5kKHRtcCA9PiB0bXAuX19hY3RpdmUpO1xuICAgIGlmICghZGF0YXBvaW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSQgPSB0aGlzLnNldHVwT2JzZXJ2YWJsZShkYXRhcG9pbnQpO1xuICB9XG5cbiAgc2V0dXBPYnNlcnZhYmxlKGRhdGFwb2ludDogS1BJRGV0YWlscyk6IE9ic2VydmFibGU8e1xuICAgIGxhdGVzdE1lYXN1cmVtZW50OiBNZWFzdXJlbWVudFZhbHVlO1xuICAgIHByZXZpb3VzVmFsdWU6IGFueTtcbiAgICB0cmVuZDogc3RyaW5nO1xuICAgIHVuaXQ6IHN0cmluZztcbiAgICBjb2xvckNsYXNzOiBDb2xvckNsYXNzO1xuICB9PiB7XG4gICAgdGhpcy5hc3NpZ25Db250ZXh0RnJvbUNvbnRleHREYXNoYm9hcmQoZGF0YXBvaW50KTtcbiAgICBjb25zdCBsYXRlc3RNZWFzdXJlbWVudCQgPSB0aGlzLmdldExhdGVzdE1lYXN1cmVtZW50JChkYXRhcG9pbnQpO1xuICAgIGNvbnN0IGxhc3RUd29WYWx1ZXMkID0gdGhpcy5nZXRMYXN0VHdvVmFsdWVzT2ZPYnNlcnZhYmxlJChsYXRlc3RNZWFzdXJlbWVudCQpO1xuXG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSQgPSBsYXN0VHdvVmFsdWVzJC5waXBlKFxuICAgICAgbWFwKHJlcyA9PiByZXNbMF0pLFxuICAgICAgc3RhcnRXaXRoKHVuZGVmaW5lZCBhcyBhbnkpXG4gICAgKTtcblxuICAgIGNvbnN0IHVuaXQkID0gbGF0ZXN0TWVhc3VyZW1lbnQkLnBpcGUoXG4gICAgICBtYXAobGF0ZXN0TWVhc3VyZW1lbnRWYWx1ZSA9PiBkYXRhcG9pbnQudW5pdCB8fCBsYXRlc3RNZWFzdXJlbWVudFZhbHVlLnVuaXQgfHwgJycpLFxuICAgICAgc3RhcnRXaXRoKCcnKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuXG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgbGF0ZXN0TWVhc3VyZW1lbnQkLFxuICAgICAgcHJldmlvdXNWYWx1ZSQsXG4gICAgICB0aGlzLmdldFRyZW5kT2ZMYXRlc3RNZWFzdXJlbWVudHMkKGxhc3RUd29WYWx1ZXMkKSxcbiAgICAgIHVuaXQkLFxuICAgICAgdGhpcy5nZXRDb2xvckNsYXNzJChsYXRlc3RNZWFzdXJlbWVudCQsIGRhdGFwb2ludClcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbbGF0ZXN0TWVhc3VyZW1lbnQsIHByZXZpb3VzVmFsdWUsIHRyZW5kLCB1bml0LCBjb2xvckNsYXNzXSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxhdGVzdE1lYXN1cmVtZW50LFxuICAgICAgICAgIHByZXZpb3VzVmFsdWUsXG4gICAgICAgICAgdHJlbmQsXG4gICAgICAgICAgdW5pdCxcbiAgICAgICAgICBjb2xvckNsYXNzXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldExhdGVzdE1lYXN1cmVtZW50JChkYXRhcG9pbnQ6IEtQSURldGFpbHMpOiBPYnNlcnZhYmxlPE1lYXN1cmVtZW50VmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5tZWFzdXJlbWVudFJlYWx0aW1lXG4gICAgICAubGF0ZXN0VmFsdWVPZlNwZWNpZmljTWVhc3VyZW1lbnQkKFxuICAgICAgICBkYXRhcG9pbnQuZnJhZ21lbnQsXG4gICAgICAgIGRhdGFwb2ludC5zZXJpZXMsXG4gICAgICAgIGRhdGFwb2ludC5fX3RhcmdldCxcbiAgICAgICAgLy8gd2Ugb25seSBuZWVkIHRoZSBsYXN0IHR3byB2YWx1ZXMgaW4gY2FzZSB3ZSB3YW50IHRvIHNob3cgYSB0cmVuZFxuICAgICAgICB0aGlzLmNvbmZpZy5zaG93VHJlbmQgPyAyIDogMSxcbiAgICAgICAgLy8gbnVsbCB3aWxsIGJlIGVtaXR0ZWQgaW4gY2FzZSBubyBtZWFzdXJlbWVudCB3YXMgZm91bmQgaW5pdGlhbGx5XG4gICAgICAgIHRydWVcbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAobWVhc3VyZW1lbnQgPT4ge1xuICAgICAgICAgIGlmICghbWVhc3VyZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMubm9EYXRhSW5pdGlhbGx5SW5EQiA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgZmlsdGVyKG1lYXN1cmVtZW50ID0+ICEhbWVhc3VyZW1lbnQpLFxuICAgICAgICBtYXAobWVhc3VyZW1lbnQgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1bml0OiBtZWFzdXJlbWVudFtkYXRhcG9pbnQuZnJhZ21lbnRdW2RhdGFwb2ludC5zZXJpZXNdLnVuaXQsXG4gICAgICAgICAgICB2YWx1ZTogbWVhc3VyZW1lbnRbZGF0YXBvaW50LmZyYWdtZW50XVtkYXRhcG9pbnQuc2VyaWVzXS52YWx1ZSxcbiAgICAgICAgICAgIGRhdGU6IG1lYXN1cmVtZW50LnRpbWUgYXMgc3RyaW5nXG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbG9yQ2xhc3MkKFxuICAgIG1lYXN1cmVtZW50QW5kRGF0YXBvaW50Q29tYmluYXRpb24kOiBPYnNlcnZhYmxlPE1lYXN1cmVtZW50VmFsdWU+LFxuICAgIGRhdGFwb2ludDogS1BJRGV0YWlsc1xuICApOiBPYnNlcnZhYmxlPENvbG9yQ2xhc3M+IHtcbiAgICByZXR1cm4gbWVhc3VyZW1lbnRBbmREYXRhcG9pbnRDb21iaW5hdGlvbiQucGlwZShcbiAgICAgIG1hcChsYXRlc3RNZWFzdXJlbWVudFZhbHVlID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5SYW5nZU9mKGRhdGFwb2ludCwgbGF0ZXN0TWVhc3VyZW1lbnRWYWx1ZS52YWx1ZSwgJ3JlZFJhbmdlTWluJywgJ3JlZFJhbmdlTWF4JykpIHtcbiAgICAgICAgICByZXR1cm4gQ29sb3JDbGFzcy5kYW5nZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5pblJhbmdlT2YoXG4gICAgICAgICAgICBkYXRhcG9pbnQsXG4gICAgICAgICAgICBsYXRlc3RNZWFzdXJlbWVudFZhbHVlLnZhbHVlLFxuICAgICAgICAgICAgJ3llbGxvd1JhbmdlTWluJyxcbiAgICAgICAgICAgICd5ZWxsb3dSYW5nZU1heCdcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBDb2xvckNsYXNzLndhcm5pbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQ29sb3JDbGFzcy51bmtub3duO1xuICAgICAgfSksXG4gICAgICBzdGFydFdpdGgoQ29sb3JDbGFzcy51bmtub3duKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYXN0VHdvVmFsdWVzT2ZPYnNlcnZhYmxlJDxUPihpbnB1dCQ6IE9ic2VydmFibGU8VD4pOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgIHJldHVybiBpbnB1dCQucGlwZShwYWlyd2lzZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJlbmRPZkxhdGVzdE1lYXN1cmVtZW50cyQobGF0ZXN0TWVhc3VyZW1lbnQkOiBPYnNlcnZhYmxlPE1lYXN1cmVtZW50VmFsdWVbXT4pIHtcbiAgICByZXR1cm4gbGF0ZXN0TWVhc3VyZW1lbnQkLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHtcbiAgICAgICAgaWYgKHJlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHJlc1swXS52YWx1ZTtcbiAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHJlc1sxXS52YWx1ZTtcbiAgICAgICAgICBpZiAob2xkVmFsdWUgPCBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuICc0NWRlZyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvbGRWYWx1ZSA+IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gJzEzNWRlZyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnOTBkZWcnO1xuICAgICAgfSksXG4gICAgICBzdGFydFdpdGgoJzkwZGVnJyksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5SYW5nZU9mKFxuICAgIGRhdGFwb2ludDogS1BJRGV0YWlscyxcbiAgICBtZWFzdXJlbWVudFZhbHVlOiBudW1iZXIsXG4gICAgbWluQXR0cmlidXRlOiBzdHJpbmcsXG4gICAgbWF4QXR0cmlidXRlOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGFwb2ludFttaW5BdHRyaWJ1dGVdID09PSAnbnVtYmVyJyAmJlxuICAgICAgdHlwZW9mIGRhdGFwb2ludFttYXhBdHRyaWJ1dGVdID09PSAnbnVtYmVyJ1xuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBtZWFzdXJlbWVudFZhbHVlID49IGRhdGFwb2ludFttaW5BdHRyaWJ1dGVdICYmXG4gICAgICAgIG1lYXN1cmVtZW50VmFsdWUgPCBkYXRhcG9pbnRbbWF4QXR0cmlidXRlXVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzc2lnbkNvbnRleHRGcm9tQ29udGV4dERhc2hib2FyZChkYXRhcG9pbnQ6IEtQSURldGFpbHMpIHtcbiAgICBpZiAoIXRoaXMuZGFzaGJvYXJkPy5pc0RldmljZVR5cGVEYXNoYm9hcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZGFzaGJvYXJkPy5jb250ZXh0O1xuICAgIGlmIChjb250ZXh0Py5pZCkge1xuICAgICAgY29uc3QgeyBuYW1lLCBpZCB9ID0gY29udGV4dDtcbiAgICAgIGRhdGFwb2ludC5fX3RhcmdldCA9IHsgbmFtZSwgaWQgfTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJrcGktd2lkZ2V0X19jb250YWluZXIgZC1mbGV4IGQtY29sIGZpdC1oIGZpdC13IGEtaS1jZW50ZXIgai1jLWNlbnRlclwiXG4gICpuZ0lmPVwic3RhdGUkIHwgYXN5bmMgYXMgbGFzdFN0YXRlOyBlbHNlIG5vTWVhc3VyZW1lbnRGb3VuZFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlciBqLWMtY2VudGVyIGZpdC13XCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJtLXItMTYgZmxleC1uby1zaHJpbmsgdGV4dC1tdXRlZFwiXG4gICAgICBbbmdDbGFzc109XCJsYXN0U3RhdGUuY29sb3JDbGFzc1wiXG4gICAgICAqbmdJZj1cImNvbmZpZy5pY29uICYmIGNvbmZpZy5zaG93SWNvblwiXG4gICAgPlxuICAgICAgPGkgY2xhc3M9XCJpY29uLTMyXCIgW2M4eUljb25dPVwiY29uZmlnLmljb25cIj48L2k+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZSB0ZXh0LW1lZGl1bVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImxhc3RTdGF0ZS5jb2xvckNsYXNzXCJcbiAgICAgICAgW25nU3R5bGVdPVwieyAnZm9udC1zaXplJzogKGNvbmZpZy5mb250U2l6ZSB8fCAnMzYnKSArICdweCcgfVwiXG4gICAgICAgIHRpdGxlPVwie3tcbiAgICAgICAgICBsYXN0U3RhdGUuY29sb3JDbGFzcyA9PT0gJ3RleHQtZGFuZ2VyJ1xuICAgICAgICAgICAgPyAoJ1dpdGhpbiByZWQgcmFuZ2U6JyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgIDogbGFzdFN0YXRlLmNvbG9yQ2xhc3MgPT09ICd0ZXh0LXdhcm5pbmcnXG4gICAgICAgICAgICA/ICgnV2l0aGluIHllbGxvdyByYW5nZTonIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgOiAnJ1xuICAgICAgICB9fSB7e1xuICAgICAgICAgIGxhc3RTdGF0ZS5sYXRlc3RNZWFzdXJlbWVudC52YWx1ZVxuICAgICAgICAgICAgfCBudW1iZXJcbiAgICAgICAgICAgICAgOiAnMS4nICtcbiAgICAgICAgICAgICAgICAgIChjb25maWcubnVtYmVyT2ZEZWNpbWFsUGxhY2VzIHx8ICcwJykgK1xuICAgICAgICAgICAgICAgICAgJy0nICtcbiAgICAgICAgICAgICAgICAgIChjb25maWcubnVtYmVyT2ZEZWNpbWFsUGxhY2VzIHx8ICcwJylcbiAgICAgICAgfX0ge3sgbGFzdFN0YXRlLnVuaXQgfHwgJycgfX1cIlxuICAgICAgPlxuICAgICAgICB7e1xuICAgICAgICAgIGxhc3RTdGF0ZS5sYXRlc3RNZWFzdXJlbWVudC52YWx1ZVxuICAgICAgICAgICAgfCBudW1iZXJcbiAgICAgICAgICAgICAgOiAnMS4nICtcbiAgICAgICAgICAgICAgICAgIChjb25maWcubnVtYmVyT2ZEZWNpbWFsUGxhY2VzIHx8ICcwJykgK1xuICAgICAgICAgICAgICAgICAgJy0nICtcbiAgICAgICAgICAgICAgICAgIChjb25maWcubnVtYmVyT2ZEZWNpbWFsUGxhY2VzIHx8ICcwJylcbiAgICAgICAgfX1cbiAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1yZWd1bGFyXCI+e3sgbGFzdFN0YXRlLnVuaXQgfHwgJycgfX08L3NtYWxsPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZG90IGRvdC1pbmZvIGRvdC0zMCBtLWwtMTYgZmxleC1uby1zaHJpbmtcIlxuICAgICAgKm5nSWY9XCJjb25maWc/LnNob3dUcmVuZCAmJiBsYXN0U3RhdGUucHJldmlvdXNWYWx1ZSBhcyBwcmV2aW91c1ZhbHVlXCJcbiAgICA+XG4gICAgICA8aVxuICAgICAgICBjbGFzcz1cImljb24tMjBcIlxuICAgICAgICBbdGl0bGVdPVwiXG4gICAgICAgICAgKCdQcmV2aW91cyB2YWx1ZScgfCB0cmFuc2xhdGUpICtcbiAgICAgICAgICAnOiAnICtcbiAgICAgICAgICAocHJldmlvdXNWYWx1ZS52YWx1ZVxuICAgICAgICAgICAgfCBudW1iZXJcbiAgICAgICAgICAgICAgOiAnMS4nICtcbiAgICAgICAgICAgICAgICAgIChjb25maWcubnVtYmVyT2ZEZWNpbWFsUGxhY2VzIHx8ICcwJykgK1xuICAgICAgICAgICAgICAgICAgJy0nICtcbiAgICAgICAgICAgICAgICAgIChjb25maWcubnVtYmVyT2ZEZWNpbWFsUGxhY2VzIHx8ICcwJykpICtcbiAgICAgICAgICAnICgnICtcbiAgICAgICAgICAocHJldmlvdXNWYWx1ZS5kYXRlIHwgZGF0ZTogJ21lZGl1bScpICtcbiAgICAgICAgICAnKSdcbiAgICAgICAgXCJcbiAgICAgICAgYzh5SWNvbj1cImFycm93LWRvdHRlZC11cFwiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsgdHJhbnNmb3JtOiAncm90YXRlKCcgKyBsYXN0U3RhdGUudHJlbmQgKyAnKScgfVwiXG4gICAgICA+PC9pPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBqLWMtY2VudGVyXCI+XG4gICAgPHAgKm5nSWY9XCJjb25maWc/LnNob3dUaW1lc3RhbXBcIiBjbGFzcz1cImljb24tZmxleCB0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIHNtYWxsXCI+XG4gICAgICA8aSBjOHlJY29uPVwiY2FsZW5kYXJcIj48L2k+XG4gICAgICB7eyBsYXN0U3RhdGUubGF0ZXN0TWVhc3VyZW1lbnQuZGF0ZSB8IGRhdGU6ICdtZWRpdW0nIH19XG4gICAgPC9wPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI25vTWVhc3VyZW1lbnRGb3VuZD5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBmaXQtaCBmaXQtdyBqLWMtY2VudGVyIGEtaS1jZW50ZXJcIj5cbiAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICAqbmdJZj1cIm5vRGF0YUluaXRpYWxseUluREJcIlxuICAgICAgY2xhc3M9XCJmaXQtd1wiXG4gICAgICBbaWNvbl09XCInbGluZS1jaGFydCdcIlxuICAgICAgW3RpdGxlXT1cIidObyBtZWFzdXJlbWVudCB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICAgICAgW3N1YnRpdGxlXT1cIidXYWl0aW5nIGZvciBtZWFzdXJlbWVudHMgdG8gYmUgY3JlYXRlZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtob3Jpem9udGFsXT1cInRydWVcIlxuICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiAgICA8Yzh5LWxvYWRpbmcgKm5nSWY9XCIhbm9EYXRhSW5pdGlhbGx5SW5EQlwiPjwvYzh5LWxvYWRpbmc+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3BpLXdpZGdldC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2twaS9rcGktd2lkZ2V0LXZpZXcva3BpLXdpZGdldC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2twaS9rcGktd2lkZ2V0LXZpZXcva3BpLXdpZGdldC12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN4RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7OztBQVNsRixJQUFLLFVBSUo7QUFKRCxXQUFLLFVBQVU7SUFDYixvQ0FBc0IsQ0FBQTtJQUN0QixzQ0FBd0IsQ0FBQTtJQUN4QiwwQkFBWSxDQUFBO0FBQ2QsQ0FBQyxFQUpJLFVBQVUsS0FBVixVQUFVLFFBSWQ7QUFPRCxNQUFNLE9BQU8sc0JBQXNCO0lBYWpDLFlBQ1UsbUJBQStDLEVBQ25DLFNBQW9DO1FBRGhELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBNEI7UUFDbkMsY0FBUyxHQUFULFNBQVMsQ0FBMkI7UUFkakQsV0FBTSxHQUFvQixFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN0RCxXQUFNLEdBTUQsS0FBSyxDQUFDO1FBRVgsOERB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QXFCLGFBRXBCLENBQUMsMEJBQTBCLENBQUM7OzBCQWlCcEMsUUFBUTs0Q0FkRixNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZWFzdXJlbWVudFJlYWx0aW1lU2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgS1BJRGV0YWlscyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZGF0YXBvaW50LXNlbGVjdG9yJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE5FVkVSLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHBhaXJ3aXNlLCBzdGFydFdpdGgsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbnRleHREYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2NvbnRleHQtZGFzaGJvYXJkJztcbmltcG9ydCB7IEtwaVdpZGdldENvbmZpZyB9IGZyb20gJy4uL2twaS13aWRnZXQubW9kZWwnO1xuXG5pbnRlcmZhY2UgTWVhc3VyZW1lbnRWYWx1ZSB7XG4gIHVuaXQ/OiBzdHJpbmc7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGRhdGU6IHN0cmluZztcbn1cblxuZW51bSBDb2xvckNsYXNzIHtcbiAgZGFuZ2VyID0gJ3RleHQtZGFuZ2VyJyxcbiAgd2FybmluZyA9ICd0ZXh0LXdhcm5pbmcnLFxuICB1bmtub3duID0gJydcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWtwaS13aWRnZXQtdmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9rcGktd2lkZ2V0LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtNZWFzdXJlbWVudFJlYWx0aW1lU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgS3BpV2lkZ2V0Vmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGNvbmZpZzogS3BpV2lkZ2V0Q29uZmlnID0geyBkYXRhcG9pbnRzOiBbXSB9O1xuICBzdGF0ZSQ6IE9ic2VydmFibGU8e1xuICAgIGxhdGVzdE1lYXN1cmVtZW50OiBNZWFzdXJlbWVudFZhbHVlO1xuICAgIHByZXZpb3VzVmFsdWU6IE1lYXN1cmVtZW50VmFsdWUgfCB1bmRlZmluZWQ7XG4gICAgdHJlbmQ6IHN0cmluZztcbiAgICB1bml0OiBzdHJpbmc7XG4gICAgY29sb3JDbGFzczogQ29sb3JDbGFzcztcbiAgfT4gPSBORVZFUjtcblxuICAvLyB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBsb2FkaW5nIHN0YXRlIGFuZCBlbXB0eSBzdGF0ZVxuICBub0RhdGFJbml0aWFsbHlJbkRCID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtZWFzdXJlbWVudFJlYWx0aW1lOiBNZWFzdXJlbWVudFJlYWx0aW1lU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhc2hib2FyZDogQ29udGV4dERhc2hib2FyZENvbXBvbmVudFxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgZGF0YXBvaW50cyA9IHRoaXMuY29uZmlnLmRhdGFwb2ludHMgfHwgW107XG4gICAgY29uc3QgZGF0YXBvaW50OiBLUElEZXRhaWxzID0gZGF0YXBvaW50cy5maW5kKHRtcCA9PiB0bXAuX19hY3RpdmUpO1xuICAgIGlmICghZGF0YXBvaW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSQgPSB0aGlzLnNldHVwT2JzZXJ2YWJsZShkYXRhcG9pbnQpO1xuICB9XG5cbiAgc2V0dXBPYnNlcnZhYmxlKGRhdGFwb2ludDogS1BJRGV0YWlscyk6IE9ic2VydmFibGU8e1xuICAgIGxhdGVzdE1lYXN1cmVtZW50OiBNZWFzdXJlbWVudFZhbHVlO1xuICAgIHByZXZpb3VzVmFsdWU6IE1lYXN1cmVtZW50VmFsdWUgfCB1bmRlZmluZWQ7XG4gICAgdHJlbmQ6IHN0cmluZztcbiAgICB1bml0OiBzdHJpbmc7XG4gICAgY29sb3JDbGFzczogQ29sb3JDbGFzcztcbiAgfT4ge1xuICAgIHRoaXMuYXNzaWduQ29udGV4dEZyb21Db250ZXh0RGFzaGJvYXJkKGRhdGFwb2ludCk7XG4gICAgY29uc3QgbGF0ZXN0TWVhc3VyZW1lbnQkID0gdGhpcy5nZXRMYXRlc3RNZWFzdXJlbWVudCQoZGF0YXBvaW50KTtcbiAgICBjb25zdCBsYXN0VHdvVmFsdWVzJCA9IHRoaXMuZ2V0TGFzdFR3b1ZhbHVlc09mT2JzZXJ2YWJsZSQobGF0ZXN0TWVhc3VyZW1lbnQkKTtcblxuICAgIGNvbnN0IHByZXZpb3VzVmFsdWUkID0gbGFzdFR3b1ZhbHVlcyQucGlwZShcbiAgICAgIG1hcCgoW3ByZXZpb3VzVmFsXSkgPT4gcHJldmlvdXNWYWwpLFxuICAgICAgc3RhcnRXaXRoKHVuZGVmaW5lZCBhcyBNZWFzdXJlbWVudFZhbHVlIHwgdW5kZWZpbmVkKVxuICAgICk7XG5cbiAgICBjb25zdCB1bml0JCA9IGxhdGVzdE1lYXN1cmVtZW50JC5waXBlKFxuICAgICAgbWFwKGxhdGVzdE1lYXN1cmVtZW50VmFsdWUgPT4gZGF0YXBvaW50LnVuaXQgfHwgbGF0ZXN0TWVhc3VyZW1lbnRWYWx1ZS51bml0IHx8ICcnKSxcbiAgICAgIHN0YXJ0V2l0aCgnJyksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcblxuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIGxhdGVzdE1lYXN1cmVtZW50JCxcbiAgICAgIHByZXZpb3VzVmFsdWUkLFxuICAgICAgdGhpcy5nZXRUcmVuZE9mTGF0ZXN0TWVhc3VyZW1lbnRzJChsYXN0VHdvVmFsdWVzJCksXG4gICAgICB1bml0JCxcbiAgICAgIHRoaXMuZ2V0Q29sb3JDbGFzcyQobGF0ZXN0TWVhc3VyZW1lbnQkLCBkYXRhcG9pbnQpXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2xhdGVzdE1lYXN1cmVtZW50LCBwcmV2aW91c1ZhbHVlLCB0cmVuZCwgdW5pdCwgY29sb3JDbGFzc10pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYXRlc3RNZWFzdXJlbWVudCxcbiAgICAgICAgICBwcmV2aW91c1ZhbHVlLFxuICAgICAgICAgIHRyZW5kLFxuICAgICAgICAgIHVuaXQsXG4gICAgICAgICAgY29sb3JDbGFzc1xuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYXRlc3RNZWFzdXJlbWVudCQoZGF0YXBvaW50OiBLUElEZXRhaWxzKTogT2JzZXJ2YWJsZTxNZWFzdXJlbWVudFZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRSZWFsdGltZVxuICAgICAgLmxhdGVzdFZhbHVlT2ZTcGVjaWZpY01lYXN1cmVtZW50JChcbiAgICAgICAgZGF0YXBvaW50LmZyYWdtZW50LFxuICAgICAgICBkYXRhcG9pbnQuc2VyaWVzLFxuICAgICAgICBkYXRhcG9pbnQuX190YXJnZXQsXG4gICAgICAgIC8vIHdlIG9ubHkgbmVlZCB0aGUgbGFzdCB0d28gdmFsdWVzIGluIGNhc2Ugd2Ugd2FudCB0byBzaG93IGEgdHJlbmRcbiAgICAgICAgdGhpcy5jb25maWcuc2hvd1RyZW5kID8gMiA6IDEsXG4gICAgICAgIC8vIG51bGwgd2lsbCBiZSBlbWl0dGVkIGluIGNhc2Ugbm8gbWVhc3VyZW1lbnQgd2FzIGZvdW5kIGluaXRpYWxseVxuICAgICAgICB0cnVlXG4gICAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKG1lYXN1cmVtZW50ID0+IHtcbiAgICAgICAgICBpZiAoIW1lYXN1cmVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLm5vRGF0YUluaXRpYWxseUluREIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGZpbHRlcihtZWFzdXJlbWVudCA9PiAhIW1lYXN1cmVtZW50KSxcbiAgICAgICAgbWFwKG1lYXN1cmVtZW50ID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdW5pdDogbWVhc3VyZW1lbnRbZGF0YXBvaW50LmZyYWdtZW50XVtkYXRhcG9pbnQuc2VyaWVzXS51bml0LFxuICAgICAgICAgICAgdmFsdWU6IG1lYXN1cmVtZW50W2RhdGFwb2ludC5mcmFnbWVudF1bZGF0YXBvaW50LnNlcmllc10udmFsdWUsXG4gICAgICAgICAgICBkYXRlOiBtZWFzdXJlbWVudC50aW1lIGFzIHN0cmluZ1xuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2xvckNsYXNzJChcbiAgICBtZWFzdXJlbWVudEFuZERhdGFwb2ludENvbWJpbmF0aW9uJDogT2JzZXJ2YWJsZTxNZWFzdXJlbWVudFZhbHVlPixcbiAgICBkYXRhcG9pbnQ6IEtQSURldGFpbHNcbiAgKTogT2JzZXJ2YWJsZTxDb2xvckNsYXNzPiB7XG4gICAgcmV0dXJuIG1lYXN1cmVtZW50QW5kRGF0YXBvaW50Q29tYmluYXRpb24kLnBpcGUoXG4gICAgICBtYXAobGF0ZXN0TWVhc3VyZW1lbnRWYWx1ZSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluUmFuZ2VPZihkYXRhcG9pbnQsIGxhdGVzdE1lYXN1cmVtZW50VmFsdWUudmFsdWUsICdyZWRSYW5nZU1pbicsICdyZWRSYW5nZU1heCcpKSB7XG4gICAgICAgICAgcmV0dXJuIENvbG9yQ2xhc3MuZGFuZ2VyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaW5SYW5nZU9mKFxuICAgICAgICAgICAgZGF0YXBvaW50LFxuICAgICAgICAgICAgbGF0ZXN0TWVhc3VyZW1lbnRWYWx1ZS52YWx1ZSxcbiAgICAgICAgICAgICd5ZWxsb3dSYW5nZU1pbicsXG4gICAgICAgICAgICAneWVsbG93UmFuZ2VNYXgnXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gQ29sb3JDbGFzcy53YXJuaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIENvbG9yQ2xhc3MudW5rbm93bjtcbiAgICAgIH0pLFxuICAgICAgc3RhcnRXaXRoKENvbG9yQ2xhc3MudW5rbm93biksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGFzdFR3b1ZhbHVlc09mT2JzZXJ2YWJsZSQ8VD4oaW5wdXQkOiBPYnNlcnZhYmxlPFQ+KTogT2JzZXJ2YWJsZTxUW10+IHtcbiAgICByZXR1cm4gaW5wdXQkLnBpcGUocGFpcndpc2UoKSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRyZW5kT2ZMYXRlc3RNZWFzdXJlbWVudHMkKGxhdGVzdE1lYXN1cmVtZW50JDogT2JzZXJ2YWJsZTxNZWFzdXJlbWVudFZhbHVlW10+KSB7XG4gICAgcmV0dXJuIGxhdGVzdE1lYXN1cmVtZW50JC5waXBlKFxuICAgICAgbWFwKHJlcyA9PiB7XG4gICAgICAgIGlmIChyZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSByZXNbMF0udmFsdWU7XG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSByZXNbMV0udmFsdWU7XG4gICAgICAgICAgaWYgKG9sZFZhbHVlIDwgbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiAnNDVkZWcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob2xkVmFsdWUgPiBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuICcxMzVkZWcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJzkwZGVnJztcbiAgICAgIH0pLFxuICAgICAgc3RhcnRXaXRoKCc5MGRlZycpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluUmFuZ2VPZihcbiAgICBkYXRhcG9pbnQ6IEtQSURldGFpbHMsXG4gICAgbWVhc3VyZW1lbnRWYWx1ZTogbnVtYmVyLFxuICAgIG1pbkF0dHJpYnV0ZTogc3RyaW5nLFxuICAgIG1heEF0dHJpYnV0ZTogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBkYXRhcG9pbnRbbWluQXR0cmlidXRlXSA9PT0gJ251bWJlcicgJiZcbiAgICAgIHR5cGVvZiBkYXRhcG9pbnRbbWF4QXR0cmlidXRlXSA9PT0gJ251bWJlcidcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgbWVhc3VyZW1lbnRWYWx1ZSA+PSBkYXRhcG9pbnRbbWluQXR0cmlidXRlXSAmJlxuICAgICAgICBtZWFzdXJlbWVudFZhbHVlIDwgZGF0YXBvaW50W21heEF0dHJpYnV0ZV1cbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NpZ25Db250ZXh0RnJvbUNvbnRleHREYXNoYm9hcmQoZGF0YXBvaW50OiBLUElEZXRhaWxzKSB7XG4gICAgaWYgKCF0aGlzLmRhc2hib2FyZD8uaXNEZXZpY2VUeXBlRGFzaGJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmRhc2hib2FyZD8uY29udGV4dDtcbiAgICBpZiAoY29udGV4dD8uaWQpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgaWQgfSA9IGNvbnRleHQ7XG4gICAgICBkYXRhcG9pbnQuX190YXJnZXQgPSB7IG5hbWUsIGlkIH07XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwia3BpLXdpZGdldF9fY29udGFpbmVyIGQtZmxleCBkLWNvbCBmaXQtaCBmaXQtdyBhLWktY2VudGVyIGotYy1jZW50ZXJcIlxuICAqbmdJZj1cInN0YXRlJCB8IGFzeW5jIGFzIGxhc3RTdGF0ZTsgZWxzZSBub01lYXN1cmVtZW50Rm91bmRcIlxuPlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXIgai1jLWNlbnRlciBmaXQtd1wiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibS1yLTE2IGZsZXgtbm8tc2hyaW5rIHRleHQtbXV0ZWRcIlxuICAgICAgW25nQ2xhc3NdPVwibGFzdFN0YXRlLmNvbG9yQ2xhc3NcIlxuICAgICAgKm5nSWY9XCJjb25maWcuaWNvbiAmJiBjb25maWcuc2hvd0ljb25cIlxuICAgID5cbiAgICAgIDxpIGNsYXNzPVwiaWNvbi0zMlwiIFtjOHlJY29uXT1cImNvbmZpZy5pY29uXCI+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGUgdGV4dC1tZWRpdW1cIlxuICAgICAgICBbbmdDbGFzc109XCJsYXN0U3RhdGUuY29sb3JDbGFzc1wiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsgJ2ZvbnQtc2l6ZSc6IChjb25maWcuZm9udFNpemUgfHwgJzM2JykgKyAncHgnIH1cIlxuICAgICAgICB0aXRsZT1cInt7XG4gICAgICAgICAgbGFzdFN0YXRlLmNvbG9yQ2xhc3MgPT09ICd0ZXh0LWRhbmdlcidcbiAgICAgICAgICAgID8gKCdXaXRoaW4gcmVkIHJhbmdlOicgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICA6IGxhc3RTdGF0ZS5jb2xvckNsYXNzID09PSAndGV4dC13YXJuaW5nJ1xuICAgICAgICAgICAgPyAoJ1dpdGhpbiB5ZWxsb3cgcmFuZ2U6JyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgIDogJydcbiAgICAgICAgfX0ge3tcbiAgICAgICAgICBsYXN0U3RhdGUubGF0ZXN0TWVhc3VyZW1lbnQudmFsdWVcbiAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICAgIDogJzEuJyArXG4gICAgICAgICAgICAgICAgICAoY29uZmlnLm51bWJlck9mRGVjaW1hbFBsYWNlcyB8fCAnMCcpICtcbiAgICAgICAgICAgICAgICAgICctJyArXG4gICAgICAgICAgICAgICAgICAoY29uZmlnLm51bWJlck9mRGVjaW1hbFBsYWNlcyB8fCAnMCcpXG4gICAgICAgIH19IHt7IGxhc3RTdGF0ZS51bml0IHx8ICcnIH19XCJcbiAgICAgID5cbiAgICAgICAge3tcbiAgICAgICAgICBsYXN0U3RhdGUubGF0ZXN0TWVhc3VyZW1lbnQudmFsdWVcbiAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICAgIDogJzEuJyArXG4gICAgICAgICAgICAgICAgICAoY29uZmlnLm51bWJlck9mRGVjaW1hbFBsYWNlcyB8fCAnMCcpICtcbiAgICAgICAgICAgICAgICAgICctJyArXG4gICAgICAgICAgICAgICAgICAoY29uZmlnLm51bWJlck9mRGVjaW1hbFBsYWNlcyB8fCAnMCcpXG4gICAgICAgIH19XG4gICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtcmVndWxhclwiPnt7IGxhc3RTdGF0ZS51bml0IHx8ICcnIH19PC9zbWFsbD5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImRvdCBkb3QtaW5mbyBkb3QtMzAgbS1sLTE2IGZsZXgtbm8tc2hyaW5rXCJcbiAgICAgICpuZ0lmPVwiY29uZmlnPy5zaG93VHJlbmQgJiYgbGFzdFN0YXRlLnByZXZpb3VzVmFsdWUgYXMgcHJldmlvdXNWYWx1ZVwiXG4gICAgPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJpY29uLTIwXCJcbiAgICAgICAgW3RpdGxlXT1cIlxuICAgICAgICAgICgnUHJldmlvdXMgdmFsdWUnIHwgdHJhbnNsYXRlKSArXG4gICAgICAgICAgJzogJyArXG4gICAgICAgICAgKHByZXZpb3VzVmFsdWUudmFsdWVcbiAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICAgIDogJzEuJyArXG4gICAgICAgICAgICAgICAgICAoY29uZmlnLm51bWJlck9mRGVjaW1hbFBsYWNlcyB8fCAnMCcpICtcbiAgICAgICAgICAgICAgICAgICctJyArXG4gICAgICAgICAgICAgICAgICAoY29uZmlnLm51bWJlck9mRGVjaW1hbFBsYWNlcyB8fCAnMCcpKSArXG4gICAgICAgICAgJyAoJyArXG4gICAgICAgICAgKHByZXZpb3VzVmFsdWUuZGF0ZSB8IGRhdGU6ICdtZWRpdW0nKSArXG4gICAgICAgICAgJyknXG4gICAgICAgIFwiXG4gICAgICAgIGM4eUljb249XCJhcnJvdy1kb3R0ZWQtdXBcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7IHRyYW5zZm9ybTogJ3JvdGF0ZSgnICsgbGFzdFN0YXRlLnRyZW5kICsgJyknIH1cIlxuICAgICAgPjwvaT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggai1jLWNlbnRlclwiPlxuICAgIDxwICpuZ0lmPVwiY29uZmlnPy5zaG93VGltZXN0YW1wXCIgY2xhc3M9XCJpY29uLWZsZXggdGV4dC1jZW50ZXIgdGV4dC1tdXRlZCBzbWFsbFwiPlxuICAgICAgPGkgYzh5SWNvbj1cImNhbGVuZGFyXCI+PC9pPlxuICAgICAge3sgbGFzdFN0YXRlLmxhdGVzdE1lYXN1cmVtZW50LmRhdGUgfCBkYXRlOiAnbWVkaXVtJyB9fVxuICAgIDwvcD5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNub01lYXN1cmVtZW50Rm91bmQ+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggZml0LWggZml0LXcgai1jLWNlbnRlciBhLWktY2VudGVyXCI+XG4gICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgKm5nSWY9XCJub0RhdGFJbml0aWFsbHlJbkRCXCJcbiAgICAgIGNsYXNzPVwiZml0LXdcIlxuICAgICAgW2ljb25dPVwiJ2xpbmUtY2hhcnQnXCJcbiAgICAgIFt0aXRsZV09XCInTm8gbWVhc3VyZW1lbnQgdG8gZGlzcGxheS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtzdWJ0aXRsZV09XCInV2FpdGluZyBmb3IgbWVhc3VyZW1lbnRzIHRvIGJlIGNyZWF0ZWQuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICA+PC9jOHktdWktZW1wdHktc3RhdGU+XG4gICAgPGM4eS1sb2FkaW5nICpuZ0lmPVwiIW5vRGF0YUluaXRpYWxseUluREJcIj48L2M4eS1sb2FkaW5nPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=