@microsoft/teamsfx-core 2.0.9-rc-hotfix.2 → 2.0.10-alpha.288b4cdfa.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 (705) hide show
  1. package/build/client/teamsDevPortalClient.d.ts +127 -0
  2. package/build/client/teamsDevPortalClient.d.ts.map +1 -0
  3. package/build/client/teamsDevPortalClient.js +934 -0
  4. package/build/client/teamsDevPortalClient.js.map +1 -0
  5. package/build/common/azureUtils.d.ts +3 -0
  6. package/build/common/azureUtils.d.ts.map +1 -0
  7. package/build/common/azureUtils.js +50 -0
  8. package/build/common/azureUtils.js.map +1 -0
  9. package/build/common/constants.d.ts +11 -1
  10. package/build/common/constants.d.ts.map +1 -1
  11. package/build/common/constants.js +44 -3
  12. package/build/common/constants.js.map +1 -1
  13. package/build/common/featureFlags.d.ts +4 -5
  14. package/build/common/featureFlags.d.ts.map +1 -1
  15. package/build/common/featureFlags.js +2 -10
  16. package/build/common/featureFlags.js.map +1 -1
  17. package/build/common/globalState.js +3 -3
  18. package/build/{core → common}/globalVars.d.ts +2 -1
  19. package/build/common/globalVars.d.ts.map +1 -0
  20. package/build/{core → common}/globalVars.js +11 -1
  21. package/build/common/globalVars.js.map +1 -0
  22. package/build/common/localizeUtils.js +1 -1
  23. package/build/common/localizeUtils.js.map +1 -1
  24. package/build/common/projectSettingsHelper.d.ts +5 -0
  25. package/build/common/projectSettingsHelper.d.ts.map +1 -1
  26. package/build/common/projectSettingsHelper.js +31 -1
  27. package/build/common/projectSettingsHelper.js.map +1 -1
  28. package/build/common/requestUtils.d.ts +4 -0
  29. package/build/common/requestUtils.d.ts.map +1 -0
  30. package/build/common/requestUtils.js +52 -0
  31. package/build/common/requestUtils.js.map +1 -0
  32. package/build/common/samples.d.ts +6 -1
  33. package/build/common/samples.d.ts.map +1 -1
  34. package/build/common/samples.js +4 -4
  35. package/build/common/samples.js.map +1 -1
  36. package/build/common/stringUtils.d.ts +8 -0
  37. package/build/common/stringUtils.d.ts.map +1 -1
  38. package/build/common/stringUtils.js +63 -1
  39. package/build/common/stringUtils.js.map +1 -1
  40. package/build/common/telemetry.d.ts +30 -11
  41. package/build/common/telemetry.d.ts.map +1 -1
  42. package/build/common/telemetry.js +79 -74
  43. package/build/common/telemetry.js.map +1 -1
  44. package/build/common/templates-config.json +2 -2
  45. package/build/common/tools.d.ts +1 -31
  46. package/build/common/tools.d.ts.map +1 -1
  47. package/build/common/tools.js +6 -245
  48. package/build/common/tools.js.map +1 -1
  49. package/build/common/utils.d.ts +1 -3
  50. package/build/common/utils.d.ts.map +1 -1
  51. package/build/common/utils.js +5 -14
  52. package/build/common/utils.js.map +1 -1
  53. package/build/common/wrappedAxiosClient.js +5 -5
  54. package/build/common/wrappedAxiosClient.js.map +1 -1
  55. package/build/component/configManager/lifecycle.js +1 -1
  56. package/build/component/configManager/lifecycle.js.map +1 -1
  57. package/build/component/configManager/parser.js +1 -1
  58. package/build/component/configManager/parser.js.map +1 -1
  59. package/build/component/configManager/validator.js +1 -1
  60. package/build/component/configManager/validator.js.map +1 -1
  61. package/build/component/constants.d.ts +3 -223
  62. package/build/component/constants.d.ts.map +1 -1
  63. package/build/component/constants.js +4 -247
  64. package/build/component/constants.js.map +1 -1
  65. package/build/component/coordinator/index.d.ts.map +1 -1
  66. package/build/component/coordinator/index.js +74 -72
  67. package/build/component/coordinator/index.js.map +1 -1
  68. package/build/component/deps-checker/checkerFactory.d.ts.map +1 -0
  69. package/build/component/deps-checker/checkerFactory.js.map +1 -0
  70. package/build/{common → component}/deps-checker/constant/helpLink.d.ts +0 -3
  71. package/build/component/deps-checker/constant/helpLink.d.ts.map +1 -0
  72. package/build/{common → component}/deps-checker/constant/helpLink.js +1 -6
  73. package/build/component/deps-checker/constant/helpLink.js.map +1 -0
  74. package/build/component/deps-checker/constant/index.d.ts.map +1 -0
  75. package/build/component/deps-checker/constant/index.js.map +1 -0
  76. package/build/component/deps-checker/constant/message.d.ts.map +1 -0
  77. package/build/{common → component}/deps-checker/constant/message.js +1 -1
  78. package/build/component/deps-checker/constant/message.js.map +1 -0
  79. package/build/component/deps-checker/constant/telemetry.d.ts.map +1 -0
  80. package/build/component/deps-checker/constant/telemetry.js.map +1 -0
  81. package/build/component/deps-checker/coreDepsLoggerAdapter.d.ts.map +1 -0
  82. package/build/component/deps-checker/coreDepsLoggerAdapter.js.map +1 -0
  83. package/build/component/deps-checker/coreDepsTelemetryAdapter.d.ts.map +1 -0
  84. package/build/{common → component}/deps-checker/coreDepsTelemetryAdapter.js +4 -4
  85. package/build/component/deps-checker/coreDepsTelemetryAdapter.js.map +1 -0
  86. package/build/component/deps-checker/depsChecker.d.ts.map +1 -0
  87. package/build/component/deps-checker/depsChecker.js.map +1 -0
  88. package/build/component/deps-checker/depsError.d.ts.map +1 -0
  89. package/build/component/deps-checker/depsError.js.map +1 -0
  90. package/build/component/deps-checker/depsLogger.d.ts.map +1 -0
  91. package/build/component/deps-checker/depsLogger.js.map +1 -0
  92. package/build/component/deps-checker/depsManager.d.ts.map +1 -0
  93. package/build/component/deps-checker/depsManager.js.map +1 -0
  94. package/build/component/deps-checker/depsTelemetry.d.ts.map +1 -0
  95. package/build/component/deps-checker/depsTelemetry.js.map +1 -0
  96. package/build/component/deps-checker/index.d.ts.map +1 -0
  97. package/build/component/deps-checker/index.js.map +1 -0
  98. package/build/component/deps-checker/internal/dotnetChecker.d.ts.map +1 -0
  99. package/build/{common → component}/deps-checker/internal/dotnetChecker.js +1 -1
  100. package/build/component/deps-checker/internal/dotnetChecker.js.map +1 -0
  101. package/build/component/deps-checker/internal/funcToolChecker.d.ts.map +1 -0
  102. package/build/{common → component}/deps-checker/internal/funcToolChecker.js +4 -4
  103. package/build/component/deps-checker/internal/funcToolChecker.js.map +1 -0
  104. package/build/component/deps-checker/internal/nodeChecker.d.ts.map +1 -0
  105. package/build/component/deps-checker/internal/nodeChecker.js.map +1 -0
  106. package/build/component/deps-checker/internal/testToolChecker.d.ts.map +1 -0
  107. package/build/{common → component}/deps-checker/internal/testToolChecker.js +1 -1
  108. package/build/component/deps-checker/internal/testToolChecker.js.map +1 -0
  109. package/build/component/deps-checker/internal/vxTestAppChecker.d.ts.map +1 -0
  110. package/build/{common → component}/deps-checker/internal/vxTestAppChecker.js +9 -3
  111. package/build/component/deps-checker/internal/vxTestAppChecker.js.map +1 -0
  112. package/build/component/deps-checker/util/cpUtils.d.ts.map +1 -0
  113. package/build/component/deps-checker/util/cpUtils.js.map +1 -0
  114. package/build/component/deps-checker/util/downloadHelper.d.ts.map +1 -0
  115. package/build/component/deps-checker/util/downloadHelper.js.map +1 -0
  116. package/build/component/deps-checker/util/fileHelper.d.ts.map +1 -0
  117. package/build/component/deps-checker/util/fileHelper.js.map +1 -0
  118. package/build/component/deps-checker/util/index.d.ts.map +1 -0
  119. package/build/component/deps-checker/util/index.js.map +1 -0
  120. package/build/component/deps-checker/util/progressIndicator.d.ts.map +1 -0
  121. package/build/component/deps-checker/util/progressIndicator.js.map +1 -0
  122. package/build/component/deps-checker/util/system.d.ts.map +1 -0
  123. package/build/component/deps-checker/util/system.js.map +1 -0
  124. package/build/component/developerPortalScaffoldUtils.d.ts +1 -5
  125. package/build/component/developerPortalScaffoldUtils.d.ts.map +1 -1
  126. package/build/component/developerPortalScaffoldUtils.js +71 -87
  127. package/build/component/developerPortalScaffoldUtils.js.map +1 -1
  128. package/build/component/driver/aad/create.d.ts.map +1 -1
  129. package/build/component/driver/aad/create.js +17 -18
  130. package/build/component/driver/aad/create.js.map +1 -1
  131. package/build/component/driver/aad/utility/aadAppClient.d.ts.map +1 -1
  132. package/build/component/driver/aad/utility/aadAppClient.js +10 -10
  133. package/build/component/driver/aad/utility/aadAppClient.js.map +1 -1
  134. package/build/component/driver/aad/utility/buildAadManifest.d.ts +1 -1
  135. package/build/component/driver/aad/utility/buildAadManifest.d.ts.map +1 -1
  136. package/build/component/driver/aad/utility/buildAadManifest.js +11 -11
  137. package/build/component/driver/aad/utility/buildAadManifest.js.map +1 -1
  138. package/build/component/driver/add/addWebPart.d.ts +2 -2
  139. package/build/component/driver/add/addWebPart.d.ts.map +1 -1
  140. package/build/component/driver/add/addWebPart.js +29 -29
  141. package/build/component/driver/add/addWebPart.js.map +1 -1
  142. package/build/component/driver/apiKey/create.d.ts.map +1 -1
  143. package/build/component/driver/apiKey/create.js +16 -16
  144. package/build/component/driver/apiKey/create.js.map +1 -1
  145. package/build/component/driver/apiKey/update.d.ts +1 -1
  146. package/build/component/driver/apiKey/update.d.ts.map +1 -1
  147. package/build/component/driver/apiKey/update.js +15 -15
  148. package/build/component/driver/apiKey/update.js.map +1 -1
  149. package/build/component/driver/arm/deployImpl.js +1 -1
  150. package/build/component/driver/arm/deployImpl.js.map +1 -1
  151. package/build/component/driver/arm/util/bicepChecker.d.ts.map +1 -1
  152. package/build/component/driver/arm/util/bicepChecker.js +25 -5
  153. package/build/component/driver/arm/util/bicepChecker.js.map +1 -1
  154. package/build/component/driver/arm/util/handleError.js +2 -2
  155. package/build/component/driver/arm/util/handleError.js.map +1 -1
  156. package/build/component/driver/deploy/azure/azureStorageDeployDriver.js +1 -1
  157. package/build/component/driver/deploy/azure/azureStorageDeployDriver.js.map +1 -1
  158. package/build/component/driver/deploy/azure/azureStorageStaticWebsiteConfigDriver.js +1 -1
  159. package/build/component/driver/deploy/azure/azureStorageStaticWebsiteConfigDriver.js.map +1 -1
  160. package/build/component/driver/deploy/azure/impl/AzureZipDeployImpl.js +1 -1
  161. package/build/component/driver/deploy/azure/impl/AzureZipDeployImpl.js.map +1 -1
  162. package/build/component/driver/deploy/azure/impl/azureDeployImpl.d.ts +4 -4
  163. package/build/component/driver/deploy/azure/impl/azureDeployImpl.d.ts.map +1 -1
  164. package/build/component/driver/deploy/azure/impl/azureDeployImpl.js +13 -13
  165. package/build/component/driver/deploy/azure/impl/azureDeployImpl.js.map +1 -1
  166. package/build/component/driver/deploy/spfx/deployDriver.d.ts +1 -1
  167. package/build/component/driver/deploy/spfx/deployDriver.d.ts.map +1 -1
  168. package/build/component/driver/deploy/spfx/deployDriver.js +19 -18
  169. package/build/component/driver/deploy/spfx/deployDriver.js.map +1 -1
  170. package/build/component/driver/devTool/error/dotnetInstallationUserError.js +1 -1
  171. package/build/component/driver/devTool/error/dotnetInstallationUserError.js.map +1 -1
  172. package/build/component/driver/devTool/error/funcInstallationUserError.js +1 -1
  173. package/build/component/driver/devTool/error/funcInstallationUserError.js.map +1 -1
  174. package/build/component/driver/devTool/error/testToolInstallationUserError.js +1 -1
  175. package/build/component/driver/devTool/error/testToolInstallationUserError.js.map +1 -1
  176. package/build/component/driver/devTool/installDriver.d.ts +1 -1
  177. package/build/component/driver/devTool/installDriver.d.ts.map +1 -1
  178. package/build/component/driver/devTool/installDriver.js +6 -6
  179. package/build/component/driver/devTool/installDriver.js.map +1 -1
  180. package/build/component/driver/m365/acquire.js +4 -4
  181. package/build/component/driver/m365/acquire.js.map +1 -1
  182. package/build/component/driver/middleware/addSWADeployTelemetry.js +5 -5
  183. package/build/component/driver/middleware/addSWADeployTelemetry.js.map +1 -1
  184. package/build/component/driver/middleware/addStartAndEndTelemetry.d.ts.map +1 -1
  185. package/build/component/driver/middleware/addStartAndEndTelemetry.js +3 -3
  186. package/build/component/driver/middleware/addStartAndEndTelemetry.js.map +1 -1
  187. package/build/component/driver/oauth/create.d.ts +1 -1
  188. package/build/component/driver/oauth/create.d.ts.map +1 -1
  189. package/build/component/driver/oauth/create.js +23 -24
  190. package/build/component/driver/oauth/create.js.map +1 -1
  191. package/build/component/driver/oauth/update.d.ts +1 -1
  192. package/build/component/driver/oauth/update.d.ts.map +1 -1
  193. package/build/component/driver/oauth/update.js +15 -15
  194. package/build/component/driver/oauth/update.js.map +1 -1
  195. package/build/component/driver/oauth/utility/utility.js +2 -2
  196. package/build/component/driver/oauth/utility/utility.js.map +1 -1
  197. package/build/component/driver/script/scriptDriver.js +1 -1
  198. package/build/component/driver/script/scriptDriver.js.map +1 -1
  199. package/build/component/driver/teamsApp/appStudio.d.ts +1 -1
  200. package/build/component/driver/teamsApp/appStudio.d.ts.map +1 -1
  201. package/build/component/driver/teamsApp/appStudio.js +25 -25
  202. package/build/component/driver/teamsApp/appStudio.js.map +1 -1
  203. package/build/component/driver/teamsApp/clients/appStudioClient.d.ts +7 -4
  204. package/build/component/driver/teamsApp/clients/appStudioClient.d.ts.map +1 -1
  205. package/build/component/driver/teamsApp/clients/appStudioClient.js +60 -60
  206. package/build/component/driver/teamsApp/clients/appStudioClient.js.map +1 -1
  207. package/build/component/driver/teamsApp/configure.d.ts +1 -1
  208. package/build/component/driver/teamsApp/configure.d.ts.map +1 -1
  209. package/build/component/driver/teamsApp/configure.js +16 -16
  210. package/build/component/driver/teamsApp/configure.js.map +1 -1
  211. package/build/component/driver/teamsApp/constants.d.ts +0 -2
  212. package/build/component/driver/teamsApp/constants.d.ts.map +1 -1
  213. package/build/component/driver/teamsApp/constants.js +14 -24
  214. package/build/component/driver/teamsApp/constants.js.map +1 -1
  215. package/build/component/driver/teamsApp/create.d.ts +2 -2
  216. package/build/component/driver/teamsApp/create.d.ts.map +1 -1
  217. package/build/component/driver/teamsApp/create.js +19 -19
  218. package/build/component/driver/teamsApp/create.js.map +1 -1
  219. package/build/component/driver/teamsApp/createAppPackage.js +1 -1
  220. package/build/component/driver/teamsApp/createAppPackage.js.map +1 -1
  221. package/build/component/driver/teamsApp/publishAppPackage.d.ts +1 -1
  222. package/build/component/driver/teamsApp/publishAppPackage.d.ts.map +1 -1
  223. package/build/component/driver/teamsApp/publishAppPackage.js +21 -21
  224. package/build/component/driver/teamsApp/publishAppPackage.js.map +1 -1
  225. package/build/component/driver/teamsApp/teamsappMgr.js +8 -8
  226. package/build/component/driver/teamsApp/teamsappMgr.js.map +1 -1
  227. package/build/component/driver/teamsApp/utils/CopilotGptManifestUtils.d.ts.map +1 -1
  228. package/build/component/driver/teamsApp/utils/CopilotGptManifestUtils.js +29 -22
  229. package/build/component/driver/teamsApp/utils/CopilotGptManifestUtils.js.map +1 -1
  230. package/build/component/driver/teamsApp/utils/ManifestUtils.d.ts.map +1 -1
  231. package/build/component/driver/teamsApp/utils/ManifestUtils.js +34 -34
  232. package/build/component/driver/teamsApp/utils/ManifestUtils.js.map +1 -1
  233. package/build/component/driver/teamsApp/utils/telemetry.d.ts +0 -9
  234. package/build/component/driver/teamsApp/utils/telemetry.d.ts.map +1 -1
  235. package/build/component/driver/teamsApp/utils/telemetry.js +0 -9
  236. package/build/component/driver/teamsApp/utils/telemetry.js.map +1 -1
  237. package/build/component/driver/teamsApp/utils/utils.d.ts +1 -1
  238. package/build/component/driver/teamsApp/utils/utils.d.ts.map +1 -1
  239. package/build/component/driver/teamsApp/utils/utils.js +1 -1
  240. package/build/component/driver/teamsApp/utils/utils.js.map +1 -1
  241. package/build/component/driver/teamsApp/validateAppPackage.d.ts +2 -5
  242. package/build/component/driver/teamsApp/validateAppPackage.d.ts.map +1 -1
  243. package/build/component/driver/teamsApp/validateAppPackage.js +18 -18
  244. package/build/component/driver/teamsApp/validateAppPackage.js.map +1 -1
  245. package/build/component/driver/teamsApp/validateTestCases.d.ts +3 -3
  246. package/build/component/driver/teamsApp/validateTestCases.d.ts.map +1 -1
  247. package/build/component/driver/teamsApp/validateTestCases.js +20 -19
  248. package/build/component/driver/teamsApp/validateTestCases.js.map +1 -1
  249. package/build/component/driver/util/utils.d.ts +3 -0
  250. package/build/component/driver/util/utils.d.ts.map +1 -1
  251. package/build/component/driver/util/utils.js +16 -1
  252. package/build/component/driver/util/utils.js.map +1 -1
  253. package/build/component/driver/util/wrapUtil.d.ts.map +1 -1
  254. package/build/component/driver/util/wrapUtil.js +8 -5
  255. package/build/component/driver/util/wrapUtil.js.map +1 -1
  256. package/build/component/feature/collaboration.d.ts.map +1 -1
  257. package/build/component/feature/collaboration.js +25 -24
  258. package/build/component/feature/collaboration.js.map +1 -1
  259. package/build/component/feature/sso.js +4 -3
  260. package/build/component/feature/sso.js.map +1 -1
  261. package/build/component/generator/copilotPlugin/generator.d.ts +10 -2
  262. package/build/component/generator/copilotPlugin/generator.d.ts.map +1 -1
  263. package/build/component/generator/copilotPlugin/generator.js +222 -98
  264. package/build/component/generator/copilotPlugin/generator.js.map +1 -1
  265. package/build/component/generator/copilotPlugin/helper.d.ts +5 -14
  266. package/build/component/generator/copilotPlugin/helper.d.ts.map +1 -1
  267. package/build/component/generator/copilotPlugin/helper.js +60 -110
  268. package/build/component/generator/copilotPlugin/helper.js.map +1 -1
  269. package/build/component/generator/generator.d.ts.map +1 -1
  270. package/build/component/generator/generator.js +7 -7
  271. package/build/component/generator/generator.js.map +1 -1
  272. package/build/component/generator/generatorAction.d.ts +1 -1
  273. package/build/component/generator/generatorAction.d.ts.map +1 -1
  274. package/build/component/generator/generatorAction.js +8 -16
  275. package/build/component/generator/generatorAction.js.map +1 -1
  276. package/build/component/generator/generatorProvider.d.ts.map +1 -1
  277. package/build/component/generator/generatorProvider.js +6 -2
  278. package/build/component/generator/generatorProvider.js.map +1 -1
  279. package/build/component/generator/officeAddin/generator.d.ts +2 -2
  280. package/build/component/generator/officeAddin/generator.d.ts.map +1 -1
  281. package/build/component/generator/officeAddin/generator.js +37 -36
  282. package/build/component/generator/officeAddin/generator.js.map +1 -1
  283. package/build/component/generator/officeAddin/helperMethods.d.ts +5 -0
  284. package/build/component/generator/officeAddin/helperMethods.d.ts.map +1 -1
  285. package/build/component/generator/officeAddin/helperMethods.js +37 -0
  286. package/build/component/generator/officeAddin/helperMethods.js.map +1 -1
  287. package/build/component/generator/officeXMLAddin/generator.d.ts +9 -1
  288. package/build/component/generator/officeXMLAddin/generator.d.ts.map +1 -1
  289. package/build/component/generator/officeXMLAddin/generator.js +74 -11
  290. package/build/component/generator/officeXMLAddin/generator.js.map +1 -1
  291. package/build/component/generator/officeXMLAddin/projectConfig.d.ts +2 -4
  292. package/build/component/generator/officeXMLAddin/projectConfig.d.ts.map +1 -1
  293. package/build/component/generator/officeXMLAddin/projectConfig.js +1 -11
  294. package/build/component/generator/officeXMLAddin/projectConfig.js.map +1 -1
  295. package/build/component/generator/spfx/depsChecker/generatorChecker.d.ts.map +1 -1
  296. package/build/component/generator/spfx/depsChecker/generatorChecker.js +8 -7
  297. package/build/component/generator/spfx/depsChecker/generatorChecker.js.map +1 -1
  298. package/build/component/generator/spfx/depsChecker/yoChecker.d.ts.map +1 -1
  299. package/build/component/generator/spfx/depsChecker/yoChecker.js +3 -2
  300. package/build/component/generator/spfx/depsChecker/yoChecker.js.map +1 -1
  301. package/build/component/generator/spfx/error.d.ts +0 -1
  302. package/build/component/generator/spfx/error.d.ts.map +1 -1
  303. package/build/component/generator/spfx/error.js +1 -5
  304. package/build/component/generator/spfx/error.js.map +1 -1
  305. package/build/component/generator/spfx/spfxGenerator.d.ts +2 -2
  306. package/build/component/generator/spfx/spfxGenerator.d.ts.map +1 -1
  307. package/build/component/generator/spfx/spfxGenerator.js +27 -29
  308. package/build/component/generator/spfx/spfxGenerator.js.map +1 -1
  309. package/build/component/generator/spfx/utils/constants.d.ts +0 -13
  310. package/build/component/generator/spfx/utils/constants.d.ts.map +1 -1
  311. package/build/component/generator/spfx/utils/constants.js +1 -16
  312. package/build/component/generator/spfx/utils/constants.js.map +1 -1
  313. package/build/component/generator/spfx/utils/telemetry-helper.d.ts.map +1 -1
  314. package/build/component/generator/spfx/utils/telemetry-helper.js +11 -9
  315. package/build/component/generator/spfx/utils/telemetry-helper.js.map +1 -1
  316. package/build/component/generator/spfx/utils/utils.d.ts +1 -1
  317. package/build/component/generator/spfx/utils/utils.d.ts.map +1 -1
  318. package/build/component/generator/spfx/utils/utils.js +1 -1
  319. package/build/component/generator/spfx/utils/utils.js.map +1 -1
  320. package/build/component/generator/templates/ssrTabGenerator.d.ts.map +1 -1
  321. package/build/component/generator/templates/ssrTabGenerator.js +5 -5
  322. package/build/component/generator/templates/ssrTabGenerator.js.map +1 -1
  323. package/build/component/generator/templates/templateGenerator.d.ts +3 -3
  324. package/build/component/generator/templates/templateGenerator.d.ts.map +1 -1
  325. package/build/component/generator/templates/templateGenerator.js +4 -6
  326. package/build/component/generator/templates/templateGenerator.js.map +1 -1
  327. package/build/component/generator/templates/templateNames.d.ts +2 -0
  328. package/build/component/generator/templates/templateNames.d.ts.map +1 -1
  329. package/build/component/generator/templates/templateNames.js +112 -109
  330. package/build/component/generator/templates/templateNames.js.map +1 -1
  331. package/build/component/generator/templates/templateReplaceMap.js +9 -9
  332. package/build/component/generator/templates/templateReplaceMap.js.map +1 -1
  333. package/build/component/generator/utils.d.ts +4 -12
  334. package/build/component/generator/utils.d.ts.map +1 -1
  335. package/build/component/generator/utils.js +48 -79
  336. package/build/component/generator/utils.js.map +1 -1
  337. package/build/{common → component}/local/constants.d.ts +1 -0
  338. package/build/component/local/constants.d.ts.map +1 -0
  339. package/build/{common → component}/local/constants.js +1 -0
  340. package/build/component/local/constants.js.map +1 -0
  341. package/build/component/local/index.d.ts.map +1 -0
  342. package/build/component/local/index.js.map +1 -0
  343. package/build/component/local/localCertificateManager.d.ts.map +1 -0
  344. package/build/{common → component}/local/localCertificateManager.js +2 -2
  345. package/build/component/local/localCertificateManager.js.map +1 -0
  346. package/build/component/local/localEnvManager.d.ts.map +1 -0
  347. package/build/component/local/localEnvManager.js.map +1 -0
  348. package/build/component/local/localTelemetryReporter.d.ts.map +1 -0
  349. package/build/{common → component}/local/localTelemetryReporter.js +1 -1
  350. package/build/component/local/localTelemetryReporter.js.map +1 -0
  351. package/build/component/local/npmLogHelper.d.ts.map +1 -0
  352. package/build/component/local/npmLogHelper.js.map +1 -0
  353. package/build/component/local/packageJsonHelper.d.ts.map +1 -0
  354. package/build/component/local/packageJsonHelper.js.map +1 -0
  355. package/build/component/local/portChecker.d.ts.map +1 -0
  356. package/build/{common → component}/local/portChecker.js +2 -2
  357. package/build/component/local/portChecker.js.map +1 -0
  358. package/build/component/local/process.d.ts.map +1 -0
  359. package/build/component/local/process.js.map +1 -0
  360. package/build/component/local/taskDefinition.d.ts.map +1 -0
  361. package/build/{common → component}/local/taskDefinition.js +3 -3
  362. package/build/component/local/taskDefinition.js.map +1 -0
  363. package/build/component/m365/constants.d.ts.map +1 -0
  364. package/build/component/m365/constants.js.map +1 -0
  365. package/build/component/m365/errors.d.ts.map +1 -0
  366. package/build/{common → component}/m365/errors.js +1 -1
  367. package/build/component/m365/errors.js.map +1 -0
  368. package/build/{common → component}/m365/launchHelper.d.ts +1 -1
  369. package/build/component/m365/launchHelper.d.ts.map +1 -0
  370. package/build/{common → component}/m365/launchHelper.js +13 -13
  371. package/build/component/m365/launchHelper.js.map +1 -0
  372. package/build/component/m365/packageService.d.ts.map +1 -0
  373. package/build/{common → component}/m365/packageService.js +12 -12
  374. package/build/component/m365/packageService.js.map +1 -0
  375. package/build/component/m365/serviceConstant.d.ts +3 -0
  376. package/build/component/m365/serviceConstant.d.ts.map +1 -0
  377. package/build/component/m365/serviceConstant.js +8 -0
  378. package/build/component/m365/serviceConstant.js.map +1 -0
  379. package/build/component/middleware/actionExecutionMW.d.ts +1 -1
  380. package/build/component/middleware/actionExecutionMW.d.ts.map +1 -1
  381. package/build/component/middleware/actionExecutionMW.js +9 -9
  382. package/build/component/middleware/actionExecutionMW.js.map +1 -1
  383. package/build/component/middleware/envMW.js +4 -4
  384. package/build/component/middleware/envMW.js.map +1 -1
  385. package/build/component/middleware/questionMW.js +1 -1
  386. package/build/component/middleware/questionMW.js.map +1 -1
  387. package/build/component/migrate.d.ts +32 -0
  388. package/build/component/migrate.d.ts.map +1 -1
  389. package/build/component/migrate.js +109 -32
  390. package/build/component/migrate.js.map +1 -1
  391. package/build/component/provisionUtils.d.ts.map +1 -1
  392. package/build/component/provisionUtils.js +5 -6
  393. package/build/component/provisionUtils.js.map +1 -1
  394. package/build/component/resource/botService/appStudio/appStudioClient.d.ts.map +1 -1
  395. package/build/component/resource/botService/appStudio/appStudioClient.js +12 -11
  396. package/build/component/resource/botService/appStudio/appStudioClient.js.map +1 -1
  397. package/build/component/resource/botService/botRegistration/botFrameworkRegistration.d.ts +1 -1
  398. package/build/component/resource/botService/botRegistration/botFrameworkRegistration.d.ts.map +1 -1
  399. package/build/component/resource/botService/botRegistration/botFrameworkRegistration.js +9 -6
  400. package/build/component/resource/botService/botRegistration/botFrameworkRegistration.js.map +1 -1
  401. package/build/component/resource/botService/constants.d.ts +0 -13
  402. package/build/component/resource/botService/constants.d.ts.map +1 -1
  403. package/build/component/resource/botService/constants.js +1 -15
  404. package/build/component/resource/botService/constants.js.map +1 -1
  405. package/build/component/telemetry.d.ts.map +1 -1
  406. package/build/component/telemetry.js +6 -7
  407. package/build/component/telemetry.js.map +1 -1
  408. package/build/component/utils/ResourceGroupHelper.d.ts +10 -2
  409. package/build/component/utils/ResourceGroupHelper.d.ts.map +1 -1
  410. package/build/component/utils/ResourceGroupHelper.js +135 -42
  411. package/build/component/utils/ResourceGroupHelper.js.map +1 -1
  412. package/build/component/utils/charsetUtils.d.ts +1 -1
  413. package/build/component/utils/charsetUtils.d.ts.map +1 -1
  414. package/build/component/utils/charsetUtils.js +3 -1
  415. package/build/component/utils/charsetUtils.js.map +1 -1
  416. package/build/component/utils/depsChecker/common.d.ts +1 -3
  417. package/build/component/utils/depsChecker/common.d.ts.map +1 -1
  418. package/build/component/utils/depsChecker/common.js +0 -2
  419. package/build/component/utils/depsChecker/common.js.map +1 -1
  420. package/build/component/utils/envUtil.js +2 -2
  421. package/build/component/utils/envUtil.js.map +1 -1
  422. package/build/component/utils/metadataUtil.js +1 -1
  423. package/build/component/utils/metadataUtil.js.map +1 -1
  424. package/build/component/utils/pathUtils.d.ts.map +1 -1
  425. package/build/component/utils/pathUtils.js +9 -11
  426. package/build/component/utils/pathUtils.js.map +1 -1
  427. package/build/component/utils/settingsUtil.js +1 -1
  428. package/build/component/utils/settingsUtil.js.map +1 -1
  429. package/build/component/utils/teamsFxTelemetryReporter.d.ts.map +1 -1
  430. package/build/component/utils/teamsFxTelemetryReporter.js +6 -9
  431. package/build/component/utils/teamsFxTelemetryReporter.js.map +1 -1
  432. package/build/core/FxCore.d.ts +3 -4
  433. package/build/core/FxCore.d.ts.map +1 -1
  434. package/build/core/FxCore.js +74 -103
  435. package/build/core/FxCore.js.map +1 -1
  436. package/build/core/callback.d.ts +2 -2
  437. package/build/core/callback.d.ts.map +1 -1
  438. package/build/core/callback.js.map +1 -1
  439. package/build/core/collaborator.d.ts.map +1 -1
  440. package/build/core/collaborator.js +9 -11
  441. package/build/core/collaborator.js.map +1 -1
  442. package/build/core/crypto.d.ts.map +1 -1
  443. package/build/core/crypto.js +1 -2
  444. package/build/core/crypto.js.map +1 -1
  445. package/build/core/environmentName.d.ts +0 -1
  446. package/build/core/environmentName.d.ts.map +1 -1
  447. package/build/core/environmentName.js +0 -2
  448. package/build/core/environmentName.js.map +1 -1
  449. package/build/core/middleware/concurrentLocker.d.ts.map +1 -1
  450. package/build/core/middleware/concurrentLocker.js +11 -12
  451. package/build/core/middleware/concurrentLocker.js.map +1 -1
  452. package/build/core/middleware/errorHandler.js +1 -1
  453. package/build/core/middleware/errorHandler.js.map +1 -1
  454. package/build/core/middleware/projectMigratorV3.d.ts +5 -1
  455. package/build/core/middleware/projectMigratorV3.d.ts.map +1 -1
  456. package/build/core/middleware/projectMigratorV3.js +32 -28
  457. package/build/core/middleware/projectMigratorV3.js.map +1 -1
  458. package/build/core/middleware/projectSettingsLoader.js +1 -1
  459. package/build/core/middleware/projectSettingsLoader.js.map +1 -1
  460. package/build/core/middleware/projectVersionChecker.js +5 -5
  461. package/build/core/middleware/projectVersionChecker.js.map +1 -1
  462. package/build/core/middleware/utils/MigrationUtils.js +1 -1
  463. package/build/core/middleware/utils/MigrationUtils.js.map +1 -1
  464. package/build/core/middleware/utils/appYmlGenerator.d.ts +1 -0
  465. package/build/core/middleware/utils/appYmlGenerator.d.ts.map +1 -1
  466. package/build/core/middleware/utils/appYmlGenerator.js +12 -6
  467. package/build/core/middleware/utils/appYmlGenerator.js.map +1 -1
  468. package/build/core/middleware/utils/debug/taskMigrator.js +2 -2
  469. package/build/core/middleware/utils/debug/taskMigrator.js.map +1 -1
  470. package/build/core/middleware/utils/v3MigrationUtils.js +4 -4
  471. package/build/core/middleware/utils/v3MigrationUtils.js.map +1 -1
  472. package/build/core/middleware/videoFilterAppBlocker.d.ts +2 -0
  473. package/build/core/middleware/videoFilterAppBlocker.d.ts.map +1 -1
  474. package/build/core/middleware/videoFilterAppBlocker.js +21 -5
  475. package/build/core/middleware/videoFilterAppBlocker.js.map +1 -1
  476. package/build/core/telemetry.d.ts +0 -5
  477. package/build/core/telemetry.d.ts.map +1 -1
  478. package/build/core/telemetry.js +9 -17
  479. package/build/core/telemetry.js.map +1 -1
  480. package/build/error/common.d.ts +32 -0
  481. package/build/error/common.d.ts.map +1 -1
  482. package/build/error/common.js +101 -2
  483. package/build/error/common.js.map +1 -1
  484. package/build/error/teamsApp.d.ts +3 -0
  485. package/build/error/teamsApp.d.ts.map +1 -1
  486. package/build/error/teamsApp.js +12 -1
  487. package/build/error/teamsApp.js.map +1 -1
  488. package/build/error/yml.js +1 -1
  489. package/build/error/yml.js.map +1 -1
  490. package/build/index.d.ts +56 -36
  491. package/build/index.d.ts.map +1 -1
  492. package/build/index.js +125 -52
  493. package/build/index.js.map +1 -1
  494. package/build/question/constants.d.ts +249 -1
  495. package/build/question/constants.d.ts.map +1 -1
  496. package/build/question/constants.js +1091 -11
  497. package/build/question/constants.js.map +1 -1
  498. package/build/question/create.d.ts +10 -150
  499. package/build/question/create.d.ts.map +1 -1
  500. package/build/question/create.js +277 -1239
  501. package/build/question/create.js.map +1 -1
  502. package/build/question/index.d.ts +1 -3
  503. package/build/question/index.d.ts.map +1 -1
  504. package/build/question/index.js +2 -6
  505. package/build/question/index.js.map +1 -1
  506. package/build/question/inputs/CreateProjectInputs.d.ts +4 -4
  507. package/build/question/inputs/CreateProjectInputs.d.ts.map +1 -1
  508. package/build/question/options/CreateProjectOptions.js +14 -14
  509. package/build/question/options/CreateProjectOptions.js.map +1 -1
  510. package/build/question/other.d.ts +2 -28
  511. package/build/question/other.d.ts.map +1 -1
  512. package/build/question/other.js +66 -272
  513. package/build/question/other.js.map +1 -1
  514. package/package.json +11 -9
  515. package/resource/deps-checker/dotnet-install.ps1 +912 -423
  516. package/resource/deps-checker/dotnet-install.sh +876 -238
  517. package/resource/package.nls.json +7 -22
  518. package/resource/yaml-schema/v1.6/yaml.schema.json +1829 -0
  519. package/resource/yaml-schema/yaml.schema.json +46 -1
  520. package/templates/core/v3Migration/js.ts.app.local.yml +3 -3
  521. package/templates/fallback/common.zip +0 -0
  522. package/templates/fallback/csharp.zip +0 -0
  523. package/templates/fallback/js.zip +0 -0
  524. package/templates/fallback/python.zip +0 -0
  525. package/templates/fallback/ts.zip +0 -0
  526. package/templates/plugins/resource/aad/auth/V3/aad.manifest.template.json +6 -0
  527. package/templates/plugins/resource/aad/manifest/aad.template.json +6 -0
  528. package/templates/plugins/resource/aad/manifest/bot/aad.manifest.template.json +6 -0
  529. package/templates/plugins/resource/aad/manifest/tab/aad.manifest.template.json +6 -0
  530. package/build/common/deps-checker/checkerFactory.d.ts.map +0 -1
  531. package/build/common/deps-checker/checkerFactory.js.map +0 -1
  532. package/build/common/deps-checker/constant/helpLink.d.ts.map +0 -1
  533. package/build/common/deps-checker/constant/helpLink.js.map +0 -1
  534. package/build/common/deps-checker/constant/index.d.ts.map +0 -1
  535. package/build/common/deps-checker/constant/index.js.map +0 -1
  536. package/build/common/deps-checker/constant/message.d.ts.map +0 -1
  537. package/build/common/deps-checker/constant/message.js.map +0 -1
  538. package/build/common/deps-checker/constant/telemetry.d.ts.map +0 -1
  539. package/build/common/deps-checker/constant/telemetry.js.map +0 -1
  540. package/build/common/deps-checker/coreDepsLoggerAdapter.d.ts.map +0 -1
  541. package/build/common/deps-checker/coreDepsLoggerAdapter.js.map +0 -1
  542. package/build/common/deps-checker/coreDepsTelemetryAdapter.d.ts.map +0 -1
  543. package/build/common/deps-checker/coreDepsTelemetryAdapter.js.map +0 -1
  544. package/build/common/deps-checker/depsChecker.d.ts.map +0 -1
  545. package/build/common/deps-checker/depsChecker.js.map +0 -1
  546. package/build/common/deps-checker/depsError.d.ts.map +0 -1
  547. package/build/common/deps-checker/depsError.js.map +0 -1
  548. package/build/common/deps-checker/depsLogger.d.ts.map +0 -1
  549. package/build/common/deps-checker/depsLogger.js.map +0 -1
  550. package/build/common/deps-checker/depsManager.d.ts.map +0 -1
  551. package/build/common/deps-checker/depsManager.js.map +0 -1
  552. package/build/common/deps-checker/depsTelemetry.d.ts.map +0 -1
  553. package/build/common/deps-checker/depsTelemetry.js.map +0 -1
  554. package/build/common/deps-checker/index.d.ts.map +0 -1
  555. package/build/common/deps-checker/index.js.map +0 -1
  556. package/build/common/deps-checker/internal/dotnetChecker.d.ts.map +0 -1
  557. package/build/common/deps-checker/internal/dotnetChecker.js.map +0 -1
  558. package/build/common/deps-checker/internal/funcToolChecker.d.ts.map +0 -1
  559. package/build/common/deps-checker/internal/funcToolChecker.js.map +0 -1
  560. package/build/common/deps-checker/internal/nodeChecker.d.ts.map +0 -1
  561. package/build/common/deps-checker/internal/nodeChecker.js.map +0 -1
  562. package/build/common/deps-checker/internal/testToolChecker.d.ts.map +0 -1
  563. package/build/common/deps-checker/internal/testToolChecker.js.map +0 -1
  564. package/build/common/deps-checker/internal/vxTestAppChecker.d.ts.map +0 -1
  565. package/build/common/deps-checker/internal/vxTestAppChecker.js.map +0 -1
  566. package/build/common/deps-checker/util/cpUtils.d.ts.map +0 -1
  567. package/build/common/deps-checker/util/cpUtils.js.map +0 -1
  568. package/build/common/deps-checker/util/downloadHelper.d.ts.map +0 -1
  569. package/build/common/deps-checker/util/downloadHelper.js.map +0 -1
  570. package/build/common/deps-checker/util/fileHelper.d.ts.map +0 -1
  571. package/build/common/deps-checker/util/fileHelper.js.map +0 -1
  572. package/build/common/deps-checker/util/index.d.ts.map +0 -1
  573. package/build/common/deps-checker/util/index.js.map +0 -1
  574. package/build/common/deps-checker/util/progressIndicator.d.ts.map +0 -1
  575. package/build/common/deps-checker/util/progressIndicator.js.map +0 -1
  576. package/build/common/deps-checker/util/system.d.ts.map +0 -1
  577. package/build/common/deps-checker/util/system.js.map +0 -1
  578. package/build/common/local/constants.d.ts.map +0 -1
  579. package/build/common/local/constants.js.map +0 -1
  580. package/build/common/local/index.d.ts.map +0 -1
  581. package/build/common/local/index.js.map +0 -1
  582. package/build/common/local/localCertificateManager.d.ts.map +0 -1
  583. package/build/common/local/localCertificateManager.js.map +0 -1
  584. package/build/common/local/localEnvManager.d.ts.map +0 -1
  585. package/build/common/local/localEnvManager.js.map +0 -1
  586. package/build/common/local/localTelemetryReporter.d.ts.map +0 -1
  587. package/build/common/local/localTelemetryReporter.js.map +0 -1
  588. package/build/common/local/npmLogHelper.d.ts.map +0 -1
  589. package/build/common/local/npmLogHelper.js.map +0 -1
  590. package/build/common/local/packageJsonHelper.d.ts.map +0 -1
  591. package/build/common/local/packageJsonHelper.js.map +0 -1
  592. package/build/common/local/portChecker.d.ts.map +0 -1
  593. package/build/common/local/portChecker.js.map +0 -1
  594. package/build/common/local/process.d.ts.map +0 -1
  595. package/build/common/local/process.js.map +0 -1
  596. package/build/common/local/taskDefinition.d.ts.map +0 -1
  597. package/build/common/local/taskDefinition.js.map +0 -1
  598. package/build/common/m365/constants.d.ts.map +0 -1
  599. package/build/common/m365/constants.js.map +0 -1
  600. package/build/common/m365/errors.d.ts.map +0 -1
  601. package/build/common/m365/errors.js.map +0 -1
  602. package/build/common/m365/launchHelper.d.ts.map +0 -1
  603. package/build/common/m365/launchHelper.js.map +0 -1
  604. package/build/common/m365/packageService.d.ts.map +0 -1
  605. package/build/common/m365/packageService.js.map +0 -1
  606. package/build/common/m365/serviceConstant.d.ts +0 -3
  607. package/build/common/m365/serviceConstant.d.ts.map +0 -1
  608. package/build/common/m365/serviceConstant.js +0 -8
  609. package/build/common/m365/serviceConstant.js.map +0 -1
  610. package/build/common/projectSettingsHelperV3.d.ts +0 -2
  611. package/build/common/projectSettingsHelperV3.d.ts.map +0 -1
  612. package/build/common/projectSettingsHelperV3.js +0 -15
  613. package/build/common/projectSettingsHelperV3.js.map +0 -1
  614. package/build/component/utils.d.ts +0 -12
  615. package/build/component/utils.d.ts.map +0 -1
  616. package/build/component/utils.js +0 -136
  617. package/build/component/utils.js.map +0 -1
  618. package/build/component/workflow.d.ts +0 -4
  619. package/build/component/workflow.d.ts.map +0 -1
  620. package/build/component/workflow.js +0 -18
  621. package/build/component/workflow.js.map +0 -1
  622. package/build/core/error.d.ts +0 -32
  623. package/build/core/error.d.ts.map +0 -1
  624. package/build/core/error.js +0 -122
  625. package/build/core/error.js.map +0 -1
  626. package/build/core/globalVars.d.ts.map +0 -1
  627. package/build/core/globalVars.js.map +0 -1
  628. package/build/failpoint/index.d.ts +0 -3
  629. package/build/failpoint/index.d.ts.map +0 -1
  630. package/build/failpoint/index.js +0 -11
  631. package/build/failpoint/index.js.map +0 -1
  632. package/build/failpoint/marker.d.ts +0 -13
  633. package/build/failpoint/marker.d.ts.map +0 -1
  634. package/build/failpoint/marker.js +0 -8
  635. package/build/failpoint/marker.js.map +0 -1
  636. package/build/failpoint/runtime.d.ts +0 -12
  637. package/build/failpoint/runtime.d.ts.map +0 -1
  638. package/build/failpoint/runtime.js +0 -67
  639. package/build/failpoint/runtime.js.map +0 -1
  640. package/build/question/questionNames.d.ts +0 -78
  641. package/build/question/questionNames.d.ts.map +0 -1
  642. package/build/question/questionNames.js +0 -85
  643. package/build/question/questionNames.js.map +0 -1
  644. package/build/question/util.d.ts +0 -2
  645. package/build/question/util.d.ts.map +0 -1
  646. package/build/question/util.js +0 -18
  647. package/build/question/util.js.map +0 -1
  648. /package/build/{common → component}/deps-checker/checkerFactory.d.ts +0 -0
  649. /package/build/{common → component}/deps-checker/checkerFactory.js +0 -0
  650. /package/build/{common → component}/deps-checker/constant/index.d.ts +0 -0
  651. /package/build/{common → component}/deps-checker/constant/index.js +0 -0
  652. /package/build/{common → component}/deps-checker/constant/message.d.ts +0 -0
  653. /package/build/{common → component}/deps-checker/constant/telemetry.d.ts +0 -0
  654. /package/build/{common → component}/deps-checker/constant/telemetry.js +0 -0
  655. /package/build/{common → component}/deps-checker/coreDepsLoggerAdapter.d.ts +0 -0
  656. /package/build/{common → component}/deps-checker/coreDepsLoggerAdapter.js +0 -0
  657. /package/build/{common → component}/deps-checker/coreDepsTelemetryAdapter.d.ts +0 -0
  658. /package/build/{common → component}/deps-checker/depsChecker.d.ts +0 -0
  659. /package/build/{common → component}/deps-checker/depsChecker.js +0 -0
  660. /package/build/{common → component}/deps-checker/depsError.d.ts +0 -0
  661. /package/build/{common → component}/deps-checker/depsError.js +0 -0
  662. /package/build/{common → component}/deps-checker/depsLogger.d.ts +0 -0
  663. /package/build/{common → component}/deps-checker/depsLogger.js +0 -0
  664. /package/build/{common → component}/deps-checker/depsManager.d.ts +0 -0
  665. /package/build/{common → component}/deps-checker/depsManager.js +0 -0
  666. /package/build/{common → component}/deps-checker/depsTelemetry.d.ts +0 -0
  667. /package/build/{common → component}/deps-checker/depsTelemetry.js +0 -0
  668. /package/build/{common → component}/deps-checker/index.d.ts +0 -0
  669. /package/build/{common → component}/deps-checker/index.js +0 -0
  670. /package/build/{common → component}/deps-checker/internal/dotnetChecker.d.ts +0 -0
  671. /package/build/{common → component}/deps-checker/internal/funcToolChecker.d.ts +0 -0
  672. /package/build/{common → component}/deps-checker/internal/nodeChecker.d.ts +0 -0
  673. /package/build/{common → component}/deps-checker/internal/nodeChecker.js +0 -0
  674. /package/build/{common → component}/deps-checker/internal/testToolChecker.d.ts +0 -0
  675. /package/build/{common → component}/deps-checker/internal/vxTestAppChecker.d.ts +0 -0
  676. /package/build/{common → component}/deps-checker/util/cpUtils.d.ts +0 -0
  677. /package/build/{common → component}/deps-checker/util/cpUtils.js +0 -0
  678. /package/build/{common → component}/deps-checker/util/downloadHelper.d.ts +0 -0
  679. /package/build/{common → component}/deps-checker/util/downloadHelper.js +0 -0
  680. /package/build/{common → component}/deps-checker/util/fileHelper.d.ts +0 -0
  681. /package/build/{common → component}/deps-checker/util/fileHelper.js +0 -0
  682. /package/build/{common → component}/deps-checker/util/index.d.ts +0 -0
  683. /package/build/{common → component}/deps-checker/util/index.js +0 -0
  684. /package/build/{common → component}/deps-checker/util/progressIndicator.d.ts +0 -0
  685. /package/build/{common → component}/deps-checker/util/progressIndicator.js +0 -0
  686. /package/build/{common → component}/deps-checker/util/system.d.ts +0 -0
  687. /package/build/{common → component}/deps-checker/util/system.js +0 -0
  688. /package/build/{common → component}/local/index.d.ts +0 -0
  689. /package/build/{common → component}/local/index.js +0 -0
  690. /package/build/{common → component}/local/localCertificateManager.d.ts +0 -0
  691. /package/build/{common → component}/local/localEnvManager.d.ts +0 -0
  692. /package/build/{common → component}/local/localEnvManager.js +0 -0
  693. /package/build/{common → component}/local/localTelemetryReporter.d.ts +0 -0
  694. /package/build/{common → component}/local/npmLogHelper.d.ts +0 -0
  695. /package/build/{common → component}/local/npmLogHelper.js +0 -0
  696. /package/build/{common → component}/local/packageJsonHelper.d.ts +0 -0
  697. /package/build/{common → component}/local/packageJsonHelper.js +0 -0
  698. /package/build/{common → component}/local/portChecker.d.ts +0 -0
  699. /package/build/{common → component}/local/process.d.ts +0 -0
  700. /package/build/{common → component}/local/process.js +0 -0
  701. /package/build/{common → component}/local/taskDefinition.d.ts +0 -0
  702. /package/build/{common → component}/m365/constants.d.ts +0 -0
  703. /package/build/{common → component}/m365/constants.js +0 -0
  704. /package/build/{common → component}/m365/errors.d.ts +0 -0
  705. /package/build/{common → component}/m365/packageService.d.ts +0 -0
