@microsoft/windows-admin-center-sdk 4.167.0 → 4.260.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (617) hide show
  1. package/angular/assets/strings/cs-CZ/strings.json +1 -1
  2. package/angular/assets/strings/de-DE/strings.json +1 -1
  3. package/angular/assets/strings/es-ES/strings.json +1 -1
  4. package/angular/assets/strings/fr-FR/strings.json +1 -1
  5. package/angular/assets/strings/hu-HU/strings.json +1 -1
  6. package/angular/assets/strings/id-ID/strings.json +1 -1
  7. package/angular/assets/strings/it-IT/strings.json +1 -1
  8. package/angular/assets/strings/ja-JP/strings.json +1 -1
  9. package/angular/assets/strings/ko-KR/strings.json +1 -1
  10. package/angular/assets/strings/nl-NL/strings.json +1 -1
  11. package/angular/assets/strings/pl-PL/strings.json +1 -1
  12. package/angular/assets/strings/pt-BR/strings.json +1 -1
  13. package/angular/assets/strings/pt-PT/strings.json +1 -1
  14. package/angular/assets/strings/ru-RU/strings.json +1 -1
  15. package/angular/assets/strings/strings.json +1 -1
  16. package/angular/assets/strings/sv-SE/strings.json +1 -1
  17. package/angular/assets/strings/tr-TR/strings.json +1 -1
  18. package/angular/assets/strings/zh-CN/strings.json +1 -1
  19. package/angular/assets/strings/zh-TW/strings.json +1 -1
  20. package/angular/esm2020/src/controls/accordion/accordion-panel/accordion-panel.component.mjs +36 -12
  21. package/angular/esm2020/src/controls/copilot/copilot.component.mjs +55 -0
  22. package/angular/esm2020/src/controls/copilot/copilot.module.mjs +25 -0
  23. package/angular/esm2020/src/controls/copilot/index.mjs +3 -0
  24. package/angular/esm2020/src/controls/data-table/data-table.component.mjs +7 -9
  25. package/angular/esm2020/src/controls/details/details.component.mjs +62 -25
  26. package/angular/esm2020/src/controls/details/details.module.mjs +5 -1
  27. package/angular/esm2020/src/controls/dialog/dialog.component.mjs +35 -23
  28. package/angular/esm2020/src/controls/form/form-field/array/array-form-field-accessibility-manager.service.mjs +59 -0
  29. package/angular/esm2020/src/controls/form/form-field/array/array-form-field.component.mjs +24 -35
  30. package/angular/esm2020/src/controls/form/form-field/form-field-accessibility-manager-base.service.mjs +105 -0
  31. package/angular/esm2020/src/controls/form/form-field/list/list-form-field-accessibility-manager.service.mjs +38 -0
  32. package/angular/esm2020/src/controls/form/form-field/list/list-form-field.component.mjs +56 -38
  33. package/angular/esm2020/src/controls/form/form-field/ordered-list/ordered-list-form-field-accessibility-manager.service.mjs +54 -0
  34. package/angular/esm2020/src/controls/form/form-field/ordered-list/ordered-list-form-field.component.mjs +67 -67
  35. package/angular/esm2020/src/controls/form/forms.module.mjs +19 -2
  36. package/angular/esm2020/src/controls/guided-panel/guided-pane/guided-pane.component.mjs +12 -3
  37. package/angular/esm2020/src/controls/index.mjs +4 -1
  38. package/angular/esm2020/src/controls/page-alert-bar/page-alert-bar.component.mjs +4 -4
  39. package/angular/esm2020/src/controls/snap-in-extension/snap-in-extension.component.mjs +1 -1
  40. package/angular/esm2020/src/controls/summary/index.mjs +4 -0
  41. package/angular/esm2020/src/controls/summary/summary-item.mjs +83 -0
  42. package/angular/esm2020/src/controls/summary/summary.component.mjs +391 -0
  43. package/angular/esm2020/src/controls/summary/summary.module.mjs +37 -0
  44. package/angular/esm2020/src/controls/summary-group/index.mjs +3 -0
  45. package/angular/esm2020/src/controls/summary-group/summary-group.component.mjs +84 -0
  46. package/angular/esm2020/src/controls/summary-group/summary-group.module.mjs +33 -0
  47. package/angular/esm2020/src/controls/wizard/models/wizard-step-snap-in-output.mjs +1 -1
  48. package/angular/esm2020/src/controls/wizard-lite/wizard-navigation-button/wizard-navigation-button.component.mjs +3 -3
  49. package/angular/esm2020/src/data/extension-broker/snap-in-listener.mjs +80 -0
  50. package/angular/esm2020/src/data/index.mjs +2 -1
  51. package/angular/esm2020/src/generated/strings.mjs +1 -1
  52. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.mjs +1798 -597
  53. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.mjs.map +1 -1
  54. package/angular/fesm2020/microsoft-windows-admin-center-sdk-angular.mjs +1679 -597
  55. package/angular/fesm2020/microsoft-windows-admin-center-sdk-angular.mjs.map +1 -1
  56. package/angular/src/controls/accordion/accordion-panel/accordion-panel.component.d.ts +13 -4
  57. package/angular/src/controls/copilot/copilot.component.d.ts +31 -0
  58. package/angular/src/controls/copilot/copilot.module.d.ts +8 -0
  59. package/angular/src/controls/copilot/index.d.ts +2 -0
  60. package/angular/src/controls/details/details.component.d.ts +5 -1
  61. package/angular/src/controls/details/details.module.d.ts +3 -2
  62. package/angular/src/controls/dialog/dialog.component.d.ts +5 -1
  63. package/angular/src/controls/form/form-field/array/array-form-field-accessibility-manager.service.d.ts +38 -0
  64. package/angular/src/controls/form/form-field/array/array-form-field.component.d.ts +3 -1
  65. package/angular/src/controls/form/form-field/form-field-accessibility-manager-base.service.d.ts +37 -0
  66. package/angular/src/controls/form/form-field/list/list-form-field-accessibility-manager.service.d.ts +25 -0
  67. package/angular/src/controls/form/form-field/list/list-form-field.component.d.ts +12 -2
  68. package/angular/src/controls/form/form-field/ordered-list/ordered-list-form-field-accessibility-manager.service.d.ts +37 -0
  69. package/angular/src/controls/form/form-field/ordered-list/ordered-list-form-field.component.d.ts +12 -8
  70. package/angular/src/controls/guided-panel/guided-pane/guided-pane.component.d.ts +4 -0
  71. package/angular/src/controls/index.d.ts +3 -0
  72. package/angular/src/controls/summary/index.d.ts +3 -0
  73. package/angular/src/controls/summary/summary-item.d.ts +105 -0
  74. package/angular/src/controls/summary/summary.component.d.ts +82 -0
  75. package/angular/src/controls/summary/summary.module.d.ts +11 -0
  76. package/angular/src/controls/summary-group/index.d.ts +3 -0
  77. package/angular/src/controls/summary-group/summary-group.component.d.ts +57 -0
  78. package/angular/src/controls/summary-group/summary-group.module.d.ts +10 -0
  79. package/angular/src/controls/wizard/models/wizard-step-snap-in-output.d.ts +1 -1
  80. package/{core → angular/src}/data/extension-broker/snap-in-listener.d.ts +49 -46
  81. package/angular/src/data/index.d.ts +1 -0
  82. package/angular/src/generated/strings.d.ts +11 -0
  83. package/core/async/cancellation.js +316 -0
  84. package/core/async/index.js +312 -0
  85. package/core/async/progress.js +312 -0
  86. package/core/azure/azure-constants.js +316 -0
  87. package/core/azure/azure-logging.js +316 -0
  88. package/core/azure/azure-manager.js +316 -0
  89. package/core/azure/models/aadAppConfig-data.js +312 -0
  90. package/core/azure/models/azureArcStatusEnum.js +315 -0
  91. package/core/azure/models/azureTokenResult-data.js +315 -0
  92. package/core/azure/resources/deployment-operation-request-body.js +316 -0
  93. package/core/azure/resources/deployment-operation-response.js +312 -0
  94. package/core/azure/resources/location-data.js +316 -0
  95. package/core/azure/resources/resource-group-data.js +316 -0
  96. package/core/azure/resources/subscription-data.js +316 -0
  97. package/core/base/data-store/browser-storage-data-store.js +312 -0
  98. package/core/base/data-store/cached-data-store.js +316 -0
  99. package/core/base/data-store/data-store.js +312 -0
  100. package/core/base/data-store/local-data-store.js +312 -0
  101. package/core/base/data-store/memory-data-store.js +312 -0
  102. package/core/base/data-store/session-data-store.js +316 -0
  103. package/core/base/date/date-like.js +315 -0
  104. package/core/base/date/date-range.js +316 -0
  105. package/core/base/date/date-time.js +312 -0
  106. package/core/base/date/date-type.js +312 -0
  107. package/core/base/date/time-unit.js +316 -0
  108. package/core/base/decorators/base.js +316 -0
  109. package/core/base/decorators/debounce.decorators.js +316 -0
  110. package/core/base/decorators/delay.decorator.js +312 -0
  111. package/core/base/decorators/yield.decorator.js +312 -0
  112. package/core/base/environment.js +316 -0
  113. package/core/base/json.js +316 -0
  114. package/core/base/msft-sme.mock.js +315 -0
  115. package/core/base/polyfills/array.js +316 -0
  116. package/core/base/polyfills/string.js +316 -0
  117. package/core/base/rxjs-lifetime-manager.js +312 -0
  118. package/core/base/utilities.js +312 -0
  119. package/core/base/versioned-object.js +316 -0
  120. package/core/copilot/copilot-extension-service.d.ts +49 -0
  121. package/core/copilot/copilot-extension-service.d.ts.map +1 -0
  122. package/core/copilot/copilot-extension-service.js +446 -0
  123. package/core/copilot/copilot-extension-service.js.map +1 -0
  124. package/core/copilot/copilot-iframe/iframe-broker-service.d.ts +19 -0
  125. package/core/copilot/copilot-iframe/iframe-broker-service.d.ts.map +1 -0
  126. package/core/copilot/copilot-iframe/iframe-broker-service.js +344 -0
  127. package/core/copilot/copilot-iframe/iframe-broker-service.js.map +1 -0
  128. package/core/copilot/copilot-iframe/iframe-child-service.d.ts +15 -0
  129. package/core/copilot/copilot-iframe/iframe-child-service.d.ts.map +1 -0
  130. package/core/copilot/copilot-iframe/iframe-child-service.js +337 -0
  131. package/core/copilot/copilot-iframe/iframe-child-service.js.map +1 -0
  132. package/core/copilot/copilot-iframe/iframe-message-payload.d.ts +4 -0
  133. package/core/copilot/copilot-iframe/iframe-message-payload.d.ts.map +1 -0
  134. package/core/copilot/copilot-iframe/iframe-message-payload.js +319 -0
  135. package/core/copilot/copilot-iframe/iframe-message-payload.js.map +1 -0
  136. package/core/copilot/copilot-iframe/iframe-message-type.d.ts +4 -0
  137. package/core/copilot/copilot-iframe/iframe-message-type.d.ts.map +1 -0
  138. package/core/copilot/copilot-iframe/iframe-message-type.js +319 -0
  139. package/core/copilot/copilot-iframe/iframe-message-type.js.map +1 -0
  140. package/core/copilot/copilot-iframe/iframe-message.d.ts +6 -0
  141. package/core/copilot/copilot-iframe/iframe-message.d.ts.map +1 -0
  142. package/core/copilot/copilot-iframe/iframe-message.js +315 -0
  143. package/core/copilot/copilot-iframe/iframe-message.js.map +1 -0
  144. package/core/data/accessibility-manager.js +316 -0
  145. package/core/data/active-directory/active-directory.js +312 -0
  146. package/core/data/active-directory/models/account-info.js +316 -0
  147. package/core/data/active-directory/models/active-directory-search-options.js +312 -0
  148. package/core/data/active-directory/models/search-type.js +315 -0
  149. package/core/data/animation.js +312 -0
  150. package/core/data/app-context.js +316 -0
  151. package/core/data/asset-manager.js +316 -0
  152. package/core/data/base64-array-buffer.js +312 -0
  153. package/core/data/batch-connection.js +316 -0
  154. package/core/data/cim-connection.js +312 -0
  155. package/core/data/cim-stream.js +312 -0
  156. package/core/data/cim.js +316 -0
  157. package/core/data/column-picker.js +315 -0
  158. package/core/data/cookie.js +316 -0
  159. package/core/data/core-environment.js +312 -0
  160. package/core/data/crypto.js +312 -0
  161. package/core/data/deployment-share.js +316 -0
  162. package/core/data/disposable.js +316 -0
  163. package/core/data/electron.js +316 -0
  164. package/core/data/error-extended.js +316 -0
  165. package/core/data/extension-broker/dialog-listener.js +312 -0
  166. package/core/data/extension-broker/extension-broker.js +316 -0
  167. package/core/data/extension-broker/extension-listener.js +316 -0
  168. package/core/data/extension-broker/model/extension-broker-request-payload.js +316 -0
  169. package/core/data/extension-broker/model/extension-broker-response-error.js +315 -0
  170. package/core/data/extension-broker/model/extension-broker-response-payload.js +316 -0
  171. package/core/data/extension-broker/model/extension-entries.js +315 -0
  172. package/core/data/extension-broker/model/extension-instance.js +316 -0
  173. package/core/data/extension-broker/model/extension-rect.js +316 -0
  174. package/core/data/extension-broker/model/extension-search-options.js +316 -0
  175. package/core/data/extension-broker/service-listener.js +315 -0
  176. package/core/data/extension-broker/worker-listener.js +315 -0
  177. package/core/data/extension-broker/worker-set.js +316 -0
  178. package/core/data/file-transfer.js +316 -0
  179. package/core/data/gateway-connection.js +316 -0
  180. package/core/data/gateway-status.js +316 -0
  181. package/core/data/gateway-url-builder.js +316 -0
  182. package/core/data/gateway-url-translator.js +316 -0
  183. package/core/data/gateway-urls.js +316 -0
  184. package/core/data/globalization.js +315 -0
  185. package/core/data/http-constants.js +316 -0
  186. package/core/data/http.js +316 -0
  187. package/core/data/jobs/jobs-manager.js +316 -0
  188. package/core/data/jobs/models/job-credentials.js +312 -0
  189. package/core/data/jobs/models/job-node.js +316 -0
  190. package/core/data/jobs/models/job-paginated-response.js +312 -0
  191. package/core/data/jobs/models/job-pagination-options.js +316 -0
  192. package/core/data/jobs/models/job.js +316 -0
  193. package/core/data/jobs/models/node-job.js +316 -0
  194. package/core/data/jobs/models/powershell-job.js +312 -0
  195. package/core/data/language.js +312 -0
  196. package/core/data/lifetime-data.js +316 -0
  197. package/core/data/localization-manager.js +316 -0
  198. package/core/data/native-q.js +312 -0
  199. package/core/data/net.d.ts.map +1 -1
  200. package/core/data/net.js +317 -1
  201. package/core/data/net.js.map +1 -1
  202. package/core/data/node-connection.d.ts.map +1 -1
  203. package/core/data/node-connection.js +316 -0
  204. package/core/data/node-connection.js.map +1 -1
  205. package/core/data/node-extension-install.js +316 -0
  206. package/core/data/powershell-alternate.js +316 -0
  207. package/core/data/powershell-batch.js +312 -0
  208. package/core/data/powershell-connection.js +312 -0
  209. package/core/data/powershell-crypto.js +316 -0
  210. package/core/data/powershell-stream.js +315 -0
  211. package/core/data/powershell.js +316 -0
  212. package/core/data/query-cache.js +312 -0
  213. package/core/data/resource-cache.js +312 -0
  214. package/core/data/schedule-reboot.js +315 -0
  215. package/core/data/settings-manager.js +316 -0
  216. package/core/data/settings-manger.mock.js +315 -0
  217. package/core/data/sme-extension.js +312 -0
  218. package/core/data/ssh-stream.js +316 -0
  219. package/core/data/units.js +312 -0
  220. package/core/data/uri-builder.js +316 -0
  221. package/core/data/wdac-operations.js +315 -0
  222. package/core/data/websocket-stream.js +316 -0
  223. package/core/diagnostics/error-monitor.js +316 -0
  224. package/core/diagnostics/log-level.js +316 -0
  225. package/core/diagnostics/log-record.js +312 -0
  226. package/core/diagnostics/logging-constants.js +316 -0
  227. package/core/diagnostics/logging.js +316 -0
  228. package/core/diagnostics/logging.mock.js +316 -0
  229. package/core/diagnostics/sme-web-telemetry-models.js +316 -0
  230. package/core/diagnostics/sme-web-telemetry.d.ts +1 -2
  231. package/core/diagnostics/sme-web-telemetry.d.ts.map +1 -1
  232. package/core/diagnostics/sme-web-telemetry.js +339 -15
  233. package/core/diagnostics/sme-web-telemetry.js.map +1 -1
  234. package/core/diagnostics/telemetry-control-type.js +316 -0
  235. package/core/diagnostics/telemetry-options.js +316 -0
  236. package/core/diagnostics/telemetry-record.js +316 -0
  237. package/core/dom/dom.js +316 -0
  238. package/core/frame/frame-connection.js +316 -0
  239. package/core/frame/frame-connection.mock.js +316 -0
  240. package/core/frame/shell-navigation-connection.js +316 -0
  241. package/core/generated/powershell-scripts.d.ts.map +1 -1
  242. package/core/generated/powershell-scripts.js +313 -1
  243. package/core/generated/powershell-scripts.js.map +1 -1
  244. package/core/generated/strings.js +312 -0
  245. package/core/host/host-core-manager.js +316 -0
  246. package/core/host/host-core-message-type.js +316 -0
  247. package/core/host/host-core-messages.js +312 -0
  248. package/core/index.d.ts +48 -25
  249. package/core/index.d.ts.map +1 -1
  250. package/core/index.js +351 -18
  251. package/core/index.js.map +1 -1
  252. package/core/manifest/environment-modules.d.ts +3 -1
  253. package/core/manifest/environment-modules.d.ts.map +1 -1
  254. package/core/manifest/environment-modules.js +314 -0
  255. package/core/manifest/environment-modules.js.map +1 -1
  256. package/core/manifest/manifest-loader.js +312 -0
  257. package/core/manifest/module-schema.json +3 -1
  258. package/core/notification/client-notification-instance.js +316 -0
  259. package/core/notification/client-notification.js +316 -0
  260. package/core/notification/notification-connection.js +316 -0
  261. package/core/notification/notification-link-type.js +312 -0
  262. package/core/notification/notification-manager.js +312 -0
  263. package/core/notification/notification-message.js +312 -0
  264. package/core/notification/notification-state.js +316 -0
  265. package/core/notification/notification.js +312 -0
  266. package/core/notification/powershell-notification.js +316 -0
  267. package/core/notification/socket-signalr.js +312 -0
  268. package/core/notification/work-item-connection.js +312 -0
  269. package/core/notification/work-item-manager.js +316 -0
  270. package/core/notification/work-item-request.js +315 -0
  271. package/core/performance/performance-profile-data-type.js +315 -0
  272. package/core/performance/performance-profile-data.js +315 -0
  273. package/core/performance/performance-profile-database.js +315 -0
  274. package/core/performance/performance-profile-record.js +316 -0
  275. package/core/performance/performance-profile.d.ts.map +1 -1
  276. package/core/performance/performance-profile.js +325 -9
  277. package/core/performance/performance-profile.js.map +1 -1
  278. package/core/performance/performance-tracker.js +312 -0
  279. package/core/polyfills.js +316 -0
  280. package/core/resources/scripts/public/crypto/Get-DecryptedDataFromNode.ps1 +219 -0
  281. package/core/resources/scripts/public/crypto/Get-EncryptionJWKOnNode.ps1 +218 -0
  282. package/core/resources/scripts/public/inventory/Get-CimWin32LogicalDisk.ps1 +218 -0
  283. package/core/resources/scripts/public/inventory/Get-CimWin32NetworkAdapter.ps1 +216 -0
  284. package/core/resources/scripts/public/inventory/Get-CimWin32PhysicalMemory.ps1 +216 -0
  285. package/core/resources/scripts/public/inventory/Get-CimWin32Processor.ps1 +218 -0
  286. package/core/resources/scripts/public/inventory/Get-ClusterInventory.ps1 +218 -0
  287. package/core/resources/scripts/public/inventory/Get-ClusterNodes.ps1 +218 -0
  288. package/core/resources/scripts/public/inventory/Get-ServerInventory.ps1 +221 -1
  289. package/core/rpc/alive/rpc-alive-client.js +312 -0
  290. package/core/rpc/alive/rpc-alive-handler.js +312 -0
  291. package/core/rpc/alive/rpc-alive-model.js +316 -0
  292. package/core/rpc/alive/rpc-alive-subject-server.js +312 -0
  293. package/core/rpc/alive/rpc-observable-alive-client.js +316 -0
  294. package/core/rpc/alive/rpc-observable-alive-model.js +315 -0
  295. package/core/rpc/alive/rpc-observable-alive-server.js +315 -0
  296. package/core/rpc/azure/rpc-azure-model.js +312 -0
  297. package/core/rpc/azure/rpc-azure-request-client.js +312 -0
  298. package/core/rpc/azure/rpc-azure-request-handler.js +316 -0
  299. package/core/rpc/azure/rpc-azure-request-subject-server.js +316 -0
  300. package/core/rpc/azure/rpc-azure-response-client.js +316 -0
  301. package/core/rpc/azure/rpc-azure-response-handler.js +312 -0
  302. package/core/rpc/copilot/rpc-observable-copilot-client.d.ts +24 -0
  303. package/core/rpc/copilot/rpc-observable-copilot-client.d.ts.map +1 -0
  304. package/core/rpc/copilot/rpc-observable-copilot-client.js +343 -0
  305. package/core/rpc/copilot/rpc-observable-copilot-client.js.map +1 -0
  306. package/core/rpc/copilot/rpc-observable-copilot-config-client.d.ts +24 -0
  307. package/core/rpc/copilot/rpc-observable-copilot-config-client.d.ts.map +1 -0
  308. package/core/rpc/copilot/rpc-observable-copilot-config-client.js +343 -0
  309. package/core/rpc/copilot/rpc-observable-copilot-config-client.js.map +1 -0
  310. package/core/rpc/copilot/rpc-observable-copilot-config-server.d.ts +14 -0
  311. package/core/rpc/copilot/rpc-observable-copilot-config-server.d.ts.map +1 -0
  312. package/core/rpc/copilot/rpc-observable-copilot-config-server.js +332 -0
  313. package/core/rpc/copilot/rpc-observable-copilot-config-server.js.map +1 -0
  314. package/core/rpc/copilot/rpc-observable-copilot-model.d.ts +55 -0
  315. package/core/rpc/copilot/rpc-observable-copilot-model.d.ts.map +1 -0
  316. package/core/rpc/copilot/rpc-observable-copilot-model.js +334 -0
  317. package/core/rpc/copilot/rpc-observable-copilot-model.js.map +1 -0
  318. package/core/rpc/copilot/rpc-observable-copilot-server.d.ts +14 -0
  319. package/core/rpc/copilot/rpc-observable-copilot-server.d.ts.map +1 -0
  320. package/core/rpc/copilot/rpc-observable-copilot-server.js +333 -0
  321. package/core/rpc/copilot/rpc-observable-copilot-server.js.map +1 -0
  322. package/core/rpc/credssp/rpc-credssp-model.js +315 -0
  323. package/core/rpc/credssp/rpc-credssp-request-client.js +316 -0
  324. package/core/rpc/credssp/rpc-credssp-request-handler.js +316 -0
  325. package/core/rpc/credssp/rpc-credssp-request-subject-server.js +316 -0
  326. package/core/rpc/credssp/rpc-credssp-response-client.js +316 -0
  327. package/core/rpc/credssp/rpc-credssp-response-handler.js +316 -0
  328. package/core/rpc/dialog/rpc-dialog-client.js +312 -0
  329. package/core/rpc/dialog/rpc-dialog-handler.js +315 -0
  330. package/core/rpc/dialog/rpc-dialog-model.js +316 -0
  331. package/core/rpc/dialog/rpc-dialog-subject-server.js +316 -0
  332. package/core/rpc/electron/rpc-electron-model.js +316 -0
  333. package/core/rpc/electron/rpc-electron-request-client.js +316 -0
  334. package/core/rpc/electron/rpc-electron-request-handler.js +315 -0
  335. package/core/rpc/electron/rpc-electron-request-subject-server.js +316 -0
  336. package/core/rpc/electron/rpc-electron-response-client.js +312 -0
  337. package/core/rpc/electron/rpc-electron-response-handler.js +315 -0
  338. package/core/rpc/elevate/rpc-observable-elevate-client.js +315 -0
  339. package/core/rpc/elevate/rpc-observable-elevate-model.js +312 -0
  340. package/core/rpc/elevate/rpc-observable-elevate-server.js +312 -0
  341. package/core/rpc/error-monitor/rpc-observable-error-monitor-client.js +316 -0
  342. package/core/rpc/error-monitor/rpc-observable-error-monitor-model.js +316 -0
  343. package/core/rpc/error-monitor/rpc-observable-error-monitor-server.js +312 -0
  344. package/core/rpc/extension-broker/rpc-extension-broker-model.js +312 -0
  345. package/core/rpc/extension-broker/rpc-extension-broker-module-request-subject-server.js +312 -0
  346. package/core/rpc/extension-broker/rpc-extension-broker-request-client.js +312 -0
  347. package/core/rpc/extension-broker/rpc-extension-broker-request-handler.js +312 -0
  348. package/core/rpc/extension-broker/rpc-extension-broker-request-subject-server.js +312 -0
  349. package/core/rpc/extension-broker/rpc-extension-broker-response-client.js +312 -0
  350. package/core/rpc/extension-broker/rpc-extension-broker-response-handler.js +312 -0
  351. package/core/rpc/extension-data/rpc-observable-extension-data-client.js +316 -0
  352. package/core/rpc/extension-data/rpc-observable-extension-data-model.js +312 -0
  353. package/core/rpc/extension-data/rpc-observable-extension-data-server.js +315 -0
  354. package/core/rpc/forward/rpc-forward-auto-client.js +315 -0
  355. package/core/rpc/forward/rpc-forward-down-client.js +315 -0
  356. package/core/rpc/forward/rpc-forward-down-handler.js +316 -0
  357. package/core/rpc/forward/rpc-forward-model.js +316 -0
  358. package/core/rpc/forward/rpc-forward-up-client.js +312 -0
  359. package/core/rpc/forward/rpc-forward-up-handler.js +316 -0
  360. package/core/rpc/forward/rpc-forward-up-subject-server.js +316 -0
  361. package/core/rpc/log/rpc-log-client.js +316 -0
  362. package/core/rpc/log/rpc-log-handler.js +312 -0
  363. package/core/rpc/log/rpc-log-model.js +316 -0
  364. package/core/rpc/log/rpc-log-subject-server.js +316 -0
  365. package/core/rpc/notification/rpc-notification-client.js +316 -0
  366. package/core/rpc/notification/rpc-notification-handler.js +312 -0
  367. package/core/rpc/notification/rpc-notification-model.js +316 -0
  368. package/core/rpc/notification/rpc-notification-subject-server.js +312 -0
  369. package/core/rpc/overlay/rpc-overlay-close-client.js +312 -0
  370. package/core/rpc/overlay/rpc-overlay-close-handler.js +316 -0
  371. package/core/rpc/overlay/rpc-overlay-model.js +312 -0
  372. package/core/rpc/overlay/rpc-overlay-open-client.js +312 -0
  373. package/core/rpc/overlay/rpc-overlay-open-handler.js +316 -0
  374. package/core/rpc/overlay/rpc-overlay-open-subject-server.js +316 -0
  375. package/core/rpc/performance/rpc-observable-performance-client.js +315 -0
  376. package/core/rpc/performance/rpc-observable-performance-config-client.js +312 -0
  377. package/core/rpc/performance/rpc-observable-performance-config-server.js +316 -0
  378. package/core/rpc/performance/rpc-observable-performance-model.js +312 -0
  379. package/core/rpc/performance/rpc-observable-performance-server.js +312 -0
  380. package/core/rpc/report/rpc-report-client.js +316 -0
  381. package/core/rpc/report/rpc-report-handler.js +315 -0
  382. package/core/rpc/report/rpc-report-model.js +315 -0
  383. package/core/rpc/report/rpc-report-subject-server.js +312 -0
  384. package/core/rpc/rpc-base.d.ts +4 -0
  385. package/core/rpc/rpc-base.d.ts.map +1 -1
  386. package/core/rpc/rpc-base.js +316 -0
  387. package/core/rpc/rpc-base.js.map +1 -1
  388. package/core/rpc/rpc-channel.js +316 -0
  389. package/core/rpc/rpc-forwarder.js +312 -0
  390. package/core/rpc/rpc-inbound-client.js +315 -0
  391. package/core/rpc/rpc-inbound.js +312 -0
  392. package/core/rpc/rpc-manager.js +316 -0
  393. package/core/rpc/rpc-module-subject-server.js +316 -0
  394. package/core/rpc/rpc-observable-client.js +316 -0
  395. package/core/rpc/rpc-observable-request.js +316 -0
  396. package/core/rpc/rpc-observable-result.js +316 -0
  397. package/core/rpc/rpc-observable-server.js +316 -0
  398. package/core/rpc/rpc-outbound-client.js +316 -0
  399. package/core/rpc/rpc-outbound.js +315 -0
  400. package/core/rpc/rpc-subject-server.js +316 -0
  401. package/core/rpc/rpc.js +316 -0
  402. package/core/rpc/seek/rpc-seek-client.js +316 -0
  403. package/core/rpc/seek/rpc-seek-handler.js +315 -0
  404. package/core/rpc/seek/rpc-seek-model.js +315 -0
  405. package/core/rpc/settings/rpc-settings-client.js +312 -0
  406. package/core/rpc/settings/rpc-settings-handler.js +315 -0
  407. package/core/rpc/settings/rpc-settings-model.js +315 -0
  408. package/core/rpc/settings/rpc-settings-subject-server.js +312 -0
  409. package/core/rpc/shell-navigate/rpc-shell-navigate-client.js +316 -0
  410. package/core/rpc/shell-navigate/rpc-shell-navigate-handler.js +316 -0
  411. package/core/rpc/shell-navigate/rpc-shell-navigate-model.js +315 -0
  412. package/core/rpc/shell-navigate/rpc-shell-navigate-subject-server.js +315 -0
  413. package/core/rpc/sme-extension/rpc-sme-extension-model.js +316 -0
  414. package/core/rpc/sme-extension/rpc-sme-extension-request-client.js +316 -0
  415. package/core/rpc/sme-extension/rpc-sme-extension-request-handler.js +312 -0
  416. package/core/rpc/sme-extension/rpc-sme-extension-request-subject-server.js +312 -0
  417. package/core/rpc/sme-extension/rpc-sme-extension-response-client.js +316 -0
  418. package/core/rpc/sme-extension/rpc-sme-extension-response-handler.js +316 -0
  419. package/core/rpc/telemetry/rpc-telemetry-client.js +312 -0
  420. package/core/rpc/telemetry/rpc-telemetry-handler.js +312 -0
  421. package/core/rpc/telemetry/rpc-telemetry-model.js +312 -0
  422. package/core/rpc/telemetry/rpc-telemetry-subject-server.js +316 -0
  423. package/core/rpc/update-data/rpc-update-data-client.js +316 -0
  424. package/core/rpc/update-data/rpc-update-data-handler.js +312 -0
  425. package/core/rpc/update-data/rpc-update-data-model.js +312 -0
  426. package/core/rpc/update-data/rpc-update-data-subject-server.js +312 -0
  427. package/core/rpc/update-theme/rpc-observable-update-theme-client.js +316 -0
  428. package/core/rpc/update-theme/rpc-observable-update-theme-model.js +315 -0
  429. package/core/rpc/update-theme/rpc-observable-update-theme-server.js +316 -0
  430. package/core/rpc/work-item/rpc-work-item-client.js +315 -0
  431. package/core/rpc/work-item/rpc-work-item-handler.js +312 -0
  432. package/core/rpc/work-item/rpc-work-item-model.js +316 -0
  433. package/core/rpc/work-item/rpc-work-item-subject-server.js +316 -0
  434. package/core/rpc/work-item-find/rpc-work-item-find-client.js +312 -0
  435. package/core/rpc/work-item-find/rpc-work-item-find-handler.js +315 -0
  436. package/core/rpc/work-item-find/rpc-work-item-find-model.js +316 -0
  437. package/core/rpc/work-item-find/rpc-work-item-find-subject-server.js +312 -0
  438. package/core/security/active-connection.js +315 -0
  439. package/core/security/authorization-manager.js +315 -0
  440. package/core/security/connection-manager-settings/common-connection-settings.js +316 -0
  441. package/core/security/connection-manager-settings/connection-settings.js +315 -0
  442. package/core/security/connection-manager.js +316 -0
  443. package/core/security/connection-stream.js +316 -0
  444. package/core/security/connection.js +312 -0
  445. package/core/security/credssp-manager.js +315 -0
  446. package/core/security/sign-on-manager.js +316 -0
  447. package/core/security/tag-manager.js +315 -0
  448. package/core/security/tool-condition-validator.js +316 -0
  449. package/core/security/tool-connection-query.js +312 -0
  450. package/core/security/user-principal.js +312 -0
  451. package/core/shared/cluster-inventory/cluster-inventory-cache.js +316 -0
  452. package/core/shared/cluster-inventory/cluster-inventory.js +315 -0
  453. package/core/shared/cluster-inventory/cluster-node-inventory.js +316 -0
  454. package/core/shared/gateway-inventory/gateway-inventory-cache.js +316 -0
  455. package/core/shared/gateway-inventory/gateway-inventory-detail-cache.js +316 -0
  456. package/core/shared/gateway-inventory/gateway-inventory-detail.js +316 -0
  457. package/core/shared/gateway-inventory/gateway-inventory.js +316 -0
  458. package/core/shared/inventory-query-caches.js +316 -0
  459. package/core/shared/server-inventory/server-inventory-cache.d.ts.map +1 -1
  460. package/core/shared/server-inventory/server-inventory-cache.js +313 -0
  461. package/core/shared/server-inventory/server-inventory-cache.js.map +1 -1
  462. package/core/shared/server-inventory/server-inventory-detail-cache.js +315 -0
  463. package/core/shared/server-inventory/server-inventory-detail.js +316 -0
  464. package/core/shared/server-inventory/server-inventory.d.ts +8 -0
  465. package/core/shared/server-inventory/server-inventory.d.ts.map +1 -1
  466. package/core/shared/server-inventory/server-inventory.js +320 -0
  467. package/core/shared/server-inventory/server-inventory.js.map +1 -1
  468. package/core/shared/shared-cache.js +312 -0
  469. package/core/shared/tool-inventory/tool-inventory-cache.js +312 -0
  470. package/core/shared/tool-inventory/tool-inventory.js +316 -0
  471. package/core/special.js +316 -0
  472. package/core/test-utilities/accessibility-tester.js +316 -0
  473. package/core/test-utilities/console.mock.js +316 -0
  474. package/core/test-utilities/jasmine-axe-matcher.js +316 -0
  475. package/core/test-utilities/wait-async.js +315 -0
  476. package/core/test.js +312 -0
  477. package/core/testing.js +316 -0
  478. package/core/workflow/persistent-local-storage.js +316 -0
  479. package/core/workflow/persistent-work-item-apply-state.js +316 -0
  480. package/core/workflow/persistent-work-item-state.js +316 -0
  481. package/core/workflow/persistent-work-item.js +316 -0
  482. package/core/workflow/persistent-workflow-builder.js +316 -0
  483. package/core/workflow/persistent-workflow-context.js +315 -0
  484. package/core/workflow/persistent-workflow-runner.js +316 -0
  485. package/core/workflow/persistent-workflow-snapshot.js +315 -0
  486. package/core/workflow/persistent-workflow-store.js +312 -0
  487. package/core/workflow/persistent-workflow.js +312 -0
  488. package/package.json +7 -6
  489. package/styles/css/main-v2.css +1 -1
  490. package/styles/fonts/SegoeUI/Bold/SegoeUIBold-5.27.woff +0 -0
  491. package/styles/fonts/SegoeUI/Light/SegoeUILight-5.27.woff +0 -0
  492. package/styles/fonts/SegoeUI/Normal/SegoeUI-5.27.woff +0 -0
  493. package/styles/fonts/SegoeUI/SemiBold/SegoeUISemiBold-5.27.woff +0 -0
  494. package/styles/fonts/SegoeUI/SemiLight/SegoeUISemiLight-5.27.woff +0 -0
  495. package/styles/fonts/ServMDL2/ServMDL2-4.66.woff +0 -0
  496. package/tools/build/webpack/index-html.transform.js +312 -0
  497. package/tools/build/webpack/shell.index-html.transform.js +316 -0
  498. package/tools/build/webpack/shell.webpack.config.js +312 -0
  499. package/tools/build/webpack/webpack.config.js +312 -0
  500. package/tools/code-formatter/.eslintrc.base.json +2 -1
  501. package/tools/code-formatter/lint.js +316 -0
  502. package/tools/code-formatter/utilities.d.ts.map +1 -1
  503. package/tools/code-formatter/utilities.js +313 -1
  504. package/tools/code-formatter/utilities.js.map +1 -1
  505. package/tools/gulp-doc-generator/index.js +316 -0
  506. package/tools/gulp-manifest-resource/index.js +315 -0
  507. package/tools/gulp-manifest-validator/index.js +316 -0
  508. package/tools/gulp-merge-json-in-folders/index.js +316 -0
  509. package/tools/gulp-merge-json-in-folders/json-merge.js +316 -0
  510. package/tools/gulp-ps-cim/index.js +316 -0
  511. package/tools/gulp-ps-code/index.d.ts.map +1 -1
  512. package/tools/gulp-ps-code/index.js +326 -2
  513. package/tools/gulp-ps-code/index.js.map +1 -1
  514. package/tools/gulp-ps-code/ps-code-convert.js +316 -0
  515. package/tools/gulp-ps-manifest/index.js +312 -0
  516. package/tools/gulp-ps-module/index.d.ts.map +1 -1
  517. package/tools/gulp-ps-module/index.js +328 -3
  518. package/tools/gulp-ps-module/index.js.map +1 -1
  519. package/tools/gulp-ps-resjson/index.js +316 -0
  520. package/tools/gulp-resjson/index.js +312 -0
  521. package/tools/gulp-resjson/resjson-convert.js +316 -0
  522. package/tools/gulp-schema-form/index.js +312 -0
  523. package/tools/gulp-svg-code/index.js +316 -0
  524. package/tools/gulp-svg-code/svg-code-convert.js +312 -0
  525. package/tools/gulp-update-notes-resource/index.js +312 -0
  526. package/tools/module-template/build/increment-package-version.ps1 +219 -0
  527. package/tools/module-template/build/pipelines/ci-build.yml +5 -5
  528. package/tools/module-template/build/pipelines/pull-request.yml +4 -4
  529. package/tools/module-template/build/push-incremented-version.ps1 +218 -1
  530. package/tools/module-template/build/update-powershell-code.ps1 +216 -0
  531. package/tools/module-template/gulpfile.ts/common/clean.ts +2 -0
  532. package/tools/module-template/gulpfile.ts/common/pack.ts +17 -5
  533. package/tools/module-template/gulpfile.ts/common/powershell.ts +40 -2
  534. package/tools/module-template/gulpfile.ts/common/test.ts +2 -3
  535. package/tools/module-template/gulpfile.ts/common/utilities.ts +40 -12
  536. package/tools/pack-nuget/index.d.ts.map +1 -1
  537. package/tools/pack-nuget/index.js +325 -3
  538. package/tools/pack-nuget/index.js.map +1 -1
  539. package/tools/scripts/Invoke-PesterTest.ps1 +218 -0
  540. package/tools/scripts/New-ExtensionPackage.ps1 +373 -6
  541. package/tools/scripts/Search-NonAsciiText.ps1 +219 -0
  542. package/tools/scripts/package-information/README.md +3 -0
  543. package/tools/scripts/package-information/ms-logo.png +0 -0
  544. package/tools/test-runner/index.js +316 -0
  545. package/tools/utilities/index.js +312 -0
  546. package/tools/wac-cli/src/angular15/configs/angular-json-config.js +315 -0
  547. package/tools/wac-cli/src/angular15/configs/ci-build-yml-config.js +315 -0
  548. package/tools/wac-cli/src/angular15/configs/config.js +312 -0
  549. package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.js +315 -0
  550. package/tools/wac-cli/src/angular15/configs/git-ignore-config.js +315 -0
  551. package/tools/wac-cli/src/angular15/configs/jasmine-test-config.js +316 -0
  552. package/tools/wac-cli/src/angular15/configs/package-json-config.js +316 -0
  553. package/tools/wac-cli/src/angular15/configs/replace-config.js +312 -0
  554. package/tools/wac-cli/src/angular15/configs/tsconfig-config.js +316 -0
  555. package/tools/wac-cli/src/angular15/configs/ui-test-automation-lagacy-config.js +316 -0
  556. package/tools/wac-cli/src/angular15/main.js +316 -0
  557. package/tools/wac-cli/src/angular15/upgrader/angular-json-upgrader.js +316 -0
  558. package/tools/wac-cli/src/angular15/upgrader/audit/ajax-response-updater.js +316 -0
  559. package/tools/wac-cli/src/angular15/upgrader/audit/css-syntax-error-updater.js +316 -0
  560. package/tools/wac-cli/src/angular15/upgrader/audit/declare-override-updater.js +312 -0
  561. package/tools/wac-cli/src/angular15/upgrader/audit/error-updater-angular15.js +316 -0
  562. package/tools/wac-cli/src/angular15/upgrader/audit/form-control-updater.js +312 -0
  563. package/tools/wac-cli/src/angular15/upgrader/audit/iif-updater-util.js +315 -0
  564. package/tools/wac-cli/src/angular15/upgrader/audit/load-children-callback-updater.js +316 -0
  565. package/tools/wac-cli/src/angular15/upgrader/audit/log-parser.js +316 -0
  566. package/tools/wac-cli/src/angular15/upgrader/audit/observable-throw-updater.js +316 -0
  567. package/tools/wac-cli/src/angular15/upgrader/audit/parameter-count-violation-updater.js +312 -0
  568. package/tools/wac-cli/src/angular15/upgrader/audit/string-replace-updater.js +316 -0
  569. package/tools/wac-cli/src/angular15/upgrader/audit/subjuct-next-updater-util.js +315 -0
  570. package/tools/wac-cli/src/angular15/upgrader/ci-build-yml-upgrader.js +316 -0
  571. package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.js +312 -0
  572. package/tools/wac-cli/src/angular15/upgrader/file-replacement-upgrader.js +315 -0
  573. package/tools/wac-cli/src/angular15/upgrader/git-ignore-upgrader.js +316 -0
  574. package/tools/wac-cli/src/angular15/upgrader/jasmine-test-upgrader.js +316 -0
  575. package/tools/wac-cli/src/angular15/upgrader/package-json-upgrader.js +316 -0
  576. package/tools/wac-cli/src/angular15/upgrader/remove-upgrader.js +316 -0
  577. package/tools/wac-cli/src/angular15/upgrader/replace-upgrader.js +316 -0
  578. package/tools/wac-cli/src/angular15/upgrader/tsconfig-upgrader.js +316 -0
  579. package/tools/wac-cli/src/angular15/upgrader/ui-test-automation-legacy-upgrader.js +316 -0
  580. package/tools/wac-cli/src/angular15/upgrader/version-json-upgrader.js +312 -0
  581. package/tools/wac-cli/src/angular15/utils/add-item.js +312 -0
  582. package/tools/wac-cli/src/angular15/utils/command-runner.js +316 -0
  583. package/tools/wac-cli/src/angular15/utils/file-comparison.js +316 -0
  584. package/tools/wac-cli/src/angular15/utils/file-replacement.js +315 -0
  585. package/tools/wac-cli/src/angular15/utils/file-writer.js +312 -0
  586. package/tools/wac-cli/src/angular15/utils/logger.js +312 -0
  587. package/tools/wac-cli/src/angular15/utils/main-debugger.js +312 -0
  588. package/tools/wac-cli/src/angular15/utils/relative-path.js +316 -0
  589. package/tools/wac-cli/src/angular15/utils/remove-item.js +316 -0
  590. package/tools/wac-cli/src/angular15/utils/space-generator.js +312 -0
  591. package/tools/wac-cli/src/angular15/utils/update-shell-references.js +312 -0
  592. package/tools/wac-cli/src/common.js +316 -0
  593. package/tools/wac-cli/src/create/main.js +316 -0
  594. package/tools/wac-cli/src/eslint/main.js +312 -0
  595. package/tools/wac-cli/src/index.js +316 -0
  596. package/tools/wac-cli/src/upgrade/error-updater.js +312 -0
  597. package/tools/wac-cli/src/upgrade/error-updaters/component-selector-updater.js +312 -0
  598. package/tools/wac-cli/src/upgrade/error-updaters/only-arrow-functions-updater.js +316 -0
  599. package/tools/wac-cli/src/upgrade/error-updaters/updater-lookup.js +312 -0
  600. package/tools/wac-cli/src/upgrade/file-updater.js +316 -0
  601. package/tools/wac-cli/src/upgrade/get-files.js +312 -0
  602. package/tools/wac-cli/src/upgrade/main.js +316 -0
  603. package/tools/wac-cli/src/upgrade/models/error-result.js +316 -0
  604. package/tools/wac-cli/src/upgrade/models/updater-interface.js +316 -0
  605. package/tools/wac-cli/src/upgrade/package-updater.js +316 -0
  606. package/tools/wac-cli/templates/wac-template/package.json +1 -1
  607. package/tools/wac-cli/templates/wac-template/src/favicon.ico +0 -0
  608. package/tools/wac-cli/templates/wac-template/src/karma.conf.js +317 -1
  609. package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Error.ps1 +218 -0
  610. package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Exception.ps1 +216 -0
  611. package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Process.ps1 +216 -1
  612. package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Service.ps1 +216 -1
  613. package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-WinRmState.ps1 +218 -1
  614. package/core/data/extension-broker/snap-in-listener.d.ts.map +0 -1
  615. package/core/data/extension-broker/snap-in-listener.js +0 -73
  616. package/core/data/extension-broker/snap-in-listener.js.map +0 -1
  617. package/microsoft-windows-admin-center-sdk-4.167.0.tgz +0 -0