@@ -9,22 +9,41 @@
9
9
  .DESCRIPTION
10
10
  Installs dotnet cli. If dotnet installation already exists in the given directory
11
11
  it will update it only if the requested version differs from the one already installed.
12
+
13
+ Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:
14
+ - The SDK needs to be installed without user interaction and without admin rights.
15
+ - The SDK installation doesn't need to persist across multiple CI runs.
16
+ To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.
17
+
12
18
  .PARAMETER Channel
13
19
  Default: LTS
14
20
  Download from the Channel specified. Possible values:
15
- - Current - most current release
16
- - LTS - most current supported release
21
+ - STS - the most recent Standard Term Support release
22
+ - LTS - the most recent Long Term Support release
17
23
  - 2-part version in a format A.B - represents a specific release
18
24
  examples: 2.0, 1.0
19
- - Branch name
20
- examples: release/2.0.0, Master
21
- Note: The version parameter overrides the channel parameter.
25
+ - 3-part version in a format A.B.Cxx - represents a specific SDK release
26
+ examples: 5.0.1xx, 5.0.2xx
27
+ Supported since 5.0 release
28
+ Warning: Value "Current" is deprecated for the Channel parameter. Use "STS" instead.
29
+ Note: The version parameter overrides the channel parameter when any version other than 'latest' is used.
30
+ .PARAMETER Quality
31
+ Download the latest build of specified quality in the channel. The possible values are: daily, signed, validated, preview, GA.
32
+ Works only in combination with channel. Not applicable for STS and LTS channels and will be ignored if those channels are used.
33
+ For SDK use channel in A.B.Cxx format: using quality together with channel in A.B format is not supported.
34
+ Supported since 5.0 release.
35
+ Note: The version parameter overrides the channel parameter when any version other than 'latest' is used, and therefore overrides the quality.
22
36
  .PARAMETER Version
23
37
  Default: latest
24
38
  Represents a build version on specific channel. Possible values:
25
- - latest - most latest build on specific channel
39
+ - latest - the latest build on specific channel
26
40
  - 3-part version in a format A.B.C - represents specific version of build
27
41
  examples: 2.0.0-preview2-006120, 1.1.0
42
+ .PARAMETER Internal
43
+ Download internal builds. Requires providing credentials via -FeedCredential parameter.
44
+ .PARAMETER FeedCredential
45
+ Token to access Azure feed. Used as a query string to append to the Azure feed.
46
+ This parameter typically is not specified.
28
47
  .PARAMETER InstallDir
29
48
  Default: %LocalAppData%\Microsoft\dotnet
30
49
  Path to where to install dotnet. Note that binaries will be placed directly in a given directory.
@@ -54,14 +73,13 @@
54
73
  Displays diagnostics information.
55
74
  .PARAMETER AzureFeed
56
75
  Default: https://dotnetcli.azureedge.net/dotnet
57
- This parameter typically is not changed by the user.
58
- It allows changing the URL for the Azure feed used by this installer.
76
+ For internal use only.
77
+ Allows using a different storage to download SDK archives from.
78
+ This parameter is only used if $NoCdn is false.
59
79
  .PARAMETER UncachedFeed
60
- This parameter typically is not changed by the user.
61
- It allows changing the URL for the Uncached feed used by this installer.
62
- .PARAMETER FeedCredential
63
- Used as a query string to append to the Azure feed.
64
- It allows changing the URL to use non-public blob storage accounts.
80
+ For internal use only.
81
+ Allows using a different storage to download SDK archives from.
82
+ This parameter is only used if $NoCdn is true.
65
83
  .PARAMETER ProxyAddress
66
84
  If set, the installer will use the proxy when making web requests
67
85
  .PARAMETER ProxyUseDefaultCredentials
@@ -77,48 +95,52 @@
77
95
  .PARAMETER JSonFile
78
96
  Determines the SDK version from a user specified global.json file
79
97
  Note: global.json must have a value for 'SDK:Version'
98
+ .PARAMETER DownloadTimeout
99
+ Determines timeout duration in seconds for dowloading of the SDK file
100
+ Default: 1200 seconds (20 minutes)
101
+ .PARAMETER KeepZip
102
+ If set, downloaded file is kept
103
+ .PARAMETER ZipPath
104
+ Use that path to store installer, generated by default
105
+ .EXAMPLE
106
+ dotnet-install.ps1 -Version 7.0.401
107
+ Installs the .NET SDK version 7.0.401
108
+ .EXAMPLE
109
+ dotnet-install.ps1 -Channel 8.0 -Quality GA
110
+ Installs the latest GA (general availability) version of the .NET 8.0 SDK
80
111
  #>
81
112
  [cmdletbinding()]
82
113
  param(
83
114
  [string]$Channel="LTS",
115
+ [string]$Quality,
84
116
  [string]$Version="Latest",
117
+ [switch]$Internal,
85
118
  [string]$JSonFile,
86
- [string]$InstallDir="<auto>",
119
+ [Alias('i')][string]$InstallDir="<auto>",
87
120
  [string]$Architecture="<auto>",
88
- [ValidateSet("dotnet", "aspnetcore", "windowsdesktop", IgnoreCase = $false)]
89
121
  [string]$Runtime,
90
122
  [Obsolete("This parameter may be removed in a future version of this script. The recommended alternative is '-Runtime dotnet'.")]
91
123
  [switch]$SharedRuntime,
92
124
  [switch]$DryRun,
93
125
  [switch]$NoPath,
94
- [string]$AzureFeed="https://dotnetcli.azureedge.net/dotnet",
95
- [string]$UncachedFeed="https://dotnetcli.blob.core.windows.net/dotnet",
126
+ [string]$AzureFeed,
127
+ [string]$UncachedFeed,
96
128
  [string]$FeedCredential,
97
129
  [string]$ProxyAddress,
98
130
  [switch]$ProxyUseDefaultCredentials,
99
131
  [string[]]$ProxyBypassList=@(),
100
132
  [switch]$SkipNonVersionedFiles,
101
- [switch]$NoCdn
133
+ [switch]$NoCdn,
134
+ [int]$DownloadTimeout=1200,
135
+ [switch]$KeepZip,
136
+ [string]$ZipPath=[System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName()),
137
+ [switch]$Help
102
138
  )