@@ -62,3 +62,319 @@ export var TelemetryEventStates;
62
62
  })(TelemetryEventStates || (TelemetryEventStates = {}));
63
63
 
64
64
  //# sourceMappingURL=sme-web-telemetry-models.js.map
65
+
66
+ // SIG // Begin signature block
67
+ // SIG // MIIoRAYJKoZIhvcNAQcCoIIoNTCCKDECAQExDzANBglg
68
+ // SIG // hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor
69
+ // SIG // BgEEAYI3AgEeMCQCAQEEEBDgyQbOONQRoqMAEEvTUJAC
70
+ // SIG // AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg
71
+ // SIG // g3RuvAGGGtDnIfYgWy0RvCAk1c+0Un+H3SThLo92D7ag
72
+ // SIG // gg12MIIF9DCCA9ygAwIBAgITMwAAA68wQA5Mo00FQQAA
73
+ // SIG // AAADrzANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJV
74
+ // SIG // UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
75
+ // SIG // UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
76
+ // SIG // cmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBT
77
+ // SIG // aWduaW5nIFBDQSAyMDExMB4XDTIzMTExNjE5MDkwMFoX
78
+ // SIG // DTI0MTExNDE5MDkwMFowdDELMAkGA1UEBhMCVVMxEzAR
79
+ // SIG // BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
80
+ // SIG // bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
81
+ // SIG // bjEeMBwGA1UEAxMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
82
+ // SIG // MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
83
+ // SIG // zkvLNa2un9GBrYNDoRGkGv7d0PqtTBB4ViYakFbjuWpm
84
+ // SIG // F0KcvDAzzaCWJPhVgIXjz+S8cHEoHuWnp/n+UOljT3eh
85
+ // SIG // A8Rs6Lb1aTYub3tB/e0txewv2sQ3yscjYdtTBtFvEm9L
86
+ // SIG // 8Yv76K3Cxzi/Yvrdg+sr7w8y5RHn1Am0Ff8xggY1xpWC
87
+ // SIG // XFI+kQM18njQDcUqSlwBnexYfqHBhzz6YXA/S0EziYBu
88
+ // SIG // 2O2mM7R6gSyYkEOHgIGTVOGnOvvC5xBgC4KNcnQuQSRL
89
+ // SIG // iUI2CmzU8vefR6ykruyzt1rNMPI8OqWHQtSDKXU5JNqb
90
+ // SIG // k4GNjwzcwbSzOHrxuxWHq91l/vLdVDGDUwIDAQABo4IB
91
+ // SIG // czCCAW8wHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYB
92
+ // SIG // BQUHAwMwHQYDVR0OBBYEFEcccTTyBDxkjvJKs/m4AgEF
93
+ // SIG // hl7BMEUGA1UdEQQ+MDykOjA4MR4wHAYDVQQLExVNaWNy
94
+ // SIG // b3NvZnQgQ29ycG9yYXRpb24xFjAUBgNVBAUTDTIzMDAx
95
+ // SIG // Mis1MDE4MjYwHwYDVR0jBBgwFoAUSG5k5VAF04KqFzc3
96
+ // SIG // IrVtqMp1ApUwVAYDVR0fBE0wSzBJoEegRYZDaHR0cDov
97
+ // SIG // L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWlj
98
+ // SIG // Q29kU2lnUENBMjAxMV8yMDExLTA3LTA4LmNybDBhBggr
99
+ // SIG // BgEFBQcBAQRVMFMwUQYIKwYBBQUHMAKGRWh0dHA6Ly93
100
+ // SIG // d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWlj
101
+ // SIG // Q29kU2lnUENBMjAxMV8yMDExLTA3LTA4LmNydDAMBgNV
102
+ // SIG // HRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQCEsRbf
103
+ // SIG // 80dn60xTweOWHZoWaQdpzSaDqIvqpYHE5ZzuEMJWDdcP
104
+ // SIG // 72MGw8v6BSaJQ+a+hTCXdERnIBDPKvU4ENjgu4EBJocH
105
+ // SIG // lSe8riiZUAR+z+z4OUYqoFd3EqJyfjjOJBR2z94Dy4ss
106
+ // SIG // 7LEkHUbj2NZiFqBoPYu2OGQvEk+1oaUsnNKZ7Nl7FHtV
107
+ // SIG // 7CI2lHBru83e4IPe3glIi0XVZJT5qV6Gx/QhAFmpEVBj
108
+ // SIG // SAmDdgII4UUwuI9yiX6jJFNOEek6MoeP06LMJtbqA3Bq
109
+ // SIG // +ZWmJ033F97uVpyaiS4bj3vFI/ZBgDnMqNDtZjcA2vi4
110
+ // SIG // RRMweggd9vsHyTLpn6+nXoLy03vMeebq0C3k44pgUIEu
111
+ // SIG // PQUlJIRTe6IrN3GcjaZ6zHGuQGWgu6SyO9r7qkrEpS2p
112
+ // SIG // RjnGZjx2RmCamdAWnDdu+DmfNEPAddYjaJJ7PTnd+PGz
113
+ // SIG // G+WeH4ocWgVnm5fJFhItjj70CJjgHqt57e1FiQcyWCwB
114
+ // SIG // hKX2rGgN2UICHBF3Q/rsKOspjMw2OlGphTn2KmFl5J7c
115
+ // SIG // Qxru54A9roClLnHGCiSUYos/iwFHI/dAVXEh0S0KKfTf
116
+ // SIG // M6AC6/9bCbsD61QLcRzRIElvgCgaiMWFjOBL99pemoEl
117
+ // SIG // AHsyzG6uX93fMfas09N9YzA0/rFAKAsNDOcFbQlEHKiD
118
+ // SIG // T7mI20tVoCcmSIhJATCCB3owggVioAMCAQICCmEOkNIA
119
+ // SIG // AAAAAAMwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYT
120
+ // SIG // AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
121
+ // SIG // EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
122
+ // SIG // cG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290
123
+ // SIG // IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDExMB4XDTEx
124
+ // SIG // MDcwODIwNTkwOVoXDTI2MDcwODIxMDkwOVowfjELMAkG
125
+ // SIG // A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
126
+ // SIG // BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
127
+ // SIG // dCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9zb2Z0
128
+ // SIG // IENvZGUgU2lnbmluZyBQQ0EgMjAxMTCCAiIwDQYJKoZI
129
+ // SIG // hvcNAQEBBQADggIPADCCAgoCggIBAKvw+nIQHC6t2G6q
130
+ // SIG // ghBNNLrytlghn0IbKmvpWlCquAY4GgRJun/DDB7dN2vG
131
+ // SIG // EtgL8DjCmQawyDnVARQxQtOJDXlkh36UYCRsr55JnOlo
132
+ // SIG // XtLfm1OyCizDr9mpK656Ca/XllnKYBoF6WZ26DJSJhIv
133
+ // SIG // 56sIUM+zRLdd2MQuA3WraPPLbfM6XKEW9Ea64DhkrG5k
134
+ // SIG // NXimoGMPLdNAk/jj3gcN1Vx5pUkp5w2+oBN3vpQ97/vj
135
+ // SIG // K1oQH01WKKJ6cuASOrdJXtjt7UORg9l7snuGG9k+sYxd
136
+ // SIG // 6IlPhBryoS9Z5JA7La4zWMW3Pv4y07MDPbGyr5I4ftKd
137
+ // SIG // gCz1TlaRITUlwzluZH9TupwPrRkjhMv0ugOGjfdf8NBS
138
+ // SIG // v4yUh7zAIXQlXxgotswnKDglmDlKNs98sZKuHCOnqWbs
139
+ // SIG // YR9q4ShJnV+I4iVd0yFLPlLEtVc/JAPw0XpbL9Uj43Bd
140
+ // SIG // D1FGd7P4AOG8rAKCX9vAFbO9G9RVS+c5oQ/pI0m8GLhE
141
+ // SIG // fEXkwcNyeuBy5yTfv0aZxe/CHFfbg43sTUkwp6uO3+xb
142
+ // SIG // n6/83bBm4sGXgXvt1u1L50kppxMopqd9Z4DmimJ4X7Iv
143
+ // SIG // hNdXnFy/dygo8e1twyiPLI9AN0/B4YVEicQJTMXUpUMv
144
+ // SIG // dJX3bvh4IFgsE11glZo+TzOE2rCIF96eTvSWsLxGoGyY
145
+ // SIG // 0uDWiIwLAgMBAAGjggHtMIIB6TAQBgkrBgEEAYI3FQEE
146
+ // SIG // AwIBADAdBgNVHQ4EFgQUSG5k5VAF04KqFzc3IrVtqMp1
147
+ // SIG // ApUwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYD
148
+ // SIG // VR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
149
+ // SIG // BBgwFoAUci06AjGQQ7kUBU7h6qfHMdEjiTQwWgYDVR0f
150
+ // SIG // BFMwUTBPoE2gS4ZJaHR0cDovL2NybC5taWNyb3NvZnQu
151
+ // SIG // Y29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0
152
+ // SIG // MjAxMV8yMDExXzAzXzIyLmNybDBeBggrBgEFBQcBAQRS
153
+ // SIG // MFAwTgYIKwYBBQUHMAKGQmh0dHA6Ly93d3cubWljcm9z
154
+ // SIG // b2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0MjAx
155
+ // SIG // MV8yMDExXzAzXzIyLmNydDCBnwYDVR0gBIGXMIGUMIGR
156
+ // SIG // BgkrBgEEAYI3LgMwgYMwPwYIKwYBBQUHAgEWM2h0dHA6
157
+ // SIG // Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvZG9jcy9w
158
+ // SIG // cmltYXJ5Y3BzLmh0bTBABggrBgEFBQcCAjA0HjIgHQBM
159
+ // SIG // AGUAZwBhAGwAXwBwAG8AbABpAGMAeQBfAHMAdABhAHQA
160
+ // SIG // ZQBtAGUAbgB0AC4gHTANBgkqhkiG9w0BAQsFAAOCAgEA
161
+ // SIG // Z/KGpZjgVHkaLtPYdGcimwuWEeFjkplCln3SeQyQwWVf
162
+ // SIG // Liw++MNy0W2D/r4/6ArKO79HqaPzadtjvyI1pZddZYSQ
163
+ // SIG // fYtGUFXYDJJ80hpLHPM8QotS0LD9a+M+By4pm+Y9G6XU
164
+ // SIG // tR13lDni6WTJRD14eiPzE32mkHSDjfTLJgJGKsKKELuk
165
+ // SIG // qQUMm+1o+mgulaAqPyprWEljHwlpblqYluSD9MCP80Yr
166
+ // SIG // 3vw70L01724lruWvJ+3Q3fMOr5kol5hNDj0L8giJ1h/D
167
+ // SIG // Mhji8MUtzluetEk5CsYKwsatruWy2dsViFFFWDgycSca
168
+ // SIG // f7H0J/jeLDogaZiyWYlobm+nt3TDQAUGpgEqKD6CPxNN
169
+ // SIG // ZgvAs0314Y9/HG8VfUWnduVAKmWjw11SYobDHWM2l4bf
170
+ // SIG // 2vP48hahmifhzaWX0O5dY0HjWwechz4GdwbRBrF1HxS+
171
+ // SIG // YWG18NzGGwS+30HHDiju3mUv7Jf2oVyW2ADWoUa9WfOX
172
+ // SIG // pQlLSBCZgB/QACnFsZulP0V3HjXG0qKin3p6IvpIlR+r
173
+ // SIG // +0cjgPWe+L9rt0uX4ut1eBrs6jeZeRhL/9azI2h15q/6
174
+ // SIG // /IvrC4DqaTuv/DDtBEyO3991bWORPdGdVk5Pv4BXIqF4
175
+ // SIG // ETIheu9BCrE/+6jMpF3BoYibV3FWTkhFwELJm3ZbCoBI
176
+ // SIG // a/15n8G9bW1qyVJzEw16UM0xghomMIIaIgIBATCBlTB+
177
+ // SIG // MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
178
+ // SIG // bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
179
+ // SIG // cm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNy
180
+ // SIG // b3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExAhMzAAAD
181
+ // SIG // rzBADkyjTQVBAAAAAAOvMA0GCWCGSAFlAwQCAQUAoIGu
182
+ // SIG // MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG
183
+ // SIG // AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3
184
+ // SIG // DQEJBDEiBCDmkuhYmb0q9MfPQIUfdPv51STXCZLGRJUB
185
+ // SIG // pfTYl8Y03TBCBgorBgEEAYI3AgEMMTQwMqAUgBIATQBp
186
+ // SIG // AGMAcgBvAHMAbwBmAHShGoAYaHR0cDovL3d3dy5taWNy
187
+ // SIG // b3NvZnQuY29tMA0GCSqGSIb3DQEBAQUABIIBAIj/prjm
188
+ // SIG // 5K6n3dccBefFbcq6itPyDTxr8FBLsGy1HDPQTtdfeLz6
189
+ // SIG // ZWqjfnvjAuF+dk9jp++HRn6L3k2us0f+7+gwthPth6kc
190
+ // SIG // KoJhGrv4v45n12Igv9I51hsTMA3XJ4GsBfZZ9KUZZBhD
191
+ // SIG // wrLh3t+6SbM7DuoV7P2v1omWKNUcoLfQ+e78ptrTGkKi
192
+ // SIG // GV6AL71MQxJ3jZfLwBtWZHEtzJbkPeRKr2H4Zsssvvbi
193
+ // SIG // KhyaWpYBM1nFvTi6U3kZKnJQl5FZA48VBtmouIwzHvp5
194
+ // SIG // Ts+0+S05I5bYez4dEh5YRRaooPWMdFGzQLAlJdK3kEbL
195
+ // SIG // xDh0cmsLfyvr2IGucUT/Y1equJOhghewMIIXrAYKKwYB
196
+ // SIG // BAGCNwMDATGCF5wwgheYBgkqhkiG9w0BBwKggheJMIIX
197
+ // SIG // hQIBAzEPMA0GCWCGSAFlAwQCAQUAMIIBWgYLKoZIhvcN
198
+ // SIG // AQkQAQSgggFJBIIBRTCCAUECAQEGCisGAQQBhFkKAwEw
199
+ // SIG // MTANBglghkgBZQMEAgEFAAQgWNyTXbRLxAgmIedUdE4d
200
+ // SIG // x/5b3I3MVSNuLUbuAJwHczkCBmbrbnXvYhgTMjAyNDA5
201
+ // SIG // MjYwMDAwNTMuOTY0WjAEgAIB9KCB2aSB1jCB0zELMAkG
202
+ // SIG // A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
203
+ // SIG // BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
204
+ // SIG // dCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0
205
+ // SIG // IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYD
206
+ // SIG // VQQLEx5uU2hpZWxkIFRTUyBFU046NTUxQS0wNUUwLUQ5
207
+ // SIG // NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1w
208
+ // SIG // IFNlcnZpY2WgghH+MIIHKDCCBRCgAwIBAgITMwAAAgHR
209
+ // SIG // RVmYEMxCTwABAAACATANBgkqhkiG9w0BAQsFADB8MQsw
210
+ // SIG // CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
211
+ // SIG // MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
212
+ // SIG // b2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3Nv
213
+ // SIG // ZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0yNDA3MjUx
214
+ // SIG // ODMxMjJaFw0yNTEwMjIxODMxMjJaMIHTMQswCQYDVQQG
215
+ // SIG // EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
216
+ // SIG // BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
217
+ // SIG // cnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl
218
+ // SIG // bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsT
219
+ // SIG // Hm5TaGllbGQgVFNTIEVTTjo1NTFBLTA1RTAtRDk0NzEl
220
+ // SIG // MCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy
221
+ // SIG // dmljZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
222
+ // SIG // ggIBALVq3/h8w7u7JOdMuWB4XgiCRtLsUUhRXBzXpPk3
223
+ // SIG // fWZsiY9tBBI2lPCQybuaVnOKTwLASN/DRACdW/igZ5Ur
224
+ // SIG // alPLr1xeKpxEoQ3YvJz7GWULE2QylgIFDNomUzoliLmX
225
+ // SIG // BbOWQvP/hpa1SzOYdWPZ3zIeQeA51EDlzK3pgE/TJL1I
226
+ // SIG // YN7mmIJqi5ZmMjg5m2uJV2QbtdOEiwBbFzn5f0y4aU6E
227
+ // SIG // +Osu5SPbGyPbqt/wHq4d2j4tpJx7xBGs4pV3qKFzSwsH
228
+ // SIG // bviLOqPJEC6LlJ9ysFEJtG+2lLbL9V/zoD5rDiYusjdy
229
+ // SIG // 2FshyEr6zbiKyeImDYB3QQbpkGCvC42ZkGkyhWnMYZly
230
+ // SIG // dKtoM2iH8RdsiMDPlfbEKpB5IP0PokgzaTK+pq/zsJJz
231
+ // SIG // hCIyNIOmTDspor6QocwzaD8/YZCt4FR2SluzVfPlAVze
232
+ // SIG // BtGgV+vXylG8QQS8pNnAvj4TqFI5JelAvP3NIbqo+cV/
233
+ // SIG // JvmFSJPNXu7eiPlfxOMl0XnmYK9BYWKjab04xnGjtlq5
234
+ // SIG // D+V5rGEuyLzDyH+AwsiCVGWqqATE6ACSRxkXvgz6gh4O
235
+ // SIG // m5hj5vezKzlr9evwqOkvXEA5F6fbzEkkUFl8uCrSYWX5
236
+ // SIG // rg89r69Y8ODXoscLiAxsNZrVf03UiPr6SyX1Ii5f2/cP
237
+ // SIG // 7SQfdgQC0E/HtWB/DaYXTqNcQsJHAgMBAAGjggFJMIIB
238
+ // SIG // RTAdBgNVHQ4EFgQUsHKvW5ai6Dz4la8pvZhZhVm8slIw
239
+ // SIG // HwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIw
240
+ // SIG // XwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL3d3dy5taWNy
241
+ // SIG // b3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw
242
+ // SIG // VGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwG
243
+ // SIG // CCsGAQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQaHR0cDov
244
+ // SIG // L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9N
245
+ // SIG // aWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAx
246
+ // SIG // MCgxKS5jcnQwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8E
247
+ // SIG // DDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMCB4AwDQYJ
248
+ // SIG // KoZIhvcNAQELBQADggIBADo0AMs9HFc7UxRql1+SS0cR
249
+ // SIG // Svzv6DHuebg6hAvFXdYG3DNvCgVD4L1CD15v73QzdiFQ
250
+ // SIG // ZFh5sAqeACHMuHWbZLlJndH57umk/TL6NZ3bC6dmCXDK
251
+ // SIG // BSxLd07a4i2jvouBq79GVC7Vl1DwFvzJ+UnI4J9MWXbh
252
+ // SIG // jwQ/17Nye/oHrffvGbwYqbIPze6aIpmDlbB8S3Hpu1eV
253
+ // SIG // 3TDbMrU5v7gqJoTP8IEeSpQ2E1TQFwcXEijHiWog91df
254
+ // SIG // h4TZFZYjJeVTj/p8OcVheebvYenhdhu3gT6k/qkhUPq0
255
+ // SIG // AkHSKzdMhtUDfTya6ILivhSUCXUM3Xw90VlbHIgcoG2G
256
+ // SIG // mZU9XBiSNSMkO+A0NFAXU6X3hrMqxEPTyPEMqlS6m9qu
257
+ // SIG // y7SOgyTDaYWLvo6//9LKa9VFb8gz7bkZ2xkETYtQjsCX
258
+ // SIG // I/TmJpZBYCjXgn2w0+1N7hDr1qJnpF+tGP5ubrUXFD1X
259
+ // SIG // gD3YZAfg8Q2nr9ydcsAzXcrvddZwFT4EZMioDCt1Eixt
260
+ // SIG // +xHZWrQ5PBcrgq8eLYh8qhzt8BOsT8N9kPHv75rkD6AW
261
+ // SIG // bl96lHqBSLMmRHpx6tknDLp4XKlt9klFQIuaGeGd53+3
262
+ // SIG // QIDWrttTRD8IFvtsJKzag4Ox6fMh8qDim4BAbukREG70
263
+ // SIG // n2eSoeD1fktoMX9rquhqGA55agATjGMM99PSEotGzzIf
264
+ // SIG // MIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJmQAAAAAA
265
+ // SIG // FTANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMx
266
+ // SIG // EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
267
+ // SIG // ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
268
+ // SIG // dGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2Vy
269
+ // SIG // dGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMjEwOTMw
270
+ // SIG // MTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQG
271
+ // SIG // EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
272
+ // SIG // BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
273
+ // SIG // cnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt
274
+ // SIG // ZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEB
275
+ // SIG // BQADggIPADCCAgoCggIBAOThpkzntHIhC3miy9ckeb0O
276
+ // SIG // 1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+F2Az/1xP
277
+ // SIG // x2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhgfWpS
278
+ // SIG // g0S3po5GawcU88V29YZQ3MFEyHFcUTE3oAo4bo3t1w/Y
279
+ // SIG // JlN8OWECesSq/XJprx2rrPY2vjUmZNqYO7oaezOtgFt+
280
+ // SIG // jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/dvI2k45GP
281
+ // SIG // sjksUZzpcGkNyjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6
282
+ // SIG // BVWYbWg7mka97aSueik3rMvrg0XnRm7KMtXAhjBcTyzi
283
+ // SIG // YrLNueKNiOSWrAFKu75xqRdbZ2De+JKRHh09/SDPc31B
284
+ // SIG // mkZ1zcRfNN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn42
285
+ // SIG // 7DZM9ituqBJR6L8FA6PRc6ZNN3SUHDSCD/AQ8rdHGO2n
286
+ // SIG // 6Jl8P0zbr17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLR
287
+ // SIG // vWoYWmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2
288
+ // SIG // ZItboKaDIV1fMHSRlJTYuVD5C4lh8zYGNRiER9vcG9H9
289
+ // SIG // stQcxWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUXk8A8
290
+ // SIG // FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6t
291
+ // SIG // AgMBAAGjggHdMIIB2TASBgkrBgEEAYI3FQEEBQIDAQAB
292
+ // SIG // MCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKRPEY1Kc8Q
293
+ // SIG // /y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacbUzUZ
294
+ // SIG // 6XIwXAYDVR0gBFUwUzBRBgwrBgEEAYI3TIN9AQEwQTA/
295
+ // SIG // BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQu
296
+ // SIG // Y29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMG
297
+ // SIG // A1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQM
298
+ // SIG // HgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMB
299
+ // SIG // Af8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjR
300
+ // SIG // PZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6
301
+ // SIG // Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1
302
+ // SIG // Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBa
303
+ // SIG // BggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6
304
+ // SIG // Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWlj
305
+ // SIG // Um9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqGSIb3
306
+ // SIG // DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/q
307
+ // SIG // XBS2Pk5HZHixBpOXPTEztTnXwnE2P9pkbHzQdTltuw8x
308
+ // SIG // 5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6cqYJWAAOw
309
+ // SIG // Bb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVtI1Tk
310
+ // SIG // eFN1JFe53Z/zjj3G82jfZfakVqr3lbYoVSfQJL1AoL8Z
311
+ // SIG // thISEV09J+BAljis9/kpicO8F7BUhUKz/AyeixmJ5/AL
312
+ // SIG // aoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTpkbKpW99J
313
+ // SIG // o3QMvOyRgNI95ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32
314
+ // SIG // THJvEKt1MMU0sHrYUP4KWN1APMdUbZ1jdEgssU5HLcEU
315
+ // SIG // BHG/ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QBjloZkWsN
316
+ // SIG // n6Qo3GcZKCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQ
317
+ // SIG // THa1V1QJsWkBRH58oWFsc/4Ku+xBZj1p/cvBQUl+fpO+
318
+ // SIG // y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10Cga
319
+ // SIG // iQuPNtq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0l
320
+ // SIG // lOZ0dFtq0Z4+7X6gMTN9vMvpe784cETRkPHIqzqKOghi
321
+ // SIG // f9lwY1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGCA1kw
322
+ // SIG // ggJBAgEBMIIBAaGB2aSB1jCB0zELMAkGA1UEBhMCVVMx
323
+ // SIG // EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
324
+ // SIG // ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
325
+ // SIG // dGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQg
326
+ // SIG // T3BlcmF0aW9ucyBMaW1pdGVkMScwJQYDVQQLEx5uU2hp
327
+ // SIG // ZWxkIFRTUyBFU046NTUxQS0wNUUwLUQ5NDcxJTAjBgNV
328
+ // SIG // BAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2Wi
329
+ // SIG // IwoBATAHBgUrDgMCGgMVANftunEf8h9dNA4jRRlobgL9
330
+ // SIG // q2AaoIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNV
331
+ // SIG // BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
332
+ // SIG // HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm
333
+ // SIG // MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
334
+ // SIG // IDIwMTAwDQYJKoZIhvcNAQELBQACBQDqnn5hMCIYDzIw
335
+ // SIG // MjQwOTI1MTIxOTQ1WhgPMjAyNDA5MjYxMjE5NDVaMHcw
336
+ // SIG // PQYKKwYBBAGEWQoEATEvMC0wCgIFAOqefmECAQAwCgIB
337
+ // SIG // AAICDNICAf8wBwIBAAICFHEwCgIFAOqfz+ECAQAwNgYK
338
+ // SIG // KwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgC
339
+ // SIG // AQACAwehIKEKMAgCAQACAwGGoDANBgkqhkiG9w0BAQsF
340
+ // SIG // AAOCAQEAHaUBhaPZM+henFfhK3FY1YcZNQ0Sb5oJ9sYi
341
+ // SIG // zpq39/SHSWXtBaXmoQJ+5uEAQHnR9i9qsPV18M1gdj12
342
+ // SIG // d7PBkYy4Gra8K7l7xLVMFMMfVl6Mmo6XzNUCkM/CpYBd
343
+ // SIG // vBqvwjMtRSkhBh9+CWwm9GzmXTeUhQNSnezfwflyOMq8
344
+ // SIG // fzqzKPhMug8WXnqzhjUldiJ+fTinQZz9KUYg55+11fn0
345
+ // SIG // 7nbvSIsqUcO5yWPrZZtiNcOHSjC4cPWteiHrJPURNaG6
346
+ // SIG // Wz0u+DLAfxSkFZore4XeUW8Ot5Q2CundJNkuDv1sheT8
347
+ // SIG // +dpjIoVmZZZua+nGE1OpP8rjSSUAqF1C+SKl3xBBrjGC
348
+ // SIG // BA0wggQJAgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYD
349
+ // SIG // VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
350
+ // SIG // MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
351
+ // SIG // JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD
352
+ // SIG // QSAyMDEwAhMzAAACAdFFWZgQzEJPAAEAAAIBMA0GCWCG
353
+ // SIG // SAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZI
354
+ // SIG // hvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIEIHSe1SxW4Jz0
355
+ // SIG // tcFmOihev/7iRXRplOF/FA6IP9NNJg/wMIH6BgsqhkiG
356
+ // SIG // 9w0BCRACLzGB6jCB5zCB5DCBvQQgWGuyOkyUEXJsdB2k
357
+ // SIG // k1mXSYKMHa5ffma69KSHah7XOCMwgZgwgYCkfjB8MQsw
358
+ // SIG // CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
359
+ // SIG // MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
360
+ // SIG // b2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3Nv
361
+ // SIG // ZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAgHRRVmY
362
+ // SIG // EMxCTwABAAACATAiBCChjoNJW4L+kFL7kqKWTTb4pQ4s
363
+ // SIG // 0Ip67vZEnPHRgMBY0jANBgkqhkiG9w0BAQsFAASCAgBk
364
+ // SIG // sGv6SZLACJu+kpcZjXIs+CViL6fjVqKrbI4sZWqOIfVh
365
+ // SIG // Qv/h/qqR0E6K02o3mkGSlyKlYNA4C+aaWQhXj8pbSzGS
366
+ // SIG // iXmuzm7By6BW6vtSARNTAdpKWjpe9NXPuPuDQ6GlD1nZ
367
+ // SIG // dysFiDuL59yzqdRTbC2bPlJcuYcSxErVs3dDQXDnRxM/
368
+ // SIG // 9EEE24lRfIce+BVR9XtCD5ruz4Sln28w+S1h/iTPCBLg
369
+ // SIG // LRwDroEb7h7Uo2D3iA+7AZ0QsrVF0CTRVWXCfyL202X4
370
+ // SIG // 98tgieO94vWb6Et+dE7m0XkbpmYuypv54Ou1q/+sIYsk
371
+ // SIG // FL/D/hqXDc37wGjkOx873xTzjTUth+/XaiUyJ0R48n2E
372
+ // SIG // 3RmXf1gTUQGkNVyYZ7FxDQiQthl/wHLasjj1hQ1hDgvR
373
+ // SIG // F2q3oC59GdIrFrVBdNjSksvjWsUQG7d14Mt3+SEVGW2G
374
+ // SIG // xtziUTnePj318NqaQuaeB3MuiWRs/TzP+rQyb0TKNlZN
375
+ // SIG // xCB27TXd3H5HE/PHggm+h3YTytmAcdR76Ko1a/71s1mG
376
+ // SIG // lPga2o9dkLQ+LNxtwrvTwJTfgJyskDRVCJCjsEiyeOdB
377
+ // SIG // KirYIJ4ZbgguZWdV8BXQgGZqP8Ateq4sek7HyO/YmxHW
378
+ // SIG // YUWMKAxxCjw0EOXwqhmAIbof/Wm9dvi4SioRTM/ghAli
379
+ // SIG // xsNR4tQUvQCXP8KJkdTOWg==
380
+ // SIG // End signature block
@@ -16,7 +16,6 @@ export declare class SmeWebTelemetry {
16
16
  private static eventBacklog;
17
17
  private static telemetryHandler;
18
18
  private static testMode;
19
- private static metaService;
20
19
  private static rpcInitAlready;
21
20
  private static metaTags;
22
21
  private static powershellIdMap;
@@ -47,7 +46,7 @@ export declare class SmeWebTelemetry {
47
46
  */
48
47
  private static setMetaInDom;
49
48
  /**
50
- * Update Metatags and/or initialize telemetry, depending on whether rpc message came before or after app-context init.
49
+ * Update Meta-tags and/or initialize telemetry, depending on whether rpc message came before or after app-context init.
51
50
  * @param newMetaTags Primarily contains WAC-Session-Id & extension-version, received from RPC message
52
51
  */
53
52
  static updateFromRpcInit(newMetaTags: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../packages/core/diagnostics/sme-web-telemetry.ts"],"names":[],"mappings":"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","file":"sme-web-telemetry.d.ts","sourcesContent":["// 1DS documentation found at\r\n// https://1dsdocs.azurewebsites.net/getting-started/javascript-getting_started.html\r\n\r\nimport { Meta } from '@angular/platform-browser';\r\nimport { EMPTY, Observable, of } from 'rxjs';\r\nimport { catchError, delay, retryWhen, shareReplay, take, tap } from 'rxjs/operators';\r\nimport { AppContext } from '../data/app-context';\r\nimport { PowerShellCommand } from '../data/powershell';\r\nimport { NotificationState } from '../notification/notification-state';\r\nimport { RpcNotification } from '../rpc/notification/rpc-notification-model';\r\nimport {\r\n GatewayInstallationType,\r\n GatewayInventory,\r\n GatewayMode,\r\n GatewayOperationalMode\r\n} from '../shared/gateway-inventory/gateway-inventory';\r\nimport { GatewayInventoryCache } from '../shared/gateway-inventory/gateway-inventory-cache';\r\nimport { Logging } from './logging';\r\nimport {\r\n CompleteSmePerformanceData,\r\n IContentUpdateOverrideValues,\r\n IPageActionOverrideValues,\r\n IPageViewOverrideValues,\r\n IPageViewPerformanceOverrideValues,\r\n LighthousePerformanceMetrics,\r\n PowershellDetails,\r\n SmeMetaLabels,\r\n SmePerformanceData,\r\n TelemetryActionTypes,\r\n TelemetryEventBody,\r\n TelemetryEvents,\r\n TelemetryEventStates,\r\n TelemetryEventTypes\r\n} from './sme-web-telemetry-models';\r\n\r\n// placeholder for the oneDS type, introduced when we load script.\r\ndeclare let oneDS: any;\r\n\r\nexport class SmeWebTelemetry {\r\n\r\n /**\r\n * The source name to use when logging about this service.\r\n */\r\n private static get logSourceName() {\r\n return 'WebTelemetry';\r\n }\r\n /**\r\n * Gets the name of current shell or module.\r\n */\r\n private static get nameOfModule(): string {\r\n return MsftSme.self().Init.moduleName ? MsftSme.self().Init.moduleName : SmeWebTelemetry.testMode;\r\n }\r\n\r\n private static get backlogHasSpace(): boolean {\r\n return this.eventBacklog.length < 50;\r\n }\r\n\r\n private static eventBacklog: [TelemetryEvents, TelemetryEventBody][] = [];\r\n private static telemetryHandler = null;\r\n\r\n private static testMode = 'test';\r\n private static metaService: Meta;\r\n private static rpcInitAlready = false;\r\n private static metaTags: { [tag: string]: string } = {};\r\n private static powershellIdMap: { [id: string]: PowerShellCommand } = {};\r\n private static isProd = true;\r\n\r\n public static get isProduction() {\r\n return this.isProd;\r\n }\r\n\r\n // AppId/Tenant Token provided by MarTech support\r\n // AppId is not used, but it will be mapped to later in the pipeline\r\n // Full keys are JS:WindowsAdminCenter and o:f78e2b7c9ae4461399c360160d82dcfc for\r\n // AppId/Tenant token respectively. In Cosmos, only the initial portion of the tenant token is used.\r\n // private static windowsAdminCenterAppId = 'WindowsAdminCenter';\r\n private static windowsAdminCenterTenantToken = 'f78e2b7c9ae4461399c360160d82dcfc-9371288c-a1b9-4fdc-a196-0340fc5f9880-7071';\r\n\r\n /**\r\n * Map of module versions used in this instance of web telemetry - memoize values here.\r\n */\r\n private static moduleVersions = {};\r\n\r\n /**\r\n * Get the list of module versions for use in telemetry where the event is sent via RPC to shell\r\n * from the actual module the event is called in.\r\n * @returns list of module mappings to versions\r\n */\r\n private static getModuleVersion(moduleName: string): string {\r\n if (this.moduleVersions[moduleName]) {\r\n return this.moduleVersions[moduleName];\r\n }\r\n const environment = MsftSme.self().Environment;\r\n const moduleObject = environment.modules.find((module) => {\r\n return module.name === moduleName;\r\n });\r\n const version = moduleObject ? moduleObject.version : 'N/A';\r\n this.moduleVersions[moduleName] = version;\r\n return version;\r\n }\r\n\r\n /**\r\n * Send any manual events that were triggered prior to telemetry initializing.\r\n */\r\n private static sendBacklogEvents(): void {\r\n this.eventBacklog.forEach(([type, body]: [TelemetryEvents, TelemetryEventBody]) => {\r\n switch (type) {\r\n case TelemetryEvents.Performance: {\r\n const overrideVals = body.overrideValues as IContentUpdateOverrideValues;\r\n this.tracePerformanceData(body.performance, overrideVals ? overrideVals.content : null);\r\n break;\r\n }\r\n case TelemetryEvents.Lighthouse: {\r\n this.traceLighthouseData(body.lighthouse, body.overrideValues as IContentUpdateOverrideValues);\r\n break;\r\n }\r\n case TelemetryEvents.ModuleOpenPerformance: this.traceModuleOpenPerformance(body.performance); break;\r\n case TelemetryEvents.Action: {\r\n const overrideVals = body.overrideValues as IPageActionOverrideValues;\r\n this.traceAction(body.element, overrideVals, body.customProperties);\r\n break;\r\n }\r\n case TelemetryEvents.ContentUpdate: {\r\n const overrideVals = body.overrideValues as IContentUpdateOverrideValues;\r\n this.traceContentUpdate(overrideVals, body.customProperties);\r\n break;\r\n }\r\n case TelemetryEvents.PageView: {\r\n const overrideVals = body.overrideValues as IPageViewOverrideValues;\r\n this.tracePageView(overrideVals, body.customProperties);\r\n break;\r\n }\r\n case TelemetryEvents.Notification: this.traceClientNotification(body.notification); break;\r\n default: return;\r\n }\r\n });\r\n this.eventBacklog = [];\r\n }\r\n\r\n /**\r\n * Helper to combine setting metaTags, initialize handler, and\r\n * send any telemetry events that occurred prior to initialization\r\n */\r\n private static configureAndInitTelemetry(): void {\r\n this.setMetaInDom();\r\n this.initTelemetryHandler().subscribe({\r\n next: () => {\r\n this.sendBacklogEvents();\r\n },\r\n error: (error: Error) => {\r\n Logging.logError(this.logSourceName, '{0}: {1}'.format(error.name, error.message));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Helper function to set metaTags in DOM\r\n */\r\n private static setMetaInDom(): void {\r\n for (const [key, value] of Object.entries(this.metaTags)) {\r\n this.metaService.updateTag({ name: `awa-${key}`, content: value });\r\n }\r\n }\r\n\r\n /**\r\n * Update Metatags and/or initialize telemetry, depending on whether rpc message came before or after app-context init.\r\n * @param newMetaTags Primarily contains WAC-Session-Id & extension-version, received from RPC message\r\n */\r\n public static updateFromRpcInit(newMetaTags: { [tag: string]: string }): void {\r\n // All the fields will be updated at the same time here, checking one (wac-session-id is the main one) is enough for the check\r\n const shouldInitHere = SmeMetaLabels.SessionId in this.metaTags\r\n && this.metaTags[SmeMetaLabels.SessionId] === 'N/A';\r\n\r\n this.rpcInitAlready = true;\r\n MsftSme.deepAssign(this.metaTags, newMetaTags);\r\n\r\n // If metaTags contains session ID but it's N/A (ie initial init was called already), call the init. If not,\r\n // just wait for normal init to be called in app-context. Depending on timing RPC update can happen before or after.\r\n if (shouldInitHere) {\r\n this.configureAndInitTelemetry();\r\n }\r\n }\r\n\r\n /**\r\n * Load 1DS if does not already exist.\r\n * @param appContext App context currently being used\r\n */\r\n public static init(appContext: AppContext): Observable<boolean> {\r\n if (this.telemetryHandler) {\r\n return EMPTY;\r\n }\r\n\r\n this.metaService = new Meta(document);\r\n // Set fields we don't need gateway for, if connection to gateway fails, initialize telemetry with limited fields\r\n this.metaTags[SmeMetaLabels.Language] = MsftSme.self().Resources.localeId;\r\n this.metaTags[SmeMetaLabels.Market] = MsftSme.self().Resources.localeId;\r\n this.metaTags[SmeMetaLabels.IsProduction] = MsftSme.self().Init.isProduction.toString();\r\n this.metaTags[SmeMetaLabels.Environment] = MsftSme.self().Init.isProduction.toString();\r\n this.metaTags[SmeMetaLabels.ExtensionVersion] = MsftSme.self().Environment.version;\r\n this.metaTags[SmeMetaLabels.SessionId] = MsftSme.sessionId();\r\n // Instantiate these initially so they aren't empty values\r\n this.metaTags[SmeMetaLabels.InstallationType] = 'N/A';\r\n this.metaTags[SmeMetaLabels.Build] = 'N/A';\r\n this.metaTags[SmeMetaLabels.GatewayMode] = GatewayMode[MsftSme.self().Init.mode];\r\n this.metaTags[SmeMetaLabels.GatewayOperationalMode] = 'N/A';\r\n this.isProd = MsftSme.self().Init.isProduction;\r\n\r\n const gatewayInventoryCache = new GatewayInventoryCache(appContext);\r\n return gatewayInventoryCache.query({})\r\n .pipe(\r\n retryWhen(errors => {\r\n let gatewayRetries = 2;\r\n return errors.pipe(\r\n delay(1000),\r\n tap((error) => {\r\n if (gatewayRetries === 0) {\r\n throw error;\r\n }\r\n Logging.logDebug(this.logSourceName, 'Attempting to query gateway again...');\r\n gatewayRetries--;\r\n })\r\n );\r\n }),\r\n take(1),\r\n tap((status: any) => {\r\n const inventory: GatewayInventory = status.instance;\r\n this.isProd = this.isProd\r\n && inventory.gatewayOperationalMode === GatewayOperationalMode.Production;\r\n\r\n this.metaTags[SmeMetaLabels.InstallationType] = inventory.installationType || GatewayInstallationType.Standard;\r\n this.metaTags[SmeMetaLabels.Build] = inventory.gatewayVersion;\r\n this.metaTags[SmeMetaLabels.GatewayMode] = GatewayMode[inventory.mode];\r\n this.metaTags[SmeMetaLabels.GatewayOperationalMode] = GatewayOperationalMode[inventory.gatewayOperationalMode];\r\n this.metaTags[SmeMetaLabels.IsProduction] = this.isProd.toString();\r\n this.metaTags[SmeMetaLabels.Environment] = this.isProd.toString();\r\n // If not shell, handle in RPC handler, because some fields will init after 1DS inits\r\n // If rpc handler has happened already, go ahead with this\r\n if (MsftSme.isShell() || this.rpcInitAlready) {\r\n this.configureAndInitTelemetry();\r\n }\r\n }),\r\n catchError((error) => {\r\n Logging.logWarning(this.logSourceName, 'Telemetry failed to initialized with error {}'.format(error.message));\r\n return of(false);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Set config and initialize telemetry library handler\r\n */\r\n private static initTelemetryHandler(): Observable<any> {\r\n const observable = new Observable(observer => {\r\n const script: HTMLScriptElement = document.createElement('script');\r\n script.type = 'text/javascript';\r\n script.src = MsftSme.self().Environment.configuration.telemetry.sourceLibraryCdnLink;\r\n script.integrity = MsftSme.self().Environment.configuration.telemetry.sourceLibraryCdnIntegrityHash;\r\n script.crossOrigin = 'anonymous';\r\n script.async = true;\r\n\r\n script.onload = () => {\r\n this.telemetryHandler = new oneDS.ApplicationInsights();\r\n const entryType: string = MsftSme.self().Init.entryPointType;\r\n const entryName: string = MsftSme.self().Init.entryPointName;\r\n\r\n const config = {\r\n instrumentationKey: this.windowsAdminCenterTenantToken,\r\n // post channel configuration\r\n channelConfiguration: {\r\n eventsLimitInMem: 50\r\n },\r\n // Properties Plugin configuration\r\n propertyConfiguration: {\r\n userAgent: 'Windows Admin Center',\r\n sessionAsGuid: true\r\n },\r\n // Web Analytics Plugin configuration\r\n webAnalyticsConfiguration: {\r\n autoCapture: {\r\n scroll: false,\r\n pageView: true,\r\n onLoad: false,\r\n onUnload: true,\r\n click: true,\r\n resize: true,\r\n jsError: true,\r\n lineage: true\r\n },\r\n coreData: {\r\n pageName: this.nameOfModule,\r\n // to prevent personal data from being sent in URI\r\n referrerUri: 'windows.admin.center',\r\n requestUri: 'windows.admin.center',\r\n pageTags: {\r\n entryPointName: entryName || '',\r\n entryPointType: entryType || ''\r\n }\r\n },\r\n useShortNameForContentBlob: false\r\n }\r\n };\r\n this.telemetryHandler.initialize(config, []);\r\n this.telemetryHandler.addTelemetryInitializer((event: any) => {\r\n // If we send an event that originates from a different module (eg notifications in shell)\r\n // change the extension version to match module\r\n if (event.baseData.name !== this.nameOfModule) {\r\n event.baseData.properties.pageTags.metaTags[SmeMetaLabels.ExtensionVersion] =\r\n this.getModuleVersion(event.baseData.name);\r\n }\r\n event.baseData.properties.pageTags.screenResolution = {\r\n availableHeight: window.screen.availHeight,\r\n availableWidth: window.screen.availWidth\r\n };\r\n event.baseData.properties.pageTags.frameDetails = { height: window.innerHeight, width: window.innerWidth };\r\n });\r\n observer.next();\r\n observer.complete();\r\n };\r\n script.onerror = () => {\r\n script.remove();\r\n observer.error(new Error('1DS Script could not be loaded'));\r\n };\r\n document.body.appendChild(script);\r\n }).pipe(shareReplay(1));\r\n return observable;\r\n }\r\n\r\n /**\r\n * Send a Page-Action event through Web Telemetry.\r\n * @param element Element action is being executed on\r\n * @param overrideValues Various values to override within default Web Telemetry page action fields, see Web Telemetry documentation.\r\n * @param properties Extra properties in an index signature. These are placed under the data field in partC data.\r\n */\r\n public static traceAction(element: Element, overrideValues?: IPageActionOverrideValues, properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Action, {\r\n element: element, overrideValues: overrideValues,\r\n customProperties: properties\r\n }]);\r\n }\r\n return;\r\n }\r\n if (!overrideValues.actionType) {\r\n overrideValues.actionType = TelemetryActionTypes.Automatic;\r\n }\r\n this.telemetryHandler.capturePageAction(element, overrideValues, properties);\r\n }\r\n\r\n /**\r\n * Send a Page-View event through Web Telemetry.\r\n * @param overrideValues Various values to override within default Web Telemetry page view fields, see Web Telemetry documentation.\r\n * @param properties Extra properties in an index signature. These are placed under the data field in partC data.\r\n */\r\n public static tracePageView(overrideValues: IPageViewOverrideValues, properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.PageView, { overrideValues: overrideValues }]);\r\n }\r\n return;\r\n }\r\n this.telemetryHandler.capturePageView(overrideValues, properties);\r\n }\r\n\r\n /**\r\n * Send a Content-Update event through Web Telemetry.\r\n * @param overrideValues Various values to override within default Web Telemetry content update fields, see Web Telemetry documentation\r\n * @param properties Extra properties in an index signature. These are placed under the data field in partC data.\r\n */\r\n public static traceContentUpdate(overrideValues: IContentUpdateOverrideValues, properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.ContentUpdate, { overrideValues: overrideValues, customProperties: properties }]);\r\n }\r\n return;\r\n }\r\n if (!overrideValues.actionType) {\r\n overrideValues.actionType = TelemetryActionTypes.Automatic;\r\n }\r\n this.telemetryHandler.captureContentUpdate(overrideValues, properties);\r\n }\r\n\r\n /**\r\n * Add standard fields onto performance data\r\n * @param data SmePerformanceData to be sent\r\n */\r\n private static fillStandardPerformanceData(data: SmePerformanceData): CompleteSmePerformanceData {\r\n const fullDataPayload: CompleteSmePerformanceData = {\r\n extension: MsftSme.self().Environment.name,\r\n entryPointName: MsftSme.self().Init.entryPointName || '',\r\n url: window.location.pathname,\r\n moduleOpened: false,\r\n totalLoadTime: '',\r\n label: data.label,\r\n sme: {},\r\n resources: {},\r\n navigation: {}\r\n };\r\n // Truncate all decimals to 5 places to avoid cosmos stream from redacting any\r\n // Convert PerformanceNavigationTiming to JSON so we can manipulate it via Object.() methods.\r\n fullDataPayload.totalLoadTime = data.totalLoadTime.toFixed(5);\r\n const timingData = {\r\n 'sme': data.sme || {},\r\n 'resources': data.resources || {},\r\n 'navigation': data.navigation ? data.navigation.toJSON() : {}\r\n };\r\n\r\n for (const [sourceKey, sourceVal] of Object.entries(timingData)) {\r\n for (const [resourceKey, resourceVal] of Object.entries(sourceVal)) {\r\n // navigation has some string-string maps, ignore the string values.\r\n // Convert all numbers back into numbers to preserve types in cosmos stream\r\n if (!MsftSme.isEmpty(sourceVal) && typeof resourceVal === 'number') {\r\n fullDataPayload[sourceKey][resourceKey] = parseFloat(resourceVal.toFixed(7));\r\n }\r\n }\r\n }\r\n\r\n // Set this here if need - often the appLoad times happen before Init is populated,\r\n // so check again to make sure if its actually empty.\r\n if (fullDataPayload.navigation) {\r\n fullDataPayload.entryPointName = MsftSme.self().Init.entryPointName || '';\r\n }\r\n return fullDataPayload;\r\n }\r\n\r\n /**\r\n * Send a content update event. This content update contains an updated sme-specific timings structure with relevant\r\n * performance data under the data field. The original timings data is also contained under the navigation field.\r\n * The structure of the event is such:\r\n * data : { ...,\r\n * \"timings\": {\r\n * \"extension\": [extension-name],\r\n * \"entryPointName\": [entryPointName],\r\n * \"url\": [url-endpoint],\r\n * \"moduleOpened\" : [isModuleOpened],\r\n * \"sme\": {\r\n * [sme-mark] : [mark-timestamps],\r\n * ...\r\n * },\r\n * \"resources\": {\r\n * [resource-endpoint] : [resource-load-complete-timestamps],\r\n * ...\r\n * },\r\n * \"navigation\": {\r\n * [performance-navigation-event]: [navigation-event-timestamps]\r\n * }\r\n * }, ...\r\n * }\r\n * Certain fields are set within this class instead of outside modules since they will always be the same.\r\n * @param dataPayload performance data to be sent through telemetry.\r\n * @param contentOverrides any content overriding behavior wanted in the performance event\r\n */\r\n public static tracePerformanceData(dataPayload: SmePerformanceData, contentOverrides?: any): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Performance,\r\n {\r\n performance: dataPayload,\r\n overrideValues: { content: contentOverrides } as IContentUpdateOverrideValues\r\n }]);\r\n }\r\n return;\r\n }\r\n const data = SmeWebTelemetry.fillStandardPerformanceData(dataPayload);\r\n\r\n // A for automatic, performance tracking is done automatically.\r\n const overrideValues: IContentUpdateOverrideValues = {\r\n actionType: TelemetryActionTypes.Automatic,\r\n content: contentOverrides || dataPayload\r\n };\r\n\r\n const customProps = { timings: data, type: TelemetryEventTypes.Performance };\r\n this.telemetryHandler.captureContentUpdate(overrideValues, customProps);\r\n }\r\n\r\n /**\r\n * Send a content update event - this event will contain timings for lighthouse calculation in the backend\r\n * This can potentially be sent a couple times with overlapping data for one page load event, depending\r\n * on when the TTI is calculated. In this scenario, it will be handled on the backend.\r\n * @param dataPayload Lighthouse data\r\n * @param contentOverrides any content overriding behavior wanted in the performance event\r\n */\r\n public static traceLighthouseData(dataPayload: LighthousePerformanceMetrics, contentOverrides?: any,\r\n properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Lighthouse,\r\n {\r\n lighthouse: dataPayload,\r\n overrideValues: { content: contentOverrides } as IContentUpdateOverrideValues\r\n }]);\r\n }\r\n return;\r\n }\r\n const overrideValues: IContentUpdateOverrideValues = {\r\n actionType: TelemetryActionTypes.Automatic,\r\n content: contentOverrides || dataPayload\r\n };\r\n\r\n const customProps = { timings: dataPayload, type: TelemetryEventTypes.Lighthouse };\r\n MsftSme.deepAssign(customProps, properties);\r\n this.telemetryHandler.captureContentUpdate(overrideValues, customProps);\r\n }\r\n\r\n /**\r\n * See tracePerformanceData comments, only difference is moduleOpened is true and the contentOverrides\r\n * @param dataPayload performance data to be sent through telemetry.\r\n */\r\n public static traceModuleOpenPerformance(dataPayload: SmePerformanceData): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.ModuleOpenPerformance, { performance: dataPayload }]);\r\n }\r\n return;\r\n }\r\n const data = SmeWebTelemetry.fillStandardPerformanceData(dataPayload);\r\n data.moduleOpened = true;\r\n\r\n const overrideValues: IPageViewPerformanceOverrideValues = {\r\n customTiming: JSON.stringify(data)\r\n };\r\n const customProps = { timings: data, type: TelemetryEventTypes.Performance };\r\n\r\n this.telemetryHandler.capturePageViewPerformance(overrideValues, customProps);\r\n }\r\n\r\n /**\r\n * Helper to create event boilerplate for notification\r\n * @param clientNotification Client notification to send event for\r\n */\r\n public static traceClientNotification(clientNotification: RpcNotification): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Notification, { notification: clientNotification }]);\r\n }\r\n return;\r\n }\r\n const overrideValues: IContentUpdateOverrideValues = {\r\n content: {\r\n message: clientNotification.message,\r\n title: clientNotification.title,\r\n state: NotificationState[clientNotification.state],\r\n contentType: TelemetryEventTypes.Notification\r\n },\r\n // If source is not shell, replace pagename with proper source.\r\n pageName: clientNotification.sourceName ? clientNotification.sourceName : this.nameOfModule\r\n };\r\n this.traceContentUpdate(overrideValues, { type: TelemetryEventTypes.Notification });\r\n }\r\n\r\n /**\r\n * Helper function to assign a command to an id in a multi-step workitem process\r\n * @param id The ID of the powershell session to assign\r\n * @param command The command to assign to the session ID\r\n */\r\n public static addPowershellId(id: string, command: PowerShellCommand) {\r\n this.powershellIdMap[id] = command;\r\n }\r\n\r\n /**\r\n * Helper function to assign a command to an id in a multi-step workitem process\r\n * @param id The ID of the powershell session to assign\r\n * @param command The command to assign to the session ID\r\n */\r\n public static removePowershellId(id: string) {\r\n delete this.powershellIdMap[id];\r\n }\r\n\r\n /**\r\n * Helper to create event boilerplate for powershell event. In the case where command is not available,\r\n * use an ID (usually ps session ID, which may correlate with work item id)\r\n * @param command Powershell Command\r\n * @param state State of powershell event (start/end/etc)\r\n * @param details Optional details object - see interface for more detail.\r\n */\r\n public static tracePowershellEvent(command: PowerShellCommand, state: TelemetryEventStates, details?: PowershellDetails): void {\r\n const id = details ? details.id : null;\r\n const response = details ? details.response : null;\r\n const psCommand = command ? command : this.powershellIdMap[id];\r\n\r\n // Ignore any events that are either null or un-named PS commands.\r\n if ((psCommand && !psCommand.command) || !psCommand) {\r\n return;\r\n }\r\n\r\n // If state is not started and id is provided, remove the ID from the map to save space.\r\n if (state !== TelemetryEventStates.Started && id) {\r\n this.removePowershellId(id);\r\n }\r\n\r\n const psContent = {\r\n psCommand: psCommand.command, state: state, psModule: psCommand.module,\r\n otherData: details && details.otherData ? details.otherData : {}\r\n };\r\n const sourceName = this.nameOfModule;\r\n if (response && response.error) {\r\n psContent['errorCodes'] = [response.error.code];\r\n } else if (response && response.errors) {\r\n psContent['errorCodes'] = response.errors.map((e) => e.errorType);\r\n psContent.otherData['hResult'] = response.errors.map((e) => e.detailRecord && e.detailRecord.hResult);\r\n }\r\n SmeWebTelemetry.traceAction(null, { content: psContent, pageName: sourceName },\r\n { type: TelemetryEventTypes.Powershell });\r\n }\r\n\r\n /**\r\n * Helper to create event boilerplate for powershell batch event. Batch doesn't deal with work items, so\r\n * we can ignore the ID and sourceName handling that the above function handles.\r\n * @param commands Powershell Commands List in properties stringified form. PS Batch events places PS command into a\r\n * '{properties: PSCommand }' string structure.\r\n * @param state State of powershell event (start/end/etc)\r\n * @param details Optional details object contains various optional fields in powershell event.\r\n * @returns\r\n */\r\n public static tracePowershellBatchEvent(commands: string[], state: TelemetryEventStates, details?: PowershellDetails) {\r\n // check that at least one command is valid\r\n if (!commands || commands.length === 0) {\r\n return;\r\n }\r\n\r\n let parsedCommands: string[] = [];\r\n parsedCommands = commands.reduce((commandList, currentCommand) => {\r\n if (currentCommand) {\r\n const parsedCommand = JSON.parse(currentCommand).properties.command;\r\n if (parsedCommand) {\r\n commandList.push(parsedCommand);\r\n }\r\n return commandList;\r\n }\r\n }, parsedCommands);\r\n\r\n const response = details ? details.response : null;\r\n\r\n const psContent = { psCommands: parsedCommands, state: state, otherData: details && details.otherData ? details.otherData : {} };\r\n\r\n if (response && response.error) {\r\n psContent['errorCodes'] = [response.error.code];\r\n } else if (response && response.errors) {\r\n psContent['errorCodes'] = response.errors.map((e) => e.errorType);\r\n psContent.otherData['hResult'] = response.errors.map((e) => e.detailRecord && e.detailRecord.hResult);\r\n }\r\n SmeWebTelemetry.traceAction(null, { content: psContent },\r\n { type: TelemetryEventTypes.Powershell });\r\n }\r\n\r\n /**\r\n * Helper to redactGenericModel function\r\n * Determines whether field should be redacted according to fields provided for redacting and exceptions\r\n * @param key The field in question\r\n * @param keywordsToRedact List of string inclusions to redact - if the field contains any part of this, it will be redacted\r\n * @param exceptions Set of exceptions to the above - if the field matches an exception, it will not be redacted\r\n * @returns True if field should be redacted, false otherwise\r\n */\r\n private static fieldShouldBeRedacted(key: string, keywordsToRedact: string[], exceptions: Set<string>): boolean {\r\n if (exceptions.has(key)) {\r\n return false;\r\n }\r\n\r\n for (const field of keywordsToRedact) {\r\n if (key.toLowerCase().includes(field.toLowerCase())) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Telemetry utility function to redact a model object. This function will traverse the model in BFS fashion and redact any fields\r\n * that contain any string in the keywordsToRedact array, unless the field is an exception (in the exceptions array).\r\n * This function will not affect keys in StringMaps or Maps - if names exist there, they should be handled separately.\r\n *\r\n * @param model Model to redact\r\n * @param keywordsToRedact List of string inclusions to redact\r\n * @param fieldExceptions List of exceptions to the above\r\n * @returns Redacted model\r\n */\r\n public static redactGenericModel(model: any, keywordsToRedact: string[], fieldExceptions: string[]): any {\r\n const redacted_model: any = JSON.parse(JSON.stringify(model));\r\n const remainingObjects = [redacted_model];\r\n const exceptionSet = new Set(fieldExceptions);\r\n\r\n while (remainingObjects.length > 0) {\r\n const currentTree = remainingObjects[0];\r\n\r\n Object.keys(currentTree).forEach(key => {\r\n if (MsftSme.isPlainObject(currentTree[key])) {\r\n remainingObjects.push(currentTree[key]);\r\n } else if (Array.isArray(currentTree[key]) && currentTree[key].some((field: any) => MsftSme.isPlainObject(field))) {\r\n // If array intermixes objects and non-objects, we will push the objects into the queue and ignore the non-objects.\r\n // The non-objects will avoid redaction, but this should never be a concern in practice.\r\n remainingObjects.push(currentTree[key].filter((field: any) => MsftSme.isPlainObject(field)));\r\n } else if (this.fieldShouldBeRedacted(key, keywordsToRedact, exceptionSet)) {\r\n if (Array.isArray(currentTree[key])) {\r\n for (let i = 0; i < currentTree[key].length; ++i) {\r\n currentTree[key][i] = '***';\r\n }\r\n } else {\r\n currentTree[key] = '***';\r\n }\r\n }\r\n });\r\n remainingObjects.shift();\r\n }\r\n return redacted_model;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../packages/core/diagnostics/sme-web-telemetry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,UAAU,EAAM,MAAM,MAAM,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAS7E,OAAO,EAEH,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,EAEvB,4BAA4B,EAC5B,iBAAiB,EAEjB,kBAAkB,EAIlB,oBAAoB,EAEvB,MAAM,4BAA4B,CAAC;AAKpC,qBAAa,eAAe;IAExB;;OAEG;IACH,OAAO,CAAC,MAAM,KAAK,aAAa,GAE/B;IACD;;OAEG;IACH,OAAO,CAAC,MAAM,KAAK,YAAY,GAE9B;IAED,OAAO,CAAC,MAAM,KAAK,eAAe,GAEjC;IAED,OAAO,CAAC,MAAM,CAAC,YAAY,CAA+C;IAC1E,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAQ;IAEvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAU;IACjC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAS;IACtC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiC;IACxD,OAAO,CAAC,MAAM,CAAC,eAAe,CAA2C;IACzE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAQ;IAE7B,WAAkB,YAAY,YAE7B;IAOD,OAAO,CAAC,MAAM,CAAC,6BAA6B,CAAgF;IAE5H;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc,CAAM;IAEnC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAa/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAmChC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAYxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IA0B3B;;;OAGG;WACW,iBAAiB,CAAC,WAAW,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,IAAI;IAe7E;;;OAGG;WACW,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC;IAqD/D;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IA4EnC;;;;;OAKG;WACW,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,yBAAyB,EAAE,UAAU,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,GAAG,IAAI;IAgBnI;;;;OAIG;WACW,aAAa,CAAC,cAAc,EAAE,uBAAuB,EAAE,UAAU,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,GAAG,IAAI;IAUhH;;;;OAIG;WACW,kBAAkB,CAAC,cAAc,EAAE,4BAA4B,EAAE,UAAU,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,GAAG,IAAI;IAa1H;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAuC1C;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;WACW,oBAAoB,CAAC,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,EAAE,GAAG,GAAG,IAAI;IAuBjG;;;;;;OAMG;WACW,mBAAmB,CAAC,WAAW,EAAE,4BAA4B,EAAE,gBAAgB,CAAC,EAAE,GAAG,EAC/F,UAAU,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,GAAG,IAAI;IAqB/C;;;OAGG;WACW,0BAA0B,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI;IAkB/E;;;OAGG;WACW,uBAAuB,CAAC,kBAAkB,EAAE,eAAe,GAAG,IAAI;IAoBhF;;;;OAIG;WACW,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB;IAIpE;;;;OAIG;WACW,kBAAkB,CAAC,EAAE,EAAE,MAAM;IAI3C;;;;;;OAMG;WACW,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI;IA8B9H;;;;;;;;OAQG;WACW,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,iBAAiB;IA+BpH;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAapC;;;;;;;;;OASG;WACW,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,GAAG;CA6B3G","file":"sme-web-telemetry.d.ts","sourcesContent":["// 1DS documentation found at\r\n// https://1dsdocs.azurewebsites.net/getting-started/javascript-getting_started.html\r\n\r\nimport { EMPTY, Observable, of } from 'rxjs';\r\nimport { catchError, delay, retry, shareReplay, take, tap } from 'rxjs/operators';\r\nimport { AppContext } from '../data/app-context';\r\nimport { PowerShellCommand } from '../data/powershell';\r\nimport { NotificationState } from '../notification/notification-state';\r\nimport { RpcNotification } from '../rpc/notification/rpc-notification-model';\r\nimport {\r\n GatewayInstallationType,\r\n GatewayInventory,\r\n GatewayMode,\r\n GatewayOperationalMode\r\n} from '../shared/gateway-inventory/gateway-inventory';\r\nimport { GatewayInventoryCache } from '../shared/gateway-inventory/gateway-inventory-cache';\r\nimport { Logging } from './logging';\r\nimport {\r\n CompleteSmePerformanceData,\r\n IContentUpdateOverrideValues,\r\n IPageActionOverrideValues,\r\n IPageViewOverrideValues,\r\n IPageViewPerformanceOverrideValues,\r\n LighthousePerformanceMetrics,\r\n PowershellDetails,\r\n SmeMetaLabels,\r\n SmePerformanceData,\r\n TelemetryActionTypes,\r\n TelemetryEventBody,\r\n TelemetryEvents,\r\n TelemetryEventStates,\r\n TelemetryEventTypes\r\n} from './sme-web-telemetry-models';\r\n\r\n// placeholder for the oneDS type, introduced when we load script.\r\ndeclare let oneDS: any;\r\n\r\nexport class SmeWebTelemetry {\r\n\r\n /**\r\n * The source name to use when logging about this service.\r\n */\r\n private static get logSourceName() {\r\n return 'WebTelemetry';\r\n }\r\n /**\r\n * Gets the name of current shell or module.\r\n */\r\n private static get nameOfModule(): string {\r\n return MsftSme.self().Init.moduleName ? MsftSme.self().Init.moduleName : SmeWebTelemetry.testMode;\r\n }\r\n\r\n private static get backlogHasSpace(): boolean {\r\n return this.eventBacklog.length < 50;\r\n }\r\n\r\n private static eventBacklog: [TelemetryEvents, TelemetryEventBody][] = [];\r\n private static telemetryHandler = null;\r\n\r\n private static testMode = 'test';\r\n private static rpcInitAlready = false;\r\n private static metaTags: { [tag: string]: string } = {};\r\n private static powershellIdMap: { [id: string]: PowerShellCommand } = {};\r\n private static isProd = true;\r\n\r\n public static get isProduction() {\r\n return this.isProd;\r\n }\r\n\r\n // AppId/Tenant Token provided by MarTech support\r\n // AppId is not used, but it will be mapped to later in the pipeline\r\n // Full keys are JS:WindowsAdminCenter and o:f78e2b7c9ae4461399c360160d82dcfc for\r\n // AppId/Tenant token respectively. In Cosmos, only the initial portion of the tenant token is used.\r\n // private static windowsAdminCenterAppId = 'WindowsAdminCenter';\r\n private static windowsAdminCenterTenantToken = 'f78e2b7c9ae4461399c360160d82dcfc-9371288c-a1b9-4fdc-a196-0340fc5f9880-7071';\r\n\r\n /**\r\n * Map of module versions used in this instance of web telemetry - memoize values here.\r\n */\r\n private static moduleVersions = {};\r\n\r\n /**\r\n * Get the list of module versions for use in telemetry where the event is sent via RPC to shell\r\n * from the actual module the event is called in.\r\n * @returns list of module mappings to versions\r\n */\r\n private static getModuleVersion(moduleName: string): string {\r\n if (this.moduleVersions[moduleName]) {\r\n return this.moduleVersions[moduleName];\r\n }\r\n const environment = MsftSme.self().Environment;\r\n const moduleObject = environment.modules.find((module) => {\r\n return module.name === moduleName;\r\n });\r\n const version = moduleObject ? moduleObject.version : 'N/A';\r\n this.moduleVersions[moduleName] = version;\r\n return version;\r\n }\r\n\r\n /**\r\n * Send any manual events that were triggered prior to telemetry initializing.\r\n */\r\n private static sendBacklogEvents(): void {\r\n this.eventBacklog.forEach(([type, body]: [TelemetryEvents, TelemetryEventBody]) => {\r\n switch (type) {\r\n case TelemetryEvents.Performance: {\r\n const overrideVals = body.overrideValues as IContentUpdateOverrideValues;\r\n this.tracePerformanceData(body.performance, overrideVals ? overrideVals.content : null);\r\n break;\r\n }\r\n case TelemetryEvents.Lighthouse: {\r\n this.traceLighthouseData(body.lighthouse, body.overrideValues as IContentUpdateOverrideValues);\r\n break;\r\n }\r\n case TelemetryEvents.ModuleOpenPerformance: this.traceModuleOpenPerformance(body.performance); break;\r\n case TelemetryEvents.Action: {\r\n const overrideVals = body.overrideValues as IPageActionOverrideValues;\r\n this.traceAction(body.element, overrideVals, body.customProperties);\r\n break;\r\n }\r\n case TelemetryEvents.ContentUpdate: {\r\n const overrideVals = body.overrideValues as IContentUpdateOverrideValues;\r\n this.traceContentUpdate(overrideVals, body.customProperties);\r\n break;\r\n }\r\n case TelemetryEvents.PageView: {\r\n const overrideVals = body.overrideValues as IPageViewOverrideValues;\r\n this.tracePageView(overrideVals, body.customProperties);\r\n break;\r\n }\r\n case TelemetryEvents.Notification: this.traceClientNotification(body.notification); break;\r\n default: return;\r\n }\r\n });\r\n this.eventBacklog = [];\r\n }\r\n\r\n /**\r\n * Helper to combine setting metaTags, initialize handler, and\r\n * send any telemetry events that occurred prior to initialization\r\n */\r\n private static configureAndInitTelemetry(): void {\r\n this.setMetaInDom();\r\n this.initTelemetryHandler().subscribe({\r\n next: () => {\r\n this.sendBacklogEvents();\r\n },\r\n error: (error: Error) => {\r\n Logging.logError(this.logSourceName, '{0}: {1}'.format(error.name, error.message));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Helper function to set metaTags in DOM\r\n */\r\n private static setMetaInDom(): void {\r\n // create an indexed table of current meta data.\r\n const metaList = document.head.getElementsByTagName(\"meta\");\r\n const metaIndex = {};\r\n for (let i = 0; i < metaList.length; i++) {\r\n const metaName = metaList[i].getAttribute(\"name\");\r\n if (metaName && metaName.indexOf('awa-') === 0) {\r\n metaIndex[metaName] = metaList[i];\r\n }\r\n }\r\n\r\n // set or replace meta tags in the DOM\r\n for (const [key, value] of Object.entries(this.metaTags)) {\r\n const metaName = `awa-${key}`;\r\n const oldMeta = metaIndex[metaName];\r\n if (oldMeta) {\r\n document.head.removeChild(oldMeta);\r\n }\r\n\r\n const newMeta = document.createElement('meta');\r\n newMeta.name = metaName;\r\n newMeta.content = value;\r\n document.head.appendChild(newMeta);\r\n }\r\n }\r\n\r\n /**\r\n * Update Meta-tags and/or initialize telemetry, depending on whether rpc message came before or after app-context init.\r\n * @param newMetaTags Primarily contains WAC-Session-Id & extension-version, received from RPC message\r\n */\r\n public static updateFromRpcInit(newMetaTags: { [tag: string]: string }): void {\r\n // All the fields will be updated at the same time here, checking one (wac-session-id is the main one) is enough for the check\r\n const shouldInitHere = SmeMetaLabels.SessionId in this.metaTags\r\n && this.metaTags[SmeMetaLabels.SessionId] === 'N/A';\r\n\r\n this.rpcInitAlready = true;\r\n MsftSme.deepAssign(this.metaTags, newMetaTags);\r\n\r\n // If metaTags contains session ID but it's N/A (ie initial init was called already), call the init. If not,\r\n // just wait for normal init to be called in app-context. Depending on timing RPC update can happen before or after.\r\n if (shouldInitHere) {\r\n this.configureAndInitTelemetry();\r\n }\r\n }\r\n\r\n /**\r\n * Load 1DS if does not already exist.\r\n * @param appContext App context currently being used\r\n */\r\n public static init(appContext: AppContext): Observable<boolean> {\r\n if (this.telemetryHandler) {\r\n return EMPTY;\r\n }\r\n\r\n // Set fields we don't need gateway for, if connection to gateway fails, initialize telemetry with limited fields\r\n this.metaTags[SmeMetaLabels.Language] = MsftSme.self().Resources.localeId;\r\n this.metaTags[SmeMetaLabels.Market] = MsftSme.self().Resources.localeId;\r\n this.metaTags[SmeMetaLabels.IsProduction] = MsftSme.self().Init.isProduction.toString();\r\n this.metaTags[SmeMetaLabels.Environment] = MsftSme.self().Init.isProduction.toString();\r\n this.metaTags[SmeMetaLabels.ExtensionVersion] = MsftSme.self().Environment.version;\r\n this.metaTags[SmeMetaLabels.SessionId] = MsftSme.sessionId();\r\n // Instantiate these initially so they aren't empty values\r\n this.metaTags[SmeMetaLabels.InstallationType] = 'N/A';\r\n this.metaTags[SmeMetaLabels.Build] = 'N/A';\r\n this.metaTags[SmeMetaLabels.GatewayMode] = GatewayMode[MsftSme.self().Init.mode];\r\n this.metaTags[SmeMetaLabels.GatewayOperationalMode] = 'N/A';\r\n this.isProd = MsftSme.self().Init.isProduction;\r\n\r\n const gatewayInventoryCache = new GatewayInventoryCache(appContext);\r\n return gatewayInventoryCache.query({})\r\n .pipe(\r\n retry({\r\n count: 2,\r\n delay: error => error.pipe(\r\n delay(1000),\r\n tap(() => Logging.logDebug(this.logSourceName, 'Attempting to query gateway again...')))\r\n }),\r\n take(1),\r\n tap((status: any) => {\r\n const inventory: GatewayInventory = status.instance;\r\n this.isProd = this.isProd\r\n && inventory.gatewayOperationalMode === GatewayOperationalMode.Production;\r\n\r\n this.metaTags[SmeMetaLabels.InstallationType] = inventory.installationType || GatewayInstallationType.Standard;\r\n this.metaTags[SmeMetaLabels.Build] = inventory.gatewayVersion;\r\n this.metaTags[SmeMetaLabels.GatewayMode] = GatewayMode[inventory.mode];\r\n this.metaTags[SmeMetaLabels.GatewayOperationalMode] = GatewayOperationalMode[inventory.gatewayOperationalMode];\r\n this.metaTags[SmeMetaLabels.IsProduction] = this.isProd.toString();\r\n this.metaTags[SmeMetaLabels.Environment] = this.isProd.toString();\r\n // If not shell, handle in RPC handler, because some fields will init after 1DS inits\r\n // If rpc handler has happened already, go ahead with this\r\n if (MsftSme.isShell() || this.rpcInitAlready) {\r\n this.configureAndInitTelemetry();\r\n }\r\n }),\r\n catchError((error) => {\r\n Logging.logWarning(this.logSourceName, 'Telemetry failed to initialized with error {}'.format(error.message));\r\n return of(false);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Set config and initialize telemetry library handler\r\n */\r\n private static initTelemetryHandler(): Observable<any> {\r\n const observable = new Observable(observer => {\r\n const script: HTMLScriptElement = document.createElement('script');\r\n script.type = 'text/javascript';\r\n script.src = MsftSme.self().Environment.configuration.telemetry.sourceLibraryCdnLink;\r\n script.integrity = MsftSme.self().Environment.configuration.telemetry.sourceLibraryCdnIntegrityHash;\r\n script.crossOrigin = 'anonymous';\r\n script.async = true;\r\n\r\n script.onload = () => {\r\n this.telemetryHandler = new oneDS.ApplicationInsights();\r\n const entryType: string = MsftSme.self().Init.entryPointType;\r\n const entryName: string = MsftSme.self().Init.entryPointName;\r\n\r\n const config = {\r\n instrumentationKey: this.windowsAdminCenterTenantToken,\r\n // post channel configuration\r\n channelConfiguration: {\r\n eventsLimitInMem: 50\r\n },\r\n // Properties Plugin configuration\r\n propertyConfiguration: {\r\n userAgent: 'Windows Admin Center',\r\n sessionAsGuid: true\r\n },\r\n // Web Analytics Plugin configuration\r\n webAnalyticsConfiguration: {\r\n autoCapture: {\r\n scroll: false,\r\n pageView: true,\r\n onLoad: false,\r\n onUnload: true,\r\n click: true,\r\n resize: true,\r\n jsError: true,\r\n lineage: true\r\n },\r\n coreData: {\r\n pageName: this.nameOfModule,\r\n // to prevent personal data from being sent in URI\r\n referrerUri: 'windows.admin.center',\r\n requestUri: 'windows.admin.center',\r\n pageTags: {\r\n entryPointName: entryName || '',\r\n entryPointType: entryType || ''\r\n }\r\n },\r\n useShortNameForContentBlob: false\r\n }\r\n };\r\n this.telemetryHandler.initialize(config, []);\r\n this.telemetryHandler.addTelemetryInitializer((event: any) => {\r\n // If we send an event that originates from a different module (eg notifications in shell)\r\n // change the extension version to match module\r\n if (event.baseData.name !== this.nameOfModule) {\r\n event.baseData.properties.pageTags.metaTags[SmeMetaLabels.ExtensionVersion] =\r\n this.getModuleVersion(event.baseData.name);\r\n }\r\n event.baseData.properties.pageTags.screenResolution = {\r\n availableHeight: window.screen.availHeight,\r\n availableWidth: window.screen.availWidth\r\n };\r\n event.baseData.properties.pageTags.frameDetails = { height: window.innerHeight, width: window.innerWidth };\r\n });\r\n observer.next();\r\n observer.complete();\r\n };\r\n script.onerror = () => {\r\n script.remove();\r\n observer.error(new Error('1DS Script could not be loaded'));\r\n };\r\n document.body.appendChild(script);\r\n }).pipe(shareReplay(1));\r\n return observable;\r\n }\r\n\r\n /**\r\n * Send a Page-Action event through Web Telemetry.\r\n * @param element Element action is being executed on\r\n * @param overrideValues Various values to override within default Web Telemetry page action fields, see Web Telemetry documentation.\r\n * @param properties Extra properties in an index signature. These are placed under the data field in partC data.\r\n */\r\n public static traceAction(element: Element, overrideValues?: IPageActionOverrideValues, properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Action, {\r\n element: element, overrideValues: overrideValues,\r\n customProperties: properties\r\n }]);\r\n }\r\n return;\r\n }\r\n if (!overrideValues.actionType) {\r\n overrideValues.actionType = TelemetryActionTypes.Automatic;\r\n }\r\n this.telemetryHandler.capturePageAction(element, overrideValues, properties);\r\n }\r\n\r\n /**\r\n * Send a Page-View event through Web Telemetry.\r\n * @param overrideValues Various values to override within default Web Telemetry page view fields, see Web Telemetry documentation.\r\n * @param properties Extra properties in an index signature. These are placed under the data field in partC data.\r\n */\r\n public static tracePageView(overrideValues: IPageViewOverrideValues, properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.PageView, { overrideValues: overrideValues }]);\r\n }\r\n return;\r\n }\r\n this.telemetryHandler.capturePageView(overrideValues, properties);\r\n }\r\n\r\n /**\r\n * Send a Content-Update event through Web Telemetry.\r\n * @param overrideValues Various values to override within default Web Telemetry content update fields, see Web Telemetry documentation\r\n * @param properties Extra properties in an index signature. These are placed under the data field in partC data.\r\n */\r\n public static traceContentUpdate(overrideValues: IContentUpdateOverrideValues, properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.ContentUpdate, { overrideValues: overrideValues, customProperties: properties }]);\r\n }\r\n return;\r\n }\r\n if (!overrideValues.actionType) {\r\n overrideValues.actionType = TelemetryActionTypes.Automatic;\r\n }\r\n this.telemetryHandler.captureContentUpdate(overrideValues, properties);\r\n }\r\n\r\n /**\r\n * Add standard fields onto performance data\r\n * @param data SmePerformanceData to be sent\r\n */\r\n private static fillStandardPerformanceData(data: SmePerformanceData): CompleteSmePerformanceData {\r\n const fullDataPayload: CompleteSmePerformanceData = {\r\n extension: MsftSme.self().Environment.name,\r\n entryPointName: MsftSme.self().Init.entryPointName || '',\r\n url: window.location.pathname,\r\n moduleOpened: false,\r\n totalLoadTime: '',\r\n label: data.label,\r\n sme: {},\r\n resources: {},\r\n navigation: {}\r\n };\r\n // Truncate all decimals to 5 places to avoid cosmos stream from redacting any\r\n // Convert PerformanceNavigationTiming to JSON so we can manipulate it via Object.() methods.\r\n fullDataPayload.totalLoadTime = data.totalLoadTime.toFixed(5);\r\n const timingData = {\r\n 'sme': data.sme || {},\r\n 'resources': data.resources || {},\r\n 'navigation': data.navigation ? data.navigation.toJSON() : {}\r\n };\r\n\r\n for (const [sourceKey, sourceVal] of Object.entries(timingData)) {\r\n for (const [resourceKey, resourceVal] of Object.entries(sourceVal)) {\r\n // navigation has some string-string maps, ignore the string values.\r\n // Convert all numbers back into numbers to preserve types in cosmos stream\r\n if (!MsftSme.isEmpty(sourceVal) && typeof resourceVal === 'number') {\r\n fullDataPayload[sourceKey][resourceKey] = parseFloat(resourceVal.toFixed(7));\r\n }\r\n }\r\n }\r\n\r\n // Set this here if need - often the appLoad times happen before Init is populated,\r\n // so check again to make sure if its actually empty.\r\n if (fullDataPayload.navigation) {\r\n fullDataPayload.entryPointName = MsftSme.self().Init.entryPointName || '';\r\n }\r\n return fullDataPayload;\r\n }\r\n\r\n /**\r\n * Send a content update event. This content update contains an updated sme-specific timings structure with relevant\r\n * performance data under the data field. The original timings data is also contained under the navigation field.\r\n * The structure of the event is such:\r\n * data : { ...,\r\n * \"timings\": {\r\n * \"extension\": [extension-name],\r\n * \"entryPointName\": [entryPointName],\r\n * \"url\": [url-endpoint],\r\n * \"moduleOpened\" : [isModuleOpened],\r\n * \"sme\": {\r\n * [sme-mark] : [mark-timestamps],\r\n * ...\r\n * },\r\n * \"resources\": {\r\n * [resource-endpoint] : [resource-load-complete-timestamps],\r\n * ...\r\n * },\r\n * \"navigation\": {\r\n * [performance-navigation-event]: [navigation-event-timestamps]\r\n * }\r\n * }, ...\r\n * }\r\n * Certain fields are set within this class instead of outside modules since they will always be the same.\r\n * @param dataPayload performance data to be sent through telemetry.\r\n * @param contentOverrides any content overriding behavior wanted in the performance event\r\n */\r\n public static tracePerformanceData(dataPayload: SmePerformanceData, contentOverrides?: any): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Performance,\r\n {\r\n performance: dataPayload,\r\n overrideValues: { content: contentOverrides } as IContentUpdateOverrideValues\r\n }]);\r\n }\r\n return;\r\n }\r\n const data = SmeWebTelemetry.fillStandardPerformanceData(dataPayload);\r\n\r\n // A for automatic, performance tracking is done automatically.\r\n const overrideValues: IContentUpdateOverrideValues = {\r\n actionType: TelemetryActionTypes.Automatic,\r\n content: contentOverrides || dataPayload\r\n };\r\n\r\n const customProps = { timings: data, type: TelemetryEventTypes.Performance };\r\n this.telemetryHandler.captureContentUpdate(overrideValues, customProps);\r\n }\r\n\r\n /**\r\n * Send a content update event - this event will contain timings for lighthouse calculation in the backend\r\n * This can potentially be sent a couple times with overlapping data for one page load event, depending\r\n * on when the TTI is calculated. In this scenario, it will be handled on the backend.\r\n * @param dataPayload Lighthouse data\r\n * @param contentOverrides any content overriding behavior wanted in the performance event\r\n */\r\n public static traceLighthouseData(dataPayload: LighthousePerformanceMetrics, contentOverrides?: any,\r\n properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Lighthouse,\r\n {\r\n lighthouse: dataPayload,\r\n overrideValues: { content: contentOverrides } as IContentUpdateOverrideValues\r\n }]);\r\n }\r\n return;\r\n }\r\n const overrideValues: IContentUpdateOverrideValues = {\r\n actionType: TelemetryActionTypes.Automatic,\r\n content: contentOverrides || dataPayload\r\n };\r\n\r\n const customProps = { timings: dataPayload, type: TelemetryEventTypes.Lighthouse };\r\n MsftSme.deepAssign(customProps, properties);\r\n this.telemetryHandler.captureContentUpdate(overrideValues, customProps);\r\n }\r\n\r\n /**\r\n * See tracePerformanceData comments, only difference is moduleOpened is true and the contentOverrides\r\n * @param dataPayload performance data to be sent through telemetry.\r\n */\r\n public static traceModuleOpenPerformance(dataPayload: SmePerformanceData): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.ModuleOpenPerformance, { performance: dataPayload }]);\r\n }\r\n return;\r\n }\r\n const data = SmeWebTelemetry.fillStandardPerformanceData(dataPayload);\r\n data.moduleOpened = true;\r\n\r\n const overrideValues: IPageViewPerformanceOverrideValues = {\r\n customTiming: JSON.stringify(data)\r\n };\r\n const customProps = { timings: data, type: TelemetryEventTypes.Performance };\r\n\r\n this.telemetryHandler.capturePageViewPerformance(overrideValues, customProps);\r\n }\r\n\r\n /**\r\n * Helper to create event boilerplate for notification\r\n * @param clientNotification Client notification to send event for\r\n */\r\n public static traceClientNotification(clientNotification: RpcNotification): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Notification, { notification: clientNotification }]);\r\n }\r\n return;\r\n }\r\n const overrideValues: IContentUpdateOverrideValues = {\r\n content: {\r\n message: clientNotification.message,\r\n title: clientNotification.title,\r\n state: NotificationState[clientNotification.state],\r\n contentType: TelemetryEventTypes.Notification\r\n },\r\n // If source is not shell, replace pagename with proper source.\r\n pageName: clientNotification.sourceName ? clientNotification.sourceName : this.nameOfModule\r\n };\r\n this.traceContentUpdate(overrideValues, { type: TelemetryEventTypes.Notification });\r\n }\r\n\r\n /**\r\n * Helper function to assign a command to an id in a multi-step workitem process\r\n * @param id The ID of the powershell session to assign\r\n * @param command The command to assign to the session ID\r\n */\r\n public static addPowershellId(id: string, command: PowerShellCommand) {\r\n this.powershellIdMap[id] = command;\r\n }\r\n\r\n /**\r\n * Helper function to assign a command to an id in a multi-step workitem process\r\n * @param id The ID of the powershell session to assign\r\n * @param command The command to assign to the session ID\r\n */\r\n public static removePowershellId(id: string) {\r\n delete this.powershellIdMap[id];\r\n }\r\n\r\n /**\r\n * Helper to create event boilerplate for powershell event. In the case where command is not available,\r\n * use an ID (usually ps session ID, which may correlate with work item id)\r\n * @param command Powershell Command\r\n * @param state State of powershell event (start/end/etc)\r\n * @param details Optional details object - see interface for more detail.\r\n */\r\n public static tracePowershellEvent(command: PowerShellCommand, state: TelemetryEventStates, details?: PowershellDetails): void {\r\n const id = details ? details.id : null;\r\n const response = details ? details.response : null;\r\n const psCommand = command ? command : this.powershellIdMap[id];\r\n\r\n // Ignore any events that are either null or un-named PS commands.\r\n if ((psCommand && !psCommand.command) || !psCommand) {\r\n return;\r\n }\r\n\r\n // If state is not started and id is provided, remove the ID from the map to save space.\r\n if (state !== TelemetryEventStates.Started && id) {\r\n this.removePowershellId(id);\r\n }\r\n\r\n const psContent = {\r\n psCommand: psCommand.command, state: state, psModule: psCommand.module,\r\n otherData: details && details.otherData ? details.otherData : {}\r\n };\r\n const sourceName = this.nameOfModule;\r\n if (response && response.error) {\r\n psContent['errorCodes'] = [response.error.code];\r\n } else if (response && response.errors) {\r\n psContent['errorCodes'] = response.errors.map((e) => e.errorType);\r\n psContent.otherData['hResult'] = response.errors.map((e) => e.detailRecord && e.detailRecord.hResult);\r\n }\r\n SmeWebTelemetry.traceAction(null, { content: psContent, pageName: sourceName },\r\n { type: TelemetryEventTypes.Powershell });\r\n }\r\n\r\n /**\r\n * Helper to create event boilerplate for powershell batch event. Batch doesn't deal with work items, so\r\n * we can ignore the ID and sourceName handling that the above function handles.\r\n * @param commands Powershell Commands List in properties stringified form. PS Batch events places PS command into a\r\n * '{properties: PSCommand }' string structure.\r\n * @param state State of powershell event (start/end/etc)\r\n * @param details Optional details object contains various optional fields in powershell event.\r\n * @returns\r\n */\r\n public static tracePowershellBatchEvent(commands: string[], state: TelemetryEventStates, details?: PowershellDetails) {\r\n // check that at least one command is valid\r\n if (!commands || commands.length === 0) {\r\n return;\r\n }\r\n\r\n let parsedCommands: string[] = [];\r\n parsedCommands = commands.reduce((commandList, currentCommand) => {\r\n if (currentCommand) {\r\n const parsedCommand = JSON.parse(currentCommand).properties.command;\r\n if (parsedCommand) {\r\n commandList.push(parsedCommand);\r\n }\r\n return commandList;\r\n }\r\n }, parsedCommands);\r\n\r\n const response = details ? details.response : null;\r\n\r\n const psContent = { psCommands: parsedCommands, state: state, otherData: details && details.otherData ? details.otherData : {} };\r\n\r\n if (response && response.error) {\r\n psContent['errorCodes'] = [response.error.code];\r\n } else if (response && response.errors) {\r\n psContent['errorCodes'] = response.errors.map((e) => e.errorType);\r\n psContent.otherData['hResult'] = response.errors.map((e) => e.detailRecord && e.detailRecord.hResult);\r\n }\r\n SmeWebTelemetry.traceAction(null, { content: psContent },\r\n { type: TelemetryEventTypes.Powershell });\r\n }\r\n\r\n /**\r\n * Helper to redactGenericModel function\r\n * Determines whether field should be redacted according to fields provided for redacting and exceptions\r\n * @param key The field in question\r\n * @param keywordsToRedact List of string inclusions to redact - if the field contains any part of this, it will be redacted\r\n * @param exceptions Set of exceptions to the above - if the field matches an exception, it will not be redacted\r\n * @returns True if field should be redacted, false otherwise\r\n */\r\n private static fieldShouldBeRedacted(key: string, keywordsToRedact: string[], exceptions: Set<string>): boolean {\r\n if (exceptions.has(key)) {\r\n return false;\r\n }\r\n\r\n for (const field of keywordsToRedact) {\r\n if (key.toLowerCase().includes(field.toLowerCase())) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Telemetry utility function to redact a model object. This function will traverse the model in BFS fashion and redact any fields\r\n * that contain any string in the keywordsToRedact array, unless the field is an exception (in the exceptions array).\r\n * This function will not affect keys in StringMaps or Maps - if names exist there, they should be handled separately.\r\n *\r\n * @param model Model to redact\r\n * @param keywordsToRedact List of string inclusions to redact\r\n * @param fieldExceptions List of exceptions to the above\r\n * @returns Redacted model\r\n */\r\n public static redactGenericModel(model: any, keywordsToRedact: string[], fieldExceptions: string[]): any {\r\n const redacted_model: any = JSON.parse(JSON.stringify(model));\r\n const remainingObjects = [redacted_model];\r\n const exceptionSet = new Set(fieldExceptions);\r\n\r\n while (remainingObjects.length > 0) {\r\n const currentTree = remainingObjects[0];\r\n\r\n Object.keys(currentTree).forEach(key => {\r\n if (MsftSme.isPlainObject(currentTree[key])) {\r\n remainingObjects.push(currentTree[key]);\r\n } else if (Array.isArray(currentTree[key]) && currentTree[key].some((field: any) => MsftSme.isPlainObject(field))) {\r\n // If array intermixes objects and non-objects, we will push the objects into the queue and ignore the non-objects.\r\n // The non-objects will avoid redaction, but this should never be a concern in practice.\r\n remainingObjects.push(currentTree[key].filter((field: any) => MsftSme.isPlainObject(field)));\r\n } else if (this.fieldShouldBeRedacted(key, keywordsToRedact, exceptionSet)) {\r\n if (Array.isArray(currentTree[key])) {\r\n for (let i = 0; i < currentTree[key].length; ++i) {\r\n currentTree[key][i] = '***';\r\n }\r\n } else {\r\n currentTree[key] = '***';\r\n }\r\n }\r\n });\r\n remainingObjects.shift();\r\n }\r\n return redacted_model;\r\n }\r\n}\r\n"]}