103
139
 
104
140
  Set-StrictMode -Version Latest
105
141
  $ErrorActionPreference="Stop"
106
142
  $ProgressPreference="SilentlyContinue"
107
143
 
108
- if ($NoCdn) {
109
- $AzureFeed = $UncachedFeed
110
- }
111
-
112
- $BinFolderRelativePath=""
113
-
114
- if ($SharedRuntime -and (-not $Runtime)) {
115
- $Runtime = "dotnet"
116
- }
117
-
118
- # example path with regex: shared/1.0.0-beta-12345/somepath
119
- $VersionRegEx="/\d+\.\d+[^/]+/"
120
- $OverrideNonVersionedFiles = !$SkipNonVersionedFiles
121
-
122
144
  function Say($str) {
123
145
  try {
124
146
  Write-Host "dotnet-install: $str"
@@ -161,14 +183,38 @@ function Say-Verbose($str) {
161
183
  }
162
184
  }
163
185
 
186
+ function Measure-Action($name, $block) {
187
+ $time = Measure-Command $block
188
+ $totalSeconds = $time.TotalSeconds
189
+ Say-Verbose "⏱ Action '$name' took $totalSeconds seconds"
190
+ }
191
+
192
+ function Get-Remote-File-Size($zipUri) {
193
+ try {
194
+ $response = Invoke-WebRequest -Uri $zipUri -Method Head
195
+ $fileSize = $response.Headers["Content-Length"]
196
+ if ((![string]::IsNullOrEmpty($fileSize))) {
197
+ Say "Remote file $zipUri size is $fileSize bytes."
198
+
199
+ return $fileSize
200
+ }
201
+ }
202
+ catch {
203
+ Say-Verbose "Content-Length header was not extracted for $zipUri."
204
+ }
205
+
206
+ return $null
207
+ }
208
+
164
209
  function Say-Invocation($Invocation) {
165
210
  $command = $Invocation.MyCommand;
166
211
  $args = (($Invocation.BoundParameters.Keys | foreach { "-$_ `"$($Invocation.BoundParameters[$_])`"" }) -join " ")
167
212
  Say-Verbose "$command $args"
168
213
  }
169
214
 
170
- function Invoke-With-Retry([ScriptBlock]$ScriptBlock, [int]$MaxAttempts = 3, [int]$SecondsBetweenAttempts = 1) {
215
+ function Invoke-With-Retry([ScriptBlock]$ScriptBlock, [System.Threading.CancellationToken]$cancellationToken = [System.Threading.CancellationToken]::None, [int]$MaxAttempts = 3, [int]$SecondsBetweenAttempts = 1) {
171
216
  $Attempts = 0
217
+ $local:startTime = $(get-date)
172
218
 
173
219
  while ($true) {
174
220
  try {
@@ -176,11 +222,15 @@ function Invoke-With-Retry([ScriptBlock]$ScriptBlock, [int]$MaxAttempts = 3, [in
176
222
  }
177
223
  catch {
178
224
  $Attempts++
179
- if ($Attempts -lt $MaxAttempts) {
225
+ if (($Attempts -lt $MaxAttempts) -and -not $cancellationToken.IsCancellationRequested) {
180
226
  Start-Sleep $SecondsBetweenAttempts
181
227
  }
182
228
  else {
183
- throw
229
+ $local:elapsedTime = $(get-date) - $local:startTime
230
+ if (($local:elapsedTime.TotalSeconds - $DownloadTimeout) -gt 0 -and -not $cancellationToken.IsCancellationRequested) {
231
+ throw New-Object System.TimeoutException("Failed to reach the server: connection timeout: default timeout is $DownloadTimeout second(s)");
232
+ }
233
+ throw;
184
234
  }
185
235
  }
186
236
  }
@@ -193,20 +243,34 @@ function Get-Machine-Architecture() {
193
243
  # To get the correct architecture, we need to use PROCESSOR_ARCHITEW6432.
194
244
  # PS x64 doesn't define this, so we fall back to PROCESSOR_ARCHITECTURE.
195
245
  # Possible values: amd64, x64, x86, arm64, arm
196
-
197
- if( $ENV:PROCESSOR_ARCHITEW6432 -ne $null )
198
- {
246
+ if( $ENV:PROCESSOR_ARCHITEW6432 -ne $null ) {
199
247
  return $ENV:PROCESSOR_ARCHITEW6432
200
248
  }
201
249
 
250
+ try {
251
+ if( ((Get-CimInstance -ClassName CIM_OperatingSystem).OSArchitecture) -like "ARM*") {
252
+ if( [Environment]::Is64BitOperatingSystem )
253
+ {
254
+ return "arm64"
255
+ }
256
+ return "arm"
257
+ }
258
+ }
259
+ catch {
260
+ # Machine doesn't support Get-CimInstance
261
+ }
262
+
202
263
  return $ENV:PROCESSOR_ARCHITECTURE
203
264
  }
204
265
 
205
266
  function Get-CLIArchitecture-From-Architecture([string]$Architecture) {
206
267
  Say-Invocation $MyInvocation
207
268
 
208
- switch ($Architecture.ToLower()) {
209
- { $_ -eq "<auto>" } { return Get-CLIArchitecture-From-Architecture $(Get-Machine-Architecture) }
269
+ if ($Architecture -eq "<auto>") {
270
+ $Architecture = Get-Machine-Architecture
271
+ }
272
+
273
+ switch ($Architecture.ToLowerInvariant()) {
210
274
  { ($_ -eq "amd64") -or ($_ -eq "x64") } { return "x64" }
211
275
  { $_ -eq "x86" } { return "x86" }
212
276
  { $_ -eq "arm" } { return "arm" }
@@ -215,13 +279,83 @@ function Get-CLIArchitecture-From-Architecture([string]$Architecture) {
215
279
  }
216
280
  }
217
281
 
282
+ function ValidateFeedCredential([string] $FeedCredential)
283
+ {
284
+ if ($Internal -and [string]::IsNullOrWhitespace($FeedCredential)) {
285
+ $message = "Provide credentials via -FeedCredential parameter."
286
+ if ($DryRun) {
287
+ Say-Warning "$message"
288
+ } else {
289
+ throw "$message"
290
+ }
291
+ }
292
+
293
+ #FeedCredential should start with "?", for it to be added to the end of the link.
294
+ #adding "?" at the beginning of the FeedCredential if needed.
295
+ if ((![string]::IsNullOrWhitespace($FeedCredential)) -and ($FeedCredential[0] -ne '?')) {
296
+ $FeedCredential = "?" + $FeedCredential
297
+ }
298
+
299
+ return $FeedCredential
300
+ }
301
+ function Get-NormalizedQuality([string]$Quality) {
302
+ Say-Invocation $MyInvocation
303
+
304
+ if ([string]::IsNullOrEmpty($Quality)) {
305
+ return ""
306
+ }
307
+
308
+ switch ($Quality) {
309
+ { @("daily", "signed", "validated", "preview") -contains $_ } { return $Quality.ToLowerInvariant() }
310
+ #ga quality is available without specifying quality, so normalizing it to empty
311
+ { $_ -eq "ga" } { return "" }
312
+ default { throw "'$Quality' is not a supported value for -Quality option. Supported values are: daily, signed, validated, preview, ga. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues." }
313
+ }
314
+ }
315
+
316
+ function Get-NormalizedChannel([string]$Channel) {
317
+ Say-Invocation $MyInvocation
318
+
319
+ if ([string]::IsNullOrEmpty($Channel)) {
320
+ return ""
321
+ }
322
+
323
+ if ($Channel.Contains("Current")) {
324
+ Say-Warning 'Value "Current" is deprecated for -Channel option. Use "STS" instead.'
325
+ }
326
+
327
+ if ($Channel.StartsWith('release/')) {
328
+ Say-Warning 'Using branch name with -Channel option is no longer supported with newer releases. Use -Quality option with a channel in X.Y format instead, such as "-Channel 5.0 -Quality Daily."'
329
+ }
330
+
331
+ switch ($Channel) {
332
+ { $_ -eq "lts" } { return "LTS" }
333
+ { $_ -eq "sts" } { return "STS" }
334
+ { $_ -eq "current" } { return "STS" }
335
+ default { return $Channel.ToLowerInvariant() }
336
+ }
337
+ }
338
+
339
+ function Get-NormalizedProduct([string]$Runtime) {
340
+ Say-Invocation $MyInvocation
341
+
342
+ switch ($Runtime) {
343
+ { $_ -eq "dotnet" } { return "dotnet-runtime" }
344
+ { $_ -eq "aspnetcore" } { return "aspnetcore-runtime" }
345
+ { $_ -eq "windowsdesktop" } { return "windowsdesktop-runtime" }
346
+ { [string]::IsNullOrEmpty($_) } { return "dotnet-sdk" }
347
+ default { throw "'$Runtime' is not a supported value for -Runtime option, supported values are: dotnet, aspnetcore, windowsdesktop. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues." }
348
+ }
349
+ }
350
+
351
+
218
352
  # The version text returned from the feeds is a 1-line or 2-line string:
219
353
  # For the SDK and the dotnet runtime (2 lines):
220
354
  # Line 1: # commit_hash
221
355
  # Line 2: # 4-part version
222
356
  # For the aspnetcore runtime (1 line):
223
357
  # Line 1: # 4-part version
224
- function Get-Version-Info-From-Version-Text([string]$VersionText) {
358
+ function Get-Version-From-LatestVersion-File-Content([string]$VersionText) {
225
359
  Say-Invocation $MyInvocation
226
360
 
227
361
  $Data = -split $VersionText
@@ -243,10 +377,11 @@ function Load-Assembly([string] $Assembly) {
243
377
  }
244
378
  }
245
379
 
246
- function GetHTTPResponse([Uri] $Uri)
380
+ function GetHTTPResponse([Uri] $Uri, [bool]$HeaderOnly, [bool]$DisableRedirect, [bool]$DisableFeedCredential)
247
381
  {
248
- Invoke-With-Retry(
249
- {
382
+ $cts = New-Object System.Threading.CancellationTokenSource
383
+
384
+ $downloadScript = {
250
385
 
251
386
  $HttpClient = $null
252
387
 
@@ -259,7 +394,11 @@ function GetHTTPResponse([Uri] $Uri)
259
394
  # Despite no proxy being explicitly specified, we may still be behind a default proxy
260
395
  $DefaultProxy = [System.Net.WebRequest]::DefaultWebProxy;
261
396
  if($DefaultProxy -and (-not $DefaultProxy.IsBypassed($Uri))) {
262
- $ProxyAddress = $DefaultProxy.GetProxy($Uri).OriginalString
397
+ if ($null -ne $DefaultProxy.GetProxy($Uri)) {
398
+ $ProxyAddress = $DefaultProxy.GetProxy($Uri).OriginalString
399
+ } else {
400
+ $ProxyAddress = $null
401
+ }
263
402
  $ProxyUseDefaultCredentials = $true
264
403
  }
265
404
  } catch {
@@ -270,32 +409,53 @@ function GetHTTPResponse([Uri] $Uri)
270
409
  }
271
410
  }
272
411
 
412
+ $HttpClientHandler = New-Object System.Net.Http.HttpClientHandler
273
413
  if($ProxyAddress) {
274
- $HttpClientHandler = New-Object System.Net.Http.HttpClientHandler
275
414
  $HttpClientHandler.Proxy = New-Object System.Net.WebProxy -Property @{
276
415
  Address=$ProxyAddress;
277
416
  UseDefaultCredentials=$ProxyUseDefaultCredentials;
278
417
  BypassList = $ProxyBypassList;
279
418
  }
280
- $HttpClient = New-Object System.Net.Http.HttpClient -ArgumentList $HttpClientHandler
419
+ }
420
+ if ($DisableRedirect)
421
+ {
422
+ $HttpClientHandler.AllowAutoRedirect = $false
423
+ }
424
+ $HttpClient = New-Object System.Net.Http.HttpClient -ArgumentList $HttpClientHandler
425
+
426
+ # Default timeout for HttpClient is 100s. For a 50 MB download this assumes 500 KB/s average, any less will time out
427
+ # Defaulting to 20 minutes allows it to work over much slower connections.
428
+ $HttpClient.Timeout = New-TimeSpan -Seconds $DownloadTimeout
429
+
430
+ if ($HeaderOnly){
431
+ $completionOption = [System.Net.Http.HttpCompletionOption]::ResponseHeadersRead
281
432
  }
282
433
  else {
434
+ $completionOption = [System.Net.Http.HttpCompletionOption]::ResponseContentRead
435
+ }
283
436
 
284
- $HttpClient = New-Object System.Net.Http.HttpClient
437
+ if ($DisableFeedCredential) {
438
+ $UriWithCredential = $Uri
285
439
  }
286
- # Default timeout for HttpClient is 100s. For a 50 MB download this assumes 500 KB/s average, any less will time out
287
- # 20 minutes allows it to work over much slower connections.
288
- $HttpClient.Timeout = New-TimeSpan -Minutes 20
289
- $Task = $HttpClient.GetAsync("${Uri}${FeedCredential}").ConfigureAwait("false");
440
+ else {
441
+ $UriWithCredential = "${Uri}${FeedCredential}"
442
+ }
443
+
444
+ $Task = $HttpClient.GetAsync("$UriWithCredential", $completionOption).ConfigureAwait("false");
290
445
  $Response = $Task.GetAwaiter().GetResult();
291
446
 
292
- if (($null -eq $Response) -or (-not ($Response.IsSuccessStatusCode))) {
447
+ if (($null -eq $Response) -or ((-not $HeaderOnly) -and (-not ($Response.IsSuccessStatusCode)))) {
293
448
  # The feed credential is potentially sensitive info. Do not log FeedCredential to console output.
294
449
  $DownloadException = [System.Exception] "Unable to download $Uri."
295
450
 
296
451
  if ($null -ne $Response) {
297
452
  $DownloadException.Data["StatusCode"] = [int] $Response.StatusCode
298
453
  $DownloadException.Data["ErrorMessage"] = "Unable to download $Uri. Returned HTTP status code: " + $DownloadException.Data["StatusCode"]
454
+
455
+ if (404 -eq [int] $Response.StatusCode)
456
+ {
457
+ $cts.Cancel()
458
+ }
299
459
  }
300
460
 
301
461
  throw $DownloadException
@@ -323,37 +483,51 @@ function GetHTTPResponse([Uri] $Uri)
323
483
  throw $DownloadException
324
484
  }
325
485
  finally {
326
- if ($HttpClient -ne $null) {
486
+ if ($null -ne $HttpClient) {
327
487
  $HttpClient.Dispose()
328
488
  }
329
489
  }
330
- })
490
+ }
491
+
492
+ try {
493
+ return Invoke-With-Retry $downloadScript $cts.Token
494
+ }
495
+ finally
496
+ {
497
+ if ($null -ne $cts)
498
+ {
499
+ $cts.Dispose()
500
+ }
501
+ }
331
502
  }
332
503
 
333
- function Get-Latest-Version-Info([string]$AzureFeed, [string]$Channel) {
504
+ function Get-Version-From-LatestVersion-File([string]$AzureFeed, [string]$Channel) {
334
505
  Say-Invocation $MyInvocation
335
506
 
336
507
  $VersionFileUrl = $null
337
508
  if ($Runtime -eq "dotnet") {
338
- $VersionFileUrl = "$UncachedFeed/Runtime/$Channel/latest.version"
509
+ $VersionFileUrl = "$AzureFeed/Runtime/$Channel/latest.version"
339
510
  }
340
511
  elseif ($Runtime -eq "aspnetcore") {
341
- $VersionFileUrl = "$UncachedFeed/aspnetcore/Runtime/$Channel/latest.version"
512
+ $VersionFileUrl = "$AzureFeed/aspnetcore/Runtime/$Channel/latest.version"
342
513
  }
343
514
  elseif ($Runtime -eq "windowsdesktop") {
344
- $VersionFileUrl = "$UncachedFeed/WindowsDesktop/$Channel/latest.version"
515
+ $VersionFileUrl = "$AzureFeed/WindowsDesktop/$Channel/latest.version"
345
516
  }
346
517
  elseif (-not $Runtime) {
347
- $VersionFileUrl = "$UncachedFeed/Sdk/$Channel/latest.version"
518
+ $VersionFileUrl = "$AzureFeed/Sdk/$Channel/latest.version"
348
519
  }
349
520
  else {
350
521
  throw "Invalid value for `$Runtime"
351
522
  }
523
+
524
+ Say-Verbose "Constructed latest.version URL: $VersionFileUrl"
525
+
352
526
  try {
353
527
  $Response = GetHTTPResponse -Uri $VersionFileUrl
354
528
  }
355
529
  catch {
356
- Say-Error "Could not resolve version information."
530
+ Say-Verbose "Failed to download latest.version file."
357
531
  throw
358
532
  }
359
533
  $StringContent = $Response.Content.ReadAsStringAsync().Result
@@ -365,7 +539,7 @@ function Get-Latest-Version-Info([string]$AzureFeed, [string]$Channel) {
365
539
  default { throw "``$Response.Content.Headers.ContentType`` is an unknown .version file content type." }
366
540
  }
367
541
 
368
- $VersionInfo = Get-Version-Info-From-Version-Text $VersionText
542
+ $VersionInfo = Get-Version-From-LatestVersion-File-Content $VersionText
369
543
 
370
544
  return $VersionInfo
371
545
  }
@@ -411,8 +585,8 @@ function Get-Specific-Version-From-Version([string]$AzureFeed, [string]$Channel,
411
585
  Say-Invocation $MyInvocation
412
586
 
413
587
  if (-not $JSonFile) {
414
- if ($Version.ToLower() -eq "latest") {
415
- $LatestVersionInfo = Get-Latest-Version-Info -AzureFeed $AzureFeed -Channel $Channel
588
+ if ($Version.ToLowerInvariant() -eq "latest") {
589
+ $LatestVersionInfo = Get-Version-From-LatestVersion-File -AzureFeed $AzureFeed -Channel $Channel
416
590
  return $LatestVersionInfo.Version
417
591
  }
418
592
  else {
@@ -478,58 +652,116 @@ function Get-LegacyDownload-Link([string]$AzureFeed, [string]$SpecificVersion, [
478
652
  return $PayloadURL
479
653
  }
480
654
 
481
- function Get-Product-Version([string]$AzureFeed, [string]$SpecificVersion) {
655
+ function Get-Product-Version([string]$AzureFeed, [string]$SpecificVersion, [string]$PackageDownloadLink) {
482
656
  Say-Invocation $MyInvocation
483
657
 
484
- if ($Runtime -eq "dotnet") {
485
- $ProductVersionTxtURL = "$AzureFeed/Runtime/$SpecificVersion/productVersion.txt"
486
- }
487
- elseif ($Runtime -eq "aspnetcore") {
488
- $ProductVersionTxtURL = "$AzureFeed/aspnetcore/Runtime/$SpecificVersion/productVersion.txt"
489
- }
490
- elseif ($Runtime -eq "windowsdesktop") {
491
- # The windows desktop runtime is part of the core runtime layout prior to 5.0
492
- $ProductVersionTxtURL = "$AzureFeed/Runtime/$SpecificVersion/productVersion.txt"
493
- if ($SpecificVersion -match '^(\d+)\.(.*)')
494
- {
495
- $majorVersion = [int]$Matches[1]
496
- if ($majorVersion -ge 5)
497
- {
498
- $ProductVersionTxtURL = "$AzureFeed/WindowsDesktop/$SpecificVersion/productVersion.txt"
658
+ # Try to get the version number, using the productVersion.txt file located next to the installer file.
659
+ $ProductVersionTxtURLs = (Get-Product-Version-Url $AzureFeed $SpecificVersion $PackageDownloadLink -Flattened $true),
660
+ (Get-Product-Version-Url $AzureFeed $SpecificVersion $PackageDownloadLink -Flattened $false)
661
+
662
+ Foreach ($ProductVersionTxtURL in $ProductVersionTxtURLs) {
663
+ Say-Verbose "Checking for the existence of $ProductVersionTxtURL"
664
+
665
+ try {
666
+ $productVersionResponse = GetHTTPResponse($productVersionTxtUrl)
667
+
668
+ if ($productVersionResponse.StatusCode -eq 200) {
669
+ $productVersion = $productVersionResponse.Content.ReadAsStringAsync().Result.Trim()
670
+ if ($productVersion -ne $SpecificVersion)
671
+ {
672
+ Say "Using alternate version $productVersion found in $ProductVersionTxtURL"
673
+ }
674
+ return $productVersion
499
675
  }
676
+ else {
677
+ Say-Verbose "Got StatusCode $($productVersionResponse.StatusCode) when trying to get productVersion.txt at $productVersionTxtUrl."
678
+ }
679
+ }
680
+ catch {
681
+ Say-Verbose "Could not read productVersion.txt at $productVersionTxtUrl (Exception: '$($_.Exception.Message)'. )"
500
682
  }
501
683
  }
502
- elseif (-not $Runtime) {
503
- $ProductVersionTxtURL = "$AzureFeed/Sdk/$SpecificVersion/productVersion.txt"
504
- }
505
- else {
506
- throw "Invalid value '$Runtime' specified for `$Runtime"
684
+
685
+ # Getting the version number with productVersion.txt has failed. Try parsing the download link for a version number.
686
+ if ([string]::IsNullOrEmpty($PackageDownloadLink))
687
+ {
688
+ Say-Verbose "Using the default value '$SpecificVersion' as the product version."
689
+ return $SpecificVersion
507
690
  }
508
691
 
509
- Say-Verbose "Checking for existence of $ProductVersionTxtURL"
692
+ $productVersion = Get-ProductVersionFromDownloadLink $PackageDownloadLink $SpecificVersion
693
+ return $productVersion
694
+ }
510
695
 
511
- try {
512
- $productVersionResponse = GetHTTPResponse($productVersionTxtUrl)
696
+ function Get-Product-Version-Url([string]$AzureFeed, [string]$SpecificVersion, [string]$PackageDownloadLink, [bool]$Flattened) {
697
+ Say-Invocation $MyInvocation
513
698
 
514
- if ($productVersionResponse.StatusCode -eq 200) {
515
- $productVersion = $productVersionResponse.Content.ReadAsStringAsync().Result.Trim()
516
- if ($productVersion -ne $SpecificVersion)
517
- {
518
- Say "Using alternate version $productVersion found in $ProductVersionTxtURL"
519
- }
699
+ $majorVersion=$null
700
+ if ($SpecificVersion -match '^(\d+)\.(.*)') {
701
+ $majorVersion = $Matches[1] -as[int]
702
+ }
520
703
 
521
- return $productVersion
704
+ $pvFileName='productVersion.txt'
705
+ if($Flattened) {
706
+ if(-not $Runtime) {
707
+ $pvFileName='sdk-productVersion.txt'
708
+ }
709
+ elseif($Runtime -eq "dotnet") {
710
+ $pvFileName='runtime-productVersion.txt'
522
711
  }
523
712
  else {
524
- Say-Verbose "Got StatusCode $($productVersionResponse.StatusCode) trying to get productVersion.txt at $productVersionTxtUrl, so using default value of $SpecificVersion"
525
- $productVersion = $SpecificVersion
713
+ $pvFileName="$Runtime-productVersion.txt"
526
714
  }
527
- } catch {
528
- Say-Verbose "Could not read productVersion.txt at $productVersionTxtUrl, so using default value of $SpecificVersion (Exception: '$($_.Exception.Message)' )"
529
- $productVersion = $SpecificVersion
530
715
  }
531
716
 
532
- return $productVersion
717
+ if ([string]::IsNullOrEmpty($PackageDownloadLink)) {
718
+ if ($Runtime -eq "dotnet") {
719
+ $ProductVersionTxtURL = "$AzureFeed/Runtime/$SpecificVersion/$pvFileName"
720
+ }
721
+ elseif ($Runtime -eq "aspnetcore") {
722
+ $ProductVersionTxtURL = "$AzureFeed/aspnetcore/Runtime/$SpecificVersion/$pvFileName"
723
+ }
724
+ elseif ($Runtime -eq "windowsdesktop") {
725
+ # The windows desktop runtime is part of the core runtime layout prior to 5.0
726
+ $ProductVersionTxtURL = "$AzureFeed/Runtime/$SpecificVersion/$pvFileName"
727
+ if ($majorVersion -ne $null -and $majorVersion -ge 5) {
728
+ $ProductVersionTxtURL = "$AzureFeed/WindowsDesktop/$SpecificVersion/$pvFileName"
729
+ }
730
+ }
731
+ elseif (-not $Runtime) {
732
+ $ProductVersionTxtURL = "$AzureFeed/Sdk/$SpecificVersion/$pvFileName"
733
+ }
734
+ else {
735
+ throw "Invalid value '$Runtime' specified for `$Runtime"
736
+ }
737
+ }
738
+ else {
739
+ $ProductVersionTxtURL = $PackageDownloadLink.Substring(0, $PackageDownloadLink.LastIndexOf("/")) + "/$pvFileName"
740
+ }
741
+
742
+ Say-Verbose "Constructed productVersion link: $ProductVersionTxtURL"
743
+
744
+ return $ProductVersionTxtURL
745
+ }
746
+
747
+ function Get-ProductVersionFromDownloadLink([string]$PackageDownloadLink, [string]$SpecificVersion)
748
+ {
749
+ Say-Invocation $MyInvocation
750
+
751
+ #product specific version follows the product name
752
+ #for filename 'dotnet-sdk-3.1.404-win-x64.zip': the product version is 3.1.400
753
+ $filename = $PackageDownloadLink.Substring($PackageDownloadLink.LastIndexOf("/") + 1)
754
+ $filenameParts = $filename.Split('-')
755
+ if ($filenameParts.Length -gt 2)
756
+ {
757
+ $productVersion = $filenameParts[2]
758
+ Say-Verbose "Extracted product version '$productVersion' from download link '$PackageDownloadLink'."
759
+ }
760
+ else {
761
+ Say-Verbose "Using the default value '$SpecificVersion' as the product version."
762
+ $productVersion = $SpecificVersion
763
+ }
764
+ return $productVersion
533
765
  }
534
766
 
535
767
  function Get-User-Share-Path() {
@@ -567,7 +799,8 @@ function Get-Absolute-Path([string]$RelativeOrAbsolutePath) {
567
799
  }
568
800
 
569
801
  function Get-Path-Prefix-With-Version($path) {
570
- $match = [regex]::match($path, $VersionRegEx)
802
+ # example path with regex: shared/1.0.0-beta-12345/somepath
803
+ $match = [regex]::match($path, "/\d+\.\d+[^/]+/")
571
804
  if ($match.Success) {
572
805
  return $entry.FullName.Substring(0, $match.Index + $match.Length)
573
806
  }
@@ -581,7 +814,7 @@ function Get-List-Of-Directories-And-Versions-To-Unpack-From-Dotnet-Package([Sys
581
814
  $ret = @()
582
815
  foreach ($entry in $Zip.Entries) {
583
816
  $dir = Get-Path-Prefix-With-Version $entry.FullName
584
- if ($dir -ne $null) {
817
+ if ($null -ne $dir) {
585
818
  $path = Get-Absolute-Path $(Join-Path -Path $OutPath -ChildPath $dir)
586
819
  if (-Not (Test-Path $path -PathType Container)) {
587
820
  $ret += $dir
@@ -622,7 +855,7 @@ function Extract-Dotnet-Package([string]$ZipPath, [string]$OutPath) {
622
855
 
623
856
  foreach ($entry in $Zip.Entries) {
624
857
  $PathWithVersion = Get-Path-Prefix-With-Version $entry.FullName
625
- if (($PathWithVersion -eq $null) -Or ($DirectoriesToUnpack -contains $PathWithVersion)) {
858
+ if (($null -eq $PathWithVersion) -Or ($DirectoriesToUnpack -contains $PathWithVersion)) {
626
859
  $DestinationPath = Get-Absolute-Path $(Join-Path -Path $OutPath -ChildPath $entry.FullName)
627
860
  $DestinationDir = Split-Path -Parent $DestinationPath
628
861
  $OverrideFiles=$OverrideNonVersionedFiles -Or (-Not (Test-Path $DestinationPath))
@@ -633,8 +866,13 @@ function Extract-Dotnet-Package([string]$ZipPath, [string]$OutPath) {
633
866
  }
634
867
  }
635
868
  }
869
+ catch
870
+ {
871
+ Say-Error "Failed to extract package. Exception: $_"
872
+ throw;
873
+ }
636
874
  finally {
637
- if ($Zip -ne $null) {
875
+ if ($null -ne $Zip) {
638
876
  $Zip.Dispose()
639
877
  }
640
878
  }
@@ -654,40 +892,63 @@ function DownloadFile($Source, [string]$OutPath) {
654
892
  }
655
893
 
656
894
  $Stream = $null
657
-
895
+
658
896
  try {
659
897
  $Response = GetHTTPResponse -Uri $Source
660
898
  $Stream = $Response.Content.ReadAsStreamAsync().Result
661
899
  $File = [System.IO.File]::Create($OutPath)
662
900
  $Stream.CopyTo($File)
663
901
  $File.Close()
902
+
903
+ ValidateRemoteLocalFileSizes -LocalFileOutPath $OutPath -SourceUri $Source
664
904
  }
665
905
  finally {
666
- if ($Stream -ne $null) {
906
+ if ($null -ne $Stream) {
667
907
  $Stream.Dispose()
668
908
  }
669
909
  }
670
910
  }
671
911
 
912
+ function ValidateRemoteLocalFileSizes([string]$LocalFileOutPath, $SourceUri) {
913
+ try {
914
+ $remoteFileSize = Get-Remote-File-Size -zipUri $SourceUri
915
+ $fileSize = [long](Get-Item $LocalFileOutPath).Length
916
+ Say "Downloaded file $SourceUri size is $fileSize bytes."
917
+
918
+ if ((![string]::IsNullOrEmpty($remoteFileSize)) -and !([string]::IsNullOrEmpty($fileSize)) ) {
919
+ if ($remoteFileSize -ne $fileSize) {
920
+ Say "The remote and local file sizes are not equal. Remote file size is $remoteFileSize bytes and local size is $fileSize bytes. The local package may be corrupted."
921
+ }
922
+ else {
923
+ Say "The remote and local file sizes are equal."
924
+ }
925
+ }
926
+ else {
927
+ Say "Either downloaded or local package size can not be measured. One of them may be corrupted."
928
+ }
929
+ }
930
+ catch {
931
+ Say "Either downloaded or local package size can not be measured. One of them may be corrupted."
932
+ }
933
+ }
934
+
672
935
  function SafeRemoveFile($Path) {
673
936
  try {
674
937
  if (Test-Path $Path) {
675
938
  Remove-Item $Path
676
939
  Say-Verbose "The temporary file `"$Path`" was removed."
677
940
  }
678
- else
679
- {
941
+ else {
680
942
  Say-Verbose "The temporary file `"$Path`" does not exist, therefore is not removed."
681
943
  }
682
944
  }
683
- catch
684
- {
945
+ catch {
685
946
  Say-Warning "Failed to remove the temporary file: `"$Path`", remove it manually."
686
947
  }
687
948
  }
688
949
 
689
- function Prepend-Sdk-InstallRoot-To-Path([string]$InstallRoot, [string]$BinFolderRelativePath) {
690
- $BinPath = Get-Absolute-Path $(Join-Path -Path $InstallRoot -ChildPath $BinFolderRelativePath)
950
+ function Prepend-Sdk-InstallRoot-To-Path([string]$InstallRoot) {
951
+ $BinPath = Get-Absolute-Path $(Join-Path -Path $InstallRoot -ChildPath "")
691
952
  if (-Not $NoPath) {
692
953
  $SuffixedBinPath = "$BinPath;"
693
954
  if (-Not $env:path.Contains($SuffixedBinPath)) {
@@ -702,25 +963,12 @@ function Prepend-Sdk-InstallRoot-To-Path([string]$InstallRoot, [string]$BinFolde
702
963
  }
703
964
  }
704
965
 
705
- Say "Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:"
706
- Say "- The SDK needs to be installed without user interaction and without admin rights."
707
- Say "- The SDK installation doesn't need to persist across multiple CI runs."
708
- Say "To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.`r`n"
709
-
710
- $CLIArchitecture = Get-CLIArchitecture-From-Architecture $Architecture
711
- $SpecificVersion = Get-Specific-Version-From-Version -AzureFeed $AzureFeed -Channel $Channel -Version $Version -JSonFile $JSonFile
712
- $DownloadLink, $EffectiveVersion = Get-Download-Link -AzureFeed $AzureFeed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture
713
- $LegacyDownloadLink = Get-LegacyDownload-Link -AzureFeed $AzureFeed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture
714
-
715
- $InstallRoot = Resolve-Installation-Path $InstallDir
716
- Say-Verbose "InstallRoot: $InstallRoot"
717
- $ScriptName = $MyInvocation.MyCommand.Name
718
-
719
- if ($DryRun) {
966
+ function PrintDryRunOutput($Invocation, $DownloadLinks)
967
+ {
720
968
  Say "Payload URLs:"
721
- Say "Primary named payload URL: $DownloadLink"
722
- if ($LegacyDownloadLink) {
723
- Say "Legacy named payload URL: $LegacyDownloadLink"
969
+
970
+ for ($linkIndex=0; $linkIndex -lt $DownloadLinks.count; $linkIndex++) {
971
+ Say "URL #$linkIndex - $($DownloadLinks[$linkIndex].type): $($DownloadLinks[$linkIndex].downloadLink)"
724
972
  }
725
973
  $RepeatableCommand = ".\$ScriptName -Version `"$SpecificVersion`" -InstallDir `"$InstallRoot`" -Architecture `"$CLIArchitecture`""
726
974
  if ($Runtime -eq "dotnet") {
@@ -729,367 +977,608 @@ if ($DryRun) {
729
977
  elseif ($Runtime -eq "aspnetcore") {
730
978
  $RepeatableCommand+=" -Runtime `"aspnetcore`""
731
979
  }
732
- foreach ($key in $MyInvocation.BoundParameters.Keys) {
733
- if (-not (@("Architecture","Channel","DryRun","InstallDir","Runtime","SharedRuntime","Version") -contains $key)) {
734
- $RepeatableCommand+=" -$key `"$($MyInvocation.BoundParameters[$key])`""
980
+
981
+ foreach ($key in $Invocation.BoundParameters.Keys) {
982
+ if (-not (@("Architecture","Channel","DryRun","InstallDir","Runtime","SharedRuntime","Version","Quality","FeedCredential") -contains $key)) {
983
+ $RepeatableCommand+=" -$key `"$($Invocation.BoundParameters[$key])`""
735
984
  }
736
985
  }
986
+ if ($Invocation.BoundParameters.Keys -contains "FeedCredential") {
987
+ $RepeatableCommand+=" -FeedCredential `"<feedCredential>`""
988
+ }
737
989
  Say "Repeatable invocation: $RepeatableCommand"
738
990
  if ($SpecificVersion -ne $EffectiveVersion)
739
991
  {
740
992
  Say "NOTE: Due to finding a version manifest with this runtime, it would actually install with version '$EffectiveVersion'"
741
993
  }
742
-
743
- return
744
994
  }
745
995
 
746
- if ($Runtime -eq "dotnet") {
747
- $assetName = ".NET Core Runtime"
748
- $dotnetPackageRelativePath = "shared\Microsoft.NETCore.App"
749
- }
750
- elseif ($Runtime -eq "aspnetcore") {
751
- $assetName = "ASP.NET Core Runtime"
752
- $dotnetPackageRelativePath = "shared\Microsoft.AspNetCore.App"
753
- }
754
- elseif ($Runtime -eq "windowsdesktop") {
755
- $assetName = ".NET Core Windows Desktop Runtime"
756
- $dotnetPackageRelativePath = "shared\Microsoft.WindowsDesktop.App"
757
- }
758
- elseif (-not $Runtime) {
759
- $assetName = ".NET Core SDK"
760
- $dotnetPackageRelativePath = "sdk"
996
+ function Get-AkaMSDownloadLink([string]$Channel, [string]$Quality, [bool]$Internal, [string]$Product, [string]$Architecture) {
997
+ Say-Invocation $MyInvocation
998
+
999
+ #quality is not supported for LTS or STS channel
1000
+ if (![string]::IsNullOrEmpty($Quality) -and (@("LTS", "STS") -contains $Channel)) {
1001
+ $Quality = ""
1002
+ Say-Warning "Specifying quality for STS or LTS channel is not supported, the quality will be ignored."
1003
+ }
1004
+ Say-Verbose "Retrieving primary payload URL from aka.ms link for channel: '$Channel', quality: '$Quality' product: '$Product', os: 'win', architecture: '$Architecture'."
1005
+
1006
+ #construct aka.ms link
1007
+ $akaMsLink = "https://aka.ms/dotnet"
1008
+ if ($Internal) {
1009
+ $akaMsLink += "/internal"
1010
+ }
1011
+ $akaMsLink += "/$Channel"
1012
+ if (-not [string]::IsNullOrEmpty($Quality)) {
1013
+ $akaMsLink +="/$Quality"
1014
+ }
1015
+ $akaMsLink +="/$Product-win-$Architecture.zip"
1016
+ Say-Verbose "Constructed aka.ms link: '$akaMsLink'."
1017
+ $akaMsDownloadLink=$null
1018
+
1019
+ for ($maxRedirections = 9; $maxRedirections -ge 0; $maxRedirections--)
1020
+ {
1021
+ #get HTTP response
1022
+ #do not pass credentials as a part of the $akaMsLink and do not apply credentials in the GetHTTPResponse function
1023
+ #otherwise the redirect link would have credentials as well
1024
+ #it would result in applying credentials twice to the resulting link and thus breaking it, and in echoing credentials to the output as a part of redirect link
1025
+ $Response= GetHTTPResponse -Uri $akaMsLink -HeaderOnly $true -DisableRedirect $true -DisableFeedCredential $true
1026
+ Say-Verbose "Received response:`n$Response"
1027
+
1028
+ if ([string]::IsNullOrEmpty($Response)) {
1029
+ Say-Verbose "The link '$akaMsLink' is not valid: failed to get redirect location. The resource is not available."
1030
+ return $null
1031
+ }
1032
+
1033
+ #if HTTP code is 301 (Moved Permanently), the redirect link exists
1034
+ if ($Response.StatusCode -eq 301)
1035
+ {
1036
+ try {
1037
+ $akaMsDownloadLink = $Response.Headers.GetValues("Location")[0]
1038
+
1039
+ if ([string]::IsNullOrEmpty($akaMsDownloadLink)) {
1040
+ Say-Verbose "The link '$akaMsLink' is not valid: server returned 301 (Moved Permanently), but the headers do not contain the redirect location."
1041
+ return $null
1042
+ }
1043
+
1044
+ Say-Verbose "The redirect location retrieved: '$akaMsDownloadLink'."
1045
+ # This may yet be a link to another redirection. Attempt to retrieve the page again.
1046
+ $akaMsLink = $akaMsDownloadLink
1047
+ continue
1048
+ }
1049
+ catch {
1050
+ Say-Verbose "The link '$akaMsLink' is not valid: failed to get redirect location."
1051
+ return $null
1052
+ }
1053
+ }
1054
+ elseif ((($Response.StatusCode -lt 300) -or ($Response.StatusCode -ge 400)) -and (-not [string]::IsNullOrEmpty($akaMsDownloadLink)))
1055
+ {
1056
+ # Redirections have ended.
1057
+ return $akaMsDownloadLink
1058
+ }
1059
+
1060
+ Say-Verbose "The link '$akaMsLink' is not valid: failed to retrieve the redirection location."
1061
+ return $null
1062
+ }
1063
+
1064
+ Say-Verbose "Aka.ms links have redirected more than the maximum allowed redirections. This may be caused by a cyclic redirection of aka.ms links."
1065
+ return $null
1066
+
761
1067
  }
762
- else {
763
- throw "Invalid value for `$Runtime"
1068
+
1069
+ function Get-AkaMsLink-And-Version([string] $NormalizedChannel, [string] $NormalizedQuality, [bool] $Internal, [string] $ProductName, [string] $Architecture) {
1070
+ $AkaMsDownloadLink = Get-AkaMSDownloadLink -Channel $NormalizedChannel -Quality $NormalizedQuality -Internal $Internal -Product $ProductName -Architecture $Architecture
1071
+
1072
+ if ([string]::IsNullOrEmpty($AkaMsDownloadLink)){
1073
+ if (-not [string]::IsNullOrEmpty($NormalizedQuality)) {
1074
+ # if quality is specified - exit with error - there is no fallback approach
1075
+ Say-Error "Failed to locate the latest version in the channel '$NormalizedChannel' with '$NormalizedQuality' quality for '$ProductName', os: 'win', architecture: '$Architecture'."
1076
+ Say-Error "Refer to: https://aka.ms/dotnet-os-lifecycle for information on .NET Core support."
1077
+ throw "aka.ms link resolution failure"
1078
+ }
1079
+ Say-Verbose "Falling back to latest.version file approach."
1080
+ return ($null, $null, $null)
1081
+ }
1082
+ else {
1083
+ Say-Verbose "Retrieved primary named payload URL from aka.ms link: '$AkaMsDownloadLink'."
1084
+ Say-Verbose "Downloading using legacy url will not be attempted."
1085
+
1086
+ #get version from the path
1087
+ $pathParts = $AkaMsDownloadLink.Split('/')
1088
+ if ($pathParts.Length -ge 2) {
1089
+ $SpecificVersion = $pathParts[$pathParts.Length - 2]
1090
+ Say-Verbose "Version: '$SpecificVersion'."
1091
+ }
1092
+ else {
1093
+ Say-Error "Failed to extract the version from download link '$AkaMsDownloadLink'."
1094
+ return ($null, $null, $null)
1095
+ }
1096
+
1097
+ #retrieve effective (product) version
1098
+ $EffectiveVersion = Get-Product-Version -SpecificVersion $SpecificVersion -PackageDownloadLink $AkaMsDownloadLink
1099
+ Say-Verbose "Product version: '$EffectiveVersion'."
1100
+
1101
+ return ($AkaMsDownloadLink, $SpecificVersion, $EffectiveVersion);
1102
+ }
764
1103
  }
765
1104
 
766
- if ($SpecificVersion -ne $EffectiveVersion)
1105
+ function Get-Feeds-To-Use()
767
1106
  {
768
- Say "Performing installation checks for effective version: $EffectiveVersion"
769
- $SpecificVersion = $EffectiveVersion
1107
+ $feeds = @(
1108
+ "https://dotnetcli.azureedge.net/dotnet",
1109
+ "https://dotnetbuilds.azureedge.net/public"
1110
+ )
1111
+
1112
+ if (-not [string]::IsNullOrEmpty($AzureFeed)) {
1113
+ $feeds = @($AzureFeed)
1114
+ }
1115
+
1116
+ if ($NoCdn) {
1117
+ $feeds = @(
1118
+ "https://dotnetcli.blob.core.windows.net/dotnet",
1119
+ "https://dotnetbuilds.blob.core.windows.net/public"
1120
+ )
1121
+
1122
+ if (-not [string]::IsNullOrEmpty($UncachedFeed)) {
1123
+ $feeds = @($UncachedFeed)
1124
+ }
1125
+ }
1126
+
1127
+ return $feeds
770
1128
  }
771
1129
 
772
- # Check if the SDK version is already installed.
773
- $isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion
774
- if ($isAssetInstalled) {
775
- Say "$assetName version $SpecificVersion is already installed."
776
- Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot -BinFolderRelativePath $BinFolderRelativePath
777
- return
1130
+ function Resolve-AssetName-And-RelativePath([string] $Runtime) {
1131
+
1132
+ if ($Runtime -eq "dotnet") {
1133
+ $assetName = ".NET Core Runtime"
1134
+ $dotnetPackageRelativePath = "shared\Microsoft.NETCore.App"
1135
+ }
1136
+ elseif ($Runtime -eq "aspnetcore") {
1137
+ $assetName = "ASP.NET Core Runtime"
1138
+ $dotnetPackageRelativePath = "shared\Microsoft.AspNetCore.App"
1139
+ }
1140
+ elseif ($Runtime -eq "windowsdesktop") {
1141
+ $assetName = ".NET Core Windows Desktop Runtime"
1142
+ $dotnetPackageRelativePath = "shared\Microsoft.WindowsDesktop.App"
1143
+ }
1144
+ elseif (-not $Runtime) {
1145
+ $assetName = ".NET Core SDK"
1146
+ $dotnetPackageRelativePath = "sdk"
1147
+ }
1148
+ else {
1149
+ throw "Invalid value for `$Runtime"
1150
+ }
1151
+
1152
+ return ($assetName, $dotnetPackageRelativePath)
778
1153
  }
779
1154
 
780
- New-Item -ItemType Directory -Force -Path $InstallRoot | Out-Null
1155
+ function Prepare-Install-Directory {
1156
+ $diskSpaceWarning = "Failed to check the disk space. Installation will continue, but it may fail if you do not have enough disk space.";
1157
+
1158
+ if ($PSVersionTable.PSVersion.Major -lt 7) {
1159
+ Say-Verbose $diskSpaceWarning
1160
+ return
1161
+ }
1162
+
1163
+ New-Item -ItemType Directory -Force -Path $InstallRoot | Out-Null
781
1164
 
782
- $installDrive = $((Get-Item $InstallRoot).PSDrive.Name);
783
- $diskInfo = Get-PSDrive -Name $installDrive
784
- if ($diskInfo.Free / 1MB -le 100) {
785
- throw "There is not enough disk space on drive ${installDrive}:"
1165
+ $installDrive = $((Get-Item $InstallRoot -Force).PSDrive.Name);
1166
+ $diskInfo = $null
1167
+ try {
1168
+ $diskInfo = Get-PSDrive -Name $installDrive
1169
+ }
1170
+ catch {
1171
+ Say-Warning $diskSpaceWarning
1172
+ }
1173
+
1174
+ # The check is relevant for PS version >= 7, the result can be irrelevant for older versions. See https://github.com/PowerShell/PowerShell/issues/12442.
1175
+ if ( ($null -ne $diskInfo) -and ($diskInfo.Free / 1MB -le 100)) {
1176
+ throw "There is not enough disk space on drive ${installDrive}:"
1177
+ }
786
1178
  }
787
1179
 
788
- $ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName())
789
- Say-Verbose "Zip path: $ZipPath"
1180
+ if ($Help)
1181
+ {
1182
+ Get-Help $PSCommandPath -Examples
1183
+ exit
1184
+ }
790
1185
 
791
- $DownloadFailed = $false
1186
+ Say-Verbose "Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:"
1187
+ Say-Verbose "- The SDK needs to be installed without user interaction and without admin rights."
1188
+ Say-Verbose "- The SDK installation doesn't need to persist across multiple CI runs."
1189
+ Say-Verbose "To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.`r`n"
792
1190
 
793
- $PrimaryDownloadStatusCode = 0
794
- $LegacyDownloadStatusCode = 0
1191
+ if ($SharedRuntime -and (-not $Runtime)) {
1192
+ $Runtime = "dotnet"
1193
+ }
795
1194
 
796
- $PrimaryDownloadFailedMsg = ""
797
- $LegacyDownloadFailedMsg = ""
1195
+ $OverrideNonVersionedFiles = !$SkipNonVersionedFiles
798
1196
 
799
- Say "Downloading primary link $DownloadLink"
800
- try {
801
- DownloadFile -Source $DownloadLink -OutPath $ZipPath
1197
+ Measure-Action "Product discovery" {
1198
+ $script:CLIArchitecture = Get-CLIArchitecture-From-Architecture $Architecture
1199
+ $script:NormalizedQuality = Get-NormalizedQuality $Quality
1200
+ Say-Verbose "Normalized quality: '$NormalizedQuality'"
1201
+ $script:NormalizedChannel = Get-NormalizedChannel $Channel
1202
+ Say-Verbose "Normalized channel: '$NormalizedChannel'"
1203
+ $script:NormalizedProduct = Get-NormalizedProduct $Runtime
1204
+ Say-Verbose "Normalized product: '$NormalizedProduct'"
1205
+ $script:FeedCredential = ValidateFeedCredential $FeedCredential
802
1206
  }
803
- catch {
804
- if ($PSItem.Exception.Data.Contains("StatusCode")) {
805
- $PrimaryDownloadStatusCode = $PSItem.Exception.Data["StatusCode"]
806
- }
807
1207
 
808
- if ($PSItem.Exception.Data.Contains("ErrorMessage")) {
809
- $PrimaryDownloadFailedMsg = $PSItem.Exception.Data["ErrorMessage"]
810
- } else {
811
- $PrimaryDownloadFailedMsg = $PSItem.Exception.Message
812
- }
1208
+ $InstallRoot = Resolve-Installation-Path $InstallDir
1209
+ Say-Verbose "InstallRoot: $InstallRoot"
1210
+ $ScriptName = $MyInvocation.MyCommand.Name
1211
+ ($assetName, $dotnetPackageRelativePath) = Resolve-AssetName-And-RelativePath -Runtime $Runtime
813
1212
 
814
- if ($PrimaryDownloadStatusCode -eq 404) {
815
- Say "The resource at $DownloadLink is not available."
816
- } else {
817
- Say $PSItem.Exception.Message
818
- }
1213
+ $feeds = Get-Feeds-To-Use
1214
+ $DownloadLinks = @()
819
1215
 
820
- SafeRemoveFile -Path $ZipPath
1216
+ if ($Version.ToLowerInvariant() -ne "latest" -and -not [string]::IsNullOrEmpty($Quality)) {
1217
+ throw "Quality and Version options are not allowed to be specified simultaneously. See https:// learn.microsoft.com/dotnet/core/tools/dotnet-install-script#options for details."
1218
+ }
821
1219
 
822
- if ($LegacyDownloadLink) {
823
- $DownloadLink = $LegacyDownloadLink
824
- $ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName())
825
- Say-Verbose "Legacy zip path: $ZipPath"
826
- Say "Downloading legacy link $DownloadLink"
827
- try {
828
- DownloadFile -Source $DownloadLink -OutPath $ZipPath
829
- }
830
- catch {
831
- if ($PSItem.Exception.Data.Contains("StatusCode")) {
832
- $LegacyDownloadStatusCode = $PSItem.Exception.Data["StatusCode"]
1220
+ # aka.ms links can only be used if the user did not request a specific version via the command line or a global.json file.
1221
+ if ([string]::IsNullOrEmpty($JSonFile) -and ($Version -eq "latest")) {
1222
+ ($DownloadLink, $SpecificVersion, $EffectiveVersion) = Get-AkaMsLink-And-Version $NormalizedChannel $NormalizedQuality $Internal $NormalizedProduct $CLIArchitecture
1223
+
1224
+ if ($null -ne $DownloadLink) {
1225
+ $DownloadLinks += New-Object PSObject -Property @{downloadLink="$DownloadLink";specificVersion="$SpecificVersion";effectiveVersion="$EffectiveVersion";type='aka.ms'}
1226
+ Say-Verbose "Generated aka.ms link $DownloadLink with version $EffectiveVersion"
1227
+
1228
+ if (-Not $DryRun) {
1229
+ Say-Verbose "Checking if the version $EffectiveVersion is already installed"
1230
+ if (Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $EffectiveVersion)
1231
+ {
1232
+ Say "$assetName with version '$EffectiveVersion' is already installed."
1233
+ Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot
1234
+ return
833
1235
  }
1236
+ }
1237
+ }
1238
+ }
834
1239
 
835
- if ($PSItem.Exception.Data.Contains("ErrorMessage")) {
836
- $LegacyDownloadFailedMsg = $PSItem.Exception.Data["ErrorMessage"]
837
- } else {
838
- $LegacyDownloadFailedMsg = $PSItem.Exception.Message
1240
+ # Primary and legacy links cannot be used if a quality was specified.
1241
+ # If we already have an aka.ms link, no need to search the blob feeds.
1242
+ if ([string]::IsNullOrEmpty($NormalizedQuality) -and 0 -eq $DownloadLinks.count)
1243
+ {
1244
+ foreach ($feed in $feeds) {
1245
+ try {
1246
+ $SpecificVersion = Get-Specific-Version-From-Version -AzureFeed $feed -Channel $Channel -Version $Version -JSonFile $JSonFile
1247
+ $DownloadLink, $EffectiveVersion = Get-Download-Link -AzureFeed $feed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture
1248
+ $LegacyDownloadLink = Get-LegacyDownload-Link -AzureFeed $feed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture
1249
+
1250
+ $DownloadLinks += New-Object PSObject -Property @{downloadLink="$DownloadLink";specificVersion="$SpecificVersion";effectiveVersion="$EffectiveVersion";type='primary'}
1251
+ Say-Verbose "Generated primary link $DownloadLink with version $EffectiveVersion"
1252
+
1253
+ if (-not [string]::IsNullOrEmpty($LegacyDownloadLink)) {
1254
+ $DownloadLinks += New-Object PSObject -Property @{downloadLink="$LegacyDownloadLink";specificVersion="$SpecificVersion";effectiveVersion="$EffectiveVersion";type='legacy'}
1255
+ Say-Verbose "Generated legacy link $LegacyDownloadLink with version $EffectiveVersion"
839
1256
  }
840
-
841
- if ($LegacyDownloadStatusCode -eq 404) {
842
- Say "The resource at $DownloadLink is not available."
843
- } else {
844
- Say $PSItem.Exception.Message
1257
+
1258
+ if (-Not $DryRun) {
1259
+ Say-Verbose "Checking if the version $EffectiveVersion is already installed"
1260
+ if (Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $EffectiveVersion)
1261
+ {
1262
+ Say "$assetName with version '$EffectiveVersion' is already installed."
1263
+ Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot
1264
+ return
1265
+ }
845
1266
  }
846
-
847
- SafeRemoveFile -Path $ZipPath
848
- $DownloadFailed = $true
1267
+ }
1268
+ catch
1269
+ {
1270
+ Say-Verbose "Failed to acquire download links from feed $feed. Exception: $_"
849
1271
  }
850
1272
  }
851
- else {
852
- $DownloadFailed = $true
853
- }
854
1273
  }
855
1274
 
856
- if ($DownloadFailed) {
857
- if (($PrimaryDownloadStatusCode -eq 404) -and ((-not $LegacyDownloadLink) -or ($LegacyDownloadStatusCode -eq 404))) {
858
- throw "Could not find `"$assetName`" with version = $SpecificVersion`nRefer to: https://aka.ms/dotnet-os-lifecycle for information on .NET Core support"
859
- } else {
860
- # 404-NotFound is an expected response if it goes from only one of the links, do not show that error.
861
- # If primary path is available (not 404-NotFound) then show the primary error else show the legacy error.
862
- if ($PrimaryDownloadStatusCode -ne 404) {
863
- throw "Could not download `"$assetName`" with version = $SpecificVersion`r`n$PrimaryDownloadFailedMsg"
1275
+ if ($DownloadLinks.count -eq 0) {
1276
+ throw "Failed to resolve the exact version number."
1277
+ }
1278
+
1279
+ if ($DryRun) {
1280
+ PrintDryRunOutput $MyInvocation $DownloadLinks
1281
+ return
1282
+ }
1283
+
1284
+ Measure-Action "Installation directory preparation" { Prepare-Install-Directory }
1285
+
1286
+ Say-Verbose "Zip path: $ZipPath"
1287
+
1288
+ $DownloadSucceeded = $false
1289
+ $DownloadedLink = $null
1290
+ $ErrorMessages = @()
1291
+
1292
+ foreach ($link in $DownloadLinks)
1293
+ {
1294
+ Say-Verbose "Downloading `"$($link.type)`" link $($link.downloadLink)"
1295
+
1296
+ try {
1297
+ Measure-Action "Package download" { DownloadFile -Source $link.downloadLink -OutPath $ZipPath }
1298
+ Say-Verbose "Download succeeded."
1299
+ $DownloadSucceeded = $true
1300
+ $DownloadedLink = $link
1301
+ break
1302
+ }
1303
+ catch {
1304
+ $StatusCode = $null
1305
+ $ErrorMessage = $null
1306
+
1307
+ if ($PSItem.Exception.Data.Contains("StatusCode")) {
1308
+ $StatusCode = $PSItem.Exception.Data["StatusCode"]
864
1309
  }
865
- if (($LegacyDownloadLink) -and ($LegacyDownloadStatusCode -ne 404)) {
866
- throw "Could not download `"$assetName`" with version = $SpecificVersion`r`n$LegacyDownloadFailedMsg"
1310
+
1311
+ if ($PSItem.Exception.Data.Contains("ErrorMessage")) {
1312
+ $ErrorMessage = $PSItem.Exception.Data["ErrorMessage"]
1313
+ } else {
1314
+ $ErrorMessage = $PSItem.Exception.Message
867
1315
  }
868
- throw "Could not download `"$assetName`" with version = $SpecificVersion"
1316
+
1317
+ Say-Verbose "Download failed with status code $StatusCode. Error message: $ErrorMessage"
1318
+ $ErrorMessages += "Downloading from `"$($link.type)`" link has failed with error:`nUri: $($link.downloadLink)`nStatusCode: $StatusCode`nError: $ErrorMessage"
869
1319
  }
1320
+
1321
+ # This link failed. Clean up before trying the next one.
1322
+ SafeRemoveFile -Path $ZipPath
870
1323
  }
871
1324
 
872
- Say "Extracting zip from $DownloadLink"
873
- Extract-Dotnet-Package -ZipPath $ZipPath -OutPath $InstallRoot
1325
+ if (-not $DownloadSucceeded) {
1326
+ foreach ($ErrorMessage in $ErrorMessages) {
1327
+ Say-Error $ErrorMessages
1328
+ }
1329
+
1330
+ throw "Could not find `"$assetName`" with version = $($DownloadLinks[0].effectiveVersion)`nRefer to: https://aka.ms/dotnet-os-lifecycle for information on .NET support"
1331
+ }
1332
+
1333
+ Say "Extracting the archive."
1334
+ Measure-Action "Package extraction" { Extract-Dotnet-Package -ZipPath $ZipPath -OutPath $InstallRoot }
874
1335
 
875
1336
  # Check if the SDK version is installed; if not, fail the installation.
876
1337
  $isAssetInstalled = $false
877
1338
 
878
1339
  # if the version contains "RTM" or "servicing"; check if a 'release-type' SDK version is installed.
879
- if ($SpecificVersion -Match "rtm" -or $SpecificVersion -Match "servicing") {
880
- $ReleaseVersion = $SpecificVersion.Split("-")[0]
1340
+ if ($DownloadedLink.effectiveVersion -Match "rtm" -or $DownloadedLink.effectiveVersion -Match "servicing") {
1341
+ $ReleaseVersion = $DownloadedLink.effectiveVersion.Split("-")[0]
881
1342
  Say-Verbose "Checking installation: version = $ReleaseVersion"
882
1343
  $isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $ReleaseVersion
883
1344
  }
884
1345
 
885
1346
  # Check if the SDK version is installed.
886
1347
  if (!$isAssetInstalled) {
887
- Say-Verbose "Checking installation: version = $SpecificVersion"
888
- $isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion
1348
+ Say-Verbose "Checking installation: version = $($DownloadedLink.effectiveVersion)"
1349
+ $isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $DownloadedLink.effectiveVersion
889
1350
  }
890
1351
 
891
1352
  # Version verification failed. More likely something is wrong either with the downloaded content or with the verification algorithm.
892
1353
  if (!$isAssetInstalled) {
893
- Say-Error "Failed to verify the version of installed `"$assetName`".`nInstallation source: $DownloadLink.`nInstallation location: $InstallRoot.`nReport the bug at https://github.com/dotnet/install-scripts/issues."
894
- throw "`"$assetName`" with version = $SpecificVersion failed to install with an unknown error."
1354
+ Say-Error "Failed to verify the version of installed `"$assetName`".`nInstallation source: $($DownloadedLink.downloadLink).`nInstallation location: $InstallRoot.`nReport the bug at https://github.com/dotnet/install-scripts/issues."
1355
+ throw "`"$assetName`" with version = $($DownloadedLink.effectiveVersion) failed to install with an unknown error."
895
1356
  }
896
1357
 
897
- SafeRemoveFile -Path $ZipPath
1358
+ if (-not $KeepZip) {
1359
+ SafeRemoveFile -Path $ZipPath
1360
+ }
898
1361
 
899
- Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot -BinFolderRelativePath $BinFolderRelativePath
1362
+ Measure-Action "Setting up shell environment" { Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot }
900
1363
 
901
1364
  Say "Note that the script does not resolve dependencies during installation."
902
- Say "To check the list of dependencies, go to https://docs.microsoft.com/dotnet/core/install/windows#dependencies"
1365
+ Say "To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install/windows#dependencies"
1366
+ Say "Installed version is $($DownloadedLink.effectiveVersion)"
903
1367
  Say "Installation finished"
904
1368
  # SIG # Begin signature block
905
- # MIIjjwYJKoZIhvcNAQcCoIIjgDCCI3wCAQExDzANBglghkgBZQMEAgEFADB5Bgor
1369
+ # MIIoLAYJKoZIhvcNAQcCoIIoHTCCKBkCAQExDzANBglghkgBZQMEAgEFADB5Bgor
906
1370
  # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
907
- # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCNsnhcJvx/hXmM
908
- # w8KjuvvIMDBFonhg9XJFc1QwfTyH4aCCDYEwggX/MIID56ADAgECAhMzAAABh3IX
909
- # chVZQMcJAAAAAAGHMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
1371
+ # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAcjJpspXTX0Wfr
1372
+ # XrmBKKJAMp5FGvSyRcbMwr8jAJ2D2qCCDXYwggX0MIID3KADAgECAhMzAAADrzBA
1373
+ # DkyjTQVBAAAAAAOvMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
910
1374
  # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
911
1375
  # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
912
- # bmcgUENBIDIwMTEwHhcNMjAwMzA0MTgzOTQ3WhcNMjEwMzAzMTgzOTQ3WjB0MQsw
1376
+ # bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwOTAwWhcNMjQxMTE0MTkwOTAwWjB0MQsw
913
1377
  # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
914
1378
  # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
915
1379
  # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
916
- # AQDOt8kLc7P3T7MKIhouYHewMFmnq8Ayu7FOhZCQabVwBp2VS4WyB2Qe4TQBT8aB
917
- # znANDEPjHKNdPT8Xz5cNali6XHefS8i/WXtF0vSsP8NEv6mBHuA2p1fw2wB/F0dH
918
- # sJ3GfZ5c0sPJjklsiYqPw59xJ54kM91IOgiO2OUzjNAljPibjCWfH7UzQ1TPHc4d
919
- # weils8GEIrbBRb7IWwiObL12jWT4Yh71NQgvJ9Fn6+UhD9x2uk3dLj84vwt1NuFQ
920
- # itKJxIV0fVsRNR3abQVOLqpDugbr0SzNL6o8xzOHL5OXiGGwg6ekiXA1/2XXY7yV
921
- # Fc39tledDtZjSjNbex1zzwSXAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE
922
- # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUhov4ZyO96axkJdMjpzu2zVXOJcsw
923
- # UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1
924
- # ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDU4Mzg1MB8GA1UdIwQYMBaAFEhu
925
- # ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu
926
- # bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w
927
- # Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3
928
- # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx
929
- # MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAixmy
930
- # S6E6vprWD9KFNIB9G5zyMuIjZAOuUJ1EK/Vlg6Fb3ZHXjjUwATKIcXbFuFC6Wr4K
931
- # NrU4DY/sBVqmab5AC/je3bpUpjtxpEyqUqtPc30wEg/rO9vmKmqKoLPT37svc2NV
932
- # BmGNl+85qO4fV/w7Cx7J0Bbqk19KcRNdjt6eKoTnTPHBHlVHQIHZpMxacbFOAkJr
933
- # qAVkYZdz7ikNXTxV+GRb36tC4ByMNxE2DF7vFdvaiZP0CVZ5ByJ2gAhXMdK9+usx
934
- # zVk913qKde1OAuWdv+rndqkAIm8fUlRnr4saSCg7cIbUwCCf116wUJ7EuJDg0vHe
935
- # yhnCeHnBbyH3RZkHEi2ofmfgnFISJZDdMAeVZGVOh20Jp50XBzqokpPzeZ6zc1/g
936
- # yILNyiVgE+RPkjnUQshd1f1PMgn3tns2Cz7bJiVUaqEO3n9qRFgy5JuLae6UweGf
937
- # AeOo3dgLZxikKzYs3hDMaEtJq8IP71cX7QXe6lnMmXU/Hdfz2p897Zd+kU+vZvKI
938
- # 3cwLfuVQgK2RZ2z+Kc3K3dRPz2rXycK5XCuRZmvGab/WbrZiC7wJQapgBodltMI5
939
- # GMdFrBg9IeF7/rP4EqVQXeKtevTlZXjpuNhhjuR+2DMt/dWufjXpiW91bo3aH6Ea
940
- # jOALXmoxgltCp1K7hrS6gmsvj94cLRf50QQ4U8Qwggd6MIIFYqADAgECAgphDpDS
941
- # AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK
942
- # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
943
- # IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0
944
- # ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla
945
- # MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
946
- # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT
947
- # H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB
948
- # AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG
949
- # OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S
950
- # 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz
951
- # y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7
952
- # 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u
953
- # M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33
954
- # X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl
955
- # XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP
956
- # 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB
957
- # l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF
958
- # RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM
959
- # CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ
960
- # BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud
961
- # DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO
962
- # 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0
963
- # LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y
964
- # Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p
965
- # Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y
966
- # Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB
967
- # FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw
968
- # cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA
969
- # XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY
970
- # 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj
971
- # 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd
972
- # d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ
973
- # Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf
974
- # wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ
975
- # aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j
976
- # NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B
977
- # xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96
978
- # eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7
979
- # r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I
980
- # RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIVZDCCFWACAQEwgZUwfjELMAkG
981
- # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
982
- # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z
983
- # b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAYdyF3IVWUDHCQAAAAABhzAN
984
- # BglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor
985
- # BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgpT/bxWwe
986
- # aW0EinKMWCAzDXUjwXkIHldYzR6lw4/1Pc0wQgYKKwYBBAGCNwIBDDE0MDKgFIAS
987
- # AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN
988
- # BgkqhkiG9w0BAQEFAASCAQCHd7sSQVq0YDg8QDx6/kLWn3s6jtvvIDCCgsO9spHM
989
- # quPd4FPbG67DCsKDClekQs52qrtRO3Zo+JMnCw4j3bS+gZHzeJr2shbftOrpsFoD
990
- # l7OPcUmtrqul9dkQCOp8t0MP3ls0n96/YyNy6lz4BAlTdkdDx957uAxalKaCIBzb
991
- # R9QyppOKIfNFvwD4EI5KI6tpmSy/uH8SrRg7ZExAYZl6J6R18WkL7KHn649lPoAQ
992
- # ujwrIXH10xOJops45ILGzKWQcHmCzLJGYapL4VHUuK+73nT+9ZROGHdk/PyvIcdw
993
- # iERa+C06v305t3DA+CuHFy1tvyw7IFF6RVbLZPwxrJjToYIS7jCCEuoGCisGAQQB
994
- # gjcDAwExghLaMIIS1gYJKoZIhvcNAQcCoIISxzCCEsMCAQMxDzANBglghkgBZQME
995
- # AgEFADCCAVUGCyqGSIb3DQEJEAEEoIIBRASCAUAwggE8AgEBBgorBgEEAYRZCgMB
996
- # MDEwDQYJYIZIAWUDBAIBBQAEIOCaTmvM1AP0WaEVqzKaaCu/R+bTlR4kCrM/ZXsb
997
- # /eNOAgZgGeLsMwsYEzIwMjEwMjAzMjExNzQ5LjU5MVowBIACAfSggdSkgdEwgc4x
998
- # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
999
- # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1p
1000
- # Y3Jvc29mdCBPcGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMg
1001
- # VFNTIEVTTjo4OTdBLUUzNTYtMTcwMTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUt
1002
- # U3RhbXAgU2VydmljZaCCDkEwggT1MIID3aADAgECAhMzAAABLCKvRZd1+RvuAAAA
1003
- # AAEsMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
1004
- # aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
1005
- # cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEw
1006
- # MB4XDTE5MTIxOTAxMTUwM1oXDTIxMDMxNzAxMTUwM1owgc4xCzAJBgNVBAYTAlVT
1380
+ # AQDOS8s1ra6f0YGtg0OhEaQa/t3Q+q1MEHhWJhqQVuO5amYXQpy8MDPNoJYk+FWA
1381
+ # hePP5LxwcSge5aen+f5Q6WNPd6EDxGzotvVpNi5ve0H97S3F7C/axDfKxyNh21MG
1382
+ # 0W8Sb0vxi/vorcLHOL9i+t2D6yvvDzLlEefUCbQV/zGCBjXGlYJcUj6RAzXyeNAN
1383
+ # xSpKXAGd7Fh+ocGHPPphcD9LQTOJgG7Y7aYztHqBLJiQQ4eAgZNU4ac6+8LnEGAL
1384
+ # go1ydC5BJEuJQjYKbNTy959HrKSu7LO3Ws0w8jw6pYdC1IMpdTkk2puTgY2PDNzB
1385
+ # tLM4evG7FYer3WX+8t1UMYNTAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
1386
+ # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQURxxxNPIEPGSO8kqz+bgCAQWGXsEw
1387
+ # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
1388
+ # MBQGA1UEBRMNMjMwMDEyKzUwMTgyNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
1389
+ # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
1390
+ # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
1391
+ # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
1392
+ # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
1393
+ # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAISxFt/zR2frTFPB45Yd
1394
+ # mhZpB2nNJoOoi+qlgcTlnO4QwlYN1w/vYwbDy/oFJolD5r6FMJd0RGcgEM8q9TgQ
1395
+ # 2OC7gQEmhweVJ7yuKJlQBH7P7Pg5RiqgV3cSonJ+OM4kFHbP3gPLiyzssSQdRuPY
1396
+ # 1mIWoGg9i7Y4ZC8ST7WhpSyc0pns2XsUe1XsIjaUcGu7zd7gg97eCUiLRdVklPmp
1397
+ # XobH9CEAWakRUGNICYN2AgjhRTC4j3KJfqMkU04R6Toyh4/Toswm1uoDcGr5laYn
1398
+ # TfcX3u5WnJqJLhuPe8Uj9kGAOcyo0O1mNwDa+LhFEzB6CB32+wfJMumfr6degvLT
1399
+ # e8x55urQLeTjimBQgS49BSUkhFN7ois3cZyNpnrMca5AZaC7pLI72vuqSsSlLalG
1400
+ # OcZmPHZGYJqZ0BacN274OZ80Q8B11iNokns9Od348bMb5Z4fihxaBWebl8kWEi2O
1401
+ # PvQImOAeq3nt7UWJBzJYLAGEpfasaA3ZQgIcEXdD+uwo6ymMzDY6UamFOfYqYWXk
1402
+ # ntxDGu7ngD2ugKUuccYKJJRiiz+LAUcj90BVcSHRLQop9N8zoALr/1sJuwPrVAtx
1403
+ # HNEgSW+AKBqIxYWM4Ev32l6agSUAezLMbq5f3d8x9qzT031jMDT+sUAoCw0M5wVt
1404
+ # CUQcqINPuYjbS1WgJyZIiEkBMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
1405
+ # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
1406
+ # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
1407
+ # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
1408
+ # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG
1409
+ # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
1410
+ # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg
1411
+ # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
1412
+ # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03
1413
+ # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr
1414
+ # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg
1415
+ # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy
1416
+ # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9
1417
+ # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh
1418
+ # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k
1419
+ # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB
1420
+ # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn
1421
+ # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90
1422
+ # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w
1423
+ # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o
1424
+ # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD
1425
+ # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa
1426
+ # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny
1427
+ # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG
1428
+ # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
1429
+ # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV
1430
+ # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3
1431
+ # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG
1432
+ # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl
1433
+ # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb
1434
+ # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l
1435
+ # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6
1436
+ # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0
1437
+ # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560
1438
+ # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam
1439
+ # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa
1440
+ # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah
1441
+ # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA
1442
+ # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt
1443
+ # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr
1444
+ # /Xmfwb1tbWrJUnMTDXpQzTGCGgwwghoIAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
1445
+ # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
1446
+ # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
1447
+ # Z25pbmcgUENBIDIwMTECEzMAAAOvMEAOTKNNBUEAAAAAA68wDQYJYIZIAWUDBAIB
1448
+ # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
1449
+ # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEILE0f3lJHQgU2RZWXUC1oqZH
1450
+ # SyMVCuT1h5mXGiSSjTDHMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
1451
+ # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
1452
+ # BQAEggEANxDFgCiCDFasXK4jelzA8ed3cn/ZebTOsL/D/5LQTgwhbjtfp1Dp7awF
1453
+ # 8vESgjYXq22XMBz5vV12f2f14XzxG1kW17bP9OR+D2C3GUlN2xQstIhslXJRKVwi
1454
+ # lpFqHGFKy8o6sssvdrtsatlfrtC+ZChbQ1nyJmYWiCotVTwoi6UMA3EiXfQ/6KGo
1455
+ # o8MykKgtMWaolI63lITY2EWtUowSgg7IToyrZEYOH3p45F3Rb3mfVl5GE9u8BPBZ
1456
+ # WyZ3JZPojeJZPBwoh746RijTpga+MIPTLMT5/pyEFF37XoTfKy+pmIy2g27fGF0f
1457
+ # dUTMVnaeP3Gsz/QoRIYGwRZHxPIn06GCF5YwgheSBgorBgEEAYI3AwMBMYIXgjCC
1458
+ # F34GCSqGSIb3DQEHAqCCF28wghdrAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFRBgsq
1459
+ # hkiG9w0BCRABBKCCAUAEggE8MIIBOAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
1460
+ # AwQCAQUABCDsnfXLdwRAAmajQ5qXHFhiKlkumRT841LqpvZZhWG0uwIGZbwTAVg6
1461
+ # GBIyMDI0MDIxNDIxMTUyNS45OVowBIACAfSggdGkgc4wgcsxCzAJBgNVBAYTAlVT
1007
1462
  # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
1008
- # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVy
1009
- # YXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjo4OTdB
1010
- # LUUzNTYtMTcwMTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vydmlj
1011
- # ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPK1zgSSq+MxAYo3qpCt
1012
- # QDxSMPPJy6mm/wfEJNjNUnYtLFBwl1BUS5trEk/t41ldxITKehs+ABxYqo4Qxsg3
1013
- # Gy1ugKiwHAnYiiekfC+ZhptNFgtnDZIn45zC0AlVr/6UfLtsLcHCh1XElLUHfEC0
1014
- # nBuQcM/SpYo9e3l1qY5NdMgDGxCsmCKdiZfYXIu+U0UYIBhdzmSHnB3fxZOBVcr5
1015
- # htFHEBBNt/rFJlm/A4yb8oBsp+Uf0p5QwmO/bCcdqB15JpylOhZmWs0sUfJKlK9E
1016
- # rAhBwGki2eIRFKsQBdkXS9PWpF1w2gIJRvSkDEaCf+lbGTPdSzHSbfREWOF9wY3i
1017
- # Yj8CAwEAAaOCARswggEXMB0GA1UdDgQWBBRRahZSGfrCQhCyIyGH9DkiaW7L0zAf
1018
- # BgNVHSMEGDAWgBTVYzpcijGQ80N7fEYbxTNoWoVtVTBWBgNVHR8ETzBNMEugSaBH
1019
- # hkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNU
1020
- # aW1TdGFQQ0FfMjAxMC0wNy0wMS5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUF
1021
- # BzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1RpbVN0
1022
- # YVBDQV8yMDEwLTA3LTAxLmNydDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsG
1023
- # AQUFBwMIMA0GCSqGSIb3DQEBCwUAA4IBAQBPFxHIwi4vAH49w9Svmz6K3tM55RlW
1024
- # 5pPeULXdut2Rqy6Ys0+VpZsbuaEoxs6Z1C3hMbkiqZFxxyltxJpuHTyGTg61zfNI
1025
- # F5n6RsYF3s7IElDXNfZznF1/2iWc6uRPZK8rxxUJ/7emYXZCYwuUY0XjsCpP9pbR
1026
- # RKeJi6r5arSyI+NfKxvgoM21JNt1BcdlXuAecdd/k8UjxCscffanoK2n6LFw1PcZ
1027
- # lEO7NId7o+soM2C0QY5BYdghpn7uqopB6ixyFIIkDXFub+1E7GmAEwfU6VwEHL7y
1028
- # 9rNE8bd+JrQs+yAtkkHy9FmXg/PsGq1daVzX1So7CJ6nyphpuHSN3VfTMIIGcTCC
1029
- # BFmgAwIBAgIKYQmBKgAAAAAAAjANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMC
1030
- # VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV
1031
- # BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJv
1032
- # b3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMTAwNzAxMjEzNjU1WhcN
1033
- # MjUwNzAxMjE0NjU1WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
1034
- # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
1035
- # aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCCASIw
1036
- # DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkdDbx3EYo6IOz8E5f1+n9plGt0
1037
- # VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5mK1vwFVMnBDEfQRsalR3OCROOfGEwWbEw
1038
- # RA/xYIiEVEMM1024OAizQt2TrNZzMFcmgqNFDdDq9UeBzb8kYDJYYEbyWEeGMoQe
1039
- # dGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5hoC732H8RsEnHSRnEnIaIYqvS2SJUGKx
1040
- # Xf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/VmwAOWRH7v0Ev9buWayrGo8noqCjHw2k4G
1041
- # kbaICDXoeByw6ZnNPOcvRLqn9NxkvaQBwSAJk3jN/LzAyURdXhacAQVPIk0CAwEA
1042
- # AaOCAeYwggHiMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTVYzpcijGQ80N7
1043
- # fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMC
1044
- # AYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvX
1045
- # zpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20v
1046
- # cGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYI
1047
- # KwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5j
1048
- # b20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDCBoAYDVR0g
1049
- # AQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMwgYEwPQYIKwYBBQUHAgEWMWh0dHA6Ly93
1050
- # d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9jcy9DUFMvZGVmYXVsdC5odG0wQAYIKwYB
1051
- # BQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AUABvAGwAaQBjAHkAXwBTAHQAYQB0AGUA
1052
- # bQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAAfmiFEN4sbgmD+BcQM9naOh
1053
- # IW+z66bM9TG+zwXiqf76V20ZMLPCxWbJat/15/B4vceoniXj+bzta1RXCCtRgkQS
1054
- # +7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1mCRWS3TvQhDIr79/xn/yN31aPxzymXlK
1055
- # kVIArzgPF/UveYFl2am1a+THzvbKegBvSzBEJCI8z+0DpZaPWSm8tv0E4XCfMkon
1056
- # /VWvL/625Y4zu2JfmttXQOnxzplmkIz/amJ/3cVKC5Em4jnsGUpxY517IW3DnKOi
1057
- # PPp/fZZqkHimbdLhnPkd/DjYlPTGpQqWhqS9nhquBEKDuLWAmyI4ILUl5WTs9/S/
1058
- # fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua2A5HmoDF0M2n0O99g/DhO3EJ3110mCII
1059
- # YdqwUB5vvfHhAN/nMQekkzr3ZUd46PioSKv33nJ+YWtvd6mBy6cJrDm77MbL2IK0
1060
- # cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqHczsI5pgt6o3gMy4SKfXAL1QnIffIrE7a
1061
- # KLixqduWsqdCosnPGUFN4Ib5KpqjEWYw07t0MkvfY3v1mYovG8chr1m1rtxEPJdQ
1062
- # cdeh0sVV42neV8HR3jDA/czmTfsNv11P6Z0eGTgvvM9YBS7vDaBQNdrvCScc1bN+
1063
- # NR4Iuto229Nfj950iEkSoYICzzCCAjgCAQEwgfyhgdSkgdEwgc4xCzAJBgNVBAYT
1064
- # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
1065
- # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKTAnBgNVBAsTIE1pY3Jvc29mdCBP
1066
- # cGVyYXRpb25zIFB1ZXJ0byBSaWNvMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjo4
1067
- # OTdBLUUzNTYtMTcwMTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy
1068
- # dmljZaIjCgEBMAcGBSsOAwIaAxUADE5OKSMoNx/mYxYWap1RTOohbJ2ggYMwgYCk
1069
- # fjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
1070
- # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD
1071
- # Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQUFAAIF
1072
- # AOPFChkwIhgPMjAyMTAyMDMxNTQwMDlaGA8yMDIxMDIwNDE1NDAwOVowdDA6Bgor
1073
- # BgEEAYRZCgQBMSwwKjAKAgUA48UKGQIBADAHAgEAAgIXmDAHAgEAAgIRyTAKAgUA
1074
- # 48ZbmQIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAID
1075
- # B6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBBQUAA4GBAHeeznL2n6HWCjHH94Fl
1076
- # hcdW6TEXzq4XNgp1Gx1W9F8gJ4x+SwoV7elJZkwgGffcpHomLvIY/VSuzsl1NgtJ
1077
- # TWM2UxoqSv58BBOrl4eGhH6kkg8Ucy2tdeK5T8cHa8pMkq2j9pFd2mRG/6VMk0dl
1078
- # Xz7Uy3Z6bZqkcABMyAfuAaGbMYIDDTCCAwkCAQEwgZMwfDELMAkGA1UEBhMCVVMx
1079
- # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT
1080
- # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUt
1081
- # U3RhbXAgUENBIDIwMTACEzMAAAEsIq9Fl3X5G+4AAAAAASwwDQYJYIZIAWUDBAIB
1082
- # BQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQx
1083
- # IgQg/QYv7yp+354WTjWUIsXWndTEzXjaYjqwYjcBxCJKjdUwgfoGCyqGSIb3DQEJ
1084
- # EAIvMYHqMIHnMIHkMIG9BCBbn/0uFFh42hTM5XOoKdXevBaiSxmYK9Ilcn9nu5ZH
1085
- # 4TCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
1086
- # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
1087
- # JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAABLCKv
1088
- # RZd1+RvuAAAAAAEsMCIEIIfIM3YbzHswb/Kj/qq1l1cHA6QBl+gEXYanUNJomrpT
1089
- # MA0GCSqGSIb3DQEBCwUABIIBAAwdcXssUZGO7ho5+NHLjIxLtQk543aKGo+lrRMY
1090
- # Q9abE1h/AaaNJl0iGxX4IihNWyfovSfYL3L4eODUBAu68tWSxeceRfWNsb/ZZfUi
1091
- # v89hpLssI/Gf1BEgNMA4zCuIGQiC8okusVumEpAhhvCEbSiTTTtBdolTnU/CAKui
1092
- # oxaU3R9XkKh1F4oAM26+dJ1J2BLQXPs5afNvvedDsZWNQUPK1sFF3JRfzxiTrwBW
1093
- # EJRyflev9gyDoqCHzippgb+6+eti1WTkcA9Q49GIT11S6LOAVqkSC9N7Nqf8ksh8
1094
- # ARdwT8jigpsm+mj7lrVU9upDkhVYhKeO8oiZq95Q53Zkteo=
1463
+ # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVy
1464
+ # aWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjozNzAzLTA1
1465
+ # RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCC
1466
+ # Ee0wggcgMIIFCKADAgECAhMzAAAB6pokctVZP2FjAAEAAAHqMA0GCSqGSIb3DQEB
1467
+ # CwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
1468
+ # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV
1469
+ # BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTIzMTIwNjE4NDUz
1470
+ # MFoXDTI1MDMwNTE4NDUzMFowgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
1471
+ # aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
1472
+ # cG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMx
1473
+ # JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjozNzAzLTA1RTAtRDk0NzElMCMGA1UE
1474
+ # AxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcNAQEB
1475
+ # BQADggIPADCCAgoCggIBALULX/FIPyAH1fsu52ijatZvaSypoXrlC0mRtCmaxzob
1476
+ # huDkw6/pY/+4nhc4m8pf9zW3R6PihYGp0YPpVuNdfhPQp/KVO6WvMq2DGfFmHurW
1477
+ # 4PQPL/DkbQMkM9vqjFCvPq8xXZnfL1nGN9moGcN+oaif/hUMedmF1qzbay9ILkYf
1478
+ # LCxDYn3Qwzsvh5xjxOcsjzmRddNURJvT23Eva0cxisH4ocLLTx2zfpqfshw4Z9Ga
1479
+ # EdsWg9rmib1galUpLzF5PsQDBbtZtcv+Wjmn0pFEiMCWwEEcPVN0YG5ysYLdNBdJ
1480
+ # On2zsOOS+80W5RrQEqzPpSIIvEkZBJmF3aI4lMR8nV/FiTadjpIIqxX5Wa1XlqI/
1481
+ # Nj+xagVjnjb7POsA+vh6Wu+v24HpyL8pyL/8Q4RFkRRME9cwT+Jr63yOtPbLe6DX
1482
+ # kxIJW6E6w2ua5kXBpEKtEQPTLPhX3CUxMYcglbnmI0zcc9UknX285K+sI/2WwRwT
1483
+ # BZkhDUULI86eQzV+zvzzR1qEBrlSY+oyTlYQrHMM9WnTzVflFDocZVTPpl2BDSNx
1484
+ # Pn0Qb4IoM9EPqbHyi/MilL+v/AQc8q3mQ6FiuPJAddz0ocpNZ9ekBWPVLKq3lfie
1485
+ # v4yl65u/438+NAQ+vSJgkONLMmuoguEGzmnK1vq/JHwdRUyn6YADiteM7Dja+Qd9
1486
+ # AgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQUK4FFJaJR5ukXQFTUxMhyiwVuWV4wHwYD
1487
+ # VR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKgUIZO
1488
+ # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw
1489
+ # VGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAwXjBc
1490
+ # BggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0
1491
+ # cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQwDAYD
1492
+ # VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMC
1493
+ # B4AwDQYJKoZIhvcNAQELBQADggIBACiDrVZeP37+fFVtfcbfsqC/Kg0Ce67bDceh
1494
+ # ZmPcfRgJ5Ddv0pJlOFVOFbiIVwesqeEUwFtclfi5AjneQ5ZJpYJpXfELOelG3dzj
1495
+ # +BKfd287/UY/cwmSkl+CjnoKBL3Ms6I/fWR+alR0+p6RlviK8xHoug9vkc2WrRZs
1496
+ # GnMVu2xOM2tPJ+qpyoDBzqv30N/ZRBOoNrS/PCkDwLGICDYqVs/IzAE49yv2ElPy
1497
+ # walf9mEsOHXV1lxtQDNcejVEmitJJ+1Vr2EtafPEbMQZp89TAuagROKE4YuohCUK
1498
+ # m+v3geJqTQarTBjqV25RCOT+XFngTMDD9wYx6TwndB2I1Ly726NiHUHs0uvq3ciC
1499
+ # V9JwNXdt1VZ63WK1NSgpVEsiK9EPABPt1EfXcKrfaPYkbkFi79eK1ETxx3NomYNU
1500
+ # HNiGU+X1Be8L7qpHwjo0g3/33XhtOr9LiDoUXh/V2LFTETiqV9Q8yLEavQW3j9LQ
1501
+ # /h/CaGz5YdGfrY8HiPfMIeLEokKxGf0hHcTEFApB0yLlq6KoHrFAEANR/4XuFIpl
1502
+ # 9sDywVIWt4tKqG+P6pRAXzg1zG5rGlslZWmw7XwgvhBu3jkLP9AxrsSYwY2ftrww
1503
+ # ze5NA6VDLS7pz+OrXXWLUmoyNrJNx5Bk0wEwzkQxzkOvmbdPhsOP1ZM0uA/xIV7c
1504
+ # SpNpZUw5MIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJmQAAAAAAFTANBgkqhkiG
1505
+ # 9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
1506
+ # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEy
1507
+ # MDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw
1508
+ # MTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQGEwJV
1509
+ # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
1510
+ # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt
1511
+ # ZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
1512
+ # AOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+F2Az
1513
+ # /1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhgfWpSg0S3po5GawcU88V2
1514
+ # 9YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqYO7oa
1515
+ # ezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/dvI2k45GPsjksUZzpcGkN
1516
+ # yjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka97aSueik3rMvrg0XnRm7K
1517
+ # MtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKRHh09/SDPc31BmkZ1zcRf
1518
+ # NN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9ituqBJR6L8FA6PRc6ZNN3SU
1519
+ # HDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLRvWoY
1520
+ # WmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItboKaDIV1fMHSRlJTYuVD5
1521
+ # C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUXk8A8
1522
+ # FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6tAgMBAAGjggHdMIIB2TAS
1523
+ # BgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKRPEY1
1524
+ # Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXAYDVR0gBFUw
1525
+ # UzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNy
1526
+ # b3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoG
1527
+ # CCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIB
1528
+ # hjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fO
1529
+ # mhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9w
1530
+ # a2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBaBggr
1531
+ # BgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNv
1532
+ # bS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqGSIb3
1533
+ # DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/qXBS2Pk5HZHixBpOXPTEz
1534
+ # tTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6cqYJW
1535
+ # AAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVtI1TkeFN1JFe53Z/zjj3G
1536
+ # 82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz/Aye
1537
+ # ixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTpkbKpW99Jo3QMvOyRgNI9
1538
+ # 5ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdUbZ1j
1539
+ # dEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QBjloZkWsNn6Qo3GcZ
1540
+ # KCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJsWkBRH58oWFsc/4Ku+xB
1541
+ # Zj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10CgaiQuP
1542
+ # Ntq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0dFtq0Z4+7X6gMTN9vMvp
1543
+ # e784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGCA1Aw
1544
+ # ggI4AgEBMIH5oYHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
1545
+ # Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
1546
+ # cmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScw
1547
+ # JQYDVQQLEx5uU2hpZWxkIFRTUyBFU046MzcwMy0wNUUwLUQ5NDcxJTAjBgNVBAMT
1548
+ # HE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAInb
1549
+ # HtxB+OlGyQnxQYhy04KSYSSPoIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNV
1550
+ # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
1551
+ # c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg
1552
+ # UENBIDIwMTAwDQYJKoZIhvcNAQELBQACBQDpdwuXMCIYDzIwMjQwMjE0MDk1MTE5
1553
+ # WhgPMjAyNDAyMTUwOTUxMTlaMHcwPQYKKwYBBAGEWQoEATEvMC0wCgIFAOl3C5cC
1554
+ # AQAwCgIBAAICAbgCAf8wBwIBAAICFGEwCgIFAOl4XRcCAQAwNgYKKwYBBAGEWQoE
1555
+ # AjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkq
1556
+ # hkiG9w0BAQsFAAOCAQEAD3oj3Gr5HTA5vQkFXZE9QSfCqxmL4ez3qxPD1t/UMJ9w
1557
+ # 93APM6n5MjApe6tpBjo4Oe83WMnfsWNA5ZRu8B/XJhyJ8531k5XMROCaVX6eTOrO
1558
+ # 70mkxtszD1E2m5iFx2RYJKS2ldkFAnykkFMc4ezXHa+RAijQA3rQp2VNidnVEFkO
1559
+ # jkaZY2FoA2dbG7v9ZjkQsmrycREGNiakPhAgqqmTiUlDPvul5gJx24VGL0z7JZhP
1560
+ # KUsccmv6HF3sgD6FjhENyZtD1+NrRfVQHTrjitjpC/dX9ux2OP8pjPi3WIdPfEsI
1561
+ # 2PhWNWSEof4cWFv/lLlYAUVeHPDcafr+2umlLYb62zGCBA0wggQJAgEBMIGTMHwx
1562
+ # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
1563
+ # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p
1564
+ # Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB6pokctVZP2FjAAEAAAHq
1565
+ # MA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQw
1566
+ # LwYJKoZIhvcNAQkEMSIEIL2oG23lx47V7tAc0IyUsnuhSrJEjOACK32L1AXSjdl/
1567
+ # MIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgKY+h1eNkNHiLCDSW0sA1cGHk
1568
+ # bW4qooi+ryyMp6S4ZngwgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK
1569
+ # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
1570
+ # IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg
1571
+ # MjAxMAITMwAAAeqaJHLVWT9hYwABAAAB6jAiBCB7j2iMmFJTNAbY6vZ80pGTL0BC
1572
+ # A2VAW00KF9MbtVlx1zANBgkqhkiG9w0BAQsFAASCAgA1ArfmkqTc7BoI6J+6zHkc
1573
+ # TrfkFzsjKWBJpcPWwOPOZOdxfO850UPyrCLJgTclSkgnDBSSDQLqjhV2Q3EeM5tm
1574
+ # iBFU1IO7RIMeF4hTB2jOzGuvX46zRms8/booKtLBlPRscHvYbXgOUqIn9M2ymtZo
1575
+ # aMp08VpWw+PxTbSa6HN6jQiwVVtRg9nsGd4gY/mO6+agIkbSs6hY2oV6HyhDH3CB
1576
+ # DvEL3z7BCJ5Dx52K3XE2BUDR6nLhkGvxOxRaJ1GmJQXMMILDebq6ULx0ULThmpUQ
1577
+ # y6aifjEa3r60cjg29rKd/4PGmbDBaRAnVs7JEaxdSsTR75Ak7OKQymZ4yPI3bTkx
1578
+ # 1t/LCEKtia/oqv3tFMP8KtSUHZEK8PvmvRCJII2JrAUrxTYzrohxf/TL95sZdmGg
1579
+ # QNyQC2T+h816Kl7i+RrtXi5i6kSYqnTlr7uKFU4idVNRVxqiO/oumXhf6REHp1Wi
1580
+ # V60E8w5gawis5jnaJqZMeCiyHSLhm+zvXaCMm1AHUWQ6zK/GWOp1Y0wHiJRr5pnf
1581
+ # 4wIKAt7oKWL/clx2jikqesxYFfGBq0YnfRUyHt3bscb83xfbFMjcbok/UI8fxWQM
1582
+ # vLsaEzFVp+a7wRqLf4KjiYzF4hORFWoGlZbGglkVYiYswX8Emsx5cn2F5M9cznRn
1583
+ # 4d+LeskiXr3Z0pV6Ooki3w==
1095
1584
  # SIG # End signature block