From ad0c5d366349044d301dcf6d5fc7506bde4e70c2 Mon Sep 17 00:00:00 2001 From: Michael Klement Date: Wed, 6 Sep 2017 00:12:31 -0400 Subject: [PATCH 1/5] CRLF converted to LF, trailing LF ensured. --- assets/license.rtf | 2496 +++++----- assets/powershell.1.ronn | 2 +- demos/Apache/readme.md | 2 +- demos/Azure/Compute-Linux.json | 2 +- demos/DSC/readme.md | 2 +- demos/Docker-PowerShell/Docker-PowerShell.ps1 | 2 +- demos/SystemD/SystemD/SystemD.psm1 | 2 +- demos/SystemD/readme.md | 2 +- demos/crontab/CronTab/CronTab.ps1xml | 2 +- demos/dsc.ps1 | 2 +- demos/install/README.md | 2 +- demos/powershellget/PowerShellGet.ps1 | 2 +- docker/release/nanoserver-insider/Dockerfile | 110 +- .../create-powershell-scripts.md | 2 +- .../working-with-powershell-objects.md | 2 +- docs/testing-guidelines/TestRoadmap.md | 2 +- license_thirdparty_proprietary.txt | 2 +- .../CommonUtils.cs | 312 +- .../NewWinEventCommand.cs | 2 +- .../resources/GetEventResources.txt | 2 +- .../cmdletization/cim/cimConverter.cs | 2 +- .../management/ClearRecycleBinCommand.cs | 2 +- .../commands/utility/Disable-PSBreakpoint.cs | 2 +- .../commands/utility/Enable-PSBreakpoint.cs | 2 +- .../FormatAndOutput/OutGridView/ColumnInfo.cs | 2 +- .../OutGridView/ExpressionColumnInfo.cs | 2 +- .../FormatAndOutput/OutGridView/HeaderInfo.cs | 2 +- .../OutGridView/ScalarTypeColumnInfo.cs | 2 +- .../commands/utility/Get-PSBreakpoint.cs | 2 +- .../commands/utility/Get-PSCallStack.cs | 2 +- .../commands/utility/GetEventCommand.cs | 2 +- .../utility/GetEventSubscriberCommand.cs | 2 +- .../utility/RegisterObjectEventCommand.cs | 2 +- .../utility/RegisterPSEventCommand.cs | 2 +- .../commands/utility/Remove-PSBreakpoint.cs | 2 +- .../commands/utility/RemoveEventCommand.cs | 2 +- .../commands/utility/Send-MailMessage.cs | 2 +- .../commands/utility/Set-PSBreakpoint.cs | 2 +- .../ShowCommand/ShowCommandCommandInfo.cs | 2 +- .../ShowCommand/ShowCommandModuleInfo.cs | 2 +- .../ShowCommand/ShowCommandParameterInfo.cs | 2 +- .../ShowCommandParameterSetInfo.cs | 2 +- .../ShowCommand/ShowCommandParameterType.cs | 2 +- .../utility/UnregisterEventCommand.cs | 2 +- .../commands/utility/WaitEventCommand.cs | 2 +- .../Common/HtmlWebResponseObject.Common.cs | 2 +- .../Common/InvokeRestMethodCommand.Common.cs | 2 +- .../BasicHtmlWebResponseObject.CoreClr.cs | 2 +- .../CoreCLR/ContentHelper.CoreClr.cs | 2 +- .../CoreCLR/HtmlWebResponseObject.CoreClr.cs | 2 +- .../InvokeRestMethodCommand.CoreClr.cs | 2 +- .../InvokeWebRequestCommand.CoreClr.cs | 2 +- .../utility/WebCmdlet/CoreCLR/WebProxy.cs | 2 +- .../CoreCLR/WebResponseHelper.CoreClr.cs | 2 +- .../CoreCLR/WebResponseObject.CoreClr.cs | 2 +- .../WebResponseObjectFactory.CoreClr.cs | 2 +- .../FullClr/ContentHelper.FullClr.cs | 2 +- .../InvokeRestMethodCommand.FullClr.cs | 2 +- .../InvokeWebRequestCommand.FullClr.cs | 2 +- .../FullClr/JsonObjectTypeResolver.cs | 2 +- .../FullClr/WebRequestPSCmdlet.FullClr.cs | 2 +- .../FullClr/WebResponseHelper.FullClr.cs | 2 +- .../WebResponseObjectFactory.FullClr.cs | 2 +- .../commands/utility/WebCmdlet/JsonObject.cs | 2 +- .../commands/utility/WriteConsoleCmdlet.cs | 2 +- .../commands/utility/neweventcommand.cs | 2 +- .../.gitignore | 2 +- .../ProviderMetadataCachedInformation.cs | 2 +- .../DotNetCode/Eventing/Reader/Winmeta.cs | 2 +- .../en-US/PSReadline.md | 1026 ++-- .../packages.config | 2 +- .../resources/CertificateProviderStrings.resx | 384 +- .../resources/WsManResources.txt | 2 +- .../Microsoft.PowerShell.Host.psd1 | 28 +- .../Microsoft.PowerShell.Utility.psm1 | 348 +- .../Microsoft.PowerShell.Management.psd1 | 108 +- .../Microsoft.PowerShell.Utility.psd1 | 60 +- .../CimCmdlets/CimCmdlets.psd1 | 36 +- .../Microsoft.WSMan.Management.psd1 | 30 +- .../WSMan.format.ps1xml | 472 +- .../PSDiagnostics/PSDiagnostics.psd1 | 26 +- .../PSDiagnostics/PSDiagnostics.psm1 | 892 ++-- .../Microsoft.PowerShell.Diagnostics.psd1 | 26 +- .../Microsoft.PowerShell.Management.psd1 | 136 +- .../Microsoft.PowerShell.Utility.psd1 | 60 +- .../Diagnostics.format.ps1xml | 158 +- .../Event.format.ps1xml | 242 +- .../GetEvent.types.ps1xml | 278 +- .../Microsoft.PowerShell.Diagnostics.psd1 | 32 +- .../LocalAccounts.format.ps1xml | 2 +- .../Microsoft.PowerShell.LocalAccounts.psd1 | 64 +- .../Microsoft.PowerShell.ODataAdapter.ps1 | 4140 ++++++++--------- .../Microsoft.PowerShell.ODataUtils.psd1 | 480 +- .../Microsoft.PowerShell.ODataUtils.psm1 | 462 +- .../Microsoft.PowerShell.ODataUtilsHelper.ps1 | 1564 +++---- .../Microsoft.PowerShell.ODataV4Adapter.ps1 | 2 +- ...icrosoft.PowerShell.ODataUtilsStrings.psd1 | 110 +- .../Microsoft.PowerShell.Utility.psd1 | 64 +- .../PSScheduledJob.Format.ps1xml | 234 +- .../PSScheduledJob.types.ps1xml | 48 +- src/Schemas/PSMaml/Maml.tbr | 2854 ++++++------ src/Schemas/PSMaml/Maml.xsd | 2 +- src/Schemas/PSMaml/Maml.xsx | 2 +- src/Schemas/PSMaml/Maml_HTML.xsl | 14 +- src/Schemas/PSMaml/Maml_HTML_Style.xsl | 2 +- src/Schemas/PSMaml/developerDscResource.xsd | 2 +- .../PowerShellProperties.json | 2 +- .../displayDescriptionData_Wide.cs | 2 +- .../displayResourceManagerCache.cs | 6 +- .../FormatAndOutput/out-console/OutConsole.cs | 2 +- .../engine/COM/ComDispatch.cs | 2 +- .../engine/COM/ComInvoker.cs | 2 +- .../engine/DscResourceInfo.cs | 2 +- .../engine/EventManager.cs | 2 +- .../engine/ICommandRuntime.cs | 2 +- .../engine/InternalCommands.cs | 2 +- .../Modules/NewModuleManifestCommand.cs | 10 +- .../engine/Modules/PSModuleInfo.cs | 2 +- .../engine/Modules/ScriptAnalysis.cs | 2 +- .../engine/MshCommandRuntime.cs | 2 +- .../engine/NullString.cs | 2 +- .../engine/ObjectEventRegistrationBase.cs | 2 +- .../engine/PSClassInfo.cs | 2 +- .../engine/PSMI/PSNegotiationData.cs | 2 +- .../engine/PSMI/PSPowerShellPipeline.cs | 2 +- .../Serialization/InternalMISerializer.cs | 2 +- .../engine/PSMI/Serialization/KnownMITypes.cs | 2 +- .../engine/PSMI/Serialization/MISerializer.cs | 2 +- .../Serialization/MITypeSerializationInfo.cs | 2 +- .../PSMI/Serialization/PSMISerializer.cs | 2 +- .../engine/PSVersionInfo.cs | 2 +- .../engine/ScriptCommand.cs | 2 +- .../engine/SessionStateFunctionAPIs.cs | 2 +- .../engine/SessionStateVariableAPIs.cs | 2 +- .../engine/hostifaces/InformationalRecord.cs | 2 +- .../hostifaces/NativeCultureResolver.cs | 2 +- .../engine/hostifaces/PSDataCollection.cs | 2 +- .../engine/lang/codegen.cs | 2 +- .../engine/parser/SymbolResolver.cs | 2 +- .../commands/NewPSSessionConfigurationFile.cs | 2 +- .../remoting/common/RunspaceInitInfo.cs | 2 +- .../remoting/common/RunspacePoolStateInfo.cs | 2 +- .../engine/remoting/fanin/PSPrincipal.cs | 2 +- .../remoting/fanin/PriorityCollection.cs | 2 +- .../fanin/WSManPluginTransportManager.cs | 2 +- .../server/ServerSteppablePipelineDriver.cs | 2 +- .../engine/runtime/Operations/ArrayOps.cs | 2 +- .../engine/runtime/Operations/StringOps.cs | 2 +- .../help/DscResourceHelpProvider.cs | 2 +- .../help/PSClassHelpProvider.cs | 2 +- .../help/ScriptCommandHelpProvider.cs | 2 +- .../api/RunspaceConfigurationEntry.cs | 2 +- .../namespaces/RegistryWrapper.cs | 2 +- .../resources/CmdletizationCoreResources.resx | 406 +- .../security/wldpNativeMethods.cs | 2 +- .../utils/ObjectReader.cs | 2 +- .../utils/PlatformInvokes.cs | 2 +- src/libpsl-native/src/createprocess.cpp | 434 +- src/libpsl-native/src/createprocess.h | 44 +- src/powershell-native/.gitignore | 2 +- .../pwrshcommon/IPwrshCommonOutput.h | 2 +- .../pwrshcommon/NativeMshConstants.h | 2 +- .../pwrshplugin/pwrshpluginResources.rc | 2 +- .../windows-compiler-override.txt | 2 +- test/PSReadLine/App.config | 2 +- test/PSReadLine/packages.config | 2 +- .../Installer/WindowsInstaller.Tests.ps1 | 2 +- .../Language/Classes/MSFT_778492.psm1 | 30 +- .../Classes/ProtectedAccess.Tests.ps1 | 376 +- .../Scripting.Classes.Attributes.Tests.ps1 | 968 ++-- .../Scripting.Classes.BasicParsing.Tests.ps1 | 1714 +++---- .../Classes/Scripting.Classes.Break.Tests.ps1 | 290 +- .../Scripting.Classes.Exceptions.Tests.ps1 | 698 +-- .../Scripting.Classes.MiscOps.Tests.ps1 | 234 +- .../Scripting.Classes.Modules.Tests.ps1 | 226 +- .../scripting.Classes.NestedModules.tests.ps1 | 248 +- .../scripting.Classes.inheritance.tests.ps1 | 1090 ++--- .../Classes/scripting.Classes.using.tests.ps1 | 1098 ++--- .../Classes/scripting.enums.tests.ps1 | 182 +- .../Language/CompletionTestSupport.psm1 | 284 +- test/powershell/Language/Parser/Ast.Tests.ps1 | 80 +- .../Parser/AutomaticVariables.Tests.ps1 | 42 +- .../Language/Parser/BNotOperator.Tests.ps1 | 284 +- .../Language/Parser/Conversions.Tests.ps1 | 258 +- .../Parser/ExtensibleCompletion.Tests.ps1 | 714 +-- .../LanguageAndParser.TestFollowup.Tests.ps1 | 438 +- .../Parser/MethodInvocation.Tests.ps1 | 162 +- .../Parser/ParameterBinding.Tests.ps1 | 200 +- .../Language/Parser/Parser.Tests.ps1 | 1836 ++++---- .../Parser/RedirectionOperator.Tests.ps1 | 188 +- .../Language/Parser/TypeAccelerator.Tests.ps1 | 876 ++-- .../Language/Parser/UsingAssembly.Tests.ps1 | 226 +- .../Language/Parser/UsingNamespace.Tests.ps1 | 264 +- .../Scripting/CommonParameters.Tests.ps1 | 2 +- .../Debugging/DebuggerScriptTests.Tests.ps1 | 1332 +++--- .../Debugging/DebuggingInHost.Tests.ps1 | 164 +- .../Language/Scripting/Delegates.Tests.ps1 | 2 +- .../Scripting/DeserializedMethods.Tests.ps1 | 2 +- .../Scripting/ForeachParallel.Tests.ps1 | 2 +- ...htableToPSCustomObjectConversion.Tests.ps1 | 314 +- .../Scripting/I18n.Tests_fallback.psd1 | 2 +- .../Language/Scripting/LineEndings.Tests.ps1 | 282 +- .../NativeCommandArguments.Tests.ps1 | 68 +- .../NativeExecution/NativeStreams.Tests.ps1 | 126 +- .../Language/Scripting/Requires.Tests.ps1 | 2 +- .../Language/Scripting/TestsOnWinFullOnly.ps1 | 2 +- .../Language/Scripting/en-US/bad.psd1 | 2 +- .../Language/Scripting/en-US/foo.psd1 | 2 +- .../Language/Scripting/en-US/if.psd1 | 2 +- .../Language/Scripting/fr-FR/I18n.Tests.psd1 | 2 +- .../Language/Scripting/fr-FR/foo.psd1 | 2 +- .../Scripting/newbase/en-US/I18n.Tests.psd1 | 2 +- .../Language/Scripting/newbase/en-US/foo.psd1 | 2 +- .../Scripting/newbase/fr-FR/I18n.Tests.psd1 | 2 +- .../Language/Scripting/newbase/fr-FR/foo.psd1 | 2 +- .../TestGetCommand.Tests.ps1 | 2 +- .../New-WinEvent.Tests.ps1 | 26 +- .../assets/CorruptBlg.blg | 2 +- .../GetCredential.Tests.ps1 | 204 +- .../CatalogTestData/CatalogTestFile1.mof | 84 +- .../CatalogTestData/CatalogTestFile2.xml | 2 +- .../CatalogTestData/TestFileCatalog.txt | 2 +- .../DSCResources/scriptdsc/scriptdsc.psd1 | 192 +- .../UserConfigProv/UserConfigProv.psd1 | 2 +- .../certificateCommon.psm1 | 2 +- .../Clear-Variable.Tests.ps1 | 524 +-- .../Eventing.Tests.ps1 | 72 +- .../Export-Alias.Tests.ps1 | 354 +- .../Get-Variable.Tests.ps1 | 380 +- .../Import-Alias.Tests.ps1 | 202 +- .../New-Variable.Tests.ps1 | 480 +- .../Set-Variable.Tests.ps1 | 486 +- .../Trace-Command.Tests.ps1 | 248 +- .../Update-FormatData.Tests.ps1 | 214 +- .../Update-TypeData.Tests.ps1 | 638 +-- .../assets/TestCsv2.csv | 6 +- .../UpdateFormatDataTests.format.ps1xml | 62 +- .../assets/testablescript.ps1 | 2 +- .../Start-Transcript.Tests.ps1 | 2 +- .../CredSSP.Tests.ps1 | 224 +- .../Provider/AutomountSubstDrive.ps1 | 76 +- .../Provider/AutomountSubstDriveCore.ps1 | 62 +- .../powershell/Provider/AutomountVHDDrive.ps1 | 152 +- .../Pester.AutomountedDrives.Tests.ps1 | 110 +- .../Provider/ProviderIntrinsics.Tests.ps1 | 42 +- test/powershell/README.md | 104 +- .../engine/Api/Serialization.Tests.ps1 | 198 +- .../engine/Basic/Attributes.Tests.ps1 | 48 +- .../engine/Basic/CommandDiscovery.Tests.ps1 | 2 +- .../engine/Basic/DefaultCommands.Tests.ps1 | 1062 ++--- test/powershell/engine/Cdxml/Cdxml.Tests.ps1 | 546 +-- .../Cdxml/assets/CimTest/CdxmlTest.psd1 | 28 +- .../engine/Cdxml/assets/CimTest/CimTest.cdxml | 244 +- .../Cdxml/assets/CimTest/CreateCimTest.mof | 128 +- .../Cdxml/assets/CimTest/DeleteCimTest.mof | 10 +- test/powershell/engine/ETS/Adapter.Tests.ps1 | 336 +- ...d-c096-4b38-b78d-0fed6277096a_HelpInfo.xml | 2 +- ...a-9ae2-482a-a648-e96550fb8733_HelpInfo.xml | 2 +- ...0-0000-0000-0000-000000000000_HelpInfo.xml | 2 +- ...0-ca64-4740-8ff9-2565dba61a4f_HelpInfo.xml | 2 +- ...0-99a0-4ffc-a12d-eee9a6718aef_HelpInfo.xml | 2 +- ...4-2c0b-448f-a414-a6a690a644e2_HelpInfo.xml | 2 +- ...6-b326-4e99-9f54-8b4bb6ef3c6d_HelpInfo.xml | 2 +- ...E-9810-47C0-B8AF-65089C13A35A_HelpInfo.xml | 2 +- ...3-152b-403e-98dc-74d7b4d63d59_HelpInfo.xml | 2 +- ...6-330E-4263-A7AB-46C87AFC366C_HelpInfo.xml | 2 +- ...b-2afd-4492-a5fd-01d9e2cff8b5_HelpInfo.xml | 2 +- ...6-338a-459c-8186-07f910774cb8_HelpInfo.xml | 2 +- ...1-4a6c-43c5-ba3f-619b18bbb404_HelpInfo.xml | 2 +- test/powershell/engine/Job/Jobs.Tests.ps1 | 2 +- .../engine/Module/NewModuleManifest.Tests.ps1 | 14 +- .../Module/SubmodulePathInManifest.Tests.ps1 | 36 +- .../BooleanParameterDCR.Tests.ps1 | 104 +- .../Remoting/RemoteSession.Basic.Tests.ps1 | 2 +- test/tools/OpenCover/OpenCover.psd1 | 32 +- test/tools/TestExe/TestExe.cs | 128 +- test/tools/TestExe/TestExe.csproj | 22 +- tools/install-powershell-readme.md | 2 +- 278 files changed, 20853 insertions(+), 20853 deletions(-) diff --git a/assets/license.rtf b/assets/license.rtf index 0e507920b40..bed62517abd 100644 --- a/assets/license.rtf +++ b/assets/license.rtf @@ -1,1248 +1,1248 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} -{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} -{\f11\fbidi \froman\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;} -{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f40\fbidi \fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Tahoma;}{\f41\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS;} -{\f42\fbidi \fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Segoe UI;}{\f43\fbidi \froman\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;} -{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} -{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f44\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f45\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\f47\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f48\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f49\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f50\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\f51\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f52\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f64\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f65\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} -{\f67\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f68\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f69\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f70\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} -{\f71\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f72\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f434\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f435\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} -{\f437\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f438\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f439\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\f440\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);} -{\f441\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f442\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f444\fbidi \fswiss\fcharset238\fprq2 Tahoma CE;}{\f445\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr;} -{\f447\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek;}{\f448\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur;}{\f449\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);}{\f450\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);} -{\f451\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f452\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}{\f453\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai);}{\f454\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE;} -{\f455\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr;}{\f457\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek;}{\f458\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur;}{\f461\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic;} -{\f464\fbidi \fswiss\fcharset238\fprq2 Segoe UI CE;}{\f465\fbidi \fswiss\fcharset204\fprq2 Segoe UI Cyr;}{\f467\fbidi \fswiss\fcharset161\fprq2 Segoe UI Greek;}{\f468\fbidi \fswiss\fcharset162\fprq2 Segoe UI Tur;} -{\f469\fbidi \fswiss\fcharset177\fprq2 Segoe UI (Hebrew);}{\f470\fbidi \fswiss\fcharset178\fprq2 Segoe UI (Arabic);}{\f471\fbidi \fswiss\fcharset186\fprq2 Segoe UI Baltic;}{\f472\fbidi \fswiss\fcharset163\fprq2 Segoe UI (Vietnamese);} -{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\fhimajor\f31529\fbidi \fswiss\fcharset204\fprq2 Calibri Light Cyr;} -{\fhimajor\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;}{\fhimajor\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;}{\fhimajor\f31533\fbidi \fswiss\fcharset177\fprq2 Calibri Light (Hebrew);} -{\fhimajor\f31534\fbidi \fswiss\fcharset178\fprq2 Calibri Light (Arabic);}{\fhimajor\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;}{\fhimajor\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);} -{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} -{\fhiminor\f31573\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\fhiminor\f31574\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} -{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}} -{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; -\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red51\green51\blue51;}{\*\defchp \f31506\fs22 }{\*\defpap \ql \li0\ri0\sa160\sl259\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 -\ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 \slink22 \sqformat \styrsid7813854 heading 1;}{ -\s2\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext2 \slink23 \sqformat \styrsid7813854 heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 -\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext3 \slink24 \sqformat \styrsid7813854 heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar -\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext4 \slink25 \sqformat \styrsid7813854 heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 -\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext5 \slink26 \sqformat \styrsid7813854 heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar -\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext6 \slink27 \sqformat \styrsid7813854 heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 -\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext7 \slink28 \sqformat \styrsid7813854 heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar -\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext8 \slink29 \sqformat \styrsid7813854 heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 -\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext9 \slink30 \sqformat \styrsid7813854 heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 -Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused -Normal Table;}{\s15\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext15 \ssemihidden \sunhideused \styrsid3804850 Normal (Web);}{\s16\ql \li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af39\afs22\alang1025 \ltrch\fcs0 -\f39\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext16 \sqformat \spriority34 \styrsid6173475 List Paragraph;}{\s17\ql \li0\ri0\widctlpar -\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0 -\f2\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext17 \slink18 \ssemihidden \sunhideused \styrsid6573559 HTML Preformatted;}{\*\cs18 \additive \rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20 -\sbasedon10 \slink17 \slocked \ssemihidden \styrsid6573559 HTML Preformatted Char;}{\*\cs19 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf1 \sbasedon10 \sunhideused \styrsid7092439 Hyperlink;}{\*\cs20 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 -\sbasedon10 \spriority0 \styrsid7092439 spelle;}{\*\cs21 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 \spriority0 \styrsid7092439 grame;}{\*\cs22 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \fs19\loch\f40\hich\af40\dbch\af11 -\sbasedon10 \slink1 \slocked \styrsid7813854 Heading 1 Char;}{\*\cs23 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink2 \slocked \styrsid7813854 Heading 2 Char;}{\*\cs24 \additive \rtlch\fcs1 -\af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink3 \slocked \styrsid7813854 Heading 3 Char;}{\*\cs25 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 -\sbasedon10 \slink4 \slocked \styrsid7813854 Heading 4 Char;}{\*\cs26 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink5 \slocked \styrsid7813854 Heading 5 Char;}{\*\cs27 \additive \rtlch\fcs1 -\af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink6 \slocked \styrsid7813854 Heading 6 Char;}{\*\cs28 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 -\sbasedon10 \slink7 \slocked \styrsid7813854 Heading 7 Char;}{\*\cs29 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink8 \slocked \styrsid7813854 Heading 8 Char;}{\*\cs30 \additive \rtlch\fcs1 -\af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink9 \slocked \styrsid7813854 Heading 9 Char;}{\s31\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 \styrsid7813854 Body 1;}{ -\s32\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 \fs28\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 -\sbasedon0 \snext0 \styrsid7813854 Heading EULA;}{\s33\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 -\fs28\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid7813854 Heading Software Title;}{\s34\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 -\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 \styrsid7813854 -Preamble Border Above;}}{\*\listtable{\list\listtemplateid412752146\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} -\f3\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 -\fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 -\fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 -\fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 } -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel -\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23 -\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid256596791}{\list\listtemplateid-234466468 -\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23 -\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid268852893}{\list\listtemplateid2071779370\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 -\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers -;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} -\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid472724034}{\list\listtemplateid837583652\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 -\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers -;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} -\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} -\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 -\fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 -\fi-360\li6480\lin6480 }{\listname ;}\listid678236712}{\list\listtemplateid468190476\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} -\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} -\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} -\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 -\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 -\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 -\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 } -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname -;}\listid696808916}{\list\listtemplateid256027766\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} -\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 -\fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 -\fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 -\fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 } -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel -\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23 -\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid833446968}{\list\listtemplateid812297174 -{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \b\hres0\chhres0 \fi-360\li717\lin717 }{\listlevel\levelnfc4\levelnfcn4\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1077\lin1077 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1437\lin1437 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1797\lin1797 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2157\lin2157 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\hres0\chhres0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2877\lin2877 } -{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc2\levelnfcn2\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3597\lin3597 }{\listname ;}\listid888110291}{\list\listtemplateid812297174{\listlevel\levelnfc4 -\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \b\hres0\chhres0 \fi-360\li717\lin717 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1077\lin1077 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1437\lin1437 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1797\lin1797 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2157\lin2157 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\hres0\chhres0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2877\lin2877 } -{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc2\levelnfcn2\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3597\lin3597 }{\listname ;}\listid1282881056}{\list\listtemplateid827650700\listhybrid{\listlevel -\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid1470391773}{\list\listtemplateid-1331279738\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} -\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 -\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 } -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid1543639483}{\list\listtemplateid812297174{\listlevel\levelnfc4\levelnfcn4 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \b\hres0\chhres0 \fi-360\li717\lin717 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1077\lin1077 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 -{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1437\lin1437 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers -\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1797\lin1797 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\hres0\chhres0 \fi-360\li2157\lin2157 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2517\lin2517 } -{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2877\lin2877 }{\listlevel\levelnfc4\levelnfcn4\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3597\lin3597 }{\listname ;}\listid1670060985}{\list\listtemplateid-1676387632{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0\hres0\chhres0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\b\i0\f3\fs20\fbias0\hres0\chhres0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0\hres0\chhres0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af41\afs20 \ltrch\fcs0 \b0\i0\strike0\f41\fs20\ulnone\fbias0\hres0\chhres0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af41\afs20 \ltrch\fcs0 \b0\i0\strike0\f41\fs20\ulnone\fbias0\hres0\chhres0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 } -{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af41\afs20 \ltrch\fcs0 \b0\i0\f41\fs20\fbias0\hres0\chhres0 \s6\fi-357\li2149 -\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af41\afs20 \ltrch\fcs0 \b0\i0\f41\fs20\fbias0\hres0\chhres0 -\s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af41\afs20 \ltrch\fcs0 -\b0\i0\f41\fs20\fbias0\hres0\chhres0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af41\afs20 -\ltrch\fcs0 \b0\i0\f41\fs20\fbias0\hres0\chhres0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid1743720866}{\list\listtemplateid-646571904\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 -\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers -;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} -\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid2003921709}{\list\listtemplateid1067461628\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 -\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers -;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} -\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} -\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 -\fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 -\fi-360\li6480\lin6480 }{\listname ;}\listid2022782249}{\list\listtemplateid1736062262\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 -\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} -\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} -\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} -\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 -\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 -\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 -\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 } -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname -;}\listid2055036124}{\list\listtemplateid812297174{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \b\hres0\chhres0 -\fi-360\li717\lin717 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1077\lin1077 }{\listlevel -\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1437\lin1437 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1797\lin1797 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 -\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2157\lin2157 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext -\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2877\lin2877 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\hres0\chhres0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3597\lin3597 } -{\listname ;}\listid2106000387}}{\*\listoverridetable{\listoverride\listid256596791\listoverridecount0\ls1}{\listoverride\listid1543639483\listoverridecount0\ls2}{\listoverride\listid268852893\listoverridecount0\ls3}{\listoverride\listid678236712 -\listoverridecount0\ls4}{\listoverride\listid2022782249\listoverridecount0\ls5}{\listoverride\listid472724034\listoverridecount0\ls6}{\listoverride\listid1470391773\listoverridecount0\ls7}{\listoverride\listid2003921709\listoverridecount0\ls8} -{\listoverride\listid2055036124\listoverridecount0\ls9}{\listoverride\listid696808916\listoverridecount0\ls10}{\listoverride\listid833446968\listoverridecount0\ls11}{\listoverride\listid1743720866\listoverridecount0\ls12}{\listoverride\listid1670060985 -\listoverridecount0\ls13}{\listoverride\listid1282881056\listoverridecount0\ls14}{\listoverride\listid888110291\listoverridecount0\ls15}{\listoverride\listid2106000387\listoverridecount0\ls16}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0 -\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp10\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li300\ri300\sb300\sa300}{\pgp\ipgp0\itap0\li0\ri0 -\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid93983\rsid217518\rsid1984289\rsid3804850\rsid5845909\rsid6173475\rsid6573559\rsid7092439\rsid7813854\rsid8005660\rsid8394862 -\rsid10169937\rsid10363382\rsid10624128\rsid13960513\rsid14557619\rsid16084641}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Duane Okamoto (CELA)} -{\operator Raghu Shantha}{\creatim\yr2016\mo8\dy12\hr14\min30}{\revtim\yr2016\mo8\dy12\hr14\min30}{\version2}{\edmins1}{\nofpages15}{\nofwords5899}{\nofchars33626}{\*\company Microsoft IT}{\nofcharsws39447}{\vern19}}{\*\xmlnstbl {\xmlns1 http://schemas.mi -crosoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen -\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 -\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct -\asianbrkrule\rsidroot3804850\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 -{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang -{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}} -\pard\plain \ltrpar\s15\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3804850 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \b\f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid93983\charrsid93983 PowerShell 6.0}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \b\f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 Copyright (c) Microsoft Corporation}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 All rights reserved.\~}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 MIT License}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software - without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following cond -itions:}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.}{\rtlch\fcs1 -\af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRA -NTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT -OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs20\ul\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid10363382 IMPORTANT NOTICE}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid10363382 -: THE SOFTWARE ALSO CONTAINS THIRD PARTY AND OTHER }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid10624128 PROPRIETARY }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 -\f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid10363382 SOFTWARE THAT ARE GOVERNED BY SEPARATE LICENSE TERMS. BY ACCEPTING THE LICENSE TERMS ABOVE, -YOU ALSO ACCEPT THE LICENSE TERMS GOVERNING THE THIRD PARTY AND OTHER SOFTWARE, WHICH ARE SET FORTH BELOW: -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 The following components }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid16084641 listed }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 -\f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 are governed by }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid16084641 the license terms that follow }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 -\f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 the component}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid16084641 (s) name}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 -\f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 : -\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6173475 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 --------------------------------------}{ -\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid10363382 ----------------}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 -\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14557619 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 Libmi.so -\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6173475 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 --------------------------------------}{ -\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid10363382 ----------------}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 -\par }\pard \ltrpar\s15\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3804850 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 -Copyright (c) Microsoft Corporation -\par }\pard \ltrpar\s15\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6173475 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 -All rights reserved.\~}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 MIT License}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated docu -mentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Soft -ware is furnished to do so, subject to the following conditions:}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.}{\rtlch\fcs1 -\af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, E -XPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 -\par }\pard \ltrpar\s15\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14557619 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619 -The following components are governed by the MIT license, a copy of which appears below the list of components: -\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14557619 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619 ------------------------------------------------------- -\par Newtonsoft.Json -\par ------------------------------------------------------ -\par }\pard \ltrpar\s15\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14557619 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619 -Copyright (c) 2007 James Newton-King -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 All rights reserved.\~}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 MIT License}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies o -f the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.}{\rtlch\fcs1 -\af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 THE SOFTWAR -E IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 -\f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619 -\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6573559 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6573559 ---------------------------------------------------------- -\par Libuv v.1.9.0 -\par --------------------------------------------------------- -\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6573559 \rtlch\fcs1 -\af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid10169937 -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 https://raw.githubusercontent.com/aspnet/libuv-package/dev/content/License.txt -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid6573559 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 This software is licensed to you by Microsoft Corporation under the original terms of the copyright holder provided below: -\par -\par ========================================= -\par -\par libuv is part of the Node project: http://nodejs.org/ -\par libuv may be distributed alone under Node's license: -\par -\par ==== -\par -\par Copyright Joyent, Inc. and other Node contributors. All rights reserved. -\par -\par Permission is hereby granted, free of charge, to any person obtaining a copy -\par of this software and associated documentation files (the "Software"), to -\par deal in the Software without restriction, including without limitation the -\par rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -\par sell copies of the Software, and to permit persons to whom the Software is -\par furnished to do so, subject to the following conditions: -\par -\par The above copyright notice and this permission notice shall be included in -\par all copies or substantial portions of the Software. -\par -\par THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -\par IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -\par FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -\par AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -\par LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -\par FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -\par IN THE SOFTWARE. -\par -\par ==== -\par -\par This license applies to all parts of libuv that are not externally -\par maintained libraries. -\par -\par The externally maintained libraries used by libuv are: -\par -\par - tree.h (from FreeBSD), copyright Niels Provos. Two clause BSD license. -\par -\par - inet_pton and inet_ntop implementations, contained in src/inet.c, are -\par }\pard \ltrpar\ql \li450\ri0\widctlpar\tx450\tx1530\tx2700\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin450\itap0\pararsid6573559 {\rtlch\fcs1 -\af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 copyright the Internet Systems Consortium, Inc., and licensed under the ISC license. -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6573559 {\rtlch\fcs1 -\af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 -\par - stdint-msvc2008.h (from msinttypes), copyright Alexander Chemeris. Three -\par clause BSD license. -\par -\par - pthread-fixes.h, pthread-fixes.c, copyright Google Inc. and Sony Mobile -\par Communications AB. Three clause BSD license. -\par -\par }\pard \ltrpar\ql \fi-450\li450\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin450\itap0\pararsid6573559 { -\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 - android-ifaddrs.h, android-ifaddrs.c, copyright Berkeley Software Design Inc, Kenneth MacKay and Emergya (Cloud4all, FP7/2007-2013, grant agreement -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6573559 {\rtlch\fcs1 -\af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 n\'b0 289016). Three clause BSD license. -\par -\par ========================================= -\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6573559 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs18 -\ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6573559 -\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid10169937 -\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6573559 ---------------------------------------------------}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid10169937 --}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6573559 -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard\plain \ltrpar -\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls11\adjustright\rin0\lin720\itap0\pararsid10169937 \rtlch\fcs1 \af39\afs22\alang1025 \ltrch\fcs0 \f39\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs18 -\ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 dotnet-test-xunit 2.2.0-preview2-build1029 -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\fs18\insrsid16084641\charrsid10169937 xunit -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.abstractions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.assert -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.core -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.extensibility.core -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.extensibility.execution -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.runner.reporters -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.runner.utility -\par }\pard\plain \ltrpar\ql \li0\ri0\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439 ---------------------------------------------------}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid10169937 -}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439 -\par }\pard \ltrpar\ql \li0\ri0\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid10169937 -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid16084641 https://www.nuget.org/packages -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid10169937 -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 Copyright 2015 Outercurve Foundation -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10169937 {\rtlch\fcs1 -\af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6573559 {\rtlch\fcs1 -\af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 Licensed under the Apache License, Version 2.0 (the "License"); -\par you may not use this file except in compliance with the License. -\par You may obtain a copy of the License at -\par -\par http://www.apache.org/licenses/LICENSE-2.0 -\par -\par Unless required by applicable law or agreed to in writing, software -\par distributed under the License is distributed on an "AS IS" BASIS, -\par WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -\par See the License for the specific language governing permissions and -\par limitations under the License.}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid6573559 -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid7092439 -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid6573559 -\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs20 -\ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439 --------------------------------------------------}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6573559 -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard\plain \ltrpar -\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls10\adjustright\rin0\lin720\itap0\pararsid10169937 \rtlch\fcs1 \af39\afs22\alang1025 \ltrch\fcs0 \f39\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs18 -\ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 Microsoft.CodeAnalysis.Analyzers -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.CodeAnalysis.Common -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.CodeAnalysis.CSharp -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.CodeAnalysis.VisualBasic -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.CSharp -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.DiaSymReader -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.DiaSymReader.Native -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.DotNet.Cli.Utils -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.DotNet.InternalAbstractions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.DotNet.ProjectModel -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.Extensions.DependencyModel -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.Extensions.Testing.Abstractions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.App -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.DotNetHost -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.DotNetHostPolicy -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.DotNetHostResolver -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Jit -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Platforms -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Portable.Compatibility -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Runtime -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Runtime.CoreCLR -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Runtime.Native -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Targets -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Windows.ApiSets -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.VisualBasic -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.Win32.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard \ltrpar -\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin720\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 Microsoft.Win32.Registry -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.Win32.Registry.AccessControl -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NETStandard.Library -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Collections -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Diagnostics.Tools -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Diagnostics.Tracing -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Globalization -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Globalization.Calendars -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.IO -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Reflection -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Reflection.Extensions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Reflection.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Resources.ResourceManager -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Runtime -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Runtime.Handles -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Runtime.InteropServices -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Text.Encoding -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Text.Encoding.Extensions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Threading.Tasks -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Threading.Timer -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.Microsoft.NETCore.DotNetHost -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.Microsoft.NETCore.DotNetHostPolicy -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.Microsoft.NETCore.DotNetHostResolver -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.Microsoft.NETCore.Jit -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.Microsoft.NETCore.Runtime.CoreCLR -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.runtime.native.System -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.runtime.native.System.IO.Compression -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.runtime.native.System.Net.Http -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.runtime.native.System.Net.Security -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.runtime.native.System.Security.Cryptography -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.native.System -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.native.System.Data.SqlClient.sni -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.native.System.IO.Compression -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.native.System.Net.Http -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.native.System.Net.Security -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.native.System.Security.Cryptography -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.Microsoft.NETCore.DotNetHost -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.Microsoft.NETCore.DotNetHostPolicy -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.Microsoft.NETCore.DotNetHostResolver -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.Microsoft.NETCore.Jit -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.Microsoft.NETCore.Runtime.CoreCLR -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.runtime.native.System -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.runtime.native.System.IO.Compression -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.runtime.native.System.Net.Http -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.runtime.native.System.Net.Security -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.Microsoft.NETCore.DotNetHost -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.Microsoft.NETCore.DotNetHostPolicy -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.Microsoft.NETCore.DotNetHostResolver -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.Microsoft.NETCore.Jit -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.Microsoft.NETCore.Runtime.CoreCLR -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.runtime.native.System -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.runtime.native.System.IO.Compression -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.runtime.native.System.Net.Http -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.runtime.native.System.Net.Security -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.runtime.native.System.Security.Cryptography -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.Microsoft.NETCore.DotNetHost -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.Microsoft.NETCore.DotNetHostPolicy -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.Microsoft.NETCore.DotNetHostResolver -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.Microsoft.NETCore.Jit -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.Microsoft.NETCore.Runtime.CoreCLR -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.runtime.native.System -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.Microsoft.NETCore.DotNetHost -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.Microsoft.NETCore.DotNetHostPolicy -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard \ltrpar -\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin720\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 -runtime.ubuntu.16.04-x64.Microsoft.NETCore.DotNetHostResolver -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.Microsoft.NETCore.Jit -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.Microsoft.NETCore.Runtime.CoreCLR -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.runtime.native.System -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.Microsoft.Win32.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.Console -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.Diagnostics.Debug -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.IO.FileSystem -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.Net.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.Net.Sockets -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.Private.Uri -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.Runtime.Extensions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.Microsoft.Win32.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.System.Console -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.System.Diagnostics.Debug -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.System.IO.FileSystem -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.System.Net.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.System.Net.Sockets -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.System.Runtime.Extensions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.Microsoft.NETCore.DotNetHost -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.Microsoft.NETCore.DotNetHostPolicy -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.Microsoft.NETCore.DotNetHostResolver -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.Microsoft.NETCore.Jit -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.Microsoft.NETCore.Runtime.CoreCLR -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.Microsoft.NETCore.Windows.ApiSets -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.runtime.native.System.Data.SqlClient.sni -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.runtime.native.System.IO.Compression -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x86.runtime.native.System.Data.SqlClient.sni -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7.System.Private.Uri -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win81-x64.Microsoft.NETCore.Windows.ApiSets -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.AppContext -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Buffers -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Collections -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Collections.Concurrent -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Collections.Immutable -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Collections.NonGeneric -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Collections.Specialized -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ComponentModel -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ComponentModel.Annotations -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ComponentModel.EventBasedAsync -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ComponentModel.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ComponentModel.TypeConverter -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Console -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Data.Common -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Data.SqlClient -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.Contracts -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.Debug -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.DiagnosticSource -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.FileVersionInfo -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.Process -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.StackTrace -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.TextWriterTraceListener -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.Tools -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.TraceSource -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.Tracing -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Dynamic.Runtime -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Globalization -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Globalization.Calendars -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Globalization.Extensions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.Compression -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.Compression.ZipFile -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.FileSystem -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.FileSystem.AccessControl -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard \ltrpar -\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin720\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 System.IO.FileSystem.DriveInfo -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.FileSystem.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.FileSystem.Watcher -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.MemoryMappedFiles -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.Packaging -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.Pipes -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.UnmanagedMemoryStream -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Linq -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Linq.Expressions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Linq.Parallel -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Linq.Queryable -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Http -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Http.WinHttpHandler -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.NameResolution -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.NetworkInformation -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Ping -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Requests -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Security -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Sockets -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.WebHeaderCollection -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.WebSockets -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.WebSockets.Client -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Numerics.Vectors -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ObjectModel -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Private.DataContractSerialization -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Private.ServiceModel -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Private.Uri -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.DispatchProxy -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.Emit -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.Emit.ILGeneration -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.Emit.Lightweight -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.Extensions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.Metadata -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.TypeExtensions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Resources.Reader -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard \ltrpar -\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin720\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 System.Resources.ResourceManager -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.CompilerServices.VisualC -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Extensions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Handles -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.InteropServices -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.InteropServices.PInvoke -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.InteropServices.RuntimeInformation -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Loader -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Numerics -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Serialization.Json -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Serialization.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Serialization.Xml -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.AccessControl -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Claims -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.Algorithms -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.Cng -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.Csp -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.Encoding -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.OpenSsl -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.Pkcs -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.X509Certificates -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Principal -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Principal.Windows -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.SecureString -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ServiceModel.Duplex -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ServiceModel.Http -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ServiceModel.NetTcp -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ServiceModel.Primitives -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard \ltrpar -\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin720\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 System.ServiceModel.Security -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ServiceProcess.ServiceController -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Text.Encoding -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Text.Encoding.CodePages -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Text.Encoding.Extensions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Text.Encodings.Web -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Text.RegularExpressions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.AccessControl -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Overlapped -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Tasks -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Tasks.Dataflow -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Tasks.Extensions -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Tasks.Parallel -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Thread -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.ThreadPool -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Timer -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.ReaderWriter -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.XDocument -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.XmlDocument -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.XmlSerializer -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.XPath -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.XPath.XDocument -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.XPath.XmlDocument -\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs20 -\ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439 ------------------------------------------------------- -\par -\par }\pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \ab\af40\afs24 \ltrch\fcs0 \b\f40\fs24\cf1\insrsid7092439\charrsid7092439 MICROSOFT SOFTWARE LICENSE TERMS }{\rtlch\fcs1 \ab\af40\afs28 \ltrch\fcs0 \b\f40\fs28\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \ab\af40\afs24 \ltrch\fcs0 \b\f40\fs24\cf1\insrsid7092439\charrsid7092439 MICROSOFT .NET LIBRARY }{\rtlch\fcs1 \ab\af40\afs28 \ltrch\fcs0 \b\f40\fs28\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 -These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms -also apply to any Microsoft -\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 -\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 updates,}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid7092439\charrsid7092439 }{ -\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 supplements,}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 Internet-based services, and -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 support services -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 -for this software, unless other terms accompany those items. If so, those terms apply. -\par BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE. -\par IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW. -\par }\pard \ltrpar\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 1.}{ -\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 -\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 INSTALLATION AND USE RIGHTS. -\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 a.}{ -\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ -\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 Installation and Use.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 -\f40\fs20\cf1\insrsid7092439\charrsid7092439 \~You may install and use any number of copies of the software to design, develop and test your programs. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 b.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 -\~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 Third Party Programs.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 -\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 \~ -The software may include third party programs that Microsoft, not the third party, licenses to you under this agreement. Notices, if any, for the third party program are included for your information only. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 -\b\f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 2.}{ -\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 -\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 DATA.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 -\af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to improve our products and services.\~ -You can learn more about data collection and use in the help documentation and the privacy statement at\~ }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid11493340 - HYPERLINK "http://go.microsoft.com/fwlink/?LinkId=528096&clcid=0x409" \\t "_blank" }}{\fldrslt {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\ul\cf2\insrsid7092439\charrsid7092439 http://go.microsoft.com/fwlink/?LinkId=528096}{\rtlch\fcs1 \af0\afs24 -\ltrch\fcs0 \f0\fs24\ul\cf1\insrsid7092439\charrsid7092439 }}}\sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 -. Your use of the software operates as your consent to these practices. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 3.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 -\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 -ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 a.}{ -\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ -\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 DISTRIBUTABLE CODE.\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 -\f40\fs20\cf1\insrsid7092439\charrsid7092439 The software is comprised of Distributable Code. \'93Distributable Code\'94 is code that you are permitted to distribute in programs you develop if you comply with the terms below. }{\rtlch\fcs1 \ab\af40\afs19 -\ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 i}{ -\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 .}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ -\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 -\b\f40\fs20\cf1\insrsid7092439\charrsid7092439 Right to Use and Distribute.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-357\li1434\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1434\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 -\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 You may copy and distribute the object code form of the software. }{\rtlch\fcs1 \af40\afs19 -\ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 -\f40\fs20\cf1\insrsid7092439\charrsid7092439 Third Party Distribution. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs. }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 ii.}{ -\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ -\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 Distribution Requirements.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 -\f40\fs20\cf1\insrsid7092439\charrsid7092439 \~}{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 For any Distributable Code you distribute, you must }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-357\li1434\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1434\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 -\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 add significant primary functionality to it in your programs; }{\rtlch\fcs1 \af40\afs19 -\ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 -\f40\fs20\cf1\insrsid7092439\charrsid7092439 require distributors and external end users to agree to terms that protect it at least as much as this agreement; }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 -\f40\fs20\cf1\insrsid7092439\charrsid7092439 display your valid copyright notice on your programs; and }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 -\f40\fs20\cf1\insrsid7092439\charrsid7092439 indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\rquote fees, related to the distribution or use of your programs. }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 iii.}{ -\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ -\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 Distribution Restrictions.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 -\f40\fs20\cf1\insrsid7092439\charrsid7092439 \~}{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 You may not}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 -\ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-357\li1434\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1434\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 -\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 alter any copyright, trademark or patent notice in the Distributable Code; }{\rtlch\fcs1 -\af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 -\f40\fs20\cf1\insrsid7092439\charrsid7092439 use Microsoft\rquote s trademarks in your programs\rquote names or in a way that suggests your programs come from or are endorsed by Microsoft; }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 -\f40\fs20\cf1\insrsid7092439\charrsid7092439 include Distributable Code in malicious, deceptive or unlawful programs; or }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 -\f40\fs20\cf1\insrsid7092439\charrsid7092439 - modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that }{\rtlch\fcs1 \af40\afs19 -\ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-358\li1792\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1792\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 -\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 the code be disclosed or distributed in source code form; or }{\rtlch\fcs1 \af40\afs19 -\ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 -\f40\fs20\cf1\insrsid7092439\charrsid7092439 others have the right to modify it. }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 4.}{ -\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 -\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 SCOPE OF LICENSE.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ -\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitt -ed in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 - -\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 -\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 work around any technical limitations in the software; -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation; -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 publish the software for others to copy; -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 rent, lease or lend the software; -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 transfer the software or this agreement to any third party; or -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 use the software for commercial software hosting services. -\par }\pard \ltrpar\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 5.}{ -\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 -\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 BACKUP COPY.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 -\af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 You may make one backup copy of the software. You may use it only to reinstall the software. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 -\b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 6.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 -\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -DOCUMENTATION.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 7.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 -\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -EXPORT RESTRICTIONS.\~ }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destin -ations, end users and end use. For additional information, see\~ }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\kerning36\insrsid7092439\charrsid7092439 www.microsoft.com/exporting}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 .}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 8.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 -\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -SUPPORT SERVICES.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 Because this software is \'93as is,\'94 - we may not provide support services for it. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 9.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 -\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -ENTIRE AGREEMENT.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 -\b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 10.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 -\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -APPLICABLE LAW.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 a.}{ -\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ -\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 United States.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 -If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other c -laims, including claims under state consumer protection laws, unfair competition laws, and in tort. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 b.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 -\~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 -Outside the United States. If you acquired the software in any other country, the laws of that country apply. -\par }\pard \ltrpar\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 11.}{ -\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 -\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 LEGAL EFFECT.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 -\af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of y -our country if the laws of your country do not permit it to do so. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 12.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 -\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \'93AS-IS.\'94 YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONS -UMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMEN -T. -\par }\pard \ltrpar\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 FOR AUSTRALIA \endash - YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS. }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 13.}{ -\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 -\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS -ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -\par }\pard \ltrpar\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 This limitation applies to}{\rtlch\fcs1 -\af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 -\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 - anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other d -amages. -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French. }{\rtlch\fcs1 -\af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 Remarque : Ce logiciel \'e9tant distribu\'e9 au Qu\'e9bec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en fran\'e7ais. } -{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 EXON\'c9 -RATION DE GARANTIE.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 Le logiciel vis\'e9 par une licence est offert \'ab - tel quel \'bb. Toute utilisation de ce logiciel est \'e0 votre seule risque et p\'e9ril. Microsoft n\rquote accorde aucune autre garantie expresse. Vous pouvez b\'e9n\'e9ficier de droits - additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualit\'e9 marchande, d\rquote ad\'e9quation \'e0 - un usage particulier et d\rquote absence de contrefa\'e7on sont exclues. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -\par LIMITATION DES DOMMAGES-INT\'c9R\'caTS ET EXCLUSION DE RESPONSABILIT\'c9 POUR LES DOMMAGES.\~ }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 Vous}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 -\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0 - hauteur de 5,00 $ US. Vous ne pouvez pr\'e9tendre \'e0 aucune indemnisation pour les autres dommages, y compris les dommages sp\'e9ciaux, indirects ou accessoires et pertes de b\'e9n\'e9fices. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 -\b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 Cette}{\rtlch\fcs1 -\af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 limitationconcerne:}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 -\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \li720\ri0\sb120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 -\af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 tout ce qui est reli\'e9 - au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \li720\ri0\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 -\af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 les r\'e9 -clamations au titre de violation de contrat ou de garantie, ou au titre de responsabilit\'e9 stricte, de n\'e9gligence ou d\rquote une autre faute dans la limite autoris\'e9e par la loi en vigueur. }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 Elle s\rquote -applique \'e9galement, m\'eame si Microsoft connaissait ou devrait conna\'eetre l\rquote \'e9ventualit\'e9 d\rquote un tel dommage. Si votre pays n\rquote autorise pas l\rquote exclusion ou la limitation de responsabilit\'e9 - pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l\rquote exclusion ci-dessus ne s\rquote appliquera pas \'e0 votre \'e9gard. }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 -\f40\fs19\cf1\insrsid7092439\charrsid7092439 -\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 EFFET JURIDIQUE. -\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 Le pr\'e9sent contrat d\'e9 -crit certains droits juridiques. Vous pourriez avoir d\rquote autres droits pr\'e9vus par les lois de votre pays. Le pr\'e9sent contrat ne modifie pas les droits que vous conf\'e8rent les lois de votre pays si celles-ci ne le permettent pas. }{ -\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 -\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs20 -\ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439 -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid16084641 -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439 -------------------------------------------------------- -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard\plain \ltrpar -\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid10169937 \rtlch\fcs1 \af39\afs22\alang1025 \ltrch\fcs0 \f39\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2 -\ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 NuGet.Common -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Configuration -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.DependencyResolver.Core -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Frameworks -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.LibraryModel -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Packaging -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Packaging.Core -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Packaging.Core.Types -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.ProjectModel -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Protocol.Core.Types -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Protocol.Core.v3 -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Repositories -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.RuntimeModel -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Versioning -\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs20 -\ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439 ---------------------------------------------------------- -\par -\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 -\af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid7092439 Copyright (c) .NET Foundation. All rights reserved. -\par -\par Licensed under the Apache License, Version 2.0 (the "License"); you may not use -\par these files except in compliance with the License. You may obtain a copy of the -\par License at -\par -\par http://www.apache.org/licenses/LICENSE-2.0 -\par -\par Unless required by applicable law or agreed to in writing, software distributed -\par under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -\par CONDITIONS OF ANY KIND, either express or implied. See the License for the -\par specific language governing permissions and limitations under the License. -\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs18 -\ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 -\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439 -\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6173475 {\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 -----------------------------------------}{ -\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid10363382 ----------------}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid6173475\charrsid6173475 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard\plain \ltrpar -\s16\ql \fi-360\li540\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl2\adjustright\rin0\lin540\itap0\pararsid10363382 \rtlch\fcs1 \af39\afs22\alang1025 \ltrch\fcs0 \f39\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2 -\ltrch\fcs0 \f2\fs18\insrsid6173475\charrsid6173475 Microsoft.Management.Infrastructure.dll -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid6173475\charrsid6173475 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.Management.Infrastructure.Native.dll -\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid6173475\charrsid6173475 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.Management.Infrastructure.Unmanaged.dll -\par }\pard\plain \ltrpar\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10363382 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 -{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\fs18\insrsid10363382 ----------------------------------------------------------}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\fs18\insrsid10363382\charrsid10363382 -\par }\pard\plain \ltrpar\s32\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 -\fs28\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 MICROSOFT SOFTWARE LICENSE TERMS -\par }\pard\plain \ltrpar\s33\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 -\fs28\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\fs24\insrsid7813854\charrsid6843334 \hich\af42\dbch\af11\loch\f42 MANAGEMENT.INFRASTRUCTURE.DLL }{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\fs24\insrsid7813854 -\par }{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\fs24\insrsid7813854\charrsid6843334 \hich\af42\dbch\af11\loch\f42 MANAGEMENT.INFRASTRUCTURE.NATIVE.DLL\hich\af42\dbch\af11\loch\f42 MANAGEMENT.INFRASTRUCTURE.UNMANAGED.DLL -\par }\pard \ltrpar\s33\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7813854 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid11493340 -{\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 1}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fillColor}{\sv 10526880}}{\sp{\sn fFilled}{\sv 1}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn alignHR}{\sv 1}}{\sp{\sn dxHeightHR}{\sv 30}} -{\sp{\sn fStandardHR}{\sv 1}}{\sp{\sn fHorizRule}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex1\picscaley1\piccropl0\piccropr0\piccropt0\piccropb0\picw7620\pich7620\picwgoal4320\pichgoal4320\wmetafile8}}{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\fs24\insrsid7813854\charrsid6112664 -\par }\sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}} -{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar -\s34\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\lang9\langfe1033\langnp9\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 -These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They apply to the software named above and any Microsoft services or software updates (except to the extent su\hich\af42\dbch\af11\loch\f42 -ch services or updates are accompanied by new or }{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 additional terms, in which case those different terms {\*\bkmkstart OLE_LINK84}{\*\bkmkstart OLE_LINK85} -apply prospectively {\*\bkmkend OLE_LINK84}{\*\bkmkend OLE_LINK85}and do not alter your or Microsoft\hich\f42 \rquote \loch\f42 s rights relating to pre-updated software or services}{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\lang9\langfe1033\langnp9\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 ). IF YOU COMPLY WITH THESE LICENSE TERMS, YO\hich\af42\dbch\af11\loch\f42 U HAVE THE RIGHTS BELOW. }{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\lang9\langfe1033\langnp9\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854 \hich\af40\dbch\af11\loch\f40 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854 \hich\af42\dbch\af11\loch\f42 INSTALLATION AND USE RIGHTS}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\*\bkmkstart OLE_LINK124}{\*\bkmkstart OLE_LINK125}{\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 a)\tab}}\pard\plain \ltrpar -\s2\ql \fi-360\li717\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls13\outlinelevel1\adjustright\rin0\lin717\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 General.}{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 You may install and use any number of copies of the software on your devices. -\par {\*\bkmkend OLE_LINK124}{\*\bkmkend OLE_LINK125}{\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 b)\tab}}{\rtlch\fcs1 \af42 -\ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 Included Microsoft Applications.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 - The software may include other Microsoft applications. These license terms apply to those included applications, if any, {\*\bkmkstart OLE_LINK80}{\*\bkmkstart OLE_LINK81}unless other license terms are provided with the other Microsoft applications -{\*\bkmkend OLE_LINK80}{\*\bkmkend OLE_LINK81}.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 c)\tab}\hich\af42\dbch\af11\loch\f42 Third Party Software.}{\rtlch\fcs1 \af42 -\ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 The software may include third pa\hich\af42\dbch\af11\loch\f42 -rty applications that are licensed to you under this agreement or under their own terms. License terms, notices, and acknowledgements, if any, for the third party applications may be accessible online at }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af40 -\ltrch\fcs0 \insrsid11493340 \hich\af40\dbch\af11\loch\f40 HYPERLINK "http://aka.ms/thirdpartynotices" }}{\fldrslt {\rtlch\fcs1 \af42 \ltrch\fcs0 \cs19\f42\ul\cf1\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 http -\hich\af42\dbch\af11\loch\f42 ://aka.ms/thirdpartynotices}}}\sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 - or in an accompanying notices file. Even if such applications are governed by other agreements, the disclaimer, limitations on, and exclusions of damages below also apply to the extent allowed by applicable law.}{\rtlch\fcs1 \af42 \ltrch\fcs0 -\b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854 \hich\af40\dbch\af11\loch\f40 2.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854 \hich\af42\dbch\af11\loch\f42 TIME-SENSITIVE S\hich\af42\dbch\af11\loch\f42 OFTWARE}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 a)\tab}}\pard\plain \ltrpar -\s2\ql \fi-360\li717\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls14\outlinelevel1\adjustright\rin0\lin717\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 Period.}{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 The software is time-sensitive and may stop running on a date that is defined in the software.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 b)\tab}\hich\af42\dbch\af11\loch\f42 Notice.}{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 You may receive periodic reminder notices of this date through the software.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 c)\tab}\hich\af42\dbch\af11\loch\f42 Access to data.}{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 You may not be able to access data used in the software when it stops running.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 3.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 PRE-RELEASE SOFTWARE.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 - The software is a pre-release version. It may not operate correctly. It may be different from the commercially released version.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 4.\tab}\hich\af42\dbch\af11\loch\f42 FEEDBACK.}{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 If you give fee\hich\af42\dbch\af11\loch\f42 -dback about the software to Microsoft, you give to Microsoft, without charge, the right to use, share and commercialize your feedback in any way and for any purpose. You will not give feedback that is subject to a license that requires Microsoft to licens -\hich\af42\dbch\af11\loch\f42 e\hich\af42\dbch\af11\loch\f42 its software or documentation to third parties because Microsoft includes your feedback in them. These rights survive this agreement.}{\rtlch\fcs1 \af42 \ltrch\fcs0 -\b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 5.\tab}\hich\af42\dbch\af11\loch\f42 DATA COLLECTION.}{\rtlch\fcs1 \af42 -\ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 The software may collect information about you and your use of the software and send that to Microsoft. \hich\af42\dbch\af11\loch\f42 -Microsoft may use this information to provide services and improve Microsoft\hich\f42 \rquote \loch\f42 -s products and services. Your opt-out rights, if any, are described in the product documentation. Some features in the software may enable collection of data from users of your a\hich\af42\dbch\af11\loch\f42 p\hich\af42\dbch\af11\loch\f42 -plications that access or use the software. If you use these features to enable data collection in your applications, you must comply with applicable law, including getting any required user consent, and maintain a prominent privacy policy that accurately -\hich\af42\dbch\af11\loch\f42 \hich\af42\dbch\af11\loch\f42 informs users about how you use, collect, and share their data. You can learn more about Microsoft\hich\f42 \rquote \loch\f42 -s data collection and use in the product documentation and the Microsoft Privacy Statement}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\delrsid16459130\charrsid6112664 \hich\af42\dbch\af11\loch\f42 }{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 at }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af40 \ltrch\fcs0 \insrsid11493340 \hich\af40\dbch\af11\loch\f40 HYPERLINK "https://go.microsoft.com/fwlink/?LinkId=521839" }}{\fldrslt { -\rtlch\fcs1 \af42 \ltrch\fcs0 \cs19\f42\ul\cf1\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 https://go.microsoft.com/fwlink/?LinkId=521839}}}\sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af42 -\ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 . You agree to comply with all applicable provisions of the Microsoft Privacy Statement.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 6.\tab}\hich\af42\dbch\af11\loch\f42 FONTS.}{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 While the software is running, you may use its fonts to display and print content. You may only (i) embed fonts in\hich\af42\dbch\af11\loch\f42 - content as permitted by the embedding restrictions in the fonts; and (ii) temporarily download them to a printer or other output device to help print content.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 7.\tab}\hich\af42\dbch\af11\loch\f42 SCOPE OF LICENSE.}{\rtlch\fcs1 \af42 -\ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 The software is licensed, not sold. Microsoft reserves all other rights. Unles\hich\af42\dbch\af11\loch\f42 -s applicable law gives you more rights despite this limitation, you will not (and have no right to):}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 a)\tab}}\pard\plain \ltrpar -\s2\ql \fi-360\li717\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls15\outlinelevel1\adjustright\rin0\lin717\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 -work around any technical limitations in the software that only allow you to use it in certain ways; -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 b)\tab}\hich\af42\dbch\af11\loch\f42 -reverse engineer, decompile or disassemble the softwar\hich\af42\dbch\af11\loch\f42 e; -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 c)\tab}\hich\af42\dbch\af11\loch\f42 -remove, minimize, block, or modify any notices of Microsoft or its suppliers in the software; -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 d)\tab}\hich\af42\dbch\af11\loch\f42 -use the software in any way that is against the law or to create or propagate malware; or -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 e)\tab}\hich\af42\dbch\af11\loch\f42 -share, publish, distribute, or lend the software, provide the softwar\hich\af42\dbch\af11\loch\f42 e as a stand-alone hosted solution for others to use, or transfer the software or this agreement to any third party. -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 8.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 EXPORT RESTRICTIONS.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 - You must comply with all domestic and international export laws and regulations that apply to the software, which incl\hich\af42\dbch\af11\loch\f42 -ude restrictions on destinations, end users, and end use. For further information on export restrictions, visit }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af40 \ltrch\fcs0 \insrsid11493340 \hich\af40\dbch\af11\loch\f40 HYPERLINK "http://aka.ms/exporting" -}}{\fldrslt {\rtlch\fcs1 \af42 \ltrch\fcs0 \cs19\f42\ul\cf1\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 http://aka.ms/exporting}}}\sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\insrsid7813854\charrsid6112664 .}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 9.\tab}\hich\af42\dbch\af11\loch\f42 SUPPORT SERVICES.}{\rtlch\fcs1 \af42 -\ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 Microsoft is not obligated under this agreement to provide an\hich\af42\dbch\af11\loch\f42 \hich\f42 y support services for the software. Any support provided is \'93\loch\f42 -\hich\f42 as is\'94\loch\f42 \hich\f42 , \'93\loch\f42 \hich\f42 with all faults\'94\loch\f42 , and without warranty of any kind.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 10.\tab}\hich\af42\dbch\af11\loch\f42 UPDATES.}{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 The software may periodically check for updates, and download and install them for you. You may obtain updates only from Mic\hich\af42\dbch\af11\loch\f42 -rosoft or authorized sources. Microsoft may need to update your system to provide you with updates. You agree to receive these automatic updates without any additional notice. Updates may not include or support all existing software features, services, or -\hich\af42\dbch\af11\loch\f42 \hich\af42\dbch\af11\loch\f42 peripheral devices.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 11.\tab}\hich\af42\dbch\af11\loch\f42 ENTIRE AGREEMENT.}{\rtlch\fcs1 \af42 -\ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 This agreement, and any other terms Microsoft may provide for supplements, updates, or third-party applications, is the entire agreement for the software. -\par {\*\bkmkstart OLE_LINK170}{\*\bkmkstart OLE_LINK171}{\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 12.\tab}}{\rtlch\fcs1 \af42 -\ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 - If you acquired the software in the United States or Canada, the laws of the state or province where you live (or, if a business, where your principal place of business is located) govern the interpretation of this agreement, claims for its breach, and a -\hich\af42\dbch\af11\loch\f42 l\hich\af42\dbch\af11\loch\f42 -l other claims (including consumer protection, unfair competition, and tort claims), regardless of conflict of laws principles. If you acquired the software in any other country, its laws apply. If U.S. federal jurisdiction exists, you and Microsoft conse -\hich\af42\dbch\af11\loch\f42 n\hich\af42\dbch\af11\loch\f42 -t to exclusive jurisdiction and venue in the federal court in King County, Washington for all disputes heard in court. If not, you and Microsoft consent to exclusive jurisdiction and venue in the Superior Court of King County, Washington for all disputes -\hich\af42\dbch\af11\loch\f42 h\hich\af42\dbch\af11\loch\f42 eard in court.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\*\bkmkend OLE_LINK170}{\*\bkmkend OLE_LINK171}{\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 13.\tab} -\hich\af42\dbch\af11\loch\f42 CONSUMER RIGHTS; REGIONAL VARIATIONS.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 - This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state, province, or country. Separate and apart from your relationship with Mic\hich\af42\dbch\af11\loch\f42 -rosoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state, province, or country do not permit it to do so. For example, if you acquired the -\hich\af42\dbch\af11\loch\f42 s\hich\af42\dbch\af11\loch\f42 oftware in one of the below regions, or mandatory country law applies, then the following provisions apply to you:}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 a)\tab}}\pard\plain \ltrpar -\s2\ql \fi-360\li717\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls16\outlinelevel1\adjustright\rin0\lin717\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 Australia.}{\rtlch\fcs1 \af42 \ltrch\fcs0 -\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 b)\tab}}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\hich\af42\dbch\af11\loch\f42 Canada.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 - If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking -\hich\af42\dbch\af11\loch\f42 for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. -\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 c)\tab}}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 -\hich\af42\dbch\af11\loch\f42 Germany and Austria. -\par }\pard\plain \ltrpar\ql \fi-360\li1080\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1080\itap0\pararsid7813854 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 i.\tab Warranty. The properly licensed software will perform subs -tantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. -\par ii.\tab Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law. -\par }\pard\plain \ltrpar\s1\ql \li717\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin717\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 -Subject to the foregoing clause ii., Microsoft will only be liable for slight negligence if Microsoft is in br\hich\af42\dbch\af11\loch\f42 -each of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-ca -\hich\af42\dbch\af11\loch\f42 l\hich\af42\dbch\af11\loch\f42 led "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence. -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 14.\tab}}\pard \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar -\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7813854 {\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 \hich\f42 -DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \'93\loch\f42 \hich\f42 AS IS.\'94\loch\f42 YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, \hich\af42\dbch\af11\loch\f42 -GUARANTEES, OR CONDITIONS. TO THE EXTENT PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. -\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 15.\tab}\hich\af42\dbch\af11\loch\f42 -LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY \hich\af42\dbch\af11\loch\f42 -BASIS FOR RECOVERING DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIREC -\hich\af42\dbch\af11\loch\f42 T\hich\af42\dbch\af11\loch\f42 OR INCIDENTAL DAMAGES. -\par }\pard\plain \ltrpar\s31\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid7813854 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 -This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) {\*\bkmkstart OLE_LINK76}{\*\bkmkstart OLE_LINK77} -claims for breach of contract, warranty, guarantee, or condition\hich\af42\dbch\af11\loch\f42 ; strict liability, negligence, or other tort; or any other claim; in each case to the extent permitted by applicable law.{\*\bkmkend OLE_LINK76} -{\*\bkmkend OLE_LINK77} -\par \hich\af42\dbch\af11\loch\f42 It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion m\hich\af42\dbch\af11\loch\f42 -ay not apply to you because your state, province, or country may not allow the exclusion or limitation of incidental, consequential, or other damages. -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 -\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 -\par }\pard\plain \ltrpar\s31\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7813854 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 -\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 -Please note: As this software is distributed in Canada, some of the clauses in this agreement are provid\hich\af42\dbch\af11\loch\f42 ed below in French. -\par \hich\af42\dbch\af11\loch\f42 \hich\f42 Remarque: Ce logiciel \'e9\loch\f42 \hich\f42 tant distribu\'e9\loch\f42 \hich\f42 au Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en fran\'e7\loch\f42 ais. -\par \hich\af42\dbch\af11\loch\f42 \hich\f42 EXON\'c9\loch\f42 \hich\f42 RATION DE GARANTIE. Le logiciel vis\'e9\loch\f42 \hich\f42 par une licence est offert \'ab\loch\f42 \hich\f42 tel quel \'bb\loch\f42 . Toute utilisation de ce logi -\hich\af42\dbch\af11\loch\f42 \hich\f42 ciel est \'e0\loch\f42 \hich\f42 votre seule risque et p\'e9\loch\f42 ril. Microsoft n\hich\f42 \rquote \loch\f42 \hich\f42 accorde aucune autre garantie expresse. Vous pouvez b\'e9\loch\f42 \hich\f42 n\'e9 -\loch\f42 ficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permis\hich\af42\dbch\af11\loch\f42 e\hich\af42\dbch\af11\loch\f42 \hich\f42 -s par le droit locale, les garanties implicites de qualit\'e9\loch\f42 marchande, d\hich\f42 \rquote \loch\f42 \hich\f42 ad\'e9\loch\f42 \hich\f42 quation \'e0\loch\f42 un usage particulier et d\hich\f42 \rquote \loch\f42 \hich\f42 absence de contrefa -\'e7\loch\f42 on sont exclues. -\par \hich\af42\dbch\af11\loch\f42 \hich\f42 LIMITATION DES DOMMAGES-INT\'c9\loch\f42 \hich\f42 R\'ca\loch\f42 \hich\f42 TS ET EXCLUSION DE RESPONSABILIT\'c9\loch\f42 POUR LES DOMMAGES. Vous pouvez obtenir de Mi\hich\af42\dbch\af11\loch\f42 \hich\f42 -crosoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0\loch\f42 \hich\f42 hauteur de 5,00 $ US. Vous ne pouvez pr\'e9\loch\f42 \hich\f42 tendre \'e0\loch\f42 \hich\f42 - aucune indemnisation pour les autres dommages, y compris les dommages sp\'e9\loch\f42 ciaux, indirects ou accessoires et pertes de\hich\af42\dbch\af11\loch\f42 \hich\af42\dbch\af11\loch\f42 \hich\f42 b\'e9\loch\f42 \hich\f42 n\'e9\loch\f42 fices. -\par \hich\af42\dbch\af11\loch\f42 Cette limitation concerne: -\par }\pard \ltrpar\s31\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid7813854 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \bullet \tab \hich\af42\dbch\af11\loch\f42 -\hich\f42 tout ce qui est reli\'e9\loch\f42 au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers; et -\par \bullet \tab \hich\af42\dbch\af11\loch\f42 \hich\f42 les r\'e9\loch\f42 clamations au titre de violation de contrat ou de garan\hich\af42\dbch\af11\loch\f42 \hich\f42 tie, ou au titre de responsabilit\'e9\loch\f42 \hich\f42 stricte, de n\'e9\loch\f42 -gligence ou d\hich\f42 \rquote \loch\f42 \hich\f42 une autre faute dans la limite autoris\'e9\loch\f42 e par la loi en vigueur. -\par }\pard \ltrpar\s31\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7813854 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 Elle s\hich\f42 \rquote -\loch\f42 \hich\f42 applique \'e9\loch\f42 \hich\f42 galement, m\'ea\loch\f42 \hich\f42 me si Microsoft connaissait ou devrait conna\'ee\loch\f42 tre l\hich\f42 \rquote \'e9\loch\f42 \hich\f42 ventualit\'e9\loch\f42 d\hich\f42 \rquote \loch\f42 -un tel dommage. Si votre pays n\hich\f42 \rquote \loch\f42 aut\hich\af42\dbch\af11\loch\f42 orise pas l\hich\f42 \rquote \loch\f42 \hich\f42 exclusion ou la limitation de responsabilit\'e9\loch\f42 - pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l\hich\f42 \rquote \loch\f42 exclusion ci-dessus ne s\hich\f42 \rquote \loch\f42 \hich\f42 appliquera pas \'e0\loch\f42 \hich\f42 votre \'e9 -\loch\f42 gard. -\par \hich\af42\dbch\af11\loch\f42 \hich\f42 EFFET JURIDIQUE. Le pr\'e9\loch\f42 sent contrat\hich\af42\dbch\af11\loch\f42 \hich\f42 d\'e9\loch\f42 crit certains droits juridiques. Vous pourriez avoir d\hich\f42 \rquote \loch\f42 \hich\f42 autres droits pr -\'e9\loch\f42 \hich\f42 vus par les lois de votre pays. Le pr\'e9\loch\f42 \hich\f42 sent contrat ne modifie pas les droits que vous conf\'e8\loch\f42 rent les lois de votre pays si celles-ci ne le permettent pas. -\par }\pard\plain \ltrpar\ql \li0\ri0\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6173475 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { -\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid8394862 -\par }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid6573559 -\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a -9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad -5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 -b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 -0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 -a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f -c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 -0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 -a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 -6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b -4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b -4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210007b740aaca0600008f1a0000160000007468656d652f7468656d652f -7468656d65312e786d6cec595b8bdb46147e2ff43f08bd3bbe49be2cf1065bb69336bb49889d943cceda636bb2238dd18c776342a0244f7d2914d2d28706fad6 -87521a68a0a12ffd310b1bdaf447f4cc489667ec71f6420aa1640d8b34face996fce39face48ba7aed51449d239c70c2e2965bbe52721d1c8fd898c4d3967b6f -d82f345c870b148f1165316eb90bccdd6bbb9f7e7215ed881047d801fb98efa0961b0a31db2916f9088611bfc26638866b13964448c069322d8e13740c7e235a -ac944ab5628448ec3a318ac0ededc9848cb033942edddda5f31e85d358703930a2c940bac68685c28e0fcb12c1173ca089738468cb8579c6ec78881f09d7a188 -0bb8d0724beacf2dee5e2da29dcc888a2db69a5d5ffd657699c1f8b0a2e64ca607f9a49ee77bb576ee5f01a8d8c4f5eabd5aaf96fb5300341ac14a532eba4fbf -d3ec74fd0cab81d2438bef6ebd5b2d1b78cd7f758373db973f03af40a97f6f03dfef07104503af4029dedfc07b5ebd1278065e81527c6d035f2fb5bb5eddc02b -5048497cb8812ef9b56ab05c6d0e99307ac30a6ffa5ebf5ec99caf50500d7975c929262c16db6a2d420f59d2078004522448ec88c50c4fd008aa3840941c24c4 -d923d3100a6f8662c661b85429f54b55f82f7f9e3a5211413b1869d6921730e11b43928fc34709998996fb39787535c8e9ebd7274f5f9d3cfdfde4d9b393a7bf -66732b5786dd0d144f75bbb73f7df3cf8b2f9dbf7ffbf1edf36fd3a9d7f15cc7bff9e5ab377ffcf92ef7b0e255284ebf7bf9e6d5cbd3efbffeebe7e716efed04 -1de8f0218930776ee163e72e8b608116fef820b998c5304444b768c7538e622467b1f8ef89d040df5a208a2cb80e36e3783f01a9b101afcf1f1a8407613217c4 -e2f1661819c07dc6688725d628dc947369611ecee3a97df264aee3ee2274649b3b40b191e5de7c061a4b6c2e83101b34ef50140b34c531168ebcc60e31b6acee -0121465cf7c928619c4d84f380381d44ac21199203a39a56463748047959d80842be8dd8ecdf773a8cda56ddc5472612ee0d442de487981a61bc8ee602453697 -4314513de07b48843692834532d2713d2e20d3534c99d31b63ce6d36b71358af96f49b2033f6b4efd345642213410e6d3ef710633ab2cb0e831045331b7640e2 -50c77ec60fa144917387091b7c9f9977883c873ca0786bbaef136ca4fb6c35b8070aab535a1588bc324f2cb9bc8e9951bf83059d20aca4061a80a1eb1189cf14 -f93579f7ff3b7907113dfde1856545ef47d2ed8e8d7c5c50ccdb09b1de4d37d6247c1b6e5db803968cc987afdb5d348fef60b855369bd747d9fe28dbeeff5eb6 -b7ddcfef5fac57fa0cd22db7ade9765d6ddea3ad7bf709a174201614ef71b57de7d095c67d189476eab915e7cf72b3100ee59d0c1318b86982948d9330f10511 -e1204433d8e3975de964ca33d753eecc1887adbf1ab6fa96783a8ff6d9387d642d97e5e3692a1e1c89d578c9cfc7e17143a4e85a7df51896bb576ca7ea717949 -40da5e8484369949a26a21515f0eca20a98773089a85845ad97b61d1b4b06848f7cb546db0006a795660dbe4c066abe5fa1e9880113c55218ac7324f69aa97d9 -55c97c9f99de164ca302600fb1ac8055a69b92ebd6e5c9d5a5a5768e4c1b24b4723349a8c8a81ec64334c65975cad1f3d0b868ae9bab941af46428d47c505a2b -1af5c6bb585c36d760b7ae0d34d69582c6ce71cbad557d2899119ab5dc093cfac3613483dae172bb8be814de9f8d4492def097519659c24517f1300db8129d54 -0d222270e25012b55cb9fc3c0d34561aa2b8952b20081f2cb926c8ca87460e926e26194f267824f4b46b2332d2e929287caa15d6abcafcf26069c9e690ee4138 -3e760ee83cb98ba0c4fc7a5906704c38bc012aa7d11c1378a5990bd9aafed61a5326bbfa3b455543e938a2b310651d4517f314aea43ca7a3cef2186867d99a21 -a05a48b2467830950d560faad14df3ae9172d8da75cf369291d34473d5330d55915dd3ae62c60ccb36b016cbcb35798dd532c4a0697a874fa57b5d729b4bad5b -db27e45d02029ec7cfd275cfd110346aabc90c6a92f1a60c4bcdce46cddeb15ce019d4ced32434d5af2dddaec52def11d6e960f0529d1fecd6ab168626cb7da5 -8ab4faf6a17f9e60070f413cbaf022784e0557a9848f0f09820dd140ed4952d9805be491c86e0d3872e60969b98f4b7edb0b2a7e502835fc5ec1ab7aa542c36f -570b6ddfaf967b7eb9d4ed549e4063116154f6d3ef2e7d780d4517d9d71735bef105265abe69bb32625191a92f2c45455c7d812957b67f81710888cee35aa5df -ac363bb542b3daee17bc6ea7516806b54ea15b0beadd7e37f01bcdfe13d7395260af5d0dbc5aaf51a89583a0e0d54a927ea359a87b954adbabb71b3daffd24db -c6c0ca53f9c86201e155bc76ff050000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f7468656d652f5f72 -656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c08 -2e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd0 -8a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa -4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c0200001300000000000000000000000000000000005b436f -6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000000000000000300100005f72 -656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000190200007468656d652f746865 -6d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210007b740aaca0600008f1a00001600000000000000000000000000d60200 -007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027000000000000000000000000 -00d40900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000cf0a00000000} -{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d -617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 -6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 -656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} -{\*\latentstyles\lsdstimax373\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 4; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 7; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 3; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 4; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 1; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 5; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 4; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 8; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 4; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 8; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Contemporary; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Elegant;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Professional;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Subtle 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Subtle 2; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority39 \lsdlocked0 Table Grid;\lsdsemihidden1 \lsdlocked0 Placeholder Text; -\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2; -\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List; -\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1; -\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision; -\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1; -\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1; -\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; -\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2; -\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; -\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; -\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3; -\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4; -\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; -\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4; -\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5; -\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; -\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; -\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; -\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; -\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; -\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; -\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4; -\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4; -\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1; -\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1; -\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2; -\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2; -\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3; -\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4; -\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4; -\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5; -\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5; -\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6; -\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6; -\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark; -\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1; -\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1; -\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2; -\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3; -\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3; -\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4; -\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4; -\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5; -\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5; -\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6; -\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Mention; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Smart Hyperlink;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000c051 -85b5e0f4d101feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} +{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f11\fbidi \froman\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;} +{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f40\fbidi \fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Tahoma;}{\f41\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS;} +{\f42\fbidi \fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Segoe UI;}{\f43\fbidi \froman\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f44\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f45\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f47\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f48\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f49\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f50\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f51\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f52\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f64\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f65\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f67\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f68\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f69\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f70\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f71\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f72\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f434\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f435\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\f437\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f438\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f439\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\f440\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);} +{\f441\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f442\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f444\fbidi \fswiss\fcharset238\fprq2 Tahoma CE;}{\f445\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr;} +{\f447\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek;}{\f448\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur;}{\f449\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);}{\f450\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);} +{\f451\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f452\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}{\f453\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai);}{\f454\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE;} +{\f455\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr;}{\f457\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek;}{\f458\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur;}{\f461\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic;} +{\f464\fbidi \fswiss\fcharset238\fprq2 Segoe UI CE;}{\f465\fbidi \fswiss\fcharset204\fprq2 Segoe UI Cyr;}{\f467\fbidi \fswiss\fcharset161\fprq2 Segoe UI Greek;}{\f468\fbidi \fswiss\fcharset162\fprq2 Segoe UI Tur;} +{\f469\fbidi \fswiss\fcharset177\fprq2 Segoe UI (Hebrew);}{\f470\fbidi \fswiss\fcharset178\fprq2 Segoe UI (Arabic);}{\f471\fbidi \fswiss\fcharset186\fprq2 Segoe UI Baltic;}{\f472\fbidi \fswiss\fcharset163\fprq2 Segoe UI (Vietnamese);} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\fhimajor\f31529\fbidi \fswiss\fcharset204\fprq2 Calibri Light Cyr;} +{\fhimajor\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;}{\fhimajor\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;}{\fhimajor\f31533\fbidi \fswiss\fcharset177\fprq2 Calibri Light (Hebrew);} +{\fhimajor\f31534\fbidi \fswiss\fcharset178\fprq2 Calibri Light (Arabic);}{\fhimajor\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;}{\fhimajor\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);} +{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31573\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\fhiminor\f31574\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; +\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red51\green51\blue51;}{\*\defchp \f31506\fs22 }{\*\defpap \ql \li0\ri0\sa160\sl259\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 +\ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 \slink22 \sqformat \styrsid7813854 heading 1;}{ +\s2\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext2 \slink23 \sqformat \styrsid7813854 heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 +\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext3 \slink24 \sqformat \styrsid7813854 heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar +\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext4 \slink25 \sqformat \styrsid7813854 heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 +\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext5 \slink26 \sqformat \styrsid7813854 heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar +\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext6 \slink27 \sqformat \styrsid7813854 heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 +\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext7 \slink28 \sqformat \styrsid7813854 heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar +\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext8 \slink29 \sqformat \styrsid7813854 heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 +\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext9 \slink30 \sqformat \styrsid7813854 heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 +Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused +Normal Table;}{\s15\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext15 \ssemihidden \sunhideused \styrsid3804850 Normal (Web);}{\s16\ql \li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af39\afs22\alang1025 \ltrch\fcs0 +\f39\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext16 \sqformat \spriority34 \styrsid6173475 List Paragraph;}{\s17\ql \li0\ri0\widctlpar +\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0 +\f2\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext17 \slink18 \ssemihidden \sunhideused \styrsid6573559 HTML Preformatted;}{\*\cs18 \additive \rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20 +\sbasedon10 \slink17 \slocked \ssemihidden \styrsid6573559 HTML Preformatted Char;}{\*\cs19 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf1 \sbasedon10 \sunhideused \styrsid7092439 Hyperlink;}{\*\cs20 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 +\sbasedon10 \spriority0 \styrsid7092439 spelle;}{\*\cs21 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 \spriority0 \styrsid7092439 grame;}{\*\cs22 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \fs19\loch\f40\hich\af40\dbch\af11 +\sbasedon10 \slink1 \slocked \styrsid7813854 Heading 1 Char;}{\*\cs23 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink2 \slocked \styrsid7813854 Heading 2 Char;}{\*\cs24 \additive \rtlch\fcs1 +\af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink3 \slocked \styrsid7813854 Heading 3 Char;}{\*\cs25 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 +\sbasedon10 \slink4 \slocked \styrsid7813854 Heading 4 Char;}{\*\cs26 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink5 \slocked \styrsid7813854 Heading 5 Char;}{\*\cs27 \additive \rtlch\fcs1 +\af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink6 \slocked \styrsid7813854 Heading 6 Char;}{\*\cs28 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 +\sbasedon10 \slink7 \slocked \styrsid7813854 Heading 7 Char;}{\*\cs29 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink8 \slocked \styrsid7813854 Heading 8 Char;}{\*\cs30 \additive \rtlch\fcs1 +\af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink9 \slocked \styrsid7813854 Heading 9 Char;}{\s31\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 \styrsid7813854 Body 1;}{ +\s32\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 \fs28\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 \styrsid7813854 Heading EULA;}{\s33\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 +\fs28\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid7813854 Heading Software Title;}{\s34\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 +\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 \styrsid7813854 +Preamble Border Above;}}{\*\listtable{\list\listtemplateid412752146\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 +\fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 +\fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 +\fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid256596791}{\list\listtemplateid-234466468 +\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid268852893}{\list\listtemplateid2071779370\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers +;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid472724034}{\list\listtemplateid837583652\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers +;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 +\fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 +\fi-360\li6480\lin6480 }{\listname ;}\listid678236712}{\list\listtemplateid468190476\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 +\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 +\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 +\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname +;}\listid696808916}{\list\listtemplateid256027766\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 +\fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 +\fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 +\fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid833446968}{\list\listtemplateid812297174 +{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \b\hres0\chhres0 \fi-360\li717\lin717 }{\listlevel\levelnfc4\levelnfcn4\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1077\lin1077 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1437\lin1437 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1797\lin1797 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2157\lin2157 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\hres0\chhres0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2877\lin2877 } +{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc2\levelnfcn2\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3597\lin3597 }{\listname ;}\listid888110291}{\list\listtemplateid812297174{\listlevel\levelnfc4 +\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \b\hres0\chhres0 \fi-360\li717\lin717 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1077\lin1077 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1437\lin1437 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1797\lin1797 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2157\lin2157 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\hres0\chhres0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2877\lin2877 } +{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc2\levelnfcn2\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3597\lin3597 }{\listname ;}\listid1282881056}{\list\listtemplateid827650700\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid1470391773}{\list\listtemplateid-1331279738\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 +\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid1543639483}{\list\listtemplateid812297174{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \b\hres0\chhres0 \fi-360\li717\lin717 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1077\lin1077 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1437\lin1437 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers +\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1797\lin1797 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\hres0\chhres0 \fi-360\li2157\lin2157 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2517\lin2517 } +{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2877\lin2877 }{\listlevel\levelnfc4\levelnfcn4\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3597\lin3597 }{\listname ;}\listid1670060985}{\list\listtemplateid-1676387632{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0\hres0\chhres0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\b\i0\f3\fs20\fbias0\hres0\chhres0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0\hres0\chhres0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af41\afs20 \ltrch\fcs0 \b0\i0\strike0\f41\fs20\ulnone\fbias0\hres0\chhres0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af41\afs20 \ltrch\fcs0 \b0\i0\strike0\f41\fs20\ulnone\fbias0\hres0\chhres0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 } +{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af41\afs20 \ltrch\fcs0 \b0\i0\f41\fs20\fbias0\hres0\chhres0 \s6\fi-357\li2149 +\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af41\afs20 \ltrch\fcs0 \b0\i0\f41\fs20\fbias0\hres0\chhres0 +\s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af41\afs20 \ltrch\fcs0 +\b0\i0\f41\fs20\fbias0\hres0\chhres0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af41\afs20 +\ltrch\fcs0 \b0\i0\f41\fs20\fbias0\hres0\chhres0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid1743720866}{\list\listtemplateid-646571904\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers +;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname ;}\listid2003921709}{\list\listtemplateid1067461628\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers +;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0\hres0\chhres0 \fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0\hres0\chhres0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 +\fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 +\fi-360\li6480\lin6480 }{\listname ;}\listid2022782249}{\list\listtemplateid1736062262\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;} +\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;} +\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 +\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 +\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 +\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname +;}\listid2055036124}{\list\listtemplateid812297174{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \b\hres0\chhres0 +\fi-360\li717\lin717 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1077\lin1077 }{\listlevel +\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1437\lin1437 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1797\lin1797 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2157\lin2157 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2517\lin2517 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2877\lin2877 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\hres0\chhres0 \fi-360\li3237\lin3237 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3597\lin3597 } +{\listname ;}\listid2106000387}}{\*\listoverridetable{\listoverride\listid256596791\listoverridecount0\ls1}{\listoverride\listid1543639483\listoverridecount0\ls2}{\listoverride\listid268852893\listoverridecount0\ls3}{\listoverride\listid678236712 +\listoverridecount0\ls4}{\listoverride\listid2022782249\listoverridecount0\ls5}{\listoverride\listid472724034\listoverridecount0\ls6}{\listoverride\listid1470391773\listoverridecount0\ls7}{\listoverride\listid2003921709\listoverridecount0\ls8} +{\listoverride\listid2055036124\listoverridecount0\ls9}{\listoverride\listid696808916\listoverridecount0\ls10}{\listoverride\listid833446968\listoverridecount0\ls11}{\listoverride\listid1743720866\listoverridecount0\ls12}{\listoverride\listid1670060985 +\listoverridecount0\ls13}{\listoverride\listid1282881056\listoverridecount0\ls14}{\listoverride\listid888110291\listoverridecount0\ls15}{\listoverride\listid2106000387\listoverridecount0\ls16}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0 +\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp10\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li300\ri300\sb300\sa300}{\pgp\ipgp0\itap0\li0\ri0 +\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid93983\rsid217518\rsid1984289\rsid3804850\rsid5845909\rsid6173475\rsid6573559\rsid7092439\rsid7813854\rsid8005660\rsid8394862 +\rsid10169937\rsid10363382\rsid10624128\rsid13960513\rsid14557619\rsid16084641}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Duane Okamoto (CELA)} +{\operator Raghu Shantha}{\creatim\yr2016\mo8\dy12\hr14\min30}{\revtim\yr2016\mo8\dy12\hr14\min30}{\version2}{\edmins1}{\nofpages15}{\nofwords5899}{\nofchars33626}{\*\company Microsoft IT}{\nofcharsws39447}{\vern19}}{\*\xmlnstbl {\xmlns1 http://schemas.mi +crosoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot3804850\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang +{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}} +\pard\plain \ltrpar\s15\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3804850 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \b\f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid93983\charrsid93983 PowerShell 6.0}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \b\f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 Copyright (c) Microsoft Corporation}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 All rights reserved.\~}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 MIT License}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software + without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following cond +itions:}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.}{\rtlch\fcs1 +\af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850\charrsid93983 THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRA +NTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid3804850 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs20\ul\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid10363382 IMPORTANT NOTICE}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid10363382 +: THE SOFTWARE ALSO CONTAINS THIRD PARTY AND OTHER }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid10624128 PROPRIETARY }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 +\f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid10363382 SOFTWARE THAT ARE GOVERNED BY SEPARATE LICENSE TERMS. BY ACCEPTING THE LICENSE TERMS ABOVE, +YOU ALSO ACCEPT THE LICENSE TERMS GOVERNING THE THIRD PARTY AND OTHER SOFTWARE, WHICH ARE SET FORTH BELOW: +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 The following components }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid16084641 listed }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 +\f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 are governed by }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid16084641 the license terms that follow }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 +\f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 the component}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid16084641 (s) name}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 +\f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 : +\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6173475 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 --------------------------------------}{ +\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid10363382 ----------------}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 +\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14557619 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 Libmi.so +\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6173475 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 --------------------------------------}{ +\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid10363382 ----------------}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 +\par }\pard \ltrpar\s15\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3804850 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 +Copyright (c) Microsoft Corporation +\par }\pard \ltrpar\s15\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6173475 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 +All rights reserved.\~}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 MIT License}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated docu +mentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Soft +ware is furnished to do so, subject to the following conditions:}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.}{\rtlch\fcs1 +\af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475\charrsid93983 THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, E +XPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 +\par }\pard \ltrpar\s15\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14557619 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619 +The following components are governed by the MIT license, a copy of which appears below the list of components: +\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14557619 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619 +------------------------------------------------------ +\par Newtonsoft.Json +\par ------------------------------------------------------ +\par }\pard \ltrpar\s15\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14557619 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619 +Copyright (c) 2007 James Newton-King +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 All rights reserved.\~}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 MIT License}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies o +f the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.}{\rtlch\fcs1 +\af2\afs20 \ltrch\fcs0 \f2\fs20\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619\charrsid93983 THE SOFTWAR +E IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 +\f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid14557619 +\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6573559 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6573559 +--------------------------------------------------------- +\par Libuv v.1.9.0 +\par --------------------------------------------------------- +\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6573559 \rtlch\fcs1 +\af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid10169937 +\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 https://raw.githubusercontent.com/aspnet/libuv-package/dev/content/License.txt +\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs20\insrsid6573559 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 This software is licensed to you by Microsoft Corporation under the original terms of the copyright holder provided below: +\par +\par ========================================= +\par +\par libuv is part of the Node project: http://nodejs.org/ +\par libuv may be distributed alone under Node's license: +\par +\par ==== +\par +\par Copyright Joyent, Inc. and other Node contributors. All rights reserved. +\par +\par Permission is hereby granted, free of charge, to any person obtaining a copy +\par of this software and associated documentation files (the "Software"), to +\par deal in the Software without restriction, including without limitation the +\par rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +\par sell copies of the Software, and to permit persons to whom the Software is +\par furnished to do so, subject to the following conditions: +\par +\par The above copyright notice and this permission notice shall be included in +\par all copies or substantial portions of the Software. +\par +\par THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +\par IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +\par FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +\par AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +\par LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +\par FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +\par IN THE SOFTWARE. +\par +\par ==== +\par +\par This license applies to all parts of libuv that are not externally +\par maintained libraries. +\par +\par The externally maintained libraries used by libuv are: +\par +\par - tree.h (from FreeBSD), copyright Niels Provos. Two clause BSD license. +\par +\par - inet_pton and inet_ntop implementations, contained in src/inet.c, are +\par }\pard \ltrpar\ql \li450\ri0\widctlpar\tx450\tx1530\tx2700\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin450\itap0\pararsid6573559 {\rtlch\fcs1 +\af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 copyright the Internet Systems Consortium, Inc., and licensed under the ISC license. +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6573559 {\rtlch\fcs1 +\af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 +\par - stdint-msvc2008.h (from msinttypes), copyright Alexander Chemeris. Three +\par clause BSD license. +\par +\par - pthread-fixes.h, pthread-fixes.c, copyright Google Inc. and Sony Mobile +\par Communications AB. Three clause BSD license. +\par +\par }\pard \ltrpar\ql \fi-450\li450\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin450\itap0\pararsid6573559 { +\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 - android-ifaddrs.h, android-ifaddrs.c, copyright Berkeley Software Design Inc, Kenneth MacKay and Emergya (Cloud4all, FP7/2007-2013, grant agreement +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6573559 {\rtlch\fcs1 +\af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 n\'b0 289016). Three clause BSD license. +\par +\par ========================================= +\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6573559 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs18 +\ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6573559 +\par }{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid10169937 +\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6573559 +--------------------------------------------------}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid10169937 --}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6573559 +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard\plain \ltrpar +\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls11\adjustright\rin0\lin720\itap0\pararsid10169937 \rtlch\fcs1 \af39\afs22\alang1025 \ltrch\fcs0 \f39\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs18 +\ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 dotnet-test-xunit 2.2.0-preview2-build1029 +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\fs18\insrsid16084641\charrsid10169937 xunit +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.abstractions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.assert +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.core +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.extensibility.core +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.extensibility.execution +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.runner.reporters +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid16084641\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}xunit.runner.utility +\par }\pard\plain \ltrpar\ql \li0\ri0\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439 ---------------------------------------------------}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid10169937 -}{\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439 +\par }\pard \ltrpar\ql \li0\ri0\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid10169937 +\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid16084641 https://www.nuget.org/packages +\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid10169937 +\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 Copyright 2015 Outercurve Foundation +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10169937 {\rtlch\fcs1 +\af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6573559 {\rtlch\fcs1 +\af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid6573559\charrsid6573559 Licensed under the Apache License, Version 2.0 (the "License"); +\par you may not use this file except in compliance with the License. +\par You may obtain a copy of the License at +\par +\par http://www.apache.org/licenses/LICENSE-2.0 +\par +\par Unless required by applicable law or agreed to in writing, software +\par distributed under the License is distributed on an "AS IS" BASIS, +\par WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +\par See the License for the specific language governing permissions and +\par limitations under the License.}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid6573559 +\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid7092439 +\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid6573559 +\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs20 +\ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439 --------------------------------------------------}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6573559 +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard\plain \ltrpar +\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls10\adjustright\rin0\lin720\itap0\pararsid10169937 \rtlch\fcs1 \af39\afs22\alang1025 \ltrch\fcs0 \f39\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs18 +\ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 Microsoft.CodeAnalysis.Analyzers +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.CodeAnalysis.Common +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.CodeAnalysis.CSharp +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.CodeAnalysis.VisualBasic +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.CSharp +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.DiaSymReader +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.DiaSymReader.Native +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.DotNet.Cli.Utils +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.DotNet.InternalAbstractions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.DotNet.ProjectModel +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.Extensions.DependencyModel +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.Extensions.Testing.Abstractions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.App +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.DotNetHost +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.DotNetHostPolicy +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.DotNetHostResolver +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Jit +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Platforms +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Portable.Compatibility +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Runtime +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Runtime.CoreCLR +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Runtime.Native +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Targets +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.NETCore.Windows.ApiSets +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.VisualBasic +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.Win32.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard \ltrpar +\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin720\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 Microsoft.Win32.Registry +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.Win32.Registry.AccessControl +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NETStandard.Library +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Collections +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Diagnostics.Tools +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Diagnostics.Tracing +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Globalization +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Globalization.Calendars +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.IO +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Reflection +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Reflection.Extensions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Reflection.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Resources.ResourceManager +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Runtime +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Runtime.Handles +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Runtime.InteropServices +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Text.Encoding +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Text.Encoding.Extensions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Threading.Tasks +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.any.System.Threading.Timer +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.Microsoft.NETCore.DotNetHost +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.Microsoft.NETCore.DotNetHostPolicy +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.Microsoft.NETCore.DotNetHostResolver +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.Microsoft.NETCore.Jit +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.Microsoft.NETCore.Runtime.CoreCLR +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.runtime.native.System +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.runtime.native.System.IO.Compression +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.runtime.native.System.Net.Http +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.runtime.native.System.Net.Security +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.debian.8-x64.runtime.native.System.Security.Cryptography +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.native.System +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.native.System.Data.SqlClient.sni +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.native.System.IO.Compression +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.native.System.Net.Http +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.native.System.Net.Security +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.native.System.Security.Cryptography +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.Microsoft.NETCore.DotNetHost +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.Microsoft.NETCore.DotNetHostPolicy +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.Microsoft.NETCore.DotNetHostResolver +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.Microsoft.NETCore.Jit +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.Microsoft.NETCore.Runtime.CoreCLR +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.runtime.native.System +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.runtime.native.System.IO.Compression +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.runtime.native.System.Net.Http +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.runtime.native.System.Net.Security +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.Microsoft.NETCore.DotNetHost +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.Microsoft.NETCore.DotNetHostPolicy +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.Microsoft.NETCore.DotNetHostResolver +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.Microsoft.NETCore.Jit +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.Microsoft.NETCore.Runtime.CoreCLR +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.runtime.native.System +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.runtime.native.System.IO.Compression +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.runtime.native.System.Net.Http +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.runtime.native.System.Net.Security +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.rhel.7-x64.runtime.native.System.Security.Cryptography +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.Microsoft.NETCore.DotNetHost +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.Microsoft.NETCore.DotNetHostPolicy +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.Microsoft.NETCore.DotNetHostResolver +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.Microsoft.NETCore.Jit +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.Microsoft.NETCore.Runtime.CoreCLR +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.runtime.native.System +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.Microsoft.NETCore.DotNetHost +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.Microsoft.NETCore.DotNetHostPolicy +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard \ltrpar +\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin720\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 +runtime.ubuntu.16.04-x64.Microsoft.NETCore.DotNetHostResolver +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.Microsoft.NETCore.Jit +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.Microsoft.NETCore.Runtime.CoreCLR +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.runtime.native.System +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.Microsoft.Win32.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.Console +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.Diagnostics.Debug +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.IO.FileSystem +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.Net.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.Net.Sockets +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.Private.Uri +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.unix.System.Runtime.Extensions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.Microsoft.Win32.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.System.Console +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.System.Diagnostics.Debug +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.System.IO.FileSystem +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.System.Net.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.System.Net.Sockets +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win.System.Runtime.Extensions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.Microsoft.NETCore.DotNetHost +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.Microsoft.NETCore.DotNetHostPolicy +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.Microsoft.NETCore.DotNetHostResolver +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.Microsoft.NETCore.Jit +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.Microsoft.NETCore.Runtime.CoreCLR +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.Microsoft.NETCore.Windows.ApiSets +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.runtime.native.System.Data.SqlClient.sni +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x64.runtime.native.System.IO.Compression +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7-x86.runtime.native.System.Data.SqlClient.sni +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win7.System.Private.Uri +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}runtime.win81-x64.Microsoft.NETCore.Windows.ApiSets +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.AppContext +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Buffers +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Collections +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Collections.Concurrent +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Collections.Immutable +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Collections.NonGeneric +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Collections.Specialized +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ComponentModel +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ComponentModel.Annotations +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ComponentModel.EventBasedAsync +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ComponentModel.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ComponentModel.TypeConverter +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Console +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Data.Common +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Data.SqlClient +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.Contracts +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.Debug +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.DiagnosticSource +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.FileVersionInfo +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.Process +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.StackTrace +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.TextWriterTraceListener +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.Tools +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.TraceSource +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Diagnostics.Tracing +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Dynamic.Runtime +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Globalization +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Globalization.Calendars +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Globalization.Extensions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.Compression +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.Compression.ZipFile +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.FileSystem +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.FileSystem.AccessControl +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard \ltrpar +\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin720\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 System.IO.FileSystem.DriveInfo +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.FileSystem.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.FileSystem.Watcher +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.MemoryMappedFiles +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.Packaging +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.Pipes +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.IO.UnmanagedMemoryStream +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Linq +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Linq.Expressions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Linq.Parallel +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Linq.Queryable +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Http +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Http.WinHttpHandler +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.NameResolution +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.NetworkInformation +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Ping +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Requests +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Security +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.Sockets +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.WebHeaderCollection +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.WebSockets +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Net.WebSockets.Client +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Numerics.Vectors +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ObjectModel +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Private.DataContractSerialization +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Private.ServiceModel +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Private.Uri +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.DispatchProxy +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.Emit +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.Emit.ILGeneration +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.Emit.Lightweight +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.Extensions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.Metadata +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Reflection.TypeExtensions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Resources.Reader +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard \ltrpar +\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin720\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 System.Resources.ResourceManager +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.CompilerServices.VisualC +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Extensions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Handles +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.InteropServices +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.InteropServices.PInvoke +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.InteropServices.RuntimeInformation +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Loader +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Numerics +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Serialization.Json +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Serialization.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Runtime.Serialization.Xml +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.AccessControl +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Claims +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.Algorithms +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.Cng +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.Csp +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.Encoding +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.OpenSsl +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.Pkcs +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Cryptography.X509Certificates +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Principal +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.Principal.Windows +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Security.SecureString +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ServiceModel.Duplex +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ServiceModel.Http +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ServiceModel.NetTcp +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ServiceModel.Primitives +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard \ltrpar +\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin720\itap0\pararsid10169937 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 System.ServiceModel.Security +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.ServiceProcess.ServiceController +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Text.Encoding +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Text.Encoding.CodePages +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Text.Encoding.Extensions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Text.Encodings.Web +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Text.RegularExpressions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.AccessControl +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Overlapped +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Tasks +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Tasks.Dataflow +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Tasks.Extensions +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Tasks.Parallel +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Thread +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.ThreadPool +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Threading.Timer +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.ReaderWriter +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.XDocument +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.XmlDocument +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.XmlSerializer +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.XPath +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.XPath.XDocument +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}System.Xml.XPath.XmlDocument +\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs20 +\ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439 ------------------------------------------------------- +\par +\par }\pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \ab\af40\afs24 \ltrch\fcs0 \b\f40\fs24\cf1\insrsid7092439\charrsid7092439 MICROSOFT SOFTWARE LICENSE TERMS }{\rtlch\fcs1 \ab\af40\afs28 \ltrch\fcs0 \b\f40\fs28\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \ab\af40\afs24 \ltrch\fcs0 \b\f40\fs24\cf1\insrsid7092439\charrsid7092439 MICROSOFT .NET LIBRARY }{\rtlch\fcs1 \ab\af40\afs28 \ltrch\fcs0 \b\f40\fs28\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms +also apply to any Microsoft +\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 +\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 updates,}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid7092439\charrsid7092439 }{ +\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 supplements,}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 Internet-based services, and +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 support services +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 +for this software, unless other terms accompany those items. If so, those terms apply. +\par BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE. +\par IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW. +\par }\pard \ltrpar\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 1.}{ +\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 +\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 INSTALLATION AND USE RIGHTS. +\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 a.}{ +\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ +\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 Installation and Use.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\f40\fs20\cf1\insrsid7092439\charrsid7092439 \~You may install and use any number of copies of the software to design, develop and test your programs. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 b.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 +\~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 Third Party Programs.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 +\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 \~ +The software may include third party programs that Microsoft, not the third party, licenses to you under this agreement. Notices, if any, for the third party program are included for your information only. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 +\b\f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 2.}{ +\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 +\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 DATA.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 +\af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to improve our products and services.\~ +You can learn more about data collection and use in the help documentation and the privacy statement at\~ }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid11493340 + HYPERLINK "http://go.microsoft.com/fwlink/?LinkId=528096&clcid=0x409" \\t "_blank" }}{\fldrslt {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\ul\cf2\insrsid7092439\charrsid7092439 http://go.microsoft.com/fwlink/?LinkId=528096}{\rtlch\fcs1 \af0\afs24 +\ltrch\fcs0 \f0\fs24\ul\cf1\insrsid7092439\charrsid7092439 }}}\sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 +. Your use of the software operates as your consent to these practices. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 3.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 +\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 +ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 a.}{ +\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ +\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 DISTRIBUTABLE CODE.\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\f40\fs20\cf1\insrsid7092439\charrsid7092439 The software is comprised of Distributable Code. \'93Distributable Code\'94 is code that you are permitted to distribute in programs you develop if you comply with the terms below. }{\rtlch\fcs1 \ab\af40\afs19 +\ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 i}{ +\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 .}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ +\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 +\b\f40\fs20\cf1\insrsid7092439\charrsid7092439 Right to Use and Distribute.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-357\li1434\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1434\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 +\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 You may copy and distribute the object code form of the software. }{\rtlch\fcs1 \af40\afs19 +\ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\f40\fs20\cf1\insrsid7092439\charrsid7092439 Third Party Distribution. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs. }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 ii.}{ +\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ +\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 Distribution Requirements.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\f40\fs20\cf1\insrsid7092439\charrsid7092439 \~}{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 For any Distributable Code you distribute, you must }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-357\li1434\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1434\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 +\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 add significant primary functionality to it in your programs; }{\rtlch\fcs1 \af40\afs19 +\ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\f40\fs20\cf1\insrsid7092439\charrsid7092439 require distributors and external end users to agree to terms that protect it at least as much as this agreement; }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\f40\fs20\cf1\insrsid7092439\charrsid7092439 display your valid copyright notice on your programs; and }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\f40\fs20\cf1\insrsid7092439\charrsid7092439 indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\rquote fees, related to the distribution or use of your programs. }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 iii.}{ +\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ +\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 Distribution Restrictions.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\f40\fs20\cf1\insrsid7092439\charrsid7092439 \~}{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 You may not}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 +\ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-357\li1434\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1434\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 +\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 alter any copyright, trademark or patent notice in the Distributable Code; }{\rtlch\fcs1 +\af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\f40\fs20\cf1\insrsid7092439\charrsid7092439 use Microsoft\rquote s trademarks in your programs\rquote names or in a way that suggests your programs come from or are endorsed by Microsoft; }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\f40\fs20\cf1\insrsid7092439\charrsid7092439 include Distributable Code in malicious, deceptive or unlawful programs; or }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\f40\fs20\cf1\insrsid7092439\charrsid7092439 + modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that }{\rtlch\fcs1 \af40\afs19 +\ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-358\li1792\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1792\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 +\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\cf1\insrsid7092439\charrsid7092439 the code be disclosed or distributed in source code form; or }{\rtlch\fcs1 \af40\afs19 +\ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f3\fs20\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 +\f40\fs20\cf1\insrsid7092439\charrsid7092439 others have the right to modify it. }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 4.}{ +\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 +\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 SCOPE OF LICENSE.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ +\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitt +ed in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 + +\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 +\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 work around any technical limitations in the software; +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation; +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 publish the software for others to copy; +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 rent, lease or lend the software; +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 transfer the software or this agreement to any third party; or +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 use the software for commercial software hosting services. +\par }\pard \ltrpar\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 5.}{ +\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 +\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 BACKUP COPY.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 +\af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 You may make one backup copy of the software. You may use it only to reinstall the software. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 +\b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 6.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 +\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +DOCUMENTATION.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 7.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 +\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +EXPORT RESTRICTIONS.\~ }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destin +ations, end users and end use. For additional information, see\~ }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20\kerning36\insrsid7092439\charrsid7092439 www.microsoft.com/exporting}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 .}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 8.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 +\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +SUPPORT SERVICES.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 Because this software is \'93as is,\'94 + we may not provide support services for it. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 9.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 +\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +ENTIRE AGREEMENT.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 +\b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 10.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 +\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +APPLICABLE LAW.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 a.}{ +\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{ +\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 United States.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 +If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other c +laims, including claims under state consumer protection laws, unfair competition laws, and in tort. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\insrsid7092439\charrsid7092439 b.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 +\~\~\~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 +Outside the United States. If you acquired the software in any other country, the laws of that country apply. +\par }\pard \ltrpar\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 11.}{ +\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 +\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 LEGAL EFFECT.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 +\af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of y +our country if the laws of your country do not permit it to do so. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 12.}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 +\f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \'93AS-IS.\'94 YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONS +UMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMEN +T. +\par }\pard \ltrpar\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\insrsid7092439\charrsid7092439 FOR AUSTRALIA \endash + YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS. }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\f40\fs20\cf1\kerning36\insrsid7092439\charrsid7092439 13.}{ +\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\kerning36\insrsid7092439\charrsid7092439 \~\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 +\b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS +ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. +\par }\pard \ltrpar\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 This limitation applies to}{\rtlch\fcs1 +\af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 +\ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 + anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 \af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other d +amages. +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French. }{\rtlch\fcs1 +\af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 Remarque : Ce logiciel \'e9tant distribu\'e9 au Qu\'e9bec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en fran\'e7ais. } +{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 EXON\'c9 +RATION DE GARANTIE.\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 Le logiciel vis\'e9 par une licence est offert \'ab + tel quel \'bb. Toute utilisation de ce logiciel est \'e0 votre seule risque et p\'e9ril. Microsoft n\rquote accorde aucune autre garantie expresse. Vous pouvez b\'e9n\'e9ficier de droits + additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualit\'e9 marchande, d\rquote ad\'e9quation \'e0 + un usage particulier et d\rquote absence de contrefa\'e7on sont exclues. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +\par LIMITATION DES DOMMAGES-INT\'c9R\'caTS ET EXCLUSION DE RESPONSABILIT\'c9 POUR LES DOMMAGES.\~ }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 Vous}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 +\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0 + hauteur de 5,00 $ US. Vous ne pouvez pr\'e9tendre \'e0 aucune indemnisation pour les autres dommages, y compris les dommages sp\'e9ciaux, indirects ou accessoires et pertes de b\'e9n\'e9fices. }{\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 +\b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 Cette}{\rtlch\fcs1 +\af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 limitationconcerne:}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 +\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \li720\ri0\sb120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 +\af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 tout ce qui est reli\'e9 + au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \li720\ri0\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f3\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 \'b7}{\rtlch\fcs1 +\af0\afs14 \ltrch\fcs0 \f0\fs14\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 \~\~\~\~\~\~\~\~\~}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 les r\'e9 +clamations au titre de violation de contrat ou de garantie, ou au titre de responsabilit\'e9 stricte, de n\'e9gligence ou d\rquote une autre faute dans la limite autoris\'e9e par la loi en vigueur. }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 Elle s\rquote +applique \'e9galement, m\'eame si Microsoft connaissait ou devrait conna\'eetre l\rquote \'e9ventualit\'e9 d\rquote un tel dommage. Si votre pays n\rquote autorise pas l\rquote exclusion ou la limitation de responsabilit\'e9 + pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l\rquote exclusion ci-dessus ne s\rquote appliquera pas \'e0 votre \'e9gard. }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 +\f40\fs19\cf1\insrsid7092439\charrsid7092439 +\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0\pararsid7092439 {\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 EFFET JURIDIQUE. +\~}{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid7092439\charrsid7092439 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 Le pr\'e9sent contrat d\'e9 +crit certains droits juridiques. Vous pourriez avoir d\rquote autres droits pr\'e9vus par les lois de votre pays. Le pr\'e9sent contrat ne modifie pas les droits que vous conf\'e8rent les lois de votre pays si celles-ci ne le permettent pas. }{ +\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\f40\fs19\cf1\kerning36\insrsid7092439\charrsid7092439 +\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs20 +\ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439 +\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid16084641 +\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439 -------------------------------------------------------- +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard\plain \ltrpar +\s16\ql \fi-360\li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid10169937 \rtlch\fcs1 \af39\afs22\alang1025 \ltrch\fcs0 \f39\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid10169937 NuGet.Common +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Configuration +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.DependencyResolver.Core +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Frameworks +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.LibraryModel +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Packaging +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Packaging.Core +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Packaging.Core.Types +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.ProjectModel +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Protocol.Core.Types +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Protocol.Core.v3 +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Repositories +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.RuntimeModel +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid7092439\charrsid10169937 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}NuGet.Versioning +\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs20 +\ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439 ---------------------------------------------------------- +\par +\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 +\af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs18 \ltrch\fcs0 \f2\fs18\insrsid7092439\charrsid7092439 Copyright (c) .NET Foundation. All rights reserved. +\par +\par Licensed under the Apache License, Version 2.0 (the "License"); you may not use +\par these files except in compliance with the License. You may obtain a copy of the +\par License at +\par +\par http://www.apache.org/licenses/LICENSE-2.0 +\par +\par Unless required by applicable law or agreed to in writing, software distributed +\par under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +\par CONDITIONS OF ANY KIND, either express or implied. See the License for the +\par specific language governing permissions and limitations under the License. +\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7092439 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2\afs18 +\ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439\charrsid7092439 +\par }{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid7092439 +\par }\pard \ltrpar\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6173475 {\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 -----------------------------------------}{ +\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid10363382 ----------------}{\rtlch\fcs1 \af2\afs20 \ltrch\fcs0 \f2\fs18\cf17\lang9\langfe1033\langnp9\insrsid6173475 +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid6173475\charrsid6173475 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}}\pard\plain \ltrpar +\s16\ql \fi-360\li540\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls2\ilvl2\adjustright\rin0\lin540\itap0\pararsid10363382 \rtlch\fcs1 \af39\afs22\alang1025 \ltrch\fcs0 \f39\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\fs18\insrsid6173475\charrsid6173475 Microsoft.Management.Infrastructure.dll +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid6173475\charrsid6173475 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.Management.Infrastructure.Native.dll +\par {\listtext\pard\plain\ltrpar \s16 \rtlch\fcs1 \af2\afs22 \ltrch\fcs0 \f10\fs18\insrsid6173475\charrsid6173475 \loch\af10\dbch\af31506\hich\f10 \'a7\tab}Microsoft.Management.Infrastructure.Unmanaged.dll +\par }\pard\plain \ltrpar\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10363382 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\fs18\insrsid10363382 ----------------------------------------------------------}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\fs18\insrsid10363382\charrsid10363382 +\par }\pard\plain \ltrpar\s32\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 +\fs28\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 MICROSOFT SOFTWARE LICENSE TERMS +\par }\pard\plain \ltrpar\s33\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 +\fs28\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\fs24\insrsid7813854\charrsid6843334 \hich\af42\dbch\af11\loch\f42 MANAGEMENT.INFRASTRUCTURE.DLL }{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\fs24\insrsid7813854 +\par }{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\fs24\insrsid7813854\charrsid6843334 \hich\af42\dbch\af11\loch\f42 MANAGEMENT.INFRASTRUCTURE.NATIVE.DLL\hich\af42\dbch\af11\loch\f42 MANAGEMENT.INFRASTRUCTURE.UNMANAGED.DLL +\par }\pard \ltrpar\s33\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7813854 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid11493340 +{\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 1}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fillColor}{\sv 10526880}}{\sp{\sn fFilled}{\sv 1}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn alignHR}{\sv 1}}{\sp{\sn dxHeightHR}{\sv 30}} +{\sp{\sn fStandardHR}{\sv 1}}{\sp{\sn fHorizRule}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex1\picscaley1\piccropl0\piccropr0\piccropt0\piccropb0\picw7620\pich7620\picwgoal4320\pichgoal4320\wmetafile8}}{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\fs24\insrsid7813854\charrsid6112664 +\par }\sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}} +{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar +\s34\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\lang9\langfe1033\langnp9\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 +These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They apply to the software named above and any Microsoft services or software updates (except to the extent su\hich\af42\dbch\af11\loch\f42 +ch services or updates are accompanied by new or }{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 additional terms, in which case those different terms {\*\bkmkstart OLE_LINK84}{\*\bkmkstart OLE_LINK85} +apply prospectively {\*\bkmkend OLE_LINK84}{\*\bkmkend OLE_LINK85}and do not alter your or Microsoft\hich\f42 \rquote \loch\f42 s rights relating to pre-updated software or services}{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\lang9\langfe1033\langnp9\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 ). IF YOU COMPLY WITH THESE LICENSE TERMS, YO\hich\af42\dbch\af11\loch\f42 U HAVE THE RIGHTS BELOW. }{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\lang9\langfe1033\langnp9\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854 \hich\af40\dbch\af11\loch\f40 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854 \hich\af42\dbch\af11\loch\f42 INSTALLATION AND USE RIGHTS}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\*\bkmkstart OLE_LINK124}{\*\bkmkstart OLE_LINK125}{\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 a)\tab}}\pard\plain \ltrpar +\s2\ql \fi-360\li717\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls13\outlinelevel1\adjustright\rin0\lin717\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 General.}{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 You may install and use any number of copies of the software on your devices. +\par {\*\bkmkend OLE_LINK124}{\*\bkmkend OLE_LINK125}{\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 b)\tab}}{\rtlch\fcs1 \af42 +\ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 Included Microsoft Applications.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 + The software may include other Microsoft applications. These license terms apply to those included applications, if any, {\*\bkmkstart OLE_LINK80}{\*\bkmkstart OLE_LINK81}unless other license terms are provided with the other Microsoft applications +{\*\bkmkend OLE_LINK80}{\*\bkmkend OLE_LINK81}.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 c)\tab}\hich\af42\dbch\af11\loch\f42 Third Party Software.}{\rtlch\fcs1 \af42 +\ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 The software may include third pa\hich\af42\dbch\af11\loch\f42 +rty applications that are licensed to you under this agreement or under their own terms. License terms, notices, and acknowledgements, if any, for the third party applications may be accessible online at }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af40 +\ltrch\fcs0 \insrsid11493340 \hich\af40\dbch\af11\loch\f40 HYPERLINK "http://aka.ms/thirdpartynotices" }}{\fldrslt {\rtlch\fcs1 \af42 \ltrch\fcs0 \cs19\f42\ul\cf1\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 http +\hich\af42\dbch\af11\loch\f42 ://aka.ms/thirdpartynotices}}}\sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 + or in an accompanying notices file. Even if such applications are governed by other agreements, the disclaimer, limitations on, and exclusions of damages below also apply to the extent allowed by applicable law.}{\rtlch\fcs1 \af42 \ltrch\fcs0 +\b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854 \hich\af40\dbch\af11\loch\f40 2.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854 \hich\af42\dbch\af11\loch\f42 TIME-SENSITIVE S\hich\af42\dbch\af11\loch\f42 OFTWARE}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 a)\tab}}\pard\plain \ltrpar +\s2\ql \fi-360\li717\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls14\outlinelevel1\adjustright\rin0\lin717\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 Period.}{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 The software is time-sensitive and may stop running on a date that is defined in the software.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 b)\tab}\hich\af42\dbch\af11\loch\f42 Notice.}{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 You may receive periodic reminder notices of this date through the software.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 c)\tab}\hich\af42\dbch\af11\loch\f42 Access to data.}{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 You may not be able to access data used in the software when it stops running.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 3.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 PRE-RELEASE SOFTWARE.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 + The software is a pre-release version. It may not operate correctly. It may be different from the commercially released version.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 4.\tab}\hich\af42\dbch\af11\loch\f42 FEEDBACK.}{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 If you give fee\hich\af42\dbch\af11\loch\f42 +dback about the software to Microsoft, you give to Microsoft, without charge, the right to use, share and commercialize your feedback in any way and for any purpose. You will not give feedback that is subject to a license that requires Microsoft to licens +\hich\af42\dbch\af11\loch\f42 e\hich\af42\dbch\af11\loch\f42 its software or documentation to third parties because Microsoft includes your feedback in them. These rights survive this agreement.}{\rtlch\fcs1 \af42 \ltrch\fcs0 +\b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 5.\tab}\hich\af42\dbch\af11\loch\f42 DATA COLLECTION.}{\rtlch\fcs1 \af42 +\ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 The software may collect information about you and your use of the software and send that to Microsoft. \hich\af42\dbch\af11\loch\f42 +Microsoft may use this information to provide services and improve Microsoft\hich\f42 \rquote \loch\f42 +s products and services. Your opt-out rights, if any, are described in the product documentation. Some features in the software may enable collection of data from users of your a\hich\af42\dbch\af11\loch\f42 p\hich\af42\dbch\af11\loch\f42 +plications that access or use the software. If you use these features to enable data collection in your applications, you must comply with applicable law, including getting any required user consent, and maintain a prominent privacy policy that accurately +\hich\af42\dbch\af11\loch\f42 \hich\af42\dbch\af11\loch\f42 informs users about how you use, collect, and share their data. You can learn more about Microsoft\hich\f42 \rquote \loch\f42 +s data collection and use in the product documentation and the Microsoft Privacy Statement}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\delrsid16459130\charrsid6112664 \hich\af42\dbch\af11\loch\f42 }{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 at }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af40 \ltrch\fcs0 \insrsid11493340 \hich\af40\dbch\af11\loch\f40 HYPERLINK "https://go.microsoft.com/fwlink/?LinkId=521839" }}{\fldrslt { +\rtlch\fcs1 \af42 \ltrch\fcs0 \cs19\f42\ul\cf1\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 https://go.microsoft.com/fwlink/?LinkId=521839}}}\sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af42 +\ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 . You agree to comply with all applicable provisions of the Microsoft Privacy Statement.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 6.\tab}\hich\af42\dbch\af11\loch\f42 FONTS.}{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 While the software is running, you may use its fonts to display and print content. You may only (i) embed fonts in\hich\af42\dbch\af11\loch\f42 + content as permitted by the embedding restrictions in the fonts; and (ii) temporarily download them to a printer or other output device to help print content.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 7.\tab}\hich\af42\dbch\af11\loch\f42 SCOPE OF LICENSE.}{\rtlch\fcs1 \af42 +\ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 The software is licensed, not sold. Microsoft reserves all other rights. Unles\hich\af42\dbch\af11\loch\f42 +s applicable law gives you more rights despite this limitation, you will not (and have no right to):}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 a)\tab}}\pard\plain \ltrpar +\s2\ql \fi-360\li717\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls15\outlinelevel1\adjustright\rin0\lin717\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 +work around any technical limitations in the software that only allow you to use it in certain ways; +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 b)\tab}\hich\af42\dbch\af11\loch\f42 +reverse engineer, decompile or disassemble the softwar\hich\af42\dbch\af11\loch\f42 e; +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 c)\tab}\hich\af42\dbch\af11\loch\f42 +remove, minimize, block, or modify any notices of Microsoft or its suppliers in the software; +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 d)\tab}\hich\af42\dbch\af11\loch\f42 +use the software in any way that is against the law or to create or propagate malware; or +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 e)\tab}\hich\af42\dbch\af11\loch\f42 +share, publish, distribute, or lend the software, provide the softwar\hich\af42\dbch\af11\loch\f42 e as a stand-alone hosted solution for others to use, or transfer the software or this agreement to any third party. +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 8.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 EXPORT RESTRICTIONS.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 + You must comply with all domestic and international export laws and regulations that apply to the software, which incl\hich\af42\dbch\af11\loch\f42 +ude restrictions on destinations, end users, and end use. For further information on export restrictions, visit }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af40 \ltrch\fcs0 \insrsid11493340 \hich\af40\dbch\af11\loch\f40 HYPERLINK "http://aka.ms/exporting" +}}{\fldrslt {\rtlch\fcs1 \af42 \ltrch\fcs0 \cs19\f42\ul\cf1\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 http://aka.ms/exporting}}}\sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\insrsid7813854\charrsid6112664 .}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 9.\tab}\hich\af42\dbch\af11\loch\f42 SUPPORT SERVICES.}{\rtlch\fcs1 \af42 +\ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 Microsoft is not obligated under this agreement to provide an\hich\af42\dbch\af11\loch\f42 \hich\f42 y support services for the software. Any support provided is \'93\loch\f42 +\hich\f42 as is\'94\loch\f42 \hich\f42 , \'93\loch\f42 \hich\f42 with all faults\'94\loch\f42 , and without warranty of any kind.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 10.\tab}\hich\af42\dbch\af11\loch\f42 UPDATES.}{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 The software may periodically check for updates, and download and install them for you. You may obtain updates only from Mic\hich\af42\dbch\af11\loch\f42 +rosoft or authorized sources. Microsoft may need to update your system to provide you with updates. You agree to receive these automatic updates without any additional notice. Updates may not include or support all existing software features, services, or +\hich\af42\dbch\af11\loch\f42 \hich\af42\dbch\af11\loch\f42 peripheral devices.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 11.\tab}\hich\af42\dbch\af11\loch\f42 ENTIRE AGREEMENT.}{\rtlch\fcs1 \af42 +\ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 This agreement, and any other terms Microsoft may provide for supplements, updates, or third-party applications, is the entire agreement for the software. +\par {\*\bkmkstart OLE_LINK170}{\*\bkmkstart OLE_LINK171}{\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 12.\tab}}{\rtlch\fcs1 \af42 +\ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 + If you acquired the software in the United States or Canada, the laws of the state or province where you live (or, if a business, where your principal place of business is located) govern the interpretation of this agreement, claims for its breach, and a +\hich\af42\dbch\af11\loch\f42 l\hich\af42\dbch\af11\loch\f42 +l other claims (including consumer protection, unfair competition, and tort claims), regardless of conflict of laws principles. If you acquired the software in any other country, its laws apply. If U.S. federal jurisdiction exists, you and Microsoft conse +\hich\af42\dbch\af11\loch\f42 n\hich\af42\dbch\af11\loch\f42 +t to exclusive jurisdiction and venue in the federal court in King County, Washington for all disputes heard in court. If not, you and Microsoft consent to exclusive jurisdiction and venue in the Superior Court of King County, Washington for all disputes +\hich\af42\dbch\af11\loch\f42 h\hich\af42\dbch\af11\loch\f42 eard in court.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\*\bkmkend OLE_LINK170}{\*\bkmkend OLE_LINK171}{\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 13.\tab} +\hich\af42\dbch\af11\loch\f42 CONSUMER RIGHTS; REGIONAL VARIATIONS.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 + This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state, province, or country. Separate and apart from your relationship with Mic\hich\af42\dbch\af11\loch\f42 +rosoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state, province, or country do not permit it to do so. For example, if you acquired the +\hich\af42\dbch\af11\loch\f42 s\hich\af42\dbch\af11\loch\f42 oftware in one of the below regions, or mandatory country law applies, then the following provisions apply to you:}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 a)\tab}}\pard\plain \ltrpar +\s2\ql \fi-360\li717\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls16\outlinelevel1\adjustright\rin0\lin717\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 Australia.}{\rtlch\fcs1 \af42 \ltrch\fcs0 +\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 b)\tab}}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\hich\af42\dbch\af11\loch\f42 Canada.}{\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 + If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking +\hich\af42\dbch\af11\loch\f42 for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. +\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af42\afs19 \ltrch\fcs0 \b\fs19\loch\af42\hich\af42\dbch\af11\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 c)\tab}}{\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 +\hich\af42\dbch\af11\loch\f42 Germany and Austria. +\par }\pard\plain \ltrpar\ql \fi-360\li1080\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1080\itap0\pararsid7813854 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 i.\tab Warranty. The properly licensed software will perform subs +tantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. +\par ii.\tab Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law. +\par }\pard\plain \ltrpar\s1\ql \li717\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin717\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 +Subject to the foregoing clause ii., Microsoft will only be liable for slight negligence if Microsoft is in br\hich\af42\dbch\af11\loch\f42 +each of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-ca +\hich\af42\dbch\af11\loch\f42 l\hich\af42\dbch\af11\loch\f42 led "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence. +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 14.\tab}}\pard \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar +\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid7813854 {\rtlch\fcs1 \af42 \ltrch\fcs0 \b\f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 \hich\f42 +DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \'93\loch\f42 \hich\f42 AS IS.\'94\loch\f42 YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, \hich\af42\dbch\af11\loch\f42 +GUARANTEES, OR CONDITIONS. TO THE EXTENT PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af11\insrsid7813854\charrsid6112664 \hich\af40\dbch\af11\loch\f40 15.\tab}\hich\af42\dbch\af11\loch\f42 +LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY \hich\af42\dbch\af11\loch\f42 +BASIS FOR RECOVERING DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIREC +\hich\af42\dbch\af11\loch\f42 T\hich\af42\dbch\af11\loch\f42 OR INCIDENTAL DAMAGES. +\par }\pard\plain \ltrpar\s31\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid7813854 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 +This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) {\*\bkmkstart OLE_LINK76}{\*\bkmkstart OLE_LINK77} +claims for breach of contract, warranty, guarantee, or condition\hich\af42\dbch\af11\loch\f42 ; strict liability, negligence, or other tort; or any other claim; in each case to the extent permitted by applicable law.{\*\bkmkend OLE_LINK76} +{\*\bkmkend OLE_LINK77} +\par \hich\af42\dbch\af11\loch\f42 It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion m\hich\af42\dbch\af11\loch\f42 +ay not apply to you because your state, province, or country may not allow the exclusion or limitation of incidental, consequential, or other damages. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7813854 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 +\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 +\par }\pard\plain \ltrpar\s31\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7813854 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 +\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 +Please note: As this software is distributed in Canada, some of the clauses in this agreement are provid\hich\af42\dbch\af11\loch\f42 ed below in French. +\par \hich\af42\dbch\af11\loch\f42 \hich\f42 Remarque: Ce logiciel \'e9\loch\f42 \hich\f42 tant distribu\'e9\loch\f42 \hich\f42 au Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en fran\'e7\loch\f42 ais. +\par \hich\af42\dbch\af11\loch\f42 \hich\f42 EXON\'c9\loch\f42 \hich\f42 RATION DE GARANTIE. Le logiciel vis\'e9\loch\f42 \hich\f42 par une licence est offert \'ab\loch\f42 \hich\f42 tel quel \'bb\loch\f42 . Toute utilisation de ce logi +\hich\af42\dbch\af11\loch\f42 \hich\f42 ciel est \'e0\loch\f42 \hich\f42 votre seule risque et p\'e9\loch\f42 ril. Microsoft n\hich\f42 \rquote \loch\f42 \hich\f42 accorde aucune autre garantie expresse. Vous pouvez b\'e9\loch\f42 \hich\f42 n\'e9 +\loch\f42 ficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permis\hich\af42\dbch\af11\loch\f42 e\hich\af42\dbch\af11\loch\f42 \hich\f42 +s par le droit locale, les garanties implicites de qualit\'e9\loch\f42 marchande, d\hich\f42 \rquote \loch\f42 \hich\f42 ad\'e9\loch\f42 \hich\f42 quation \'e0\loch\f42 un usage particulier et d\hich\f42 \rquote \loch\f42 \hich\f42 absence de contrefa +\'e7\loch\f42 on sont exclues. +\par \hich\af42\dbch\af11\loch\f42 \hich\f42 LIMITATION DES DOMMAGES-INT\'c9\loch\f42 \hich\f42 R\'ca\loch\f42 \hich\f42 TS ET EXCLUSION DE RESPONSABILIT\'c9\loch\f42 POUR LES DOMMAGES. Vous pouvez obtenir de Mi\hich\af42\dbch\af11\loch\f42 \hich\f42 +crosoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0\loch\f42 \hich\f42 hauteur de 5,00 $ US. Vous ne pouvez pr\'e9\loch\f42 \hich\f42 tendre \'e0\loch\f42 \hich\f42 + aucune indemnisation pour les autres dommages, y compris les dommages sp\'e9\loch\f42 ciaux, indirects ou accessoires et pertes de\hich\af42\dbch\af11\loch\f42 \hich\af42\dbch\af11\loch\f42 \hich\f42 b\'e9\loch\f42 \hich\f42 n\'e9\loch\f42 fices. +\par \hich\af42\dbch\af11\loch\f42 Cette limitation concerne: +\par }\pard \ltrpar\s31\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid7813854 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \bullet \tab \hich\af42\dbch\af11\loch\f42 +\hich\f42 tout ce qui est reli\'e9\loch\f42 au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers; et +\par \bullet \tab \hich\af42\dbch\af11\loch\f42 \hich\f42 les r\'e9\loch\f42 clamations au titre de violation de contrat ou de garan\hich\af42\dbch\af11\loch\f42 \hich\f42 tie, ou au titre de responsabilit\'e9\loch\f42 \hich\f42 stricte, de n\'e9\loch\f42 +gligence ou d\hich\f42 \rquote \loch\f42 \hich\f42 une autre faute dans la limite autoris\'e9\loch\f42 e par la loi en vigueur. +\par }\pard \ltrpar\s31\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7813854 {\rtlch\fcs1 \af42 \ltrch\fcs0 \f42\insrsid7813854\charrsid6112664 \hich\af42\dbch\af11\loch\f42 Elle s\hich\f42 \rquote +\loch\f42 \hich\f42 applique \'e9\loch\f42 \hich\f42 galement, m\'ea\loch\f42 \hich\f42 me si Microsoft connaissait ou devrait conna\'ee\loch\f42 tre l\hich\f42 \rquote \'e9\loch\f42 \hich\f42 ventualit\'e9\loch\f42 d\hich\f42 \rquote \loch\f42 +un tel dommage. Si votre pays n\hich\f42 \rquote \loch\f42 aut\hich\af42\dbch\af11\loch\f42 orise pas l\hich\f42 \rquote \loch\f42 \hich\f42 exclusion ou la limitation de responsabilit\'e9\loch\f42 + pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l\hich\f42 \rquote \loch\f42 exclusion ci-dessus ne s\hich\f42 \rquote \loch\f42 \hich\f42 appliquera pas \'e0\loch\f42 \hich\f42 votre \'e9 +\loch\f42 gard. +\par \hich\af42\dbch\af11\loch\f42 \hich\f42 EFFET JURIDIQUE. Le pr\'e9\loch\f42 sent contrat\hich\af42\dbch\af11\loch\f42 \hich\f42 d\'e9\loch\f42 crit certains droits juridiques. Vous pourriez avoir d\hich\f42 \rquote \loch\f42 \hich\f42 autres droits pr +\'e9\loch\f42 \hich\f42 vus par les lois de votre pays. Le pr\'e9\loch\f42 \hich\f42 sent contrat ne modifie pas les droits que vous conf\'e8\loch\f42 rent les lois de votre pays si celles-ci ne le permettent pas. +\par }\pard\plain \ltrpar\ql \li0\ri0\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6173475 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid8394862 +\par }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid6573559 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210007b740aaca0600008f1a0000160000007468656d652f7468656d652f +7468656d65312e786d6cec595b8bdb46147e2ff43f08bd3bbe49be2cf1065bb69336bb49889d943cceda636bb2238dd18c776342a0244f7d2914d2d28706fad6 +87521a68a0a12ffd310b1bdaf447f4cc489667ec71f6420aa1640d8b34face996fce39face48ba7aed51449d239c70c2e2965bbe52721d1c8fd898c4d3967b6f +d82f345c870b148f1165316eb90bccdd6bbb9f7e7215ed881047d801fb98efa0961b0a31db2916f9088611bfc26638866b13964448c069322d8e13740c7e235a +ac944ab5628448ec3a318ac0ededc9848cb033942edddda5f31e85d358703930a2c940bac68685c28e0fcb12c1173ca089738468cb8579c6ec78881f09d7a188 +0bb8d0724beacf2dee5e2da29dcc888a2db69a5d5ffd657699c1f8b0a2e64ca607f9a49ee77bb576ee5f01a8d8c4f5eabd5aaf96fb5300341ac14a532eba4fbf +d3ec74fd0cab81d2438bef6ebd5b2d1b78cd7f758373db973f03af40a97f6f03dfef07104503af4029dedfc07b5ebd1278065e81527c6d035f2fb5bb5eddc02b +5048497cb8812ef9b56ab05c6d0e99307ac30a6ffa5ebf5ec99caf50500d7975c929262c16db6a2d420f59d2078004522448ec88c50c4fd008aa3840941c24c4 +d923d3100a6f8662c661b85429f54b55f82f7f9e3a5211413b1869d6921730e11b43928fc34709998996fb39787535c8e9ebd7274f5f9d3cfdfde4d9b393a7bf +66732b5786dd0d144f75bbb73f7df3cf8b2f9dbf7ffbf1edf36fd3a9d7f15cc7bff9e5ab377ffcf92ef7b0e255284ebf7bf9e6d5cbd3efbffeebe7e716efed04 +1de8f0218930776ee163e72e8b608116fef820b998c5304444b768c7538e622467b1f8ef89d040df5a208a2cb80e36e3783f01a9b101afcf1f1a8407613217c4 +e2f1661819c07dc6688725d628dc947369611ecee3a97df264aee3ee2274649b3b40b191e5de7c061a4b6c2e83101b34ef50140b34c531168ebcc60e31b6acee +0121465cf7c928619c4d84f380381d44ac21199203a39a56463748047959d80842be8dd8ecdf773a8cda56ddc5472612ee0d442de487981a61bc8ee602453697 +4314513de07b48843692834532d2713d2e20d3534c99d31b63ce6d36b71358af96f49b2033f6b4efd345642213410e6d3ef710633ab2cb0e831045331b7640e2 +50c77ec60fa144917387091b7c9f9977883c873ca0786bbaef136ca4fb6c35b8070aab535a1588bc324f2cb9bc8e9951bf83059d20aca4061a80a1eb1189cf14 +f93579f7ff3b7907113dfde1856545ef47d2ed8e8d7c5c50ccdb09b1de4d37d6247c1b6e5db803968cc987afdb5d348fef60b855369bd747d9fe28dbeeff5eb6 +b7ddcfef5fac57fa0cd22db7ade9765d6ddea3ad7bf709a174201614ef71b57de7d095c67d189476eab915e7cf72b3100ee59d0c1318b86982948d9330f10511 +e1204433d8e3975de964ca33d753eecc1887adbf1ab6fa96783a8ff6d9387d642d97e5e3692a1e1c89d578c9cfc7e17143a4e85a7df51896bb576ca7ea717949 +40da5e8484369949a26a21515f0eca20a98773089a85845ad97b61d1b4b06848f7cb546db0006a795660dbe4c066abe5fa1e9880113c55218ac7324f69aa97d9 +55c97c9f99de164ca302600fb1ac8055a69b92ebd6e5c9d5a5a5768e4c1b24b4723349a8c8a81ec64334c65975cad1f3d0b868ae9bab941af46428d47c505a2b +1af5c6bb585c36d760b7ae0d34d69582c6ce71cbad557d2899119ab5dc093cfac3613483dae172bb8be814de9f8d4492def097519659c24517f1300db8129d54 +0d222270e25012b55cb9fc3c0d34561aa2b8952b20081f2cb926c8ca87460e926e26194f267824f4b46b2332d2e929287caa15d6abcafcf26069c9e690ee4138 +3e760ee83cb98ba0c4fc7a5906704c38bc012aa7d11c1378a5990bd9aafed61a5326bbfa3b455543e938a2b310651d4517f314aea43ca7a3cef2186867d99a21 +a05a48b2467830950d560faad14df3ae9172d8da75cf369291d34473d5330d55915dd3ae62c60ccb36b016cbcb35798dd532c4a0697a874fa57b5d729b4bad5b +db27e45d02029ec7cfd275cfd110346aabc90c6a92f1a60c4bcdce46cddeb15ce019d4ced32434d5af2dddaec52def11d6e960f0529d1fecd6ab168626cb7da5 +8ab4faf6a17f9e60070f413cbaf022784e0557a9848f0f09820dd140ed4952d9805be491c86e0d3872e60969b98f4b7edb0b2a7e502835fc5ec1ab7aa542c36f +570b6ddfaf967b7eb9d4ed549e4063116154f6d3ef2e7d780d4517d9d71735bef105265abe69bb32625191a92f2c45455c7d812957b67f81710888cee35aa5df +ac363bb542b3daee17bc6ea7516806b54ea15b0beadd7e37f01bcdfe13d7395260af5d0dbc5aaf51a89583a0e0d54a927ea359a87b954adbabb71b3daffd24db +c6c0ca53f9c86201e155bc76ff050000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f7468656d652f5f72 +656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c08 +2e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd0 +8a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa +4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c0200001300000000000000000000000000000000005b436f +6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000000000000000300100005f72 +656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000190200007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210007b740aaca0600008f1a00001600000000000000000000000000d60200 +007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027000000000000000000000000 +00d40900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000cf0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax373\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 4; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 7; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 3; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 4; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 1; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 5; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 4; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 8; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 4; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 8; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Contemporary; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Elegant;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Professional;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Subtle 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Subtle 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority39 \lsdlocked0 Table Grid;\lsdsemihidden1 \lsdlocked0 Placeholder Text; +\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2; +\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List; +\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1; +\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision; +\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1; +\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1; +\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; +\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3; +\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4; +\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4; +\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5; +\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4; +\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4; +\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1; +\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1; +\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2; +\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2; +\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3; +\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4; +\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4; +\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5; +\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5; +\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6; +\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6; +\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark; +\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1; +\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1; +\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2; +\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3; +\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3; +\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4; +\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4; +\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5; +\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5; +\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6; +\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Mention; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Smart Hyperlink;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000c051 +85b5e0f4d101feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} diff --git a/assets/powershell.1.ronn b/assets/powershell.1.ronn index cb4b70432b1..de5d524d182 100644 --- a/assets/powershell.1.ronn +++ b/assets/powershell.1.ronn @@ -120,4 +120,4 @@ These are automatically defined PowerShell-language variables. ## COPYRIGHT Copyright (c) 2016 Microsoft Corporation. -All rights reserved. \ No newline at end of file +All rights reserved. diff --git a/demos/Apache/readme.md b/demos/Apache/readme.md index 30e36b3811a..f1c49385112 100644 --- a/demos/Apache/readme.md +++ b/demos/Apache/readme.md @@ -15,4 +15,4 @@ This demo shows management of Apache HTTP Server with PowerShell cmdlets impleme - `sudo yum install httpd` -Note: Management of Apache requires privileges. The user must have authorization to elevate with sudo. You will be prompted for a sudo password when running the demo. \ No newline at end of file +Note: Management of Apache requires privileges. The user must have authorization to elevate with sudo. You will be prompted for a sudo password when running the demo. diff --git a/demos/Azure/Compute-Linux.json b/demos/Azure/Compute-Linux.json index c829db408b9..5b2c1b4b3bf 100644 --- a/demos/Azure/Compute-Linux.json +++ b/demos/Azure/Compute-Linux.json @@ -197,4 +197,4 @@ "value": "[concat('ssh ', parameters('adminUsername'), '@', parameters('dnsLabelPrefix'), '.', resourceGroup().location, '.cloudapp.azure.com')]" } } -} \ No newline at end of file +} diff --git a/demos/DSC/readme.md b/demos/DSC/readme.md index b1374c7699a..954c4345828 100644 --- a/demos/DSC/readme.md +++ b/demos/DSC/readme.md @@ -9,4 +9,4 @@ This demo shows use of PowerShell to author a DSC configuration to set the confi - OMI: >= 1.1.0 [https://www.github.com/microsoft/omi/releases](https://www.github.com/microsoft/omi/releases) - Desired State Configuration for Linux >= 1.1.1-278 [https://github.com/Microsoft/PowerShell-DSC-for-Linux/releases](https://github.com/Microsoft/PowerShell-DSC-for-Linux/releases) -Note: applying the DSC configuration requires privileges. The user must have sudo authorization capabilities. You will be prompted for a sudo password when running the demo. \ No newline at end of file +Note: applying the DSC configuration requires privileges. The user must have sudo authorization capabilities. You will be prompted for a sudo password when running the demo. diff --git a/demos/Docker-PowerShell/Docker-PowerShell.ps1 b/demos/Docker-PowerShell/Docker-PowerShell.ps1 index 3517e805882..fd9b32e554b 100644 --- a/demos/Docker-PowerShell/Docker-PowerShell.ps1 +++ b/demos/Docker-PowerShell/Docker-PowerShell.ps1 @@ -26,4 +26,4 @@ Get-Container | Where-Object State -eq "exited" | Remove-Container Remove-ContainerImage hello-world # And list the container images left on the container host -Get-ContainerImage \ No newline at end of file +Get-ContainerImage diff --git a/demos/SystemD/SystemD/SystemD.psm1 b/demos/SystemD/SystemD/SystemD.psm1 index 38ea8fd4146..df33d467069 100644 --- a/demos/SystemD/SystemD/SystemD.psm1 +++ b/demos/SystemD/SystemD/SystemD.psm1 @@ -15,4 +15,4 @@ Function Get-SystemDJournal { { $Result } -} \ No newline at end of file +} diff --git a/demos/SystemD/readme.md b/demos/SystemD/readme.md index 87580efbae3..87cf800606f 100644 --- a/demos/SystemD/readme.md +++ b/demos/SystemD/readme.md @@ -7,4 +7,4 @@ This demo shows use of a PowerShell script module to wrap a native tool (journal - Install PowerShell -Note: Accessing the SystemD journal requires privileges. The user must have authorization to elevate with sudo. You will be prompted for a sudo password when running the demo. \ No newline at end of file +Note: Accessing the SystemD journal requires privileges. The user must have authorization to elevate with sudo. You will be prompted for a sudo password when running the demo. diff --git a/demos/crontab/CronTab/CronTab.ps1xml b/demos/crontab/CronTab/CronTab.ps1xml index 4246b1f62af..f53909a6cc0 100644 --- a/demos/crontab/CronTab/CronTab.ps1xml +++ b/demos/crontab/CronTab/CronTab.ps1xml @@ -66,4 +66,4 @@ - \ No newline at end of file + diff --git a/demos/dsc.ps1 b/demos/dsc.ps1 index 27e09f29e46..ff87c5ed08a 100644 --- a/demos/dsc.ps1 +++ b/demos/dsc.ps1 @@ -8,4 +8,4 @@ # Show the .ps1 # Run the .ps1 to generate a MOF # Apply the MOF locally with Start-DSCConfiguration -# Show the newly configured state \ No newline at end of file +# Show the newly configured state diff --git a/demos/install/README.md b/demos/install/README.md index 54049e09158..bbe42f725cd 100644 --- a/demos/install/README.md +++ b/demos/install/README.md @@ -2,4 +2,4 @@ For Windows refer to the [installation instructions](https://github.com/PowerShell/PowerShell/blob/master/docs/installation/windows.md) -For Linux, using [download.sh](https://github.com/PowerShell/PowerShell/blob/master/tools/download.sh) is the best way to deploy PowerShell bits \ No newline at end of file +For Linux, using [download.sh](https://github.com/PowerShell/PowerShell/blob/master/tools/download.sh) is the best way to deploy PowerShell bits diff --git a/demos/powershellget/PowerShellGet.ps1 b/demos/powershellget/PowerShellGet.ps1 index 67032152418..775105032ef 100644 --- a/demos/powershellget/PowerShellGet.ps1 +++ b/demos/powershellget/PowerShellGet.ps1 @@ -74,4 +74,4 @@ Set-PSRepository -Name "myPrivateGallery" -InstallationPolicy "Untrusted" # Remove a private feed Unregister-PSRepository -Name "myPrivateGallery" -#endregion \ No newline at end of file +#endregion diff --git a/docker/release/nanoserver-insider/Dockerfile b/docker/release/nanoserver-insider/Dockerfile index 5c230268930..faee741f5a1 100755 --- a/docker/release/nanoserver-insider/Dockerfile +++ b/docker/release/nanoserver-insider/Dockerfile @@ -1,55 +1,55 @@ -# escape=` -# Args used by from statements must be defined here: -ARG NanoServerVersion=10.0.16257.1000 -ARG WindowsServerCoreVersion=10.0.16257.1000 -ARG WindowsServerCoreRepo=microsoft/windowsservercore-insider -ARG NanoServerRepo=microsoft/nanoserver-insider - -# Use server core as an installer container to extract PowerShell, -# As this is a multi-stage build, this stage will eventually be thrown away -FROM ${WindowsServerCoreRepo}:$WindowsServerCoreVersion AS installer-env - -# Arguments for installing powershell, must be defined in the container they are used -ARG PS_VERSION=6.0.0-beta.6 - -ENV PS_DOWNLOAD_URL https://github.com/PowerShell/PowerShell/releases/download/v$PS_VERSION/PowerShell-$PS_VERSION-win10-win2016-x64.zip - -SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] -RUN Invoke-WebRequest $Env:PS_DOWNLOAD_URL -OutFile powershell.zip - -RUN Expand-Archive powershell.zip -DestinationPath \PowerShell - -# Install PowerShell into NanoServer -FROM ${NanoServerRepo}:$NanoServerVersion - -ARG VCS_REF="none" -ARG PS_VERSION=6.0.0-beta.6 -ARG IMAGE_NAME=microsoft/nanoserver-insider-powershell - -LABEL maintainer="PowerShell Team " ` - readme.md="https://github.com/PowerShell/PowerShell/blob/master/docker/README.md" ` - description="This Dockerfile will install the latest release of PS." ` - org.label-schema.usage="https://github.com/PowerShell/PowerShell/tree/master/docker#run-the-docker-image-you-built" ` - org.label-schema.url="https://github.com/PowerShell/PowerShell/blob/master/docker/README.md" ` - org.label-schema.vcs-url="https://github.com/PowerShell/PowerShell" ` - org.label-schema.name="powershell" ` - org.label-schema.vcs-ref=${VCS_REF} ` - org.label-schema.vendor="PowerShell" ` - org.label-schema.version=${PS_VERSION} ` - org.label-schema.schema-version="1.0" ` - org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" ` - org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" ` - org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" ` - org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" - -# Copy Powershell from the installer containter -ENV ProgramFiles C:\Program Files -COPY --from=installer-env ["\\PowerShell\\", "$ProgramFiles\\PowerShell"] - -# Persist %PSCORE% ENV variable for user convenience -ENV PSCORE="$ProgramFiles\PowerShell\PowerShell.exe" - -# Set the path -RUN setx PATH "%PATH%;%ProgramFiles%\PowerShell" - -CMD ["PowerShell.exe"] +# escape=` +# Args used by from statements must be defined here: +ARG NanoServerVersion=10.0.16257.1000 +ARG WindowsServerCoreVersion=10.0.16257.1000 +ARG WindowsServerCoreRepo=microsoft/windowsservercore-insider +ARG NanoServerRepo=microsoft/nanoserver-insider + +# Use server core as an installer container to extract PowerShell, +# As this is a multi-stage build, this stage will eventually be thrown away +FROM ${WindowsServerCoreRepo}:$WindowsServerCoreVersion AS installer-env + +# Arguments for installing powershell, must be defined in the container they are used +ARG PS_VERSION=6.0.0-beta.6 + +ENV PS_DOWNLOAD_URL https://github.com/PowerShell/PowerShell/releases/download/v$PS_VERSION/PowerShell-$PS_VERSION-win10-win2016-x64.zip + +SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] +RUN Invoke-WebRequest $Env:PS_DOWNLOAD_URL -OutFile powershell.zip + +RUN Expand-Archive powershell.zip -DestinationPath \PowerShell + +# Install PowerShell into NanoServer +FROM ${NanoServerRepo}:$NanoServerVersion + +ARG VCS_REF="none" +ARG PS_VERSION=6.0.0-beta.6 +ARG IMAGE_NAME=microsoft/nanoserver-insider-powershell + +LABEL maintainer="PowerShell Team " ` + readme.md="https://github.com/PowerShell/PowerShell/blob/master/docker/README.md" ` + description="This Dockerfile will install the latest release of PS." ` + org.label-schema.usage="https://github.com/PowerShell/PowerShell/tree/master/docker#run-the-docker-image-you-built" ` + org.label-schema.url="https://github.com/PowerShell/PowerShell/blob/master/docker/README.md" ` + org.label-schema.vcs-url="https://github.com/PowerShell/PowerShell" ` + org.label-schema.name="powershell" ` + org.label-schema.vcs-ref=${VCS_REF} ` + org.label-schema.vendor="PowerShell" ` + org.label-schema.version=${PS_VERSION} ` + org.label-schema.schema-version="1.0" ` + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} powershell -c '$psversiontable'" ` + org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" ` + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} powershell -c Invoke-Pester" ` + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} powershell -c Get-Help" + +# Copy Powershell from the installer containter +ENV ProgramFiles C:\Program Files +COPY --from=installer-env ["\\PowerShell\\", "$ProgramFiles\\PowerShell"] + +# Persist %PSCORE% ENV variable for user convenience +ENV PSCORE="$ProgramFiles\PowerShell\PowerShell.exe" + +# Set the path +RUN setx PATH "%PATH%;%ProgramFiles%\PowerShell" + +CMD ["PowerShell.exe"] diff --git a/docs/learning-powershell/create-powershell-scripts.md b/docs/learning-powershell/create-powershell-scripts.md index f707d61125b..c1010ca4873 100644 --- a/docs/learning-powershell/create-powershell-scripts.md +++ b/docs/learning-powershell/create-powershell-scripts.md @@ -58,4 +58,4 @@ else { # Remove loopback address from output regardless of platform $IP | Where-Object {$_ -ne '127.0.0.1'} ``` -[run-ps]:http://windowsitpro.com/powershell/running-powershell-scripts-easy-1-2-3 \ No newline at end of file +[run-ps]:http://windowsitpro.com/powershell/running-powershell-scripts-easy-1-2-3 diff --git a/docs/learning-powershell/working-with-powershell-objects.md b/docs/learning-powershell/working-with-powershell-objects.md index adbdc3eeef6..22ea05b9c3f 100644 --- a/docs/learning-powershell/working-with-powershell-objects.md +++ b/docs/learning-powershell/working-with-powershell-objects.md @@ -121,4 +121,4 @@ PS /home/psuser> $d | ForEach-Object {$_.'Total Size' / 1MB} PS /home/psuser> $d[1].'Total Size' / 1MB 148480 -``` \ No newline at end of file +``` diff --git a/docs/testing-guidelines/TestRoadmap.md b/docs/testing-guidelines/TestRoadmap.md index bc6d1cef944..5daceef7817 100644 --- a/docs/testing-guidelines/TestRoadmap.md +++ b/docs/testing-guidelines/TestRoadmap.md @@ -194,4 +194,4 @@ Below is my suggestion for prioritization to reduce risk and improve confidence 6. Replace in-lab tests with PowerShell Core tests 7. Investigate feasibility of running current in-lab tests on PowerShell Core -These are [tracked](https://github.com/PowerShell/PowerShell/issues?utf8=%E2%9C%93&q=is%3Aissue%20%23testability%20) as issues \ No newline at end of file +These are [tracked](https://github.com/PowerShell/PowerShell/issues?utf8=%E2%9C%93&q=is%3Aissue%20%23testability%20) as issues diff --git a/license_thirdparty_proprietary.txt b/license_thirdparty_proprietary.txt index 86d445c8930..464e9550061 100644 --- a/license_thirdparty_proprietary.txt +++ b/license_thirdparty_proprietary.txt @@ -768,4 +768,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/CommonUtils.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/CommonUtils.cs index 182cf59d994..8ee3e95903d 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/CommonUtils.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/CommonUtils.cs @@ -1,156 +1,156 @@ -using System; -using System.Collections; -using System.Diagnostics; -using System.Globalization; -using System.Runtime.InteropServices; -using System.Text; -using System.Resources; -using System.Reflection; - -#if CORECLR -using System.ComponentModel; -#else -using System.Threading; -#endif - -namespace Microsoft.PowerShell.Commands.Diagnostics.Common -{ - internal static class CommonUtilities - { - // - // StringArrayToString helper converts a string array into a comma-separated string. - // Note this has only limited use, individual strings cannot have commas. - // - public static string StringArrayToString(IEnumerable input) - { - string ret = ""; - foreach (string element in input) - { - ret += element + ", "; - } - - ret = ret.TrimEnd(); - ret = ret.TrimEnd(','); - - return ret; - } - -#if CORECLR - private const string LibraryLoadDllName = "api-ms-win-core-libraryloader-l1-2-0.dll"; - private const string LocalizationDllName = "api-ms-win-core-localization-l1-2-1.dll"; - private const string SysInfoDllName = "api-ms-win-core-sysinfo-l1-2-1.dll"; - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - internal struct OSVERSIONINFOEX - { - public int OSVersionInfoSize; - public int MajorVersion; - public int MinorVersion; - public int BuildNumber; - public int PlatformId; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] - public string CSDVersion; - public ushort ServicePackMajor; - public ushort ServicePackMinor; - public short SuiteMask; - public byte ProductType; - public byte Reserved; - } - - [DllImport(SysInfoDllName, CharSet = CharSet.Unicode, SetLastError = true)] - internal static extern bool GetVersionEx(ref OSVERSIONINFOEX osVerEx); -#else - private const string LibraryLoadDllName = "kernel32.dll"; - private const string LocalizationDllName = "kernel32.dll"; -#endif - - private const uint FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100; - private const uint FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200; - private const uint FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000; - private const uint LOAD_LIBRARY_AS_DATAFILE = 0x00000002; - private const uint FORMAT_MESSAGE_FROM_HMODULE = 0x00000800; - - [DllImport(LocalizationDllName, SetLastError = true, CharSet = CharSet.Unicode)] - private static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, - uint dwMessageId, uint dwLanguageId, - [MarshalAs(UnmanagedType.LPWStr)] - StringBuilder lpBuffer, - uint nSize, IntPtr Arguments); - - [DllImport(LibraryLoadDllName, SetLastError = true, CharSet = CharSet.Unicode)] - private static extern IntPtr LoadLibraryEx( - [MarshalAs(UnmanagedType.LPWStr)] string lpFileName, - IntPtr hFile, - uint dwFlags - ); - - [DllImport(LibraryLoadDllName)] - private static extern bool FreeLibrary(IntPtr hModule); - - - [DllImport(LocalizationDllName, EntryPoint = "GetUserDefaultLangID", CallingConvention = CallingConvention.Winapi, SetLastError = true)] - private static extern ushort GetUserDefaultLangID(); - - - public static uint FormatMessageFromModule(uint lastError, string moduleName, out String msg) - { - Debug.Assert(!string.IsNullOrEmpty(moduleName)); - - uint formatError = 0; - msg = String.Empty; - IntPtr moduleHandle = IntPtr.Zero; - - moduleHandle = LoadLibraryEx(moduleName, IntPtr.Zero, LOAD_LIBRARY_AS_DATAFILE); - if (moduleHandle == IntPtr.Zero) - { - return (uint)Marshal.GetLastWin32Error(); - } - - try - { - uint dwFormatFlags = FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE; - uint LANGID = (uint)GetUserDefaultLangID(); - uint langError = (uint)Marshal.GetLastWin32Error(); - if (langError != 0) - { - LANGID = 0; // neutral - } - - StringBuilder outStringBuilder = new StringBuilder(1024); - uint nChars = FormatMessage(dwFormatFlags, - moduleHandle, - lastError, - LANGID, - outStringBuilder, - (uint)outStringBuilder.Capacity, - IntPtr.Zero); - - if (nChars == 0) - { - formatError = (uint)Marshal.GetLastWin32Error(); - //Console.WriteLine("Win32FormatMessage", String.Format(null, "Error formatting message: {0}", formatError)); - } - else - { - msg = outStringBuilder.ToString(); - if (msg.EndsWith(Environment.NewLine, StringComparison.Ordinal)) - { - msg = msg.Substring(0, msg.Length - 2); - } - } - } - finally - { - FreeLibrary(moduleHandle); - } - return formatError; - } - - public static ResourceManager GetResourceManager() - { - // this naming pattern is dictated by the dotnet cli - return new ResourceManager("Microsoft.PowerShell.Commands.Diagnostics.resources.GetEventResources", typeof(CommonUtilities).GetTypeInfo().Assembly); - } - } -} - +using System; +using System.Collections; +using System.Diagnostics; +using System.Globalization; +using System.Runtime.InteropServices; +using System.Text; +using System.Resources; +using System.Reflection; + +#if CORECLR +using System.ComponentModel; +#else +using System.Threading; +#endif + +namespace Microsoft.PowerShell.Commands.Diagnostics.Common +{ + internal static class CommonUtilities + { + // + // StringArrayToString helper converts a string array into a comma-separated string. + // Note this has only limited use, individual strings cannot have commas. + // + public static string StringArrayToString(IEnumerable input) + { + string ret = ""; + foreach (string element in input) + { + ret += element + ", "; + } + + ret = ret.TrimEnd(); + ret = ret.TrimEnd(','); + + return ret; + } + +#if CORECLR + private const string LibraryLoadDllName = "api-ms-win-core-libraryloader-l1-2-0.dll"; + private const string LocalizationDllName = "api-ms-win-core-localization-l1-2-1.dll"; + private const string SysInfoDllName = "api-ms-win-core-sysinfo-l1-2-1.dll"; + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + internal struct OSVERSIONINFOEX + { + public int OSVersionInfoSize; + public int MajorVersion; + public int MinorVersion; + public int BuildNumber; + public int PlatformId; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] + public string CSDVersion; + public ushort ServicePackMajor; + public ushort ServicePackMinor; + public short SuiteMask; + public byte ProductType; + public byte Reserved; + } + + [DllImport(SysInfoDllName, CharSet = CharSet.Unicode, SetLastError = true)] + internal static extern bool GetVersionEx(ref OSVERSIONINFOEX osVerEx); +#else + private const string LibraryLoadDllName = "kernel32.dll"; + private const string LocalizationDllName = "kernel32.dll"; +#endif + + private const uint FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100; + private const uint FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200; + private const uint FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000; + private const uint LOAD_LIBRARY_AS_DATAFILE = 0x00000002; + private const uint FORMAT_MESSAGE_FROM_HMODULE = 0x00000800; + + [DllImport(LocalizationDllName, SetLastError = true, CharSet = CharSet.Unicode)] + private static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, + uint dwMessageId, uint dwLanguageId, + [MarshalAs(UnmanagedType.LPWStr)] + StringBuilder lpBuffer, + uint nSize, IntPtr Arguments); + + [DllImport(LibraryLoadDllName, SetLastError = true, CharSet = CharSet.Unicode)] + private static extern IntPtr LoadLibraryEx( + [MarshalAs(UnmanagedType.LPWStr)] string lpFileName, + IntPtr hFile, + uint dwFlags + ); + + [DllImport(LibraryLoadDllName)] + private static extern bool FreeLibrary(IntPtr hModule); + + + [DllImport(LocalizationDllName, EntryPoint = "GetUserDefaultLangID", CallingConvention = CallingConvention.Winapi, SetLastError = true)] + private static extern ushort GetUserDefaultLangID(); + + + public static uint FormatMessageFromModule(uint lastError, string moduleName, out String msg) + { + Debug.Assert(!string.IsNullOrEmpty(moduleName)); + + uint formatError = 0; + msg = String.Empty; + IntPtr moduleHandle = IntPtr.Zero; + + moduleHandle = LoadLibraryEx(moduleName, IntPtr.Zero, LOAD_LIBRARY_AS_DATAFILE); + if (moduleHandle == IntPtr.Zero) + { + return (uint)Marshal.GetLastWin32Error(); + } + + try + { + uint dwFormatFlags = FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE; + uint LANGID = (uint)GetUserDefaultLangID(); + uint langError = (uint)Marshal.GetLastWin32Error(); + if (langError != 0) + { + LANGID = 0; // neutral + } + + StringBuilder outStringBuilder = new StringBuilder(1024); + uint nChars = FormatMessage(dwFormatFlags, + moduleHandle, + lastError, + LANGID, + outStringBuilder, + (uint)outStringBuilder.Capacity, + IntPtr.Zero); + + if (nChars == 0) + { + formatError = (uint)Marshal.GetLastWin32Error(); + //Console.WriteLine("Win32FormatMessage", String.Format(null, "Error formatting message: {0}", formatError)); + } + else + { + msg = outStringBuilder.ToString(); + if (msg.EndsWith(Environment.NewLine, StringComparison.Ordinal)) + { + msg = msg.Substring(0, msg.Length - 2); + } + } + } + finally + { + FreeLibrary(moduleHandle); + } + return formatError; + } + + public static ResourceManager GetResourceManager() + { + // this naming pattern is dictated by the dotnet cli + return new ResourceManager("Microsoft.PowerShell.Commands.Diagnostics.resources.GetEventResources", typeof(CommonUtilities).GetTypeInfo().Assembly); + } + } +} + diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/NewWinEventCommand.cs b/src/Microsoft.PowerShell.Commands.Diagnostics/NewWinEventCommand.cs index 16529125f3d..49a6184aeb9 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/NewWinEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/NewWinEventCommand.cs @@ -353,4 +353,4 @@ internal EventWriteException(string msg) : base(msg) { } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Diagnostics/resources/GetEventResources.txt b/src/Microsoft.PowerShell.Commands.Diagnostics/resources/GetEventResources.txt index 751578835cd..f3283e227bf 100644 --- a/src/Microsoft.PowerShell.Commands.Diagnostics/resources/GetEventResources.txt +++ b/src/Microsoft.PowerShell.Commands.Diagnostics/resources/GetEventResources.txt @@ -56,4 +56,4 @@ CounterCircularNoMaxSize=The Circular parameter will be ignored unless the MaxSi ExportCtrWin7Required=This cmdlet can be run only on Microsoft Windows 7 and above. FileOpenFailed=Unable to open the {0} file for writing. FileCreateFailed=Unable to create the {0} file. Verify that the path is valid. -ExportDestPathAmbiguous=The following export destination path is ambiguous: {0}. \ No newline at end of file +ExportDestPathAmbiguous=The following export destination path is ambiguous: {0}. diff --git a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimConverter.cs b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimConverter.cs index 02b74033585..a8b254d4f5f 100644 --- a/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimConverter.cs +++ b/src/Microsoft.PowerShell.Commands.Management/cimSupport/cmdletization/cim/cimConverter.cs @@ -666,4 +666,4 @@ internal static void AssertIntrinsicCimType(Type type) "Caller should verify that type is an intrinsic CIM type"); } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearRecycleBinCommand.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearRecycleBinCommand.cs index 183c3712fbc..6a896303e14 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearRecycleBinCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearRecycleBinCommand.cs @@ -251,4 +251,4 @@ internal enum RecycleFlags : uint [DllImport("Shell32.dll", CharSet = CharSet.Unicode)] internal static extern uint SHEmptyRecycleBin(IntPtr hwnd, string pszRootPath, RecycleFlags dwFlags); } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Disable-PSBreakpoint.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Disable-PSBreakpoint.cs index 4e8a4758f1b..0617df92401 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Disable-PSBreakpoint.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Disable-PSBreakpoint.cs @@ -45,4 +45,4 @@ protected override void ProcessBreakpoint(Breakpoint breakpoint) } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Enable-PSBreakpoint.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Enable-PSBreakpoint.cs index ffec562fa2b..933a74ae28b 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Enable-PSBreakpoint.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Enable-PSBreakpoint.cs @@ -152,4 +152,4 @@ protected override void ProcessBreakpoint(Breakpoint breakpoint) } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ColumnInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ColumnInfo.cs index 595859f70c6..7a8d3fc5425 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ColumnInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ColumnInfo.cs @@ -57,4 +57,4 @@ internal static object LimitString(object src) return HostUtilities.GetMaxLines(srcString, 10); } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ExpressionColumnInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ExpressionColumnInfo.cs index 2ae6b5585c2..31cccdb4804 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ExpressionColumnInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ExpressionColumnInfo.cs @@ -39,4 +39,4 @@ internal override Object GetValue(PSObject liveObject) return objectResult == null ? String.Empty : ColumnInfo.LimitString(objectResult.ToString()); } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/HeaderInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/HeaderInfo.cs index 3e487439528..750a24b6883 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/HeaderInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/HeaderInfo.cs @@ -58,4 +58,4 @@ internal PSObject CreateStalePSObject(PSObject liveObject) return staleObject; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ScalarTypeColumnInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ScalarTypeColumnInfo.cs index 872a362c1d1..8016ba2bf7d 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ScalarTypeColumnInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/FormatAndOutput/OutGridView/ScalarTypeColumnInfo.cs @@ -76,4 +76,4 @@ internal override Object GetValue(PSObject liveObject) return _index++; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSBreakpoint.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSBreakpoint.cs index 2b2bc3b320a..5a5cf5451d4 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSBreakpoint.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSBreakpoint.cs @@ -293,4 +293,4 @@ private List Filter(List input, T[] filter, FilterSel return output; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSCallStack.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSCallStack.cs index 95ebf019ab8..f47272e8a7a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSCallStack.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Get-PSCallStack.cs @@ -24,4 +24,4 @@ protected override void ProcessRecord() } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventCommand.cs index 0989e91f919..2d406c96bf8 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventCommand.cs @@ -133,4 +133,4 @@ protected override void EndProcessing() } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventSubscriberCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventSubscriberCommand.cs index 7c013c30a3d..1869baa8a2d 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventSubscriberCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/GetEventSubscriberCommand.cs @@ -129,4 +129,4 @@ protected override void ProcessRecord() } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterObjectEventCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterObjectEventCommand.cs index 1b4386200e1..47dfca4b09c 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterObjectEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterObjectEventCommand.cs @@ -68,4 +68,4 @@ protected override String GetSourceObjectEventName() return _eventName; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterPSEventCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterPSEventCommand.cs index bcc24c49a54..93463e6caf3 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterPSEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RegisterPSEventCommand.cs @@ -62,4 +62,4 @@ protected override String GetSourceObjectEventName() return null; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Remove-PSBreakpoint.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Remove-PSBreakpoint.cs index bd55d3fddd0..9b9f9a58a77 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Remove-PSBreakpoint.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Remove-PSBreakpoint.cs @@ -21,4 +21,4 @@ protected override void ProcessBreakpoint(Breakpoint breakpoint) this.Context.Debugger.RemoveBreakpoint(breakpoint); } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RemoveEventCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RemoveEventCommand.cs index 381ebde3fa4..ca006a8f2df 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RemoveEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/RemoveEventCommand.cs @@ -134,4 +134,4 @@ protected override void ProcessRecord() } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Send-MailMessage.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Send-MailMessage.cs index b2667207242..a63ad2700e0 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Send-MailMessage.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Send-MailMessage.cs @@ -523,4 +523,4 @@ public override object Transform(EngineIntrinsics engineIntrinsics, object input } #endregion -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Set-PSBreakpoint.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Set-PSBreakpoint.cs index 50095080cec..36403bbf581 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Set-PSBreakpoint.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Set-PSBreakpoint.cs @@ -259,4 +259,4 @@ protected override void ProcessRecord() } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandCommandInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandCommandInfo.cs index 27b18fe61c2..78d1fbd1836 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandCommandInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandCommandInfo.cs @@ -148,4 +148,4 @@ internal static IEnumerable GetObjectEnumerable(System.Collections.IEnum /// public ICollection ParameterSets { get; private set; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandModuleInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandModuleInfo.cs index d8e47bee380..bfacd54ab4e 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandModuleInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandModuleInfo.cs @@ -52,4 +52,4 @@ public ShowCommandModuleInfo(PSObject other) /// public string Name { get; private set; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterInfo.cs index 2e72c44039b..11d42760196 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterInfo.cs @@ -106,4 +106,4 @@ public ShowCommandParameterInfo(PSObject other) /// public int Position { get; private set; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterSetInfo.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterSetInfo.cs index d252395de22..9a1990b0695 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterSetInfo.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterSetInfo.cs @@ -70,4 +70,4 @@ public ShowCommandParameterSetInfo(PSObject other) /// public ICollection Parameters { get; private set; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterType.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterType.cs index 899038bee1b..cb709926e9a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterType.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/ShowCommand/ShowCommandParameterType.cs @@ -156,4 +156,4 @@ public bool IsSwitch /// public ArrayList EnumValues { get; private set; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UnregisterEventCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UnregisterEventCommand.cs index 428c7a5843f..23bacaf4119 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UnregisterEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/UnregisterEventCommand.cs @@ -124,4 +124,4 @@ protected override void ProcessRecord() } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WaitEventCommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WaitEventCommand.cs index 6538a0bd716..dfb538a14cd 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WaitEventCommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WaitEventCommand.cs @@ -158,4 +158,4 @@ private void NotifyEvent(PSEventArgs e) } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/HtmlWebResponseObject.Common.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/HtmlWebResponseObject.Common.cs index be101d482fe..5ae30c561c7 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/HtmlWebResponseObject.Common.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/HtmlWebResponseObject.Common.cs @@ -508,4 +508,4 @@ private void CleanupNativeResources() } } } -#endif \ No newline at end of file +#endif diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/InvokeRestMethodCommand.Common.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/InvokeRestMethodCommand.Common.cs index 90abdf78bba..ebab2f59c72 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/InvokeRestMethodCommand.Common.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/InvokeRestMethodCommand.Common.cs @@ -316,4 +316,4 @@ public override void Write(byte[] buffer, int offset, int count) } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/BasicHtmlWebResponseObject.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/BasicHtmlWebResponseObject.CoreClr.cs index f4b060430f5..0d763530cb0 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/BasicHtmlWebResponseObject.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/BasicHtmlWebResponseObject.CoreClr.cs @@ -52,4 +52,4 @@ private void InitializeRawContent(HttpResponseMessage baseResponse) #endregion Methods } } -#endif \ No newline at end of file +#endif diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/ContentHelper.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/ContentHelper.CoreClr.cs index 4268bc63a98..2e85d7d25f9 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/ContentHelper.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/ContentHelper.CoreClr.cs @@ -69,4 +69,4 @@ internal static StringBuilder GetRawContentHeader(HttpResponseMessage response) } } } -#endif \ No newline at end of file +#endif diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/HtmlWebResponseObject.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/HtmlWebResponseObject.CoreClr.cs index c87d24a0d45..e4eddbab299 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/HtmlWebResponseObject.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/HtmlWebResponseObject.CoreClr.cs @@ -104,4 +104,4 @@ public void Dispose() #endregion } } -#endif \ No newline at end of file +#endif diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeRestMethodCommand.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeRestMethodCommand.CoreClr.cs index 23c9c0a44f7..6823e03c6b7 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeRestMethodCommand.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeRestMethodCommand.CoreClr.cs @@ -127,4 +127,4 @@ private RestReturnType CheckReturnType(HttpResponseMessage response) #endregion Helper Methods } } -#endif \ No newline at end of file +#endif diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeWebRequestCommand.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeWebRequestCommand.CoreClr.cs index ebd8a659c3d..47727bd053a 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeWebRequestCommand.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/InvokeWebRequestCommand.CoreClr.cs @@ -73,4 +73,4 @@ internal override void ProcessResponse(HttpResponseMessage response) #endregion Virtual Method Overrides } } -#endif \ No newline at end of file +#endif diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebProxy.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebProxy.cs index 2ceb4dc3b33..55b6fa3e6c7 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebProxy.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebProxy.cs @@ -69,4 +69,4 @@ public bool IsBypassed(Uri host) } } } -#endif \ No newline at end of file +#endif diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs index ec570876343..b06ce35971e 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseHelper.CoreClr.cs @@ -44,4 +44,4 @@ internal static bool IsText(HttpResponseMessage response) } } } -#endif \ No newline at end of file +#endif diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs index 9e4b52bfd0f..25163e73726 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObject.CoreClr.cs @@ -128,4 +128,4 @@ private void SetResponse(HttpResponseMessage response, Stream contentStream) #endregion } } -#endif \ No newline at end of file +#endif diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObjectFactory.CoreClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObjectFactory.CoreClr.cs index f706ae5a142..10a56385f41 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObjectFactory.CoreClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/CoreCLR/WebResponseObjectFactory.CoreClr.cs @@ -37,4 +37,4 @@ internal static WebResponseObject GetResponseObject(HttpResponseMessage response } } } -#endif \ No newline at end of file +#endif diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/ContentHelper.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/ContentHelper.FullClr.cs index 12d7d14d946..f7b3879598f 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/ContentHelper.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/ContentHelper.FullClr.cs @@ -62,4 +62,4 @@ internal static StringBuilder GetRawContentHeader(WebResponse baseResponse) return raw; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeRestMethodCommand.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeRestMethodCommand.FullClr.cs index c07f151ab61..d54482c34d9 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeRestMethodCommand.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeRestMethodCommand.FullClr.cs @@ -109,4 +109,4 @@ private RestReturnType CheckReturnType(WebResponse response) #endregion Helper Methods } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeWebRequestCommand.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeWebRequestCommand.FullClr.cs index cb5a5710783..e3ef0906b62 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeWebRequestCommand.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/InvokeWebRequestCommand.FullClr.cs @@ -55,4 +55,4 @@ internal override void ProcessResponse(WebResponse response) #endregion Virtual Method Overrides } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/JsonObjectTypeResolver.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/JsonObjectTypeResolver.cs index 142b64c1d73..b09efc2eb3d 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/JsonObjectTypeResolver.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/JsonObjectTypeResolver.cs @@ -26,4 +26,4 @@ public override string ResolveTypeId(Type type) return (string.Empty); } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebRequestPSCmdlet.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebRequestPSCmdlet.FullClr.cs index c1b65ba3ee3..eafd7a8c607 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebRequestPSCmdlet.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebRequestPSCmdlet.FullClr.cs @@ -794,4 +794,4 @@ public TimeoutState(HttpWebRequest request) #endregion private State class } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseHelper.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseHelper.FullClr.cs index 8e654276015..2d4cc61dfb8 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseHelper.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseHelper.FullClr.cs @@ -69,4 +69,4 @@ internal static bool IsText(WebResponse response) return (ContentHelper.IsText(contentType)); } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseObjectFactory.FullClr.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseObjectFactory.FullClr.cs index 1d42838eedb..d529dab6653 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseObjectFactory.FullClr.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/FullClr/WebResponseObjectFactory.FullClr.cs @@ -32,4 +32,4 @@ internal static WebResponseObject GetResponseObject(WebResponse response, Stream return (output); } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs index 28c443d4790..ffa611da6fa 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs @@ -358,4 +358,4 @@ private static PSObject PopulateFromDictionary(IDictionary entri } #endif } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteConsoleCmdlet.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteConsoleCmdlet.cs index d83ef795fbd..8ac62faf2c1 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteConsoleCmdlet.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WriteConsoleCmdlet.cs @@ -150,4 +150,4 @@ protected override void ProcessRecord() private Boolean _notAppendNewline = false; } -} // namespace Microsoft.PowerShell.Commands \ No newline at end of file +} // namespace Microsoft.PowerShell.Commands diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/neweventcommand.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/neweventcommand.cs index 4584ffb9977..a99921d4887 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/neweventcommand.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/neweventcommand.cs @@ -121,4 +121,4 @@ protected override void EndProcessing() WriteObject(Events.GenerateEvent(_sourceIdentifier, messageSender, baseEventArgs, _messageData, true, false)); } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.CoreCLR.AssemblyLoadContext/.gitignore b/src/Microsoft.PowerShell.CoreCLR.AssemblyLoadContext/.gitignore index 9039b569ee0..9b711d71d21 100644 --- a/src/Microsoft.PowerShell.CoreCLR.AssemblyLoadContext/.gitignore +++ b/src/Microsoft.PowerShell.CoreCLR.AssemblyLoadContext/.gitignore @@ -1 +1 @@ -CorePsTypeCatalog.cs \ No newline at end of file +CorePsTypeCatalog.cs diff --git a/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/Reader/ProviderMetadataCachedInformation.cs b/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/Reader/ProviderMetadataCachedInformation.cs index 6fedf2f149f..ca3ef7abcba 100644 --- a/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/Reader/ProviderMetadataCachedInformation.cs +++ b/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/Reader/ProviderMetadataCachedInformation.cs @@ -304,4 +304,4 @@ public IEnumerable GetKeywordDisplayNames(string ProviderName, EventLogH } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/Reader/Winmeta.cs b/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/Reader/Winmeta.cs index 47746d76868..4d4ba4a1cb7 100644 --- a/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/Reader/Winmeta.cs +++ b/src/Microsoft.PowerShell.CoreCLR.Eventing/DotNetCode/Eventing/Reader/Winmeta.cs @@ -153,4 +153,4 @@ public enum StandardEventKeywords : long /// EventLogClassic = 0x80000000000000 } -} \ No newline at end of file +} diff --git a/src/Microsoft.PowerShell.PSReadLine/en-US/PSReadline.md b/src/Microsoft.PowerShell.PSReadLine/en-US/PSReadline.md index c92c4872641..2d433a94552 100644 --- a/src/Microsoft.PowerShell.PSReadLine/en-US/PSReadline.md +++ b/src/Microsoft.PowerShell.PSReadLine/en-US/PSReadline.md @@ -1,513 +1,513 @@ -# Get-PSReadlineKeyHandler - -## SYNOPSIS -Gets the key bindings for the PSReadline module. - -## DESCRIPTION -Gets the key bindings for the PSReadline module. - -If neither -Bound nor -Unbound is specified, returns all bound keys and unbound functions. - -If -Bound is specified and -Unbound is not specified, only bound keys are returned. - -If -Unbound is specified and -Bound is not specified, only unbound keys are returned. - -If both -Bound and -Unbound are specified, returns all bound keys and unbound functions. - -## PARAMETERS - -### Bound [switch] = True - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Include functions that are bound. - - -### Unbound [switch] = True - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Include functions that are unbound. - - - -## INPUTS -### None -You cannot pipe objects to Get-PSReadlineKeyHandler - -## OUTPUTS -### Microsoft.PowerShell.KeyHandler - -Returns one entry for each key binding (or chord) for bound functions and/or one entry for each unbound function - - - -## RELATED LINKS - -[about_PSReadline]() - -# Get-PSReadlineOption - -## SYNOPSIS -Returns the values for the options that can be configured. - -## DESCRIPTION -Get-PSReadlineOption returns the current state of the settings that can be configured by Set-PSReadlineOption. - -The object returned can be used to change PSReadline options. -This provides a slightly simpler way of setting syntax coloring options for multiple kinds of tokens. - -## PARAMETERS - - -## INPUTS -### None -You cannot pipe objects to Get-PSReadlineOption - -## OUTPUTS -### - - - - - -## RELATED LINKS - -[about_PSReadline]() - -# Set-PSReadlineKeyHandler - -## SYNOPSIS -Binds or rebinds keys to user defined or PSReadline provided key handlers. - -## DESCRIPTION -This cmdlet is used to customize what happens when a particular key or sequence of keys is pressed while PSReadline is reading input. - -With user defined key bindings, you can do nearly anything that is possible from a PowerShell script. -Typically you might just edit the command line in some novel way, but because the handlers are just PowerShell scripts, you can do interesting things like change directories, launch programs, etc. - -## PARAMETERS - -### Chord [String[]] - -```powershell -[Parameter( - Mandatory = $true, - Position = 0)] -``` - -The key or sequence of keys to be bound to a Function or ScriptBlock. -A single binding is specified with a single string. -If the binding is a sequence of keys, the keys are separated with a comma, e.g. "Ctrl+X,Ctrl+X". -Note that this parameter accepts multiple strings. -Each string is a separate binding, not a sequence of keys for a single binding. - - -### ScriptBlock [ScriptBlock] - -```powershell -[Parameter( - Mandatory = $true, - Position = 1, - ParameterSetName = 'Set 1')] -``` - -The ScriptBlock is called when the Chord is entered. -The ScriptBlock is passed one or sometimes two arguments. -The first argument is the key pressed (a ConsoleKeyInfo.) The second argument could be any object depending on the context. - - -### BriefDescription [String] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -A brief description of the key binding. -Used in the output of cmdlet Get-PSReadlineKeyHandler. - - -### Description [String] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -A more verbose description of the key binding. -Used in the output of the cmdlet Get-PSReadlineKeyHandler. - - -### Function [String] - -```powershell -[Parameter( - Mandatory = $true, - Position = 1, - ParameterSetName = 'Set 2')] -``` - -The name of an existing key handler provided by PSReadline. -This parameter allows one to rebind existing key bindings or to bind a handler provided by PSReadline that is currently unbound. - -Using the ScriptBlock parameter, one can achieve equivalent functionality by calling the method directly from the ScriptBlock. -This parameter is preferred though - it makes it easier to determine which functions are bound and unbound. - - - -## INPUTS -### None -You cannot pipe objects to Set-PSReadlineKeyHandler - -## OUTPUTS -### - - - - -## EXAMPLES -### -------------- Example 1 -------------- - -```powershell -PS C:\> Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward -``` -This command binds the up arrow key to the function HistorySearchBackward which will use the currently entered command line as the beginning of the search string when searching through history. -### -------------- Example 2 -------------- - -```powershell -PS C:\> Set-PSReadlineKeyHandler -Chord Shift+Ctrl+B -ScriptBlock { - [PSConsoleUtilities.PSConsoleReadLine]::RevertLine() - [PSConsoleUtilities.PSConsoleReadLine]::Insert('build') ->>> [PSConsoleUtilities.PSConsoleReadLine]::AcceptLine() -} -``` -This example binds the key Ctrl+Shift+B to a script block that clears the line, inserts build, then accepts the line. -This example shows how a single key can be used to execute a command. - -## RELATED LINKS - -[about_PSReadline]() - -# Set-PSReadlineOption - -## SYNOPSIS -Customizes the behavior of command line editing in PSReadline. - -## DESCRIPTION -The Set-PSReadlineOption cmdlet is used to customize the behavior of the PSReadline module when editing the command line. - -## PARAMETERS - -### EditMode [EditMode] = Windows - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the command line editing mode. -This will reset any key bindings set by Set-PSReadlineKeyHandler. - -Valid values are: - --- Windows: Key bindings emulate PowerShell/cmd with some bindings emulating Visual Studio. - --- Emacs: Key bindings emulate Bash or Emacs. - - -### ContinuationPrompt [String] = >>> - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the string displayed at the beginning of the second and subsequent lines when multi-line input is being entered. -Defaults to '\>\>\> '. -The empty string is valid. - - -### ContinuationPromptForegroundColor [ConsoleColor] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the foreground color of the continuation prompt. - - -### ContinuationPromptBackgroundColor [ConsoleColor] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the background color of the continuation prompt. - - -### EmphasisForegroundColor [ConsoleColor] = Cyan - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the foreground color used for emphasis, e.g. -to highlight search text. - - -### EmphasisBackgroundColor [ConsoleColor] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the background color used for emphasis, e.g. -to highlight search text. - - -### ErrorForegroundColor [ConsoleColor] = Red - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the foreground color used for errors. - - -### ErrorBackgroundColor [ConsoleColor] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the background color used for errors. - - -### HistoryNoDuplicates [switch] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies that duplicate commands should not be added to PSReadline history. - - -### AddToHistoryHandler [Func[String, Boolean]] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies a ScriptBlock that can be used to control which commands get added to PSReadline history. - - -### ValidationHandler [Func[String, Object]] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies a ScriptBlock that is called from ValidateAndAcceptLine. -If a non-null object is returned or an exception is thrown, validation fails and the error is reported. -If the object returned/thrown has a Message property, it's value is used in the error message, and if there is an Offset property, the cursor is moved to that offset after reporting the error. -If there is no Message property, the ToString method is called to report the error. - - -### HistorySearchCursorMovesToEnd [switch] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - - - - -### MaximumHistoryCount [Int32] = 1024 - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the maximum number of commands to save in PSReadline history. -Note that PSReadline history is separate from PowerShell history. - - -### MaximumKillRingCount [Int32] = 10 - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the maximum number of items stored in the kill ring. - - -### ResetTokenColors [switch] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Restore the token colors to the default settings. - - -### ShowToolTips [switch] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -When displaying possible completions, show tooltips in the list of completions. - - -### ExtraPromptLineCount [Int32] = 0 - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Use this option if your prompt spans more than one line and you want the extra lines to appear when PSReadline displays the prompt after showing some output, e.g. -when showing a list of completions. - - -### DingTone [Int32] = 1221 - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -When BellStyle is set to Audible, specifies the tone of the beep. - - -### DingDuration [Int32] = 50ms - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -When BellStyle is set to Audible, specifies the duration of the beep. - - -### BellStyle [BellStyle] = Audible - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies how PSReadline should respond to various error and ambiguous conditions. - -Valid values are: - --- Audible: a short beep - --- Visible: a brief flash is performed - --- None: no feedback - - -### CompletionQueryItems [Int32] = 100 - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the maximum number of completion items that will be shown without prompting. -If the number of items to show is greater than this value, PSReadline will prompt y/n before displaying the completion items. - - -### WordDelimiters [string] = ;:,.[]{}()/\|^&*-=+ - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the characters that delimit words for functions like ForwardWord or KillWord. - - -### HistorySearchCaseSensitive [switch] - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the searching history is case sensitive in functions like ReverseSearchHistory or HistorySearchBackward. - - -### HistorySaveStyle [HistorySaveStyle] = SaveIncrementally - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies how PSReadline should save history. - -Valid values are: - --- SaveIncrementally: save history after each command is executed - and share across multiple instances of PowerShell - --- SaveAtExit: append history file when PowerShell exits - --- SaveNothing: don't use a history file - - -### HistorySavePath [String] = ~\AppData\Roaming\PSReadline\$($host.Name)_history.txt - -```powershell -[Parameter(ParameterSetName = 'Set 1')] -``` - -Specifies the path to the history file. - - -### TokenKind [TokenClassification] - -```powershell -[Parameter( - Mandatory = $true, - Position = 0, - ParameterSetName = 'Set 2')] -``` - -Specifies the kind of token when setting token coloring options with the -ForegroundColor and -BackgroundColor parameters. - - -### ForegroundColor [ConsoleColor] - -```powershell -[Parameter( - Position = 1, - ParameterSetName = 'Set 2')] -``` - -Specifies the foreground color for the token kind specified by the parameter -TokenKind. - - -### BackgroundColor [ConsoleColor] - -```powershell -[Parameter( - Position = 2, - ParameterSetName = 'Set 2')] -``` - -Specifies the background color for the token kind specified by the parameter -TokenKind. - - - -## INPUTS -### None -You cannot pipe objects to Set-PSReadlineOption - - -## OUTPUTS -### None -This cmdlet does not generate any output. - - - - -## RELATED LINKS - -[about_PSReadline]() - - +# Get-PSReadlineKeyHandler + +## SYNOPSIS +Gets the key bindings for the PSReadline module. + +## DESCRIPTION +Gets the key bindings for the PSReadline module. + +If neither -Bound nor -Unbound is specified, returns all bound keys and unbound functions. + +If -Bound is specified and -Unbound is not specified, only bound keys are returned. + +If -Unbound is specified and -Bound is not specified, only unbound keys are returned. + +If both -Bound and -Unbound are specified, returns all bound keys and unbound functions. + +## PARAMETERS + +### Bound [switch] = True + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Include functions that are bound. + + +### Unbound [switch] = True + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Include functions that are unbound. + + + +## INPUTS +### None +You cannot pipe objects to Get-PSReadlineKeyHandler + +## OUTPUTS +### Microsoft.PowerShell.KeyHandler + +Returns one entry for each key binding (or chord) for bound functions and/or one entry for each unbound function + + + +## RELATED LINKS + +[about_PSReadline]() + +# Get-PSReadlineOption + +## SYNOPSIS +Returns the values for the options that can be configured. + +## DESCRIPTION +Get-PSReadlineOption returns the current state of the settings that can be configured by Set-PSReadlineOption. + +The object returned can be used to change PSReadline options. +This provides a slightly simpler way of setting syntax coloring options for multiple kinds of tokens. + +## PARAMETERS + + +## INPUTS +### None +You cannot pipe objects to Get-PSReadlineOption + +## OUTPUTS +### + + + + + +## RELATED LINKS + +[about_PSReadline]() + +# Set-PSReadlineKeyHandler + +## SYNOPSIS +Binds or rebinds keys to user defined or PSReadline provided key handlers. + +## DESCRIPTION +This cmdlet is used to customize what happens when a particular key or sequence of keys is pressed while PSReadline is reading input. + +With user defined key bindings, you can do nearly anything that is possible from a PowerShell script. +Typically you might just edit the command line in some novel way, but because the handlers are just PowerShell scripts, you can do interesting things like change directories, launch programs, etc. + +## PARAMETERS + +### Chord [String[]] + +```powershell +[Parameter( + Mandatory = $true, + Position = 0)] +``` + +The key or sequence of keys to be bound to a Function or ScriptBlock. +A single binding is specified with a single string. +If the binding is a sequence of keys, the keys are separated with a comma, e.g. "Ctrl+X,Ctrl+X". +Note that this parameter accepts multiple strings. +Each string is a separate binding, not a sequence of keys for a single binding. + + +### ScriptBlock [ScriptBlock] + +```powershell +[Parameter( + Mandatory = $true, + Position = 1, + ParameterSetName = 'Set 1')] +``` + +The ScriptBlock is called when the Chord is entered. +The ScriptBlock is passed one or sometimes two arguments. +The first argument is the key pressed (a ConsoleKeyInfo.) The second argument could be any object depending on the context. + + +### BriefDescription [String] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +A brief description of the key binding. +Used in the output of cmdlet Get-PSReadlineKeyHandler. + + +### Description [String] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +A more verbose description of the key binding. +Used in the output of the cmdlet Get-PSReadlineKeyHandler. + + +### Function [String] + +```powershell +[Parameter( + Mandatory = $true, + Position = 1, + ParameterSetName = 'Set 2')] +``` + +The name of an existing key handler provided by PSReadline. +This parameter allows one to rebind existing key bindings or to bind a handler provided by PSReadline that is currently unbound. + +Using the ScriptBlock parameter, one can achieve equivalent functionality by calling the method directly from the ScriptBlock. +This parameter is preferred though - it makes it easier to determine which functions are bound and unbound. + + + +## INPUTS +### None +You cannot pipe objects to Set-PSReadlineKeyHandler + +## OUTPUTS +### + + + + +## EXAMPLES +### -------------- Example 1 -------------- + +```powershell +PS C:\> Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward +``` +This command binds the up arrow key to the function HistorySearchBackward which will use the currently entered command line as the beginning of the search string when searching through history. +### -------------- Example 2 -------------- + +```powershell +PS C:\> Set-PSReadlineKeyHandler -Chord Shift+Ctrl+B -ScriptBlock { + [PSConsoleUtilities.PSConsoleReadLine]::RevertLine() + [PSConsoleUtilities.PSConsoleReadLine]::Insert('build') +>>> [PSConsoleUtilities.PSConsoleReadLine]::AcceptLine() +} +``` +This example binds the key Ctrl+Shift+B to a script block that clears the line, inserts build, then accepts the line. +This example shows how a single key can be used to execute a command. + +## RELATED LINKS + +[about_PSReadline]() + +# Set-PSReadlineOption + +## SYNOPSIS +Customizes the behavior of command line editing in PSReadline. + +## DESCRIPTION +The Set-PSReadlineOption cmdlet is used to customize the behavior of the PSReadline module when editing the command line. + +## PARAMETERS + +### EditMode [EditMode] = Windows + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the command line editing mode. +This will reset any key bindings set by Set-PSReadlineKeyHandler. + +Valid values are: + +-- Windows: Key bindings emulate PowerShell/cmd with some bindings emulating Visual Studio. + +-- Emacs: Key bindings emulate Bash or Emacs. + + +### ContinuationPrompt [String] = >>> + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the string displayed at the beginning of the second and subsequent lines when multi-line input is being entered. +Defaults to '\>\>\> '. +The empty string is valid. + + +### ContinuationPromptForegroundColor [ConsoleColor] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the foreground color of the continuation prompt. + + +### ContinuationPromptBackgroundColor [ConsoleColor] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the background color of the continuation prompt. + + +### EmphasisForegroundColor [ConsoleColor] = Cyan + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the foreground color used for emphasis, e.g. +to highlight search text. + + +### EmphasisBackgroundColor [ConsoleColor] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the background color used for emphasis, e.g. +to highlight search text. + + +### ErrorForegroundColor [ConsoleColor] = Red + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the foreground color used for errors. + + +### ErrorBackgroundColor [ConsoleColor] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the background color used for errors. + + +### HistoryNoDuplicates [switch] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies that duplicate commands should not be added to PSReadline history. + + +### AddToHistoryHandler [Func[String, Boolean]] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies a ScriptBlock that can be used to control which commands get added to PSReadline history. + + +### ValidationHandler [Func[String, Object]] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies a ScriptBlock that is called from ValidateAndAcceptLine. +If a non-null object is returned or an exception is thrown, validation fails and the error is reported. +If the object returned/thrown has a Message property, it's value is used in the error message, and if there is an Offset property, the cursor is moved to that offset after reporting the error. +If there is no Message property, the ToString method is called to report the error. + + +### HistorySearchCursorMovesToEnd [switch] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + + + + +### MaximumHistoryCount [Int32] = 1024 + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the maximum number of commands to save in PSReadline history. +Note that PSReadline history is separate from PowerShell history. + + +### MaximumKillRingCount [Int32] = 10 + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the maximum number of items stored in the kill ring. + + +### ResetTokenColors [switch] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Restore the token colors to the default settings. + + +### ShowToolTips [switch] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +When displaying possible completions, show tooltips in the list of completions. + + +### ExtraPromptLineCount [Int32] = 0 + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Use this option if your prompt spans more than one line and you want the extra lines to appear when PSReadline displays the prompt after showing some output, e.g. +when showing a list of completions. + + +### DingTone [Int32] = 1221 + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +When BellStyle is set to Audible, specifies the tone of the beep. + + +### DingDuration [Int32] = 50ms + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +When BellStyle is set to Audible, specifies the duration of the beep. + + +### BellStyle [BellStyle] = Audible + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies how PSReadline should respond to various error and ambiguous conditions. + +Valid values are: + +-- Audible: a short beep + +-- Visible: a brief flash is performed + +-- None: no feedback + + +### CompletionQueryItems [Int32] = 100 + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the maximum number of completion items that will be shown without prompting. +If the number of items to show is greater than this value, PSReadline will prompt y/n before displaying the completion items. + + +### WordDelimiters [string] = ;:,.[]{}()/\|^&*-=+ + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the characters that delimit words for functions like ForwardWord or KillWord. + + +### HistorySearchCaseSensitive [switch] + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the searching history is case sensitive in functions like ReverseSearchHistory or HistorySearchBackward. + + +### HistorySaveStyle [HistorySaveStyle] = SaveIncrementally + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies how PSReadline should save history. + +Valid values are: + +-- SaveIncrementally: save history after each command is executed - and share across multiple instances of PowerShell + +-- SaveAtExit: append history file when PowerShell exits + +-- SaveNothing: don't use a history file + + +### HistorySavePath [String] = ~\AppData\Roaming\PSReadline\$($host.Name)_history.txt + +```powershell +[Parameter(ParameterSetName = 'Set 1')] +``` + +Specifies the path to the history file. + + +### TokenKind [TokenClassification] + +```powershell +[Parameter( + Mandatory = $true, + Position = 0, + ParameterSetName = 'Set 2')] +``` + +Specifies the kind of token when setting token coloring options with the -ForegroundColor and -BackgroundColor parameters. + + +### ForegroundColor [ConsoleColor] + +```powershell +[Parameter( + Position = 1, + ParameterSetName = 'Set 2')] +``` + +Specifies the foreground color for the token kind specified by the parameter -TokenKind. + + +### BackgroundColor [ConsoleColor] + +```powershell +[Parameter( + Position = 2, + ParameterSetName = 'Set 2')] +``` + +Specifies the background color for the token kind specified by the parameter -TokenKind. + + + +## INPUTS +### None +You cannot pipe objects to Set-PSReadlineOption + + +## OUTPUTS +### None +This cmdlet does not generate any output. + + + + +## RELATED LINKS + +[about_PSReadline]() + + diff --git a/src/Microsoft.PowerShell.PSReadLine/packages.config b/src/Microsoft.PowerShell.PSReadLine/packages.config index 0dc84546ba9..a00c7efe4d1 100644 --- a/src/Microsoft.PowerShell.PSReadLine/packages.config +++ b/src/Microsoft.PowerShell.PSReadLine/packages.config @@ -1,4 +1,4 @@  - \ No newline at end of file + diff --git a/src/Microsoft.PowerShell.Security/resources/CertificateProviderStrings.resx b/src/Microsoft.PowerShell.Security/resources/CertificateProviderStrings.resx index bf4320ae3ac..ac1d771f659 100644 --- a/src/Microsoft.PowerShell.Security/resources/CertificateProviderStrings.resx +++ b/src/Microsoft.PowerShell.Security/resources/CertificateProviderStrings.resx @@ -1,192 +1,192 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - X509 Certificate Provider - - - Cannot find the X509 certificate at path {0}. - - - Cannot find the X509 certificate store at path {0}. - - - Cannot find the certificate store because the specified X509 store location {0} is not valid. - - - Cannot process the path because path {0} is not a valid certificate provider path. - - - Move certificate - - - Remove certificate - - - Remove certificate and its private key. - - - Invoke Certificate Manager - - - {0} is not supported in the current operating system. - - - Item: {0} Destination: {1} - - - You cannot move a certificate container. - - - You cannot move a certificate from user store to or from machine. - - - You cannot move a certificate to the same store. - - - You cannot create an item other than certificate store. - - - Creating certificate stores under CurrentUser is not supported. - - - Deleting certificate stores under CurrentUser is not supported. - - - The destination is not a valid store. - - - Item: {0} - - - The store {0} is a built-in system store and cannot be deleted. - - - You cannot remove a certificate container. - - - Private key skipped. The certificate has no private key association. - - - The operation is on user root store and UI is not allowed. - - - . The following error may be a result of user credentials required on the remote machine. See Enable-WSManCredSSP Cmdlet help on how to enable and use CredSSP for delegation with Windows PowerShell remoting. - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + X509 Certificate Provider + + + Cannot find the X509 certificate at path {0}. + + + Cannot find the X509 certificate store at path {0}. + + + Cannot find the certificate store because the specified X509 store location {0} is not valid. + + + Cannot process the path because path {0} is not a valid certificate provider path. + + + Move certificate + + + Remove certificate + + + Remove certificate and its private key. + + + Invoke Certificate Manager + + + {0} is not supported in the current operating system. + + + Item: {0} Destination: {1} + + + You cannot move a certificate container. + + + You cannot move a certificate from user store to or from machine. + + + You cannot move a certificate to the same store. + + + You cannot create an item other than certificate store. + + + Creating certificate stores under CurrentUser is not supported. + + + Deleting certificate stores under CurrentUser is not supported. + + + The destination is not a valid store. + + + Item: {0} + + + The store {0} is a built-in system store and cannot be deleted. + + + You cannot remove a certificate container. + + + Private key skipped. The certificate has no private key association. + + + The operation is on user root store and UI is not allowed. + + + . The following error may be a result of user credentials required on the remote machine. See Enable-WSManCredSSP Cmdlet help on how to enable and use CredSSP for delegation with Windows PowerShell remoting. + + diff --git a/src/Microsoft.WSMan.Management/resources/WsManResources.txt b/src/Microsoft.WSMan.Management/resources/WsManResources.txt index 7599a12ece2..13f069f73e4 100644 --- a/src/Microsoft.WSMan.Management/resources/WsManResources.txt +++ b/src/Microsoft.WSMan.Management/resources/WsManResources.txt @@ -65,4 +65,4 @@ SetItemWhatIfAndConfirmText= "Set-Item" on the WinRM configuration setting "{0}" SetItemWarnigForPPQ=The updated configuration is effective only if it is less than or equal to the value of global quota {0}. Verify the value for the global quota using the PowerShell cmdlet "Get-Item {0}". SetItemWarningForGlobalQuota=The updated configuration might affect the operation of the plugins having a per plugin quota value greater than {0}. Verify the configuration of all the registered plugins and change the per plugin quota values for the affected plugins. SetItemServiceRestartWarning= The configuration changes you made will only be effective after the WinRM service is restarted. To restart the WinRM service, run the following command: 'Restart-Service winrm' -SetItemServiceRestartWarningRemote= The configuration changes you made will only be effective after the WinRM service is restarted on {0}. \ No newline at end of file +SetItemServiceRestartWarningRemote= The configuration changes you made will only be effective after the WinRM service is restarted on {0}. diff --git a/src/Modules/Shared/Microsoft.PowerShell.Host/Microsoft.PowerShell.Host.psd1 b/src/Modules/Shared/Microsoft.PowerShell.Host/Microsoft.PowerShell.Host.psd1 index 3795749381b..8ad693db0cf 100644 --- a/src/Modules/Shared/Microsoft.PowerShell.Host/Microsoft.PowerShell.Host.psd1 +++ b/src/Modules/Shared/Microsoft.PowerShell.Host/Microsoft.PowerShell.Host.psd1 @@ -1,14 +1,14 @@ -@{ -GUID="56D66100-99A0-4FFC-A12D-EEE9A6718AEF" -Author="Microsoft Corporation" -CompanyName="Microsoft Corporation" -Copyright=" Microsoft Corporation. All rights reserved." -ModuleVersion="3.0.0.0" -PowerShellVersion="3.0" -CLRVersion="4.0" -AliasesToExport = @() -FunctionsToExport = @() -CmdletsToExport="Start-Transcript", "Stop-Transcript" -NestedModules="Microsoft.PowerShell.ConsoleHost.dll" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390784' -} +@{ +GUID="56D66100-99A0-4FFC-A12D-EEE9A6718AEF" +Author="Microsoft Corporation" +CompanyName="Microsoft Corporation" +Copyright=" Microsoft Corporation. All rights reserved." +ModuleVersion="3.0.0.0" +PowerShellVersion="3.0" +CLRVersion="4.0" +AliasesToExport = @() +FunctionsToExport = @() +CmdletsToExport="Start-Transcript", "Stop-Transcript" +NestedModules="Microsoft.PowerShell.ConsoleHost.dll" +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390784' +} diff --git a/src/Modules/Shared/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psm1 b/src/Modules/Shared/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psm1 index 322c671fcb0..cd915abe7ae 100644 --- a/src/Modules/Shared/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psm1 +++ b/src/Modules/Shared/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psm1 @@ -1,174 +1,174 @@ - -## Converts a SDDL string into an object-based representation of a security -## descriptor -function ConvertFrom-SddlString -{ - [CmdletBinding(HelpUri = "https://go.microsoft.com/fwlink/?LinkId=623636")] - param( - ## The string representing the security descriptor in SDDL syntax - [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] - [String] $Sddl, - - ## The type of rights that this SDDL string represents, if any. - [Parameter()] - [ValidateSet( - "FileSystemRights", "RegistryRights", "ActiveDirectoryRights", - "MutexRights", "SemaphoreRights", "CryptoKeyRights", - "EventWaitHandleRights")] - $Type - ) - - Begin - { - # On CoreCLR CryptoKeyRights and ActiveDirectoryRights are not supported. - if ($PSEdition -eq "Core" -and ($Type -eq "CryptoKeyRights" -or $Type -eq "ActiveDirectoryRights")) - { - $errorId = "TypeNotSupported" - $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidArgument - $errorMessage = [Microsoft.PowerShell.Commands.UtilityResources]::TypeNotSupported -f $Type - $exception = [System.ArgumentException]::New($errorMessage) - $errorRecord = [System.Management.Automation.ErrorRecord]::New($exception, $errorId, $errorCategory, $null) - $PSCmdlet.ThrowTerminatingError($errorRecord) - } - - ## Translates a SID into a NT Account - function ConvertTo-NtAccount - { - param($Sid) - - if($Sid) - { - $securityIdentifier = [System.Security.Principal.SecurityIdentifier] $Sid - - try - { - $ntAccount = $securityIdentifier.Translate([System.Security.Principal.NTAccount]).ToString() - } - catch{} - - $ntAccount - } - } - - ## Gets the access rights that apply to an access mask, preferring right types - ## of 'Type' if specified. - function Get-AccessRights - { - param($AccessMask, $Type) - - if ($PSEdition -eq "Core") - { - ## All the types of access rights understood by .NET Core - $rightTypes = [Ordered] @{ - "FileSystemRights" = [System.Security.AccessControl.FileSystemRights] - "RegistryRights" = [System.Security.AccessControl.RegistryRights] - "MutexRights" = [System.Security.AccessControl.MutexRights] - "SemaphoreRights" = [System.Security.AccessControl.SemaphoreRights] - "EventWaitHandleRights" = [System.Security.AccessControl.EventWaitHandleRights] - } - } - else - { - ## All the types of access rights understood by .NET - $rightTypes = [Ordered] @{ - "FileSystemRights" = [System.Security.AccessControl.FileSystemRights] - "RegistryRights" = [System.Security.AccessControl.RegistryRights] - "ActiveDirectoryRights" = [System.DirectoryServices.ActiveDirectoryRights] - "MutexRights" = [System.Security.AccessControl.MutexRights] - "SemaphoreRights" = [System.Security.AccessControl.SemaphoreRights] - "CryptoKeyRights" = [System.Security.AccessControl.CryptoKeyRights] - "EventWaitHandleRights" = [System.Security.AccessControl.EventWaitHandleRights] - } - } - $typesToExamine = $rightTypes.Values - - ## If they know the access mask represents a certain type, prefer its names - ## (i.e.: CreateLink for the registry over CreateDirectories for the filesystem) - if($Type) - { - $typesToExamine = @($rightTypes[$Type]) + $typesToExamine - } - - - ## Stores the access types we've found that apply - $foundAccess = @() - - ## Store the access types we've already seen, so that we don't report access - ## flags that are essentially duplicate. Many of the access values in the different - ## enumerations have the same value but with different names. - $foundValues = @{} - - ## Go through the entries in the different right types, and see if they apply to the - ## provided access mask. If they do, then add that to the result. - foreach($rightType in $typesToExamine) - { - foreach($accessFlag in [Enum]::GetNames($rightType)) - { - $longKeyValue = [long] $rightType::$accessFlag - if(-not $foundValues.ContainsKey($longKeyValue)) - { - $foundValues[$longKeyValue] = $true - if(($AccessMask -band $longKeyValue) -eq ($longKeyValue)) - { - $foundAccess += $accessFlag - } - } - } - } - - $foundAccess | Sort-Object - } - - ## Converts an ACE into a string representation - function ConvertTo-AceString - { - param( - [Parameter(ValueFromPipeline)] - $Ace, - $Type - ) - - process - { - foreach($aceEntry in $Ace) - { - $AceString = (ConvertTo-NtAccount $aceEntry.SecurityIdentifier) + ": " + $aceEntry.AceQualifier - if($aceEntry.AceFlags -ne "None") - { - $AceString += " " + $aceEntry.AceFlags - } - - if($aceEntry.AccessMask) - { - $foundAccess = Get-AccessRights $aceEntry.AccessMask $Type - - if($foundAccess) - { - $AceString += " ({0})" -f ($foundAccess -join ", ") - } - } - - $AceString - } - } - } - } - - Process - { - $rawSecurityDescriptor = [Security.AccessControl.CommonSecurityDescriptor]::new($false,$false,$Sddl) - - $owner = ConvertTo-NtAccount $rawSecurityDescriptor.Owner - $group = ConvertTo-NtAccount $rawSecurityDescriptor.Group - $discretionaryAcl = ConvertTo-AceString $rawSecurityDescriptor.DiscretionaryAcl $Type - $systemAcl = ConvertTo-AceString $rawSecurityDescriptor.SystemAcl $Type - - [PSCustomObject] @{ - Owner = $owner - Group = $group - DiscretionaryAcl = @($discretionaryAcl) - SystemAcl = @($systemAcl) - RawDescriptor = $rawSecurityDescriptor - } - } -} + +## Converts a SDDL string into an object-based representation of a security +## descriptor +function ConvertFrom-SddlString +{ + [CmdletBinding(HelpUri = "https://go.microsoft.com/fwlink/?LinkId=623636")] + param( + ## The string representing the security descriptor in SDDL syntax + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] + [String] $Sddl, + + ## The type of rights that this SDDL string represents, if any. + [Parameter()] + [ValidateSet( + "FileSystemRights", "RegistryRights", "ActiveDirectoryRights", + "MutexRights", "SemaphoreRights", "CryptoKeyRights", + "EventWaitHandleRights")] + $Type + ) + + Begin + { + # On CoreCLR CryptoKeyRights and ActiveDirectoryRights are not supported. + if ($PSEdition -eq "Core" -and ($Type -eq "CryptoKeyRights" -or $Type -eq "ActiveDirectoryRights")) + { + $errorId = "TypeNotSupported" + $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidArgument + $errorMessage = [Microsoft.PowerShell.Commands.UtilityResources]::TypeNotSupported -f $Type + $exception = [System.ArgumentException]::New($errorMessage) + $errorRecord = [System.Management.Automation.ErrorRecord]::New($exception, $errorId, $errorCategory, $null) + $PSCmdlet.ThrowTerminatingError($errorRecord) + } + + ## Translates a SID into a NT Account + function ConvertTo-NtAccount + { + param($Sid) + + if($Sid) + { + $securityIdentifier = [System.Security.Principal.SecurityIdentifier] $Sid + + try + { + $ntAccount = $securityIdentifier.Translate([System.Security.Principal.NTAccount]).ToString() + } + catch{} + + $ntAccount + } + } + + ## Gets the access rights that apply to an access mask, preferring right types + ## of 'Type' if specified. + function Get-AccessRights + { + param($AccessMask, $Type) + + if ($PSEdition -eq "Core") + { + ## All the types of access rights understood by .NET Core + $rightTypes = [Ordered] @{ + "FileSystemRights" = [System.Security.AccessControl.FileSystemRights] + "RegistryRights" = [System.Security.AccessControl.RegistryRights] + "MutexRights" = [System.Security.AccessControl.MutexRights] + "SemaphoreRights" = [System.Security.AccessControl.SemaphoreRights] + "EventWaitHandleRights" = [System.Security.AccessControl.EventWaitHandleRights] + } + } + else + { + ## All the types of access rights understood by .NET + $rightTypes = [Ordered] @{ + "FileSystemRights" = [System.Security.AccessControl.FileSystemRights] + "RegistryRights" = [System.Security.AccessControl.RegistryRights] + "ActiveDirectoryRights" = [System.DirectoryServices.ActiveDirectoryRights] + "MutexRights" = [System.Security.AccessControl.MutexRights] + "SemaphoreRights" = [System.Security.AccessControl.SemaphoreRights] + "CryptoKeyRights" = [System.Security.AccessControl.CryptoKeyRights] + "EventWaitHandleRights" = [System.Security.AccessControl.EventWaitHandleRights] + } + } + $typesToExamine = $rightTypes.Values + + ## If they know the access mask represents a certain type, prefer its names + ## (i.e.: CreateLink for the registry over CreateDirectories for the filesystem) + if($Type) + { + $typesToExamine = @($rightTypes[$Type]) + $typesToExamine + } + + + ## Stores the access types we've found that apply + $foundAccess = @() + + ## Store the access types we've already seen, so that we don't report access + ## flags that are essentially duplicate. Many of the access values in the different + ## enumerations have the same value but with different names. + $foundValues = @{} + + ## Go through the entries in the different right types, and see if they apply to the + ## provided access mask. If they do, then add that to the result. + foreach($rightType in $typesToExamine) + { + foreach($accessFlag in [Enum]::GetNames($rightType)) + { + $longKeyValue = [long] $rightType::$accessFlag + if(-not $foundValues.ContainsKey($longKeyValue)) + { + $foundValues[$longKeyValue] = $true + if(($AccessMask -band $longKeyValue) -eq ($longKeyValue)) + { + $foundAccess += $accessFlag + } + } + } + } + + $foundAccess | Sort-Object + } + + ## Converts an ACE into a string representation + function ConvertTo-AceString + { + param( + [Parameter(ValueFromPipeline)] + $Ace, + $Type + ) + + process + { + foreach($aceEntry in $Ace) + { + $AceString = (ConvertTo-NtAccount $aceEntry.SecurityIdentifier) + ": " + $aceEntry.AceQualifier + if($aceEntry.AceFlags -ne "None") + { + $AceString += " " + $aceEntry.AceFlags + } + + if($aceEntry.AccessMask) + { + $foundAccess = Get-AccessRights $aceEntry.AccessMask $Type + + if($foundAccess) + { + $AceString += " ({0})" -f ($foundAccess -join ", ") + } + } + + $AceString + } + } + } + } + + Process + { + $rawSecurityDescriptor = [Security.AccessControl.CommonSecurityDescriptor]::new($false,$false,$Sddl) + + $owner = ConvertTo-NtAccount $rawSecurityDescriptor.Owner + $group = ConvertTo-NtAccount $rawSecurityDescriptor.Group + $discretionaryAcl = ConvertTo-AceString $rawSecurityDescriptor.DiscretionaryAcl $Type + $systemAcl = ConvertTo-AceString $rawSecurityDescriptor.SystemAcl $Type + + [PSCustomObject] @{ + Owner = $owner + Group = $group + DiscretionaryAcl = @($discretionaryAcl) + SystemAcl = @($systemAcl) + RawDescriptor = $rawSecurityDescriptor + } + } +} diff --git a/src/Modules/Unix/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 b/src/Modules/Unix/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 index 5bf08654f8e..94745666c28 100644 --- a/src/Modules/Unix/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 +++ b/src/Modules/Unix/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 @@ -1,54 +1,54 @@ -@{ -GUID="EEFCB906-B326-4E99-9F54-8B4BB6EF3C6D" -Author="Microsoft Corporation" -CompanyName="Microsoft Corporation" -Copyright=" Microsoft Corporation. All rights reserved." -ModuleVersion="3.1.0.0" -PowerShellVersion="3.0" -NestedModules="Microsoft.PowerShell.Commands.Management.dll" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390785' -AliasesToExport = @("gtz") -FunctionsToExport = @() -CmdletsToExport=@("Add-Content", - "Clear-Content", - "Clear-ItemProperty", - "Join-Path", - "Convert-Path", - "Copy-ItemProperty", - "Get-ChildItem", - "Get-Content", - "Get-ItemProperty", - "Get-ItemPropertyValue", - "Move-ItemProperty", - "Get-Location", - "Set-Location", - "Push-Location", - "Pop-Location", - "New-PSDrive", - "Remove-PSDrive", - "Get-PSDrive", - "Get-Item", - "New-Item", - "Set-Item", - "Remove-Item", - "Move-Item", - "Rename-Item", - "Copy-Item", - "Clear-Item", - "Invoke-Item", - "Get-PSProvider", - "New-ItemProperty", - "Split-Path", - "Test-Path", - "Get-Process", - "Stop-Process", - "Wait-Process", - "Debug-Process", - "Start-Process", - "Remove-ItemProperty", - "Rename-ItemProperty", - "Resolve-Path", - "Set-Content", - "Set-ItemProperty", - "Get-TimeZone") -} +@{ +GUID="EEFCB906-B326-4E99-9F54-8B4BB6EF3C6D" +Author="Microsoft Corporation" +CompanyName="Microsoft Corporation" +Copyright=" Microsoft Corporation. All rights reserved." +ModuleVersion="3.1.0.0" +PowerShellVersion="3.0" +NestedModules="Microsoft.PowerShell.Commands.Management.dll" +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390785' +AliasesToExport = @("gtz") +FunctionsToExport = @() +CmdletsToExport=@("Add-Content", + "Clear-Content", + "Clear-ItemProperty", + "Join-Path", + "Convert-Path", + "Copy-ItemProperty", + "Get-ChildItem", + "Get-Content", + "Get-ItemProperty", + "Get-ItemPropertyValue", + "Move-ItemProperty", + "Get-Location", + "Set-Location", + "Push-Location", + "Pop-Location", + "New-PSDrive", + "Remove-PSDrive", + "Get-PSDrive", + "Get-Item", + "New-Item", + "Set-Item", + "Remove-Item", + "Move-Item", + "Rename-Item", + "Copy-Item", + "Clear-Item", + "Invoke-Item", + "Get-PSProvider", + "New-ItemProperty", + "Split-Path", + "Test-Path", + "Get-Process", + "Stop-Process", + "Wait-Process", + "Debug-Process", + "Start-Process", + "Remove-ItemProperty", + "Rename-ItemProperty", + "Resolve-Path", + "Set-Content", + "Set-ItemProperty", + "Get-TimeZone") +} diff --git a/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 b/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 index 1add1c7038d..bf580cd43d2 100644 --- a/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 +++ b/src/Modules/Unix/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 @@ -1,30 +1,30 @@ -@{ -GUID="1DA87E53-152B-403E-98DC-74D7B4D63D59" -Author="Microsoft Corporation" -CompanyName="Microsoft Corporation" -Copyright="© Microsoft Corporation. All rights reserved." -ModuleVersion="3.1.0.0" -PowerShellVersion="3.0" -CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", - "Out-File", "Out-String", "Get-FormatData", "Export-FormatData", "ConvertFrom-Json", "ConvertTo-Json", - "Invoke-RestMethod", "Invoke-WebRequest", "Register-ObjectEvent", "Register-EngineEvent", - "Wait-Event", "Get-Event", "Remove-Event", "Get-EventSubscriber", "Unregister-Event", "New-Guid", - "New-Event", "Add-Member", "Add-Type", "Compare-Object", "ConvertTo-Html", "ConvertFrom-StringData", - "Export-Csv", "Import-Csv", "ConvertTo-Csv", "ConvertFrom-Csv", "Export-Alias", "Invoke-Expression", - "Get-Alias", "Get-Culture", "Get-Date", "Get-Host", "Get-Member", "Get-Random", "Get-UICulture", - "Get-Unique", "Export-PSSession", "Import-PSSession", "Import-Alias", "Import-LocalizedData", - "Select-String", "Measure-Object", "New-Alias", "New-TimeSpan", "Read-Host", "Set-Alias", "Set-Date", - "Start-Sleep", "Tee-Object", "Measure-Command", "Update-TypeData", "Update-FormatData", - "Remove-TypeData", "Get-TypeData", "Write-Host", "Write-Progress", "New-Object", "Select-Object", - "Group-Object", "Sort-Object", "Get-Variable", "New-Variable", "Set-Variable", "Remove-Variable", - "Clear-Variable", "Export-Clixml", "Import-Clixml", "Import-PowerShellDataFile", "ConvertTo-Xml", "Select-Xml", "Write-Debug", - "Write-Verbose", "Write-Warning", "Write-Error", "Write-Information", "Write-Output", "Set-PSBreakpoint", - "Get-PSBreakpoint", "Remove-PSBreakpoint", "Enable-PSBreakpoint", "Disable-PSBreakpoint", "Get-PSCallStack", - "Send-MailMessage", "Get-TraceSource", "Set-TraceSource", "Trace-Command", "Get-FileHash", - "Get-Runspace", "Debug-Runspace", "Enable-RunspaceDebug", "Disable-RunspaceDebug", - "Get-RunspaceDebug", "Wait-Debugger" , "Get-Uptime", "New-TemporaryFile", "Get-Verb", "Format-Hex" -FunctionsToExport= "Import-PowerShellDataFile" -AliasesToExport= "fhx" -NestedModules="Microsoft.PowerShell.Commands.Utility.dll","Microsoft.PowerShell.Utility.psm1" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390787' -} +@{ +GUID="1DA87E53-152B-403E-98DC-74D7B4D63D59" +Author="Microsoft Corporation" +CompanyName="Microsoft Corporation" +Copyright="© Microsoft Corporation. All rights reserved." +ModuleVersion="3.1.0.0" +PowerShellVersion="3.0" +CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", + "Out-File", "Out-String", "Get-FormatData", "Export-FormatData", "ConvertFrom-Json", "ConvertTo-Json", + "Invoke-RestMethod", "Invoke-WebRequest", "Register-ObjectEvent", "Register-EngineEvent", + "Wait-Event", "Get-Event", "Remove-Event", "Get-EventSubscriber", "Unregister-Event", "New-Guid", + "New-Event", "Add-Member", "Add-Type", "Compare-Object", "ConvertTo-Html", "ConvertFrom-StringData", + "Export-Csv", "Import-Csv", "ConvertTo-Csv", "ConvertFrom-Csv", "Export-Alias", "Invoke-Expression", + "Get-Alias", "Get-Culture", "Get-Date", "Get-Host", "Get-Member", "Get-Random", "Get-UICulture", + "Get-Unique", "Export-PSSession", "Import-PSSession", "Import-Alias", "Import-LocalizedData", + "Select-String", "Measure-Object", "New-Alias", "New-TimeSpan", "Read-Host", "Set-Alias", "Set-Date", + "Start-Sleep", "Tee-Object", "Measure-Command", "Update-TypeData", "Update-FormatData", + "Remove-TypeData", "Get-TypeData", "Write-Host", "Write-Progress", "New-Object", "Select-Object", + "Group-Object", "Sort-Object", "Get-Variable", "New-Variable", "Set-Variable", "Remove-Variable", + "Clear-Variable", "Export-Clixml", "Import-Clixml", "Import-PowerShellDataFile", "ConvertTo-Xml", "Select-Xml", "Write-Debug", + "Write-Verbose", "Write-Warning", "Write-Error", "Write-Information", "Write-Output", "Set-PSBreakpoint", + "Get-PSBreakpoint", "Remove-PSBreakpoint", "Enable-PSBreakpoint", "Disable-PSBreakpoint", "Get-PSCallStack", + "Send-MailMessage", "Get-TraceSource", "Set-TraceSource", "Trace-Command", "Get-FileHash", + "Get-Runspace", "Debug-Runspace", "Enable-RunspaceDebug", "Disable-RunspaceDebug", + "Get-RunspaceDebug", "Wait-Debugger" , "Get-Uptime", "New-TemporaryFile", "Get-Verb", "Format-Hex" +FunctionsToExport= "Import-PowerShellDataFile" +AliasesToExport= "fhx" +NestedModules="Microsoft.PowerShell.Commands.Utility.dll","Microsoft.PowerShell.Utility.psm1" +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390787' +} diff --git a/src/Modules/Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 b/src/Modules/Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 index 294de972f5c..43ba15623f3 100644 --- a/src/Modules/Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 +++ b/src/Modules/Windows-Core+Full/CimCmdlets/CimCmdlets.psd1 @@ -1,18 +1,18 @@ -@{ -GUID="{Fb6cc51d-c096-4b38-b78d-0fed6277096a}" -Author="Microsoft Corporation" -CompanyName="Microsoft Corporation" -Copyright="© Microsoft Corporation. All rights reserved." -ModuleVersion="1.0.0.0" -PowerShellVersion="3.0" -CLRVersion="4.0" -RootModule="Microsoft.Management.Infrastructure.CimCmdlets" -RequiredAssemblies="Microsoft.Management.Infrastructure.CimCmdlets.dll","Microsoft.Management.Infrastructure.Dll" -CmdletsToExport= "Get-CimAssociatedInstance", "Get-CimClass", "Get-CimInstance", "Get-CimSession", "Invoke-CimMethod", - "New-CimInstance","New-CimSession","New-CimSessionOption","Register-CimIndicationEvent","Remove-CimInstance", - "Remove-CimSession","Set-CimInstance", - "Export-BinaryMiLog","Import-BinaryMiLog" -AliasesToExport = "gcim","scim","ncim", "rcim","icim","gcai","rcie","ncms","rcms","gcms","ncso","gcls" -FunctionsToExport = @() -HelpInfoUri="https://go.microsoft.com/fwlink/?linkid=390758" -} +@{ +GUID="{Fb6cc51d-c096-4b38-b78d-0fed6277096a}" +Author="Microsoft Corporation" +CompanyName="Microsoft Corporation" +Copyright="© Microsoft Corporation. All rights reserved." +ModuleVersion="1.0.0.0" +PowerShellVersion="3.0" +CLRVersion="4.0" +RootModule="Microsoft.Management.Infrastructure.CimCmdlets" +RequiredAssemblies="Microsoft.Management.Infrastructure.CimCmdlets.dll","Microsoft.Management.Infrastructure.Dll" +CmdletsToExport= "Get-CimAssociatedInstance", "Get-CimClass", "Get-CimInstance", "Get-CimSession", "Invoke-CimMethod", + "New-CimInstance","New-CimSession","New-CimSessionOption","Register-CimIndicationEvent","Remove-CimInstance", + "Remove-CimSession","Set-CimInstance", + "Export-BinaryMiLog","Import-BinaryMiLog" +AliasesToExport = "gcim","scim","ncim", "rcim","icim","gcai","rcie","ncms","rcms","gcms","ncso","gcls" +FunctionsToExport = @() +HelpInfoUri="https://go.microsoft.com/fwlink/?linkid=390758" +} diff --git a/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/Microsoft.WSMan.Management.psd1 b/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/Microsoft.WSMan.Management.psd1 index 03cf980b35b..923ba2c173b 100644 --- a/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/Microsoft.WSMan.Management.psd1 +++ b/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/Microsoft.WSMan.Management.psd1 @@ -1,15 +1,15 @@ -@{ -GUID="766204A6-330E-4263-A7AB-46C87AFC366C" -Author="Microsoft Corporation" -CompanyName="Microsoft Corporation" -Copyright=" Microsoft Corporation. All rights reserved." -ModuleVersion="3.0.0.0" -PowerShellVersion="3.0" -CLRVersion="4.0" -AliasesToExport = @() -FunctionsToExport = @() -CmdletsToExport="Disable-WSManCredSSP", "Enable-WSManCredSSP", "Get-WSManCredSSP", "Set-WSManQuickConfig", "Test-WSMan", "Invoke-WSManAction", "Connect-WSMan", "Disconnect-WSMan", "Get-WSManInstance", "Set-WSManInstance", "Remove-WSManInstance", "New-WSManInstance", "New-WSManSessionOption" -NestedModules="Microsoft.WSMan.Management.dll" -FormatsToProcess="WSMan.format.ps1xml" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390788' -} +@{ +GUID="766204A6-330E-4263-A7AB-46C87AFC366C" +Author="Microsoft Corporation" +CompanyName="Microsoft Corporation" +Copyright=" Microsoft Corporation. All rights reserved." +ModuleVersion="3.0.0.0" +PowerShellVersion="3.0" +CLRVersion="4.0" +AliasesToExport = @() +FunctionsToExport = @() +CmdletsToExport="Disable-WSManCredSSP", "Enable-WSManCredSSP", "Get-WSManCredSSP", "Set-WSManQuickConfig", "Test-WSMan", "Invoke-WSManAction", "Connect-WSMan", "Disconnect-WSMan", "Get-WSManInstance", "Set-WSManInstance", "Remove-WSManInstance", "New-WSManInstance", "New-WSManSessionOption" +NestedModules="Microsoft.WSMan.Management.dll" +FormatsToProcess="WSMan.format.ps1xml" +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390788' +} diff --git a/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/WSMan.format.ps1xml b/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/WSMan.format.ps1xml index a7bdea98469..51187dbd846 100644 --- a/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/WSMan.format.ps1xml +++ b/src/Modules/Windows-Core+Full/Microsoft.WSMan.Management/WSMan.format.ps1xml @@ -1,236 +1,236 @@ - - - - - - - System.Xml.XmlElement#http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd#IdentifyResponse - - System.Xml.XmlElement#http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd#IdentifyResponse - - - - - - - wsmid - - - ProtocolVersion - - - ProductVendor - - - ProductVersion - - - - - - - - Microsoft.WSMan.Management.WSManConfigElement - - Microsoft.WSMan.Management.WSManConfigElement - - - PSParentPath - - - - - - - 15 - - - - 30 - - - - - - - TypeNameOfElement - - - Name - - - - - - - - Microsoft.WSMan.Management.WSManConfigContainerElement - - Microsoft.WSMan.Management.WSManConfigContainerElement - - - PSParentPath - - - - - - - 15 - - - - 35 - - - - - - - - - - TypeNameOfElement - - - Keys - - - Name - - - - - - - - Microsoft.WSMan.Management.WSManConfigLeafElement - - Microsoft.WSMan.Management.WSManConfigLeafElement - - - PSParentPath - - - - - - - 15 - - - - 30 - - - - 15 - - - - - - - - - - TypeNameOfElement - - - Name - - - SourceOfValue - - - Value - - - - - - - - Microsoft.WSMan.Management.WSManConfigLeafElement#InitParams - - Microsoft.WSMan.Management.WSManConfigLeafElement#InitParams - - - PSParentPath - - - - - - - 30 - - - - 20 - - - - - - - Name - - - Value - - - - - - - - Microsoft.WSMan.Management.WSManConfigContainerElement#ComputerLevel - - Microsoft.WSMan.Management.WSManConfigContainerElement#ComputerLevel - - - PSParentPath - - - - - - - 45 - - - - 20 - - - - - - - Name - - - TypeNameOfElement - - - - - - - - + + + + + + + System.Xml.XmlElement#http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd#IdentifyResponse + + System.Xml.XmlElement#http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd#IdentifyResponse + + + + + + + wsmid + + + ProtocolVersion + + + ProductVendor + + + ProductVersion + + + + + + + + Microsoft.WSMan.Management.WSManConfigElement + + Microsoft.WSMan.Management.WSManConfigElement + + + PSParentPath + + + + + + + 15 + + + + 30 + + + + + + + TypeNameOfElement + + + Name + + + + + + + + Microsoft.WSMan.Management.WSManConfigContainerElement + + Microsoft.WSMan.Management.WSManConfigContainerElement + + + PSParentPath + + + + + + + 15 + + + + 35 + + + + + + + + + + TypeNameOfElement + + + Keys + + + Name + + + + + + + + Microsoft.WSMan.Management.WSManConfigLeafElement + + Microsoft.WSMan.Management.WSManConfigLeafElement + + + PSParentPath + + + + + + + 15 + + + + 30 + + + + 15 + + + + + + + + + + TypeNameOfElement + + + Name + + + SourceOfValue + + + Value + + + + + + + + Microsoft.WSMan.Management.WSManConfigLeafElement#InitParams + + Microsoft.WSMan.Management.WSManConfigLeafElement#InitParams + + + PSParentPath + + + + + + + 30 + + + + 20 + + + + + + + Name + + + Value + + + + + + + + Microsoft.WSMan.Management.WSManConfigContainerElement#ComputerLevel + + Microsoft.WSMan.Management.WSManConfigContainerElement#ComputerLevel + + + PSParentPath + + + + + + + 45 + + + + 20 + + + + + + + Name + + + TypeNameOfElement + + + + + + + + diff --git a/src/Modules/Windows-Core+Full/PSDiagnostics/PSDiagnostics.psd1 b/src/Modules/Windows-Core+Full/PSDiagnostics/PSDiagnostics.psd1 index 4533f0991b2..a870c4d14cd 100644 --- a/src/Modules/Windows-Core+Full/PSDiagnostics/PSDiagnostics.psd1 +++ b/src/Modules/Windows-Core+Full/PSDiagnostics/PSDiagnostics.psd1 @@ -1,13 +1,13 @@ -@{ - GUID="c61d6278-02a3-4618-ae37-a524d40a7f44 " - Author="Microsoft Corporation" - CompanyName="Microsoft Corporation" - Copyright="© Microsoft Corporation. All rights reserved." - ModuleVersion="1.0.0.0" - PowerShellVersion="2.0" - CLRVersion="2.0.50727" - ModuleToProcess="PSDiagnostics.psm1" - AliasesToExport = @() - CmdletsToExport = @() - FunctionsToExport="Disable-PSTrace","Disable-PSWSManCombinedTrace","Disable-WSManTrace","Enable-PSTrace","Enable-PSWSManCombinedTrace","Enable-WSManTrace","Get-LogProperties","Set-LogProperties","Start-Trace","Stop-Trace" -} +@{ + GUID="c61d6278-02a3-4618-ae37-a524d40a7f44 " + Author="Microsoft Corporation" + CompanyName="Microsoft Corporation" + Copyright="© Microsoft Corporation. All rights reserved." + ModuleVersion="1.0.0.0" + PowerShellVersion="2.0" + CLRVersion="2.0.50727" + ModuleToProcess="PSDiagnostics.psm1" + AliasesToExport = @() + CmdletsToExport = @() + FunctionsToExport="Disable-PSTrace","Disable-PSWSManCombinedTrace","Disable-WSManTrace","Enable-PSTrace","Enable-PSWSManCombinedTrace","Enable-WSManTrace","Get-LogProperties","Set-LogProperties","Start-Trace","Stop-Trace" +} diff --git a/src/Modules/Windows-Core+Full/PSDiagnostics/PSDiagnostics.psm1 b/src/Modules/Windows-Core+Full/PSDiagnostics/PSDiagnostics.psm1 index f662c25179a..fd1775fb658 100644 --- a/src/Modules/Windows-Core+Full/PSDiagnostics/PSDiagnostics.psm1 +++ b/src/Modules/Windows-Core+Full/PSDiagnostics/PSDiagnostics.psm1 @@ -1,446 +1,446 @@ -<# - Windows PowerShell Diagnostics Module - This module contains a set of wrapper scripts that - enable a user to use ETW tracing in Windows - PowerShell. - #> - -$script:Logman="$env:windir\system32\logman.exe" -$script:wsmanlogfile = "$env:windir\system32\wsmtraces.log" -$script:wsmprovfile = "$env:windir\system32\wsmtraceproviders.txt" -$script:wsmsession = "wsmlog" -$script:pssession = "PSTrace" -$script:psprovidername="Microsoft-Windows-PowerShell" -$script:wsmprovidername = "Microsoft-Windows-WinRM" -$script:oplog = "/Operational" -$script:analyticlog="/Analytic" -$script:debuglog="/Debug" -$script:wevtutil="$env:windir\system32\wevtutil.exe" -$script:slparam = "sl" -$script:glparam = "gl" - -function Start-Trace -{ - Param( - [Parameter(Mandatory=$true, - Position=0)] - [string] - $SessionName, - [Parameter(Position=1)] - [ValidateNotNullOrEmpty()] - [string] - $OutputFilePath, - [Parameter(Position=2)] - [ValidateNotNullOrEmpty()] - [string] - $ProviderFilePath, - [Parameter()] - [Switch] - $ETS, - [Parameter()] - [ValidateSet("bin", "bincirc", "csv", "tsv", "sql")] - $Format, - [Parameter()] - [int] - $MinBuffers=0, - [Parameter()] - [int] - $MaxBuffers=256, - [Parameter()] - [int] - $BufferSizeInKB = 0, - [Parameter()] - [int] - $MaxLogFileSizeInMB=0 - ) - - Process - { - $executestring = " start $SessionName" - - if ($ETS) - { - $executestring += " -ets" - } - - if ($null -ne $OutputFilePath) - { - $executestring += " -o ""$OutputFilePath""" - } - - if ($null -ne $ProviderFilePath) - { - $executestring += " -pf ""$ProviderFilePath""" - } - - if ($null -ne $Format) - { - $executestring += " -f $Format" - } - - if ($MinBuffers -ne 0 -or $MaxBuffers -ne 256) - { - $executestring += " -nb $MinBuffers $MaxBuffers" - } - - if ($BufferSizeInKB -ne 0) - { - $executestring += " -bs $BufferSizeInKB" - } - - if ($MaxLogFileSizeInMB -ne 0) - { - $executestring += " -max $MaxLogFileSizeInMB" - } - - & $script:Logman $executestring.Split(" ") - } -} - -function Stop-Trace -{ - param( - [Parameter(Mandatory=$true, - Position=0)] - $SessionName, - [Parameter()] - [switch] - $ETS - ) - - Process - { - if ($ETS) - { - & $script:Logman update $SessionName -ets - & $script:Logman stop $SessionName -ets - } - else - { - & $script:Logman update $SessionName - & $script:Logman stop $SessionName - } - } -} - -function Enable-WSManTrace -{ - - # winrm - "{04c6e16d-b99f-4a3a-9b3e-b8325bbc781e} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii - - # winrsmgr - "{c0a36be8-a515-4cfa-b2b6-2676366efff7} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append - - # WinrsExe - "{f1cab2c0-8beb-4fa2-90e1-8f17e0acdd5d} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append - - # WinrsCmd - "{03992646-3dfe-4477-80e3-85936ace7abb} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append - - # IPMIPrv - "{651d672b-e11f-41b7-add3-c2f6a4023672} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append - - #IpmiDrv - "{D5C6A3E9-FA9C-434e-9653-165B4FC869E4} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append - - # WSManProvHost - "{6e1b64d7-d3be-4651-90fb-3583af89d7f1} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append - - # Event Forwarding - "{6FCDF39A-EF67-483D-A661-76D715C6B008} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append - - Start-Trace -SessionName $script:wsmsession -ETS -OutputFilePath $script:wsmanlogfile -Format bincirc -MinBuffers 16 -MaxBuffers 256 -BufferSizeInKb 64 -MaxLogFileSizeInMB 256 -ProviderFilePath $script:wsmprovfile -} - -function Disable-WSManTrace -{ - Stop-Trace $script:wsmsession -ets -} - -function Enable-PSWSManCombinedTrace -{ - param ( - [switch] $DoNotOverwriteExistingTrace - ) - - $provfile = [io.path]::GetTempFilename() - - $traceFileName = [string][Guid]::NewGuid() - if ($DoNotOverwriteExistingTrace) { - $fileName = [string][guid]::newguid() - $logfile = $pshome + "\\Traces\\PSTrace_$fileName.etl" - } else { - $logfile = $pshome + "\\Traces\\PSTrace.etl" - } - - "Microsoft-Windows-PowerShell 0 5" | out-file $provfile -encoding ascii - "Microsoft-Windows-WinRM 0 5" | out-file $provfile -encoding ascii -append - - if (!(Test-Path $pshome\Traces)) - { - mkdir -Force $pshome\Traces | out-null - } - - if (Test-Path $logfile) - { - Remove-Item -Force $logfile | out-null - } - - Start-Trace -SessionName $script:pssession -OutputFilePath $logfile -ProviderFilePath $provfile -ets - - remove-item $provfile -Force -ea 0 -} - -function Disable-PSWSManCombinedTrace -{ - Stop-Trace -SessionName $script:pssession -ets -} - -function Set-LogProperties -{ - param( - [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)] - [Microsoft.PowerShell.Diagnostics.LogDetails] - $LogDetails, - [switch] $Force - ) - - Process - { - if ($LogDetails.AutoBackup -and !$LogDetails.Retention) - { - throw (New-Object System.InvalidOperationException) - } - - $enabled = $LogDetails.Enabled.ToString() - $retention = $LogDetails.Retention.ToString() - $autobackup = $LogDetails.AutoBackup.ToString() - $maxLogSize = $LogDetails.MaxLogSize.ToString() - $osVersion = [Version] (Get-Ciminstance Win32_OperatingSystem).Version - - if (($LogDetails.Type -eq "Analytic") -or ($LogDetails.Type -eq "Debug")) - { - if ($LogDetails.Enabled) - { - if($osVersion -lt 6.3.7600) - { - & $script:wevtutil $script:slparam $LogDetails.Name -e:$Enabled - } - else - { - & $script:wevtutil /q:$Force $script:slparam $LogDetails.Name -e:$Enabled - } - } - else - { - if($osVersion -lt 6.3.7600) - { - & $script:wevtutil $script:slparam $LogDetails.Name -e:$Enabled -rt:$Retention -ms:$MaxLogSize - } - else - { - & $script:wevtutil /q:$Force $script:slparam $LogDetails.Name -e:$Enabled -rt:$Retention -ms:$MaxLogSize - } - } - } - else - { - if($osVersion -lt 6.3.7600) - { - & $script:wevtutil $script:slparam $LogDetails.Name -e:$Enabled -rt:$Retention -ab:$AutoBackup -ms:$MaxLogSize - } - else - { - & $script:wevtutil /q:$Force $script:slparam $LogDetails.Name -e:$Enabled -rt:$Retention -ab:$AutoBackup -ms:$MaxLogSize - } - } - } -} - -function ConvertTo-Bool([string]$value) -{ - if ($value -ieq "true") - { - return $true - } - else - { - return $false - } -} - -function Get-LogProperties -{ - param( - [Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)] $Name - ) - - Process - { - $details = & $script:wevtutil $script:glparam $Name - $indexes = @(1,2,8,9,10) - $value = @() - foreach($index in $indexes) - { - $value += @(($details[$index].SubString($details[$index].IndexOf(":")+1)).Trim()) - } - - $enabled = ConvertTo-Bool $value[0] - $retention = ConvertTo-Bool $value[2] - $autobackup = ConvertTo-Bool $value[3] - - New-Object Microsoft.PowerShell.Diagnostics.LogDetails $Name, $enabled, $value[1], $retention, $autobackup, $value[4] - } -} - -function Enable-PSTrace -{ - param( - [switch] $Force, - [switch] $AnalyticOnly - ) - - $Properties = Get-LogProperties ($script:psprovidername + $script:analyticlog) - - if (!$Properties.Enabled) { - $Properties.Enabled = $true - if ($Force) { - Set-LogProperties $Properties -Force - } else { - Set-LogProperties $Properties - } - } - - if (!$AnalyticOnly) { - $Properties = Get-LogProperties ($script:psprovidername + $script:debuglog) - if (!$Properties.Enabled) { - $Properties.Enabled = $true - if ($Force) { - Set-LogProperties $Properties -Force - } else { - Set-LogProperties $Properties - } - } - } -} - -function Disable-PSTrace -{ - param( - [switch] $AnalyticOnly - ) - $Properties = Get-LogProperties ($script:psprovidername + $script:analyticlog) - if ($Properties.Enabled) { - $Properties.Enabled = $false - Set-LogProperties $Properties - } - - if (!$AnalyticOnly) { - $Properties = Get-LogProperties ($script:psprovidername + $script:debuglog) - if ($Properties.Enabled) { - $Properties.Enabled = $false - Set-LogProperties $Properties - } - } -} -add-type @" -using System; - -namespace Microsoft.PowerShell.Diagnostics -{ - public class LogDetails - { - public string Name - { - get - { - return name; - } - } - private string name; - - public bool Enabled - { - get - { - return enabled; - } - set - { - enabled = value; - } - } - private bool enabled; - - public string Type - { - get - { - return type; - } - } - private string type; - - public bool Retention - { - get - { - return retention; - } - set - { - retention = value; - } - } - private bool retention; - - public bool AutoBackup - { - get - { - return autoBackup; - } - set - { - autoBackup = value; - } - } - private bool autoBackup; - - public int MaxLogSize - { - get - { - return maxLogSize; - } - set - { - maxLogSize = value; - } - } - private int maxLogSize; - - public LogDetails(string name, bool enabled, string type, bool retention, bool autoBackup, int maxLogSize) - { - this.name = name; - this.enabled = enabled; - this.type = type; - this.retention = retention; - this.autoBackup = autoBackup; - this.maxLogSize = maxLogSize; - } - } -} -"@ - - -if ($psedition -eq 'Core') - { - # Currently we only support these cmdlets as logman.exe is not working on Nano/Lot system. - Export-ModuleMember Enable-PSTrace, Disable-PSTrace, Get-LogProperties, Set-LogProperties - } - else - { - Export-ModuleMember Start-Trace, Stop-Trace, Enable-WSManTrace, Disable-WSManTrace, Enable-PSTrace, Disable-PSTrace, Enable-PSWSManCombinedTrace, Disable-PSWSManCombinedTrace, Get-LogProperties, Set-LogProperties - } +<# + Windows PowerShell Diagnostics Module + This module contains a set of wrapper scripts that + enable a user to use ETW tracing in Windows + PowerShell. + #> + +$script:Logman="$env:windir\system32\logman.exe" +$script:wsmanlogfile = "$env:windir\system32\wsmtraces.log" +$script:wsmprovfile = "$env:windir\system32\wsmtraceproviders.txt" +$script:wsmsession = "wsmlog" +$script:pssession = "PSTrace" +$script:psprovidername="Microsoft-Windows-PowerShell" +$script:wsmprovidername = "Microsoft-Windows-WinRM" +$script:oplog = "/Operational" +$script:analyticlog="/Analytic" +$script:debuglog="/Debug" +$script:wevtutil="$env:windir\system32\wevtutil.exe" +$script:slparam = "sl" +$script:glparam = "gl" + +function Start-Trace +{ + Param( + [Parameter(Mandatory=$true, + Position=0)] + [string] + $SessionName, + [Parameter(Position=1)] + [ValidateNotNullOrEmpty()] + [string] + $OutputFilePath, + [Parameter(Position=2)] + [ValidateNotNullOrEmpty()] + [string] + $ProviderFilePath, + [Parameter()] + [Switch] + $ETS, + [Parameter()] + [ValidateSet("bin", "bincirc", "csv", "tsv", "sql")] + $Format, + [Parameter()] + [int] + $MinBuffers=0, + [Parameter()] + [int] + $MaxBuffers=256, + [Parameter()] + [int] + $BufferSizeInKB = 0, + [Parameter()] + [int] + $MaxLogFileSizeInMB=0 + ) + + Process + { + $executestring = " start $SessionName" + + if ($ETS) + { + $executestring += " -ets" + } + + if ($null -ne $OutputFilePath) + { + $executestring += " -o ""$OutputFilePath""" + } + + if ($null -ne $ProviderFilePath) + { + $executestring += " -pf ""$ProviderFilePath""" + } + + if ($null -ne $Format) + { + $executestring += " -f $Format" + } + + if ($MinBuffers -ne 0 -or $MaxBuffers -ne 256) + { + $executestring += " -nb $MinBuffers $MaxBuffers" + } + + if ($BufferSizeInKB -ne 0) + { + $executestring += " -bs $BufferSizeInKB" + } + + if ($MaxLogFileSizeInMB -ne 0) + { + $executestring += " -max $MaxLogFileSizeInMB" + } + + & $script:Logman $executestring.Split(" ") + } +} + +function Stop-Trace +{ + param( + [Parameter(Mandatory=$true, + Position=0)] + $SessionName, + [Parameter()] + [switch] + $ETS + ) + + Process + { + if ($ETS) + { + & $script:Logman update $SessionName -ets + & $script:Logman stop $SessionName -ets + } + else + { + & $script:Logman update $SessionName + & $script:Logman stop $SessionName + } + } +} + +function Enable-WSManTrace +{ + + # winrm + "{04c6e16d-b99f-4a3a-9b3e-b8325bbc781e} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii + + # winrsmgr + "{c0a36be8-a515-4cfa-b2b6-2676366efff7} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append + + # WinrsExe + "{f1cab2c0-8beb-4fa2-90e1-8f17e0acdd5d} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append + + # WinrsCmd + "{03992646-3dfe-4477-80e3-85936ace7abb} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append + + # IPMIPrv + "{651d672b-e11f-41b7-add3-c2f6a4023672} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append + + #IpmiDrv + "{D5C6A3E9-FA9C-434e-9653-165B4FC869E4} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append + + # WSManProvHost + "{6e1b64d7-d3be-4651-90fb-3583af89d7f1} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append + + # Event Forwarding + "{6FCDF39A-EF67-483D-A661-76D715C6B008} 0xffffffff 0xff" | out-file $script:wsmprovfile -encoding ascii -append + + Start-Trace -SessionName $script:wsmsession -ETS -OutputFilePath $script:wsmanlogfile -Format bincirc -MinBuffers 16 -MaxBuffers 256 -BufferSizeInKb 64 -MaxLogFileSizeInMB 256 -ProviderFilePath $script:wsmprovfile +} + +function Disable-WSManTrace +{ + Stop-Trace $script:wsmsession -ets +} + +function Enable-PSWSManCombinedTrace +{ + param ( + [switch] $DoNotOverwriteExistingTrace + ) + + $provfile = [io.path]::GetTempFilename() + + $traceFileName = [string][Guid]::NewGuid() + if ($DoNotOverwriteExistingTrace) { + $fileName = [string][guid]::newguid() + $logfile = $pshome + "\\Traces\\PSTrace_$fileName.etl" + } else { + $logfile = $pshome + "\\Traces\\PSTrace.etl" + } + + "Microsoft-Windows-PowerShell 0 5" | out-file $provfile -encoding ascii + "Microsoft-Windows-WinRM 0 5" | out-file $provfile -encoding ascii -append + + if (!(Test-Path $pshome\Traces)) + { + mkdir -Force $pshome\Traces | out-null + } + + if (Test-Path $logfile) + { + Remove-Item -Force $logfile | out-null + } + + Start-Trace -SessionName $script:pssession -OutputFilePath $logfile -ProviderFilePath $provfile -ets + + remove-item $provfile -Force -ea 0 +} + +function Disable-PSWSManCombinedTrace +{ + Stop-Trace -SessionName $script:pssession -ets +} + +function Set-LogProperties +{ + param( + [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)] + [Microsoft.PowerShell.Diagnostics.LogDetails] + $LogDetails, + [switch] $Force + ) + + Process + { + if ($LogDetails.AutoBackup -and !$LogDetails.Retention) + { + throw (New-Object System.InvalidOperationException) + } + + $enabled = $LogDetails.Enabled.ToString() + $retention = $LogDetails.Retention.ToString() + $autobackup = $LogDetails.AutoBackup.ToString() + $maxLogSize = $LogDetails.MaxLogSize.ToString() + $osVersion = [Version] (Get-Ciminstance Win32_OperatingSystem).Version + + if (($LogDetails.Type -eq "Analytic") -or ($LogDetails.Type -eq "Debug")) + { + if ($LogDetails.Enabled) + { + if($osVersion -lt 6.3.7600) + { + & $script:wevtutil $script:slparam $LogDetails.Name -e:$Enabled + } + else + { + & $script:wevtutil /q:$Force $script:slparam $LogDetails.Name -e:$Enabled + } + } + else + { + if($osVersion -lt 6.3.7600) + { + & $script:wevtutil $script:slparam $LogDetails.Name -e:$Enabled -rt:$Retention -ms:$MaxLogSize + } + else + { + & $script:wevtutil /q:$Force $script:slparam $LogDetails.Name -e:$Enabled -rt:$Retention -ms:$MaxLogSize + } + } + } + else + { + if($osVersion -lt 6.3.7600) + { + & $script:wevtutil $script:slparam $LogDetails.Name -e:$Enabled -rt:$Retention -ab:$AutoBackup -ms:$MaxLogSize + } + else + { + & $script:wevtutil /q:$Force $script:slparam $LogDetails.Name -e:$Enabled -rt:$Retention -ab:$AutoBackup -ms:$MaxLogSize + } + } + } +} + +function ConvertTo-Bool([string]$value) +{ + if ($value -ieq "true") + { + return $true + } + else + { + return $false + } +} + +function Get-LogProperties +{ + param( + [Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)] $Name + ) + + Process + { + $details = & $script:wevtutil $script:glparam $Name + $indexes = @(1,2,8,9,10) + $value = @() + foreach($index in $indexes) + { + $value += @(($details[$index].SubString($details[$index].IndexOf(":")+1)).Trim()) + } + + $enabled = ConvertTo-Bool $value[0] + $retention = ConvertTo-Bool $value[2] + $autobackup = ConvertTo-Bool $value[3] + + New-Object Microsoft.PowerShell.Diagnostics.LogDetails $Name, $enabled, $value[1], $retention, $autobackup, $value[4] + } +} + +function Enable-PSTrace +{ + param( + [switch] $Force, + [switch] $AnalyticOnly + ) + + $Properties = Get-LogProperties ($script:psprovidername + $script:analyticlog) + + if (!$Properties.Enabled) { + $Properties.Enabled = $true + if ($Force) { + Set-LogProperties $Properties -Force + } else { + Set-LogProperties $Properties + } + } + + if (!$AnalyticOnly) { + $Properties = Get-LogProperties ($script:psprovidername + $script:debuglog) + if (!$Properties.Enabled) { + $Properties.Enabled = $true + if ($Force) { + Set-LogProperties $Properties -Force + } else { + Set-LogProperties $Properties + } + } + } +} + +function Disable-PSTrace +{ + param( + [switch] $AnalyticOnly + ) + $Properties = Get-LogProperties ($script:psprovidername + $script:analyticlog) + if ($Properties.Enabled) { + $Properties.Enabled = $false + Set-LogProperties $Properties + } + + if (!$AnalyticOnly) { + $Properties = Get-LogProperties ($script:psprovidername + $script:debuglog) + if ($Properties.Enabled) { + $Properties.Enabled = $false + Set-LogProperties $Properties + } + } +} +add-type @" +using System; + +namespace Microsoft.PowerShell.Diagnostics +{ + public class LogDetails + { + public string Name + { + get + { + return name; + } + } + private string name; + + public bool Enabled + { + get + { + return enabled; + } + set + { + enabled = value; + } + } + private bool enabled; + + public string Type + { + get + { + return type; + } + } + private string type; + + public bool Retention + { + get + { + return retention; + } + set + { + retention = value; + } + } + private bool retention; + + public bool AutoBackup + { + get + { + return autoBackup; + } + set + { + autoBackup = value; + } + } + private bool autoBackup; + + public int MaxLogSize + { + get + { + return maxLogSize; + } + set + { + maxLogSize = value; + } + } + private int maxLogSize; + + public LogDetails(string name, bool enabled, string type, bool retention, bool autoBackup, int maxLogSize) + { + this.name = name; + this.enabled = enabled; + this.type = type; + this.retention = retention; + this.autoBackup = autoBackup; + this.maxLogSize = maxLogSize; + } + } +} +"@ + + +if ($psedition -eq 'Core') + { + # Currently we only support these cmdlets as logman.exe is not working on Nano/Lot system. + Export-ModuleMember Enable-PSTrace, Disable-PSTrace, Get-LogProperties, Set-LogProperties + } + else + { + Export-ModuleMember Start-Trace, Stop-Trace, Enable-WSManTrace, Disable-WSManTrace, Enable-PSTrace, Disable-PSTrace, Enable-PSWSManCombinedTrace, Disable-PSWSManCombinedTrace, Get-LogProperties, Set-LogProperties + } diff --git a/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 b/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 index daaea553726..8dc0d9cada6 100644 --- a/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 +++ b/src/Modules/Windows-Core/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 @@ -1,13 +1,13 @@ -@{ -GUID="CA046F10-CA64-4740-8FF9-2565DBA61A4F" -Author="Microsoft Corporation" -CompanyName="Microsoft Corporation" -Copyright="© Microsoft Corporation. All rights reserved." -ModuleVersion="3.0.0.0" -PowerShellVersion="3.0" -CmdletsToExport="Get-WinEvent", "New-WinEvent" # Counter CmdLets Disabled #4272: "Get-Counter", "Import-Counter", "Export-Counter" -NestedModules="Microsoft.PowerShell.Commands.Diagnostics.dll" -TypesToProcess="GetEvent.types.ps1xml" -FormatsToProcess="Event.format.ps1xml", "Diagnostics.format.ps1xml" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390783' -} +@{ +GUID="CA046F10-CA64-4740-8FF9-2565DBA61A4F" +Author="Microsoft Corporation" +CompanyName="Microsoft Corporation" +Copyright="© Microsoft Corporation. All rights reserved." +ModuleVersion="3.0.0.0" +PowerShellVersion="3.0" +CmdletsToExport="Get-WinEvent", "New-WinEvent" # Counter CmdLets Disabled #4272: "Get-Counter", "Import-Counter", "Export-Counter" +NestedModules="Microsoft.PowerShell.Commands.Diagnostics.dll" +TypesToProcess="GetEvent.types.ps1xml" +FormatsToProcess="Event.format.ps1xml", "Diagnostics.format.ps1xml" +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390783' +} diff --git a/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 b/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 index 9a8bdff1565..076e3db69a5 100644 --- a/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 +++ b/src/Modules/Windows-Core/Microsoft.PowerShell.Management/Microsoft.PowerShell.Management.psd1 @@ -1,68 +1,68 @@ -@{ -GUID="EEFCB906-B326-4E99-9F54-8B4BB6EF3C6D" -Author="Microsoft Corporation" -CompanyName="Microsoft Corporation" -Copyright=" Microsoft Corporation. All rights reserved." -ModuleVersion="3.1.0.0" -PowerShellVersion="3.0" -NestedModules="Microsoft.PowerShell.Commands.Management.dll" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390785' -AliasesToExport = @("gin", "gtz", "stz") -FunctionsToExport = @() -CmdletsToExport=@("Add-Content", - "Clear-Content", - "Clear-ItemProperty", - "Join-Path", - "Convert-Path", - "Copy-ItemProperty", - "Get-ChildItem", - "Get-Content", - "Get-ItemProperty", - "Get-ItemPropertyValue", - "Move-ItemProperty", - "Get-Location", - "Set-Location", - "Push-Location", - "Pop-Location", - "New-PSDrive", - "Remove-PSDrive", - "Get-PSDrive", - "Get-Item", - "New-Item", - "Set-Item", - "Remove-Item", - "Move-Item", - "Rename-Item", - "Copy-Item", - "Clear-Item", - "Invoke-Item", - "Get-PSProvider", - "New-ItemProperty", - "Split-Path", - "Test-Path", - "Get-Process", - "Stop-Process", - "Wait-Process", - "Debug-Process", - "Start-Process", - "Remove-ItemProperty", - "Rename-ItemProperty", - "Resolve-Path", - "Get-Service", - "Stop-Service", - "Start-Service", - "Suspend-Service", - "Resume-Service", - "Restart-Service", - "Set-Service", - "New-Service", - "Set-Content", - "Set-ItemProperty", - "Test-Connection", - "Restart-Computer", - "Stop-Computer", - "Rename-Computer", - "Get-ComputerInfo", - "Get-TimeZone", - "Set-TimeZone") -} +@{ +GUID="EEFCB906-B326-4E99-9F54-8B4BB6EF3C6D" +Author="Microsoft Corporation" +CompanyName="Microsoft Corporation" +Copyright=" Microsoft Corporation. All rights reserved." +ModuleVersion="3.1.0.0" +PowerShellVersion="3.0" +NestedModules="Microsoft.PowerShell.Commands.Management.dll" +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390785' +AliasesToExport = @("gin", "gtz", "stz") +FunctionsToExport = @() +CmdletsToExport=@("Add-Content", + "Clear-Content", + "Clear-ItemProperty", + "Join-Path", + "Convert-Path", + "Copy-ItemProperty", + "Get-ChildItem", + "Get-Content", + "Get-ItemProperty", + "Get-ItemPropertyValue", + "Move-ItemProperty", + "Get-Location", + "Set-Location", + "Push-Location", + "Pop-Location", + "New-PSDrive", + "Remove-PSDrive", + "Get-PSDrive", + "Get-Item", + "New-Item", + "Set-Item", + "Remove-Item", + "Move-Item", + "Rename-Item", + "Copy-Item", + "Clear-Item", + "Invoke-Item", + "Get-PSProvider", + "New-ItemProperty", + "Split-Path", + "Test-Path", + "Get-Process", + "Stop-Process", + "Wait-Process", + "Debug-Process", + "Start-Process", + "Remove-ItemProperty", + "Rename-ItemProperty", + "Resolve-Path", + "Get-Service", + "Stop-Service", + "Start-Service", + "Suspend-Service", + "Resume-Service", + "Restart-Service", + "Set-Service", + "New-Service", + "Set-Content", + "Set-ItemProperty", + "Test-Connection", + "Restart-Computer", + "Stop-Computer", + "Rename-Computer", + "Get-ComputerInfo", + "Get-TimeZone", + "Set-TimeZone") +} diff --git a/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 b/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 index 1fc9d4e1ad3..3f7715da012 100644 --- a/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 +++ b/src/Modules/Windows-Core/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 @@ -1,30 +1,30 @@ -@{ -GUID="1DA87E53-152B-403E-98DC-74D7B4D63D59" -Author="Microsoft Corporation" -CompanyName="Microsoft Corporation" -Copyright="© Microsoft Corporation. All rights reserved." -ModuleVersion="3.1.0.0" -PowerShellVersion="3.0" -CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", - "Out-File", "Out-String", "Get-FormatData", "Export-FormatData", "ConvertFrom-Json", "ConvertTo-Json", - "Invoke-RestMethod", "Invoke-WebRequest", "Register-ObjectEvent", "Register-EngineEvent", - "Wait-Event", "Get-Event", "Remove-Event", "Get-EventSubscriber", "Unregister-Event", "New-Guid", - "New-Event", "Add-Member", "Add-Type", "Compare-Object", "ConvertTo-Html", "ConvertFrom-StringData", - "Export-Csv", "Import-Csv", "ConvertTo-Csv", "ConvertFrom-Csv", "Export-Alias", "Invoke-Expression", - "Get-Alias", "Get-Culture", "Get-Date", "Get-Host", "Get-Member", "Get-Random", "Get-UICulture", - "Get-Unique", "Export-PSSession", "Import-PSSession", "Import-Alias", "Import-LocalizedData", - "Select-String", "Measure-Object", "New-Alias", "New-TimeSpan", "Read-Host", "Set-Alias", "Set-Date", - "Start-Sleep", "Tee-Object", "Measure-Command", "Update-TypeData", "Update-FormatData", - "Remove-TypeData", "Get-TypeData", "Write-Host", "Write-Progress", "New-Object", "Select-Object", - "Group-Object", "Sort-Object", "Get-Variable", "New-Variable", "Set-Variable", "Remove-Variable", - "Clear-Variable", "Export-Clixml", "Import-Clixml", "Import-PowerShellDataFile","ConvertTo-Xml", "Select-Xml", "Write-Debug", - "Write-Verbose", "Write-Warning", "Write-Error", "Write-Information", "Write-Output", "Set-PSBreakpoint", - "Get-PSBreakpoint", "Remove-PSBreakpoint", "New-TemporaryFile", "Enable-PSBreakpoint", "Disable-PSBreakpoint", "Get-PSCallStack", - "Send-MailMessage", "Get-TraceSource", "Set-TraceSource", "Trace-Command", "Get-FileHash", - "Unblock-File", "Get-Runspace", "Debug-Runspace", "Enable-RunspaceDebug", "Disable-RunspaceDebug", - "Get-RunspaceDebug", "Wait-Debugger" , "Get-Uptime", "Get-Verb", "Format-Hex" -FunctionsToExport= "ConvertFrom-SddlString" -AliasesToExport= "fhx" -NestedModules="Microsoft.PowerShell.Commands.Utility.dll","Microsoft.PowerShell.Utility.psm1" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390787' -} +@{ +GUID="1DA87E53-152B-403E-98DC-74D7B4D63D59" +Author="Microsoft Corporation" +CompanyName="Microsoft Corporation" +Copyright="© Microsoft Corporation. All rights reserved." +ModuleVersion="3.1.0.0" +PowerShellVersion="3.0" +CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", + "Out-File", "Out-String", "Get-FormatData", "Export-FormatData", "ConvertFrom-Json", "ConvertTo-Json", + "Invoke-RestMethod", "Invoke-WebRequest", "Register-ObjectEvent", "Register-EngineEvent", + "Wait-Event", "Get-Event", "Remove-Event", "Get-EventSubscriber", "Unregister-Event", "New-Guid", + "New-Event", "Add-Member", "Add-Type", "Compare-Object", "ConvertTo-Html", "ConvertFrom-StringData", + "Export-Csv", "Import-Csv", "ConvertTo-Csv", "ConvertFrom-Csv", "Export-Alias", "Invoke-Expression", + "Get-Alias", "Get-Culture", "Get-Date", "Get-Host", "Get-Member", "Get-Random", "Get-UICulture", + "Get-Unique", "Export-PSSession", "Import-PSSession", "Import-Alias", "Import-LocalizedData", + "Select-String", "Measure-Object", "New-Alias", "New-TimeSpan", "Read-Host", "Set-Alias", "Set-Date", + "Start-Sleep", "Tee-Object", "Measure-Command", "Update-TypeData", "Update-FormatData", + "Remove-TypeData", "Get-TypeData", "Write-Host", "Write-Progress", "New-Object", "Select-Object", + "Group-Object", "Sort-Object", "Get-Variable", "New-Variable", "Set-Variable", "Remove-Variable", + "Clear-Variable", "Export-Clixml", "Import-Clixml", "Import-PowerShellDataFile","ConvertTo-Xml", "Select-Xml", "Write-Debug", + "Write-Verbose", "Write-Warning", "Write-Error", "Write-Information", "Write-Output", "Set-PSBreakpoint", + "Get-PSBreakpoint", "Remove-PSBreakpoint", "New-TemporaryFile", "Enable-PSBreakpoint", "Disable-PSBreakpoint", "Get-PSCallStack", + "Send-MailMessage", "Get-TraceSource", "Set-TraceSource", "Trace-Command", "Get-FileHash", + "Unblock-File", "Get-Runspace", "Debug-Runspace", "Enable-RunspaceDebug", "Disable-RunspaceDebug", + "Get-RunspaceDebug", "Wait-Debugger" , "Get-Uptime", "Get-Verb", "Format-Hex" +FunctionsToExport= "ConvertFrom-SddlString" +AliasesToExport= "fhx" +NestedModules="Microsoft.PowerShell.Commands.Utility.dll","Microsoft.PowerShell.Utility.psm1" +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390787' +} diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Diagnostics.format.ps1xml b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Diagnostics.format.ps1xml index a290c620ce5..aeab08d3a46 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Diagnostics.format.ps1xml +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Diagnostics.format.ps1xml @@ -1,79 +1,79 @@ - - - - - - - - Counter - - Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet - - - - - - 25 - left - - - - left - 100 - - - - - - - - Timestamp - - - Readings - - - - - - - - Counter - - Microsoft.PowerShell.Commands.GetCounter.CounterFileInfo - - - - - 30 - left - - - 30 - left - - - 30 - left - - - - - - - - OldestRecord - - - NewestRecord - - - SampleCount - - - - - - - - + + + + + + + + Counter + + Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet + + + + + + 25 + left + + + + left + 100 + + + + + + + + Timestamp + + + Readings + + + + + + + + Counter + + Microsoft.PowerShell.Commands.GetCounter.CounterFileInfo + + + + + 30 + left + + + 30 + left + + + 30 + left + + + + + + + + OldestRecord + + + NewestRecord + + + SampleCount + + + + + + + + diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Event.format.ps1xml b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Event.format.ps1xml index 476af9f5e2d..d4e78a3d313 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Event.format.ps1xml +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Event.format.ps1xml @@ -1,121 +1,121 @@ - - - - - Default - - System.Diagnostics.Eventing.Reader.EventLogRecord - - - ProviderName - - - - - - 25 - - - 8 - right - - - 16 - - - - - - - - - TimeCreated - - - Id - - - LevelDisplayName - - - Message - - - - - - - - - Default - - System.Diagnostics.Eventing.Reader.EventLogConfiguration - - - - - - - 9 - - - - 18 - right - - - - 11 - right - - - - - - - - LogMode - - - MaximumSizeInBytes - - - RecordCount - - - LogName - - - - - - - - Default - - System.Diagnostics.Eventing.Reader.ProviderMetadata - - - - - - - Name - - - LogLinks - - - Opcodes - - - Tasks - - - - - - - - - + + + + + Default + + System.Diagnostics.Eventing.Reader.EventLogRecord + + + ProviderName + + + + + + 25 + + + 8 + right + + + 16 + + + + + + + + + TimeCreated + + + Id + + + LevelDisplayName + + + Message + + + + + + + + + Default + + System.Diagnostics.Eventing.Reader.EventLogConfiguration + + + + + + + 9 + + + + 18 + right + + + + 11 + right + + + + + + + + LogMode + + + MaximumSizeInBytes + + + RecordCount + + + LogName + + + + + + + + Default + + System.Diagnostics.Eventing.Reader.ProviderMetadata + + + + + + + Name + + + LogLinks + + + Opcodes + + + Tasks + + + + + + + + + diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/GetEvent.types.ps1xml b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/GetEvent.types.ps1xml index 6a9bc8edafe..29a42edfab1 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/GetEvent.types.ps1xml +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/GetEvent.types.ps1xml @@ -1,139 +1,139 @@ - - - - - - System.Diagnostics.Eventing.Reader.EventLogConfiguration - - - PSStandardMembers - - - DefaultDisplayPropertySet - - LogName - MaximumSizeInBytes - RecordCount - LogMode - - - - - - - - System.Diagnostics.Eventing.Reader.EventLogRecord - - - PSStandardMembers - - - DefaultDisplayPropertySet - - TimeCreated - ProviderName - Id - Message - - - - - - - - System.Diagnostics.Eventing.Reader.ProviderMetadata - - - ProviderName - Name - - - PSStandardMembers - - - DefaultDisplayPropertySet - - Name - LogLinks - - - - - - - - Microsoft.PowerShell.Commands.GetCounter.CounterSet - - - Counter - Paths - - - - - Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample - - - PSStandardMembers - - - DefaultDisplayPropertySet - - Path - InstanceName - CookedValue - - - - - - - - Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet - - - PSStandardMembers - - - DefaultDisplayPropertySet - - Timestamp - Readings - - - - - - - - Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet - - - Readings - - $strPaths = "" - foreach ($ctr in $this.CounterSamples) - { - $strPaths += ($ctr.Path + " :" + "`n") - $strPaths += ($ctr.CookedValue.ToString() + "`n`n") - } - return $strPaths - - - - - + + + + + + System.Diagnostics.Eventing.Reader.EventLogConfiguration + + + PSStandardMembers + + + DefaultDisplayPropertySet + + LogName + MaximumSizeInBytes + RecordCount + LogMode + + + + + + + + System.Diagnostics.Eventing.Reader.EventLogRecord + + + PSStandardMembers + + + DefaultDisplayPropertySet + + TimeCreated + ProviderName + Id + Message + + + + + + + + System.Diagnostics.Eventing.Reader.ProviderMetadata + + + ProviderName + Name + + + PSStandardMembers + + + DefaultDisplayPropertySet + + Name + LogLinks + + + + + + + + Microsoft.PowerShell.Commands.GetCounter.CounterSet + + + Counter + Paths + + + + + Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample + + + PSStandardMembers + + + DefaultDisplayPropertySet + + Path + InstanceName + CookedValue + + + + + + + + Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet + + + PSStandardMembers + + + DefaultDisplayPropertySet + + Timestamp + Readings + + + + + + + + Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet + + + Readings + + $strPaths = "" + foreach ($ctr in $this.CounterSamples) + { + $strPaths += ($ctr.Path + " :" + "`n") + $strPaths += ($ctr.CookedValue.ToString() + "`n`n") + } + return $strPaths + + + + + diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 index 9bfdb981d49..89122b8624c 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.Diagnostics/Microsoft.PowerShell.Diagnostics.psd1 @@ -1,16 +1,16 @@ -@{ -GUID="CA046F10-CA64-4740-8FF9-2565DBA61A4F" -Author="Microsoft Corporation" -CompanyName="Microsoft Corporation" -Copyright=" Microsoft Corporation. All rights reserved." -ModuleVersion="3.0.0.0" -PowerShellVersion="3.0" -CLRVersion="4.0" -AliasesToExport = @() -FunctionsToExport = @() -CmdletsToExport="Get-WinEvent", "Get-Counter", "Import-Counter", "Export-Counter", "New-WinEvent" -NestedModules="Microsoft.PowerShell.Commands.Diagnostics.dll" -TypesToProcess="GetEvent.types.ps1xml" -FormatsToProcess="Event.format.ps1xml","Diagnostics.format.ps1xml" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390783' -} +@{ +GUID="CA046F10-CA64-4740-8FF9-2565DBA61A4F" +Author="Microsoft Corporation" +CompanyName="Microsoft Corporation" +Copyright=" Microsoft Corporation. All rights reserved." +ModuleVersion="3.0.0.0" +PowerShellVersion="3.0" +CLRVersion="4.0" +AliasesToExport = @() +FunctionsToExport = @() +CmdletsToExport="Get-WinEvent", "Get-Counter", "Import-Counter", "Export-Counter", "New-WinEvent" +NestedModules="Microsoft.PowerShell.Commands.Diagnostics.dll" +TypesToProcess="GetEvent.types.ps1xml" +FormatsToProcess="Event.format.ps1xml","Diagnostics.format.ps1xml" +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390783' +} diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.LocalAccounts/LocalAccounts.format.ps1xml b/src/Modules/Windows-Full/Microsoft.PowerShell.LocalAccounts/LocalAccounts.format.ps1xml index 91b3b358a23..d539697feed 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.LocalAccounts/LocalAccounts.format.ps1xml +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.LocalAccounts/LocalAccounts.format.ps1xml @@ -90,4 +90,4 @@ - \ No newline at end of file + diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.LocalAccounts/Microsoft.PowerShell.LocalAccounts.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.LocalAccounts/Microsoft.PowerShell.LocalAccounts.psd1 index b2b562f0002..7c28db6f743 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.LocalAccounts/Microsoft.PowerShell.LocalAccounts.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.LocalAccounts/Microsoft.PowerShell.LocalAccounts.psd1 @@ -1,32 +1,32 @@ -@{ -RootModule = 'Microsoft.Powershell.LocalAccounts' -ModuleVersion = '1.0.0.0' -GUID = '8e362604-2c0b-448f-a414-a6a690a644e2' -Author = 'Microsoft Corporation' -CompanyName = 'Microsoft Corporation' -Copyright = '© Microsoft Corporation. All rights reserved.' -Description = 'Provides cmdlets to work with local users and local groups' -PowerShellVersion = '3.0' -CLRVersion = '4.0' -FormatsToProcess = @('LocalAccounts.format.ps1xml') -CmdletsToExport = @( - 'Add-LocalGroupMember', - 'Disable-LocalUser', - 'Enable-LocalUser', - 'Get-LocalGroup', - 'Get-LocalGroupMember', - 'Get-LocalUser', - 'New-LocalGroup', - 'New-LocalUser', - 'Remove-LocalGroup', - 'Remove-LocalGroupMember', - 'Remove-LocalUser', - 'Rename-LocalGroup', - 'Rename-LocalUser', - 'Set-LocalGroup', - 'Set-LocalUser' - ) -AliasesToExport= @( "algm", "dlu", "elu", "glg", "glgm", "glu", "nlg", "nlu", "rlg", "rlgm", "rlu", "rnlg", "rnlu", "slg", "slu") -HelpInfoURI = 'https://go.microsoft.com/fwlink/?LinkId=717973' -} - +@{ +RootModule = 'Microsoft.Powershell.LocalAccounts' +ModuleVersion = '1.0.0.0' +GUID = '8e362604-2c0b-448f-a414-a6a690a644e2' +Author = 'Microsoft Corporation' +CompanyName = 'Microsoft Corporation' +Copyright = '© Microsoft Corporation. All rights reserved.' +Description = 'Provides cmdlets to work with local users and local groups' +PowerShellVersion = '3.0' +CLRVersion = '4.0' +FormatsToProcess = @('LocalAccounts.format.ps1xml') +CmdletsToExport = @( + 'Add-LocalGroupMember', + 'Disable-LocalUser', + 'Enable-LocalUser', + 'Get-LocalGroup', + 'Get-LocalGroupMember', + 'Get-LocalUser', + 'New-LocalGroup', + 'New-LocalUser', + 'Remove-LocalGroup', + 'Remove-LocalGroupMember', + 'Remove-LocalUser', + 'Rename-LocalGroup', + 'Rename-LocalUser', + 'Set-LocalGroup', + 'Set-LocalUser' + ) +AliasesToExport= @( "algm", "dlu", "elu", "glg", "glgm", "glu", "nlg", "nlu", "rlg", "rlgm", "rlu", "rnlg", "rnlu", "slg", "slu") +HelpInfoURI = 'https://go.microsoft.com/fwlink/?LinkId=717973' +} + diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataAdapter.ps1 b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataAdapter.ps1 index 22ad15fb766..039b95060b9 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataAdapter.ps1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataAdapter.ps1 @@ -1,2070 +1,2070 @@ -Import-LocalizedData LocalizedData -FileName Microsoft.PowerShell.ODataUtilsStrings.psd1 - - -# Add .NET classes used by the module -Add-Type -TypeDefinition $global:BaseClassDefinitions - -######################################################### -# Generates PowerShell module containing client side -# proxy cmdlets that can be used to interact with an -# OData based server side endpoint. -######################################################### -function ExportODataEndpointProxy -{ - param - ( - [string] $Uri, - [string] $OutputModule, - [string] $MetadataUri, - [PSCredential] $Credential, - [string] $CreateRequestMethod, - [string] $UpdateRequestMethod, - [string] $CmdletAdapter, - [Hashtable] $ResourceNameMapping, - [switch] $Force, - [Hashtable] $CustomData, - [switch] $AllowClobber, - [switch] $AllowUnsecureConnection, - [Hashtable] $Headers, - [string] $ProgressBarStatus, - [System.Management.Automation.PSCmdlet] $PSCmdlet - ) - - [xml] $metadataXML = GetMetaData $MetadataUri $PSCmdlet $Credential $Headers - - [ODataUtils.Metadata] $metaData = ParseMetadata $metadataXML $MetadataUri $CmdletAdapter $PSCmdlet - - VerifyMetaData $MetadataUri $metaData $AllowClobber.IsPresent $PSCmdlet $progressBarStatus $CmdletAdapter $CustomData $ResourceNameMapping - - GenerateClientSideProxyModule $metaData $MetadataUri $Uri $OutputModule $CreateRequestMethod $UpdateRequestMethod $CmdletAdapter $ResourceNameMapping $CustomData $ProgressBarStatus $PSCmdlet -} - -######################################################### -# ParseMetaData is a helper function used to parse the -# metadata to convert it in to an object structure for -# further consumption during proxy generation. -######################################################### -function ParseMetaData -{ - param - ( - [xml] $metadataXml, - [string] $metaDataUri, - [string] $cmdletAdapter, - [System.Management.Automation.PSCmdlet] $callerPSCmdlet - ) - - # $metaDataUri is already validated at the cmdlet layer. - if($null -eq $callerPSCmdlet) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "ParseMetadata") } - - if($null -eq $metadataXml) - { - $errorMessage = ($LocalizedData.InValidXmlInMetadata -f $metaDataUri) - $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetadataUriFormat" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $metaDataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - - Write-Verbose $LocalizedData.VerboseParsingMetadata - - # Check the OData version in the fetched metadata to make sure that - # OData version (and hence the protocol) used in the metadata is - # supported by the adapter used for executing the generated - # proxy cmdlets. - if(($null -ne $metadataXML) -and ($null -ne $metadataXML.Edmx)) - { - if($null -eq $metadataXML.Edmx.Version) - { - $errorMessage = ($LocalizedData.ODataVersionNotFound -f $MetadataUri) - $exception = [System.InvalidOperationException]::new($errorMessage) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyODataVersionNotFound" $null ([System.Management.Automation.ErrorCategory]::InvalidData) $exception $MetadataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - - $metaDataVersion = New-Object -TypeName System.Version -ArgumentList @($metadataXML.Edmx.Version) - - # When we support plug-in model, We would have to fetch the - # $minSupportedVersionString & $maxSupportedVersionString - # from the plug-in instead of using an hardcoded value. - $minSupportedVersionString = '1.0' - $maxSupportedVersionString = '3.0' - $minSupportedVersion = New-Object -TypeName System.Version -ArgumentList @($minSupportedVersionString) - $maxSupportedVersion = New-Object -TypeName System.Version -ArgumentList @($maxSupportedVersionString) - - $minVersionComparisonResult = $minSupportedVersion.CompareTo($metaDataVersion) - $maxVersionComparisonResult = $maxSupportedVersion.CompareTo($metaDataVersion) - - if(-not($minVersionComparisonResult -lt $maxVersionComparisonResult)) - { - $errorMessage = ($LocalizedData.ODataVersionNotSupported -f $metadataXML.Edmx.Version, $MetadataUri, $minSupportedVersionString, $maxSupportedVersionString, $CmdletAdapter) - $exception = [System.NotSupportedException]::new($errorMessage) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyODataVersionNotSupported" $null ([System.Management.Automation.ErrorCategory]::InvalidData) $exception $MetadataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - } - else - { - $errorMessage = ($LocalizedData.InValidMetadata -f $MetadataUri) - $exception = [System.InvalidOperationException]::new($errorMessage) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetadata" $null ([System.Management.Automation.ErrorCategory]::InvalidData) $exception $MetadataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - - foreach ($schema in $MetadataXML.Edmx.DataServices.Schema) - { - if (($null -ne $schema) -and [string]::IsNullOrEmpty($schema.NameSpace )) - { - $callerPSCmdlet = $callerPSCmdlet -as [System.Management.Automation.PSCmdlet] - $errorMessage = ($LocalizedData.InValidSchemaNamespace -f $metaDataUri) - $exception = [System.InvalidOperationException]::new($errorMessage) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidSchemaNamespace" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $metaDataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - } - - $metaData = New-Object -TypeName ODataUtils.Metadata - - # this is a processing queue for those types that require base types that haven't been defined yet - $entityAndComplexTypesQueue = @{} - - foreach ($schema in $metadataXml.Edmx.DataServices.Schema) - { - if ($null -eq $schema) - { - Write-Error $LocalizedData.EmptySchema - continue - } - - if ($null -eq $metadata.Namespace) - { - $metaData.Namespace = $schema.Namespace - } - - foreach ($entityType in $schema.EntityType) - { - $baseType = $null - - if ($null -ne $entityType.BaseType) - { - # add it to the processing queue - $baseType = GetBaseType $entityType $metaData - if ($null -eq $baseType) - { - $entityAndComplexTypesQueue[$entityType.BaseType] += @(@{type='EntityType'; value=$entityType}) - continue - } - } - - [ODataUtils.EntityType] $newType = ParseMetadataTypeDefinition $entityType $baseType $metaData $schema.Namespace $true - $metaData.EntityTypes += $newType - AddDerivedTypes $newType $entityAndComplexTypesQueue $metaData $schema.Namespace - } - - foreach ($complexType in $schema.ComplexType) - { - $baseType = $null - - if ($null -ne $complexType.BaseType) - { - # add it to the processing queue - $baseType = GetBaseType $complexType $metaData - if ($null -eq $baseType) - { - $entityAndComplexTypesQueue[$entityType.BaseType] += @(@{type='ComplexType'; value=$complexType}) - continue - } - } - - [ODataUtils.EntityType] $newType = ParseMetadataTypeDefinition $complexType $baseType $metaData $schema.Namespace $false - $metaData.ComplexTypes += $newType - AddDerivedTypes $newType $entityAndComplexTypesQueue $metaData $schema.Namespace - } - } - - foreach ($schema in $metadataXml.Edmx.DataServices.Schema) - { - foreach ($entityContainer in $schema.EntityContainer) - { - if ($entityContainer.IsDefaultEntityContainer) - { - $metaData.DefaultEntityContainerName = $entityContainer.Name - } - - $entityTypeToEntitySetMapping = @{}; - foreach ($entitySet in $entityContainer.EntitySet) - { - $entityType = $metaData.EntityTypes | Where-Object { $_.Name -eq $entitySet.EntityType.Split('.')[-1] } - $entityTypeName = $entityType.Name - - if($entityTypeToEntitySetMapping.ContainsKey($entityTypeName)) - { - $existingEntitySetName = $entityTypeToEntitySetMapping[$entityTypeName] - - $errorMessage = ($LocalizedData.EntityNameConflictError -f $metaDataUri, $existingEntitySetName, $entitySet.Name, $entityTypeName) - $exception = [System.NotSupportedException]::new($errorMessage) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyEntityTypeMappingError" $null ([System.Management.Automation.ErrorCategory]::InvalidData) $exception $metaDataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - else - { - $entityTypeToEntitySetMapping.Add($entityTypeName, $entitySet.Name) - } - - $newEntitySet = [ODataUtils.EntitySet] @{ - "Namespace" = $schema.Namespace; - "Name" = $entitySet.Name; - "Type" = $entityType; - } - - $metaData.EntitySets += $newEntitySet - } - } - } - - foreach ($schema in $metadataXml.Edmx.DataServices.Schema) - { - foreach ($association in $schema.Association) - { - $newAssociationType = [ODataUtils.AssociationType] @{ - "Namespace" = $schema.Namespace; - "EndType1" = $metaData.EntityTypes | Where-Object { $_.Name -eq $association.End[0].Type.Split('.')[-1] }; - "NavPropertyName1" = $association.End[0].Role; - "Multiplicity1" = $association.End[0].Multiplicity; - - "EndType2" = $metaData.EntityTypes | Where-Object { $_.Name -eq $association.End[1].Type.Split('.')[-1] }; - "NavPropertyName2" = $association.End[1].Role; - "Multiplicity2" = $association.End[1].Multiplicity; - } - - $newAssociation = [ODataUtils.AssociationSet] @{ - "Namespace" = $schema.Namespace; - "Name" = $association.Name; - "Type" = $newAssociationType; - } - - $metaData.Associations += $newAssociation - } - } - - foreach ($schema in $metadataXml.Edmx.DataServices.Schema) - { - foreach ($action in $schema.EntityContainer.FunctionImport) - { - # HttpMethod is only used for legacy Service Operations - if ($null -eq $action.HttpMethod) - { - if ($null -ne $action.IsSideEffecting) - { - $isSideEffecting = $action.IsSideEffecting - } - else - { - $isSideEffecting = $true - } - - $newAction = [ODataUtils.Action] @{ - "Namespace" = $schema.Namespace; - "Verb" = $action.Name; - "IsSideEffecting" = $isSideEffecting; - "IsBindable" = $action.IsBindable; - # we don't care about IsAlwaysBindable, since we populate actions information from $metaData - # so we can't know the state of the entity - } - - # Actions are always SideEffecting, otherwise it's an OData function - if ($newAction.IsSideEffecting -ne $false) - { - foreach ($parameter in $action.Parameter) - { - if ($null -ne $parameter.Nullable) - { - $parameterIsNullable = [System.Convert]::ToBoolean($parameter.Nullable); - } - - $newParameter = [ODataUtils.TypeProperty] @{ - "Name" = $parameter.Name; - "TypeName" = $parameter.Type; - "IsNullable" = $parameterIsNullable - } - - $newAction.Parameters += $newParameter - } - - # IsBindable means it operates on Entity/ies - if ($newAction.IsBindable) - { - $regex = "Collection\((.+)\)" - - if ($newAction.Parameters[0].TypeName -match $regex) - { - # action operating on a collection of entities - $insideTypeName = Convert-ODataTypeToCLRType $Matches[1] - - $newAction.EntitySet = $metaData.EntitySets | Where-Object { ($_.Type.Namespace + "." + $_.Type.Name) -eq $insideTypeName } - $newAction.IsSingleInstance = $false - } - else - { - # actions operating on a single instance - $newAction.EntitySet = $metaData.EntitySets | Where-Object { ($_.Type.Namespace + "." + $_.Type.Name) -eq $newAction.Parameters[0].TypeName } - - $newAction.IsSingleInstance = $true - } - } - - $metaData.Actions += $newAction - } - } - } - } - - $metaData -} - -######################################################### -# VerifyMetaData is a helper function used to validate -# the processed metadata to make sure client side proxy -# can be created for the supplied metadata. -######################################################### -function VerifyMetaData -{ - param - ( - [string] $metaDataUri, - [ODataUtils.Metadata] $metaData, - [boolean] $allowClobber, - [System.Management.Automation.PSCmdlet] $callerPSCmdlet, - [string] $progressBarStatus, - [string] $cmdletAdapter, - [Hashtable] $customData, - [Hashtable] $resourceNameMapping - ) - - # $metaDataUri & $cmdletAdapter is already validated at the cmdlet layer. - if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "VerifyMetaData") } - if($null -eq $callerPSCmdlet) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "VerifyMetaData") } - if($null -eq $progressBarStatus) { throw ($LocalizedData.ArguementNullError -f "ProgressBarStatus", "VerifyMetaData") } - - Write-Verbose $LocalizedData.VerboseVerifyingMetadata - - if ($metadata.EntitySets.Count -le 0) - { - $errorMessage = ($LocalizedData.NoEntitySets -f $metaDataUri) - $exception = [System.InvalidOperationException]::new($errorMessage) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetaDataUri" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $metaDataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - - if ($metadata.EntityTypes.Count -le 0) - { - $errorMessage = ($LocalizedData.NoEntityTypes -f $metaDataUri) - $exception = [System.InvalidOperationException]::new($errorMessage) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetaDataUri" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $metaDataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - - # All the generated proxy cmdlets would have the following parameters added. - # The ODataAdapter has the default implementation on how to handle the - # scenario when these parameters are used during proxy invocations. - # The default implementation can be overridden using adapter derivation model. - $reservedProperties = @("Filter", "IncludeTotalResponseCount", "OrderBy", "Select", "Skip", "Top", "ConnectionUri", "CertificateThumbprint", "Credential") - $validEntitySets = @() - $sessionCommands = Get-Command -All - - foreach ($entitySet in $metaData.EntitySets) - { - if ($null -eq $entitySet.Type) - { - $errorMessage = ($LocalizedData.EntitySetUndefinedType -f $metaDataUri, $entitySet.Name) - $exception = [System.InvalidOperationException]::new($errorMessage) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetaDataUri" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $metaDataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - - if ($cmdletAdapter -eq "NetworkControllerAdapter" -And $customData -And $customData.Contains($entitySet.Name) -eq $false) - { - continue - } - - $hasConflictingProperty = $false - $hasConflictingCommand = $false - - $entityAndNavigationProperties = (GetAllProperties $entitySet.Type) + (GetAllProperties $entitySet.Type -IncludeOnlyNavigationProperties) - foreach($entityProperty in $entityAndNavigationProperties) - { - if($reservedProperties.Contains($entityProperty.Name)) - { - $hasConflictingProperty = $true - if(!$allowClobber) - { - # Write Error message and skip current Entity Set. - $errorMessage = ($LocalizedData.SkipEntitySetProxyCreation -f $entitySet.Name, $entitySet.Type.Name, $entityProperty.Name) - $exception = [System.InvalidOperationException]::new($errorMessage) - $errorRecord = CreateErrorRecordHelper "ODataEndpointDefaultPropertyCollision" $null ([System.Management.Automation.ErrorCategory]::InvalidOperation) $exception $metaDataUri - $callerPSCmdlet.WriteError($errorRecord) - } - else - { - $warningMessage = ($LocalizedData.EntitySetProxyCreationWithWarning -f $entitySet.Name, $entityProperty.Name, $entitySet.Type.Name) - $callerPSCmdlet.WriteWarning($warningMessage) - } - } - } - - foreach($currentCommand in $sessionCommands) - { - # The generated command Noun can be set using ResourceNameMapping - $generatedCommandName = $entitySet.Name - if ($resourceNameMapping -And $resourceNameMapping.Contains($entitySet.Name)) { - $generatedCommandName = $resourceNameMapping[$entitySet.Name] - } - - if(($null -ne $currentCommand.Noun -and $currentCommand.Noun -eq $generatedCommandName) -and - ($currentCommand.Verb -eq "Get" -or - $currentCommand.Verb -eq "Set" -or - $currentCommand.Verb -eq "New" -or - $currentCommand.Verb -eq "Remove")) - { - $hasConflictingCommand = $true - VerifyMetadataHelper $LocalizedData.SkipEntitySetConflictCommandCreation ` - $LocalizedData.EntitySetConflictCommandCreationWithWarning ` - $entitySet.Name $currentCommand.Name $metaDataUri $allowClobber $callerPSCmdlet - } - } - - foreach($currentAction in $metaData.Actions) - { - $actionCommand = "Invoke-" + "$($entitySet.Name)$($currentAction.Verb)" - - foreach($currentCommand in $sessionCommands) - { - if($actionCommand -eq $currentCommand.Name) - { - $hasConflictingCommand = $true - VerifyMetadataHelper $LocalizedData.SkipEntitySetConflictCommandCreation ` - $LocalizedData.EntitySetConflictCommandCreationWithWarning $entitySet.Name ` - $currentCommand.Name $metaDataUri $allowClobber $callerPSCmdlet - } - } - } - - if(!($hasConflictingProperty -or $hasConflictingCommand)-or $allowClobber) - { - $validEntitySets += $entitySet - } - } - - if ($cmdletAdapter -ne "NetworkControllerAdapter") { - - $metaData.EntitySets = $validEntitySets - - $validServiceActions = @() - $hasConflictingServiceActionCommand = $true - foreach($currentAction in $metaData.Actions) - { - $serviceActionCommand = "Invoke-" + "$($currentAction.Verb)" - - foreach($currentCommand in $sessionCommands) - { - if($serviceActionCommand -eq $currentCommand.Name) - { - $hasConflictingServiceActionCommand = $true - VerifyMetadataHelper $LocalizedData.SkipConflictServiceActionCommandCreation ` - $LocalizedData.ConflictServiceActionCommandCreationWithWarning $entitySet.Name ` - $currentCommand.Name $metaDataUri $allowClobber $callerPSCmdlet - } - } - - if(!$hasConflictingServiceActionCommand -or $allowClobber) - { - $validServiceActions += $currentAction - } - } - - $metaData.Actions = $validServiceActions - } - - # Update Progress bar. - ProgressBarHelper "Export-ODataEndpointProxy" $progressBarStatus 5 20 1 1 -} - -######################################################### -# GenerateClientSideProxyModule is a helper function used -# to generate a PowerShell module that serves as a client -# side proxy for interacting with the server side -# OData endpoint. The proxy module contains proxy cmdlets -# implemented in CDXML modules and they are exposed -# through module manifest as nested modules. -# One CDXML module is created for each EntitySet -# described in the metadata. Each CDXML module contains -# CRUD & Service Action specific proxy cmdlets targeting -# the underlying EntityType. There is 1:M mapping between -# EntitySet & its underlying EntityTypes (i.e., all -# entities with in the single EntitySet will be of the -# same EntityType but there can be multiple entities -# of the same type with in an EntitySet). -######################################################### -function GenerateClientSideProxyModule -{ - param - ( - [ODataUtils.Metadata] $metaData, - [string] $metaDataUri, - [string] $uri, - [string] $outputModule, - [string] $createRequestMethod, - [string] $updateRequestMethod, - [string] $cmdletAdapter, - [Hashtable] $resourceNameMapping, - [Hashtable] $customData, - [string] $progressBarStatus, - [System.Management.Automation.PSCmdlet] $callerPSCmdlet - ) - - # $uri, $outputModule, $metaDataUri, $createRequestMethod, $updateRequestMethod, & $cmdletAdapter is already validated at the cmdlet layer. - if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateClientSideProxyModule") } - if($null -eq $callerPSCmdlet) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "GenerateClientSideProxyModule") } - if($null -eq $progressBarStatus) { throw ($LocalizedData.ArguementNullError -f "ProgressBarStatus", "GenerateClientSideProxyModule") } - - # This function performs the following set of tasks - # while creating the client side proxy module: - # 1. If the server side endpoint exposes complex types, - # the client side proxy complex types are created - # as C# class in ComplexTypeDefinitions.psm1 - # 2. Creates proxy cmdlets for CRUD operations. - # 3. Creates proxy cmdlets for Service action operations. - # 4. Creates module manifest. - - Write-Verbose ($LocalizedData.VerboseSavingModule -f $outputModule) - - $typeDefinitionFileName = "ComplexTypeDefinitions.psm1" - $complexTypeMapping = GenerateComplexTypeDefinition $metaData $metaDataUri $outputModule $typeDefinitionFileName $cmdletAdapter $callerPSCmdlet - - ProgressBarHelper "Export-ODataEndpointProxy" $progressBarStatus 20 20 1 1 - - $complexTypeFileDefinitionPath = Join-Path -Path $outputModule -ChildPath $typeDefinitionFileName - - if(Test-Path -Path $complexTypeFileDefinitionPath) - { - $proxyFile = New-Object -TypeName System.IO.FileInfo -ArgumentList $complexTypeFileDefinitionPath | Get-Item - if($null -ne $callerPSCmdlet) - { - $callerPSCmdlet.WriteObject($proxyFile) - } - } - - $currentEntryCount = 0 - foreach ($entitySet in $metaData.EntitySets) - { - $currentEntryCount += 1 - if ($cmdletAdapter -eq "NetworkControllerAdapter" -And $customData -And $customData.Contains($entitySet.Name) -eq $false) - { - ProgressBarHelper "Export-ODataEndpointProxy" $progressBarStatus 40 20 $metaData.EntitySets.Count $currentEntryCount - continue - } - - GenerateCRUDProxyCmdlet $entitySet $metaData $uri $outputModule $createRequestMethod $updateRequestMethod $cmdletAdapter $resourceNameMapping $customData $complexTypeMapping "Export-ODataEndpointProxy" $progressBarStatus 40 20 $metaData.EntitySets.Count $currentEntryCount $callerPSCmdlet - } - - GenerateServiceActionProxyCmdlet $metaData $uri "$outputModule\ServiceActions.cdxml" $complexTypeMapping $progressBarStatus $callerPSCmdlet - - $moduleDirInfo = [System.IO.DirectoryInfo]::new($outputModule) - $moduleManifestName = $moduleDirInfo.Name + ".psd1" - GenerateModuleManifest $metaData $outputModule\$moduleManifestName @($typeDefinitionFileName, 'ServiceActions.cdxml') $resourceNameMapping $progressBarStatus $callerPSCmdlet -} - -######################################################### -# GenerateCRUDProxyCmdlet is a helper function used -# to generate Get, Set, New & Remove proxy cmdlet. -# The proxy cmdlet is generated in the CDXML -# compliant format. -######################################################### -function GenerateCRUDProxyCmdlet -{ - param - ( - [ODataUtils.EntitySet] $entitySet, - [ODataUtils.Metadata] $metaData, - [string] $uri, - [string] $outputModule, - [string] $createRequestMethod, - [string] $UpdateRequestMethod, - [string] $cmdletAdapter, - [Hashtable] $resourceNameMapping, - [Hashtable] $customData, - [Hashtable] $complexTypeMapping, - [string] $progressBarActivityName, - [string] $progressBarStatus, - [double] $previousSegmentWeight, - [double] $currentSegmentWeight, - [int] $totalNumberofEntries, - [int] $currentEntryCount, - [System.Management.Automation.PSCmdlet] $callerPSCmdlet - ) - - # $uri, $outputModule, $metaDataUri, $createRequestMethod, $updateRequestMethod, & $cmdletAdapter is already validated at the cmdlet layer. - if($null -eq $entitySet) { throw ($LocalizedData.ArguementNullError -f "EntitySet", "GenerateClientSideProxyModule") } - if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateClientSideProxyModule") } - if($null -eq $callerPSCmdlet) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "GenerateClientSideProxyModule") } - if($null -eq $progressBarStatus) { throw ($LocalizedData.ArguementNullError -f "ProgressBarStatus", "GenerateClientSideProxyModule") } - - $entitySetName = $entitySet.Name - if(($null -ne $resourceNameMapping) -and - $resourceNameMapping.ContainsKey($entitySetName)) - { - $entitySetName = $resourceNameMapping[$entitySetName] - } - else - { - $entitySetName = $entitySet.Type.Name - } - - $Path = "$OutputModule\$entitySetName.cdxml" - - $xmlWriter = New-Object System.XMl.XmlTextWriter($Path,$Null) - - if ($null -eq $xmlWriter) - { - throw ($LocalizedData.XmlWriterInitializationError -f $entitySet.Name) - } - - $xmlWriter = SaveCDXMLHeader $xmlWriter $uri $entitySet.Name $entitySetName $cmdletAdapter - - # Get the keys depending on whether the url contains variables or not - if ($CmdletAdapter -ne "NetworkControllerAdapter") - { - $keys = (GetAllProperties $entitySet.Type) | Where-Object { $_.IsKey } - } - else - { - $name = $entitySet.Name - $keys = GetKeys $entitySet $customData.$name 'Get' - } - - $navigationProperties = GetAllProperties $entitySet.Type -IncludeOnlyNavigationProperties - - GenerateGetProxyCmdlet $xmlWriter $metaData $keys $navigationProperties $cmdletAdapter $complexTypeMapping - - $nonKeyProperties = (GetAllProperties $entitySet.Type) | Where-Object { -not $_.isKey } - $nullableProperties = $nonKeyProperties | Where-Object { $_.isNullable } - $nonNullableProperties = $nonKeyProperties | Where-Object { -not $_.isNullable } - - $xmlWriter.WriteStartElement('StaticCmdlets') - - $keyProperties = $keys - - # Do operations specifically needed for NetworkController cmdlets - if ($CmdletAdapter -eq "NetworkControllerAdapter") - { - $keyProperties = GetKeys $entitySet $customData.$name 'New' - $additionalProperties = GetNetworkControllerAdditionalProperties $navigationProperties $metaData - $nullableProperties = UpdateNetworkControllerSpecificProperties $nullableProperties $additionalProperties $keyProperties $true - $nonNullableProperties = UpdateNetworkControllerSpecificProperties $nonNullableProperties $additionalProperties $keyProperties $false - } - - GenerateNewProxyCmdlet $xmlWriter $metaData $keyProperties $nonNullableProperties $nullableProperties $navigationProperties $cmdletAdapter $complexTypeMapping - - if ($CmdletAdapter -ne "NetworkControllerAdapter") - { - GenerateSetProxyCmdlet $xmlWriter $keyProperties $nonKeyProperties $complexTypeMapping - } - - if ($CmdletAdapter -eq "NetworkControllerAdapter") - { - $keyProperties = GetKeys $entitySet $customData.$name 'Remove' - } - - GenerateRemoveProxyCmdlet $xmlWriter $metaData $keyProperties $navigationProperties $cmdletAdapter $complexTypeMapping - - $entityActions = $metaData.Actions | Where-Object { ($_.EntitySet.Namespace -eq $entitySet.Namespace) -and ($_.EntitySet.Name -eq $entitySet.Name) } - - if ($entityActions.Length -gt 0) - { - foreach($action in $entityActions) - { - $xmlWriter = GenerateActionProxyCmdlet $xmlWriter $metaData $action $entitySet.Name $true $keys $complexTypeMapping - } - } - - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('CmdletAdapterPrivateData') - - $xmlWriter.WriteStartElement('Data') - $xmlWriter.WriteAttributeString('Name', 'EntityTypeName') - $xmlWriter.WriteString("$($entitySet.Type.Namespace).$($entitySet.Type.Name)") - $xmlWriter.WriteEndElement() - $xmlWriter.WriteStartElement('Data') - $xmlWriter.WriteAttributeString('Name', 'EntitySetName') - $xmlWriter.WriteString("$($entitySet.Namespace).$($entitySet.Name)") - $xmlWriter.WriteEndElement() - - # Add the customUri to privateData - if ($CmdletAdapter -eq "NetworkControllerAdapter") - { - $xmlWriter.WriteStartElement('Data') - $xmlWriter.WriteAttributeString('Name', "CustomUriSuffix") - $xmlWriter.WriteString($CustomData.$name) - $xmlWriter.WriteEndElement() - } - - # Add CreateRequestMethod and UpdateRequestMethod to privateData - $xmlWriter.WriteStartElement('Data') - $xmlWriter.WriteAttributeString('Name', 'CreateRequestMethod') - $xmlWriter.WriteString("$CreateRequestMethod") - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('Data') - $xmlWriter.WriteAttributeString('Name', 'UpdateRequestMethod') - $xmlWriter.WriteString("$UpdateRequestMethod") - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteEndElement() - - SaveCDXMLFooter $xmlWriter - - ProcessStreamHelper ($LocalizedData.VerboseSavedCDXML -f $($entitySetName), $Path) $progressBarActivityName $progressBarStatus $previousSegmentWeight $currentSegmentWeight $totalNumberofEntries $currentEntryCount $Path $callerPSCmdlet -} - -######################################################### -# GenerateGetProxyCmdlet is a helper function used -# to generate Get-* proxy cmdlet. The proxy cmdlet is -# generated in the CDXML compliant format. -######################################################### -function GenerateGetProxyCmdlet -{ - param - ( - [System.XMl.XmlTextWriter] $xmlWriter, - [ODataUtils.Metadata] $metaData, - [object[]] $keys, - [object[]] $navigationProperties, - [string] $cmdletAdapter, - [Hashtable] $complexTypeMapping - ) - - # $cmdletAdapter is already validated at the cmdlet layer. - if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "GenerateGetProxyCmdlet") } - if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateGetProxyCmdlet") } - - $xmlWriter.WriteStartElement('InstanceCmdlets') - $xmlWriter.WriteStartElement('GetCmdletParameters') - $xmlWriter.WriteAttributeString('DefaultCmdletParameterSet', 'Default') - - # adding key parameters and association parameters to QueryableProperties, each in a different parameter set - # to be used by GET cmdlet - if (($null -ne $keys -and $keys.Length -gt 0) -or (($null -ne $navigationProperties -and $navigationProperties.Length -gt 0) -and $cmdletAdapter -ne "NetworkControllerAdapter")) - { - $xmlWriter.WriteStartElement('QueryableProperties') - $position = 0 - - $keys | Where-Object { $null -ne $_ } | ForEach-Object { - $xmlWriter.WriteStartElement('Property') - $xmlWriter.WriteAttributeString('PropertyName', $_.Name) - - $xmlWriter.WriteStartElement('Type') - $PSTypeName = Convert-ODataTypeToCLRType $_.TypeName $complexTypeMapping - $xmlWriter.WriteAttributeString('PSType', $PSTypeName) - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('RegularQuery') - $xmlWriter.WriteStartElement('CmdletParameterMetadata') - $xmlWriter.WriteAttributeString('PSName', $_.Name) - $xmlWriter.WriteAttributeString('CmdletParameterSets', 'Default') - $xmlWriter.WriteAttributeString('IsMandatory', $_.IsMandatory.ToString().ToLower()) - $xmlWriter.WriteAttributeString('Position', $position) - if($_.IsMandatory) - { - $xmlWriter.WriteAttributeString('ValueFromPipelineByPropertyName', 'true') - } - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - - $position++ - } - - # This behaviour is different for NetworkController specific cmdlets. - if ($CmdletAdapter -ne "NetworkControllerAdapter") - { - $navigationProperties | Where-Object { $null -ne $_ } | ForEach-Object { - $associatedType = GetAssociatedType $metaData $_ - $associatedEntitySet = GetEntitySetForEntityType $metaData $associatedType - $nvgProperty = $_ - - (GetAllProperties $associatedType) | Where-Object { $_.IsKey } | ForEach-Object { - $xmlWriter.WriteStartElement('Property') - $xmlWriter.WriteAttributeString('PropertyName', $associatedEntitySet.Name + ':' + $_.Name + ':Key') - - $xmlWriter.WriteStartElement('Type') - $PSTypeName = Convert-ODataTypeToCLRType $_.TypeName $complexTypeMapping - $xmlWriter.WriteAttributeString('PSType', $PSTypeName) - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('RegularQuery') - $xmlWriter.WriteStartElement('CmdletParameterMetadata') - $xmlWriter.WriteAttributeString('PSName', 'Associated' + $nvgProperty.Name + $_.Name) - $xmlWriter.WriteAttributeString('CmdletParameterSets', $nvgProperty.AssociationName) - $xmlWriter.WriteAttributeString('IsMandatory', 'true') - $xmlWriter.WriteAttributeString('ValueFromPipelineByPropertyName', 'true') - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - } - } - - - # Add Query Parameters (i.e., Top, Skip, OrderBy, Filter) to the generated Get-* cmdlets. - $queryParameters = - @{ - "Filter" = "Edm.String"; - "IncludeTotalResponseCount" = "switch"; - "OrderBy" = "Edm.String"; - "Select" = "Edm.String"; - "Skip" = "Edm.Int32"; - "Top" = "Edm.Int32"; - } - - foreach($currentQueryParameter in $queryParameters.Keys) - { - $xmlWriter.WriteStartElement('Property') - $xmlWriter.WriteAttributeString('PropertyName', "QueryOption:" + $currentQueryParameter) - $xmlWriter.WriteStartElement('Type') - $PSTypeName = Convert-ODataTypeToCLRType $queryParameters[$currentQueryParameter] - $xmlWriter.WriteAttributeString('PSType', $PSTypeName) - $xmlWriter.WriteEndElement() - $xmlWriter.WriteStartElement('RegularQuery') - $xmlWriter.WriteStartElement('CmdletParameterMetadata') - $xmlWriter.WriteAttributeString('PSName', $currentQueryParameter) - - if($queryParameters[$currentQueryParameter] -eq "Edm.String") - { - $xmlWriter.WriteStartElement('ValidateNotNullOrEmpty') - $xmlWriter.WriteEndElement() - } - - if($queryParameters[$currentQueryParameter] -eq "Edm.Int32") - { - $minValue = 1 - # For Skip Query parameter we want to support 0 as the - # minimum skip value in order to support client side paging. - if($currentQueryParameter -eq 'Skip') - { - $minValue = 0 - } - $xmlWriter.WriteStartElement('ValidateRange') - $xmlWriter.WriteAttributeString('Min', $minValue) - $xmlWriter.WriteAttributeString('Max', [int]::MaxValue) - $xmlWriter.WriteEndElement() - } - - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - } - } - - $xmlWriter.WriteEndElement() - } - - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('GetCmdlet') - $xmlWriter.WriteStartElement('CmdletMetadata') - $xmlWriter.WriteAttributeString('Verb', 'Get') - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteEndElement() -} - -######################################################### -# GenerateNewProxyCmdlet is a helper function used -# to generate New-* proxy cmdlet. The proxy cmdlet is -# generated in the CDXML compliant format. -######################################################### -function GenerateNewProxyCmdlet -{ - param - ( - [System.XMl.XmlTextWriter] $xmlWriter, - [ODataUtils.Metadata] $metaData, - [object[]] $keyProperties, - [object[]] $nonNullableProperties, - [object[]] $nullableProperties, - [object[]] $navigationProperties, - [string] $cmdletAdapter, - [Hashtable] $complexTypeMapping - ) - - # $cmdletAdapter is already validated at the cmdlet layer. - if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "GenerateNewProxyCmdlet") } - if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateNewProxyCmdlet") } - - $xmlWriter.WriteStartElement('Cmdlet') - $xmlWriter.WriteStartElement('CmdletMetadata') - $xmlWriter.WriteAttributeString('Verb', 'New') - $xmlWriter.WriteAttributeString('DefaultCmdletParameterSet', 'Default') - $xmlWriter.WriteAttributeString('ConfirmImpact', 'Medium') - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('Method') - $xmlWriter.WriteAttributeString('MethodName', 'Create') - $xmlWriter.WriteAttributeString('CmdletParameterSet', 'Default') - - AddParametersNode $xmlWriter $keyProperties $nonNullableProperties $nullableProperties $null $true $true $complexTypeMapping - $xmlWriter.WriteEndElement() - - # This behaviour is different for NetworkControllerCmdlets - if ($CmdletAdapter -ne "NetworkControllerAdapter") - { - $navigationProperties | Where-Object { $null -ne $_ } | ForEach-Object { - $associatedType = GetAssociatedType $metaData $_ - $associatedEntitySet = GetEntitySetForEntityType $metaData $associatedType - - $xmlWriter.WriteStartElement('Method') - $xmlWriter.WriteAttributeString('MethodName', "Association:Create:$($associatedEntitySet.Name)") - $xmlWriter.WriteAttributeString('CmdletParameterSet', $_.Name) - - $associatedKeys = ((GetAllProperties $associatedType) | Where-Object { $_.isKey }) - - AddParametersNode $xmlWriter $associatedKeys $keyProperties $null "Associated$($_.Name)" $true $true $complexTypeMapping - $xmlWriter.WriteEndElement() - } - } - - $xmlWriter.WriteEndElement() -} - -######################################################### -# GenerateRemoveProxyCmdlet is a helper function used -# to generate Remove-* proxy cmdlet. The proxy cmdlet is -# generated in the CDXML compliant format. -######################################################### -function GenerateRemoveProxyCmdlet -{ - param - ( - - [System.XMl.XmlTextWriter] $xmlWriter, - [ODataUtils.Metadata] $metaData, - [object[]] $keyProperties, - [object[]] $navigationProperties, - [string] $cmdletAdapter, - [Hashtable] $complexTypeMapping - ) - - # $metaData, $cmdletAdapter & $cmdletAdapter are already validated at the cmdlet layer. - if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "GenerateRemoveProxyCmdlet") } - if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateRemoveProxyCmdlet") } - - $xmlWriter.WriteStartElement('Cmdlet') - $xmlWriter.WriteStartElement('CmdletMetadata') - $xmlWriter.WriteAttributeString('Verb', 'Remove') - $xmlWriter.WriteAttributeString('DefaultCmdletParameterSet', 'Default') - $xmlWriter.WriteAttributeString('ConfirmImpact', 'Medium') - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('Method') - $xmlWriter.WriteAttributeString('MethodName', 'Delete') - $xmlWriter.WriteAttributeString('CmdletParameterSet', 'Default') - - # This behaviour is different for NetworkControllerCmdlets - if ($CmdletAdapter -eq "NetworkControllerAdapter") - { - # Add etag for NetworkControllerCmdlets - $otherProperties = @([ODataUtils.TypeProperty] @{ - "Name" = "Etag"; - "TypeName" = "Edm.String"; - "IsNullable" = $true; - }) - - AddParametersNode $xmlWriter $keyProperties $null $otherProperties $null $true $true $complexTypeMapping - } - else - { - AddParametersNode $xmlWriter $keyProperties $null $null $null $true $true $complexTypeMapping - } - - $xmlWriter.WriteEndElement() - - # This behaviour is different for NetworkControllerCmdlets - if ($CmdletAdapter -ne "NetworkControllerAdapter") - { - $navigationProperties | Where-Object { $null -ne $_ } | ForEach-Object { - - $associatedType = GetAssociatedType $metaData $_ - $associatedEntitySet = GetEntitySetForEntityType $metaData $associatedType - - $xmlWriter.WriteStartElement('Method') - $xmlWriter.WriteAttributeString('MethodName', "Association:Delete:$($associatedEntitySet.Name)") - $xmlWriter.WriteAttributeString('CmdletParameterSet', $_.Name) - - $associatedType = GetAssociatedType $metaData $_ - $associatedKeys = ((GetAllProperties $associatedType) | Where-Object { $_.isKey }) - - AddParametersNode $xmlWriter $associatedKeys $keyProperties $null "Associated$($_.Name)" $true $true $complexTypeMapping - $xmlWriter.WriteEndElement() - } - } - $xmlWriter.WriteEndElement() -} - -######################################################### -# GenerateActionProxyCmdlet is a helper function used -# to generate Invoke-* proxy cmdlet. These proxy cmdlets -# support Instance/Service level actions. They are -# generated in the CDXML compliant format. -######################################################### -function GenerateActionProxyCmdlet -{ - param - ( - [System.Xml.XmlWriter] $xmlWriter, - [ODataUtils.Metadata] $metaData, - [ODataUtils.Action] $action, - [string] $noun, - [bool] $isInstanceAction, - [ODataUtils.TypeProperty] $keys, - [Hashtable] $complexTypeMapping - ) - - # $metaData is already validated at the cmdlet layer. - if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "GenerateActionProxyCmdlet") } - if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateActionProxyCmdlet") } - if($null -eq $action) { throw ($LocalizedData.ArguementNullError -f "Action", "GenerateActionProxyCmdlet") } - if($null -eq $noun) { throw ($LocalizedData.ArguementNullError -f "Noun", "GenerateActionProxyCmdlet") } - - $xmlWriter.WriteStartElement('Cmdlet') - - $xmlWriter.WriteStartElement('CmdletMetadata') - $xmlWriter.WriteAttributeString('Verb', 'Invoke') - $xmlWriter.WriteAttributeString('Noun', "$($noun)$($action.Verb)") - $xmlWriter.WriteAttributeString('ConfirmImpact', 'Medium') - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('Method') - $xmlWriter.WriteAttributeString('MethodName', "Action:$($action.Verb):$($action.EntitySet.Name)") - - $xmlWriter.WriteStartElement('Parameters') - - $keys | Where-Object { $null -ne $_ } | ForEach-Object { - $xmlWriter.WriteStartElement('Parameter') - $xmlWriter.WriteAttributeString('ParameterName', $_.Name + ':Key') - - $xmlWriter.WriteStartElement('Type') - $PSTypeName = Convert-ODataTypeToCLRType $_.TypeName $complexTypeMapping - $xmlWriter.WriteAttributeString('PSType', $PSTypeName) - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('CmdletParameterMetadata') - $xmlWriter.WriteAttributeString('PSName', $_.Name) - $xmlWriter.WriteAttributeString('IsMandatory', 'true') - $xmlWriter.WriteAttributeString('ValueFromPipelineByPropertyName', 'true') - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - } - - $i = -1 - foreach ($parameter in $action.Parameters) - { - $i++ - - # for Instance actions, first parameter is Entity Set which we refer to using keys - if ($isInstanceAction -and ($i -eq 0)) - { - continue - } - - $xmlWriter.WriteStartElement('Parameter') - $xmlWriter.WriteAttributeString('ParameterName', $parameter.Name) - - $xmlWriter.WriteStartElement('Type') - $PSTypeName = Convert-ODataTypeToCLRType $parameter.TypeName - $xmlWriter.WriteAttributeString('PSType', $PSTypeName) - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('CmdletParameterMetadata') - $xmlWriter.WriteAttributeString('PSName', $parameter.Name) - if (-not $parameter.IsNullable) - { - $xmlWriter.WriteAttributeString('IsMandatory', 'true') - $xmlWriter.WriteAttributeString('ValueFromPipelineByPropertyName', 'true') - } - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - } - - # Add -Force parameter to Service Action cmdlets. - AddParametersNode $xmlWriter $null $null $null $null $true $false $complexTypeMapping - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteEndElement() - - $xmlWriter -} - -######################################################### -# GenerateServiceActionProxyCmdlet is a helper function -# used to generate Invoke-* proxy cmdlet. These proxy -# cmdlets support all Service-level actions. They are -# generated in the CDXML compliant format. -######################################################### -function GenerateServiceActionProxyCmdlet -{ - param - ( - [Parameter(Mandatory=$true)] - [ODataUtils.Metadata] $metaData, - [Parameter(Mandatory=$true)] - [string] $uri, - [Parameter(Mandatory=$true)] - [string] $path, - [Hashtable] $complexTypeMapping, - [string] $progressBarStatus, - [System.Management.Automation.PSCmdlet] $callerPSCmdlet - ) - - # $uri is already validated at the cmdlet layer. - if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateServiceActionProxyCmdlet") } - - $xmlWriter = New-Object System.XMl.XmlTextWriter($path,$Null) - - if ($null -eq $xmlWriter) - { - throw $LocalizedData.XmlWriterInitializationError -f "ServiceActions" - } - - $xmlWriter = SaveCDXMLHeader $xmlWriter $uri 'ServiceActions' 'ServiceActions' - - $actions = $metaData.Actions | Where-Object { $null -eq $_.EntitySet } - - if ($actions.Length -gt 0) - { - $xmlWriter.WriteStartElement('StaticCmdlets') - - foreach ($action in $actions) - { - $xmlWriter = GenerateActionProxyCmdlet $xmlWriter $metaData $action '' $false $null $complexTypeMapping - } - - $xmlWriter.WriteEndElement() - } - - $xmlWriter.WriteStartElement('CmdletAdapterPrivateData') - $xmlWriter.WriteStartElement('Data') - $xmlWriter.WriteAttributeString('Name', 'Namespace') - $xmlWriter.WriteString("$($EntitySet.Namespace)") - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - - SaveCDXMLFooter $xmlWriter - - ProcessStreamHelper ($LocalizedData.VerboseSavedServiceActions -f $path) "Export-ODataEndpointProxy" $progressBarStatus 60 20 1 1 $path $callerPSCmdlet -} - -######################################################### -# GenerateModuleManifest is a helper function used -# to generate a wrapper module manifest file. The -# generated module manifest is persisted to the disk at -# the specified OutPutModule path. When the module -# manifest is imported, the following commands will -# be imported: -# 1. Get, Set, New & Remove proxy cmdlets. -# 2. If the server side Odata endpoint exposes complex -# types, then the corresponding client side proxy -# complex types imported. -# 3. Service Action proxy cmdlets. -######################################################### -function GenerateModuleManifest -{ - param - ( - [ODataUtils.Metadata] $metaData, - [String] $modulePath, - [string[]] $additionalModules, - [Hashtable] $resourceNameMapping, - [string] $progressBarStatus, - [System.Management.Automation.PSCmdlet] $callerPSCmdlet - ) - - if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateModuleManifest") } - if($null -eq $modulePath) { throw ($LocalizedData.ArguementNullError -f "ModulePath", "GenerateModuleManifest") } - if($null -eq $progressBarStatus) { throw ($LocalizedData.ArguementNullError -f "ProgressBarStatus", "GenerateModuleManifest") } - - $NestedModules = @() - foreach ($entitySet in $metaData.EntitySets) - { - $entitySetName = $entitySet.Name - if(($null -ne $resourceNameMapping) -and - $resourceNameMapping.ContainsKey($entitySetName)) - { - $entitySetName = $resourceNameMapping[$entitySetName] - } - else - { - $entitySetName = $entitySet.Type.Name - } - - $NestedModules += "$OutputModule\$($entitySetName).cdxml" - } - - New-ModuleManifest -Path $modulePath -NestedModules ($AdditionalModules + $NestedModules) - - ProcessStreamHelper ($LocalizedData.VerboseSavedModuleManifest -f $modulePath) "Export-ODataEndpointProxy" $progressBarStatus 80 20 1 1 $modulePath $callerPSCmdlet -} - -######################################################### -# GetBaseType is a helper function used to fetch the -# base type of the given type. -######################################################### -function GetBaseType -{ - param - ( - [System.Xml.XmlElement] $metadataEntityDefinition, - [ODataUtils.Metadata] $metaData - ) - - if ($null -ne $metadataEntityDefinition -and - $null -ne $metaData -and - $null -ne $metadataEntityDefinition.BaseType) - { - $baseType = $metaData.EntityTypes | Where-Object {$_.Namespace+"."+$_.Name -eq $metadataEntityDefinition.BaseType} - if ($null -eq $baseType) - { - $baseType = $metaData.ComplexTypes | Where-Object {$_.Namespace+"."+$_.Name -eq $metadataEntityDefinition.BaseType} - } - } - - if ($null -ne $baseType) - { - $baseType[0] - } -} - -######################################################### -# AddDerivedTypes is a helper function used to process -# derived types of a newly added type, that were -# previously waiting in the queue. -######################################################### -function AddDerivedTypes -{ - param - ( - [ODataUtils.EntityType] $baseType, - [Hashtable]$entityAndComplexTypesQueue, - [ODataUtils.Metadata] $metaData, - [string] $namespace - ) - - # $metaData is already validated at the cmdlet layer. - if($null -eq $baseType) { throw ($LocalizedData.ArguementNullError -f "BaseType", "AddDerivedTypes") } - if($null -eq $entityAndComplexTypesQueue) { throw ($LocalizedData.ArguementNullError -f "EntityAndComplexTypesQueue", "AddDerivedTypes") } - if($null -eq $namespace) { throw ($LocalizedData.ArguementNullError -f "Namespace", "AddDerivedTypes") } - - $baseTypeFullName = $baseType.Namespace + '.' + $baseType.Name - - if ($entityAndComplexTypesQueue.ContainsKey($baseTypeFullName)) - { - foreach ($type in $entityAndComplexTypesQueue[$baseTypeFullName]) - { - if ($type.type -eq 'EntityType') - { - $newType = ParseMetadataTypeDefinition ($type.value) $baseType $metaData $namespace $true - $metaData.EntityTypes += $newType - } - else - { - $newType = ParseMetadataTypeDefinition ($type.value) $baseType $metaData $namespace $false - $metaData.ComplexTypes += $newType - } - - AddDerivedTypes $newType $entityAndComplexTypesQueue $metaData $namespace - } - } -} - -######################################################### -# ParseMetadataTypeDefinition is a helper function used -# to parse types definitions element of metadata xml. -######################################################### -function ParseMetadataTypeDefinition -{ - param - ( - [Parameter(Mandatory=$true)] - [System.Xml.XmlElement] $metadataEntityDefinition, - [ODataUtils.EntityType] $baseType, - [ODataUtils.Metadata] $metaData, - [string] $namespace, - [bool] $isEntity - ) - - # $metaData is already validated at the cmdlet layer. - if($null -eq $metadataEntityDefinition) { throw ($LocalizedData.ArguementNullError -f "MetadataEntityDefinition", "ParseMetadataTypeDefinition") } - if($null -eq $namespace) { throw ($LocalizedData.ArguementNullError -f "Namespace", "ParseMetadataTypeDefinition") } - - $newEntityType = [ODataUtils.EntityType] @{ - "Namespace" = $namespace; - "Name" = $metadataEntityDefinition.Name; - "IsEntity" = $isEntity; - "BaseType" = $baseType; - } - - # properties defined on EntityType - $newEntityType.EntityProperties = $metadataEntityDefinition.Property | ForEach-Object { - if ($null -ne $_) - { - if ($null -ne $_.Nullable) - { - $newPropertyIsNullable = [System.Convert]::ToBoolean($_.Nullable) - } - else - { - $newPropertyIsNullable = $true - } - - [ODataUtils.TypeProperty] @{ - "Name" = $_.Name; - "TypeName" = $_.Type; - "IsNullable" = $newPropertyIsNullable; - } - } - } - - # navigation properties defined on EntityType - $newEntityType.NavigationProperties = $metadataEntityDefinition.NavigationProperty | ForEach-Object { - if ($null -ne $_) - { - ($AssociationNamespace, $AssociationName) = SplitNamespaceAndName $_.Relationship - [ODataUtils.NavigationProperty] @{ - "Name" = $_.Name; - "FromRole" = $_.FromRole; - "ToRole" = $_.ToRole; - "AssociationNamespace" = $AssociationNamespace; - "AssociationName" = $AssociationName; - } - } - } - - foreach ($entityTypeKey in $metadataEntityDefinition.Key.PropertyRef) - { - ((GetAllProperties $newEntityType) | Where-Object { $_.Name -eq $entityTypeKey.Name }).IsKey = $true - } - - $newEntityType -} - -######################################################### -# GetAllProperties is a helper function used to fetch -# the entity properties or navigation properties of -# the entity type as well as that of complete base -# type hierarchy. -######################################################### -function GetAllProperties -{ - param - ( - [ODataUtils.EntityType] $entityType, - [switch] $IncludeOnlyNavigationProperties - ) - - if($null -eq $entityType) { throw ($LocalizedData.ArguementNullError -f "EntityType", "GetAllProperties") } - - $requestedProperties = @() - - # Populate EntityType property from current EntityType as well - # as from the corresponding base types recursively if - # $IncludeOnlyNavigationProperties switch parameter is used then follow - # the same routine for navigation properties. - $currentEntityType = $entityType - while($null -ne $currentEntityType) - { - if($IncludeOnlyNavigationProperties.IsPresent) - { - $chosenProperties = $currentEntityType.NavigationProperties - } - else - { - $chosenProperties = $currentEntityType.EntityProperties - } - - $requestedProperties += $chosenProperties - $currentEntityType = $currentEntityType.BaseType - } - - return $requestedProperties -} - -######################################################### -# SplitNamespaceAndName is a helper function used -# to split Namespace and actual Name. -# e.g. "a.b.c" is namespace "a.b" and name "c" -######################################################### -function SplitNamespaceAndName -{ - param - ( - [string] $fullyQualifiedName - ) - - if($null -eq $fullyQualifiedName) { throw ($LocalizedData.ArguementNullError -f "FUllyQualifiedName", "SplitNamespaceAndName") } - - $sa = $fullyQualifiedName -split "(.*)\.(.*)" - - if ($sa.Length -gt 1) - { - # return Namespace - $sa[1] - - # return Name - $sa[2] - } - else - { - # return Namespace - "" - - # return Name - $sa[0] - } -} - -######################################################### -# GetEntitySetForEntityType is a helper function used -# to fetch EntitySet for a given EntityType by -# searching the inheritance hierarchy in the -# supplied metadata. -######################################################### -function GetEntitySetForEntityType -{ - param - ( - [ODataUtils.Metadata] $metaData, - [ODataUtils.EntityType] $entityType - ) - - # $metaData is already validated at the cmdlet layer. - if($null -eq $entityType) { throw ($LocalizedData.ArguementNullError -f "EntityType", "GetEntitySetForEntityType") } - - $result = $metaData.EntitySets | Where-Object { ($_.Type.Namespace -eq $entityType.Namespace) -and ($_.Type.Name -eq $entityType.Name) } - - if (($result.Count -eq 0) -and ($null -ne $entityType.BaseType)) - { - GetEntitySetForEntityType $metaData $entityType.BaseType - } - elseif ($result.Count -gt 1) - { - throw ($LocalizedData.WrongCountEntitySet -f (($entityType.Namespace + "." + $entityType.Name), $result.Count)) - } - - $result -} - -######################################################### -# ProcessStreamHelper is a helper function that performs -# the following utility tasks: -# 1. Writes verbose messages to the stream. -# 2. Writes FileInfo objects for the proxy modules -# saved to the disk. This is done to keep the user -# experience in consistent with Export-PSSession. -# 3. Updates progress bar. -######################################################### -function ProcessStreamHelper -{ - param - ( - [string] $verboseMessage, - [string] $progressBarActivityName, - [string] $status, - [double] $previousSegmentWeight, - [double] $currentSegmentWeight, - [int] $totalNumberofEntries, - [int] $currentEntryCount, - [string] $path, - [System.Management.Automation.PSCmdlet] $callerPSCmdlet - ) - - Write-Verbose -Message $verboseMessage - ProgressBarHelper $progressBarActivityName $status $previousSegmentWeight $currentSegmentWeight $totalNumberofEntries $currentEntryCount - $proxyFile = New-Object -TypeName System.IO.FileInfo -ArgumentList $path | Get-Item - if($null -ne $callerPSCmdlet) - { - $callerPSCmdlet.WriteObject($proxyFile) - } -} - -######################################################### -# GetAssociatedType is a helper function used -# to fetch associated instance's EntityType -# for a given Navigation property in the -# supplied metadata. -######################################################### -function GetAssociatedType -{ - param - ( - [ODataUtils.Metadata] $Metadata, - [ODataUtils.NavigationProperty] $navProperty - ) - - # $metaData is already validated at the cmdlet layer. - if($null -eq $navProperty) { throw ($LocalizedData.ArguementNullError -f "NavigationProperty", "GetAssociatedType") } - - $associationName = $navProperty.AssociationName - $association = $Metadata.Associations | Where-Object { $_.Name -eq $associationName } - $associationType = $association.Type - - if ($associationType.Count -lt 1) - { - throw ($LocalizedData.AssociationNotFound -f $associationName) - } - elseif ($associationType.Count -gt 1) - { - throw ($LocalizedData.TooManyMatchingAssociationTypes -f $associationType.Count, $associationName) - } - - if ($associationType.NavPropertyName1 -eq $navProperty.ToRole) - { - $associatedType = $associationType.EndType1 - } - elseif ($associationType.NavPropertyName2 -eq $navProperty.ToRole) - { - $associatedType = $associationType.EndType2 - } - else - { - throw ($LocalizedData.ZeroMatchingAssociationTypes -f $navProperty.ToRole, $association.Name) - } - - # return associated EntityType - $associatedType -} - -######################################################### -# AddParametersNode is a helper function used -# to add parameters to the generated proxy cmdlet, -# based on mandatoryProperties and otherProperties. -# PrefixForKeys is used by associations to append a -# prefix to PowerShell parameter name. -######################################################### -function AddParametersNode -{ - param - ( - [Parameter(Mandatory=$true)] - [System.Xml.XmlWriter] $xmlWriter, - [ODataUtils.TypeProperty[]] $keyProperties, - [ODataUtils.TypeProperty[]] $mandatoryProperties, - [ODataUtils.TypeProperty[]] $otherProperties, - [string] $prefixForKeys, - [boolean] $addForceParameter, - [boolean] $addParametersElement, - [Hashtable] $complexTypeMapping - ) - - if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "AddParametersNode") } - - if(($keyProperties.Length -gt 0) -or - ($mandatoryProperties.Length -gt 0) -or - ($otherProperties.Length -gt 0) -or - ($addForceParameter)) - { - if($addParametersElement) - { - $xmlWriter.WriteStartElement('Parameters') - } - - $pos = 0 - - if ($null -ne $keyProperties) - { - $pos = AddParametersCDXML $xmlWriter $keyProperties $pos $true $prefixForKeys ":Key" $complexTypeMapping - } - - if ($null -ne $mandatoryProperties) - { - $pos = AddParametersCDXML $xmlWriter $mandatoryProperties $pos $true $null $null $complexTypeMapping - } - - if ($null -ne $otherProperties) - { - $pos = AddParametersCDXML $xmlWriter $otherProperties $pos $false $null $null $complexTypeMapping - } - - if($addForceParameter) - { - $forceParameter = [ODataUtils.TypeProperty] @{ - "Name" = "Force"; - "TypeName" = "switch"; - "IsNullable" = $false - } - - $pos = AddParametersCDXML $xmlWriter $forceParameter $pos $false $null $null $complexTypeMapping - } - - if($addParametersElement) - { - $xmlWriter.WriteEndElement() - } - } -} - -######################################################### -# AddParametersNode is a helper function used -# to add Parameter node to CDXML based on properties. -# Prefix is appended to PS parameter names, used for -# associations. Suffix is appended to all parameter -# names, for ex. to differentiate keys. returns new $pos -######################################################### -function AddParametersCDXML -{ - param - ( - [Parameter(Mandatory=$true)] - [System.Xml.XmlWriter] $xmlWriter, - [ODataUtils.TypeProperty[]] $properties, - [Parameter(Mandatory=$true)] - [int] $pos, - [bool] $isMandatory, - [string] $prefix, - [string] $suffix, - [Hashtable] $complexTypeMapping - ) - - $properties | Where-Object { $null -ne $_ } | ForEach-Object { - $xmlWriter.WriteStartElement('Parameter') - $xmlWriter.WriteAttributeString('ParameterName', $_.Name + $suffix) - $xmlWriter.WriteStartElement('Type') - $PSTypeName = Convert-ODataTypeToCLRType $_.TypeName $complexTypeMapping - $xmlWriter.WriteAttributeString('PSType', $PSTypeName) - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('CmdletParameterMetadata') - $xmlWriter.WriteAttributeString('PSName', $prefix + $_.Name) - $xmlWriter.WriteAttributeString('IsMandatory', ($isMandatory).ToString().ToLowerInvariant()) - $xmlWriter.WriteAttributeString('Position', $pos) - if($isMandatory) - { - $xmlWriter.WriteAttributeString('ValueFromPipelineByPropertyName', 'true') - } - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - - $pos++ - } - - $pos -} - -######################################################### -# GenerateComplexTypeDefinition is a helper function used -# to generate complex type definition from the metadata. -######################################################### -function GenerateComplexTypeDefinition -{ - param - ( - [ODataUtils.Metadata] $metaData, - [string] $metaDataUri, - [string] $OutputModule, - [string] $typeDefinitionFileName, - [string] $cmdletAdapter, - [System.Management.Automation.PSCmdlet] $callerPSCmdlet - ) - - #metadataUri, $OutputModule & $cmdletAdapter are already validated at the cmdlet layer. - if($null -eq $typeDefinationFileName) { throw ($LocalizedData.ArguementNullError -f "TypeDefinationFileName", "GenerateComplexTypeDefination") } - if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateComplexTypeDefination") } - if($null -eq $callerPSCmdlet) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "GenerateComplexTypeDefination") } - - $Path = "$OutputModule\$typeDefinitionFileName" - - # We are currently generating classes for EntityType & ComplexType - # definition exposed in the metadata. - $typesToBeGenerated = $metaData.EntityTypes+$metadata.ComplexTypes - - if($null -ne $typesToBeGenerated -and $typesToBeGenerated.Count -gt 0) - { - $complexTypeMapping = @{} - $entityTypeNameSpaceMapping = @{} - - foreach ($entityType in $typesToBeGenerated) - { - if ($null -ne $entityType) - { - $entityTypeFullName = $entityType.Namespace + '.' + $entityType.Name - if(!$complexTypeMapping.ContainsKey($entityTypeFullName)) - { - $complexTypeMapping.Add($entityTypeFullName, $entityType.Name) - } - - if(!$entityTypeNameSpaceMapping.ContainsKey($entityType.Namespace)) - { - $entityTypes = @() - $entityTypeNameSpaceMapping.Add($entityType.Namespace, $entityTypes) - } - - $entityTypeNameSpaceMapping[$entityType.Namespace] += $entityType - } - } - - if($entityTypeNameSpaceMapping.Count -gt 0) - { -$output = @" -`$typeDefinitions = @" -using System; -using System.Management.Automation; - -"@ - - foreach($currentNameSpace in $entityTypeNameSpaceMapping.Keys) - { - $entityTypes = $entityTypeNameSpaceMapping[$currentNameSpace] - - $output += "`r`nnamespace $(ValidateComplexTypeIdentifier $currentNameSpace $true $metaDataUri $callerPSCmdlet)`r`n{" - - foreach ($entityType in $entityTypes) - { - $entityTypeFullName = (ValidateComplexTypeIdentifier $entityType.Namespace $true $metaDataUri $callerPSCmdlet) + '.' + $entityType.Name - Write-Verbose ($LocalizedData.VerboseAddingTypeDefinationToGeneratedModule -f $entityTypeFullName, "$OutputModule\$typeDefinationFileName") - - if($null -ne $entityType.BaseType) - { - $entityBaseFullName = (ValidateComplexTypeIdentifier $entityType.BaseType.Namespace $true $metaDataUri $callerPSCmdlet) + '.' + (ValidateComplexTypeIdentifier $entityType.BaseType.Name $false $metaDataUri $callerPSCmdlet) - $output += "`r`n public class $(ValidateComplexTypeIdentifier $entityType.Name $false $metaDataUri $callerPSCmdlet) : $($entityBaseFullName)`r`n {" - } - else - { - $output += "`r`n public class $(ValidateComplexTypeIdentifier $entityType.Name $false $metaDataUri $callerPSCmdlet)`r`n {" - } - - $properties = $null - - for($index = 0; $index -lt $entityType.EntityProperties.Count; $index++) - { - $property = $entityType.EntityProperties[$index] - $typeName = Convert-ODataTypeToCLRType $property.TypeName $complexTypeMapping - $properties += "`r`n public $typeName $(ValidateComplexTypeIdentifier $property.Name $false $metaDataUri $callerPSCmdlet);" - } - - # Navigation properties are treated like any other property for NetworkController scenario. - if ($cmdletAdapter -eq "NetworkControllerAdapter") - { - for($index = 0; $index -lt $entityType.NavigationProperties.Count; $index++) - { - $property = $entityType.NavigationProperties[$index] - $navigationTypeName = GetNavigationPropertyTypeName $property $metaData - $typeName = Convert-ODataTypeToCLRType $navigationTypeName $complexTypeMapping - $properties += "`r`n public $typeName $(ValidateComplexTypeIdentifier $property.Name $false $metaDataUri $callerPSCmdlet);" - } - } - - $output += $properties - $output += "`r`n }`r`n" - } - - $output += "}`r`n" - } - $output += """@`r`n" - - $output += "Add-Type -TypeDefinition `$typeDefinitions `r`n" - $output | Out-File -FilePath $Path - Write-Verbose ($LocalizedData.VerboseSavedTypeDefinationModule -f $typeDefinationFileName, $OutputModule) - } - } - - return $complexTypeMapping -} - -# Creating a single instance of CSharpCodeProvider that would be used -# for Identifier validation in the ValidateComplexTypeIdentifier helper method. -$cSharpCodeProvider = [Microsoft.CSharp.CSharpCodeProvider]::new() - -######################################################### -# ValidateComplexTypeIdentifier is a helper function to -# make sure that the type names defined in the -# metadata are valid C# Identifier names. This validation -# is performed to make sure that there are no security -# threat from importing the generated complex type -# (which is created using the metadata file). -# This method return the identifier name if its a -# valid identifier, else a terminating error in thrown. -######################################################### -function ValidateComplexTypeIdentifier -{ - param - ( - [string] $identifierName, - [bool] $isNameSpaceName, - [string] $metaDataUri, - [System.Management.Automation.PSCmdlet] $callerPSCmdlet - ) - - if($null -eq $callerPSCmdletl) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "ValidateComplexTypeIdentifier") } - - if($isNameSpaceName) - { - $independentIdentifiers = $identifierName.Split('.') - $result = $true - foreach($currentIdentifier in $independentIdentifiers) - { - if(![System.CodeDom.Compiler.CodeGenerator]::IsValidLanguageIndependentIdentifier($currentIdentifier)) - { - $result = $false - break - } - } - } - else - { - $result = $cSharpCodeProvider.IsValidIdentifier($identifierName) - } - - if(!$result) - { - $errorMessage = ($LocalizedData.InValidIdentifierInMetadata -f $metaDataUri, $identifierName) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidIdentifier" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidData) $null $identifierName - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - else - { - return $identifierName - } -} - -######################################################### -# GetKeys is a helper function used to -# return the keys for the entity if customUri -# is specified. -######################################################### -function GetKeys -{ - param - ( - [ODataUtils.EntitySet] $entitySet, - [string] $customUri, - [string] $actionName - ) - - # Get the original keys - $key = (GetAllProperties $entitySet.Type) | Where-Object { $_.IsKey } - - # Get the keys with delimiters - $keys = $customUri -split "/" | ForEach-Object { - if ($_ -match '{*}') - { - [ODataUtils.TypeProperty] @{ - "Name" = $_.Substring($_.IndexOf('{')+1,$_.IndexOf('}')-$_.IndexOf('{')-1); - "TypeName" = "Edm.String"; - "IsNullable" = $false; - "IsMandatory" = $true; - } - } - elseif ($_ -match '\[*\]') - { - if ($ActionName -eq 'Get') { - [ODataUtils.TypeProperty] @{ - "Name" = $_.Substring($_.IndexOf('[')+1,$_.IndexOf(']')-$_.IndexOf('[')-1); - "TypeName" = "Edm.String"; - "IsNullable" = $false; - "IsMandatory" = $false; - } - } - else { - [ODataUtils.TypeProperty] @{ - "Name" = $_.Substring($_.IndexOf('[')+1,$_.IndexOf(']')-$_.IndexOf('[')-1); - "TypeName" = "Edm.String"; - "IsNullable" = $false; - "IsMandatory" = $true; - } - } - } - } - - # Now combine the two keys and avoid duplication - # Make a list of names already present in the new keys - # Foreach old key check if that key is present in the new keyList - # Else add the key to new key list - $keyParams = $keys | ForEach-Object {$_.Name} - - if ($null -eq $keyParams -Or $keyParams.Count -eq 0) { - $keys = $key - } - else { - if ($keyParams.Count -eq 1) { - $keys = @($keys) - } - - $key | ForEach-Object { - if ($keyParams.Contains($_.Name) -eq $false) - { - $keys += $_ - } - } - } - - $keys -} - -######################################################### -# GetNetworkControllerAdditionalProperties is a helper -# function used to fetch network controller specific -# additional properties. -######################################################### -function GetNetworkControllerAdditionalProperties -{ - param - ( - $navigationProperties, - $metaData - ) - - # Additional properties contains the types present as navigation properties - - $additionalProperties = $navigationProperties | Where-Object { $null -ne $_ } | ForEach-Object { - $typeName = GetNavigationPropertyTypeName $_ $metaData - - if ($_.Name -eq "Properties") { - $isNullable = $false - } - else { - $isNullable = $true - } - - [ODataUtils.TypeProperty] @{ - "Name" = $_.Name; - "TypeName" = $typeName - "IsNullable" = $isNullable; - } - } - - # Add etag to the additionalProperties - - if ($null -ne $additionalProperties) - { - if ($additionalProperties.Count -eq 1) { - $additionalProperties = @($additionalProperties) - } - - $additionalProperties += [ODataUtils.TypeProperty] @{ - "Name" = "Etag"; - "TypeName" = "Edm.String"; - "IsNullable" = $true; - } - } - else - { - $additionalProperties = [ODataUtils.TypeProperty] @{ - "Name" = "Etag"; - "TypeName" = "Edm.String"; - "IsNullable" = $true; - } - } - - $additionalProperties -} - -######################################################### -# UpdateNetworkControllerSpecificProperties is a -# helper function used to append additionalProperties -# to nullable/nonNullable Properties. This is network controller -# specific logic. -######################################################### -function UpdateNetworkControllerSpecificProperties -{ - param - ( - $nullableProperties, - $additionalProperties, - $keyProperties, - $isNullable - ) - - if ($isNullable) { - $additionalProperties = $additionalProperties | Where-Object { $_.isNullable } - } - else { - $additionalProperties = $additionalProperties | Where-Object { -not $_.isNullable } - } - - if ($null -eq $nullableProperties) - { - $nullableProperties = $additionalProperties - } - else { - if ($nullableProperties.Count -eq 1) { - $nullableProperties = @($nullableProperties) - } - if ($null -ne $additionalProperties) { - $nullableProperties += $additionalProperties - } - } - - if ($null -ne $nullableProperties -And $null -ne $keyProperties) - { - if ($keyProperties.Count -eq 1) { - $keyProperties = @($keyProperties) - } - - $keys = $keyProperties | ForEach-Object {$_.Name} - - if ($keys.Count -eq 1) { - $keys = @($keys) - } - - $nullableProperties = $nullableProperties | Where-Object {$keys.Contains($_.Name) -eq $false} - } - - $nullableProperties -} - -######################################################### -# GetNavigationPropertyTypeName is a -# helper function used to fetch the type corresponding -# to navigation property in this metadata. This is -# network controller specific logic. -######################################################### -function GetNavigationPropertyTypeName -{ - param - ( - $navigationProperty, - $metaData - ) - - foreach($association in $metaData.Associations) - { - if ($association.Name -ne $navigationProperty.AssociationName -Or $association.Namespace -ne $navigationProperty.AssociationNamespace) - { - continue - } - - # Now get the type for this association - - if ($association.Type.NavPropertyName1 -eq $navigationProperty.Name) - { - $type = $association.Type.EndType1 - $multiplicity = $association.Type.Multiplicity1 - } - elseif ($associationType.NavPropertyName2 -eq $navigationProperty.Name) - { - $type = $association.Type.EndType2 - $multiplicity = $association.Type.Multiplicity2 - } - - break - } - - $fullName = $type.Namespace + '.' + $type.Name - - # Check the multiplicity and convert to array if needed - if ($multiplicity -eq "*") - { - $fullName = "Collection($fullName)" - } - - $fullName -} +Import-LocalizedData LocalizedData -FileName Microsoft.PowerShell.ODataUtilsStrings.psd1 + + +# Add .NET classes used by the module +Add-Type -TypeDefinition $global:BaseClassDefinitions + +######################################################### +# Generates PowerShell module containing client side +# proxy cmdlets that can be used to interact with an +# OData based server side endpoint. +######################################################### +function ExportODataEndpointProxy +{ + param + ( + [string] $Uri, + [string] $OutputModule, + [string] $MetadataUri, + [PSCredential] $Credential, + [string] $CreateRequestMethod, + [string] $UpdateRequestMethod, + [string] $CmdletAdapter, + [Hashtable] $ResourceNameMapping, + [switch] $Force, + [Hashtable] $CustomData, + [switch] $AllowClobber, + [switch] $AllowUnsecureConnection, + [Hashtable] $Headers, + [string] $ProgressBarStatus, + [System.Management.Automation.PSCmdlet] $PSCmdlet + ) + + [xml] $metadataXML = GetMetaData $MetadataUri $PSCmdlet $Credential $Headers + + [ODataUtils.Metadata] $metaData = ParseMetadata $metadataXML $MetadataUri $CmdletAdapter $PSCmdlet + + VerifyMetaData $MetadataUri $metaData $AllowClobber.IsPresent $PSCmdlet $progressBarStatus $CmdletAdapter $CustomData $ResourceNameMapping + + GenerateClientSideProxyModule $metaData $MetadataUri $Uri $OutputModule $CreateRequestMethod $UpdateRequestMethod $CmdletAdapter $ResourceNameMapping $CustomData $ProgressBarStatus $PSCmdlet +} + +######################################################### +# ParseMetaData is a helper function used to parse the +# metadata to convert it in to an object structure for +# further consumption during proxy generation. +######################################################### +function ParseMetaData +{ + param + ( + [xml] $metadataXml, + [string] $metaDataUri, + [string] $cmdletAdapter, + [System.Management.Automation.PSCmdlet] $callerPSCmdlet + ) + + # $metaDataUri is already validated at the cmdlet layer. + if($null -eq $callerPSCmdlet) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "ParseMetadata") } + + if($null -eq $metadataXml) + { + $errorMessage = ($LocalizedData.InValidXmlInMetadata -f $metaDataUri) + $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetadataUriFormat" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $metaDataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + + Write-Verbose $LocalizedData.VerboseParsingMetadata + + # Check the OData version in the fetched metadata to make sure that + # OData version (and hence the protocol) used in the metadata is + # supported by the adapter used for executing the generated + # proxy cmdlets. + if(($null -ne $metadataXML) -and ($null -ne $metadataXML.Edmx)) + { + if($null -eq $metadataXML.Edmx.Version) + { + $errorMessage = ($LocalizedData.ODataVersionNotFound -f $MetadataUri) + $exception = [System.InvalidOperationException]::new($errorMessage) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyODataVersionNotFound" $null ([System.Management.Automation.ErrorCategory]::InvalidData) $exception $MetadataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + + $metaDataVersion = New-Object -TypeName System.Version -ArgumentList @($metadataXML.Edmx.Version) + + # When we support plug-in model, We would have to fetch the + # $minSupportedVersionString & $maxSupportedVersionString + # from the plug-in instead of using an hardcoded value. + $minSupportedVersionString = '1.0' + $maxSupportedVersionString = '3.0' + $minSupportedVersion = New-Object -TypeName System.Version -ArgumentList @($minSupportedVersionString) + $maxSupportedVersion = New-Object -TypeName System.Version -ArgumentList @($maxSupportedVersionString) + + $minVersionComparisonResult = $minSupportedVersion.CompareTo($metaDataVersion) + $maxVersionComparisonResult = $maxSupportedVersion.CompareTo($metaDataVersion) + + if(-not($minVersionComparisonResult -lt $maxVersionComparisonResult)) + { + $errorMessage = ($LocalizedData.ODataVersionNotSupported -f $metadataXML.Edmx.Version, $MetadataUri, $minSupportedVersionString, $maxSupportedVersionString, $CmdletAdapter) + $exception = [System.NotSupportedException]::new($errorMessage) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyODataVersionNotSupported" $null ([System.Management.Automation.ErrorCategory]::InvalidData) $exception $MetadataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + } + else + { + $errorMessage = ($LocalizedData.InValidMetadata -f $MetadataUri) + $exception = [System.InvalidOperationException]::new($errorMessage) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetadata" $null ([System.Management.Automation.ErrorCategory]::InvalidData) $exception $MetadataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + + foreach ($schema in $MetadataXML.Edmx.DataServices.Schema) + { + if (($null -ne $schema) -and [string]::IsNullOrEmpty($schema.NameSpace )) + { + $callerPSCmdlet = $callerPSCmdlet -as [System.Management.Automation.PSCmdlet] + $errorMessage = ($LocalizedData.InValidSchemaNamespace -f $metaDataUri) + $exception = [System.InvalidOperationException]::new($errorMessage) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidSchemaNamespace" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $metaDataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + } + + $metaData = New-Object -TypeName ODataUtils.Metadata + + # this is a processing queue for those types that require base types that haven't been defined yet + $entityAndComplexTypesQueue = @{} + + foreach ($schema in $metadataXml.Edmx.DataServices.Schema) + { + if ($null -eq $schema) + { + Write-Error $LocalizedData.EmptySchema + continue + } + + if ($null -eq $metadata.Namespace) + { + $metaData.Namespace = $schema.Namespace + } + + foreach ($entityType in $schema.EntityType) + { + $baseType = $null + + if ($null -ne $entityType.BaseType) + { + # add it to the processing queue + $baseType = GetBaseType $entityType $metaData + if ($null -eq $baseType) + { + $entityAndComplexTypesQueue[$entityType.BaseType] += @(@{type='EntityType'; value=$entityType}) + continue + } + } + + [ODataUtils.EntityType] $newType = ParseMetadataTypeDefinition $entityType $baseType $metaData $schema.Namespace $true + $metaData.EntityTypes += $newType + AddDerivedTypes $newType $entityAndComplexTypesQueue $metaData $schema.Namespace + } + + foreach ($complexType in $schema.ComplexType) + { + $baseType = $null + + if ($null -ne $complexType.BaseType) + { + # add it to the processing queue + $baseType = GetBaseType $complexType $metaData + if ($null -eq $baseType) + { + $entityAndComplexTypesQueue[$entityType.BaseType] += @(@{type='ComplexType'; value=$complexType}) + continue + } + } + + [ODataUtils.EntityType] $newType = ParseMetadataTypeDefinition $complexType $baseType $metaData $schema.Namespace $false + $metaData.ComplexTypes += $newType + AddDerivedTypes $newType $entityAndComplexTypesQueue $metaData $schema.Namespace + } + } + + foreach ($schema in $metadataXml.Edmx.DataServices.Schema) + { + foreach ($entityContainer in $schema.EntityContainer) + { + if ($entityContainer.IsDefaultEntityContainer) + { + $metaData.DefaultEntityContainerName = $entityContainer.Name + } + + $entityTypeToEntitySetMapping = @{}; + foreach ($entitySet in $entityContainer.EntitySet) + { + $entityType = $metaData.EntityTypes | Where-Object { $_.Name -eq $entitySet.EntityType.Split('.')[-1] } + $entityTypeName = $entityType.Name + + if($entityTypeToEntitySetMapping.ContainsKey($entityTypeName)) + { + $existingEntitySetName = $entityTypeToEntitySetMapping[$entityTypeName] + + $errorMessage = ($LocalizedData.EntityNameConflictError -f $metaDataUri, $existingEntitySetName, $entitySet.Name, $entityTypeName) + $exception = [System.NotSupportedException]::new($errorMessage) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyEntityTypeMappingError" $null ([System.Management.Automation.ErrorCategory]::InvalidData) $exception $metaDataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + else + { + $entityTypeToEntitySetMapping.Add($entityTypeName, $entitySet.Name) + } + + $newEntitySet = [ODataUtils.EntitySet] @{ + "Namespace" = $schema.Namespace; + "Name" = $entitySet.Name; + "Type" = $entityType; + } + + $metaData.EntitySets += $newEntitySet + } + } + } + + foreach ($schema in $metadataXml.Edmx.DataServices.Schema) + { + foreach ($association in $schema.Association) + { + $newAssociationType = [ODataUtils.AssociationType] @{ + "Namespace" = $schema.Namespace; + "EndType1" = $metaData.EntityTypes | Where-Object { $_.Name -eq $association.End[0].Type.Split('.')[-1] }; + "NavPropertyName1" = $association.End[0].Role; + "Multiplicity1" = $association.End[0].Multiplicity; + + "EndType2" = $metaData.EntityTypes | Where-Object { $_.Name -eq $association.End[1].Type.Split('.')[-1] }; + "NavPropertyName2" = $association.End[1].Role; + "Multiplicity2" = $association.End[1].Multiplicity; + } + + $newAssociation = [ODataUtils.AssociationSet] @{ + "Namespace" = $schema.Namespace; + "Name" = $association.Name; + "Type" = $newAssociationType; + } + + $metaData.Associations += $newAssociation + } + } + + foreach ($schema in $metadataXml.Edmx.DataServices.Schema) + { + foreach ($action in $schema.EntityContainer.FunctionImport) + { + # HttpMethod is only used for legacy Service Operations + if ($null -eq $action.HttpMethod) + { + if ($null -ne $action.IsSideEffecting) + { + $isSideEffecting = $action.IsSideEffecting + } + else + { + $isSideEffecting = $true + } + + $newAction = [ODataUtils.Action] @{ + "Namespace" = $schema.Namespace; + "Verb" = $action.Name; + "IsSideEffecting" = $isSideEffecting; + "IsBindable" = $action.IsBindable; + # we don't care about IsAlwaysBindable, since we populate actions information from $metaData + # so we can't know the state of the entity + } + + # Actions are always SideEffecting, otherwise it's an OData function + if ($newAction.IsSideEffecting -ne $false) + { + foreach ($parameter in $action.Parameter) + { + if ($null -ne $parameter.Nullable) + { + $parameterIsNullable = [System.Convert]::ToBoolean($parameter.Nullable); + } + + $newParameter = [ODataUtils.TypeProperty] @{ + "Name" = $parameter.Name; + "TypeName" = $parameter.Type; + "IsNullable" = $parameterIsNullable + } + + $newAction.Parameters += $newParameter + } + + # IsBindable means it operates on Entity/ies + if ($newAction.IsBindable) + { + $regex = "Collection\((.+)\)" + + if ($newAction.Parameters[0].TypeName -match $regex) + { + # action operating on a collection of entities + $insideTypeName = Convert-ODataTypeToCLRType $Matches[1] + + $newAction.EntitySet = $metaData.EntitySets | Where-Object { ($_.Type.Namespace + "." + $_.Type.Name) -eq $insideTypeName } + $newAction.IsSingleInstance = $false + } + else + { + # actions operating on a single instance + $newAction.EntitySet = $metaData.EntitySets | Where-Object { ($_.Type.Namespace + "." + $_.Type.Name) -eq $newAction.Parameters[0].TypeName } + + $newAction.IsSingleInstance = $true + } + } + + $metaData.Actions += $newAction + } + } + } + } + + $metaData +} + +######################################################### +# VerifyMetaData is a helper function used to validate +# the processed metadata to make sure client side proxy +# can be created for the supplied metadata. +######################################################### +function VerifyMetaData +{ + param + ( + [string] $metaDataUri, + [ODataUtils.Metadata] $metaData, + [boolean] $allowClobber, + [System.Management.Automation.PSCmdlet] $callerPSCmdlet, + [string] $progressBarStatus, + [string] $cmdletAdapter, + [Hashtable] $customData, + [Hashtable] $resourceNameMapping + ) + + # $metaDataUri & $cmdletAdapter is already validated at the cmdlet layer. + if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "VerifyMetaData") } + if($null -eq $callerPSCmdlet) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "VerifyMetaData") } + if($null -eq $progressBarStatus) { throw ($LocalizedData.ArguementNullError -f "ProgressBarStatus", "VerifyMetaData") } + + Write-Verbose $LocalizedData.VerboseVerifyingMetadata + + if ($metadata.EntitySets.Count -le 0) + { + $errorMessage = ($LocalizedData.NoEntitySets -f $metaDataUri) + $exception = [System.InvalidOperationException]::new($errorMessage) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetaDataUri" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $metaDataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + + if ($metadata.EntityTypes.Count -le 0) + { + $errorMessage = ($LocalizedData.NoEntityTypes -f $metaDataUri) + $exception = [System.InvalidOperationException]::new($errorMessage) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetaDataUri" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $metaDataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + + # All the generated proxy cmdlets would have the following parameters added. + # The ODataAdapter has the default implementation on how to handle the + # scenario when these parameters are used during proxy invocations. + # The default implementation can be overridden using adapter derivation model. + $reservedProperties = @("Filter", "IncludeTotalResponseCount", "OrderBy", "Select", "Skip", "Top", "ConnectionUri", "CertificateThumbprint", "Credential") + $validEntitySets = @() + $sessionCommands = Get-Command -All + + foreach ($entitySet in $metaData.EntitySets) + { + if ($null -eq $entitySet.Type) + { + $errorMessage = ($LocalizedData.EntitySetUndefinedType -f $metaDataUri, $entitySet.Name) + $exception = [System.InvalidOperationException]::new($errorMessage) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetaDataUri" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $metaDataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + + if ($cmdletAdapter -eq "NetworkControllerAdapter" -And $customData -And $customData.Contains($entitySet.Name) -eq $false) + { + continue + } + + $hasConflictingProperty = $false + $hasConflictingCommand = $false + + $entityAndNavigationProperties = (GetAllProperties $entitySet.Type) + (GetAllProperties $entitySet.Type -IncludeOnlyNavigationProperties) + foreach($entityProperty in $entityAndNavigationProperties) + { + if($reservedProperties.Contains($entityProperty.Name)) + { + $hasConflictingProperty = $true + if(!$allowClobber) + { + # Write Error message and skip current Entity Set. + $errorMessage = ($LocalizedData.SkipEntitySetProxyCreation -f $entitySet.Name, $entitySet.Type.Name, $entityProperty.Name) + $exception = [System.InvalidOperationException]::new($errorMessage) + $errorRecord = CreateErrorRecordHelper "ODataEndpointDefaultPropertyCollision" $null ([System.Management.Automation.ErrorCategory]::InvalidOperation) $exception $metaDataUri + $callerPSCmdlet.WriteError($errorRecord) + } + else + { + $warningMessage = ($LocalizedData.EntitySetProxyCreationWithWarning -f $entitySet.Name, $entityProperty.Name, $entitySet.Type.Name) + $callerPSCmdlet.WriteWarning($warningMessage) + } + } + } + + foreach($currentCommand in $sessionCommands) + { + # The generated command Noun can be set using ResourceNameMapping + $generatedCommandName = $entitySet.Name + if ($resourceNameMapping -And $resourceNameMapping.Contains($entitySet.Name)) { + $generatedCommandName = $resourceNameMapping[$entitySet.Name] + } + + if(($null -ne $currentCommand.Noun -and $currentCommand.Noun -eq $generatedCommandName) -and + ($currentCommand.Verb -eq "Get" -or + $currentCommand.Verb -eq "Set" -or + $currentCommand.Verb -eq "New" -or + $currentCommand.Verb -eq "Remove")) + { + $hasConflictingCommand = $true + VerifyMetadataHelper $LocalizedData.SkipEntitySetConflictCommandCreation ` + $LocalizedData.EntitySetConflictCommandCreationWithWarning ` + $entitySet.Name $currentCommand.Name $metaDataUri $allowClobber $callerPSCmdlet + } + } + + foreach($currentAction in $metaData.Actions) + { + $actionCommand = "Invoke-" + "$($entitySet.Name)$($currentAction.Verb)" + + foreach($currentCommand in $sessionCommands) + { + if($actionCommand -eq $currentCommand.Name) + { + $hasConflictingCommand = $true + VerifyMetadataHelper $LocalizedData.SkipEntitySetConflictCommandCreation ` + $LocalizedData.EntitySetConflictCommandCreationWithWarning $entitySet.Name ` + $currentCommand.Name $metaDataUri $allowClobber $callerPSCmdlet + } + } + } + + if(!($hasConflictingProperty -or $hasConflictingCommand)-or $allowClobber) + { + $validEntitySets += $entitySet + } + } + + if ($cmdletAdapter -ne "NetworkControllerAdapter") { + + $metaData.EntitySets = $validEntitySets + + $validServiceActions = @() + $hasConflictingServiceActionCommand = $true + foreach($currentAction in $metaData.Actions) + { + $serviceActionCommand = "Invoke-" + "$($currentAction.Verb)" + + foreach($currentCommand in $sessionCommands) + { + if($serviceActionCommand -eq $currentCommand.Name) + { + $hasConflictingServiceActionCommand = $true + VerifyMetadataHelper $LocalizedData.SkipConflictServiceActionCommandCreation ` + $LocalizedData.ConflictServiceActionCommandCreationWithWarning $entitySet.Name ` + $currentCommand.Name $metaDataUri $allowClobber $callerPSCmdlet + } + } + + if(!$hasConflictingServiceActionCommand -or $allowClobber) + { + $validServiceActions += $currentAction + } + } + + $metaData.Actions = $validServiceActions + } + + # Update Progress bar. + ProgressBarHelper "Export-ODataEndpointProxy" $progressBarStatus 5 20 1 1 +} + +######################################################### +# GenerateClientSideProxyModule is a helper function used +# to generate a PowerShell module that serves as a client +# side proxy for interacting with the server side +# OData endpoint. The proxy module contains proxy cmdlets +# implemented in CDXML modules and they are exposed +# through module manifest as nested modules. +# One CDXML module is created for each EntitySet +# described in the metadata. Each CDXML module contains +# CRUD & Service Action specific proxy cmdlets targeting +# the underlying EntityType. There is 1:M mapping between +# EntitySet & its underlying EntityTypes (i.e., all +# entities with in the single EntitySet will be of the +# same EntityType but there can be multiple entities +# of the same type with in an EntitySet). +######################################################### +function GenerateClientSideProxyModule +{ + param + ( + [ODataUtils.Metadata] $metaData, + [string] $metaDataUri, + [string] $uri, + [string] $outputModule, + [string] $createRequestMethod, + [string] $updateRequestMethod, + [string] $cmdletAdapter, + [Hashtable] $resourceNameMapping, + [Hashtable] $customData, + [string] $progressBarStatus, + [System.Management.Automation.PSCmdlet] $callerPSCmdlet + ) + + # $uri, $outputModule, $metaDataUri, $createRequestMethod, $updateRequestMethod, & $cmdletAdapter is already validated at the cmdlet layer. + if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateClientSideProxyModule") } + if($null -eq $callerPSCmdlet) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "GenerateClientSideProxyModule") } + if($null -eq $progressBarStatus) { throw ($LocalizedData.ArguementNullError -f "ProgressBarStatus", "GenerateClientSideProxyModule") } + + # This function performs the following set of tasks + # while creating the client side proxy module: + # 1. If the server side endpoint exposes complex types, + # the client side proxy complex types are created + # as C# class in ComplexTypeDefinitions.psm1 + # 2. Creates proxy cmdlets for CRUD operations. + # 3. Creates proxy cmdlets for Service action operations. + # 4. Creates module manifest. + + Write-Verbose ($LocalizedData.VerboseSavingModule -f $outputModule) + + $typeDefinitionFileName = "ComplexTypeDefinitions.psm1" + $complexTypeMapping = GenerateComplexTypeDefinition $metaData $metaDataUri $outputModule $typeDefinitionFileName $cmdletAdapter $callerPSCmdlet + + ProgressBarHelper "Export-ODataEndpointProxy" $progressBarStatus 20 20 1 1 + + $complexTypeFileDefinitionPath = Join-Path -Path $outputModule -ChildPath $typeDefinitionFileName + + if(Test-Path -Path $complexTypeFileDefinitionPath) + { + $proxyFile = New-Object -TypeName System.IO.FileInfo -ArgumentList $complexTypeFileDefinitionPath | Get-Item + if($null -ne $callerPSCmdlet) + { + $callerPSCmdlet.WriteObject($proxyFile) + } + } + + $currentEntryCount = 0 + foreach ($entitySet in $metaData.EntitySets) + { + $currentEntryCount += 1 + if ($cmdletAdapter -eq "NetworkControllerAdapter" -And $customData -And $customData.Contains($entitySet.Name) -eq $false) + { + ProgressBarHelper "Export-ODataEndpointProxy" $progressBarStatus 40 20 $metaData.EntitySets.Count $currentEntryCount + continue + } + + GenerateCRUDProxyCmdlet $entitySet $metaData $uri $outputModule $createRequestMethod $updateRequestMethod $cmdletAdapter $resourceNameMapping $customData $complexTypeMapping "Export-ODataEndpointProxy" $progressBarStatus 40 20 $metaData.EntitySets.Count $currentEntryCount $callerPSCmdlet + } + + GenerateServiceActionProxyCmdlet $metaData $uri "$outputModule\ServiceActions.cdxml" $complexTypeMapping $progressBarStatus $callerPSCmdlet + + $moduleDirInfo = [System.IO.DirectoryInfo]::new($outputModule) + $moduleManifestName = $moduleDirInfo.Name + ".psd1" + GenerateModuleManifest $metaData $outputModule\$moduleManifestName @($typeDefinitionFileName, 'ServiceActions.cdxml') $resourceNameMapping $progressBarStatus $callerPSCmdlet +} + +######################################################### +# GenerateCRUDProxyCmdlet is a helper function used +# to generate Get, Set, New & Remove proxy cmdlet. +# The proxy cmdlet is generated in the CDXML +# compliant format. +######################################################### +function GenerateCRUDProxyCmdlet +{ + param + ( + [ODataUtils.EntitySet] $entitySet, + [ODataUtils.Metadata] $metaData, + [string] $uri, + [string] $outputModule, + [string] $createRequestMethod, + [string] $UpdateRequestMethod, + [string] $cmdletAdapter, + [Hashtable] $resourceNameMapping, + [Hashtable] $customData, + [Hashtable] $complexTypeMapping, + [string] $progressBarActivityName, + [string] $progressBarStatus, + [double] $previousSegmentWeight, + [double] $currentSegmentWeight, + [int] $totalNumberofEntries, + [int] $currentEntryCount, + [System.Management.Automation.PSCmdlet] $callerPSCmdlet + ) + + # $uri, $outputModule, $metaDataUri, $createRequestMethod, $updateRequestMethod, & $cmdletAdapter is already validated at the cmdlet layer. + if($null -eq $entitySet) { throw ($LocalizedData.ArguementNullError -f "EntitySet", "GenerateClientSideProxyModule") } + if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateClientSideProxyModule") } + if($null -eq $callerPSCmdlet) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "GenerateClientSideProxyModule") } + if($null -eq $progressBarStatus) { throw ($LocalizedData.ArguementNullError -f "ProgressBarStatus", "GenerateClientSideProxyModule") } + + $entitySetName = $entitySet.Name + if(($null -ne $resourceNameMapping) -and + $resourceNameMapping.ContainsKey($entitySetName)) + { + $entitySetName = $resourceNameMapping[$entitySetName] + } + else + { + $entitySetName = $entitySet.Type.Name + } + + $Path = "$OutputModule\$entitySetName.cdxml" + + $xmlWriter = New-Object System.XMl.XmlTextWriter($Path,$Null) + + if ($null -eq $xmlWriter) + { + throw ($LocalizedData.XmlWriterInitializationError -f $entitySet.Name) + } + + $xmlWriter = SaveCDXMLHeader $xmlWriter $uri $entitySet.Name $entitySetName $cmdletAdapter + + # Get the keys depending on whether the url contains variables or not + if ($CmdletAdapter -ne "NetworkControllerAdapter") + { + $keys = (GetAllProperties $entitySet.Type) | Where-Object { $_.IsKey } + } + else + { + $name = $entitySet.Name + $keys = GetKeys $entitySet $customData.$name 'Get' + } + + $navigationProperties = GetAllProperties $entitySet.Type -IncludeOnlyNavigationProperties + + GenerateGetProxyCmdlet $xmlWriter $metaData $keys $navigationProperties $cmdletAdapter $complexTypeMapping + + $nonKeyProperties = (GetAllProperties $entitySet.Type) | Where-Object { -not $_.isKey } + $nullableProperties = $nonKeyProperties | Where-Object { $_.isNullable } + $nonNullableProperties = $nonKeyProperties | Where-Object { -not $_.isNullable } + + $xmlWriter.WriteStartElement('StaticCmdlets') + + $keyProperties = $keys + + # Do operations specifically needed for NetworkController cmdlets + if ($CmdletAdapter -eq "NetworkControllerAdapter") + { + $keyProperties = GetKeys $entitySet $customData.$name 'New' + $additionalProperties = GetNetworkControllerAdditionalProperties $navigationProperties $metaData + $nullableProperties = UpdateNetworkControllerSpecificProperties $nullableProperties $additionalProperties $keyProperties $true + $nonNullableProperties = UpdateNetworkControllerSpecificProperties $nonNullableProperties $additionalProperties $keyProperties $false + } + + GenerateNewProxyCmdlet $xmlWriter $metaData $keyProperties $nonNullableProperties $nullableProperties $navigationProperties $cmdletAdapter $complexTypeMapping + + if ($CmdletAdapter -ne "NetworkControllerAdapter") + { + GenerateSetProxyCmdlet $xmlWriter $keyProperties $nonKeyProperties $complexTypeMapping + } + + if ($CmdletAdapter -eq "NetworkControllerAdapter") + { + $keyProperties = GetKeys $entitySet $customData.$name 'Remove' + } + + GenerateRemoveProxyCmdlet $xmlWriter $metaData $keyProperties $navigationProperties $cmdletAdapter $complexTypeMapping + + $entityActions = $metaData.Actions | Where-Object { ($_.EntitySet.Namespace -eq $entitySet.Namespace) -and ($_.EntitySet.Name -eq $entitySet.Name) } + + if ($entityActions.Length -gt 0) + { + foreach($action in $entityActions) + { + $xmlWriter = GenerateActionProxyCmdlet $xmlWriter $metaData $action $entitySet.Name $true $keys $complexTypeMapping + } + } + + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('CmdletAdapterPrivateData') + + $xmlWriter.WriteStartElement('Data') + $xmlWriter.WriteAttributeString('Name', 'EntityTypeName') + $xmlWriter.WriteString("$($entitySet.Type.Namespace).$($entitySet.Type.Name)") + $xmlWriter.WriteEndElement() + $xmlWriter.WriteStartElement('Data') + $xmlWriter.WriteAttributeString('Name', 'EntitySetName') + $xmlWriter.WriteString("$($entitySet.Namespace).$($entitySet.Name)") + $xmlWriter.WriteEndElement() + + # Add the customUri to privateData + if ($CmdletAdapter -eq "NetworkControllerAdapter") + { + $xmlWriter.WriteStartElement('Data') + $xmlWriter.WriteAttributeString('Name', "CustomUriSuffix") + $xmlWriter.WriteString($CustomData.$name) + $xmlWriter.WriteEndElement() + } + + # Add CreateRequestMethod and UpdateRequestMethod to privateData + $xmlWriter.WriteStartElement('Data') + $xmlWriter.WriteAttributeString('Name', 'CreateRequestMethod') + $xmlWriter.WriteString("$CreateRequestMethod") + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('Data') + $xmlWriter.WriteAttributeString('Name', 'UpdateRequestMethod') + $xmlWriter.WriteString("$UpdateRequestMethod") + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteEndElement() + + SaveCDXMLFooter $xmlWriter + + ProcessStreamHelper ($LocalizedData.VerboseSavedCDXML -f $($entitySetName), $Path) $progressBarActivityName $progressBarStatus $previousSegmentWeight $currentSegmentWeight $totalNumberofEntries $currentEntryCount $Path $callerPSCmdlet +} + +######################################################### +# GenerateGetProxyCmdlet is a helper function used +# to generate Get-* proxy cmdlet. The proxy cmdlet is +# generated in the CDXML compliant format. +######################################################### +function GenerateGetProxyCmdlet +{ + param + ( + [System.XMl.XmlTextWriter] $xmlWriter, + [ODataUtils.Metadata] $metaData, + [object[]] $keys, + [object[]] $navigationProperties, + [string] $cmdletAdapter, + [Hashtable] $complexTypeMapping + ) + + # $cmdletAdapter is already validated at the cmdlet layer. + if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "GenerateGetProxyCmdlet") } + if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateGetProxyCmdlet") } + + $xmlWriter.WriteStartElement('InstanceCmdlets') + $xmlWriter.WriteStartElement('GetCmdletParameters') + $xmlWriter.WriteAttributeString('DefaultCmdletParameterSet', 'Default') + + # adding key parameters and association parameters to QueryableProperties, each in a different parameter set + # to be used by GET cmdlet + if (($null -ne $keys -and $keys.Length -gt 0) -or (($null -ne $navigationProperties -and $navigationProperties.Length -gt 0) -and $cmdletAdapter -ne "NetworkControllerAdapter")) + { + $xmlWriter.WriteStartElement('QueryableProperties') + $position = 0 + + $keys | Where-Object { $null -ne $_ } | ForEach-Object { + $xmlWriter.WriteStartElement('Property') + $xmlWriter.WriteAttributeString('PropertyName', $_.Name) + + $xmlWriter.WriteStartElement('Type') + $PSTypeName = Convert-ODataTypeToCLRType $_.TypeName $complexTypeMapping + $xmlWriter.WriteAttributeString('PSType', $PSTypeName) + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('RegularQuery') + $xmlWriter.WriteStartElement('CmdletParameterMetadata') + $xmlWriter.WriteAttributeString('PSName', $_.Name) + $xmlWriter.WriteAttributeString('CmdletParameterSets', 'Default') + $xmlWriter.WriteAttributeString('IsMandatory', $_.IsMandatory.ToString().ToLower()) + $xmlWriter.WriteAttributeString('Position', $position) + if($_.IsMandatory) + { + $xmlWriter.WriteAttributeString('ValueFromPipelineByPropertyName', 'true') + } + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + + $position++ + } + + # This behaviour is different for NetworkController specific cmdlets. + if ($CmdletAdapter -ne "NetworkControllerAdapter") + { + $navigationProperties | Where-Object { $null -ne $_ } | ForEach-Object { + $associatedType = GetAssociatedType $metaData $_ + $associatedEntitySet = GetEntitySetForEntityType $metaData $associatedType + $nvgProperty = $_ + + (GetAllProperties $associatedType) | Where-Object { $_.IsKey } | ForEach-Object { + $xmlWriter.WriteStartElement('Property') + $xmlWriter.WriteAttributeString('PropertyName', $associatedEntitySet.Name + ':' + $_.Name + ':Key') + + $xmlWriter.WriteStartElement('Type') + $PSTypeName = Convert-ODataTypeToCLRType $_.TypeName $complexTypeMapping + $xmlWriter.WriteAttributeString('PSType', $PSTypeName) + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('RegularQuery') + $xmlWriter.WriteStartElement('CmdletParameterMetadata') + $xmlWriter.WriteAttributeString('PSName', 'Associated' + $nvgProperty.Name + $_.Name) + $xmlWriter.WriteAttributeString('CmdletParameterSets', $nvgProperty.AssociationName) + $xmlWriter.WriteAttributeString('IsMandatory', 'true') + $xmlWriter.WriteAttributeString('ValueFromPipelineByPropertyName', 'true') + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + } + } + + + # Add Query Parameters (i.e., Top, Skip, OrderBy, Filter) to the generated Get-* cmdlets. + $queryParameters = + @{ + "Filter" = "Edm.String"; + "IncludeTotalResponseCount" = "switch"; + "OrderBy" = "Edm.String"; + "Select" = "Edm.String"; + "Skip" = "Edm.Int32"; + "Top" = "Edm.Int32"; + } + + foreach($currentQueryParameter in $queryParameters.Keys) + { + $xmlWriter.WriteStartElement('Property') + $xmlWriter.WriteAttributeString('PropertyName', "QueryOption:" + $currentQueryParameter) + $xmlWriter.WriteStartElement('Type') + $PSTypeName = Convert-ODataTypeToCLRType $queryParameters[$currentQueryParameter] + $xmlWriter.WriteAttributeString('PSType', $PSTypeName) + $xmlWriter.WriteEndElement() + $xmlWriter.WriteStartElement('RegularQuery') + $xmlWriter.WriteStartElement('CmdletParameterMetadata') + $xmlWriter.WriteAttributeString('PSName', $currentQueryParameter) + + if($queryParameters[$currentQueryParameter] -eq "Edm.String") + { + $xmlWriter.WriteStartElement('ValidateNotNullOrEmpty') + $xmlWriter.WriteEndElement() + } + + if($queryParameters[$currentQueryParameter] -eq "Edm.Int32") + { + $minValue = 1 + # For Skip Query parameter we want to support 0 as the + # minimum skip value in order to support client side paging. + if($currentQueryParameter -eq 'Skip') + { + $minValue = 0 + } + $xmlWriter.WriteStartElement('ValidateRange') + $xmlWriter.WriteAttributeString('Min', $minValue) + $xmlWriter.WriteAttributeString('Max', [int]::MaxValue) + $xmlWriter.WriteEndElement() + } + + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + } + } + + $xmlWriter.WriteEndElement() + } + + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('GetCmdlet') + $xmlWriter.WriteStartElement('CmdletMetadata') + $xmlWriter.WriteAttributeString('Verb', 'Get') + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteEndElement() +} + +######################################################### +# GenerateNewProxyCmdlet is a helper function used +# to generate New-* proxy cmdlet. The proxy cmdlet is +# generated in the CDXML compliant format. +######################################################### +function GenerateNewProxyCmdlet +{ + param + ( + [System.XMl.XmlTextWriter] $xmlWriter, + [ODataUtils.Metadata] $metaData, + [object[]] $keyProperties, + [object[]] $nonNullableProperties, + [object[]] $nullableProperties, + [object[]] $navigationProperties, + [string] $cmdletAdapter, + [Hashtable] $complexTypeMapping + ) + + # $cmdletAdapter is already validated at the cmdlet layer. + if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "GenerateNewProxyCmdlet") } + if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateNewProxyCmdlet") } + + $xmlWriter.WriteStartElement('Cmdlet') + $xmlWriter.WriteStartElement('CmdletMetadata') + $xmlWriter.WriteAttributeString('Verb', 'New') + $xmlWriter.WriteAttributeString('DefaultCmdletParameterSet', 'Default') + $xmlWriter.WriteAttributeString('ConfirmImpact', 'Medium') + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('Method') + $xmlWriter.WriteAttributeString('MethodName', 'Create') + $xmlWriter.WriteAttributeString('CmdletParameterSet', 'Default') + + AddParametersNode $xmlWriter $keyProperties $nonNullableProperties $nullableProperties $null $true $true $complexTypeMapping + $xmlWriter.WriteEndElement() + + # This behaviour is different for NetworkControllerCmdlets + if ($CmdletAdapter -ne "NetworkControllerAdapter") + { + $navigationProperties | Where-Object { $null -ne $_ } | ForEach-Object { + $associatedType = GetAssociatedType $metaData $_ + $associatedEntitySet = GetEntitySetForEntityType $metaData $associatedType + + $xmlWriter.WriteStartElement('Method') + $xmlWriter.WriteAttributeString('MethodName', "Association:Create:$($associatedEntitySet.Name)") + $xmlWriter.WriteAttributeString('CmdletParameterSet', $_.Name) + + $associatedKeys = ((GetAllProperties $associatedType) | Where-Object { $_.isKey }) + + AddParametersNode $xmlWriter $associatedKeys $keyProperties $null "Associated$($_.Name)" $true $true $complexTypeMapping + $xmlWriter.WriteEndElement() + } + } + + $xmlWriter.WriteEndElement() +} + +######################################################### +# GenerateRemoveProxyCmdlet is a helper function used +# to generate Remove-* proxy cmdlet. The proxy cmdlet is +# generated in the CDXML compliant format. +######################################################### +function GenerateRemoveProxyCmdlet +{ + param + ( + + [System.XMl.XmlTextWriter] $xmlWriter, + [ODataUtils.Metadata] $metaData, + [object[]] $keyProperties, + [object[]] $navigationProperties, + [string] $cmdletAdapter, + [Hashtable] $complexTypeMapping + ) + + # $metaData, $cmdletAdapter & $cmdletAdapter are already validated at the cmdlet layer. + if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "GenerateRemoveProxyCmdlet") } + if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateRemoveProxyCmdlet") } + + $xmlWriter.WriteStartElement('Cmdlet') + $xmlWriter.WriteStartElement('CmdletMetadata') + $xmlWriter.WriteAttributeString('Verb', 'Remove') + $xmlWriter.WriteAttributeString('DefaultCmdletParameterSet', 'Default') + $xmlWriter.WriteAttributeString('ConfirmImpact', 'Medium') + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('Method') + $xmlWriter.WriteAttributeString('MethodName', 'Delete') + $xmlWriter.WriteAttributeString('CmdletParameterSet', 'Default') + + # This behaviour is different for NetworkControllerCmdlets + if ($CmdletAdapter -eq "NetworkControllerAdapter") + { + # Add etag for NetworkControllerCmdlets + $otherProperties = @([ODataUtils.TypeProperty] @{ + "Name" = "Etag"; + "TypeName" = "Edm.String"; + "IsNullable" = $true; + }) + + AddParametersNode $xmlWriter $keyProperties $null $otherProperties $null $true $true $complexTypeMapping + } + else + { + AddParametersNode $xmlWriter $keyProperties $null $null $null $true $true $complexTypeMapping + } + + $xmlWriter.WriteEndElement() + + # This behaviour is different for NetworkControllerCmdlets + if ($CmdletAdapter -ne "NetworkControllerAdapter") + { + $navigationProperties | Where-Object { $null -ne $_ } | ForEach-Object { + + $associatedType = GetAssociatedType $metaData $_ + $associatedEntitySet = GetEntitySetForEntityType $metaData $associatedType + + $xmlWriter.WriteStartElement('Method') + $xmlWriter.WriteAttributeString('MethodName', "Association:Delete:$($associatedEntitySet.Name)") + $xmlWriter.WriteAttributeString('CmdletParameterSet', $_.Name) + + $associatedType = GetAssociatedType $metaData $_ + $associatedKeys = ((GetAllProperties $associatedType) | Where-Object { $_.isKey }) + + AddParametersNode $xmlWriter $associatedKeys $keyProperties $null "Associated$($_.Name)" $true $true $complexTypeMapping + $xmlWriter.WriteEndElement() + } + } + $xmlWriter.WriteEndElement() +} + +######################################################### +# GenerateActionProxyCmdlet is a helper function used +# to generate Invoke-* proxy cmdlet. These proxy cmdlets +# support Instance/Service level actions. They are +# generated in the CDXML compliant format. +######################################################### +function GenerateActionProxyCmdlet +{ + param + ( + [System.Xml.XmlWriter] $xmlWriter, + [ODataUtils.Metadata] $metaData, + [ODataUtils.Action] $action, + [string] $noun, + [bool] $isInstanceAction, + [ODataUtils.TypeProperty] $keys, + [Hashtable] $complexTypeMapping + ) + + # $metaData is already validated at the cmdlet layer. + if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "GenerateActionProxyCmdlet") } + if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateActionProxyCmdlet") } + if($null -eq $action) { throw ($LocalizedData.ArguementNullError -f "Action", "GenerateActionProxyCmdlet") } + if($null -eq $noun) { throw ($LocalizedData.ArguementNullError -f "Noun", "GenerateActionProxyCmdlet") } + + $xmlWriter.WriteStartElement('Cmdlet') + + $xmlWriter.WriteStartElement('CmdletMetadata') + $xmlWriter.WriteAttributeString('Verb', 'Invoke') + $xmlWriter.WriteAttributeString('Noun', "$($noun)$($action.Verb)") + $xmlWriter.WriteAttributeString('ConfirmImpact', 'Medium') + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('Method') + $xmlWriter.WriteAttributeString('MethodName', "Action:$($action.Verb):$($action.EntitySet.Name)") + + $xmlWriter.WriteStartElement('Parameters') + + $keys | Where-Object { $null -ne $_ } | ForEach-Object { + $xmlWriter.WriteStartElement('Parameter') + $xmlWriter.WriteAttributeString('ParameterName', $_.Name + ':Key') + + $xmlWriter.WriteStartElement('Type') + $PSTypeName = Convert-ODataTypeToCLRType $_.TypeName $complexTypeMapping + $xmlWriter.WriteAttributeString('PSType', $PSTypeName) + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('CmdletParameterMetadata') + $xmlWriter.WriteAttributeString('PSName', $_.Name) + $xmlWriter.WriteAttributeString('IsMandatory', 'true') + $xmlWriter.WriteAttributeString('ValueFromPipelineByPropertyName', 'true') + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + } + + $i = -1 + foreach ($parameter in $action.Parameters) + { + $i++ + + # for Instance actions, first parameter is Entity Set which we refer to using keys + if ($isInstanceAction -and ($i -eq 0)) + { + continue + } + + $xmlWriter.WriteStartElement('Parameter') + $xmlWriter.WriteAttributeString('ParameterName', $parameter.Name) + + $xmlWriter.WriteStartElement('Type') + $PSTypeName = Convert-ODataTypeToCLRType $parameter.TypeName + $xmlWriter.WriteAttributeString('PSType', $PSTypeName) + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('CmdletParameterMetadata') + $xmlWriter.WriteAttributeString('PSName', $parameter.Name) + if (-not $parameter.IsNullable) + { + $xmlWriter.WriteAttributeString('IsMandatory', 'true') + $xmlWriter.WriteAttributeString('ValueFromPipelineByPropertyName', 'true') + } + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + } + + # Add -Force parameter to Service Action cmdlets. + AddParametersNode $xmlWriter $null $null $null $null $true $false $complexTypeMapping + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteEndElement() + + $xmlWriter +} + +######################################################### +# GenerateServiceActionProxyCmdlet is a helper function +# used to generate Invoke-* proxy cmdlet. These proxy +# cmdlets support all Service-level actions. They are +# generated in the CDXML compliant format. +######################################################### +function GenerateServiceActionProxyCmdlet +{ + param + ( + [Parameter(Mandatory=$true)] + [ODataUtils.Metadata] $metaData, + [Parameter(Mandatory=$true)] + [string] $uri, + [Parameter(Mandatory=$true)] + [string] $path, + [Hashtable] $complexTypeMapping, + [string] $progressBarStatus, + [System.Management.Automation.PSCmdlet] $callerPSCmdlet + ) + + # $uri is already validated at the cmdlet layer. + if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateServiceActionProxyCmdlet") } + + $xmlWriter = New-Object System.XMl.XmlTextWriter($path,$Null) + + if ($null -eq $xmlWriter) + { + throw $LocalizedData.XmlWriterInitializationError -f "ServiceActions" + } + + $xmlWriter = SaveCDXMLHeader $xmlWriter $uri 'ServiceActions' 'ServiceActions' + + $actions = $metaData.Actions | Where-Object { $null -eq $_.EntitySet } + + if ($actions.Length -gt 0) + { + $xmlWriter.WriteStartElement('StaticCmdlets') + + foreach ($action in $actions) + { + $xmlWriter = GenerateActionProxyCmdlet $xmlWriter $metaData $action '' $false $null $complexTypeMapping + } + + $xmlWriter.WriteEndElement() + } + + $xmlWriter.WriteStartElement('CmdletAdapterPrivateData') + $xmlWriter.WriteStartElement('Data') + $xmlWriter.WriteAttributeString('Name', 'Namespace') + $xmlWriter.WriteString("$($EntitySet.Namespace)") + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + + SaveCDXMLFooter $xmlWriter + + ProcessStreamHelper ($LocalizedData.VerboseSavedServiceActions -f $path) "Export-ODataEndpointProxy" $progressBarStatus 60 20 1 1 $path $callerPSCmdlet +} + +######################################################### +# GenerateModuleManifest is a helper function used +# to generate a wrapper module manifest file. The +# generated module manifest is persisted to the disk at +# the specified OutPutModule path. When the module +# manifest is imported, the following commands will +# be imported: +# 1. Get, Set, New & Remove proxy cmdlets. +# 2. If the server side Odata endpoint exposes complex +# types, then the corresponding client side proxy +# complex types imported. +# 3. Service Action proxy cmdlets. +######################################################### +function GenerateModuleManifest +{ + param + ( + [ODataUtils.Metadata] $metaData, + [String] $modulePath, + [string[]] $additionalModules, + [Hashtable] $resourceNameMapping, + [string] $progressBarStatus, + [System.Management.Automation.PSCmdlet] $callerPSCmdlet + ) + + if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateModuleManifest") } + if($null -eq $modulePath) { throw ($LocalizedData.ArguementNullError -f "ModulePath", "GenerateModuleManifest") } + if($null -eq $progressBarStatus) { throw ($LocalizedData.ArguementNullError -f "ProgressBarStatus", "GenerateModuleManifest") } + + $NestedModules = @() + foreach ($entitySet in $metaData.EntitySets) + { + $entitySetName = $entitySet.Name + if(($null -ne $resourceNameMapping) -and + $resourceNameMapping.ContainsKey($entitySetName)) + { + $entitySetName = $resourceNameMapping[$entitySetName] + } + else + { + $entitySetName = $entitySet.Type.Name + } + + $NestedModules += "$OutputModule\$($entitySetName).cdxml" + } + + New-ModuleManifest -Path $modulePath -NestedModules ($AdditionalModules + $NestedModules) + + ProcessStreamHelper ($LocalizedData.VerboseSavedModuleManifest -f $modulePath) "Export-ODataEndpointProxy" $progressBarStatus 80 20 1 1 $modulePath $callerPSCmdlet +} + +######################################################### +# GetBaseType is a helper function used to fetch the +# base type of the given type. +######################################################### +function GetBaseType +{ + param + ( + [System.Xml.XmlElement] $metadataEntityDefinition, + [ODataUtils.Metadata] $metaData + ) + + if ($null -ne $metadataEntityDefinition -and + $null -ne $metaData -and + $null -ne $metadataEntityDefinition.BaseType) + { + $baseType = $metaData.EntityTypes | Where-Object {$_.Namespace+"."+$_.Name -eq $metadataEntityDefinition.BaseType} + if ($null -eq $baseType) + { + $baseType = $metaData.ComplexTypes | Where-Object {$_.Namespace+"."+$_.Name -eq $metadataEntityDefinition.BaseType} + } + } + + if ($null -ne $baseType) + { + $baseType[0] + } +} + +######################################################### +# AddDerivedTypes is a helper function used to process +# derived types of a newly added type, that were +# previously waiting in the queue. +######################################################### +function AddDerivedTypes +{ + param + ( + [ODataUtils.EntityType] $baseType, + [Hashtable]$entityAndComplexTypesQueue, + [ODataUtils.Metadata] $metaData, + [string] $namespace + ) + + # $metaData is already validated at the cmdlet layer. + if($null -eq $baseType) { throw ($LocalizedData.ArguementNullError -f "BaseType", "AddDerivedTypes") } + if($null -eq $entityAndComplexTypesQueue) { throw ($LocalizedData.ArguementNullError -f "EntityAndComplexTypesQueue", "AddDerivedTypes") } + if($null -eq $namespace) { throw ($LocalizedData.ArguementNullError -f "Namespace", "AddDerivedTypes") } + + $baseTypeFullName = $baseType.Namespace + '.' + $baseType.Name + + if ($entityAndComplexTypesQueue.ContainsKey($baseTypeFullName)) + { + foreach ($type in $entityAndComplexTypesQueue[$baseTypeFullName]) + { + if ($type.type -eq 'EntityType') + { + $newType = ParseMetadataTypeDefinition ($type.value) $baseType $metaData $namespace $true + $metaData.EntityTypes += $newType + } + else + { + $newType = ParseMetadataTypeDefinition ($type.value) $baseType $metaData $namespace $false + $metaData.ComplexTypes += $newType + } + + AddDerivedTypes $newType $entityAndComplexTypesQueue $metaData $namespace + } + } +} + +######################################################### +# ParseMetadataTypeDefinition is a helper function used +# to parse types definitions element of metadata xml. +######################################################### +function ParseMetadataTypeDefinition +{ + param + ( + [Parameter(Mandatory=$true)] + [System.Xml.XmlElement] $metadataEntityDefinition, + [ODataUtils.EntityType] $baseType, + [ODataUtils.Metadata] $metaData, + [string] $namespace, + [bool] $isEntity + ) + + # $metaData is already validated at the cmdlet layer. + if($null -eq $metadataEntityDefinition) { throw ($LocalizedData.ArguementNullError -f "MetadataEntityDefinition", "ParseMetadataTypeDefinition") } + if($null -eq $namespace) { throw ($LocalizedData.ArguementNullError -f "Namespace", "ParseMetadataTypeDefinition") } + + $newEntityType = [ODataUtils.EntityType] @{ + "Namespace" = $namespace; + "Name" = $metadataEntityDefinition.Name; + "IsEntity" = $isEntity; + "BaseType" = $baseType; + } + + # properties defined on EntityType + $newEntityType.EntityProperties = $metadataEntityDefinition.Property | ForEach-Object { + if ($null -ne $_) + { + if ($null -ne $_.Nullable) + { + $newPropertyIsNullable = [System.Convert]::ToBoolean($_.Nullable) + } + else + { + $newPropertyIsNullable = $true + } + + [ODataUtils.TypeProperty] @{ + "Name" = $_.Name; + "TypeName" = $_.Type; + "IsNullable" = $newPropertyIsNullable; + } + } + } + + # navigation properties defined on EntityType + $newEntityType.NavigationProperties = $metadataEntityDefinition.NavigationProperty | ForEach-Object { + if ($null -ne $_) + { + ($AssociationNamespace, $AssociationName) = SplitNamespaceAndName $_.Relationship + [ODataUtils.NavigationProperty] @{ + "Name" = $_.Name; + "FromRole" = $_.FromRole; + "ToRole" = $_.ToRole; + "AssociationNamespace" = $AssociationNamespace; + "AssociationName" = $AssociationName; + } + } + } + + foreach ($entityTypeKey in $metadataEntityDefinition.Key.PropertyRef) + { + ((GetAllProperties $newEntityType) | Where-Object { $_.Name -eq $entityTypeKey.Name }).IsKey = $true + } + + $newEntityType +} + +######################################################### +# GetAllProperties is a helper function used to fetch +# the entity properties or navigation properties of +# the entity type as well as that of complete base +# type hierarchy. +######################################################### +function GetAllProperties +{ + param + ( + [ODataUtils.EntityType] $entityType, + [switch] $IncludeOnlyNavigationProperties + ) + + if($null -eq $entityType) { throw ($LocalizedData.ArguementNullError -f "EntityType", "GetAllProperties") } + + $requestedProperties = @() + + # Populate EntityType property from current EntityType as well + # as from the corresponding base types recursively if + # $IncludeOnlyNavigationProperties switch parameter is used then follow + # the same routine for navigation properties. + $currentEntityType = $entityType + while($null -ne $currentEntityType) + { + if($IncludeOnlyNavigationProperties.IsPresent) + { + $chosenProperties = $currentEntityType.NavigationProperties + } + else + { + $chosenProperties = $currentEntityType.EntityProperties + } + + $requestedProperties += $chosenProperties + $currentEntityType = $currentEntityType.BaseType + } + + return $requestedProperties +} + +######################################################### +# SplitNamespaceAndName is a helper function used +# to split Namespace and actual Name. +# e.g. "a.b.c" is namespace "a.b" and name "c" +######################################################### +function SplitNamespaceAndName +{ + param + ( + [string] $fullyQualifiedName + ) + + if($null -eq $fullyQualifiedName) { throw ($LocalizedData.ArguementNullError -f "FUllyQualifiedName", "SplitNamespaceAndName") } + + $sa = $fullyQualifiedName -split "(.*)\.(.*)" + + if ($sa.Length -gt 1) + { + # return Namespace + $sa[1] + + # return Name + $sa[2] + } + else + { + # return Namespace + "" + + # return Name + $sa[0] + } +} + +######################################################### +# GetEntitySetForEntityType is a helper function used +# to fetch EntitySet for a given EntityType by +# searching the inheritance hierarchy in the +# supplied metadata. +######################################################### +function GetEntitySetForEntityType +{ + param + ( + [ODataUtils.Metadata] $metaData, + [ODataUtils.EntityType] $entityType + ) + + # $metaData is already validated at the cmdlet layer. + if($null -eq $entityType) { throw ($LocalizedData.ArguementNullError -f "EntityType", "GetEntitySetForEntityType") } + + $result = $metaData.EntitySets | Where-Object { ($_.Type.Namespace -eq $entityType.Namespace) -and ($_.Type.Name -eq $entityType.Name) } + + if (($result.Count -eq 0) -and ($null -ne $entityType.BaseType)) + { + GetEntitySetForEntityType $metaData $entityType.BaseType + } + elseif ($result.Count -gt 1) + { + throw ($LocalizedData.WrongCountEntitySet -f (($entityType.Namespace + "." + $entityType.Name), $result.Count)) + } + + $result +} + +######################################################### +# ProcessStreamHelper is a helper function that performs +# the following utility tasks: +# 1. Writes verbose messages to the stream. +# 2. Writes FileInfo objects for the proxy modules +# saved to the disk. This is done to keep the user +# experience in consistent with Export-PSSession. +# 3. Updates progress bar. +######################################################### +function ProcessStreamHelper +{ + param + ( + [string] $verboseMessage, + [string] $progressBarActivityName, + [string] $status, + [double] $previousSegmentWeight, + [double] $currentSegmentWeight, + [int] $totalNumberofEntries, + [int] $currentEntryCount, + [string] $path, + [System.Management.Automation.PSCmdlet] $callerPSCmdlet + ) + + Write-Verbose -Message $verboseMessage + ProgressBarHelper $progressBarActivityName $status $previousSegmentWeight $currentSegmentWeight $totalNumberofEntries $currentEntryCount + $proxyFile = New-Object -TypeName System.IO.FileInfo -ArgumentList $path | Get-Item + if($null -ne $callerPSCmdlet) + { + $callerPSCmdlet.WriteObject($proxyFile) + } +} + +######################################################### +# GetAssociatedType is a helper function used +# to fetch associated instance's EntityType +# for a given Navigation property in the +# supplied metadata. +######################################################### +function GetAssociatedType +{ + param + ( + [ODataUtils.Metadata] $Metadata, + [ODataUtils.NavigationProperty] $navProperty + ) + + # $metaData is already validated at the cmdlet layer. + if($null -eq $navProperty) { throw ($LocalizedData.ArguementNullError -f "NavigationProperty", "GetAssociatedType") } + + $associationName = $navProperty.AssociationName + $association = $Metadata.Associations | Where-Object { $_.Name -eq $associationName } + $associationType = $association.Type + + if ($associationType.Count -lt 1) + { + throw ($LocalizedData.AssociationNotFound -f $associationName) + } + elseif ($associationType.Count -gt 1) + { + throw ($LocalizedData.TooManyMatchingAssociationTypes -f $associationType.Count, $associationName) + } + + if ($associationType.NavPropertyName1 -eq $navProperty.ToRole) + { + $associatedType = $associationType.EndType1 + } + elseif ($associationType.NavPropertyName2 -eq $navProperty.ToRole) + { + $associatedType = $associationType.EndType2 + } + else + { + throw ($LocalizedData.ZeroMatchingAssociationTypes -f $navProperty.ToRole, $association.Name) + } + + # return associated EntityType + $associatedType +} + +######################################################### +# AddParametersNode is a helper function used +# to add parameters to the generated proxy cmdlet, +# based on mandatoryProperties and otherProperties. +# PrefixForKeys is used by associations to append a +# prefix to PowerShell parameter name. +######################################################### +function AddParametersNode +{ + param + ( + [Parameter(Mandatory=$true)] + [System.Xml.XmlWriter] $xmlWriter, + [ODataUtils.TypeProperty[]] $keyProperties, + [ODataUtils.TypeProperty[]] $mandatoryProperties, + [ODataUtils.TypeProperty[]] $otherProperties, + [string] $prefixForKeys, + [boolean] $addForceParameter, + [boolean] $addParametersElement, + [Hashtable] $complexTypeMapping + ) + + if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "AddParametersNode") } + + if(($keyProperties.Length -gt 0) -or + ($mandatoryProperties.Length -gt 0) -or + ($otherProperties.Length -gt 0) -or + ($addForceParameter)) + { + if($addParametersElement) + { + $xmlWriter.WriteStartElement('Parameters') + } + + $pos = 0 + + if ($null -ne $keyProperties) + { + $pos = AddParametersCDXML $xmlWriter $keyProperties $pos $true $prefixForKeys ":Key" $complexTypeMapping + } + + if ($null -ne $mandatoryProperties) + { + $pos = AddParametersCDXML $xmlWriter $mandatoryProperties $pos $true $null $null $complexTypeMapping + } + + if ($null -ne $otherProperties) + { + $pos = AddParametersCDXML $xmlWriter $otherProperties $pos $false $null $null $complexTypeMapping + } + + if($addForceParameter) + { + $forceParameter = [ODataUtils.TypeProperty] @{ + "Name" = "Force"; + "TypeName" = "switch"; + "IsNullable" = $false + } + + $pos = AddParametersCDXML $xmlWriter $forceParameter $pos $false $null $null $complexTypeMapping + } + + if($addParametersElement) + { + $xmlWriter.WriteEndElement() + } + } +} + +######################################################### +# AddParametersNode is a helper function used +# to add Parameter node to CDXML based on properties. +# Prefix is appended to PS parameter names, used for +# associations. Suffix is appended to all parameter +# names, for ex. to differentiate keys. returns new $pos +######################################################### +function AddParametersCDXML +{ + param + ( + [Parameter(Mandatory=$true)] + [System.Xml.XmlWriter] $xmlWriter, + [ODataUtils.TypeProperty[]] $properties, + [Parameter(Mandatory=$true)] + [int] $pos, + [bool] $isMandatory, + [string] $prefix, + [string] $suffix, + [Hashtable] $complexTypeMapping + ) + + $properties | Where-Object { $null -ne $_ } | ForEach-Object { + $xmlWriter.WriteStartElement('Parameter') + $xmlWriter.WriteAttributeString('ParameterName', $_.Name + $suffix) + $xmlWriter.WriteStartElement('Type') + $PSTypeName = Convert-ODataTypeToCLRType $_.TypeName $complexTypeMapping + $xmlWriter.WriteAttributeString('PSType', $PSTypeName) + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('CmdletParameterMetadata') + $xmlWriter.WriteAttributeString('PSName', $prefix + $_.Name) + $xmlWriter.WriteAttributeString('IsMandatory', ($isMandatory).ToString().ToLowerInvariant()) + $xmlWriter.WriteAttributeString('Position', $pos) + if($isMandatory) + { + $xmlWriter.WriteAttributeString('ValueFromPipelineByPropertyName', 'true') + } + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + + $pos++ + } + + $pos +} + +######################################################### +# GenerateComplexTypeDefinition is a helper function used +# to generate complex type definition from the metadata. +######################################################### +function GenerateComplexTypeDefinition +{ + param + ( + [ODataUtils.Metadata] $metaData, + [string] $metaDataUri, + [string] $OutputModule, + [string] $typeDefinitionFileName, + [string] $cmdletAdapter, + [System.Management.Automation.PSCmdlet] $callerPSCmdlet + ) + + #metadataUri, $OutputModule & $cmdletAdapter are already validated at the cmdlet layer. + if($null -eq $typeDefinationFileName) { throw ($LocalizedData.ArguementNullError -f "TypeDefinationFileName", "GenerateComplexTypeDefination") } + if($null -eq $metaData) { throw ($LocalizedData.ArguementNullError -f "metadata", "GenerateComplexTypeDefination") } + if($null -eq $callerPSCmdlet) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "GenerateComplexTypeDefination") } + + $Path = "$OutputModule\$typeDefinitionFileName" + + # We are currently generating classes for EntityType & ComplexType + # definition exposed in the metadata. + $typesToBeGenerated = $metaData.EntityTypes+$metadata.ComplexTypes + + if($null -ne $typesToBeGenerated -and $typesToBeGenerated.Count -gt 0) + { + $complexTypeMapping = @{} + $entityTypeNameSpaceMapping = @{} + + foreach ($entityType in $typesToBeGenerated) + { + if ($null -ne $entityType) + { + $entityTypeFullName = $entityType.Namespace + '.' + $entityType.Name + if(!$complexTypeMapping.ContainsKey($entityTypeFullName)) + { + $complexTypeMapping.Add($entityTypeFullName, $entityType.Name) + } + + if(!$entityTypeNameSpaceMapping.ContainsKey($entityType.Namespace)) + { + $entityTypes = @() + $entityTypeNameSpaceMapping.Add($entityType.Namespace, $entityTypes) + } + + $entityTypeNameSpaceMapping[$entityType.Namespace] += $entityType + } + } + + if($entityTypeNameSpaceMapping.Count -gt 0) + { +$output = @" +`$typeDefinitions = @" +using System; +using System.Management.Automation; + +"@ + + foreach($currentNameSpace in $entityTypeNameSpaceMapping.Keys) + { + $entityTypes = $entityTypeNameSpaceMapping[$currentNameSpace] + + $output += "`r`nnamespace $(ValidateComplexTypeIdentifier $currentNameSpace $true $metaDataUri $callerPSCmdlet)`r`n{" + + foreach ($entityType in $entityTypes) + { + $entityTypeFullName = (ValidateComplexTypeIdentifier $entityType.Namespace $true $metaDataUri $callerPSCmdlet) + '.' + $entityType.Name + Write-Verbose ($LocalizedData.VerboseAddingTypeDefinationToGeneratedModule -f $entityTypeFullName, "$OutputModule\$typeDefinationFileName") + + if($null -ne $entityType.BaseType) + { + $entityBaseFullName = (ValidateComplexTypeIdentifier $entityType.BaseType.Namespace $true $metaDataUri $callerPSCmdlet) + '.' + (ValidateComplexTypeIdentifier $entityType.BaseType.Name $false $metaDataUri $callerPSCmdlet) + $output += "`r`n public class $(ValidateComplexTypeIdentifier $entityType.Name $false $metaDataUri $callerPSCmdlet) : $($entityBaseFullName)`r`n {" + } + else + { + $output += "`r`n public class $(ValidateComplexTypeIdentifier $entityType.Name $false $metaDataUri $callerPSCmdlet)`r`n {" + } + + $properties = $null + + for($index = 0; $index -lt $entityType.EntityProperties.Count; $index++) + { + $property = $entityType.EntityProperties[$index] + $typeName = Convert-ODataTypeToCLRType $property.TypeName $complexTypeMapping + $properties += "`r`n public $typeName $(ValidateComplexTypeIdentifier $property.Name $false $metaDataUri $callerPSCmdlet);" + } + + # Navigation properties are treated like any other property for NetworkController scenario. + if ($cmdletAdapter -eq "NetworkControllerAdapter") + { + for($index = 0; $index -lt $entityType.NavigationProperties.Count; $index++) + { + $property = $entityType.NavigationProperties[$index] + $navigationTypeName = GetNavigationPropertyTypeName $property $metaData + $typeName = Convert-ODataTypeToCLRType $navigationTypeName $complexTypeMapping + $properties += "`r`n public $typeName $(ValidateComplexTypeIdentifier $property.Name $false $metaDataUri $callerPSCmdlet);" + } + } + + $output += $properties + $output += "`r`n }`r`n" + } + + $output += "}`r`n" + } + $output += """@`r`n" + + $output += "Add-Type -TypeDefinition `$typeDefinitions `r`n" + $output | Out-File -FilePath $Path + Write-Verbose ($LocalizedData.VerboseSavedTypeDefinationModule -f $typeDefinationFileName, $OutputModule) + } + } + + return $complexTypeMapping +} + +# Creating a single instance of CSharpCodeProvider that would be used +# for Identifier validation in the ValidateComplexTypeIdentifier helper method. +$cSharpCodeProvider = [Microsoft.CSharp.CSharpCodeProvider]::new() + +######################################################### +# ValidateComplexTypeIdentifier is a helper function to +# make sure that the type names defined in the +# metadata are valid C# Identifier names. This validation +# is performed to make sure that there are no security +# threat from importing the generated complex type +# (which is created using the metadata file). +# This method return the identifier name if its a +# valid identifier, else a terminating error in thrown. +######################################################### +function ValidateComplexTypeIdentifier +{ + param + ( + [string] $identifierName, + [bool] $isNameSpaceName, + [string] $metaDataUri, + [System.Management.Automation.PSCmdlet] $callerPSCmdlet + ) + + if($null -eq $callerPSCmdletl) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "ValidateComplexTypeIdentifier") } + + if($isNameSpaceName) + { + $independentIdentifiers = $identifierName.Split('.') + $result = $true + foreach($currentIdentifier in $independentIdentifiers) + { + if(![System.CodeDom.Compiler.CodeGenerator]::IsValidLanguageIndependentIdentifier($currentIdentifier)) + { + $result = $false + break + } + } + } + else + { + $result = $cSharpCodeProvider.IsValidIdentifier($identifierName) + } + + if(!$result) + { + $errorMessage = ($LocalizedData.InValidIdentifierInMetadata -f $metaDataUri, $identifierName) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidIdentifier" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidData) $null $identifierName + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + else + { + return $identifierName + } +} + +######################################################### +# GetKeys is a helper function used to +# return the keys for the entity if customUri +# is specified. +######################################################### +function GetKeys +{ + param + ( + [ODataUtils.EntitySet] $entitySet, + [string] $customUri, + [string] $actionName + ) + + # Get the original keys + $key = (GetAllProperties $entitySet.Type) | Where-Object { $_.IsKey } + + # Get the keys with delimiters + $keys = $customUri -split "/" | ForEach-Object { + if ($_ -match '{*}') + { + [ODataUtils.TypeProperty] @{ + "Name" = $_.Substring($_.IndexOf('{')+1,$_.IndexOf('}')-$_.IndexOf('{')-1); + "TypeName" = "Edm.String"; + "IsNullable" = $false; + "IsMandatory" = $true; + } + } + elseif ($_ -match '\[*\]') + { + if ($ActionName -eq 'Get') { + [ODataUtils.TypeProperty] @{ + "Name" = $_.Substring($_.IndexOf('[')+1,$_.IndexOf(']')-$_.IndexOf('[')-1); + "TypeName" = "Edm.String"; + "IsNullable" = $false; + "IsMandatory" = $false; + } + } + else { + [ODataUtils.TypeProperty] @{ + "Name" = $_.Substring($_.IndexOf('[')+1,$_.IndexOf(']')-$_.IndexOf('[')-1); + "TypeName" = "Edm.String"; + "IsNullable" = $false; + "IsMandatory" = $true; + } + } + } + } + + # Now combine the two keys and avoid duplication + # Make a list of names already present in the new keys + # Foreach old key check if that key is present in the new keyList + # Else add the key to new key list + $keyParams = $keys | ForEach-Object {$_.Name} + + if ($null -eq $keyParams -Or $keyParams.Count -eq 0) { + $keys = $key + } + else { + if ($keyParams.Count -eq 1) { + $keys = @($keys) + } + + $key | ForEach-Object { + if ($keyParams.Contains($_.Name) -eq $false) + { + $keys += $_ + } + } + } + + $keys +} + +######################################################### +# GetNetworkControllerAdditionalProperties is a helper +# function used to fetch network controller specific +# additional properties. +######################################################### +function GetNetworkControllerAdditionalProperties +{ + param + ( + $navigationProperties, + $metaData + ) + + # Additional properties contains the types present as navigation properties + + $additionalProperties = $navigationProperties | Where-Object { $null -ne $_ } | ForEach-Object { + $typeName = GetNavigationPropertyTypeName $_ $metaData + + if ($_.Name -eq "Properties") { + $isNullable = $false + } + else { + $isNullable = $true + } + + [ODataUtils.TypeProperty] @{ + "Name" = $_.Name; + "TypeName" = $typeName + "IsNullable" = $isNullable; + } + } + + # Add etag to the additionalProperties + + if ($null -ne $additionalProperties) + { + if ($additionalProperties.Count -eq 1) { + $additionalProperties = @($additionalProperties) + } + + $additionalProperties += [ODataUtils.TypeProperty] @{ + "Name" = "Etag"; + "TypeName" = "Edm.String"; + "IsNullable" = $true; + } + } + else + { + $additionalProperties = [ODataUtils.TypeProperty] @{ + "Name" = "Etag"; + "TypeName" = "Edm.String"; + "IsNullable" = $true; + } + } + + $additionalProperties +} + +######################################################### +# UpdateNetworkControllerSpecificProperties is a +# helper function used to append additionalProperties +# to nullable/nonNullable Properties. This is network controller +# specific logic. +######################################################### +function UpdateNetworkControllerSpecificProperties +{ + param + ( + $nullableProperties, + $additionalProperties, + $keyProperties, + $isNullable + ) + + if ($isNullable) { + $additionalProperties = $additionalProperties | Where-Object { $_.isNullable } + } + else { + $additionalProperties = $additionalProperties | Where-Object { -not $_.isNullable } + } + + if ($null -eq $nullableProperties) + { + $nullableProperties = $additionalProperties + } + else { + if ($nullableProperties.Count -eq 1) { + $nullableProperties = @($nullableProperties) + } + if ($null -ne $additionalProperties) { + $nullableProperties += $additionalProperties + } + } + + if ($null -ne $nullableProperties -And $null -ne $keyProperties) + { + if ($keyProperties.Count -eq 1) { + $keyProperties = @($keyProperties) + } + + $keys = $keyProperties | ForEach-Object {$_.Name} + + if ($keys.Count -eq 1) { + $keys = @($keys) + } + + $nullableProperties = $nullableProperties | Where-Object {$keys.Contains($_.Name) -eq $false} + } + + $nullableProperties +} + +######################################################### +# GetNavigationPropertyTypeName is a +# helper function used to fetch the type corresponding +# to navigation property in this metadata. This is +# network controller specific logic. +######################################################### +function GetNavigationPropertyTypeName +{ + param + ( + $navigationProperty, + $metaData + ) + + foreach($association in $metaData.Associations) + { + if ($association.Name -ne $navigationProperty.AssociationName -Or $association.Namespace -ne $navigationProperty.AssociationNamespace) + { + continue + } + + # Now get the type for this association + + if ($association.Type.NavPropertyName1 -eq $navigationProperty.Name) + { + $type = $association.Type.EndType1 + $multiplicity = $association.Type.Multiplicity1 + } + elseif ($associationType.NavPropertyName2 -eq $navigationProperty.Name) + { + $type = $association.Type.EndType2 + $multiplicity = $association.Type.Multiplicity2 + } + + break + } + + $fullName = $type.Namespace + '.' + $type.Name + + # Check the multiplicity and convert to array if needed + if ($multiplicity -eq "*") + { + $fullName = "Collection($fullName)" + } + + $fullName +} diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtils.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtils.psd1 index 589b6cb824c..cdcfe2bbef9 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtils.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtils.psd1 @@ -1,240 +1,240 @@ -# -# Module manifest for module 'Microsoft.PowerShell.ODataUtils' -# -# Generated on: 8/15/2013 -# - -@{ - -# Script module or binary module file associated with this manifest. -RootModule = 'Microsoft.PowerShell.ODataUtils.psm1' - -# Version number of this module. -ModuleVersion = '1.0' - -# ID used to uniquely identify this module -GUID = 'fa1606d1-94cb-4264-bfb6-def714420084' - -# Author of this module -Author = 'Microsoft Corporation' - -# Company or vendor of this module -CompanyName = 'Microsoft Corporation' - -# Copyright statement for this module -Copyright = '(c) 2014 Microsoft. All rights reserved.' - -# Description of the functionality provided by this module -# Description = '' - -# Minimum version of the Windows PowerShell engine required by this module -# PowerShellVersion = '' - -# Name of the Windows PowerShell host required by this module -# PowerShellHostName = '' - -# Minimum version of the Windows PowerShell host required by this module -# PowerShellHostVersion = '' - -# Minimum version of Microsoft .NET Framework required by this module -# DotNetFrameworkVersion = '' - -# Minimum version of the common language runtime (CLR) required by this module -# CLRVersion = '' - -# Processor architecture (None, X86, Amd64) required by this module -# ProcessorArchitecture = '' - -# Modules that must be imported into the global environment prior to importing this module -# RequiredModules = @() - -# Assemblies that must be loaded prior to importing this module -# RequiredAssemblies = @() - -# Script files (.ps1) that are run in the caller's environment prior to importing this module. -# ScriptsToProcess = @() - -# Type files (.ps1xml) to be loaded when importing this module -# TypesToProcess = @() - -# Format files (.ps1xml) to be loaded when importing this module -# FormatsToProcess = @() - -# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -# NestedModules = @() - -# Functions to export from this module -FunctionsToExport = @('Export-ODataEndpointProxy') - -# Cmdlets to export from this module -CmdletsToExport = '' - -# Variables to export from this module -VariablesToExport = '' - -# Aliases to export from this module -AliasesToExport = '' - -# List of all modules packaged with this module -# ModuleList = @() - -# List of all files packaged with this module -# FileList = @() - -# Private data to pass to the module specified in RootModule/ModuleToProcess -# PrivateData = '' - -# HelpInfo URI of this module -HelpInfoURI = 'https://go.microsoft.com/fwlink/?LinkId=509916' - -# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. -# DefaultCommandPrefix = '' - -} - - -# SIG # Begin signature block -# MIIavwYJKoZIhvcNAQcCoIIasDCCGqwCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB -# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR -# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU5qxxE9NAWfUb5Y4oxi1pHiiU -# j+GgghWCMIIEwzCCA6ugAwIBAgITMwAAAHQNgGQOfWd9owAAAAAAdDANBgkqhkiG -# 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G -# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw -# HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTUwMzIwMTczMjA1 -# WhcNMTYwNjIwMTczMjA1WjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp -# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw -# b3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNO -# OjdEMkUtMzc4Mi1CMEY3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT -# ZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4NFrifjVvo5Y -# gN/jD+4M6zszXn3GnmZHP9AerBSCDRiftpwnIvG2hpREQXSJkW8X9t+Y5jbLX3iS -# 6XJ+S7kExWIUc3HGf2NBW+tk8r1cVWJGzA9ewQnEr9nxvyV94BegUO4lqkXl48Z+ -# vxBZqcGPPtn77GQbY1u1p7jq681X6xtD9WWRv1D1+cEGvH2qzDfnBqmgzLH1M8wN -# ssh1ZgDRbTCTR8+OomdEXhoTf/McHucPncG8SPyBgW1UauJpE8bO9ZdnMmxIyhHC -# VjrW3Dpi9PwQl2RIC4pc8RbClfDLYBukA5sMyfe7kr8Ac2czHKJ673VKGUZaDH6a -# W6A6HVQ16wIDAQABo4IBCTCCAQUwHQYDVR0OBBYEFCUsOGYFtEU5DmC29u69PuDd -# r4wNMB8GA1UdIwQYMBaAFCM0+NlSRnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEsw -# SaBHoEWGQ2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz -# L01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsG -# AQUFBzAChjxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jv -# c29mdFRpbWVTdGFtcFBDQS5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZI -# hvcNAQEFBQADggEBAEEG50j6xJHcMBMNInjC0iPTszPL+yYh1978CncY+4Nyzu/U -# LIaP4xXj1RICZ1xbN9MDe02RW0FTZgn9457fLHgJORo2HYqBocllfJx7kbIPSptB -# 3cdEC2EFyUwu8rRrKKoIR+4IrGZUF1aQiMbpddAhEDh5yT+7VTDFpjmmU7/NXFbS -# ThcUvGISy+lL8MWR3J2EypjWDttWFGht21OLMM+6J2V1oDFvk6N1EGDqqu7uduvl -# jAup0655zzS+SR8i0MT1o+/zrjDcjohGI4ygqjyXrwfbdug2VN+Ls4mewOospGBr -# 8d/DthI6rzM4elFxNTXm5AjiUZaC+b7hG4N8e2cwggTsMIID1KADAgECAhMzAAAA -# ymzVMhI1xOFVAAEAAADKMA0GCSqGSIb3DQEBBQUAMHkxCzAJBgNVBAYTAlVTMRMw -# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN -# aWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNp -# Z25pbmcgUENBMB4XDTE0MDQyMjE3MzkwMFoXDTE1MDcyMjE3MzkwMFowgYMxCzAJ -# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k -# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIx -# HjAcBgNVBAMTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjCCASIwDQYJKoZIhvcNAQEB -# BQADggEPADCCAQoCggEBAJZxXe0GRvqEy51bt0bHsOG0ETkDrbEVc2Cc66e2bho8 -# P/9l4zTxpqUhXlaZbFjkkqEKXMLT3FIvDGWaIGFAUzGcbI8hfbr5/hNQUmCVOlu5 -# WKV0YUGplOCtJk5MoZdwSSdefGfKTx5xhEa8HUu24g/FxifJB+Z6CqUXABlMcEU4 -# LYG0UKrFZ9H6ebzFzKFym/QlNJj4VN8SOTgSL6RrpZp+x2LR3M/tPTT4ud81MLrs -# eTKp4amsVU1Mf0xWwxMLdvEH+cxHrPuI1VKlHij6PS3Pz4SYhnFlEc+FyQlEhuFv -# 57H8rEBEpamLIz+CSZ3VlllQE1kYc/9DDK0r1H8wQGcCAwEAAaOCAWAwggFcMBMG -# A1UdJQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQWBBQfXuJdUI1Whr5KPM8E6KeHtcu/ -# gzBRBgNVHREESjBIpEYwRDENMAsGA1UECxMETU9QUjEzMDEGA1UEBRMqMzE1OTUr -# YjQyMThmMTMtNmZjYS00OTBmLTljNDctM2ZjNTU3ZGZjNDQwMB8GA1UdIwQYMBaA -# FMsR6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9j -# cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8w -# OC0zMS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6 -# Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMx -# LTIwMTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQB3XOvXkT3NvXuD2YWpsEOdc3wX -# yQ/tNtvHtSwbXvtUBTqDcUCBCaK3cSZe1n22bDvJql9dAxgqHSd+B+nFZR+1zw23 -# VMcoOFqI53vBGbZWMrrizMuT269uD11E9dSw7xvVTsGvDu8gm/Lh/idd6MX/YfYZ -# 0igKIp3fzXCCnhhy2CPMeixD7v/qwODmHaqelzMAUm8HuNOIbN6kBjWnwlOGZRF3 -# CY81WbnYhqgA/vgxfSz0jAWdwMHVd3Js6U1ZJoPxwrKIV5M1AHxQK7xZ/P4cKTiC -# 095Sl0UpGE6WW526Xxuj8SdQ6geV6G00DThX3DcoNZU6OJzU7WqFXQ4iEV57MIIF -# vDCCA6SgAwIBAgIKYTMmGgAAAAAAMTANBgkqhkiG9w0BAQUFADBfMRMwEQYKCZIm -# iZPyLGQBGRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQD -# EyRNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTAwODMx -# MjIxOTMyWhcNMjAwODMxMjIyOTMyWjB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMK -# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 -# IENvcnBvcmF0aW9uMSMwIQYDVQQDExpNaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBD -# QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJyWVwZMGS/HZpgICBC -# mXZTbD4b1m/My/Hqa/6XFhDg3zp0gxq3L6Ay7P/ewkJOI9VyANs1VwqJyq4gSfTw -# aKxNS42lvXlLcZtHB9r9Jd+ddYjPqnNEf9eB2/O98jakyVxF3K+tPeAoaJcap6Vy -# c1bxF5Tk/TWUcqDWdl8ed0WDhTgW0HNbBbpnUo2lsmkv2hkL/pJ0KeJ2L1TdFDBZ -# +NKNYv3LyV9GMVC5JxPkQDDPcikQKCLHN049oDI9kM2hOAaFXE5WgigqBTK3S9dP -# Y+fSLWLxRT3nrAgA9kahntFbjCZT6HqqSvJGzzc8OJ60d1ylF56NyxGPVjzBrAlf -# A9MCAwEAAaOCAV4wggFaMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMsR6MrS -# tBZYAck3LjMWFrlMmgofMAsGA1UdDwQEAwIBhjASBgkrBgEEAYI3FQEEBQIDAQAB -# MCMGCSsGAQQBgjcVAgQWBBT90TFO0yaKleGYYDuoMW+mPLzYLTAZBgkrBgEEAYI3 -# FAIEDB4KAFMAdQBiAEMAQTAfBgNVHSMEGDAWgBQOrIJgQFYnl+UlE/wq4QpTlVnk -# pDBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtp -# L2NybC9wcm9kdWN0cy9taWNyb3NvZnRyb290Y2VydC5jcmwwVAYIKwYBBQUHAQEE -# SDBGMEQGCCsGAQUFBzAChjhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl -# cnRzL01pY3Jvc29mdFJvb3RDZXJ0LmNydDANBgkqhkiG9w0BAQUFAAOCAgEAWTk+ -# fyZGr+tvQLEytWrrDi9uqEn361917Uw7LddDrQv+y+ktMaMjzHxQmIAhXaw9L0y6 -# oqhWnONwu7i0+Hm1SXL3PupBf8rhDBdpy6WcIC36C1DEVs0t40rSvHDnqA2iA6VW -# 4LiKS1fylUKc8fPv7uOGHzQ8uFaa8FMjhSqkghyT4pQHHfLiTviMocroE6WRTsgb -# 0o9ylSpxbZsa+BzwU9ZnzCL/XB3Nooy9J7J5Y1ZEolHN+emjWFbdmwJFRC9f9Nqu -# 1IIybvyklRPk62nnqaIsvsgrEA5ljpnb9aL6EiYJZTiU8XofSrvR4Vbo0HiWGFzJ -# NRZf3ZMdSY4tvq00RBzuEBUaAF3dNVshzpjHCe6FDoxPbQ4TTj18KUicctHzbMrB -# 7HCjV5JXfZSNoBtIA1r3z6NnCnSlNu0tLxfI5nI3EvRvsTxngvlSso0zFmUeDord -# EN5k9G/ORtTTF+l5xAS00/ss3x+KnqwK+xMnQK3k+eGpf0a7B2BHZWBATrBC7E7t -# s3Z52Ao0CW0cgDEf4g5U3eWh++VHEK1kmP9QFi58vwUheuKVQSdpw5OPlcmN2Jsh -# rg1cnPCiroZogwxqLbt2awAdlq3yFnv2FoMkuYjPaqhHMS+a3ONxPdcAfmJH0c6I -# ybgY+g5yjcGjPa8CQGr/aZuW4hCoELQ3UAjWwz0wggYHMIID76ADAgECAgphFmg0 -# AAAAAAAcMA0GCSqGSIb3DQEBBQUAMF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAX -# BgoJkiaJk/IsZAEZFgltaWNyb3NvZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290 -# IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNzA0MDMxMjUzMDlaFw0yMTA0MDMx -# MzAzMDlaMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD -# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAf -# BgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQTCCASIwDQYJKoZIhvcNAQEB -# BQADggEPADCCAQoCggEBAJ+hbLHf20iSKnxrLhnhveLjxZlRI1Ctzt0YTiQP7tGn -# 0UytdDAgEesH1VSVFUmUG0KSrphcMCbaAGvoe73siQcP9w4EmPCJzB/LMySHnfL0 -# Zxws/HvniB3q506jocEjU8qN+kXPCdBer9CwQgSi+aZsk2fXKNxGU7CG0OUoRi4n -# rIZPVVIM5AMs+2qQkDBuh/NZMJ36ftaXs+ghl3740hPzCLdTbVK0RZCfSABKR2YR -# JylmqJfk0waBSqL5hKcRRxQJgp+E7VV4/gGaHVAIhQAQMEbtt94jRrvELVSfrx54 -# QTF3zJvfO4OToWECtR0Nsfz3m7IBziJLVP/5BcPCIAsCAwEAAaOCAaswggGnMA8G -# A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCM0+NlSRnAK7UD7dvuzK7DDNbMPMAsG -# A1UdDwQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADCBmAYDVR0jBIGQMIGNgBQOrIJg -# QFYnl+UlE/wq4QpTlVnkpKFjpGEwXzETMBEGCgmSJomT8ixkARkWA2NvbTEZMBcG -# CgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3Qg -# Q2VydGlmaWNhdGUgQXV0aG9yaXR5ghB5rRahSqClrUxzWPQHEy5lMFAGA1UdHwRJ -# MEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1 -# Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYB -# BQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljcm9z -# b2Z0Um9vdENlcnQuY3J0MBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEB -# BQUAA4ICAQAQl4rDXANENt3ptK132855UU0BsS50cVttDBOrzr57j7gu1BKijG1i -# uFcCy04gE1CZ3XpA4le7r1iaHOEdAYasu3jyi9DsOwHu4r6PCgXIjUji8FMV3U+r -# kuTnjWrVgMHmlPIGL4UD6ZEqJCJw+/b85HiZLg33B+JwvBhOnY5rCnKVuKE5nGct -# xVEO6mJcPxaYiyA/4gcaMvnMMUp2MT0rcgvI6nA9/4UKE9/CCmGO8Ne4F+tOi3/F -# NSteo7/rvH0LQnvUU3Ih7jDKu3hlXFsBFwoUDtLaFJj1PLlmWLMtL+f5hYbMUVbo -# nXCUbKw5TNT2eb+qGHpiKe+imyk0BncaYsk9Hm0fgvALxyy7z0Oz5fnsfbXjpKh0 -# NbhOxXEjEiZ2CzxSjHFaRkMUvLOzsE1nyJ9C/4B5IYCeFTBm6EISXhrIniIh0EPp -# K+m79EjMLNTYMoBMJipIJF9a6lbvpt6Znco6b72BJ3QGEe52Ib+bgsEnVLaxaj2J -# oXZhtG6hE6a/qkfwEm/9ijJssv7fUciMI8lmvZ0dhxJkAj0tr1mPuOQh5bWwymO0 -# eFQF1EEuUKyUsKV4q7OglnUa2ZKHE3UiLzKoCG6gW4wlv6DvhMoh1useT8ma7kng -# 9wFlb4kLfchpyOZu6qeXzjEp/w7FW1zYTRuh2Povnj8uVRZryROj/TGCBKcwggSj -# AgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD -# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAh -# BgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBAhMzAAAAymzVMhI1xOFV -# AAEAAADKMAkGBSsOAwIaBQCggcAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw -# HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFFNt -# DhScbWHVDFMkTLRd2qRP8wFeMGAGCisGAQQBgjcCAQwxUjBQoCaAJABXAGkAbgBk -# AG8AdwBzACAAUABvAHcAZQByAFMAaABlAGwAbKEmgCRodHRwOi8vd3d3Lm1pY3Jv -# c29mdC5jb20vcG93ZXJzaGVsbCAwDQYJKoZIhvcNAQEBBQAEggEAddyT//E7Ysbi -# U9kfhQrYkjrhhZCKOzQPVAZSNxWx246MveRe1aj3A+Kr868dYH3x8or8g7MpeJig -# 0WOx4O+mw4fUCdTT6fLqo+W8Q+5qNpWjpfpP5eq7firhhh5D8jB1h7tJWI7fkvHN -# VwadYG4t4BxGIFgsn6YIgPn8ZipmOLb8zvCaDPpg9Xr5U5YKKUrA3sgiuW+zf0aK -# r506K+pfuC56XItbX25VEvf+hjazJr2UasFTweV4mCgKHoAG1UluKUZaX8B+KaKB -# DGMUJ3pCAqyt9RCTSQC9xZxWyK+g0byzn2dpCNxWDXHI7SxCs8ejBhp5yYtlBXl7 -# vkGAXdlJ9aGCAigwggIkBgkqhkiG9w0BCQYxggIVMIICEQIBATCBjjB3MQswCQYD -# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe -# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNyb3Nv -# ZnQgVGltZS1TdGFtcCBQQ0ECEzMAAAB0DYBkDn1nfaMAAAAAAHQwCQYFKw4DAhoF -# AKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE1 -# MDUxMTE4MTE1M1owIwYJKoZIhvcNAQkEMRYEFJl30ao3ese0x5O4lPs3SVZVIOdq -# MA0GCSqGSIb3DQEBBQUABIIBAESrx9oY0vI7nyBV0AwzpSYTA/jQF/+MGVokP7ak -# 5i7x25UMc7+RRMROW9VxhzYpzPtotmF8H4rfZsJLxPRlbFF2pu+8MKiNAKiP851m -# tsD1Cw8AN7T31LG8Syk3yKtEvsvnc3yzZy6sXUbkn02yjHNp0PMsrQJNw9ALRc/p -# s3mHzZTqYkmFeHUHzsRa97ByExmjPnP4vcfK2HdZ+oq2EiLjGICooqimt2ys/BPy -# 7nYZaeHaKaNJtnOQHM2BqN38OcH7X7K4IzxCNceXEION6gZE6wqvp+dkvpN5wasL -# OkQhubomAuN/S2TGKwjx3H45G1dpl3LXqihqtqF/Sed7MZs= -# SIG # End signature block +# +# Module manifest for module 'Microsoft.PowerShell.ODataUtils' +# +# Generated on: 8/15/2013 +# + +@{ + +# Script module or binary module file associated with this manifest. +RootModule = 'Microsoft.PowerShell.ODataUtils.psm1' + +# Version number of this module. +ModuleVersion = '1.0' + +# ID used to uniquely identify this module +GUID = 'fa1606d1-94cb-4264-bfb6-def714420084' + +# Author of this module +Author = 'Microsoft Corporation' + +# Company or vendor of this module +CompanyName = 'Microsoft Corporation' + +# Copyright statement for this module +Copyright = '(c) 2014 Microsoft. All rights reserved.' + +# Description of the functionality provided by this module +# Description = '' + +# Minimum version of the Windows PowerShell engine required by this module +# PowerShellVersion = '' + +# Name of the Windows PowerShell host required by this module +# PowerShellHostName = '' + +# Minimum version of the Windows PowerShell host required by this module +# PowerShellHostVersion = '' + +# Minimum version of Microsoft .NET Framework required by this module +# DotNetFrameworkVersion = '' + +# Minimum version of the common language runtime (CLR) required by this module +# CLRVersion = '' + +# Processor architecture (None, X86, Amd64) required by this module +# ProcessorArchitecture = '' + +# Modules that must be imported into the global environment prior to importing this module +# RequiredModules = @() + +# Assemblies that must be loaded prior to importing this module +# RequiredAssemblies = @() + +# Script files (.ps1) that are run in the caller's environment prior to importing this module. +# ScriptsToProcess = @() + +# Type files (.ps1xml) to be loaded when importing this module +# TypesToProcess = @() + +# Format files (.ps1xml) to be loaded when importing this module +# FormatsToProcess = @() + +# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess +# NestedModules = @() + +# Functions to export from this module +FunctionsToExport = @('Export-ODataEndpointProxy') + +# Cmdlets to export from this module +CmdletsToExport = '' + +# Variables to export from this module +VariablesToExport = '' + +# Aliases to export from this module +AliasesToExport = '' + +# List of all modules packaged with this module +# ModuleList = @() + +# List of all files packaged with this module +# FileList = @() + +# Private data to pass to the module specified in RootModule/ModuleToProcess +# PrivateData = '' + +# HelpInfo URI of this module +HelpInfoURI = 'https://go.microsoft.com/fwlink/?LinkId=509916' + +# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. +# DefaultCommandPrefix = '' + +} + + +# SIG # Begin signature block +# MIIavwYJKoZIhvcNAQcCoIIasDCCGqwCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB +# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR +# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU5qxxE9NAWfUb5Y4oxi1pHiiU +# j+GgghWCMIIEwzCCA6ugAwIBAgITMwAAAHQNgGQOfWd9owAAAAAAdDANBgkqhkiG +# 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G +# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw +# HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTUwMzIwMTczMjA1 +# WhcNMTYwNjIwMTczMjA1WjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp +# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw +# b3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNO +# OjdEMkUtMzc4Mi1CMEY3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT +# ZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4NFrifjVvo5Y +# gN/jD+4M6zszXn3GnmZHP9AerBSCDRiftpwnIvG2hpREQXSJkW8X9t+Y5jbLX3iS +# 6XJ+S7kExWIUc3HGf2NBW+tk8r1cVWJGzA9ewQnEr9nxvyV94BegUO4lqkXl48Z+ +# vxBZqcGPPtn77GQbY1u1p7jq681X6xtD9WWRv1D1+cEGvH2qzDfnBqmgzLH1M8wN +# ssh1ZgDRbTCTR8+OomdEXhoTf/McHucPncG8SPyBgW1UauJpE8bO9ZdnMmxIyhHC +# VjrW3Dpi9PwQl2RIC4pc8RbClfDLYBukA5sMyfe7kr8Ac2czHKJ673VKGUZaDH6a +# W6A6HVQ16wIDAQABo4IBCTCCAQUwHQYDVR0OBBYEFCUsOGYFtEU5DmC29u69PuDd +# r4wNMB8GA1UdIwQYMBaAFCM0+NlSRnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEsw +# SaBHoEWGQ2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz +# L01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsG +# AQUFBzAChjxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jv +# c29mdFRpbWVTdGFtcFBDQS5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZI +# hvcNAQEFBQADggEBAEEG50j6xJHcMBMNInjC0iPTszPL+yYh1978CncY+4Nyzu/U +# LIaP4xXj1RICZ1xbN9MDe02RW0FTZgn9457fLHgJORo2HYqBocllfJx7kbIPSptB +# 3cdEC2EFyUwu8rRrKKoIR+4IrGZUF1aQiMbpddAhEDh5yT+7VTDFpjmmU7/NXFbS +# ThcUvGISy+lL8MWR3J2EypjWDttWFGht21OLMM+6J2V1oDFvk6N1EGDqqu7uduvl +# jAup0655zzS+SR8i0MT1o+/zrjDcjohGI4ygqjyXrwfbdug2VN+Ls4mewOospGBr +# 8d/DthI6rzM4elFxNTXm5AjiUZaC+b7hG4N8e2cwggTsMIID1KADAgECAhMzAAAA +# ymzVMhI1xOFVAAEAAADKMA0GCSqGSIb3DQEBBQUAMHkxCzAJBgNVBAYTAlVTMRMw +# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN +# aWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNp +# Z25pbmcgUENBMB4XDTE0MDQyMjE3MzkwMFoXDTE1MDcyMjE3MzkwMFowgYMxCzAJ +# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k +# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIx +# HjAcBgNVBAMTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjCCASIwDQYJKoZIhvcNAQEB +# BQADggEPADCCAQoCggEBAJZxXe0GRvqEy51bt0bHsOG0ETkDrbEVc2Cc66e2bho8 +# P/9l4zTxpqUhXlaZbFjkkqEKXMLT3FIvDGWaIGFAUzGcbI8hfbr5/hNQUmCVOlu5 +# WKV0YUGplOCtJk5MoZdwSSdefGfKTx5xhEa8HUu24g/FxifJB+Z6CqUXABlMcEU4 +# LYG0UKrFZ9H6ebzFzKFym/QlNJj4VN8SOTgSL6RrpZp+x2LR3M/tPTT4ud81MLrs +# eTKp4amsVU1Mf0xWwxMLdvEH+cxHrPuI1VKlHij6PS3Pz4SYhnFlEc+FyQlEhuFv +# 57H8rEBEpamLIz+CSZ3VlllQE1kYc/9DDK0r1H8wQGcCAwEAAaOCAWAwggFcMBMG +# A1UdJQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQWBBQfXuJdUI1Whr5KPM8E6KeHtcu/ +# gzBRBgNVHREESjBIpEYwRDENMAsGA1UECxMETU9QUjEzMDEGA1UEBRMqMzE1OTUr +# YjQyMThmMTMtNmZjYS00OTBmLTljNDctM2ZjNTU3ZGZjNDQwMB8GA1UdIwQYMBaA +# FMsR6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9j +# cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8w +# OC0zMS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6 +# Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMx +# LTIwMTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQB3XOvXkT3NvXuD2YWpsEOdc3wX +# yQ/tNtvHtSwbXvtUBTqDcUCBCaK3cSZe1n22bDvJql9dAxgqHSd+B+nFZR+1zw23 +# VMcoOFqI53vBGbZWMrrizMuT269uD11E9dSw7xvVTsGvDu8gm/Lh/idd6MX/YfYZ +# 0igKIp3fzXCCnhhy2CPMeixD7v/qwODmHaqelzMAUm8HuNOIbN6kBjWnwlOGZRF3 +# CY81WbnYhqgA/vgxfSz0jAWdwMHVd3Js6U1ZJoPxwrKIV5M1AHxQK7xZ/P4cKTiC +# 095Sl0UpGE6WW526Xxuj8SdQ6geV6G00DThX3DcoNZU6OJzU7WqFXQ4iEV57MIIF +# vDCCA6SgAwIBAgIKYTMmGgAAAAAAMTANBgkqhkiG9w0BAQUFADBfMRMwEQYKCZIm +# iZPyLGQBGRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQD +# EyRNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTAwODMx +# MjIxOTMyWhcNMjAwODMxMjIyOTMyWjB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMK +# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 +# IENvcnBvcmF0aW9uMSMwIQYDVQQDExpNaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBD +# QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJyWVwZMGS/HZpgICBC +# mXZTbD4b1m/My/Hqa/6XFhDg3zp0gxq3L6Ay7P/ewkJOI9VyANs1VwqJyq4gSfTw +# aKxNS42lvXlLcZtHB9r9Jd+ddYjPqnNEf9eB2/O98jakyVxF3K+tPeAoaJcap6Vy +# c1bxF5Tk/TWUcqDWdl8ed0WDhTgW0HNbBbpnUo2lsmkv2hkL/pJ0KeJ2L1TdFDBZ +# +NKNYv3LyV9GMVC5JxPkQDDPcikQKCLHN049oDI9kM2hOAaFXE5WgigqBTK3S9dP +# Y+fSLWLxRT3nrAgA9kahntFbjCZT6HqqSvJGzzc8OJ60d1ylF56NyxGPVjzBrAlf +# A9MCAwEAAaOCAV4wggFaMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMsR6MrS +# tBZYAck3LjMWFrlMmgofMAsGA1UdDwQEAwIBhjASBgkrBgEEAYI3FQEEBQIDAQAB +# MCMGCSsGAQQBgjcVAgQWBBT90TFO0yaKleGYYDuoMW+mPLzYLTAZBgkrBgEEAYI3 +# FAIEDB4KAFMAdQBiAEMAQTAfBgNVHSMEGDAWgBQOrIJgQFYnl+UlE/wq4QpTlVnk +# pDBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtp +# L2NybC9wcm9kdWN0cy9taWNyb3NvZnRyb290Y2VydC5jcmwwVAYIKwYBBQUHAQEE +# SDBGMEQGCCsGAQUFBzAChjhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl +# cnRzL01pY3Jvc29mdFJvb3RDZXJ0LmNydDANBgkqhkiG9w0BAQUFAAOCAgEAWTk+ +# fyZGr+tvQLEytWrrDi9uqEn361917Uw7LddDrQv+y+ktMaMjzHxQmIAhXaw9L0y6 +# oqhWnONwu7i0+Hm1SXL3PupBf8rhDBdpy6WcIC36C1DEVs0t40rSvHDnqA2iA6VW +# 4LiKS1fylUKc8fPv7uOGHzQ8uFaa8FMjhSqkghyT4pQHHfLiTviMocroE6WRTsgb +# 0o9ylSpxbZsa+BzwU9ZnzCL/XB3Nooy9J7J5Y1ZEolHN+emjWFbdmwJFRC9f9Nqu +# 1IIybvyklRPk62nnqaIsvsgrEA5ljpnb9aL6EiYJZTiU8XofSrvR4Vbo0HiWGFzJ +# NRZf3ZMdSY4tvq00RBzuEBUaAF3dNVshzpjHCe6FDoxPbQ4TTj18KUicctHzbMrB +# 7HCjV5JXfZSNoBtIA1r3z6NnCnSlNu0tLxfI5nI3EvRvsTxngvlSso0zFmUeDord +# EN5k9G/ORtTTF+l5xAS00/ss3x+KnqwK+xMnQK3k+eGpf0a7B2BHZWBATrBC7E7t +# s3Z52Ao0CW0cgDEf4g5U3eWh++VHEK1kmP9QFi58vwUheuKVQSdpw5OPlcmN2Jsh +# rg1cnPCiroZogwxqLbt2awAdlq3yFnv2FoMkuYjPaqhHMS+a3ONxPdcAfmJH0c6I +# ybgY+g5yjcGjPa8CQGr/aZuW4hCoELQ3UAjWwz0wggYHMIID76ADAgECAgphFmg0 +# AAAAAAAcMA0GCSqGSIb3DQEBBQUAMF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAX +# BgoJkiaJk/IsZAEZFgltaWNyb3NvZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290 +# IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNzA0MDMxMjUzMDlaFw0yMTA0MDMx +# MzAzMDlaMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD +# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAf +# BgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQTCCASIwDQYJKoZIhvcNAQEB +# BQADggEPADCCAQoCggEBAJ+hbLHf20iSKnxrLhnhveLjxZlRI1Ctzt0YTiQP7tGn +# 0UytdDAgEesH1VSVFUmUG0KSrphcMCbaAGvoe73siQcP9w4EmPCJzB/LMySHnfL0 +# Zxws/HvniB3q506jocEjU8qN+kXPCdBer9CwQgSi+aZsk2fXKNxGU7CG0OUoRi4n +# rIZPVVIM5AMs+2qQkDBuh/NZMJ36ftaXs+ghl3740hPzCLdTbVK0RZCfSABKR2YR +# JylmqJfk0waBSqL5hKcRRxQJgp+E7VV4/gGaHVAIhQAQMEbtt94jRrvELVSfrx54 +# QTF3zJvfO4OToWECtR0Nsfz3m7IBziJLVP/5BcPCIAsCAwEAAaOCAaswggGnMA8G +# A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCM0+NlSRnAK7UD7dvuzK7DDNbMPMAsG +# A1UdDwQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADCBmAYDVR0jBIGQMIGNgBQOrIJg +# QFYnl+UlE/wq4QpTlVnkpKFjpGEwXzETMBEGCgmSJomT8ixkARkWA2NvbTEZMBcG +# CgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3Qg +# Q2VydGlmaWNhdGUgQXV0aG9yaXR5ghB5rRahSqClrUxzWPQHEy5lMFAGA1UdHwRJ +# MEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1 +# Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYB +# BQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljcm9z +# b2Z0Um9vdENlcnQuY3J0MBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEB +# BQUAA4ICAQAQl4rDXANENt3ptK132855UU0BsS50cVttDBOrzr57j7gu1BKijG1i +# uFcCy04gE1CZ3XpA4le7r1iaHOEdAYasu3jyi9DsOwHu4r6PCgXIjUji8FMV3U+r +# kuTnjWrVgMHmlPIGL4UD6ZEqJCJw+/b85HiZLg33B+JwvBhOnY5rCnKVuKE5nGct +# xVEO6mJcPxaYiyA/4gcaMvnMMUp2MT0rcgvI6nA9/4UKE9/CCmGO8Ne4F+tOi3/F +# NSteo7/rvH0LQnvUU3Ih7jDKu3hlXFsBFwoUDtLaFJj1PLlmWLMtL+f5hYbMUVbo +# nXCUbKw5TNT2eb+qGHpiKe+imyk0BncaYsk9Hm0fgvALxyy7z0Oz5fnsfbXjpKh0 +# NbhOxXEjEiZ2CzxSjHFaRkMUvLOzsE1nyJ9C/4B5IYCeFTBm6EISXhrIniIh0EPp +# K+m79EjMLNTYMoBMJipIJF9a6lbvpt6Znco6b72BJ3QGEe52Ib+bgsEnVLaxaj2J +# oXZhtG6hE6a/qkfwEm/9ijJssv7fUciMI8lmvZ0dhxJkAj0tr1mPuOQh5bWwymO0 +# eFQF1EEuUKyUsKV4q7OglnUa2ZKHE3UiLzKoCG6gW4wlv6DvhMoh1useT8ma7kng +# 9wFlb4kLfchpyOZu6qeXzjEp/w7FW1zYTRuh2Povnj8uVRZryROj/TGCBKcwggSj +# AgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD +# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAh +# BgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBAhMzAAAAymzVMhI1xOFV +# AAEAAADKMAkGBSsOAwIaBQCggcAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw +# HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFFNt +# DhScbWHVDFMkTLRd2qRP8wFeMGAGCisGAQQBgjcCAQwxUjBQoCaAJABXAGkAbgBk +# AG8AdwBzACAAUABvAHcAZQByAFMAaABlAGwAbKEmgCRodHRwOi8vd3d3Lm1pY3Jv +# c29mdC5jb20vcG93ZXJzaGVsbCAwDQYJKoZIhvcNAQEBBQAEggEAddyT//E7Ysbi +# U9kfhQrYkjrhhZCKOzQPVAZSNxWx246MveRe1aj3A+Kr868dYH3x8or8g7MpeJig +# 0WOx4O+mw4fUCdTT6fLqo+W8Q+5qNpWjpfpP5eq7firhhh5D8jB1h7tJWI7fkvHN +# VwadYG4t4BxGIFgsn6YIgPn8ZipmOLb8zvCaDPpg9Xr5U5YKKUrA3sgiuW+zf0aK +# r506K+pfuC56XItbX25VEvf+hjazJr2UasFTweV4mCgKHoAG1UluKUZaX8B+KaKB +# DGMUJ3pCAqyt9RCTSQC9xZxWyK+g0byzn2dpCNxWDXHI7SxCs8ejBhp5yYtlBXl7 +# vkGAXdlJ9aGCAigwggIkBgkqhkiG9w0BCQYxggIVMIICEQIBATCBjjB3MQswCQYD +# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe +# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNyb3Nv +# ZnQgVGltZS1TdGFtcCBQQ0ECEzMAAAB0DYBkDn1nfaMAAAAAAHQwCQYFKw4DAhoF +# AKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE1 +# MDUxMTE4MTE1M1owIwYJKoZIhvcNAQkEMRYEFJl30ao3ese0x5O4lPs3SVZVIOdq +# MA0GCSqGSIb3DQEBBQUABIIBAESrx9oY0vI7nyBV0AwzpSYTA/jQF/+MGVokP7ak +# 5i7x25UMc7+RRMROW9VxhzYpzPtotmF8H4rfZsJLxPRlbFF2pu+8MKiNAKiP851m +# tsD1Cw8AN7T31LG8Syk3yKtEvsvnc3yzZy6sXUbkn02yjHNp0PMsrQJNw9ALRc/p +# s3mHzZTqYkmFeHUHzsRa97ByExmjPnP4vcfK2HdZ+oq2EiLjGICooqimt2ys/BPy +# 7nYZaeHaKaNJtnOQHM2BqN38OcH7X7K4IzxCNceXEION6gZE6wqvp+dkvpN5wasL +# OkQhubomAuN/S2TGKwjx3H45G1dpl3LXqihqtqF/Sed7MZs= +# SIG # End signature block diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtils.psm1 b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtils.psm1 index 611e45d815a..e31e429fe9d 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtils.psm1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtils.psm1 @@ -1,231 +1,231 @@ -Import-LocalizedData LocalizedData -FileName Microsoft.PowerShell.ODataUtilsStrings.psd1 - - -# This module doesn't support Arm because of Add-Type cmdlet -$ProcessorArchitecture = (Get-WmiObject -query "Select Architecture from Win32_Processor").Architecture - -# 0 = x86 -# 1 = MIPS -# 2 = Alpha -# 3 = PowerPC -# 5 = ARM -# 6 = Itanium -# 9 = x64 -if ($ProcessorArchitecture -eq 5) -{ - throw $LocalizedData.ArchitectureNotSupported -f "ARM" -} - -. "$PSScriptRoot\Microsoft.PowerShell.ODataUtilsHelper.ps1" - -######################################################### -# Generates PowerShell module containing client side -# proxy cmdlets that can be used to interact with an -# OData based server side endpoint. -######################################################### -function Export-ODataEndpointProxy -{ - [CmdletBinding( - DefaultParameterSetName='CDXML', - SupportsShouldProcess=$true, - HelpUri="https://go.microsoft.com/fwlink/?LinkId=510069")] - [OutputType([System.IO.FileInfo])] - param - ( - [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] - [ValidateNotNullOrEmpty()] - [string] $Uri, - - [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true)] - [ValidateNotNullOrEmpty()] - [string] $OutputModule, - - [Parameter(Position=2, ValueFromPipelineByPropertyName=$true)] - [ValidateNotNullOrEmpty()] - [string] $MetadataUri, - - [Parameter(Position=3, ValueFromPipelineByPropertyName=$true)] - [PSCredential] $Credential, - - [Parameter(Position=4, ValueFromPipelineByPropertyName=$true)] - [ValidateSet('Put', 'Post', 'Patch')] - [string] $CreateRequestMethod='Post', - - [Parameter(Position=5, ValueFromPipelineByPropertyName=$true)] - [ValidateSet('Put', 'Post', 'Patch')] - [string] $UpdateRequestMethod='Patch', - - [Parameter(Position=6, ValueFromPipelineByPropertyName=$true)] - [ValidateSet('ODataAdapter', 'NetworkControllerAdapter', 'ODataV4Adapter')] - [string] $CmdletAdapter='ODataAdapter', - - [Parameter(Position=7, ValueFromPipelineByPropertyName=$true)] - [Hashtable] $ResourceNameMapping, - - [parameter (Position=8,ValueFromPipelineByPropertyName=$true)] - [switch] $Force, - - [Parameter(Position=9, ValueFromPipelineByPropertyName=$true)] - [Hashtable] $CustomData, - - [parameter (Position=10,ValueFromPipelineByPropertyName=$true)] - [switch] $AllowClobber, - - [parameter (Position=11,ValueFromPipelineByPropertyName=$true)] - [switch] $AllowUnsecureConnection, - - [parameter (Position=12,ValueFromPipelineByPropertyName=$true)] - [ValidateNotNull()] - [Hashtable] $Headers - ) - - BEGIN - { - if (!$MetadataUri) - { - $Uri = $Uri.TrimEnd('/') - $MetadataUri = $Uri + '/$metadata' - $PSBoundParameters["MetadataUri"] = $MetadataUri - } - - # Validate to make sure that a valid URI is supplied as input. - try - { - $connectionUri = [System.Uri]::new($Uri) - } - catch - { - $errorMessage = ($LocalizedData.InValidUri -f $Uri) - $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidUriFormat" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $Uri - $PSCmdlet.ThrowTerminatingError($errorRecord) - } - - # Block Redfish-support for in-box version of the module and advise user to use a version from PS Gallery instead. - # According to Redfish specification DSP0266v1.0.1 Redfish Service Metadata Document and Redfish Service Root URIs (used by Export-ODataEndpointProxy) are required to start with '/redfish/v1' (section "6.3 Redfish-Defined URIs and Relative URI Rules"). - # We use this as indicator of whether Export-ODataEndpointProxy was attempted against a Redfish endpoint. - if($connectionUri.AbsolutePath.StartsWith('/redfish/',[StringComparison]::OrdinalIgnoreCase)) - { - $errorMessage = $LocalizedData.RedfishNotEnabled - $exception = [System.InvalidOperationException]::new($errorMessage) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyRedfishNotEnabled" $errorMessage ([System.Management.Automation.ErrorCategory]::NotEnabled) $exception $Uri - $PSCmdlet.ThrowTerminatingError($errorRecord) - } - - if($connectionUri.Scheme -eq "http" -and !$AllowUnsecureConnection.IsPresent) - { - $errorMessage = ($LocalizedData.AllowUnsecureConnectionMessage -f $PSCmdlet.MyInvocation.MyCommand.Name, $Uri, "Uri") - $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyUnSecureConnection" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $Uri - $PSCmdlet.ThrowTerminatingError($errorRecord) - } - - $OutputModuleExists = Test-Path -Path $OutputModule -PathType Container - - if($OutputModuleExists -and ($Force -eq $false)) - { - $errorMessage = ($LocalizedData.ModuleAlreadyExistsAndForceParameterIsNotSpecified -f $OutputModule) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyOutputModuleExists" $errorMessage ([System.Management.Automation.ErrorCategory]::ResourceExists) $null $OutputModule - $PSCmdlet.ThrowTerminatingError($errorRecord) - } - - $isWhatIf = $psboundparameters.ContainsKey("WhatIf") - - if(!$OutputModuleExists) - { - if(!$isWhatIf) - { - $OutputModule = (New-Item -Path $OutputModule -ItemType Directory).FullName - } - } - else - { - $resolvedOutputModulePath = Resolve-Path -Path $OutputModule -ErrorAction Stop -Verbose - if($resolvedOutputModulePath.Count -gt 1) - { - $errorMessage = ($LocalizedData.OutputModulePathIsNotUnique -f $OutputModule) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyOutputModulePathIsNotUnique" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $null $OutputModule - $PSCmdlet.ThrowTerminatingError($errorRecord) - } - - # Make sure that the path specified is a valid file system directory path. - if([system.IO.Directory]::Exists($resolvedOutputModulePath)) - { - $OutputModule = $resolvedOutputModulePath - } - else - { - $errorMessage = ($LocalizedData.OutputModulePathIsNotFileSystemPath -f $OutputModule) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyPathIsNotFileSystemPath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $null $OutputModule - $PSCmdlet.ThrowTerminatingError($errorRecord) - } - } - - $rootDir = [System.IO.Directory]::GetDirectoryRoot($OutputModule) - - if($rootDir -eq $OutputModule) - { - $errorMessage = ($LocalizedData.InvalidOutputModulePath -f $OutputModule) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidOutputModulePath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $null $OutputModule - $PSCmdlet.ThrowTerminatingError($errorRecord) - } - - if(!$isWhatIf) - { - $progressBarStatus = ($LocalizedData.ProgressBarMessage -f $Uri) - ProgressBarHelper "Export-ODataEndpointProxy" $progressBarStatus 0 100 100 1 - } - - # Add parameters to $PSBoundParameters, which were not passed by user, but the default value is set - $parametersWithDefaultValue = @("CreateRequestMethod", "UpdateRequestMethod", "CmdletAdapter") - - foreach ($parameterWithDefaultValue in $parametersWithDefaultValue) - { - if (!$PSBoundParameters.ContainsKey($parameterWithDefaultValue)) - { - $PSBoundParameters.Add($parameterWithDefaultValue, (Get-Variable $parameterWithDefaultValue).Value) - } - } - } - - END - { - if($pscmdlet.ShouldProcess($Uri)) - { - try - { - $PSBoundParameters.Add("ProgressBarStatus", $progressBarStatus) - $PSBoundParameters.Add("PSCmdlet", $PSCmdlet) - - # Import module based on selected CmdletAdapter - $adapterToImport = $CmdletAdapter - - # NetworkControllerAdapter relies on ODataAdapter - if ($CmdletAdapter -eq 'NetworkControllerAdapter') - { - $adapterToImport = 'ODataAdapter' - } - - Write-Debug ($LocalizedData.SelectedAdapter -f $adapterPSScript) - - $adapterPSScript = "$PSScriptRoot\Microsoft.PowerShell." + $adapterToImport + ".ps1" - - . $adapterPSScript - ExportODataEndpointProxy @PSBoundParameters - } - catch - { - $errorMessage = ($LocalizedData.InValidMetadata -f $Uri) - $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidInput" $null ([System.Management.Automation.ErrorCategory]::InvalidData) $exception $Uri - $PSCmdlet.ThrowTerminatingError($errorRecord) - } - finally - { - Write-Progress -Activity "Export-ODataEndpointProxy" -Completed - } - } - } -} - -Export-ModuleMember -Function @('Export-ODataEndpointProxy') +Import-LocalizedData LocalizedData -FileName Microsoft.PowerShell.ODataUtilsStrings.psd1 + + +# This module doesn't support Arm because of Add-Type cmdlet +$ProcessorArchitecture = (Get-WmiObject -query "Select Architecture from Win32_Processor").Architecture + +# 0 = x86 +# 1 = MIPS +# 2 = Alpha +# 3 = PowerPC +# 5 = ARM +# 6 = Itanium +# 9 = x64 +if ($ProcessorArchitecture -eq 5) +{ + throw $LocalizedData.ArchitectureNotSupported -f "ARM" +} + +. "$PSScriptRoot\Microsoft.PowerShell.ODataUtilsHelper.ps1" + +######################################################### +# Generates PowerShell module containing client side +# proxy cmdlets that can be used to interact with an +# OData based server side endpoint. +######################################################### +function Export-ODataEndpointProxy +{ + [CmdletBinding( + DefaultParameterSetName='CDXML', + SupportsShouldProcess=$true, + HelpUri="https://go.microsoft.com/fwlink/?LinkId=510069")] + [OutputType([System.IO.FileInfo])] + param + ( + [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] + [ValidateNotNullOrEmpty()] + [string] $Uri, + + [Parameter(Position=1, Mandatory=$true, ValueFromPipelineByPropertyName=$true)] + [ValidateNotNullOrEmpty()] + [string] $OutputModule, + + [Parameter(Position=2, ValueFromPipelineByPropertyName=$true)] + [ValidateNotNullOrEmpty()] + [string] $MetadataUri, + + [Parameter(Position=3, ValueFromPipelineByPropertyName=$true)] + [PSCredential] $Credential, + + [Parameter(Position=4, ValueFromPipelineByPropertyName=$true)] + [ValidateSet('Put', 'Post', 'Patch')] + [string] $CreateRequestMethod='Post', + + [Parameter(Position=5, ValueFromPipelineByPropertyName=$true)] + [ValidateSet('Put', 'Post', 'Patch')] + [string] $UpdateRequestMethod='Patch', + + [Parameter(Position=6, ValueFromPipelineByPropertyName=$true)] + [ValidateSet('ODataAdapter', 'NetworkControllerAdapter', 'ODataV4Adapter')] + [string] $CmdletAdapter='ODataAdapter', + + [Parameter(Position=7, ValueFromPipelineByPropertyName=$true)] + [Hashtable] $ResourceNameMapping, + + [parameter (Position=8,ValueFromPipelineByPropertyName=$true)] + [switch] $Force, + + [Parameter(Position=9, ValueFromPipelineByPropertyName=$true)] + [Hashtable] $CustomData, + + [parameter (Position=10,ValueFromPipelineByPropertyName=$true)] + [switch] $AllowClobber, + + [parameter (Position=11,ValueFromPipelineByPropertyName=$true)] + [switch] $AllowUnsecureConnection, + + [parameter (Position=12,ValueFromPipelineByPropertyName=$true)] + [ValidateNotNull()] + [Hashtable] $Headers + ) + + BEGIN + { + if (!$MetadataUri) + { + $Uri = $Uri.TrimEnd('/') + $MetadataUri = $Uri + '/$metadata' + $PSBoundParameters["MetadataUri"] = $MetadataUri + } + + # Validate to make sure that a valid URI is supplied as input. + try + { + $connectionUri = [System.Uri]::new($Uri) + } + catch + { + $errorMessage = ($LocalizedData.InValidUri -f $Uri) + $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidUriFormat" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $Uri + $PSCmdlet.ThrowTerminatingError($errorRecord) + } + + # Block Redfish-support for in-box version of the module and advise user to use a version from PS Gallery instead. + # According to Redfish specification DSP0266v1.0.1 Redfish Service Metadata Document and Redfish Service Root URIs (used by Export-ODataEndpointProxy) are required to start with '/redfish/v1' (section "6.3 Redfish-Defined URIs and Relative URI Rules"). + # We use this as indicator of whether Export-ODataEndpointProxy was attempted against a Redfish endpoint. + if($connectionUri.AbsolutePath.StartsWith('/redfish/',[StringComparison]::OrdinalIgnoreCase)) + { + $errorMessage = $LocalizedData.RedfishNotEnabled + $exception = [System.InvalidOperationException]::new($errorMessage) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyRedfishNotEnabled" $errorMessage ([System.Management.Automation.ErrorCategory]::NotEnabled) $exception $Uri + $PSCmdlet.ThrowTerminatingError($errorRecord) + } + + if($connectionUri.Scheme -eq "http" -and !$AllowUnsecureConnection.IsPresent) + { + $errorMessage = ($LocalizedData.AllowUnsecureConnectionMessage -f $PSCmdlet.MyInvocation.MyCommand.Name, $Uri, "Uri") + $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyUnSecureConnection" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $Uri + $PSCmdlet.ThrowTerminatingError($errorRecord) + } + + $OutputModuleExists = Test-Path -Path $OutputModule -PathType Container + + if($OutputModuleExists -and ($Force -eq $false)) + { + $errorMessage = ($LocalizedData.ModuleAlreadyExistsAndForceParameterIsNotSpecified -f $OutputModule) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyOutputModuleExists" $errorMessage ([System.Management.Automation.ErrorCategory]::ResourceExists) $null $OutputModule + $PSCmdlet.ThrowTerminatingError($errorRecord) + } + + $isWhatIf = $psboundparameters.ContainsKey("WhatIf") + + if(!$OutputModuleExists) + { + if(!$isWhatIf) + { + $OutputModule = (New-Item -Path $OutputModule -ItemType Directory).FullName + } + } + else + { + $resolvedOutputModulePath = Resolve-Path -Path $OutputModule -ErrorAction Stop -Verbose + if($resolvedOutputModulePath.Count -gt 1) + { + $errorMessage = ($LocalizedData.OutputModulePathIsNotUnique -f $OutputModule) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyOutputModulePathIsNotUnique" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $null $OutputModule + $PSCmdlet.ThrowTerminatingError($errorRecord) + } + + # Make sure that the path specified is a valid file system directory path. + if([system.IO.Directory]::Exists($resolvedOutputModulePath)) + { + $OutputModule = $resolvedOutputModulePath + } + else + { + $errorMessage = ($LocalizedData.OutputModulePathIsNotFileSystemPath -f $OutputModule) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyPathIsNotFileSystemPath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $null $OutputModule + $PSCmdlet.ThrowTerminatingError($errorRecord) + } + } + + $rootDir = [System.IO.Directory]::GetDirectoryRoot($OutputModule) + + if($rootDir -eq $OutputModule) + { + $errorMessage = ($LocalizedData.InvalidOutputModulePath -f $OutputModule) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidOutputModulePath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $null $OutputModule + $PSCmdlet.ThrowTerminatingError($errorRecord) + } + + if(!$isWhatIf) + { + $progressBarStatus = ($LocalizedData.ProgressBarMessage -f $Uri) + ProgressBarHelper "Export-ODataEndpointProxy" $progressBarStatus 0 100 100 1 + } + + # Add parameters to $PSBoundParameters, which were not passed by user, but the default value is set + $parametersWithDefaultValue = @("CreateRequestMethod", "UpdateRequestMethod", "CmdletAdapter") + + foreach ($parameterWithDefaultValue in $parametersWithDefaultValue) + { + if (!$PSBoundParameters.ContainsKey($parameterWithDefaultValue)) + { + $PSBoundParameters.Add($parameterWithDefaultValue, (Get-Variable $parameterWithDefaultValue).Value) + } + } + } + + END + { + if($pscmdlet.ShouldProcess($Uri)) + { + try + { + $PSBoundParameters.Add("ProgressBarStatus", $progressBarStatus) + $PSBoundParameters.Add("PSCmdlet", $PSCmdlet) + + # Import module based on selected CmdletAdapter + $adapterToImport = $CmdletAdapter + + # NetworkControllerAdapter relies on ODataAdapter + if ($CmdletAdapter -eq 'NetworkControllerAdapter') + { + $adapterToImport = 'ODataAdapter' + } + + Write-Debug ($LocalizedData.SelectedAdapter -f $adapterPSScript) + + $adapterPSScript = "$PSScriptRoot\Microsoft.PowerShell." + $adapterToImport + ".ps1" + + . $adapterPSScript + ExportODataEndpointProxy @PSBoundParameters + } + catch + { + $errorMessage = ($LocalizedData.InValidMetadata -f $Uri) + $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidInput" $null ([System.Management.Automation.ErrorCategory]::InvalidData) $exception $Uri + $PSCmdlet.ThrowTerminatingError($errorRecord) + } + finally + { + Write-Progress -Activity "Export-ODataEndpointProxy" -Completed + } + } + } +} + +Export-ModuleMember -Function @('Export-ODataEndpointProxy') diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtilsHelper.ps1 b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtilsHelper.ps1 index 8a4c65424f1..59c77ebd316 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtilsHelper.ps1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataUtilsHelper.ps1 @@ -1,782 +1,782 @@ -# Base class definitions used by the actual Adapter modules -$global:BaseClassDefinitions = @" -using System; - -namespace ODataUtils -{ - public class TypeProperty - { - public String Name; - - // OData Type Name, e.g. Edm.Int32 - public String TypeName; - - public bool IsKey; - public bool IsMandatory; - public bool? IsNullable; - } - - public class NavigationProperty - { - public String Name; - - public String FromRole; - public String ToRole; - public String AssociationNamespace; - public String AssociationName; - } - - public class EntityTypeBase - { - public String Namespace; - public String Name; - public TypeProperty[] EntityProperties; - public bool IsEntity; - public EntityTypeBase BaseType; - } - - public class AssociationType - { - public String Namespace; - - public EntityTypeBase EndType1; - public String Multiplicity1; - public String NavPropertyName1; - - public EntityTypeBase EndType2; - public String Multiplicity2; - public String NavPropertyName2; - } - - public class EntitySet - { - public String Namespace; - public String Name; - public EntityTypeBase Type; - } - - public class AssociationSet - { - public String Namespace; - public String Name; - public AssociationType Type; - } - - public class Action - { - public String Namespace; - public String Verb; - public EntitySet EntitySet; - public Boolean IsSideEffecting; - public Boolean IsBindable; - public Boolean IsSingleInstance; - public TypeProperty[] Parameters; - } - - public class MetadataBase - { - // Desired destination namespace - public String Namespace; - } - - public class CmdletParameter - { - public CmdletParameter() - { - } - - public CmdletParameter(String type, String name) - { - this.Type = type; - this.Name = name; - this.Qualifiers = new String[] { "Parameter(ValueFromPipelineByPropertyName=`$true)" }; - } - - public String[] Qualifiers; - public String Type; - public String Name; - } - - public class CmdletParameters - { - public CmdletParameter[] Parameters; - } - - public class ReferentialConstraint - { - public String Property; - public String ReferencedProperty; - } - - public class OnDelete - { - public String Action; - } - - public class NavigationPropertyV4 - { - public String Name; - public String Type; - public bool Nullable; - public String Partner; - public bool ContainsTarget; - public ReferentialConstraint[] ReferentialConstraints; - public OnDelete OnDelete; - } - - public class NavigationPropertyBinding - { - public String Path; - public String Target; - } - - public class EntityTypeV4 : EntityTypeBase - { - public String Alias; - public NavigationPropertyV4[] NavigationProperties; - public String BaseTypeStr; - } - - public class SingletonType - { - public String Namespace; - public String Alias; - public String Name; - public String Type; - public NavigationPropertyBinding[] NavigationPropertyBindings; - } - - public class EntitySetV4 - { - public String Namespace; - public String Alias; - public String Name; - public EntityTypeV4 Type; - } - - public class EnumMember - { - public String Name; - public String Value; - } - - public class EnumType - { - public String Namespace; - public String Alias; - public String Name; - public String UnderlyingType; - public bool IsFlags; - public EnumMember[] Members; - } - - public class ActionV4 - { - public String Namespace; - public String Alias; - public String Name; - public String Action; - public EntitySetV4 EntitySet; - public TypeProperty[] Parameters; - } - - public class FunctionV4 - { - public String Namespace; - public String Alias; - public String Name; - public bool Function; - public String EntitySet; - public String ReturnType; - public Parameter[] Parameters; - } - - public class Parameter - { - public String Name; - public String Type; - public bool Nullable; - } - - public class ReferenceInclude - { - public String Namespace; - public String Alias; - } - - public class Reference - { - public String Uri; - } - - public class MetadataV4 : MetadataBase - { - public string ODataVersion; - public string Uri; - public string MetadataUri; - public string Alias; - public Reference[] References; - public string DefaultEntityContainerName; - public EntitySetV4[] EntitySets; - public EntityTypeV4[] EntityTypes; - public SingletonType[] SingletonTypes; - public EntityTypeV4[] ComplexTypes; - public EntityTypeV4[] TypeDefinitions; - public EnumType[] EnumTypes; - public ActionV4[] Actions; - public FunctionV4[] Functions; - } - - public class ReferencedMetadata - { - public System.Collections.ArrayList References; - } - - public class ODataEndpointProxyParameters - { - public String Uri; - public String MetadataUri; - public System.Management.Automation.PSCredential Credential; - public String OutputModule; - - public bool Force; - public bool AllowClobber; - public bool AllowUnsecureConnection; - } - - public class EntityType : EntityTypeBase - { - public NavigationProperty[] NavigationProperties; - } - - public class Metadata : MetadataBase - { - public String DefaultEntityContainerName; - public EntitySet[] EntitySets; - public EntityType[] EntityTypes; - public EntityType[] ComplexTypes; - public AssociationSet[] Associations; - public Action[] Actions; - } -} -"@ - -######################################################### -# GetMetaData is a helper function used to fetch metadata -# from the specified file or web URL. -######################################################### -function GetMetaData -{ - param - ( - [string] $metaDataUri, - [System.Management.Automation.PSCmdlet] $callerPSCmdlet, - [PSCredential] $credential, - [Hashtable] $headers - ) - - # $metaDataUri is already validated at the cmdlet layer. - if($null -eq $callerPSCmdletl) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "GetMetaData") } - Write-Verbose ($LocalizedData.VerboseReadingMetadata -f $metaDataUri) - - try - { - $uri = [System.Uri]::new($metadataUri) - - # By default, proxy generation is supported on secured Uri (i.e., https). - # However if the user trusts the unsecure http uri, then they can override - # the security check by specifying -AllowSecureConnection parameter during - # proxy generation. - if($uri.Scheme -eq "http" -and !$AllowUnsecureConnection.IsPresent) - { - $errorMessage = ($LocalizedData.AllowUnsecureConnectionMessage -f $callerPSCmdlet.MyInvocation.MyCommand.Name, $uri, "MetaDataUri") - $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyUnSecureConnection" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $uri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - } - catch - { - $errorMessage = ($LocalizedData.InValidMetadata -f $MetadataUri) - $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetadataUriFormat" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $MetadataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - - if($uri.IsFile) - { - if ($null -ne $credential) - { - $fileExists = Test-Path -Path $metaDataUri -PathType Leaf -Credential $credential -ErrorAction Stop - } - else - { - $fileExists = Test-Path -Path $metaDataUri -PathType Leaf -ErrorAction Stop - } - - if($fileExists) - { - $metaData = Get-Content -Path $metaDataUri -ErrorAction Stop - } - else - { - $errorMessage = ($LocalizedData.MetadataUriDoesNotExist -f $MetadataUri) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyMetadataFileDoesNotExist" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $null $MetadataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - } - else - { - try - { - $cmdParams = @{'Uri'= $metaDataUri ; 'UseBasicParsing'=$true; 'ErrorAction'= 'Stop'} - - if ($null -ne $credential) - { - $cmdParams.Add('Credential', $credential) - } - - if ($null -ne $headers) - { - $cmdParams.Add('Headers', $headers) - } - - $webResponse = Invoke-WebRequest @cmdParams - } - catch - { - $errorMessage = ($LocalizedData.MetadataUriDoesNotExist -f $MetadataUri) - $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyMetadataUriDoesNotExist" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $MetadataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - - if($null -ne $webResponse) - { - if ($webResponse.StatusCode -eq 200) - { - $metaData = $webResponse.Content - - if ($null -eq $metadata) - { - $errorMessage = ($LocalizedData.EmptyMetadata -f $MetadataUri) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyMetadataIsEmpty" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $null $MetadataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - } - else - { - $errorMessage = ($LocalizedData.InvalidEndpointAddress -f $MetadataUri, $webResponse.StatusCode) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidEndpointAddress" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $null $MetadataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - } - } - - if($null -ne $metaData) - { - try - { - [xml] $metadataXML = $metaData - } - catch - { - $errorMessage = ($LocalizedData.InValidMetadata -f $MetadataUri) - $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) - $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetadata" $null ([System.Management.Automation.ErrorCategory]::InvalidData) $exception $MetadataUri - $callerPSCmdlet.ThrowTerminatingError($errorRecord) - } - } - - return $metadataXML -} - -######################################################### -# VerifyMetadataHelper is a helper function used to -# validate if Error/Warning message has to be displayed -# during command collision. -######################################################### -function VerifyMetadataHelper -{ - param - ( - [string] $localizedDataErrorString, - [string] $localizedDataWarningString, - [string] $entitySetName, - [string] $currentCommandName, - [string] $metaDataUri, - [boolean] $allowClobber, - [System.Management.Automation.PSCmdlet] $callerPSCmdlet - ) - - if($null -eq $localizedDataErrorString) { throw ($LocalizedData.ArguementNullError -f "localizedDataErrorString", "VerifyMetadataHelper") } - if($null -eq $localizedDataWarningString) { throw ($LocalizedData.ArguementNullError -f "localizedDataWarningString", "VerifyMetadataHelper") } - - if(!$allowClobber) - { - # Write Error message and skip current Entity Set. - $errorMessage = ($localizedDataErrorString -f $entitySetName, $currentCommandName) - $exception = [System.InvalidOperationException]::new($errorMessage) - $errorRecord = CreateErrorRecordHelper "ODataEndpointDefaultPropertyCollision" $null ([System.Management.Automation.ErrorCategory]::InvalidOperation) $exception $metaDataUri - $callerPSCmdlet.WriteError($errorRecord) - } - else - { - $warningMessage = ($localizedDataWarningString -f $entitySetName, $currentCommandName) - $callerPSCmdlet.WriteWarning($warningMessage) - } -} - -######################################################### -# CreateErrorRecordHelper is a helper function used to -# create an error record. -######################################################### -function CreateErrorRecordHelper -{ - param - ( - [string] $errorId, - [string] $errorMessage, - [System.Management.Automation.ErrorCategory] $errorCategory, - [Exception] $exception, - [object] $targetObject - ) - - if($null -eq $exception) - { - $exception = New-Object System.IO.IOException $errorMessage - } - - $errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $targetObject - return $errorRecord -} - -######################################################### -# ProgressBarHelper is a helper function used to -# used to display progress message. -######################################################### -function ProgressBarHelper -{ - param - ( - [string] $cmdletName, - [string] $status, - [double] $previousSegmentWeight, - [double] $currentSegmentWeight, - [int] $totalNumberofEntries, - [int] $currentEntryCount - ) - - if($null -eq $cmdletName) { throw ($LocalizedData.ArguementNullError -f "CmdletName", "ProgressBarHelper") } - if($null -eq $status) { throw ($LocalizedData.ArguementNullError -f "Status", "ProgressBarHelper") } - - if($currentEntryCount -gt 0 -and - $totalNumberofEntries -gt 0 -and - $previousSegmentWeight -ge 0 -and - $currentSegmentWeight -gt 0) - { - $entryDefaultWeight = $currentSegmentWeight/[double]$totalNumberofEntries - $percentComplete = $previousSegmentWeight + ($entryDefaultWeight * $currentEntryCount) - Write-Progress -Activity $cmdletName -Status $status -PercentComplete $percentComplete - } -} - -######################################################### -# Convert-ODataTypeToCLRType is a helper function used to -# Convert OData type to its CLR equivalent. -######################################################### -function Convert-ODataTypeToCLRType -{ - param - ( - [string] $typeName, - [Hashtable] $complexTypeMapping - ) - - if($null -eq $typeName) { throw ($LocalizedData.ArguementNullError -f "TypeName", "Convert-ODataTypeToCLRType ") } - - switch ($typeName) - { - "Edm.Binary" {"Byte[]"} - "Edm.Boolean" {"Boolean"} - "Edm.Byte" {"Byte"} - "Edm.DateTime" {"DateTime"} - "Edm.Decimal" {"Decimal"} - "Edm.Double" {"Double"} - "Edm.Single" {"Single"} - "Edm.Guid" {"Guid"} - "Edm.Int16" {"Int16"} - "Edm.Int32" {"Int32"} - "Edm.Int64" {"Int64"} - "Edm.SByte" {"SByte"} - "Edm.String" {"String"} - "Edm.PropertyPath" {"String"} - "switch" {"switch"} - "Edm.DateTimeOffset" {"DateTimeOffset"} - default - { - if($null -ne $complexTypeMapping -and - $complexTypeMapping.Count -gt 0 -and - $complexTypeMapping.ContainsKey($typeName)) - { - $typeName - } - else - { - $regex = "Collection\((.+)\)" - if ($typeName -match $regex) - { - $insideTypeName = Convert-ODataTypeToCLRType $Matches[1] $complexTypeMapping - "$insideTypeName[]" - } - else - { - "PSObject" - } - } - } - } -} - -######################################################### -# SaveCDXMLHeader is a helper function used -# to save CDXML headers common to all -# PSODataUtils modules. -######################################################### -function SaveCDXMLHeader -{ - param - ( - [System.Xml.XmlWriter] $xmlWriter, - [string] $uri, - [string] $className, - [string] $defaultNoun, - [string] $cmdletAdapter - ) - - # $uri & $cmdletAdapter are already validated at the cmdlet layer. - if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "SaveCDXMLHeader") } - if($null -eq $defaultNoun) { throw ($LocalizedData.ArguementNullError -f "DefaultNoun", "SaveCDXMLHeader") } - - if ($className -eq 'ServiceActions' -Or $cmdletAdapter -eq "NetworkControllerAdapter") - { - $entityName = '' - } - else - { - $entityName = $className - } - - if ($uri[-1] -ne '/') - { - $fullName = "$uri/$entityName" - } - else - { - $fullName = "$uri$entityName" - } - - $xmlWriter.Formatting = 'Indented' - $xmlWriter.Indentation = 2 - $xmlWriter.IndentChar = ' ' - - $xmlWriter.WriteStartDocument() - - $today=Get-Date - $xmlWriter.WriteComment("This module was autogenerated by PSODataUtils on $today.") - - $xmlWriter.WriteStartElement('PowerShellMetadata') - $xmlWriter.WriteAttributeString('xmlns', 'http://schemas.microsoft.com/cmdlets-over-objects/2009/11') - - $xmlWriter.WriteStartElement('Class') - $xmlWriter.WriteAttributeString('ClassName', $fullName) - $xmlWriter.WriteAttributeString('ClassVersion', '1.0.0') - - $DotNetAdapter = 'Microsoft.PowerShell.Cmdletization.OData.ODataCmdletAdapter' - - if ($CmdletAdapter -eq "NetworkControllerAdapter") { - $DotNetAdapter = 'Microsoft.PowerShell.Cmdletization.OData.NetworkControllerCmdletAdapter' - } - elseif ($CmdletAdapter -eq "ODataV4Adapter") { - $DotNetAdapter = 'Microsoft.PowerShell.Cmdletization.OData.ODataV4CmdletAdapter' - } - - $xmlWriter.WriteAttributeString('CmdletAdapter', $DotNetAdapter + ', Microsoft.PowerShell.Cmdletization.OData, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35') - - $xmlWriter.WriteElementString('Version', '1.0') - $xmlWriter.WriteElementString('DefaultNoun', $defaultNoun) - - $xmlWriter -} - -######################################################### -# SaveCDXMLFooter is a helper function used -# to save CDXML closing attributes corresponding -# to SaveCDXMLHeader function. -######################################################### -function SaveCDXMLFooter -{ - param - ( - [System.Xml.XmlWriter] $xmlWriter - ) - - if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "SaveCDXMLFooter") } - - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndDocument() - - $xmlWriter.Flush() - $xmlWriter.Close() -} - -######################################################### -# AddParametersNode is a helper function used -# to add parameters to the generated proxy cmdlet, -# based on mandatoryProperties and otherProperties. -# PrefixForKeys is used by associations to append a -# prefix to PowerShell parameter name. -######################################################### -function AddParametersNode -{ - param - ( - [Parameter(Mandatory=$true)] - [System.Xml.XmlWriter] $xmlWriter, - [ODataUtils.TypeProperty[]] $keyProperties, - [ODataUtils.TypeProperty[]] $mandatoryProperties, - [ODataUtils.TypeProperty[]] $otherProperties, - [string] $prefixForKeys, - [boolean] $addForceParameter, - [boolean] $addParametersElement, - [Hashtable] $complexTypeMapping - ) - - if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "AddParametersNode") } - - if(($keyProperties.Length -gt 0) -or - ($mandatoryProperties.Length -gt 0) -or - ($otherProperties.Length -gt 0) -or - ($addForceParameter)) - { - if($addParametersElement) - { - $xmlWriter.WriteStartElement('Parameters') - } - - $pos = 0 - - if ($null -ne $keyProperties) - { - $pos = AddParametersCDXML $xmlWriter $keyProperties $pos $true $prefixForKeys ":Key" $complexTypeMapping - } - - if ($null -ne $mandatoryProperties) - { - $pos = AddParametersCDXML $xmlWriter $mandatoryProperties $pos $true $null $null $complexTypeMapping - } - - if ($null -ne $otherProperties) - { - $pos = AddParametersCDXML $xmlWriter $otherProperties $pos $false $null $null $complexTypeMapping - } - - if($addForceParameter) - { - $forceParameter = [ODataUtils.TypeProperty] @{ - "Name" = "Force"; - "TypeName" = "switch"; - "IsNullable" = $false - } - - $pos = AddParametersCDXML $xmlWriter $forceParameter $pos $false $null $null $complexTypeMapping - } - - if($addParametersElement) - { - $xmlWriter.WriteEndElement() - } - } -} - -######################################################### -# AddParametersCDXML is a helper function used -# to add Parameter node to CDXML based on properties. -# Prefix is appended to PS parameter names, used for -# associations. Suffix is appended to all parameter -# names, for ex. to differentiate keys. returns new $pos -######################################################### -function AddParametersCDXML -{ - param - ( - [Parameter(Mandatory=$true)] - [System.Xml.XmlWriter] $xmlWriter, - [ODataUtils.TypeProperty[]] $properties, - [Parameter(Mandatory=$true)] - [int] $pos, - [bool] $isMandatory, - [string] $prefix, - [string] $suffix, - [Hashtable] $complexTypeMapping - ) - - $properties | Where-Object { $null -ne $_ } | ForEach-Object { - $xmlWriter.WriteStartElement('Parameter') - $xmlWriter.WriteAttributeString('ParameterName', $_.Name + $suffix) - $xmlWriter.WriteStartElement('Type') - $PSTypeName = Convert-ODataTypeToCLRType $_.TypeName $complexTypeMapping - $xmlWriter.WriteAttributeString('PSType', $PSTypeName) - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('CmdletParameterMetadata') - $xmlWriter.WriteAttributeString('PSName', $prefix + $_.Name) - $xmlWriter.WriteAttributeString('IsMandatory', ($isMandatory).ToString().ToLowerInvariant()) - $xmlWriter.WriteAttributeString('Position', $pos) - if($isMandatory) - { - $xmlWriter.WriteAttributeString('ValueFromPipelineByPropertyName', 'true') - } - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() - - $pos++ - } - - $pos -} - -######################################################### -# GenerateSetProxyCmdlet is a helper function used -# to generate Set-* proxy cmdlet. The proxy cmdlet is -# generated in the CDXML compliant format. -######################################################### -function GenerateSetProxyCmdlet -{ - param - ( - [System.XMl.XmlTextWriter] $xmlWriter, - [object[]] $keyProperties, - [object[]] $nonKeyProperties, - [Hashtable] $complexTypeMapping - ) - - # $cmdletAdapter is already validated at the cmdlet layer. - if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "GenerateSetProxyCmdlet") } - - $xmlWriter.WriteStartElement('Cmdlet') - $xmlWriter.WriteStartElement('CmdletMetadata') - $xmlWriter.WriteAttributeString('Verb', 'Set') - $xmlWriter.WriteAttributeString('DefaultCmdletParameterSet', 'Default') - $xmlWriter.WriteAttributeString('ConfirmImpact', 'Medium') - $xmlWriter.WriteEndElement() - - $xmlWriter.WriteStartElement('Method') - $xmlWriter.WriteAttributeString('MethodName', 'Update') - $xmlWriter.WriteAttributeString('CmdletParameterSet', 'Default') - - AddParametersNode $xmlWriter $keyProperties $null $nonKeyProperties $null $true $true $complexTypeMapping - $xmlWriter.WriteEndElement() - $xmlWriter.WriteEndElement() -} +# Base class definitions used by the actual Adapter modules +$global:BaseClassDefinitions = @" +using System; + +namespace ODataUtils +{ + public class TypeProperty + { + public String Name; + + // OData Type Name, e.g. Edm.Int32 + public String TypeName; + + public bool IsKey; + public bool IsMandatory; + public bool? IsNullable; + } + + public class NavigationProperty + { + public String Name; + + public String FromRole; + public String ToRole; + public String AssociationNamespace; + public String AssociationName; + } + + public class EntityTypeBase + { + public String Namespace; + public String Name; + public TypeProperty[] EntityProperties; + public bool IsEntity; + public EntityTypeBase BaseType; + } + + public class AssociationType + { + public String Namespace; + + public EntityTypeBase EndType1; + public String Multiplicity1; + public String NavPropertyName1; + + public EntityTypeBase EndType2; + public String Multiplicity2; + public String NavPropertyName2; + } + + public class EntitySet + { + public String Namespace; + public String Name; + public EntityTypeBase Type; + } + + public class AssociationSet + { + public String Namespace; + public String Name; + public AssociationType Type; + } + + public class Action + { + public String Namespace; + public String Verb; + public EntitySet EntitySet; + public Boolean IsSideEffecting; + public Boolean IsBindable; + public Boolean IsSingleInstance; + public TypeProperty[] Parameters; + } + + public class MetadataBase + { + // Desired destination namespace + public String Namespace; + } + + public class CmdletParameter + { + public CmdletParameter() + { + } + + public CmdletParameter(String type, String name) + { + this.Type = type; + this.Name = name; + this.Qualifiers = new String[] { "Parameter(ValueFromPipelineByPropertyName=`$true)" }; + } + + public String[] Qualifiers; + public String Type; + public String Name; + } + + public class CmdletParameters + { + public CmdletParameter[] Parameters; + } + + public class ReferentialConstraint + { + public String Property; + public String ReferencedProperty; + } + + public class OnDelete + { + public String Action; + } + + public class NavigationPropertyV4 + { + public String Name; + public String Type; + public bool Nullable; + public String Partner; + public bool ContainsTarget; + public ReferentialConstraint[] ReferentialConstraints; + public OnDelete OnDelete; + } + + public class NavigationPropertyBinding + { + public String Path; + public String Target; + } + + public class EntityTypeV4 : EntityTypeBase + { + public String Alias; + public NavigationPropertyV4[] NavigationProperties; + public String BaseTypeStr; + } + + public class SingletonType + { + public String Namespace; + public String Alias; + public String Name; + public String Type; + public NavigationPropertyBinding[] NavigationPropertyBindings; + } + + public class EntitySetV4 + { + public String Namespace; + public String Alias; + public String Name; + public EntityTypeV4 Type; + } + + public class EnumMember + { + public String Name; + public String Value; + } + + public class EnumType + { + public String Namespace; + public String Alias; + public String Name; + public String UnderlyingType; + public bool IsFlags; + public EnumMember[] Members; + } + + public class ActionV4 + { + public String Namespace; + public String Alias; + public String Name; + public String Action; + public EntitySetV4 EntitySet; + public TypeProperty[] Parameters; + } + + public class FunctionV4 + { + public String Namespace; + public String Alias; + public String Name; + public bool Function; + public String EntitySet; + public String ReturnType; + public Parameter[] Parameters; + } + + public class Parameter + { + public String Name; + public String Type; + public bool Nullable; + } + + public class ReferenceInclude + { + public String Namespace; + public String Alias; + } + + public class Reference + { + public String Uri; + } + + public class MetadataV4 : MetadataBase + { + public string ODataVersion; + public string Uri; + public string MetadataUri; + public string Alias; + public Reference[] References; + public string DefaultEntityContainerName; + public EntitySetV4[] EntitySets; + public EntityTypeV4[] EntityTypes; + public SingletonType[] SingletonTypes; + public EntityTypeV4[] ComplexTypes; + public EntityTypeV4[] TypeDefinitions; + public EnumType[] EnumTypes; + public ActionV4[] Actions; + public FunctionV4[] Functions; + } + + public class ReferencedMetadata + { + public System.Collections.ArrayList References; + } + + public class ODataEndpointProxyParameters + { + public String Uri; + public String MetadataUri; + public System.Management.Automation.PSCredential Credential; + public String OutputModule; + + public bool Force; + public bool AllowClobber; + public bool AllowUnsecureConnection; + } + + public class EntityType : EntityTypeBase + { + public NavigationProperty[] NavigationProperties; + } + + public class Metadata : MetadataBase + { + public String DefaultEntityContainerName; + public EntitySet[] EntitySets; + public EntityType[] EntityTypes; + public EntityType[] ComplexTypes; + public AssociationSet[] Associations; + public Action[] Actions; + } +} +"@ + +######################################################### +# GetMetaData is a helper function used to fetch metadata +# from the specified file or web URL. +######################################################### +function GetMetaData +{ + param + ( + [string] $metaDataUri, + [System.Management.Automation.PSCmdlet] $callerPSCmdlet, + [PSCredential] $credential, + [Hashtable] $headers + ) + + # $metaDataUri is already validated at the cmdlet layer. + if($null -eq $callerPSCmdletl) { throw ($LocalizedData.ArguementNullError -f "PSCmdlet", "GetMetaData") } + Write-Verbose ($LocalizedData.VerboseReadingMetadata -f $metaDataUri) + + try + { + $uri = [System.Uri]::new($metadataUri) + + # By default, proxy generation is supported on secured Uri (i.e., https). + # However if the user trusts the unsecure http uri, then they can override + # the security check by specifying -AllowSecureConnection parameter during + # proxy generation. + if($uri.Scheme -eq "http" -and !$AllowUnsecureConnection.IsPresent) + { + $errorMessage = ($LocalizedData.AllowUnsecureConnectionMessage -f $callerPSCmdlet.MyInvocation.MyCommand.Name, $uri, "MetaDataUri") + $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyUnSecureConnection" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $uri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + } + catch + { + $errorMessage = ($LocalizedData.InValidMetadata -f $MetadataUri) + $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetadataUriFormat" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $MetadataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + + if($uri.IsFile) + { + if ($null -ne $credential) + { + $fileExists = Test-Path -Path $metaDataUri -PathType Leaf -Credential $credential -ErrorAction Stop + } + else + { + $fileExists = Test-Path -Path $metaDataUri -PathType Leaf -ErrorAction Stop + } + + if($fileExists) + { + $metaData = Get-Content -Path $metaDataUri -ErrorAction Stop + } + else + { + $errorMessage = ($LocalizedData.MetadataUriDoesNotExist -f $MetadataUri) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyMetadataFileDoesNotExist" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $null $MetadataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + } + else + { + try + { + $cmdParams = @{'Uri'= $metaDataUri ; 'UseBasicParsing'=$true; 'ErrorAction'= 'Stop'} + + if ($null -ne $credential) + { + $cmdParams.Add('Credential', $credential) + } + + if ($null -ne $headers) + { + $cmdParams.Add('Headers', $headers) + } + + $webResponse = Invoke-WebRequest @cmdParams + } + catch + { + $errorMessage = ($LocalizedData.MetadataUriDoesNotExist -f $MetadataUri) + $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyMetadataUriDoesNotExist" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $MetadataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + + if($null -ne $webResponse) + { + if ($webResponse.StatusCode -eq 200) + { + $metaData = $webResponse.Content + + if ($null -eq $metadata) + { + $errorMessage = ($LocalizedData.EmptyMetadata -f $MetadataUri) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyMetadataIsEmpty" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $null $MetadataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + } + else + { + $errorMessage = ($LocalizedData.InvalidEndpointAddress -f $MetadataUri, $webResponse.StatusCode) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidEndpointAddress" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $null $MetadataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + } + } + + if($null -ne $metaData) + { + try + { + [xml] $metadataXML = $metaData + } + catch + { + $errorMessage = ($LocalizedData.InValidMetadata -f $MetadataUri) + $exception = [System.InvalidOperationException]::new($errorMessage, $_.Exception) + $errorRecord = CreateErrorRecordHelper "ODataEndpointProxyInvalidMetadata" $null ([System.Management.Automation.ErrorCategory]::InvalidData) $exception $MetadataUri + $callerPSCmdlet.ThrowTerminatingError($errorRecord) + } + } + + return $metadataXML +} + +######################################################### +# VerifyMetadataHelper is a helper function used to +# validate if Error/Warning message has to be displayed +# during command collision. +######################################################### +function VerifyMetadataHelper +{ + param + ( + [string] $localizedDataErrorString, + [string] $localizedDataWarningString, + [string] $entitySetName, + [string] $currentCommandName, + [string] $metaDataUri, + [boolean] $allowClobber, + [System.Management.Automation.PSCmdlet] $callerPSCmdlet + ) + + if($null -eq $localizedDataErrorString) { throw ($LocalizedData.ArguementNullError -f "localizedDataErrorString", "VerifyMetadataHelper") } + if($null -eq $localizedDataWarningString) { throw ($LocalizedData.ArguementNullError -f "localizedDataWarningString", "VerifyMetadataHelper") } + + if(!$allowClobber) + { + # Write Error message and skip current Entity Set. + $errorMessage = ($localizedDataErrorString -f $entitySetName, $currentCommandName) + $exception = [System.InvalidOperationException]::new($errorMessage) + $errorRecord = CreateErrorRecordHelper "ODataEndpointDefaultPropertyCollision" $null ([System.Management.Automation.ErrorCategory]::InvalidOperation) $exception $metaDataUri + $callerPSCmdlet.WriteError($errorRecord) + } + else + { + $warningMessage = ($localizedDataWarningString -f $entitySetName, $currentCommandName) + $callerPSCmdlet.WriteWarning($warningMessage) + } +} + +######################################################### +# CreateErrorRecordHelper is a helper function used to +# create an error record. +######################################################### +function CreateErrorRecordHelper +{ + param + ( + [string] $errorId, + [string] $errorMessage, + [System.Management.Automation.ErrorCategory] $errorCategory, + [Exception] $exception, + [object] $targetObject + ) + + if($null -eq $exception) + { + $exception = New-Object System.IO.IOException $errorMessage + } + + $errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $targetObject + return $errorRecord +} + +######################################################### +# ProgressBarHelper is a helper function used to +# used to display progress message. +######################################################### +function ProgressBarHelper +{ + param + ( + [string] $cmdletName, + [string] $status, + [double] $previousSegmentWeight, + [double] $currentSegmentWeight, + [int] $totalNumberofEntries, + [int] $currentEntryCount + ) + + if($null -eq $cmdletName) { throw ($LocalizedData.ArguementNullError -f "CmdletName", "ProgressBarHelper") } + if($null -eq $status) { throw ($LocalizedData.ArguementNullError -f "Status", "ProgressBarHelper") } + + if($currentEntryCount -gt 0 -and + $totalNumberofEntries -gt 0 -and + $previousSegmentWeight -ge 0 -and + $currentSegmentWeight -gt 0) + { + $entryDefaultWeight = $currentSegmentWeight/[double]$totalNumberofEntries + $percentComplete = $previousSegmentWeight + ($entryDefaultWeight * $currentEntryCount) + Write-Progress -Activity $cmdletName -Status $status -PercentComplete $percentComplete + } +} + +######################################################### +# Convert-ODataTypeToCLRType is a helper function used to +# Convert OData type to its CLR equivalent. +######################################################### +function Convert-ODataTypeToCLRType +{ + param + ( + [string] $typeName, + [Hashtable] $complexTypeMapping + ) + + if($null -eq $typeName) { throw ($LocalizedData.ArguementNullError -f "TypeName", "Convert-ODataTypeToCLRType ") } + + switch ($typeName) + { + "Edm.Binary" {"Byte[]"} + "Edm.Boolean" {"Boolean"} + "Edm.Byte" {"Byte"} + "Edm.DateTime" {"DateTime"} + "Edm.Decimal" {"Decimal"} + "Edm.Double" {"Double"} + "Edm.Single" {"Single"} + "Edm.Guid" {"Guid"} + "Edm.Int16" {"Int16"} + "Edm.Int32" {"Int32"} + "Edm.Int64" {"Int64"} + "Edm.SByte" {"SByte"} + "Edm.String" {"String"} + "Edm.PropertyPath" {"String"} + "switch" {"switch"} + "Edm.DateTimeOffset" {"DateTimeOffset"} + default + { + if($null -ne $complexTypeMapping -and + $complexTypeMapping.Count -gt 0 -and + $complexTypeMapping.ContainsKey($typeName)) + { + $typeName + } + else + { + $regex = "Collection\((.+)\)" + if ($typeName -match $regex) + { + $insideTypeName = Convert-ODataTypeToCLRType $Matches[1] $complexTypeMapping + "$insideTypeName[]" + } + else + { + "PSObject" + } + } + } + } +} + +######################################################### +# SaveCDXMLHeader is a helper function used +# to save CDXML headers common to all +# PSODataUtils modules. +######################################################### +function SaveCDXMLHeader +{ + param + ( + [System.Xml.XmlWriter] $xmlWriter, + [string] $uri, + [string] $className, + [string] $defaultNoun, + [string] $cmdletAdapter + ) + + # $uri & $cmdletAdapter are already validated at the cmdlet layer. + if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "SaveCDXMLHeader") } + if($null -eq $defaultNoun) { throw ($LocalizedData.ArguementNullError -f "DefaultNoun", "SaveCDXMLHeader") } + + if ($className -eq 'ServiceActions' -Or $cmdletAdapter -eq "NetworkControllerAdapter") + { + $entityName = '' + } + else + { + $entityName = $className + } + + if ($uri[-1] -ne '/') + { + $fullName = "$uri/$entityName" + } + else + { + $fullName = "$uri$entityName" + } + + $xmlWriter.Formatting = 'Indented' + $xmlWriter.Indentation = 2 + $xmlWriter.IndentChar = ' ' + + $xmlWriter.WriteStartDocument() + + $today=Get-Date + $xmlWriter.WriteComment("This module was autogenerated by PSODataUtils on $today.") + + $xmlWriter.WriteStartElement('PowerShellMetadata') + $xmlWriter.WriteAttributeString('xmlns', 'http://schemas.microsoft.com/cmdlets-over-objects/2009/11') + + $xmlWriter.WriteStartElement('Class') + $xmlWriter.WriteAttributeString('ClassName', $fullName) + $xmlWriter.WriteAttributeString('ClassVersion', '1.0.0') + + $DotNetAdapter = 'Microsoft.PowerShell.Cmdletization.OData.ODataCmdletAdapter' + + if ($CmdletAdapter -eq "NetworkControllerAdapter") { + $DotNetAdapter = 'Microsoft.PowerShell.Cmdletization.OData.NetworkControllerCmdletAdapter' + } + elseif ($CmdletAdapter -eq "ODataV4Adapter") { + $DotNetAdapter = 'Microsoft.PowerShell.Cmdletization.OData.ODataV4CmdletAdapter' + } + + $xmlWriter.WriteAttributeString('CmdletAdapter', $DotNetAdapter + ', Microsoft.PowerShell.Cmdletization.OData, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35') + + $xmlWriter.WriteElementString('Version', '1.0') + $xmlWriter.WriteElementString('DefaultNoun', $defaultNoun) + + $xmlWriter +} + +######################################################### +# SaveCDXMLFooter is a helper function used +# to save CDXML closing attributes corresponding +# to SaveCDXMLHeader function. +######################################################### +function SaveCDXMLFooter +{ + param + ( + [System.Xml.XmlWriter] $xmlWriter + ) + + if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "SaveCDXMLFooter") } + + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndDocument() + + $xmlWriter.Flush() + $xmlWriter.Close() +} + +######################################################### +# AddParametersNode is a helper function used +# to add parameters to the generated proxy cmdlet, +# based on mandatoryProperties and otherProperties. +# PrefixForKeys is used by associations to append a +# prefix to PowerShell parameter name. +######################################################### +function AddParametersNode +{ + param + ( + [Parameter(Mandatory=$true)] + [System.Xml.XmlWriter] $xmlWriter, + [ODataUtils.TypeProperty[]] $keyProperties, + [ODataUtils.TypeProperty[]] $mandatoryProperties, + [ODataUtils.TypeProperty[]] $otherProperties, + [string] $prefixForKeys, + [boolean] $addForceParameter, + [boolean] $addParametersElement, + [Hashtable] $complexTypeMapping + ) + + if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "AddParametersNode") } + + if(($keyProperties.Length -gt 0) -or + ($mandatoryProperties.Length -gt 0) -or + ($otherProperties.Length -gt 0) -or + ($addForceParameter)) + { + if($addParametersElement) + { + $xmlWriter.WriteStartElement('Parameters') + } + + $pos = 0 + + if ($null -ne $keyProperties) + { + $pos = AddParametersCDXML $xmlWriter $keyProperties $pos $true $prefixForKeys ":Key" $complexTypeMapping + } + + if ($null -ne $mandatoryProperties) + { + $pos = AddParametersCDXML $xmlWriter $mandatoryProperties $pos $true $null $null $complexTypeMapping + } + + if ($null -ne $otherProperties) + { + $pos = AddParametersCDXML $xmlWriter $otherProperties $pos $false $null $null $complexTypeMapping + } + + if($addForceParameter) + { + $forceParameter = [ODataUtils.TypeProperty] @{ + "Name" = "Force"; + "TypeName" = "switch"; + "IsNullable" = $false + } + + $pos = AddParametersCDXML $xmlWriter $forceParameter $pos $false $null $null $complexTypeMapping + } + + if($addParametersElement) + { + $xmlWriter.WriteEndElement() + } + } +} + +######################################################### +# AddParametersCDXML is a helper function used +# to add Parameter node to CDXML based on properties. +# Prefix is appended to PS parameter names, used for +# associations. Suffix is appended to all parameter +# names, for ex. to differentiate keys. returns new $pos +######################################################### +function AddParametersCDXML +{ + param + ( + [Parameter(Mandatory=$true)] + [System.Xml.XmlWriter] $xmlWriter, + [ODataUtils.TypeProperty[]] $properties, + [Parameter(Mandatory=$true)] + [int] $pos, + [bool] $isMandatory, + [string] $prefix, + [string] $suffix, + [Hashtable] $complexTypeMapping + ) + + $properties | Where-Object { $null -ne $_ } | ForEach-Object { + $xmlWriter.WriteStartElement('Parameter') + $xmlWriter.WriteAttributeString('ParameterName', $_.Name + $suffix) + $xmlWriter.WriteStartElement('Type') + $PSTypeName = Convert-ODataTypeToCLRType $_.TypeName $complexTypeMapping + $xmlWriter.WriteAttributeString('PSType', $PSTypeName) + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('CmdletParameterMetadata') + $xmlWriter.WriteAttributeString('PSName', $prefix + $_.Name) + $xmlWriter.WriteAttributeString('IsMandatory', ($isMandatory).ToString().ToLowerInvariant()) + $xmlWriter.WriteAttributeString('Position', $pos) + if($isMandatory) + { + $xmlWriter.WriteAttributeString('ValueFromPipelineByPropertyName', 'true') + } + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() + + $pos++ + } + + $pos +} + +######################################################### +# GenerateSetProxyCmdlet is a helper function used +# to generate Set-* proxy cmdlet. The proxy cmdlet is +# generated in the CDXML compliant format. +######################################################### +function GenerateSetProxyCmdlet +{ + param + ( + [System.XMl.XmlTextWriter] $xmlWriter, + [object[]] $keyProperties, + [object[]] $nonKeyProperties, + [Hashtable] $complexTypeMapping + ) + + # $cmdletAdapter is already validated at the cmdlet layer. + if($null -eq $xmlWriter) { throw ($LocalizedData.ArguementNullError -f "xmlWriter", "GenerateSetProxyCmdlet") } + + $xmlWriter.WriteStartElement('Cmdlet') + $xmlWriter.WriteStartElement('CmdletMetadata') + $xmlWriter.WriteAttributeString('Verb', 'Set') + $xmlWriter.WriteAttributeString('DefaultCmdletParameterSet', 'Default') + $xmlWriter.WriteAttributeString('ConfirmImpact', 'Medium') + $xmlWriter.WriteEndElement() + + $xmlWriter.WriteStartElement('Method') + $xmlWriter.WriteAttributeString('MethodName', 'Update') + $xmlWriter.WriteAttributeString('CmdletParameterSet', 'Default') + + AddParametersNode $xmlWriter $keyProperties $null $nonKeyProperties $null $true $true $complexTypeMapping + $xmlWriter.WriteEndElement() + $xmlWriter.WriteEndElement() +} diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataV4Adapter.ps1 b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataV4Adapter.ps1 index 9ecd112b2e8..8842dd435d3 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataV4Adapter.ps1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/Microsoft.PowerShell.ODataV4Adapter.ps1 @@ -2665,4 +2665,4 @@ namespace $($dotNetNamespace) Write-Verbose ($LocalizedData.VerboseSavedTypeDefinationModule -f $typeDefinationFileName, $OutputModule) return $complexTypeMapping -} \ No newline at end of file +} diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/en-US/Microsoft.PowerShell.ODataUtilsStrings.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/en-US/Microsoft.PowerShell.ODataUtilsStrings.psd1 index 0c04b467060..14efad76e32 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/en-US/Microsoft.PowerShell.ODataUtilsStrings.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.ODataUtils/en-US/Microsoft.PowerShell.ODataUtilsStrings.psd1 @@ -1,55 +1,55 @@ -# Localized PSODataUtils.psd1 - -ConvertFrom-StringData @' -###PSLOC -SelectedAdapter=Dot sourcing '{0}'. -ArchitectureNotSupported=This module is not supported on your processor architecture ({0}). -ArguementNullError=Failed to generate proxy as '{0}' is pointing to $null in '{1}'. -EmptyMetadata=Read metadata was empty. Url: {0}. -InvalidEndpointAddress=Invalid endpoint address ({0}). Web response with status code '{1}' was obtained while accessing this endpoint address. -NoEntitySets=Metadata from URI '{0}' does not contain Entity Sets. No output will be written. -NoEntityTypes=Metadata from URI '{0}' does not contain Entity Types. No output will be written. -MetadataUriDoesNotExist=Metadata specified at the URI '{0}' does not exist. No output will be written. -InValidIdentifierInMetadata=Metadata specified at URI '{0}' contains an invalid Identifier '{1}'. Only valid C# identifiers are supported in the generated complex types during the proxy creation. -InValidMetadata=Failed to process metadata specified at URI '{0}'. No output will be written. -InValidXmlInMetadata=Metadata specified at URI '{0}' contains an invalid XML. No output will be written. -ODataVersionNotFound=Metadata specified at URI '{0}' does not contain the OData Version. No output will be written. -ODataVersionNotSupported=The OData version '{0}' specified in the metadata located at the URI '{1}' is not supported. Only OData versions between '{2}' and '{3}' are supported by '{4}' during proxy generation. No output will be written. -InValidSchemaNamespace=Metadata specified at URI '{0}' is invalid. NULL or Empty values are not supported for Namespace attribute in the schema. -InValidSchemaNamespaceConflictWithClassName=Metadata specified at URI '{0}' contains invalid Namespace {1} name, which conflicts with another type name. To avoid compilation error {1} will be changed to {2}. -InValidSchemaNamespaceContainsInvalidChars=Metadata specified at URI '{0}' contains invalid Namespace name {1} with a combination of dots and numbers in it, which is not allowed in .Net. To avoid compilation error {1} will be changed to {2}. -InValidUri=URI '{0}' is invalid. No output will be written. -RedfishNotEnabled=This version of Microsoft.PowerShell.ODataUtils doesn’t support Redfish, please run: ‘update-module Microsoft.PowerShell.ODataUtils’ to get Redfish support. -EntitySetUndefinedType=Metadata from URI '{0}' does not contain the Type for Entity Set '{1}'. No output will be written. -XmlWriterInitializationError=There was an error initiating XmlWriter for writing the {0} CDXML module. -EmptySchema=Edmx.DataServices.Schema node should not be null. -VerboseReadingMetadata=Reading metadata from uri {0}. -VerboseParsingMetadata=Parsing metadata... -VerboseVerifyingMetadata=Verifying metadata... -VerboseSavingModule=Saving output module to path {0}. -VerboseSavedCDXML=Saved CDXML module for {0} to {1}. -VerboseSavedServiceActions=Saved Service Actions CDXML module for to {0}. -VerboseSavedModuleManifest=Saved module manifest at {0}. -AssociationNotFound=Association {0} not found in Metadata.Associations. -TooManyMatchingAssociationTypes=Found {0} {1} associations in Metadata.Associations. Expected only one. -ZeroMatchingAssociationTypes=Navigation property {0} not found on association {1}. -WrongCountEntitySet=Expected one EntitySet for EntityType {0}, but got {1}. -EntityNameConflictError=Proxy creation is not supported when multiple EntitySets are mapped to the same EntityType. The metadata located at the URI '{0}' contains EntitySets '{1}' and '{2}' that are mapped to the same EntityType '{3}'. -VerboseSavedTypeDefinationModule=Saved Type definition module '{0}' at '{1}'. -VerboseAddingTypeDefinationToGeneratedModule=Adding Type definition for '{0}' to '{1}' module. -OutputPathNotFound=Could not find a part of the path '{0}'. -ModuleAlreadyExistsAndForceParameterIsNotSpecified=The directory '{0}' already exists. Use the -Force parameter if you want to overwrite the directory and files within the directory. -InvalidOutputModulePath=Path '{0}' specified to -OutputModule parameter does not contain the module name. -OutputModulePathIsNotUnique=Path '{0}' specified to -OutputModule parameter resolves to multiple paths in the file system. Provide a unique file system path to -OutputModule parameter. -OutputModulePathIsNotFileSystemPath=Path '{0}' specified to -OutputModule parameter is not a file system. Provide a unique file system path to -OutputModule parameter. -SkipEntitySetProxyCreation=CDXML module creation has been skipped for the Entity Set '{0}' because its Entity Type '{1}' contains a property '{2}' that collides with one of the default properties of the generated cmdlets. -EntitySetProxyCreationWithWarning=CDXML module creation for the Entity Set '{0}' succeeded but contains a property '{1}' in the Entity Type '{2}' that collides with one of the default properties of the generated cmdlets. -SkipEntitySetConflictCommandCreation=CDXML module creation has been skipped for the Entity Set '{0}' because the exported command '{1}' conflicts with the inbox command. -EntitySetConflictCommandCreationWithWarning=CDXML module creation for the Entity Set '{0}' succeeded but contains a command '{1}' that collides with the inbox command. -SkipConflictServiceActionCommandCreation=CDXML module creation has been skipped for the Service Action '{0}' because the exported command '{1}' conflicts with the inbox command. -ConflictServiceActionCommandCreationWithWarning=CDXML module creation for the Service Action '{0}' succeeded but contains a command '{1}' that collides with the inbox command. -AllowUnsecureConnectionMessage=The cmdlet '{0}' is trying to establish an Unsecure connection with the OData endpoint through the URI '{1}'. Either supply a secure URI to the -{2} parameter or use -AllowUnsecureConnection switch parameter if you intend to use the current URI. -ProgressBarMessage=Creating proxy for the OData endpoint at the URI '{0}'. -###PSLOC - -'@ \ No newline at end of file +# Localized PSODataUtils.psd1 + +ConvertFrom-StringData @' +###PSLOC +SelectedAdapter=Dot sourcing '{0}'. +ArchitectureNotSupported=This module is not supported on your processor architecture ({0}). +ArguementNullError=Failed to generate proxy as '{0}' is pointing to $null in '{1}'. +EmptyMetadata=Read metadata was empty. Url: {0}. +InvalidEndpointAddress=Invalid endpoint address ({0}). Web response with status code '{1}' was obtained while accessing this endpoint address. +NoEntitySets=Metadata from URI '{0}' does not contain Entity Sets. No output will be written. +NoEntityTypes=Metadata from URI '{0}' does not contain Entity Types. No output will be written. +MetadataUriDoesNotExist=Metadata specified at the URI '{0}' does not exist. No output will be written. +InValidIdentifierInMetadata=Metadata specified at URI '{0}' contains an invalid Identifier '{1}'. Only valid C# identifiers are supported in the generated complex types during the proxy creation. +InValidMetadata=Failed to process metadata specified at URI '{0}'. No output will be written. +InValidXmlInMetadata=Metadata specified at URI '{0}' contains an invalid XML. No output will be written. +ODataVersionNotFound=Metadata specified at URI '{0}' does not contain the OData Version. No output will be written. +ODataVersionNotSupported=The OData version '{0}' specified in the metadata located at the URI '{1}' is not supported. Only OData versions between '{2}' and '{3}' are supported by '{4}' during proxy generation. No output will be written. +InValidSchemaNamespace=Metadata specified at URI '{0}' is invalid. NULL or Empty values are not supported for Namespace attribute in the schema. +InValidSchemaNamespaceConflictWithClassName=Metadata specified at URI '{0}' contains invalid Namespace {1} name, which conflicts with another type name. To avoid compilation error {1} will be changed to {2}. +InValidSchemaNamespaceContainsInvalidChars=Metadata specified at URI '{0}' contains invalid Namespace name {1} with a combination of dots and numbers in it, which is not allowed in .Net. To avoid compilation error {1} will be changed to {2}. +InValidUri=URI '{0}' is invalid. No output will be written. +RedfishNotEnabled=This version of Microsoft.PowerShell.ODataUtils doesn’t support Redfish, please run: ‘update-module Microsoft.PowerShell.ODataUtils’ to get Redfish support. +EntitySetUndefinedType=Metadata from URI '{0}' does not contain the Type for Entity Set '{1}'. No output will be written. +XmlWriterInitializationError=There was an error initiating XmlWriter for writing the {0} CDXML module. +EmptySchema=Edmx.DataServices.Schema node should not be null. +VerboseReadingMetadata=Reading metadata from uri {0}. +VerboseParsingMetadata=Parsing metadata... +VerboseVerifyingMetadata=Verifying metadata... +VerboseSavingModule=Saving output module to path {0}. +VerboseSavedCDXML=Saved CDXML module for {0} to {1}. +VerboseSavedServiceActions=Saved Service Actions CDXML module for to {0}. +VerboseSavedModuleManifest=Saved module manifest at {0}. +AssociationNotFound=Association {0} not found in Metadata.Associations. +TooManyMatchingAssociationTypes=Found {0} {1} associations in Metadata.Associations. Expected only one. +ZeroMatchingAssociationTypes=Navigation property {0} not found on association {1}. +WrongCountEntitySet=Expected one EntitySet for EntityType {0}, but got {1}. +EntityNameConflictError=Proxy creation is not supported when multiple EntitySets are mapped to the same EntityType. The metadata located at the URI '{0}' contains EntitySets '{1}' and '{2}' that are mapped to the same EntityType '{3}'. +VerboseSavedTypeDefinationModule=Saved Type definition module '{0}' at '{1}'. +VerboseAddingTypeDefinationToGeneratedModule=Adding Type definition for '{0}' to '{1}' module. +OutputPathNotFound=Could not find a part of the path '{0}'. +ModuleAlreadyExistsAndForceParameterIsNotSpecified=The directory '{0}' already exists. Use the -Force parameter if you want to overwrite the directory and files within the directory. +InvalidOutputModulePath=Path '{0}' specified to -OutputModule parameter does not contain the module name. +OutputModulePathIsNotUnique=Path '{0}' specified to -OutputModule parameter resolves to multiple paths in the file system. Provide a unique file system path to -OutputModule parameter. +OutputModulePathIsNotFileSystemPath=Path '{0}' specified to -OutputModule parameter is not a file system. Provide a unique file system path to -OutputModule parameter. +SkipEntitySetProxyCreation=CDXML module creation has been skipped for the Entity Set '{0}' because its Entity Type '{1}' contains a property '{2}' that collides with one of the default properties of the generated cmdlets. +EntitySetProxyCreationWithWarning=CDXML module creation for the Entity Set '{0}' succeeded but contains a property '{1}' in the Entity Type '{2}' that collides with one of the default properties of the generated cmdlets. +SkipEntitySetConflictCommandCreation=CDXML module creation has been skipped for the Entity Set '{0}' because the exported command '{1}' conflicts with the inbox command. +EntitySetConflictCommandCreationWithWarning=CDXML module creation for the Entity Set '{0}' succeeded but contains a command '{1}' that collides with the inbox command. +SkipConflictServiceActionCommandCreation=CDXML module creation has been skipped for the Service Action '{0}' because the exported command '{1}' conflicts with the inbox command. +ConflictServiceActionCommandCreationWithWarning=CDXML module creation for the Service Action '{0}' succeeded but contains a command '{1}' that collides with the inbox command. +AllowUnsecureConnectionMessage=The cmdlet '{0}' is trying to establish an Unsecure connection with the OData endpoint through the URI '{1}'. Either supply a secure URI to the -{2} parameter or use -AllowUnsecureConnection switch parameter if you intend to use the current URI. +ProgressBarMessage=Creating proxy for the OData endpoint at the URI '{0}'. +###PSLOC + +'@ diff --git a/src/Modules/Windows-Full/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 b/src/Modules/Windows-Full/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 index 25008e2703a..86eccf288f3 100644 --- a/src/Modules/Windows-Full/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 +++ b/src/Modules/Windows-Full/Microsoft.PowerShell.Utility/Microsoft.PowerShell.Utility.psd1 @@ -1,32 +1,32 @@ -@{ -GUID="1DA87E53-152B-403E-98DC-74D7B4D63D59" -Author="Microsoft Corporation" -CompanyName="Microsoft Corporation" -Copyright="© Microsoft Corporation. All rights reserved." -ModuleVersion="3.1.0.0" -PowerShellVersion="3.0" -CLRVersion="4.0" -CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", - "Out-File", "Out-Printer", "Out-String", - "Out-GridView", "Get-FormatData", "Export-FormatData", "ConvertFrom-Json", "ConvertTo-Json", - "Invoke-RestMethod", "Invoke-WebRequest", "Register-ObjectEvent", "Register-EngineEvent", - "Wait-Event", "Get-Event", "Remove-Event", "Get-EventSubscriber", "Unregister-Event", "New-Guid", - "New-Event", "Add-Member", "Add-Type", "Compare-Object", "ConvertTo-Html", "ConvertFrom-StringData", - "Export-Csv", "Import-Csv", "ConvertTo-Csv", "ConvertFrom-Csv", "Export-Alias", "Invoke-Expression", - "Get-Alias", "Get-Culture", "Get-Date", "Get-Host", "Get-Member", "Get-Random", "Get-UICulture", - "Get-Unique", "Export-PSSession", "Import-PSSession", "Import-Alias", "Import-LocalizedData", - "Select-String", "Measure-Object", "New-Alias", "New-TimeSpan", "Read-Host", "Set-Alias", "Set-Date", - "Start-Sleep", "Tee-Object", "Measure-Command", "Update-List", "Update-TypeData", "Update-FormatData", - "Remove-TypeData", "Get-TypeData", "Write-Host", "Write-Progress", "New-Object", "Select-Object", - "Group-Object", "Sort-Object", "Get-Variable", "New-Variable", "Set-Variable", "Remove-Variable", - "Clear-Variable", "Export-Clixml", "Import-Clixml", "Import-PowerShellDataFile", "ConvertTo-Xml", "Select-Xml", "Write-Debug", - "Write-Verbose", "Write-Warning", "Write-Error", "Write-Information", "Write-Output", "Set-PSBreakpoint", "Get-PSBreakpoint", - "Remove-PSBreakpoint", "Enable-PSBreakpoint", "Disable-PSBreakpoint", "Get-PSCallStack", - "Send-MailMessage", "Get-TraceSource", "Set-TraceSource", "Trace-Command", "Show-Command", "Unblock-File", "Get-FileHash", - "Get-Runspace", "Debug-Runspace", "Enable-RunspaceDebug", "Disable-RunspaceDebug", "Get-RunspaceDebug", "Wait-Debugger", - "ConvertFrom-String", "Convert-String" , "Get-Uptime", "New-TemporaryFile", "Get-Verb", "Format-Hex" -FunctionsToExport= "ConvertFrom-SddlString" -AliasesToExport= "CFS", "fhx" -NestedModules="Microsoft.PowerShell.Commands.Utility.dll","Microsoft.PowerShell.Utility.psm1" -HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390787' -} +@{ +GUID="1DA87E53-152B-403E-98DC-74D7B4D63D59" +Author="Microsoft Corporation" +CompanyName="Microsoft Corporation" +Copyright="© Microsoft Corporation. All rights reserved." +ModuleVersion="3.1.0.0" +PowerShellVersion="3.0" +CLRVersion="4.0" +CmdletsToExport= "Format-List", "Format-Custom", "Format-Table", "Format-Wide", + "Out-File", "Out-Printer", "Out-String", + "Out-GridView", "Get-FormatData", "Export-FormatData", "ConvertFrom-Json", "ConvertTo-Json", + "Invoke-RestMethod", "Invoke-WebRequest", "Register-ObjectEvent", "Register-EngineEvent", + "Wait-Event", "Get-Event", "Remove-Event", "Get-EventSubscriber", "Unregister-Event", "New-Guid", + "New-Event", "Add-Member", "Add-Type", "Compare-Object", "ConvertTo-Html", "ConvertFrom-StringData", + "Export-Csv", "Import-Csv", "ConvertTo-Csv", "ConvertFrom-Csv", "Export-Alias", "Invoke-Expression", + "Get-Alias", "Get-Culture", "Get-Date", "Get-Host", "Get-Member", "Get-Random", "Get-UICulture", + "Get-Unique", "Export-PSSession", "Import-PSSession", "Import-Alias", "Import-LocalizedData", + "Select-String", "Measure-Object", "New-Alias", "New-TimeSpan", "Read-Host", "Set-Alias", "Set-Date", + "Start-Sleep", "Tee-Object", "Measure-Command", "Update-List", "Update-TypeData", "Update-FormatData", + "Remove-TypeData", "Get-TypeData", "Write-Host", "Write-Progress", "New-Object", "Select-Object", + "Group-Object", "Sort-Object", "Get-Variable", "New-Variable", "Set-Variable", "Remove-Variable", + "Clear-Variable", "Export-Clixml", "Import-Clixml", "Import-PowerShellDataFile", "ConvertTo-Xml", "Select-Xml", "Write-Debug", + "Write-Verbose", "Write-Warning", "Write-Error", "Write-Information", "Write-Output", "Set-PSBreakpoint", "Get-PSBreakpoint", + "Remove-PSBreakpoint", "Enable-PSBreakpoint", "Disable-PSBreakpoint", "Get-PSCallStack", + "Send-MailMessage", "Get-TraceSource", "Set-TraceSource", "Trace-Command", "Show-Command", "Unblock-File", "Get-FileHash", + "Get-Runspace", "Debug-Runspace", "Enable-RunspaceDebug", "Disable-RunspaceDebug", "Get-RunspaceDebug", "Wait-Debugger", + "ConvertFrom-String", "Convert-String" , "Get-Uptime", "New-TemporaryFile", "Get-Verb", "Format-Hex" +FunctionsToExport= "ConvertFrom-SddlString" +AliasesToExport= "CFS", "fhx" +NestedModules="Microsoft.PowerShell.Commands.Utility.dll","Microsoft.PowerShell.Utility.psm1" +HelpInfoURI = 'https://go.microsoft.com/fwlink/?linkid=390787' +} diff --git a/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.Format.ps1xml b/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.Format.ps1xml index be7f28d740a..c1a01c7f859 100644 --- a/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.Format.ps1xml +++ b/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.Format.ps1xml @@ -1,117 +1,117 @@ - - - - - ScheduledJobTrigger - - Microsoft.PowerShell.ScheduledJob.ScheduledJobTrigger - - - - - - 10 - left - - - - 15 - left - - - - 22 - left - - - - 23 - left - - - - 10 - left - - - - - - - Id - - - Frequency - - - At - - - DaysOfWeek - - - Enabled - - - - - - - - ScheduledJobDefinition - - Microsoft.PowerShell.ScheduledJob.ScheduledJobDefinition - - - - - - 10 - left - - - - 15 - left - - - - 15 - left - - - - 40 - left - - - - 10 - left - - - - - - - Id - - - Name - - - $_.JobTriggers.Count - - - Command - - - Enabled - - - - - - - - + + + + + ScheduledJobTrigger + + Microsoft.PowerShell.ScheduledJob.ScheduledJobTrigger + + + + + + 10 + left + + + + 15 + left + + + + 22 + left + + + + 23 + left + + + + 10 + left + + + + + + + Id + + + Frequency + + + At + + + DaysOfWeek + + + Enabled + + + + + + + + ScheduledJobDefinition + + Microsoft.PowerShell.ScheduledJob.ScheduledJobDefinition + + + + + + 10 + left + + + + 15 + left + + + + 15 + left + + + + 40 + left + + + + 10 + left + + + + + + + Id + + + Name + + + $_.JobTriggers.Count + + + Command + + + Enabled + + + + + + + + diff --git a/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.types.ps1xml b/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.types.ps1xml index 1bba20b14b1..f2ce8a8c048 100644 --- a/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.types.ps1xml +++ b/src/Modules/Windows-Full/PSScheduledJob/PSScheduledJob.types.ps1xml @@ -1,24 +1,24 @@ - - - - - Microsoft.Management.Infrastructure.CimInstance - - Microsoft.PowerShell.ScheduledJob.JobTriggerToCimInstanceConverter, Microsoft.PowerShell.ScheduledJob, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 - - - + + + + + Microsoft.Management.Infrastructure.CimInstance + + Microsoft.PowerShell.ScheduledJob.JobTriggerToCimInstanceConverter, Microsoft.PowerShell.ScheduledJob, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 + + + diff --git a/src/Schemas/PSMaml/Maml.tbr b/src/Schemas/PSMaml/Maml.tbr index 559196257bd..13785f66f1e 100644 --- a/src/Schemas/PSMaml/Maml.tbr +++ b/src/Schemas/PSMaml/Maml.tbr @@ -1,1427 +1,1427 @@ - - - -0X00020004 - - - - - - - - 0X00004FC1 - 0X00000005 - 0X0000000C - 0X0000001A - 0X0000009D - - 0X00004FC1 - - - - - - - - - - - - - - - 0X00005162 - 0X00000005 - 0X00000025 - 0X0000001A - 0X00000103 - - 0X00005162 - - - - - - - - - - - - 0X80000001 - - 0X80000001 - - - 0X00004E22 - - 0X00004E22 - - - 0X0000E101 - - 0X0000E101 - - - 0X0000E102 - - 0X0000E102 - - - 0X000080F6 - - 0X000080F6 - - - 0X0000E103 - - 0X0000E103 - - - 0X0000E104 - - 0X0000E104 - - - 0X000080F4 - - 0X000080F4 - - - 0X00004E20 - - 0X00004E20 - - - - 0XFFFEFFA4 - - - 0X0000A800 - - 0X0000A800 - - - 0X0000A817 - - 0X0000A817 - - - - - 0X0000E107 - - 0X0000E107 - - - 0X0000E110 - - 0X0000E110 - - - 0X0000E141 - - 0X0000E141 - - - - - 0X80000002 - - 0X80000002 - - - 0X0000E12B - - 0X0000E12B - - - 0X0000E12C - - 0X0000E12C - - - 0X0000E123 - - 0X0000E123 - - - 0X0000E122 - - 0X0000E122 - - - 0X0000E125 - - 0X0000E125 - - - 0X00004E8B - - 0X00004E8B - - - 0X0000E120 - - 0X0000E120 - - - 0X00004E84 - - 0X00004E84 - - - 0X00004E8A - - 0X00004E8A - - - 0X00004E89 - - 0X00004E89 - - - 0X00004E8C - - 0X00004E8C - - - 0X00004E87 - - 0X00004E87 - - - 0X00004E86 - - 0X00004E86 - - - - - 0X80000003 - - 0X80000003 - - - 0X00004EEC - - 0X00004EEC - - - 0X00004EEE - - 0X00004EEE - - - 0X00004EEF - - 0X00004EEF - - - 0X00004EEA - - 0X00004EEA - - - 0X00004EEB - - 0X00004EEB - - - 0X000050F4 - - 0X000050F4 - - - 0X00004EF0 - - 0X00004EF0 - - - 0X00004EF3 - - 0X00004EF3 - - - 0X00004EF1 - - 0X00004EF1 - - - 0X00004EF5 - - 0X00004EF5 - - - 0X0000E800 - - 0X0000E800 - - - 0X0000E801 - - 0X0000E801 - - - 0X00007541 - - 0X00007541 - - - 0X000080EB - - 0X000080EB - - - 0X00007531 - - 0X00007531 - - - - - 0X80000004 - - 0X80000004 - - - 0X00004F50 - - 0X00004F50 - - - 0X00004F5A - - 0X00004F5A - - - 0X00004F59 - - 0X00004F59 - - - 0X00004F56 - - 0X00004F56 - - - 0X00004F58 - - 0X00004F58 - - - 0X000059D6 - - 0X000059D6 - - - 0X000059D7 - - 0X000059D7 - - - 0X00004F52 - - 0X00004F52 - - - - - 0X80000005 - - 0X80000005 - - - 0X00005152 - - 0X00005152 - - - 0X00005154 - - 0X00005154 - - - 0X0000514F - - 0X0000514F - - - 0X00005151 - - 0X00005151 - - - 0X00005170 - - 0X00005170 - - - 0X00005177 - - 0X00005177 - - - 0X00005178 - - 0X00005178 - - - 0X00005078 - - 0X00005078 - - - 0X00005079 - - 0X00005079 - - - 0X0000507A - - 0X0000507A - - - 0X00005141 - - 0X00005141 - - - 0X00005160 - - 0X00005160 - - - 0X00008051 - - 0X00008051 - - - - - 0X80000006 - - 0X80000006 - - - 0X000050E3 - - 0X000050E3 - - - 0X000050DE - - 0X000050DE - - - 0X000050F3 - - 0X000050F3 - - - 0X000050DD - - 0X000050DD - - - 0X000050DC - - 0X000050DC - - - 0X000050EC - - 0X000050EC - - - 0X000050E4 - - 0X000050E4 - - - 0X000050EE - - 0X000050EE - - - 0X000050EF - - 0X000050EF - - - 0X000050F2 - - 0X000050F2 - - - - - 0X80000007 - - 0X80000007 - - - 0X0000515B - - 0X0000515B - - - 0X0000515A - - 0X0000515A - - - 0X0000E132 - - 0X0000E132 - - - 0X0000E133 - - 0X0000E133 - - - 0X0000E134 - - 0X0000E134 - - - 0X0000E131 - - 0X0000E131 - - - - - 0X80000008 - - 0X80000008 - - - 0X00007556 - - 0X00007556 - - - 0X00007559 - - 0X00007559 - - - 0X00007557 - - 0X00007557 - - - 0X0000755D - - 0X0000755D - - - 0X0000755A - - 0X0000755A - - - 0X0000E140 - - 0X0000E140 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + +0X00020004 + + + + + + + + 0X00004FC1 + 0X00000005 + 0X0000000C + 0X0000001A + 0X0000009D + + 0X00004FC1 + + + + + + + + + + + + + + + 0X00005162 + 0X00000005 + 0X00000025 + 0X0000001A + 0X00000103 + + 0X00005162 + + + + + + + + + + + + 0X80000001 + + 0X80000001 + + + 0X00004E22 + + 0X00004E22 + + + 0X0000E101 + + 0X0000E101 + + + 0X0000E102 + + 0X0000E102 + + + 0X000080F6 + + 0X000080F6 + + + 0X0000E103 + + 0X0000E103 + + + 0X0000E104 + + 0X0000E104 + + + 0X000080F4 + + 0X000080F4 + + + 0X00004E20 + + 0X00004E20 + + + + 0XFFFEFFA4 + + + 0X0000A800 + + 0X0000A800 + + + 0X0000A817 + + 0X0000A817 + + + + + 0X0000E107 + + 0X0000E107 + + + 0X0000E110 + + 0X0000E110 + + + 0X0000E141 + + 0X0000E141 + + + + + 0X80000002 + + 0X80000002 + + + 0X0000E12B + + 0X0000E12B + + + 0X0000E12C + + 0X0000E12C + + + 0X0000E123 + + 0X0000E123 + + + 0X0000E122 + + 0X0000E122 + + + 0X0000E125 + + 0X0000E125 + + + 0X00004E8B + + 0X00004E8B + + + 0X0000E120 + + 0X0000E120 + + + 0X00004E84 + + 0X00004E84 + + + 0X00004E8A + + 0X00004E8A + + + 0X00004E89 + + 0X00004E89 + + + 0X00004E8C + + 0X00004E8C + + + 0X00004E87 + + 0X00004E87 + + + 0X00004E86 + + 0X00004E86 + + + + + 0X80000003 + + 0X80000003 + + + 0X00004EEC + + 0X00004EEC + + + 0X00004EEE + + 0X00004EEE + + + 0X00004EEF + + 0X00004EEF + + + 0X00004EEA + + 0X00004EEA + + + 0X00004EEB + + 0X00004EEB + + + 0X000050F4 + + 0X000050F4 + + + 0X00004EF0 + + 0X00004EF0 + + + 0X00004EF3 + + 0X00004EF3 + + + 0X00004EF1 + + 0X00004EF1 + + + 0X00004EF5 + + 0X00004EF5 + + + 0X0000E800 + + 0X0000E800 + + + 0X0000E801 + + 0X0000E801 + + + 0X00007541 + + 0X00007541 + + + 0X000080EB + + 0X000080EB + + + 0X00007531 + + 0X00007531 + + + + + 0X80000004 + + 0X80000004 + + + 0X00004F50 + + 0X00004F50 + + + 0X00004F5A + + 0X00004F5A + + + 0X00004F59 + + 0X00004F59 + + + 0X00004F56 + + 0X00004F56 + + + 0X00004F58 + + 0X00004F58 + + + 0X000059D6 + + 0X000059D6 + + + 0X000059D7 + + 0X000059D7 + + + 0X00004F52 + + 0X00004F52 + + + + + 0X80000005 + + 0X80000005 + + + 0X00005152 + + 0X00005152 + + + 0X00005154 + + 0X00005154 + + + 0X0000514F + + 0X0000514F + + + 0X00005151 + + 0X00005151 + + + 0X00005170 + + 0X00005170 + + + 0X00005177 + + 0X00005177 + + + 0X00005178 + + 0X00005178 + + + 0X00005078 + + 0X00005078 + + + 0X00005079 + + 0X00005079 + + + 0X0000507A + + 0X0000507A + + + 0X00005141 + + 0X00005141 + + + 0X00005160 + + 0X00005160 + + + 0X00008051 + + 0X00008051 + + + + + 0X80000006 + + 0X80000006 + + + 0X000050E3 + + 0X000050E3 + + + 0X000050DE + + 0X000050DE + + + 0X000050F3 + + 0X000050F3 + + + 0X000050DD + + 0X000050DD + + + 0X000050DC + + 0X000050DC + + + 0X000050EC + + 0X000050EC + + + 0X000050E4 + + 0X000050E4 + + + 0X000050EE + + 0X000050EE + + + 0X000050EF + + 0X000050EF + + + 0X000050F2 + + 0X000050F2 + + + + + 0X80000007 + + 0X80000007 + + + 0X0000515B + + 0X0000515B + + + 0X0000515A + + 0X0000515A + + + 0X0000E132 + + 0X0000E132 + + + 0X0000E133 + + 0X0000E133 + + + 0X0000E134 + + 0X0000E134 + + + 0X0000E131 + + 0X0000E131 + + + + + 0X80000008 + + 0X80000008 + + + 0X00007556 + + 0X00007556 + + + 0X00007559 + + 0X00007559 + + + 0X00007557 + + 0X00007557 + + + 0X0000755D + + 0X0000755D + + + 0X0000755A + + 0X0000755A + + + 0X0000E140 + + 0X0000E140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Schemas/PSMaml/Maml.xsd b/src/Schemas/PSMaml/Maml.xsd index 9dd135b51e3..d4a6c374270 100644 --- a/src/Schemas/PSMaml/Maml.xsd +++ b/src/Schemas/PSMaml/Maml.xsd @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/src/Schemas/PSMaml/Maml.xsx b/src/Schemas/PSMaml/Maml.xsx index ecd16a360f4..bc4b56496e2 100644 --- a/src/Schemas/PSMaml/Maml.xsx +++ b/src/Schemas/PSMaml/Maml.xsx @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/src/Schemas/PSMaml/Maml_HTML.xsl b/src/Schemas/PSMaml/Maml_HTML.xsl index e3c0c990cbe..dd1c3037891 100644 --- a/src/Schemas/PSMaml/Maml_HTML.xsl +++ b/src/Schemas/PSMaml/Maml_HTML.xsl @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/src/Schemas/PSMaml/Maml_HTML_Style.xsl b/src/Schemas/PSMaml/Maml_HTML_Style.xsl index 3f66ee3f968..a29e1aba68c 100644 --- a/src/Schemas/PSMaml/Maml_HTML_Style.xsl +++ b/src/Schemas/PSMaml/Maml_HTML_Style.xsl @@ -381,4 +381,4 @@ - \ No newline at end of file + diff --git a/src/Schemas/PSMaml/developerDscResource.xsd b/src/Schemas/PSMaml/developerDscResource.xsd index f884e4d9991..f40417c8ee1 100644 --- a/src/Schemas/PSMaml/developerDscResource.xsd +++ b/src/Schemas/PSMaml/developerDscResource.xsd @@ -42,4 +42,4 @@ - \ No newline at end of file + diff --git a/src/System.Management.Automation/PowerShellProperties.json b/src/System.Management.Automation/PowerShellProperties.json index 1bd2a5af3b4..088f5cb24dd 100644 --- a/src/System.Management.Automation/PowerShellProperties.json +++ b/src/System.Management.Automation/PowerShellProperties.json @@ -1 +1 @@ -{"Microsoft.PowerShell:ExecutionPolicy":"RemoteSigned"} \ No newline at end of file +{"Microsoft.PowerShell:ExecutionPolicy":"RemoteSigned"} diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs index 4e25bb280a1..3cc6762e05c 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayDescriptionData_Wide.cs @@ -316,4 +316,4 @@ public WideControl EndWideControl() return _control; } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs index 84dac06266c..6d258a6d1b7 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/common/DisplayDatabase/displayResourceManagerCache.cs @@ -77,9 +77,9 @@ private string GetStringHelper(StringResourceReference resourceReference, out Lo result = LoadingResult.AssemblyNotFound; return null; } - else - { - resourceReference.assemblyLocation = loadResult.a.Location; + else + { + resourceReference.assemblyLocation = loadResult.a.Location; }; // load now the resource from the resource manager cache diff --git a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs b/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs index f685c43f369..025c35a2c1d 100644 --- a/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs +++ b/src/System.Management.Automation/commands/utility/FormatAndOutput/out-console/OutConsole.cs @@ -214,4 +214,4 @@ protected override void BeginProcessing() base.BeginProcessing(); } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/COM/ComDispatch.cs b/src/System.Management.Automation/engine/COM/ComDispatch.cs index 489e491efb2..965e9d0e7e3 100644 --- a/src/System.Management.Automation/engine/COM/ComDispatch.cs +++ b/src/System.Management.Automation/engine/COM/ComDispatch.cs @@ -38,4 +38,4 @@ void Invoke( out ComInvoker.EXCEPINFO pExcepInfo, out uint puArgErr); } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/COM/ComInvoker.cs b/src/System.Management.Automation/engine/COM/ComInvoker.cs index 9aa2a6c8e9c..5b1d0ca2d09 100644 --- a/src/System.Management.Automation/engine/COM/ComInvoker.cs +++ b/src/System.Management.Automation/engine/COM/ComInvoker.cs @@ -416,4 +416,4 @@ internal struct UnionTypes } } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/DscResourceInfo.cs b/src/System.Management.Automation/engine/DscResourceInfo.cs index d9be4e32acc..0de54774eb3 100644 --- a/src/System.Management.Automation/engine/DscResourceInfo.cs +++ b/src/System.Management.Automation/engine/DscResourceInfo.cs @@ -163,4 +163,4 @@ internal void UpdateValues(IList values) this.Values = new ReadOnlyCollection(values); } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/EventManager.cs b/src/System.Management.Automation/engine/EventManager.cs index 6c242f6d83a..7c088327dc0 100644 --- a/src/System.Management.Automation/engine/EventManager.cs +++ b/src/System.Management.Automation/engine/EventManager.cs @@ -2767,4 +2767,4 @@ private void LogErrorsAndOutput(List results, SessionState actionState) } } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/ICommandRuntime.cs b/src/System.Management.Automation/engine/ICommandRuntime.cs index b899a9a5228..dcfa742eee6 100644 --- a/src/System.Management.Automation/engine/ICommandRuntime.cs +++ b/src/System.Management.Automation/engine/ICommandRuntime.cs @@ -618,4 +618,4 @@ public interface ICommandRuntime2 : ICommandRuntime [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] bool ShouldContinue(string query, string caption, bool hasSecurityImpact, ref bool yesToAll, ref bool noToAll); } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/InternalCommands.cs b/src/System.Management.Automation/engine/InternalCommands.cs index 31b3a22f365..7f50a8e65e6 100644 --- a/src/System.Management.Automation/engine/InternalCommands.cs +++ b/src/System.Management.Automation/engine/InternalCommands.cs @@ -1838,4 +1838,4 @@ protected override void EndProcessing() #endregion Built-in cmdlets that are used by or require direct access to the engine. -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/Modules/NewModuleManifestCommand.cs b/src/System.Management.Automation/engine/Modules/NewModuleManifestCommand.cs index 1ea15017e1d..50b2ee54f27 100644 --- a/src/System.Management.Automation/engine/Modules/NewModuleManifestCommand.cs +++ b/src/System.Management.Automation/engine/Modules/NewModuleManifestCommand.cs @@ -940,12 +940,12 @@ protected override void EndProcessing() // Now open the output file... PathUtils.MasterStreamOpen( this, - filePath, + filePath, #if UNIX - new UTF8Encoding(false), // UTF-8, no BOM -#else - EncodingConversion.Unicode, // UTF-16 with BOM -#endif + new UTF8Encoding(false), // UTF-8, no BOM +#else + EncodingConversion.Unicode, // UTF-16 with BOM +#endif /* defaultEncoding */ false, /* Append */ false, /* Force */ false, diff --git a/src/System.Management.Automation/engine/Modules/PSModuleInfo.cs b/src/System.Management.Automation/engine/Modules/PSModuleInfo.cs index 0f55de878cb..60b40c40b64 100644 --- a/src/System.Management.Automation/engine/Modules/PSModuleInfo.cs +++ b/src/System.Management.Automation/engine/Modules/PSModuleInfo.cs @@ -1666,4 +1666,4 @@ public int GetHashCode(PSModuleInfo obj) } } } -} // System.Management.Automation \ No newline at end of file +} // System.Management.Automation diff --git a/src/System.Management.Automation/engine/Modules/ScriptAnalysis.cs b/src/System.Management.Automation/engine/Modules/ScriptAnalysis.cs index 8fb272b488b..127c5a5b066 100644 --- a/src/System.Management.Automation/engine/Modules/ScriptAnalysis.cs +++ b/src/System.Management.Automation/engine/Modules/ScriptAnalysis.cs @@ -554,4 +554,4 @@ internal class RequiredModuleInfo internal string Name { get; set; } internal List CommandsToPostFilter { get; set; } } -} // System.Management.Automation \ No newline at end of file +} // System.Management.Automation diff --git a/src/System.Management.Automation/engine/MshCommandRuntime.cs b/src/System.Management.Automation/engine/MshCommandRuntime.cs index be5ce9d3089..f9981ff91c2 100644 --- a/src/System.Management.Automation/engine/MshCommandRuntime.cs +++ b/src/System.Management.Automation/engine/MshCommandRuntime.cs @@ -3722,4 +3722,4 @@ internal void RemoveVariableListsInPipe() } } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/NullString.cs b/src/System.Management.Automation/engine/NullString.cs index 400288ccee6..88b4f9ab157 100644 --- a/src/System.Management.Automation/engine/NullString.cs +++ b/src/System.Management.Automation/engine/NullString.cs @@ -43,4 +43,4 @@ private NullString() #endregion private Constructor } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/ObjectEventRegistrationBase.cs b/src/System.Management.Automation/engine/ObjectEventRegistrationBase.cs index 71eef7d67a5..1718c81db1d 100644 --- a/src/System.Management.Automation/engine/ObjectEventRegistrationBase.cs +++ b/src/System.Management.Automation/engine/ObjectEventRegistrationBase.cs @@ -218,4 +218,4 @@ protected override void EndProcessing() } } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/PSClassInfo.cs b/src/System.Management.Automation/engine/PSClassInfo.cs index e70ab6984f9..4ca6927f4a3 100644 --- a/src/System.Management.Automation/engine/PSClassInfo.cs +++ b/src/System.Management.Automation/engine/PSClassInfo.cs @@ -88,4 +88,4 @@ internal PSClassMemberInfo(string name, string memberType, string defaultValue) /// public string DefaultValue { get; private set; } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/PSMI/PSNegotiationData.cs b/src/System.Management.Automation/engine/PSMI/PSNegotiationData.cs index dcf30b94ebf..11fe026278d 100644 --- a/src/System.Management.Automation/engine/PSMI/PSNegotiationData.cs +++ b/src/System.Management.Automation/engine/PSMI/PSNegotiationData.cs @@ -23,4 +23,4 @@ internal static CimInstance CreatePSNegotiationData(Version powerShellVersion) return c; } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/PSMI/PSPowerShellPipeline.cs b/src/System.Management.Automation/engine/PSMI/PSPowerShellPipeline.cs index 0642ec2ecd3..28411d6abdb 100644 --- a/src/System.Management.Automation/engine/PSMI/PSPowerShellPipeline.cs +++ b/src/System.Management.Automation/engine/PSMI/PSPowerShellPipeline.cs @@ -58,4 +58,4 @@ internal struct PS_Parameter [SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources")] internal IntPtr Value; } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/PSMI/Serialization/InternalMISerializer.cs b/src/System.Management.Automation/engine/PSMI/Serialization/InternalMISerializer.cs index 2ee673c69a8..cfb8247b100 100644 --- a/src/System.Management.Automation/engine/PSMI/Serialization/InternalMISerializer.cs +++ b/src/System.Management.Automation/engine/PSMI/Serialization/InternalMISerializer.cs @@ -874,4 +874,4 @@ private static CimInstance CreateNullCimInstance() #endregion } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/PSMI/Serialization/KnownMITypes.cs b/src/System.Management.Automation/engine/PSMI/Serialization/KnownMITypes.cs index b322c4b6f35..1d8de98aa3e 100644 --- a/src/System.Management.Automation/engine/PSMI/Serialization/KnownMITypes.cs +++ b/src/System.Management.Automation/engine/PSMI/Serialization/KnownMITypes.cs @@ -139,4 +139,4 @@ internal static MITypeSerializationInfo GetTypeSerializationInfo(Type type) #endregion private_fields } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/PSMI/Serialization/MISerializer.cs b/src/System.Management.Automation/engine/PSMI/Serialization/MISerializer.cs index d0fc978cbf2..51c6f94730b 100644 --- a/src/System.Management.Automation/engine/PSMI/Serialization/MISerializer.cs +++ b/src/System.Management.Automation/engine/PSMI/Serialization/MISerializer.cs @@ -21,4 +21,4 @@ public CimInstance Serialize(object source) return internalSerializer.Serialize(source); } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/PSMI/Serialization/MITypeSerializationInfo.cs b/src/System.Management.Automation/engine/PSMI/Serialization/MITypeSerializationInfo.cs index 2c37e7465fd..c71ad7fd07d 100644 --- a/src/System.Management.Automation/engine/PSMI/Serialization/MITypeSerializationInfo.cs +++ b/src/System.Management.Automation/engine/PSMI/Serialization/MITypeSerializationInfo.cs @@ -75,4 +75,4 @@ internal MITypeSerializationInfo(Type type, MITypeSerializerDelegate serializer, #endregion private } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/PSMI/Serialization/PSMISerializer.cs b/src/System.Management.Automation/engine/PSMI/Serialization/PSMISerializer.cs index e25b16cac6b..d6773530a88 100644 --- a/src/System.Management.Automation/engine/PSMI/Serialization/PSMISerializer.cs +++ b/src/System.Management.Automation/engine/PSMI/Serialization/PSMISerializer.cs @@ -40,4 +40,4 @@ public static CimInstance Serialize(Object source, int serializationDepth) return serializer.Serialize(source); } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/PSVersionInfo.cs b/src/System.Management.Automation/engine/PSVersionInfo.cs index 59002c5a679..ef716962e17 100644 --- a/src/System.Management.Automation/engine/PSVersionInfo.cs +++ b/src/System.Management.Automation/engine/PSVersionInfo.cs @@ -826,4 +826,4 @@ internal Exception GetVersionParseException() } } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/ScriptCommand.cs b/src/System.Management.Automation/engine/ScriptCommand.cs index e5c1982dcfb..521ae22029a 100644 --- a/src/System.Management.Automation/engine/ScriptCommand.cs +++ b/src/System.Management.Automation/engine/ScriptCommand.cs @@ -14,4 +14,4 @@ internal sealed class ScriptCommand : InternalCommand // This class just needs to exist so we have something to instantiate // to hold the pipeline connectors... } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/SessionStateFunctionAPIs.cs b/src/System.Management.Automation/engine/SessionStateFunctionAPIs.cs index 5a284f2b110..2b233e88c8e 100644 --- a/src/System.Management.Automation/engine/SessionStateFunctionAPIs.cs +++ b/src/System.Management.Automation/engine/SessionStateFunctionAPIs.cs @@ -896,4 +896,4 @@ internal void RemoveFunction(string name, PSModuleInfo module) #endregion Functions } // SessionStateInternal class -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/SessionStateVariableAPIs.cs b/src/System.Management.Automation/engine/SessionStateVariableAPIs.cs index 4f966aa37bd..05304fb6678 100644 --- a/src/System.Management.Automation/engine/SessionStateVariableAPIs.cs +++ b/src/System.Management.Automation/engine/SessionStateVariableAPIs.cs @@ -2090,4 +2090,4 @@ internal IDictionary GetVariableTableAtScope(string scopeID) } // SessionStateInternal class } -#pragma warning restore 56500 \ No newline at end of file +#pragma warning restore 56500 diff --git a/src/System.Management.Automation/engine/hostifaces/InformationalRecord.cs b/src/System.Management.Automation/engine/hostifaces/InformationalRecord.cs index c9fbf7a467f..3ad6d35cc7f 100644 --- a/src/System.Management.Automation/engine/hostifaces/InformationalRecord.cs +++ b/src/System.Management.Automation/engine/hostifaces/InformationalRecord.cs @@ -264,4 +264,4 @@ public VerboseRecord(PSObject record) : base(record) { } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/hostifaces/NativeCultureResolver.cs b/src/System.Management.Automation/engine/hostifaces/NativeCultureResolver.cs index 921db56dab0..1a79f239ff4 100644 --- a/src/System.Management.Automation/engine/hostifaces/NativeCultureResolver.cs +++ b/src/System.Management.Automation/engine/hostifaces/NativeCultureResolver.cs @@ -487,4 +487,4 @@ private static extern bool GetThreadPreferredUILanguages(int dwFlags, #endregion } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/hostifaces/PSDataCollection.cs b/src/System.Management.Automation/engine/hostifaces/PSDataCollection.cs index 982b19c426c..4aa87a168e9 100644 --- a/src/System.Management.Automation/engine/hostifaces/PSDataCollection.cs +++ b/src/System.Management.Automation/engine/hostifaces/PSDataCollection.cs @@ -2141,4 +2141,4 @@ internal void AddInformation(InformationRecord item) #endregion } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/lang/codegen.cs b/src/System.Management.Automation/engine/lang/codegen.cs index e8877c253ca..fdaecf4a538 100644 --- a/src/System.Management.Automation/engine/lang/codegen.cs +++ b/src/System.Management.Automation/engine/lang/codegen.cs @@ -101,4 +101,4 @@ public static string EscapeVariableName(string value) .Replace("{", "`{"); } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/parser/SymbolResolver.cs b/src/System.Management.Automation/engine/parser/SymbolResolver.cs index fae20a066f3..1cb0625b36b 100644 --- a/src/System.Management.Automation/engine/parser/SymbolResolver.cs +++ b/src/System.Management.Automation/engine/parser/SymbolResolver.cs @@ -718,4 +718,4 @@ public override object VisitFunctionMember(FunctionMemberAst functionMemberAst) return null; } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/remoting/commands/NewPSSessionConfigurationFile.cs b/src/System.Management.Automation/engine/remoting/commands/NewPSSessionConfigurationFile.cs index 065f37b379a..54865077046 100644 --- a/src/System.Management.Automation/engine/remoting/commands/NewPSSessionConfigurationFile.cs +++ b/src/System.Management.Automation/engine/remoting/commands/NewPSSessionConfigurationFile.cs @@ -2029,4 +2029,4 @@ internal static string CombineHashTableOrStringArray(object[] values, StreamWrit } #endregion -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/remoting/common/RunspaceInitInfo.cs b/src/System.Management.Automation/engine/remoting/common/RunspaceInitInfo.cs index 05b90135088..dae56d7fc10 100644 --- a/src/System.Management.Automation/engine/remoting/common/RunspaceInitInfo.cs +++ b/src/System.Management.Automation/engine/remoting/common/RunspaceInitInfo.cs @@ -32,4 +32,4 @@ internal RunspacePoolInitInfo(int minRS, int maxRS) MaxRunspaces = maxRS; } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/remoting/common/RunspacePoolStateInfo.cs b/src/System.Management.Automation/engine/remoting/common/RunspacePoolStateInfo.cs index 7498483daed..cd6aed9411c 100644 --- a/src/System.Management.Automation/engine/remoting/common/RunspacePoolStateInfo.cs +++ b/src/System.Management.Automation/engine/remoting/common/RunspacePoolStateInfo.cs @@ -39,4 +39,4 @@ public RunspacePoolStateInfo(RunspacePoolState state, Exception reason) Reason = reason; } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/remoting/fanin/PSPrincipal.cs b/src/System.Management.Automation/engine/remoting/fanin/PSPrincipal.cs index 1b374cf061f..de51049322c 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/PSPrincipal.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/PSPrincipal.cs @@ -383,4 +383,4 @@ public PSCertificateDetails(string subject, string issuerName, string issuerThum #endregion } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/remoting/fanin/PriorityCollection.cs b/src/System.Management.Automation/engine/remoting/fanin/PriorityCollection.cs index ada1b93f475..a59c0f85d79 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/PriorityCollection.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/PriorityCollection.cs @@ -895,4 +895,4 @@ internal virtual void Dispose(bool isDisposing) } #endregion -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/remoting/fanin/WSManPluginTransportManager.cs b/src/System.Management.Automation/engine/remoting/fanin/WSManPluginTransportManager.cs index 6dc38bf9e8d..c060c7bb6bb 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/WSManPluginTransportManager.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/WSManPluginTransportManager.cs @@ -412,4 +412,4 @@ private void OnPowershellGuidReported(object src, System.EventArgs args) this.PowerShellGuidObserver -= new System.EventHandler(this.OnPowershellGuidReported); } } -} // namespace System.Management.Automation.Remoting \ No newline at end of file +} // namespace System.Management.Automation.Remoting diff --git a/src/System.Management.Automation/engine/remoting/server/ServerSteppablePipelineDriver.cs b/src/System.Management.Automation/engine/remoting/server/ServerSteppablePipelineDriver.cs index d59bb598dc9..a6caceca553 100644 --- a/src/System.Management.Automation/engine/remoting/server/ServerSteppablePipelineDriver.cs +++ b/src/System.Management.Automation/engine/remoting/server/ServerSteppablePipelineDriver.cs @@ -523,4 +523,4 @@ internal void SetState(PSInvocationState newState, Exception reason) #endregion } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/runtime/Operations/ArrayOps.cs b/src/System.Management.Automation/engine/runtime/Operations/ArrayOps.cs index c2051c91201..0db0d4d36aa 100644 --- a/src/System.Management.Automation/engine/runtime/Operations/ArrayOps.cs +++ b/src/System.Management.Automation/engine/runtime/Operations/ArrayOps.cs @@ -285,4 +285,4 @@ internal static object GetNonIndexable(object target, object[] indices) ParserStrings.CannotIndex, target.GetType()); } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/engine/runtime/Operations/StringOps.cs b/src/System.Management.Automation/engine/runtime/Operations/StringOps.cs index 4e705f125bf..970283c8645 100644 --- a/src/System.Management.Automation/engine/runtime/Operations/StringOps.cs +++ b/src/System.Management.Automation/engine/runtime/Operations/StringOps.cs @@ -105,4 +105,4 @@ internal static bool Equals(string strA, string strB, CultureInfo culture, Compa return culture.CompareInfo.Compare(strA, strB, option) == 0; } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/help/DscResourceHelpProvider.cs b/src/System.Management.Automation/help/DscResourceHelpProvider.cs index 428801dcfd9..2c253fed108 100644 --- a/src/System.Management.Automation/help/DscResourceHelpProvider.cs +++ b/src/System.Management.Automation/help/DscResourceHelpProvider.cs @@ -370,4 +370,4 @@ private void LoadHelpFile(string helpFile, string helpFileIdentifier) #endregion } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/help/PSClassHelpProvider.cs b/src/System.Management.Automation/help/PSClassHelpProvider.cs index b2c123634e1..4493380c072 100644 --- a/src/System.Management.Automation/help/PSClassHelpProvider.cs +++ b/src/System.Management.Automation/help/PSClassHelpProvider.cs @@ -375,4 +375,4 @@ private void LoadHelpFile(string helpFile, string helpFileIdentifier) #endregion } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/help/ScriptCommandHelpProvider.cs b/src/System.Management.Automation/help/ScriptCommandHelpProvider.cs index a08328db188..30da14e3569 100644 --- a/src/System.Management.Automation/help/ScriptCommandHelpProvider.cs +++ b/src/System.Management.Automation/help/ScriptCommandHelpProvider.cs @@ -80,4 +80,4 @@ internal override CommandSearcher GetCommandSearcherForSearch(string pattern, Ex #endregion } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/minishell/api/RunspaceConfigurationEntry.cs b/src/System.Management.Automation/minishell/api/RunspaceConfigurationEntry.cs index b0e8a80d705..e46b3b96221 100644 --- a/src/System.Management.Automation/minishell/api/RunspaceConfigurationEntry.cs +++ b/src/System.Management.Automation/minishell/api/RunspaceConfigurationEntry.cs @@ -488,4 +488,4 @@ internal enum UpdateAction } -#pragma warning restore 56506 \ No newline at end of file +#pragma warning restore 56506 diff --git a/src/System.Management.Automation/namespaces/RegistryWrapper.cs b/src/System.Management.Automation/namespaces/RegistryWrapper.cs index 5ca64c7ab63..404e200024e 100644 --- a/src/System.Management.Automation/namespaces/RegistryWrapper.cs +++ b/src/System.Management.Automation/namespaces/RegistryWrapper.cs @@ -428,4 +428,4 @@ public ObjectSecurity GetAccessControl(AccessControlSections includeSections) #endregion } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/resources/CmdletizationCoreResources.resx b/src/System.Management.Automation/resources/CmdletizationCoreResources.resx index 820720dd126..5035b072328 100644 --- a/src/System.Management.Automation/resources/CmdletizationCoreResources.resx +++ b/src/System.Management.Automation/resources/CmdletizationCoreResources.resx @@ -1,203 +1,203 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Cmdlets over '{0}' class - {0} is a placeholder for a name of a CIM class. Example: "ROOT\cimv2\Win32_Process" - - - - ..\..\..\src\cimSupport\cmdletization\xml\cmdlets-over-objects.xsd;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 - {Locked} - - - Two cmdlet parameters defined within the {0} element have the same name: {1}. Resolve the conflict in the Cmdlet Definition XML and retry. - {StrContains="CmdletParameterMetadata"} {StrContains="PSName"} -{0} is a placeholder for a name of an XML element. Example: <GetCmdletParameters> -{1} is a placeholder for a cmdlet parameter name. Example: Name - - - Cannot process Cmdlet Definition XML for the following file: {0}. {1} - {0} is a placeholder for a file name. -{1} is an exception message copied from an XmlException or XmlSchemaException - - - The {0} cmdlet defines the {1} parameter set more than once. Verify that the Cmdlet Definition XML does not have duplicate parameter set names and retry. - {StrContains="CmdletParameterSet"} -{0} is a placeholder for a cmdlet name. Example: 'Get-Win32Process' -{1} is a placeholder for a parameter set name. Example: 'foo' - - - Cannot process the ObjectModelWrapper attribute. The {0} type defines multiple parameter sets. Verify that the Cmdlet Definition XML specifies a valid type in the ObjectModelWrapper attribute and retry. - {StrContains="ObjectModelWrapper"} -{0} is a placeholder for a .NET class name. Example: System.Net.IPAddress - - - Cannot process the ObjectModelWrapper attribute. The {0} type is an open generic type. Verify that the Cmdlet Definition XML specifies a valid type in the ObjectModelWrapper attribute and retry. - {StrContains="ObjectModelWrapper"} -{0} is a placeholder for a .NET class name. Example: System.Net.IPAddress - - - Cannot process the ObjectModelWrapper attribute. The {0} type is not derived from the following class: {1}. Verify that the Cmdlet Definition XML specifies a valid type in the ObjectModelWrapper attribute and retry. - {StrContains="ObjectModelWrapper"} -{0} is a placeholder for a .NET class name. Example: System.Net.IPAddress -{1} is a placeholder for a .NET class name. Example: Microsoft.PowerShell.Cmdletization.ObjectModelWrapper - - - Cannot process the ObjectModelWrapper attribute. The {0} type defines the {1} cmdlet parameter with a {2} attribute parameter that is ignored. Verify that the Cmdlet Definition XML specifies a valid type in the ObjectModelWrapper attribute and retry. - {StrContains="ObjectModelWrapper"} -{0} is a placeholder for a .NET class name. Example: System.Net.IPAddress -{1} is a placeholder for a cmdlet parameter name. Example: 'ProcessId' -{2} is a placeholder for a name of a property of ParameterAttribute class. Example: ValueFromPipelineByPropertyName - - - Cannot define the {0} parameter for the {1} cmdlet. The parameter name is already defined by the {2} class. Change the name of the parameter in Cmdlet Definition XML and retry. - {0} is a placeholder for a cmdlet parameter name. Example: 'ProcessId' -{1} is a placeholder for a cmdlet name. Example: 'Get-Win32Process' -{2} is a placeholder for a .NET class name. Example: 'Microsoft.PowerShell.Cmdletization.Cim.CimWrapper' - - - Cannot define the {0} parameter for the {1} cmdlet. The parameter name is already defined within the {2} XML element. Change the name of the parameter in the Cmdlet Definition XML, and then try again. - {0} is a placeholder for a cmdlet parameter name. Example: 'ProcessId' -{1} is a placeholder for a cmdlet name. Example: 'Get-Win32Process' -{2} is a placeholder for an xml element name. Example: <GetCmdletParameters> - - - {0} {1} - This is a resource string, to support locales where the order of placeholders might need to be reversed. -{0} is a placeholder for a top-level exception message (i.e. "There is an error in XML document (2, 2).") -{1} is a placeholder for a secondary exception message (i.e. "") - - - The value of the EnumName attribute doesn't translate to a valid C# identifier: {0}. Verify the EnumName attribute in the Cmdlet Definition XML, and then try again. - {StrContains="EnumName"} - - - The value of the Name attribute is not a valid C# identifier: {0}. Verify the Name attribute in the Cmdlet Definition XML, and then try again. - {StrContains="Enum"} {StrContains="Value"} {StrContains="Name"} - - - Cannot process the <Enum EnumName="{0}" ...> element. {1} - {StrContains="Enum"} {StrContains="EnumName"} - - - The remote computer returned a CDXML file that is not valid. The following cmdlet adapter is not supported for importing a CDXML module from a remote computer: {0} - {0} is a placeholder for a fully qualified type name - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Cmdlets over '{0}' class + {0} is a placeholder for a name of a CIM class. Example: "ROOT\cimv2\Win32_Process" + + + + ..\..\..\src\cimSupport\cmdletization\xml\cmdlets-over-objects.xsd;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + {Locked} + + + Two cmdlet parameters defined within the {0} element have the same name: {1}. Resolve the conflict in the Cmdlet Definition XML and retry. + {StrContains="CmdletParameterMetadata"} {StrContains="PSName"} +{0} is a placeholder for a name of an XML element. Example: <GetCmdletParameters> +{1} is a placeholder for a cmdlet parameter name. Example: Name + + + Cannot process Cmdlet Definition XML for the following file: {0}. {1} + {0} is a placeholder for a file name. +{1} is an exception message copied from an XmlException or XmlSchemaException + + + The {0} cmdlet defines the {1} parameter set more than once. Verify that the Cmdlet Definition XML does not have duplicate parameter set names and retry. + {StrContains="CmdletParameterSet"} +{0} is a placeholder for a cmdlet name. Example: 'Get-Win32Process' +{1} is a placeholder for a parameter set name. Example: 'foo' + + + Cannot process the ObjectModelWrapper attribute. The {0} type defines multiple parameter sets. Verify that the Cmdlet Definition XML specifies a valid type in the ObjectModelWrapper attribute and retry. + {StrContains="ObjectModelWrapper"} +{0} is a placeholder for a .NET class name. Example: System.Net.IPAddress + + + Cannot process the ObjectModelWrapper attribute. The {0} type is an open generic type. Verify that the Cmdlet Definition XML specifies a valid type in the ObjectModelWrapper attribute and retry. + {StrContains="ObjectModelWrapper"} +{0} is a placeholder for a .NET class name. Example: System.Net.IPAddress + + + Cannot process the ObjectModelWrapper attribute. The {0} type is not derived from the following class: {1}. Verify that the Cmdlet Definition XML specifies a valid type in the ObjectModelWrapper attribute and retry. + {StrContains="ObjectModelWrapper"} +{0} is a placeholder for a .NET class name. Example: System.Net.IPAddress +{1} is a placeholder for a .NET class name. Example: Microsoft.PowerShell.Cmdletization.ObjectModelWrapper + + + Cannot process the ObjectModelWrapper attribute. The {0} type defines the {1} cmdlet parameter with a {2} attribute parameter that is ignored. Verify that the Cmdlet Definition XML specifies a valid type in the ObjectModelWrapper attribute and retry. + {StrContains="ObjectModelWrapper"} +{0} is a placeholder for a .NET class name. Example: System.Net.IPAddress +{1} is a placeholder for a cmdlet parameter name. Example: 'ProcessId' +{2} is a placeholder for a name of a property of ParameterAttribute class. Example: ValueFromPipelineByPropertyName + + + Cannot define the {0} parameter for the {1} cmdlet. The parameter name is already defined by the {2} class. Change the name of the parameter in Cmdlet Definition XML and retry. + {0} is a placeholder for a cmdlet parameter name. Example: 'ProcessId' +{1} is a placeholder for a cmdlet name. Example: 'Get-Win32Process' +{2} is a placeholder for a .NET class name. Example: 'Microsoft.PowerShell.Cmdletization.Cim.CimWrapper' + + + Cannot define the {0} parameter for the {1} cmdlet. The parameter name is already defined within the {2} XML element. Change the name of the parameter in the Cmdlet Definition XML, and then try again. + {0} is a placeholder for a cmdlet parameter name. Example: 'ProcessId' +{1} is a placeholder for a cmdlet name. Example: 'Get-Win32Process' +{2} is a placeholder for an xml element name. Example: <GetCmdletParameters> + + + {0} {1} + This is a resource string, to support locales where the order of placeholders might need to be reversed. +{0} is a placeholder for a top-level exception message (i.e. "There is an error in XML document (2, 2).") +{1} is a placeholder for a secondary exception message (i.e. "") + + + The value of the EnumName attribute doesn't translate to a valid C# identifier: {0}. Verify the EnumName attribute in the Cmdlet Definition XML, and then try again. + {StrContains="EnumName"} + + + The value of the Name attribute is not a valid C# identifier: {0}. Verify the Name attribute in the Cmdlet Definition XML, and then try again. + {StrContains="Enum"} {StrContains="Value"} {StrContains="Name"} + + + Cannot process the <Enum EnumName="{0}" ...> element. {1} + {StrContains="Enum"} {StrContains="EnumName"} + + + The remote computer returned a CDXML file that is not valid. The following cmdlet adapter is not supported for importing a CDXML module from a remote computer: {0} + {0} is a placeholder for a fully qualified type name + + diff --git a/src/System.Management.Automation/security/wldpNativeMethods.cs b/src/System.Management.Automation/security/wldpNativeMethods.cs index e79c1678f3a..915e84da1e4 100644 --- a/src/System.Management.Automation/security/wldpNativeMethods.cs +++ b/src/System.Management.Automation/security/wldpNativeMethods.cs @@ -578,4 +578,4 @@ internal static extern int SHGetKnownFolderPath( out IntPtr pszPath); } } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/utils/ObjectReader.cs b/src/System.Management.Automation/utils/ObjectReader.cs index 6fd90292022..75de9cd2905 100644 --- a/src/System.Management.Automation/utils/ObjectReader.cs +++ b/src/System.Management.Automation/utils/ObjectReader.cs @@ -823,4 +823,4 @@ protected override void Dispose(bool disposing) #endregion IDisposable } -} \ No newline at end of file +} diff --git a/src/System.Management.Automation/utils/PlatformInvokes.cs b/src/System.Management.Automation/utils/PlatformInvokes.cs index e6c734d4e3b..c6598b1780d 100644 --- a/src/System.Management.Automation/utils/PlatformInvokes.cs +++ b/src/System.Management.Automation/utils/PlatformInvokes.cs @@ -797,4 +797,4 @@ internal struct PROCESSENTRY32 #endregion } -} \ No newline at end of file +} diff --git a/src/libpsl-native/src/createprocess.cpp b/src/libpsl-native/src/createprocess.cpp index 5991435c4be..b0cc2e81523 100644 --- a/src/libpsl-native/src/createprocess.cpp +++ b/src/libpsl-native/src/createprocess.cpp @@ -1,217 +1,217 @@ -#include "createprocess.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum -{ - SUPPRESS_PROCESS_SIGINT = 0x00000001 -}; - -enum -{ - READ_END_OF_PIPE = 0, - WRITE_END_OF_PIPE = 1 -}; - -static void CloseIfOpen(int fd) -{ - if (fd >= 0) - { - close(fd); // Ignoring errors from close is a deliberate choice - } -} - -// Checks if the IO operation was interrupted and needs to be retried. -// Returns true if the operation was interrupted; otherwise, false. -template -static inline bool CheckInterrupted(TInt result) -{ - return result < 0 && errno == EINTR; -} - -static int Dup2WithInterruptedRetry(int oldfd, int newfd) -{ - int result; - while (CheckInterrupted(result = dup2(oldfd, newfd))); - return result; -} - -int32_t SystemNative_Pipe(int32_t pipeFds[2], int32_t flags) -{ - int32_t result; - while (CheckInterrupted(result = pipe(pipeFds))); - - // Then, if O_CLOEXEC was specified, use fcntl to configure the file descriptors appropriately. - if ((flags & O_CLOEXEC) != 0 && result == 0) - { - while (CheckInterrupted(result = fcntl(pipeFds[0], F_SETFD, FD_CLOEXEC))); - if (result == 0) - { - while (CheckInterrupted(result = fcntl(pipeFds[1], F_SETFD, FD_CLOEXEC))); - } - - if (result != 0) - { - int tmpErrno = errno; - close(pipeFds[0]); - close(pipeFds[1]); - errno = tmpErrno; - } - } - - return result; -} - -int32_t ForkAndExecProcess( - const char* filename, - char* const argv[], - char* const envp[], - const char* cwd, - int32_t redirectStdin, - int32_t redirectStdout, - int32_t redirectStderr, - int32_t creationFlags, - int32_t* childPid, - int32_t* stdinFd, - int32_t* stdoutFd, - int32_t* stderrFd) -{ - int success = true; - int processId = -1; - int stdinFds[2] = { -1, -1 }; - int stdoutFds[2] = { -1, -1 }; - int stderrFds[2] = { -1, -1 }; - - // Validate arguments - if (nullptr == filename || nullptr == argv || nullptr == envp || nullptr == stdinFd || nullptr == stdoutFd || - nullptr == stderrFd || nullptr == childPid) - { - assert(false && "null argument."); - errno = EINVAL; - success = false; - goto done; - } - - if ((redirectStdin & ~1) != 0 || (redirectStdout & ~1) != 0 || (redirectStderr & ~1) != 0) - { - assert(false && "Boolean redirect* inputs must be 0 or 1."); - errno = EINVAL; - success = false; - goto done; - } - - // Make sure we can find and access the executable. exec will do this, of course, but at that point it's already - // in the child process, at which point it'll translate to the child process' exit code rather than to failing - // the Start itself. There's a race condition here, in that this could change prior to exec's checks, but there's - // little we can do about that. There are also more rigorous checks exec does, such as validating the executable - // format of the target; such errors will emerge via the child process' exit code. - if (access(filename, X_OK) != 0) - { - success = false; - goto done; - } - - // Open pipes for any requests to redirect stdin/stdout/stderr - if ((redirectStdin && SystemNative_Pipe(stdinFds, O_CLOEXEC) != 0) || - (redirectStdout && SystemNative_Pipe(stdoutFds, O_CLOEXEC) != 0) || - (redirectStderr && SystemNative_Pipe(stderrFds, O_CLOEXEC) != 0)) - { - success = false; - goto done; - } - - // Fork the child process - if ((processId = fork()) == -1) - { - success = false; - goto done; - } - - if (processId == 0) // processId == 0 if this is child process - { - // For any redirections that should happen, dup the pipe descriptors onto stdin/out/err. - // We don't explicitly close out the old pipe descriptors because they are set to close on execve. - if ((redirectStdin && Dup2WithInterruptedRetry(stdinFds[READ_END_OF_PIPE], STDIN_FILENO) == -1) || - (redirectStdout && Dup2WithInterruptedRetry(stdoutFds[WRITE_END_OF_PIPE], STDOUT_FILENO) == -1) || - (redirectStderr && Dup2WithInterruptedRetry(stderrFds[WRITE_END_OF_PIPE], STDERR_FILENO) == -1)) - { - _exit(errno != 0 ? errno : EXIT_FAILURE); - } - - // Change to the designated working directory, if one was specified - if (nullptr != cwd) - { - int result; - while (CheckInterrupted(result = chdir(cwd))); - if (result == -1) - { - _exit(errno != 0 ? errno : EXIT_FAILURE); - } - } - - // If SUPPRESS_PROCESS_SIGINT was chosen then create a process that ignores - // interrupt signals - if (creationFlags & SUPPRESS_PROCESS_SIGINT) - { - struct sigaction sa, saOld; - memset(&sa, 0, sizeof(sa)); - memset(&saOld, 0, sizeof(saOld)); - sigemptyset(&(sa.sa_mask)); - sa.sa_handler = SIG_IGN; // Ignore the signal - - int result = sigaction(SIGINT, &sa, &saOld); - if (result == -1) - { - _exit(errno != 0 ? errno : EXIT_FAILURE); - } - } - - // Finally, execute the new process. execve will not return if it's successful. - execve(filename, argv, envp); - _exit(errno != 0 ? errno : EXIT_FAILURE); // execve failed - } - - // This is the parent process. processId == pid of the child - *childPid = processId; - *stdinFd = stdinFds[WRITE_END_OF_PIPE]; - *stdoutFd = stdoutFds[READ_END_OF_PIPE]; - *stderrFd = stderrFds[READ_END_OF_PIPE]; - -done: - int priorErrno = errno; - - // Regardless of success or failure, close the parent's copy of the child's end of - // any opened pipes. The parent doesn't need them anymore. - CloseIfOpen(stdinFds[READ_END_OF_PIPE]); - CloseIfOpen(stdoutFds[WRITE_END_OF_PIPE]); - CloseIfOpen(stderrFds[WRITE_END_OF_PIPE]); - - // If we failed, close everything else and give back error values in all out arguments. - if (!success) - { - CloseIfOpen(stdinFds[WRITE_END_OF_PIPE]); - CloseIfOpen(stdoutFds[READ_END_OF_PIPE]); - CloseIfOpen(stderrFds[READ_END_OF_PIPE]); - - *stdinFd = -1; - *stdoutFd = -1; - *stderrFd = -1; - *childPid = -1; - - errno = priorErrno; - return -1; - } - - return 0; -} +#include "createprocess.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum +{ + SUPPRESS_PROCESS_SIGINT = 0x00000001 +}; + +enum +{ + READ_END_OF_PIPE = 0, + WRITE_END_OF_PIPE = 1 +}; + +static void CloseIfOpen(int fd) +{ + if (fd >= 0) + { + close(fd); // Ignoring errors from close is a deliberate choice + } +} + +// Checks if the IO operation was interrupted and needs to be retried. +// Returns true if the operation was interrupted; otherwise, false. +template +static inline bool CheckInterrupted(TInt result) +{ + return result < 0 && errno == EINTR; +} + +static int Dup2WithInterruptedRetry(int oldfd, int newfd) +{ + int result; + while (CheckInterrupted(result = dup2(oldfd, newfd))); + return result; +} + +int32_t SystemNative_Pipe(int32_t pipeFds[2], int32_t flags) +{ + int32_t result; + while (CheckInterrupted(result = pipe(pipeFds))); + + // Then, if O_CLOEXEC was specified, use fcntl to configure the file descriptors appropriately. + if ((flags & O_CLOEXEC) != 0 && result == 0) + { + while (CheckInterrupted(result = fcntl(pipeFds[0], F_SETFD, FD_CLOEXEC))); + if (result == 0) + { + while (CheckInterrupted(result = fcntl(pipeFds[1], F_SETFD, FD_CLOEXEC))); + } + + if (result != 0) + { + int tmpErrno = errno; + close(pipeFds[0]); + close(pipeFds[1]); + errno = tmpErrno; + } + } + + return result; +} + +int32_t ForkAndExecProcess( + const char* filename, + char* const argv[], + char* const envp[], + const char* cwd, + int32_t redirectStdin, + int32_t redirectStdout, + int32_t redirectStderr, + int32_t creationFlags, + int32_t* childPid, + int32_t* stdinFd, + int32_t* stdoutFd, + int32_t* stderrFd) +{ + int success = true; + int processId = -1; + int stdinFds[2] = { -1, -1 }; + int stdoutFds[2] = { -1, -1 }; + int stderrFds[2] = { -1, -1 }; + + // Validate arguments + if (nullptr == filename || nullptr == argv || nullptr == envp || nullptr == stdinFd || nullptr == stdoutFd || + nullptr == stderrFd || nullptr == childPid) + { + assert(false && "null argument."); + errno = EINVAL; + success = false; + goto done; + } + + if ((redirectStdin & ~1) != 0 || (redirectStdout & ~1) != 0 || (redirectStderr & ~1) != 0) + { + assert(false && "Boolean redirect* inputs must be 0 or 1."); + errno = EINVAL; + success = false; + goto done; + } + + // Make sure we can find and access the executable. exec will do this, of course, but at that point it's already + // in the child process, at which point it'll translate to the child process' exit code rather than to failing + // the Start itself. There's a race condition here, in that this could change prior to exec's checks, but there's + // little we can do about that. There are also more rigorous checks exec does, such as validating the executable + // format of the target; such errors will emerge via the child process' exit code. + if (access(filename, X_OK) != 0) + { + success = false; + goto done; + } + + // Open pipes for any requests to redirect stdin/stdout/stderr + if ((redirectStdin && SystemNative_Pipe(stdinFds, O_CLOEXEC) != 0) || + (redirectStdout && SystemNative_Pipe(stdoutFds, O_CLOEXEC) != 0) || + (redirectStderr && SystemNative_Pipe(stderrFds, O_CLOEXEC) != 0)) + { + success = false; + goto done; + } + + // Fork the child process + if ((processId = fork()) == -1) + { + success = false; + goto done; + } + + if (processId == 0) // processId == 0 if this is child process + { + // For any redirections that should happen, dup the pipe descriptors onto stdin/out/err. + // We don't explicitly close out the old pipe descriptors because they are set to close on execve. + if ((redirectStdin && Dup2WithInterruptedRetry(stdinFds[READ_END_OF_PIPE], STDIN_FILENO) == -1) || + (redirectStdout && Dup2WithInterruptedRetry(stdoutFds[WRITE_END_OF_PIPE], STDOUT_FILENO) == -1) || + (redirectStderr && Dup2WithInterruptedRetry(stderrFds[WRITE_END_OF_PIPE], STDERR_FILENO) == -1)) + { + _exit(errno != 0 ? errno : EXIT_FAILURE); + } + + // Change to the designated working directory, if one was specified + if (nullptr != cwd) + { + int result; + while (CheckInterrupted(result = chdir(cwd))); + if (result == -1) + { + _exit(errno != 0 ? errno : EXIT_FAILURE); + } + } + + // If SUPPRESS_PROCESS_SIGINT was chosen then create a process that ignores + // interrupt signals + if (creationFlags & SUPPRESS_PROCESS_SIGINT) + { + struct sigaction sa, saOld; + memset(&sa, 0, sizeof(sa)); + memset(&saOld, 0, sizeof(saOld)); + sigemptyset(&(sa.sa_mask)); + sa.sa_handler = SIG_IGN; // Ignore the signal + + int result = sigaction(SIGINT, &sa, &saOld); + if (result == -1) + { + _exit(errno != 0 ? errno : EXIT_FAILURE); + } + } + + // Finally, execute the new process. execve will not return if it's successful. + execve(filename, argv, envp); + _exit(errno != 0 ? errno : EXIT_FAILURE); // execve failed + } + + // This is the parent process. processId == pid of the child + *childPid = processId; + *stdinFd = stdinFds[WRITE_END_OF_PIPE]; + *stdoutFd = stdoutFds[READ_END_OF_PIPE]; + *stderrFd = stderrFds[READ_END_OF_PIPE]; + +done: + int priorErrno = errno; + + // Regardless of success or failure, close the parent's copy of the child's end of + // any opened pipes. The parent doesn't need them anymore. + CloseIfOpen(stdinFds[READ_END_OF_PIPE]); + CloseIfOpen(stdoutFds[WRITE_END_OF_PIPE]); + CloseIfOpen(stderrFds[WRITE_END_OF_PIPE]); + + // If we failed, close everything else and give back error values in all out arguments. + if (!success) + { + CloseIfOpen(stdinFds[WRITE_END_OF_PIPE]); + CloseIfOpen(stdoutFds[READ_END_OF_PIPE]); + CloseIfOpen(stderrFds[READ_END_OF_PIPE]); + + *stdinFd = -1; + *stdoutFd = -1; + *stderrFd = -1; + *childPid = -1; + + errno = priorErrno; + return -1; + } + + return 0; +} diff --git a/src/libpsl-native/src/createprocess.h b/src/libpsl-native/src/createprocess.h index fc865d99a8a..9755d8cc48f 100644 --- a/src/libpsl-native/src/createprocess.h +++ b/src/libpsl-native/src/createprocess.h @@ -1,22 +1,22 @@ -#pragma once - -#include "pal.h" -#include - -PAL_BEGIN_EXTERNC - -int32_t ForkAndExecProcess( - const char* filename, // filename argument to execve - char* const argv[], // argv argument to execve - char* const envp[], // envp argument to execve - const char* cwd, // path passed to chdir in child process - int32_t redirectStdin, // whether to redirect standard input from the parent - int32_t redirectStdout, // whether to redirect standard output to the parent - int32_t redirectStderr, // whether to redirect standard error to the parent - int32_t creationFlags, // creation flags - int32_t* childPid, // [out] the child process' id - int32_t* stdinFd, // [out] if redirectStdin, the parent's fd for the child's stdin - int32_t* stdoutFd, // [out] if redirectStdout, the parent's fd for the child's stdout - int32_t* stderrFd); // [out] if redirectStderr, the parent's fd for the child's stderr - -PAL_END_EXTERNC +#pragma once + +#include "pal.h" +#include + +PAL_BEGIN_EXTERNC + +int32_t ForkAndExecProcess( + const char* filename, // filename argument to execve + char* const argv[], // argv argument to execve + char* const envp[], // envp argument to execve + const char* cwd, // path passed to chdir in child process + int32_t redirectStdin, // whether to redirect standard input from the parent + int32_t redirectStdout, // whether to redirect standard output to the parent + int32_t redirectStderr, // whether to redirect standard error to the parent + int32_t creationFlags, // creation flags + int32_t* childPid, // [out] the child process' id + int32_t* stdinFd, // [out] if redirectStdin, the parent's fd for the child's stdin + int32_t* stdoutFd, // [out] if redirectStdout, the parent's fd for the child's stdout + int32_t* stderrFd); // [out] if redirectStderr, the parent's fd for the child's stderr + +PAL_END_EXTERNC diff --git a/src/powershell-native/.gitignore b/src/powershell-native/.gitignore index 07bd02f36ea..3c4c65b7276 100644 --- a/src/powershell-native/.gitignore +++ b/src/powershell-native/.gitignore @@ -14,4 +14,4 @@ Release/ # Resources MSG*.bin pwrshpluginerrorcodes.h -pwrshpluginerrorcodes.rc \ No newline at end of file +pwrshpluginerrorcodes.rc diff --git a/src/powershell-native/nativemsh/pwrshcommon/IPwrshCommonOutput.h b/src/powershell-native/nativemsh/pwrshcommon/IPwrshCommonOutput.h index c746d452ff1..3a954cf4e97 100644 --- a/src/powershell-native/nativemsh/pwrshcommon/IPwrshCommonOutput.h +++ b/src/powershell-native/nativemsh/pwrshcommon/IPwrshCommonOutput.h @@ -28,4 +28,4 @@ namespace NativeMsh int messageId, LPCWSTR insertionParam) = 0; }; -} \ No newline at end of file +} diff --git a/src/powershell-native/nativemsh/pwrshcommon/NativeMshConstants.h b/src/powershell-native/nativemsh/pwrshcommon/NativeMshConstants.h index 1b325232595..6a1a84be7a0 100644 --- a/src/powershell-native/nativemsh/pwrshcommon/NativeMshConstants.h +++ b/src/powershell-native/nativemsh/pwrshcommon/NativeMshConstants.h @@ -70,4 +70,4 @@ namespace NativeMsh const unsigned int EXIT_CODE_INCOMPATIBLE_MSH_VERSION = 0xFFFA0000; const DWORD INVALID_APPDOMAIN_ID = (DWORD)-1; // TODO: valid uninitialized value? -} // namespace NativeMsh \ No newline at end of file +} // namespace NativeMsh diff --git a/src/powershell-native/nativemsh/pwrshplugin/pwrshpluginResources.rc b/src/powershell-native/nativemsh/pwrshplugin/pwrshpluginResources.rc index 864a873e3af..47f69caca73 100644 --- a/src/powershell-native/nativemsh/pwrshplugin/pwrshpluginResources.rc +++ b/src/powershell-native/nativemsh/pwrshplugin/pwrshpluginResources.rc @@ -10,4 +10,4 @@ MANIFEST_RESOURCE_ID RT_MANIFEST "pwrshplugin.dll.manifest" #include "pwrshpluginerrorcodes.rc" -#include "version.rc" \ No newline at end of file +#include "version.rc" diff --git a/src/powershell-native/windows-compiler-override.txt b/src/powershell-native/windows-compiler-override.txt index f6cb16856cd..9c836012758 100644 --- a/src/powershell-native/windows-compiler-override.txt +++ b/src/powershell-native/windows-compiler-override.txt @@ -13,4 +13,4 @@ SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "/O2 /Zi") SET (CLR_DEFINES_DEBUG_INIT DEBUG _DEBUG _DBG URTBLDENV_FRIENDLY=Checked BUILDENV_CHECKED=1) SET (CLR_DEFINES_CHECKED_INIT DEBUG _DEBUG _DBG URTBLDENV_FRIENDLY=Checked BUILDENV_CHECKED=1) SET (CLR_DEFINES_RELEASE_INIT NDEBUG URTBLDENV_FRIENDLY=Retail) -SET (CLR_DEFINES_RELWITHDEBINFO_INIT NDEBUG URTBLDENV_FRIENDLY=Retail) \ No newline at end of file +SET (CLR_DEFINES_RELWITHDEBINFO_INIT NDEBUG URTBLDENV_FRIENDLY=Retail) diff --git a/test/PSReadLine/App.config b/test/PSReadLine/App.config index 8e15646352e..6a845b905cc 100644 --- a/test/PSReadLine/App.config +++ b/test/PSReadLine/App.config @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/test/PSReadLine/packages.config b/test/PSReadLine/packages.config index cae6c6db89a..95f93a49b0d 100644 --- a/test/PSReadLine/packages.config +++ b/test/PSReadLine/packages.config @@ -1,4 +1,4 @@  - \ No newline at end of file + diff --git a/test/powershell/Installer/WindowsInstaller.Tests.ps1 b/test/powershell/Installer/WindowsInstaller.Tests.ps1 index 2d0b705e90b..988875dddae 100644 --- a/test/powershell/Installer/WindowsInstaller.Tests.ps1 +++ b/test/powershell/Installer/WindowsInstaller.Tests.ps1 @@ -34,4 +34,4 @@ Describe "Windows Installer" -Tags "Scenario" { } } -} \ No newline at end of file +} diff --git a/test/powershell/Language/Classes/MSFT_778492.psm1 b/test/powershell/Language/Classes/MSFT_778492.psm1 index 13d00162c18..f54aefda072 100644 --- a/test/powershell/Language/Classes/MSFT_778492.psm1 +++ b/test/powershell/Language/Classes/MSFT_778492.psm1 @@ -1,15 +1,15 @@ - -$foo = 'MSFT_778492 script scope' - -class MSFT_778492 -{ - [string] F() - { - return $script:foo - } -} - -function Get-MSFT_778492 -{ - [MSFT_778492]::new() -} + +$foo = 'MSFT_778492 script scope' + +class MSFT_778492 +{ + [string] F() + { + return $script:foo + } +} + +function Get-MSFT_778492 +{ + [MSFT_778492]::new() +} diff --git a/test/powershell/Language/Classes/ProtectedAccess.Tests.ps1 b/test/powershell/Language/Classes/ProtectedAccess.Tests.ps1 index e9b7be2fb43..d10e5a2ed44 100644 --- a/test/powershell/Language/Classes/ProtectedAccess.Tests.ps1 +++ b/test/powershell/Language/Classes/ProtectedAccess.Tests.ps1 @@ -1,188 +1,188 @@ - -Add-Type -WarningAction Ignore @' -public class Base -{ - private int data; - - protected Base() - { - data = 10; - } - - protected Base(int i) - { - data = i; - } - - protected int Field; - protected int Property { get; set; } - public int Property1 { get; protected set; } - public int Property2 { protected get; set; } - - protected int Method() - { - return 32 + data; - } - protected int OverloadedMethod1(int i) - { - return 32 + i + data; - } - protected int OverloadedMethod1(string i) - { - return 1 + data; - } - public int OverloadedMethod2(int i) - { - return 32 + i + data; - } - protected int OverloadedMethod2(string i) - { - return 1 + data; - } - protected int OverloadedMethod3(int i) - { - return 32 + i + data; - } - public int OverloadedMethod3(string i) - { - return 1 + data; - } -} -'@ - -$derived1,$derived2,$derived3 = Invoke-Expression @' -class Derived : Base -{ - Derived() : Base() {} - Derived([int] $i) : Base($i) {} - - [int] TestPropertyAccess() - { - $this.Property = 1111 - return $this.Property - } - - [int] TestPropertyAccess1() - { - $this.Property1 = 2111 - return $this.Property1 - } - - [int] TestPropertyAccess2() - { - $this.Property2 = 3111 - return $this.Property2 - } - - [int] TestDynamicPropertyAccess() - { - $p = 'Property' - $this.$p = 1112 - return $this.$p - } - - [int] TestFieldAccess() - { - $this.Field = 11 - return $this.Field - } - - [int] TestDynamicFieldAccess() - { - $f = 'Field' - $this.$f = 12 - return $this.$f - } - - [int] TestMethodAccess() - { - return $this.Method() - } - - [int] TestDynamicMethodAccess() - { - $m = 'Method' - return $this.$m() - } - - [int] TestOverloadedMethodAccess1a() - { - return $this.OverloadedMethod1(42) - } - [int] TestOverloadedMethodAccess1b() - { - return $this.OverloadedMethod1("abc") - } - [int] TestOverloadedMethodAccess2a() - { - return $this.OverloadedMethod2(42) - } - [int] TestOverloadedMethodAccess2b() - { - return $this.OverloadedMethod2("abc") - } - [int] TestOverloadedMethodAccess3a() - { - return $this.OverloadedMethod3(42) - } - [int] TestOverloadedMethodAccess3b() - { - return $this.OverloadedMethod3("abc") - } -} - -class Derived2 : Base {} - -[Derived]::new() -[Derived]::new(20) -[Derived2]::new() -'@ - -Describe "Protected Member Access - w/ default ctor" -Tags "CI" { - It "Method Access" { $derived1.TestMethodAccess() | Should Be 42 } - It "Dynamic Method Access" { $derived1.TestDynamicMethodAccess() | Should Be 42 } - It "Field Access" { $derived1.TestFieldAccess() | Should Be 11 } - It "Dynamic Field Access" { $derived1.TestDynamicFieldAccess() | Should Be 12 } - It "Property Access - protected get/protected set" { $derived1.TestPropertyAccess() | Should Be 1111 } - It "Property Access - public get/protected set " { $derived1.TestPropertyAccess1() | Should Be 2111 } - It "Property Access - protected get/public set" { $derived1.TestPropertyAccess2() | Should Be 3111 } - It "Dynamic Property Access" { $derived1.TestDynamicPropertyAccess() | Should Be 1112 } - - It "Method Access - overloaded 1a" { $derived1.TestOverloadedMethodAccess1a() | Should Be 84 } - It "Method Access - overloaded 1b" { $derived1.TestOverloadedMethodAccess1b() | Should Be 11 } - It "Method Access - overloaded 2a" { $derived1.TestOverloadedMethodAccess2a() | Should Be 84 } - It "Method Access - overloaded 2b" { $derived1.TestOverloadedMethodAccess2b() | Should Be 11 } - It "Method Access - overloaded 3a" { $derived1.TestOverloadedMethodAccess3a() | Should Be 84 } - It "Method Access - overloaded 3b" { $derived1.TestOverloadedMethodAccess3b() | Should Be 11 } - It "Implicit ctor calls protected ctor" { $derived3.OverloadedMethod2(42) | Should Be 84 } -} - -Describe "Protected Member Access - w/ non-default ctor" -Tags "CI" { - It "Method Access" { $derived2.TestMethodAccess() | Should Be 52 } - It "Dynamic Method Access" { $derived2.TestDynamicMethodAccess() | Should Be 52 } - It "Field Access" { $derived2.TestFieldAccess() | Should Be 11 } - It "Dynamic Field Access" { $derived2.TestDynamicFieldAccess() | Should Be 12 } - It "Property Access - protected get/protected set" { $derived1.TestPropertyAccess() | Should Be 1111 } - It "Property Access - public get/protected set " { $derived1.TestPropertyAccess1() | Should Be 2111 } - It "Property Access - protected get/public set" { $derived1.TestPropertyAccess2() | Should Be 3111 } - It "Dynamic Property Access" { $derived2.TestDynamicPropertyAccess() | Should Be 1112 } - - It "Method Access - overloaded 1a" { $derived2.TestOverloadedMethodAccess1a() | Should Be 94 } - It "Method Access - overloaded 1b" { $derived2.TestOverloadedMethodAccess1b() | Should Be 21 } - It "Method Access - overloaded 2a" { $derived2.TestOverloadedMethodAccess2a() | Should Be 94 } - It "Method Access - overloaded 2b" { $derived2.TestOverloadedMethodAccess2b() | Should Be 21 } - It "Method Access - overloaded 3a" { $derived2.TestOverloadedMethodAccess3a() | Should Be 94 } - It "Method Access - overloaded 3b" { $derived2.TestOverloadedMethodAccess3b() | Should Be 21 } -} - -Describe "Protected Member Access - members not visible outside class" -Tags "CI" { - Set-StrictMode -v 3 - It "Invalid protected field Get Access" { { $derived1.Field } | Should Throw } - It "Invalid protected property Get Access" { { $derived1.Property } | Should Throw } - It "Invalid protected field Set Access" { { $derived1.Field = 1 } | Should Throw } - It "Invalid protected property Set Access" { { $derived1.Property = 1 } | Should Throw } - - It "Invalid protected constructor Access" { { [Base]::new() } | Should Throw } - It "Invalid protected method Access" { { $derived1.Method() } | Should Throw } -} - + +Add-Type -WarningAction Ignore @' +public class Base +{ + private int data; + + protected Base() + { + data = 10; + } + + protected Base(int i) + { + data = i; + } + + protected int Field; + protected int Property { get; set; } + public int Property1 { get; protected set; } + public int Property2 { protected get; set; } + + protected int Method() + { + return 32 + data; + } + protected int OverloadedMethod1(int i) + { + return 32 + i + data; + } + protected int OverloadedMethod1(string i) + { + return 1 + data; + } + public int OverloadedMethod2(int i) + { + return 32 + i + data; + } + protected int OverloadedMethod2(string i) + { + return 1 + data; + } + protected int OverloadedMethod3(int i) + { + return 32 + i + data; + } + public int OverloadedMethod3(string i) + { + return 1 + data; + } +} +'@ + +$derived1,$derived2,$derived3 = Invoke-Expression @' +class Derived : Base +{ + Derived() : Base() {} + Derived([int] $i) : Base($i) {} + + [int] TestPropertyAccess() + { + $this.Property = 1111 + return $this.Property + } + + [int] TestPropertyAccess1() + { + $this.Property1 = 2111 + return $this.Property1 + } + + [int] TestPropertyAccess2() + { + $this.Property2 = 3111 + return $this.Property2 + } + + [int] TestDynamicPropertyAccess() + { + $p = 'Property' + $this.$p = 1112 + return $this.$p + } + + [int] TestFieldAccess() + { + $this.Field = 11 + return $this.Field + } + + [int] TestDynamicFieldAccess() + { + $f = 'Field' + $this.$f = 12 + return $this.$f + } + + [int] TestMethodAccess() + { + return $this.Method() + } + + [int] TestDynamicMethodAccess() + { + $m = 'Method' + return $this.$m() + } + + [int] TestOverloadedMethodAccess1a() + { + return $this.OverloadedMethod1(42) + } + [int] TestOverloadedMethodAccess1b() + { + return $this.OverloadedMethod1("abc") + } + [int] TestOverloadedMethodAccess2a() + { + return $this.OverloadedMethod2(42) + } + [int] TestOverloadedMethodAccess2b() + { + return $this.OverloadedMethod2("abc") + } + [int] TestOverloadedMethodAccess3a() + { + return $this.OverloadedMethod3(42) + } + [int] TestOverloadedMethodAccess3b() + { + return $this.OverloadedMethod3("abc") + } +} + +class Derived2 : Base {} + +[Derived]::new() +[Derived]::new(20) +[Derived2]::new() +'@ + +Describe "Protected Member Access - w/ default ctor" -Tags "CI" { + It "Method Access" { $derived1.TestMethodAccess() | Should Be 42 } + It "Dynamic Method Access" { $derived1.TestDynamicMethodAccess() | Should Be 42 } + It "Field Access" { $derived1.TestFieldAccess() | Should Be 11 } + It "Dynamic Field Access" { $derived1.TestDynamicFieldAccess() | Should Be 12 } + It "Property Access - protected get/protected set" { $derived1.TestPropertyAccess() | Should Be 1111 } + It "Property Access - public get/protected set " { $derived1.TestPropertyAccess1() | Should Be 2111 } + It "Property Access - protected get/public set" { $derived1.TestPropertyAccess2() | Should Be 3111 } + It "Dynamic Property Access" { $derived1.TestDynamicPropertyAccess() | Should Be 1112 } + + It "Method Access - overloaded 1a" { $derived1.TestOverloadedMethodAccess1a() | Should Be 84 } + It "Method Access - overloaded 1b" { $derived1.TestOverloadedMethodAccess1b() | Should Be 11 } + It "Method Access - overloaded 2a" { $derived1.TestOverloadedMethodAccess2a() | Should Be 84 } + It "Method Access - overloaded 2b" { $derived1.TestOverloadedMethodAccess2b() | Should Be 11 } + It "Method Access - overloaded 3a" { $derived1.TestOverloadedMethodAccess3a() | Should Be 84 } + It "Method Access - overloaded 3b" { $derived1.TestOverloadedMethodAccess3b() | Should Be 11 } + It "Implicit ctor calls protected ctor" { $derived3.OverloadedMethod2(42) | Should Be 84 } +} + +Describe "Protected Member Access - w/ non-default ctor" -Tags "CI" { + It "Method Access" { $derived2.TestMethodAccess() | Should Be 52 } + It "Dynamic Method Access" { $derived2.TestDynamicMethodAccess() | Should Be 52 } + It "Field Access" { $derived2.TestFieldAccess() | Should Be 11 } + It "Dynamic Field Access" { $derived2.TestDynamicFieldAccess() | Should Be 12 } + It "Property Access - protected get/protected set" { $derived1.TestPropertyAccess() | Should Be 1111 } + It "Property Access - public get/protected set " { $derived1.TestPropertyAccess1() | Should Be 2111 } + It "Property Access - protected get/public set" { $derived1.TestPropertyAccess2() | Should Be 3111 } + It "Dynamic Property Access" { $derived2.TestDynamicPropertyAccess() | Should Be 1112 } + + It "Method Access - overloaded 1a" { $derived2.TestOverloadedMethodAccess1a() | Should Be 94 } + It "Method Access - overloaded 1b" { $derived2.TestOverloadedMethodAccess1b() | Should Be 21 } + It "Method Access - overloaded 2a" { $derived2.TestOverloadedMethodAccess2a() | Should Be 94 } + It "Method Access - overloaded 2b" { $derived2.TestOverloadedMethodAccess2b() | Should Be 21 } + It "Method Access - overloaded 3a" { $derived2.TestOverloadedMethodAccess3a() | Should Be 94 } + It "Method Access - overloaded 3b" { $derived2.TestOverloadedMethodAccess3b() | Should Be 21 } +} + +Describe "Protected Member Access - members not visible outside class" -Tags "CI" { + Set-StrictMode -v 3 + It "Invalid protected field Get Access" { { $derived1.Field } | Should Throw } + It "Invalid protected property Get Access" { { $derived1.Property } | Should Throw } + It "Invalid protected field Set Access" { { $derived1.Field = 1 } | Should Throw } + It "Invalid protected property Set Access" { { $derived1.Property = 1 } | Should Throw } + + It "Invalid protected constructor Access" { { [Base]::new() } | Should Throw } + It "Invalid protected method Access" { { $derived1.Method() } | Should Throw } +} + diff --git a/test/powershell/Language/Classes/Scripting.Classes.Attributes.Tests.ps1 b/test/powershell/Language/Classes/Scripting.Classes.Attributes.Tests.ps1 index fb087eb3adf..959ff2239d7 100644 --- a/test/powershell/Language/Classes/Scripting.Classes.Attributes.Tests.ps1 +++ b/test/powershell/Language/Classes/Scripting.Classes.Attributes.Tests.ps1 @@ -1,484 +1,484 @@ -Describe 'Attributes Test' -Tags "CI" { - - BeforeAll { - $dummyAttributesSource = @' -using System.Management.Automation; -namespace Dummy -{ - public class DoubleStringTransformationAttribute : ArgumentTransformationAttribute - { - public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) - { - string arg = inputData as string; - if (arg != null) - { - return arg + arg; - } - return inputData; - } - } - - public class AppendStringTransformationAttribute : ArgumentTransformationAttribute - { - public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) - { - string arg = inputData as string; - if (arg != null) - { - return arg + "___"; - } - return inputData; - } - } - - public class DoubleInt : ArgumentTransformationAttribute - { - public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) - { - int? arg = inputData as int?; - if (arg != null) - { - return arg + arg; - } - return inputData; - } - } -} -'@ - Add-Type -TypeDefinition $dummyAttributesSource - } - - - - Context 'Property.Instance.ValidateSet.String' { - class C1 { [ValidateSet("Present", "Absent")][string]$Ensure } - # This call should not throw exception - [C1]::new().Ensure = "Present" - - It 'Error when ValidateSet should be ExceptionWhenSetting' { - try - { - [C1]::new().Ensure = "foo" - throw "Exception expected" - } - catch - { - $_.FullyQualifiedErrorId | Should be 'ExceptionWhenSetting' - } - } - } - - Context 'Property.Static.ValidateSet.String' { - class C1 { static [ValidateSet("Present", "Absent")][string]$Ensure } - # This call should not throw exception - [C1]::Ensure = "Present" - It 'Error when ValidateSet should be ExceptionWhenSetting'{ - try { - [C1]::Ensure = "foo" - throw "Exception expected" - } - catch { - $_.FullyQualifiedErrorId | Should be 'ExceptionWhenSetting' - } - } - } - - Context 'Property.Instance.ValidateRange.Int' { - class C1 { [ValidateRange(1, 10)][int]$f } - # This call should not throw exception - [C1]::new().f = 10 - [C1]::new().f = 1 - It 'Error when ValidateSet should be ExceptionWhenSetting'{ - try { - [C1]::new().f = 20 - throw "Exception expected" - } - catch { - $_.FullyQualifiedErrorId | Should be 'ExceptionWhenSetting' - } - } - } - - Context 'Property.Static.ValidateRange.Int' { - class C1 { static [ValidateRange(1, 10)][int]$f } - # This call should not throw exception - [C1]::f = 5 - It 'Error when ValidateSet should be ExceptionWhenSetting'{ - try { - [C1]::f = 20 - throw "Exception expected" - } - catch { - $_.FullyQualifiedErrorId | Should be 'ExceptionWhenSetting' - } - } - } - - Context 'Property.Static.ValidateSet.ImplicitObject' { - class C1 { static [ValidateSet("abc", 5)]$o } - # This call should not throw exception - [C1]::o = "abc" - [C1]::o = 5 - It 'Error when ValidateSet should be ExceptionWhenSetting'{ - try { - [C1]::o = 1 - throw "Exception expected" - } - catch { - $_.FullyQualifiedErrorId | Should be 'ExceptionWhenSetting' - } - } - } - - # - # We use [scriptblock]::Create() here to allow SuiteSetup add Dummy.Transformation type to - # the scope. Otherwise, we will need to have all classes for attributes in parse time. - # - # Invoke() returns an array, we need first element of it. - # - - Context 'Property.Instance.Transformation.ImplicitObject' { - $c = [scriptblock]::Create('class C1 { [Dummy.DoubleStringTransformation()]$arg }; [C1]::new()').Invoke()[0] - - It 'Implicitly Transform to 100' { - $c.arg = 100 - $c.arg | should be 100 - } - It 'Implicitly Transform to foo' { - $c.arg = "foo" - $c.arg | should be "foofoo" - } - } - - Context 'Property.Instance.Transformation.String' { - $c = [scriptblock]::Create('class C1 { [Dummy.DoubleStringTransformation()][string]$arg }; [C1]::new()').Invoke()[0] - It 'set to foo' { - $c.arg = "foo" - $c.arg | should be "foofoo" - } - } - - Context Property.Instance.Transformation.Int { - $c = [scriptblock]::Create('class C1 { [Dummy.DoubleInt()][int]$arg }; [C1]::new()').Invoke()[0] - It 'arg should be 200' { - $c.arg = 100 - $c.arg | should be 200 - } - It 'Set to string should fail with ExceptionWhenSetting' { - try { - $c.arg = "abc" - throw "Exception expected" - } - catch { - $_.FullyQualifiedErrorId | Should be 'ExceptionWhenSetting' - } - } - } - - Context Property.Instance.Transformation.Nullable { - $c = [scriptblock]::Create('class C1 { [Nullable[int]][Dummy.DoubleStringTransformation()]$arg }; [C1]::new()').Invoke()[0] - It 'arg should be 100' { - $c.arg = 100 - $c.arg | should be 100 - } - } - - Context Property.Instance.Transformation.Order { - $c = [scriptblock]::Create('class C1 { [Dummy.DoubleStringTransformation()][Dummy.AppendStringTransformation()]$arg }; [C1]::new()').Invoke()[0] - It 'arg should be 100' { - $c.arg = 100 - $c.arg | should be 100 - } - - It 'arg should be foo___foo___g' { - $c.arg = "foo" - $c.arg | should be "foo___foo___" - } - } -} - -Describe 'Type resolution with attributes' -Tag "CI" { - # There is kind of a collision between names - # System.Diagnostics.Tracing.EventSource - # System.Diagnostics.Tracing.EventSourceAttribute - # We need to make sure that we resolve type name to the right class at each usage - Context 'Name collision' { - - It 'Resolve System.Diagnostics.Tracing.EventSource to Attribute and to Type in the different contexts' { - [System.Diagnostics.Tracing.EventSource(Name = "MyPSEventSource")] - class MyEventSource : System.Diagnostics.Tracing.EventSource - { - [void] OnEvent([string]$Message) {} - } - - [MyEventSource]::new() | Should Not Be $null - - } - } -} - -Describe 'ValidateSet support a dynamically generated set' -Tag "CI" { - - Context 'C# tests' { - - BeforeAll { - $a=@' - using System; - using System.Management.Automation; - using System.Collections.Generic; - - namespace Test.Language { - - [Cmdlet(VerbsCommon.Get, "TestValidateSet0")] - public class TestValidateSetCommand0 : PSCmdlet - { - [Parameter] - [ValidateSet(typeof(PSCmdlet))] - public string Param1; - - protected override void EndProcessing() - { - WriteObject(Param1); - } - } - - [Cmdlet(VerbsCommon.Get, "TestValidateSet4")] - public class TestValidateSetCommand4 : PSCmdlet - { - [Parameter] - [ValidateSet(typeof(GenValuesForParam))] - public string Param1; - - protected override void EndProcessing() - { - WriteObject(Param1); - } - } - - [Cmdlet(VerbsCommon.Get, "TestValidateSet5")] - public class TestValidateSetCommand5 : PSCmdlet - { - [Parameter] - [ValidateSet(typeof(GenValuesForParamNull))] - public string Param1; - - protected override void EndProcessing() - { - WriteObject(Param1); - } - } - - - /// Implement of test IValidateSetValuesGenerator - public class GenValuesForParamNull : IValidateSetValuesGenerator - { - public string[] GetValidValues() - { - var testValues = new string[] {"Test1","TestString1","Test2"}; - return null; - } - } - - public class GenValuesForParam : IValidateSetValuesGenerator - { - public string[] GetValidValues() - { - var testValues = new string[] {"Test1","TestString1","Test2"}; - return testValues; - } - } - } -'@ - - $cls = Add-Type -TypeDefinition $a -PassThru | select -First 1 - $testModule = Import-Module $cls.Assembly -PassThru - } - - AfterAll { - Remove-Module -ModuleInfo $testModule - } - - It 'Throw if IValidateSetValuesGenerator is not implemented' { - { Get-TestValidateSet0 -Param1 "TestString" -ErrorAction Stop } | ShouldBeErrorId "Argument" - } - - It 'Dynamically generated set works in C# with default (immediate) cache expire' { - Get-TestValidateSet4 -Param1 "TestString1" -ErrorAction SilentlyContinue | Should BeExactly "TestString1" - } - - It 'Empty dynamically generated set throws in C#' { - $exc = { - Get-TestValidateSet5 -Param1 "TestString1" -ErrorAction Stop - } | ShouldBeErrorId "ParameterArgumentValidationError,Test.Language.TestValidateSetCommand5" - $exc.Exception.InnerException.ErrorRecord.FullyQualifiedErrorId | Should BeExactly "ValidateSetGeneratedValidValuesListIsNull" - } - } - - Context 'Powershell tests' { - - BeforeAll { - class GenValuesForParam : System.Management.Automation.IValidateSetValuesGenerator { - [String[]] GetValidValues() { - - return [string[]]("Test1","TestString1","Test2") - } - } - - class GenValuesForParamNull : System.Management.Automation.IValidateSetValuesGenerator { - [String[]] GetValidValues() { - - return [string[]]$null - } - } - - # Return '$testValues2' and after 2 seconds after first use return another array '$testValues1'. - class GenValuesForParamCache1 : System.Management.Automation.IValidateSetValuesGenerator { - [String[]] GetValidValues() { - - $testValues1 = "Test11","TestString11","Test22" - $testValues2 = "Test11","TestString22","Test22" - - $currentTime = [DateTime]::Now - if ([DateTime]::Compare([GenValuesForParamCache1]::cacheTime, $currentTime) -le 0) - { - $testValues = $testValues1; - } - else - { - $testValues = $testValues2; - } - return [string[]]$testValues - } - - static [DateTime] $cacheTime = [DateTime]::Now.AddSeconds(2); - } - - function Get-TestValidateSetPS4 - { - [CmdletBinding()] - Param - ( - [ValidateSet([GenValuesForParam])] - $Param1 - ) - - $Param1 - } - - function Get-TestValidateSetPS5 - { - [CmdletBinding()] - Param - ( - [ValidateSet([GenValuesForParamNull])] - $Param1 - ) - - $Param1 - } - - function Get-TestValidateSetPS6 - { - [CmdletBinding()] - Param - ( - [ValidateSet([UnImplementedGeneratorOfValues])] - $Param1 - ) - - $Param1 - } - } - - It 'Dynamically generated set works in PowerShell script with default (immediate) cache expire' { - Get-TestValidateSetPS4 -Param1 "TestString1" -ErrorAction SilentlyContinue | Should BeExactly "TestString1" - } - - It 'Get the appropriate error message' { - {Get-TestValidateSetPS4 -Param1 "TestStringWrong" -ErrorAction Stop} | ShouldBeErrorId "ParameterArgumentValidationError,Get-TestValidateSetPS4" - } - - It 'Empty dynamically generated set throws in PowerShell script' { - $exc = { - Get-TestValidateSetPS5 -Param1 "TestString1" -ErrorAction Stop - } | ShouldBeErrorId "ParameterArgumentValidationError,Get-TestValidateSetPS5" - $exc.Exception.InnerException.ErrorRecord.FullyQualifiedErrorId | Should BeExactly "ValidateSetGeneratedValidValuesListIsNull" - } - - It 'Unimplemented valid values generator type throws in PowerShell script' { - { - Get-TestValidateSetPS6 -Param1 "AnyTestString" -ErrorAction Stop - } | ShouldBeErrorId "TypeNotFound" - } - } - - Context 'CachedValidValuesGeneratorBase class tests' { - - BeforeAll { - class GenValuesForParam : System.Management.Automation.CachedValidValuesGeneratorBase { - GenValuesForParam() : base(300) { - } - - [String[]] GenerateValidValues() { - - return [string[]]("Test1","TestString1","Test2") - } - } - - class GenValuesWithExpiration : System.Management.Automation.CachedValidValuesGeneratorBase { - GenValuesWithExpiration() : base(2) { - } - - Static [bool] $temp = $true; - - [String[]] GenerateValidValues() { - - if ([GenValuesWithExpiration]::temp) { - [GenValuesWithExpiration]::temp = $false - return [string[]]("Test1","TestString1","Test2") - } else { - [GenValuesWithExpiration]::temp = $true - return [string[]]("Test1","TestString2","Test2") - } - - } - } - - - function Get-TestValidateSetPS4 - { - [CmdletBinding()] - Param - ( - [ValidateSet([GenValuesForParam])] - $Param1 - ) - - $Param1 - } - - function Get-TestValidateSetPS5 - { - [CmdletBinding()] - Param - ( - [ValidateSet([GenValuesWithExpiration])] - $Param1 - ) - - $Param1 - } - } - - It 'Can implement CachedValidValuesGeneratorBase in PowerShell' { - Get-TestValidateSetPS4 -Param1 "TestString1" -ErrorAction SilentlyContinue | Should BeExactly "TestString1" - } - - It 'Can implement CachedValidValuesGeneratorBase with cache expiration in PowerShell' { - Get-TestValidateSetPS5 -Param1 "TestString1" -ErrorAction SilentlyContinue | Should BeExactly "TestString1" - Get-TestValidateSetPS5 -Param1 "TestString1" -ErrorAction SilentlyContinue | Should BeExactly "TestString1" - Start-Sleep 3 - Get-TestValidateSetPS5 -Param1 "TestString2" -ErrorAction SilentlyContinue | Should BeExactly "TestString2" - } - } -} +Describe 'Attributes Test' -Tags "CI" { + + BeforeAll { + $dummyAttributesSource = @' +using System.Management.Automation; +namespace Dummy +{ + public class DoubleStringTransformationAttribute : ArgumentTransformationAttribute + { + public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) + { + string arg = inputData as string; + if (arg != null) + { + return arg + arg; + } + return inputData; + } + } + + public class AppendStringTransformationAttribute : ArgumentTransformationAttribute + { + public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) + { + string arg = inputData as string; + if (arg != null) + { + return arg + "___"; + } + return inputData; + } + } + + public class DoubleInt : ArgumentTransformationAttribute + { + public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) + { + int? arg = inputData as int?; + if (arg != null) + { + return arg + arg; + } + return inputData; + } + } +} +'@ + Add-Type -TypeDefinition $dummyAttributesSource + } + + + + Context 'Property.Instance.ValidateSet.String' { + class C1 { [ValidateSet("Present", "Absent")][string]$Ensure } + # This call should not throw exception + [C1]::new().Ensure = "Present" + + It 'Error when ValidateSet should be ExceptionWhenSetting' { + try + { + [C1]::new().Ensure = "foo" + throw "Exception expected" + } + catch + { + $_.FullyQualifiedErrorId | Should be 'ExceptionWhenSetting' + } + } + } + + Context 'Property.Static.ValidateSet.String' { + class C1 { static [ValidateSet("Present", "Absent")][string]$Ensure } + # This call should not throw exception + [C1]::Ensure = "Present" + It 'Error when ValidateSet should be ExceptionWhenSetting'{ + try { + [C1]::Ensure = "foo" + throw "Exception expected" + } + catch { + $_.FullyQualifiedErrorId | Should be 'ExceptionWhenSetting' + } + } + } + + Context 'Property.Instance.ValidateRange.Int' { + class C1 { [ValidateRange(1, 10)][int]$f } + # This call should not throw exception + [C1]::new().f = 10 + [C1]::new().f = 1 + It 'Error when ValidateSet should be ExceptionWhenSetting'{ + try { + [C1]::new().f = 20 + throw "Exception expected" + } + catch { + $_.FullyQualifiedErrorId | Should be 'ExceptionWhenSetting' + } + } + } + + Context 'Property.Static.ValidateRange.Int' { + class C1 { static [ValidateRange(1, 10)][int]$f } + # This call should not throw exception + [C1]::f = 5 + It 'Error when ValidateSet should be ExceptionWhenSetting'{ + try { + [C1]::f = 20 + throw "Exception expected" + } + catch { + $_.FullyQualifiedErrorId | Should be 'ExceptionWhenSetting' + } + } + } + + Context 'Property.Static.ValidateSet.ImplicitObject' { + class C1 { static [ValidateSet("abc", 5)]$o } + # This call should not throw exception + [C1]::o = "abc" + [C1]::o = 5 + It 'Error when ValidateSet should be ExceptionWhenSetting'{ + try { + [C1]::o = 1 + throw "Exception expected" + } + catch { + $_.FullyQualifiedErrorId | Should be 'ExceptionWhenSetting' + } + } + } + + # + # We use [scriptblock]::Create() here to allow SuiteSetup add Dummy.Transformation type to + # the scope. Otherwise, we will need to have all classes for attributes in parse time. + # + # Invoke() returns an array, we need first element of it. + # + + Context 'Property.Instance.Transformation.ImplicitObject' { + $c = [scriptblock]::Create('class C1 { [Dummy.DoubleStringTransformation()]$arg }; [C1]::new()').Invoke()[0] + + It 'Implicitly Transform to 100' { + $c.arg = 100 + $c.arg | should be 100 + } + It 'Implicitly Transform to foo' { + $c.arg = "foo" + $c.arg | should be "foofoo" + } + } + + Context 'Property.Instance.Transformation.String' { + $c = [scriptblock]::Create('class C1 { [Dummy.DoubleStringTransformation()][string]$arg }; [C1]::new()').Invoke()[0] + It 'set to foo' { + $c.arg = "foo" + $c.arg | should be "foofoo" + } + } + + Context Property.Instance.Transformation.Int { + $c = [scriptblock]::Create('class C1 { [Dummy.DoubleInt()][int]$arg }; [C1]::new()').Invoke()[0] + It 'arg should be 200' { + $c.arg = 100 + $c.arg | should be 200 + } + It 'Set to string should fail with ExceptionWhenSetting' { + try { + $c.arg = "abc" + throw "Exception expected" + } + catch { + $_.FullyQualifiedErrorId | Should be 'ExceptionWhenSetting' + } + } + } + + Context Property.Instance.Transformation.Nullable { + $c = [scriptblock]::Create('class C1 { [Nullable[int]][Dummy.DoubleStringTransformation()]$arg }; [C1]::new()').Invoke()[0] + It 'arg should be 100' { + $c.arg = 100 + $c.arg | should be 100 + } + } + + Context Property.Instance.Transformation.Order { + $c = [scriptblock]::Create('class C1 { [Dummy.DoubleStringTransformation()][Dummy.AppendStringTransformation()]$arg }; [C1]::new()').Invoke()[0] + It 'arg should be 100' { + $c.arg = 100 + $c.arg | should be 100 + } + + It 'arg should be foo___foo___g' { + $c.arg = "foo" + $c.arg | should be "foo___foo___" + } + } +} + +Describe 'Type resolution with attributes' -Tag "CI" { + # There is kind of a collision between names + # System.Diagnostics.Tracing.EventSource + # System.Diagnostics.Tracing.EventSourceAttribute + # We need to make sure that we resolve type name to the right class at each usage + Context 'Name collision' { + + It 'Resolve System.Diagnostics.Tracing.EventSource to Attribute and to Type in the different contexts' { + [System.Diagnostics.Tracing.EventSource(Name = "MyPSEventSource")] + class MyEventSource : System.Diagnostics.Tracing.EventSource + { + [void] OnEvent([string]$Message) {} + } + + [MyEventSource]::new() | Should Not Be $null + + } + } +} + +Describe 'ValidateSet support a dynamically generated set' -Tag "CI" { + + Context 'C# tests' { + + BeforeAll { + $a=@' + using System; + using System.Management.Automation; + using System.Collections.Generic; + + namespace Test.Language { + + [Cmdlet(VerbsCommon.Get, "TestValidateSet0")] + public class TestValidateSetCommand0 : PSCmdlet + { + [Parameter] + [ValidateSet(typeof(PSCmdlet))] + public string Param1; + + protected override void EndProcessing() + { + WriteObject(Param1); + } + } + + [Cmdlet(VerbsCommon.Get, "TestValidateSet4")] + public class TestValidateSetCommand4 : PSCmdlet + { + [Parameter] + [ValidateSet(typeof(GenValuesForParam))] + public string Param1; + + protected override void EndProcessing() + { + WriteObject(Param1); + } + } + + [Cmdlet(VerbsCommon.Get, "TestValidateSet5")] + public class TestValidateSetCommand5 : PSCmdlet + { + [Parameter] + [ValidateSet(typeof(GenValuesForParamNull))] + public string Param1; + + protected override void EndProcessing() + { + WriteObject(Param1); + } + } + + + /// Implement of test IValidateSetValuesGenerator + public class GenValuesForParamNull : IValidateSetValuesGenerator + { + public string[] GetValidValues() + { + var testValues = new string[] {"Test1","TestString1","Test2"}; + return null; + } + } + + public class GenValuesForParam : IValidateSetValuesGenerator + { + public string[] GetValidValues() + { + var testValues = new string[] {"Test1","TestString1","Test2"}; + return testValues; + } + } + } +'@ + + $cls = Add-Type -TypeDefinition $a -PassThru | select -First 1 + $testModule = Import-Module $cls.Assembly -PassThru + } + + AfterAll { + Remove-Module -ModuleInfo $testModule + } + + It 'Throw if IValidateSetValuesGenerator is not implemented' { + { Get-TestValidateSet0 -Param1 "TestString" -ErrorAction Stop } | ShouldBeErrorId "Argument" + } + + It 'Dynamically generated set works in C# with default (immediate) cache expire' { + Get-TestValidateSet4 -Param1 "TestString1" -ErrorAction SilentlyContinue | Should BeExactly "TestString1" + } + + It 'Empty dynamically generated set throws in C#' { + $exc = { + Get-TestValidateSet5 -Param1 "TestString1" -ErrorAction Stop + } | ShouldBeErrorId "ParameterArgumentValidationError,Test.Language.TestValidateSetCommand5" + $exc.Exception.InnerException.ErrorRecord.FullyQualifiedErrorId | Should BeExactly "ValidateSetGeneratedValidValuesListIsNull" + } + } + + Context 'Powershell tests' { + + BeforeAll { + class GenValuesForParam : System.Management.Automation.IValidateSetValuesGenerator { + [String[]] GetValidValues() { + + return [string[]]("Test1","TestString1","Test2") + } + } + + class GenValuesForParamNull : System.Management.Automation.IValidateSetValuesGenerator { + [String[]] GetValidValues() { + + return [string[]]$null + } + } + + # Return '$testValues2' and after 2 seconds after first use return another array '$testValues1'. + class GenValuesForParamCache1 : System.Management.Automation.IValidateSetValuesGenerator { + [String[]] GetValidValues() { + + $testValues1 = "Test11","TestString11","Test22" + $testValues2 = "Test11","TestString22","Test22" + + $currentTime = [DateTime]::Now + if ([DateTime]::Compare([GenValuesForParamCache1]::cacheTime, $currentTime) -le 0) + { + $testValues = $testValues1; + } + else + { + $testValues = $testValues2; + } + return [string[]]$testValues + } + + static [DateTime] $cacheTime = [DateTime]::Now.AddSeconds(2); + } + + function Get-TestValidateSetPS4 + { + [CmdletBinding()] + Param + ( + [ValidateSet([GenValuesForParam])] + $Param1 + ) + + $Param1 + } + + function Get-TestValidateSetPS5 + { + [CmdletBinding()] + Param + ( + [ValidateSet([GenValuesForParamNull])] + $Param1 + ) + + $Param1 + } + + function Get-TestValidateSetPS6 + { + [CmdletBinding()] + Param + ( + [ValidateSet([UnImplementedGeneratorOfValues])] + $Param1 + ) + + $Param1 + } + } + + It 'Dynamically generated set works in PowerShell script with default (immediate) cache expire' { + Get-TestValidateSetPS4 -Param1 "TestString1" -ErrorAction SilentlyContinue | Should BeExactly "TestString1" + } + + It 'Get the appropriate error message' { + {Get-TestValidateSetPS4 -Param1 "TestStringWrong" -ErrorAction Stop} | ShouldBeErrorId "ParameterArgumentValidationError,Get-TestValidateSetPS4" + } + + It 'Empty dynamically generated set throws in PowerShell script' { + $exc = { + Get-TestValidateSetPS5 -Param1 "TestString1" -ErrorAction Stop + } | ShouldBeErrorId "ParameterArgumentValidationError,Get-TestValidateSetPS5" + $exc.Exception.InnerException.ErrorRecord.FullyQualifiedErrorId | Should BeExactly "ValidateSetGeneratedValidValuesListIsNull" + } + + It 'Unimplemented valid values generator type throws in PowerShell script' { + { + Get-TestValidateSetPS6 -Param1 "AnyTestString" -ErrorAction Stop + } | ShouldBeErrorId "TypeNotFound" + } + } + + Context 'CachedValidValuesGeneratorBase class tests' { + + BeforeAll { + class GenValuesForParam : System.Management.Automation.CachedValidValuesGeneratorBase { + GenValuesForParam() : base(300) { + } + + [String[]] GenerateValidValues() { + + return [string[]]("Test1","TestString1","Test2") + } + } + + class GenValuesWithExpiration : System.Management.Automation.CachedValidValuesGeneratorBase { + GenValuesWithExpiration() : base(2) { + } + + Static [bool] $temp = $true; + + [String[]] GenerateValidValues() { + + if ([GenValuesWithExpiration]::temp) { + [GenValuesWithExpiration]::temp = $false + return [string[]]("Test1","TestString1","Test2") + } else { + [GenValuesWithExpiration]::temp = $true + return [string[]]("Test1","TestString2","Test2") + } + + } + } + + + function Get-TestValidateSetPS4 + { + [CmdletBinding()] + Param + ( + [ValidateSet([GenValuesForParam])] + $Param1 + ) + + $Param1 + } + + function Get-TestValidateSetPS5 + { + [CmdletBinding()] + Param + ( + [ValidateSet([GenValuesWithExpiration])] + $Param1 + ) + + $Param1 + } + } + + It 'Can implement CachedValidValuesGeneratorBase in PowerShell' { + Get-TestValidateSetPS4 -Param1 "TestString1" -ErrorAction SilentlyContinue | Should BeExactly "TestString1" + } + + It 'Can implement CachedValidValuesGeneratorBase with cache expiration in PowerShell' { + Get-TestValidateSetPS5 -Param1 "TestString1" -ErrorAction SilentlyContinue | Should BeExactly "TestString1" + Get-TestValidateSetPS5 -Param1 "TestString1" -ErrorAction SilentlyContinue | Should BeExactly "TestString1" + Start-Sleep 3 + Get-TestValidateSetPS5 -Param1 "TestString2" -ErrorAction SilentlyContinue | Should BeExactly "TestString2" + } + } +} diff --git a/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 b/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 index 9d461e0b27b..a3d011de50c 100644 --- a/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 +++ b/test/powershell/Language/Classes/Scripting.Classes.BasicParsing.Tests.ps1 @@ -1,857 +1,857 @@ -# -# Copyright (c) Microsoft Corporation, 2014 -# - -try { -# -# CrossGen'ed assemblies cause a hang to happen intermittently when running this test suite in Linux and OSX. -# The issue has been reported to CoreCLR team. We need to work around it for now with the following approach: -# 1. For pull request and push commit, build without '-CrossGen' and run the parsing tests -# 2. For daily build, build with '-CrossGen' but don't run the parsing tests -# In this way, we will continue to exercise these parsing tests for each CI build, and skip them for daily -# build to avoid a hang. -# Note: this change should be reverted once the 'CrossGen' issue is fixed by CoreCLR. The issue is tracked by -# https://github.com/dotnet/coreclr/issues/9745 -# -$isDailyBuild = $env:TRAVIS_EVENT_TYPE -eq 'cron' -or $env:TRAVIS_EVENT_TYPE -eq 'api' -$defaultParamValues = $PSdefaultParameterValues.Clone() -$IsSkipped = (!$IsWindows -and $isDailyBuild) -$PSDefaultParameterValues["it:skip"] = $IsSkipped -$PSDefaultParameterValues["ShouldBeParseError:SkipInTravisFullBuild"] = $IsSkipped - - -Describe 'Positive Parse Properties Tests' -Tags "CI" { - It 'PositiveParsePropertiesTest' { - # Just a bunch of random basic things here - # This test doesn't need to check anything, if there are - # any parse errors, the entire suite will fail because the - # script will fail to parse. - - # No members - class C1 {} - - # Simple field - class C2 { $x; } - - # Simple typed field - class C3 { [int] $x; } - - # Multiple fields, one line, last w/o semicolon - class C4 { $x; $y } - - # Multiple fields, multiple lines - class C5 - { - $x - $y - } - - # Static field - class C6 { static $x; } - - # Static field w/ type - order doesn't matter - class C7a { static [hashtable] $x; } - class C7b { [hashtable] static $x; } - - # Field using type defined in this scope - class C8a { [C1] $c1; } - class C8b { [c1] $c1; } - - # Field referring to self type - class C9 { [C9] $c9; } - - # Hidden fields - class C10a { hidden $x } - class C10b { hidden [int] $x } - class C10c { hidden static $x; static hidden $y } - class C10d { hidden static [int] $x; static hidden [int] $y } - } - - It 'Positive Parse Methods Tests' { - # Just a bunch of random basic things here - # This test doesn't need to check anything, if there are - # any parse errors, the entire suite will fail because the - # script will fail to parse. - - # No members - class C1 {} - - # Simple method - class C2 { f() {} } - - # Simple method with return type - class C3 { [int] f() { return 1 } } - - # Multiple methods, one line - class C4 { f() {} f1() {} } - - # Multiple methods w/ overloads - class C5 - { - f1() {} - f1($a) {} - } - - # Static method - class C6 { static f() {} } - - # Static method w/ return type - class C7 { static [hashtable] f1() { return @{} } } - - # Method using return type defined in this scope - class C8a { [C1] f1() { return [C1]::new() } } - class C8b { [c1] f1() { return [c1]::new() } } - - # Hidden methods - class C10a { hidden F() { } } - class C10b { hidden [void] F() { } } - class C10c { hidden static F() { } static hidden G() { } } - class C10d { hidden static [void] F() { } static hidden [void] G() { } } - - # return analysis - class C11a { [int]foo() { try {throw "foo"} catch {throw $_} } } - class C11b { [int]foo() { try {throw "foo"} finally {}; try {} catch {} } } - class C11c { [int]foo() { try {throw "foo"} catch [ArgumentException] {throw $_} catch {throw $_} } } - class C11d { [int]foo() { try {if (1 -eq 2) { throw "1"} else {throw "2"}} finally {} } } - class C11e { [int]foo() { try {throw "foo"} catch [ArgumentException] {throw $_} catch {return 1} } } - class C11f { [int]foo() { try {} finally {throw "bar"} } } - class C11g { [int]foo() { do { return 1 } while ($false) } } - class C11h { [int]foo() { try {throw "foo"} finally {} } } - - # local variables - class C12a { static f() { [bigint]$foo = 42 } } - class C12b { [void] f() { [bigint]$foo = 42 } } - class C12c { [void] f() { [System.Management.Automation.Host.Rectangle]$foo = [System.Management.Automation.Host.Rectangle]::new(0, 0, 0, 0) } } - } - - context "Positive ParseMethods return type Test" { - # Method with return type of self - class C9 { [C9] f() { return [C9]::new() } } - $c9 = [C9]::new().f() - It "Expected a C9 returned" { $c9.GetType().Name | should be C9 } - class C9a { [C9a[]] f() { return [C9a]::new() } } - $c9a = [C9a]::new().f() - It "Expected a C9a[] returned" { $c9a.GetType().Name | should be C9a[] } - class C9b { [System.Collections.Generic.List[C9b]] f() { return [C9b]::new() } } - $c9b = [C9b]::new().f() - It "Expected a System.Collections.Generic.List[C9b] returned" { $c9b -is [System.Collections.Generic.List[C9b]] | should be $true } - } - - It 'Positive ParseProperty Attributes Test' { - class C1a { [ValidateNotNull()][int]$x; } - class C1b - { - [ValidateNotNull()] - [int] - $x - } - class C1c - { - [ValidateNotNull()] - [int]$x - } - class C1d - { - [ValidateNotNull()][int] - $x - } - } - - It 'PositiveParseMethodAttributesTest' { - class C1a { [Obsolete()][int] f() { return 0 } } - class C1b - { - [Obsolete()] - [int] - f() { return 1 } - } - class C1c - { - [Obsolete("Message")] - [int] f() { return 0 } - } - class C1d - { - [Obsolete()][int] - f(){ return -1 } - } - } - - It 'Class Method Reference ConstantVars' { - class C1 - { - [bool] f1() { return $true } - [bool] f2() { return $false } - [object] f3() { return $null } - } - } - - It 'Positive Parsing Of DscResource' { - [DscResource()] - class C1 - { - [DscProperty(Key)][string]$Key - [bool] Test() { return $false } - [C1] Get() { return $this } - Set() {} - } - - [DscResource()] - class C2 - { - [DscProperty(Key)][int]$Key = 1 - [bool] Test() { return $false } - [C2] Get() { return $this } - Set() {} - } - - [DscResource()] - class C4 - { - [DscProperty(Key)][byte]$Key=1 - C4() { } - C4($a) { } - [bool] Test() { return $false } - [C4] Get() { return $this } - Set() {} - } - - [DscResource()] - class C5 - { - [DscProperty(Key)][int]$Key = 1 - C5() { } - static C5() { } - C5($a) { } - [bool] Test() { return $false } - [C5] Get() { return $this } - Set() {} - } - } - - It 'allows some useful implicit variables inside methods' { - class C { - [void] m() - { - $LASTEXITCODE - $lastexitcode - '111' -match '1' - $Matches - $mAtches - $Error[0] - $error - $pwd - foreach ($i in 1..10) {$foreach} - switch ($i) - { - '1' { - $switch - } - } - } - } - } - - It 'allowes [ordered] attribute inside methods' { - class A - { - $h - A() - { - $this.h = [ordered] @{} - } - } - [A]::new().h.GetType().Name | Should Be 'OrderedDictionary' - } -} - -Describe 'Negative Parsing Tests' -Tags "CI" { - ShouldBeParseError 'class' MissingNameAfterKeyword 5 - ShouldBeParseError 'class foo' MissingTypeBody 9 - ShouldBeParseError 'class foo {' MissingEndCurlyBrace 11 - ShouldBeParseError 'class foo { [int] }' IncompleteMemberDefinition 17 - ShouldBeParseError 'class foo { $private: }' InvalidVariableReference 12 - ShouldBeParseError 'class foo { [int]$global: }' InvalidVariableReference 17 - ShouldBeParseError 'class foo { [Attr()] }' IncompleteMemberDefinition 20 - ShouldBeParseError 'class foo {} class foo {}' MemberAlreadyDefined 13 - ShouldBeParseError 'class foo { $x; $x; }' MemberAlreadyDefined 16 -SkipAndCheckRuntimeError - ShouldBeParseError 'class foo { [int][string]$x; }' TooManyTypes 17 - ShouldBeParseError 'class foo { [int][string]$x; }' TooManyTypes 17 - ShouldBeParseError 'class foo { static static $x; }' DuplicateQualifier 19 - ShouldBeParseError 'class foo { [zz]$x; }' TypeNotFound 13 - ShouldBeParseError 'class foo { [zz]f() { return 0 } }' TypeNotFound 13 - ShouldBeParseError 'class foo { f([zz]$x) {} }' TypeNotFound 15 - - ShouldBeParseError 'class C {} class C {}' MemberAlreadyDefined 11 - ShouldBeParseError 'class C { f(){} f(){} }' MemberAlreadyDefined 16 -SkipAndCheckRuntimeError - ShouldBeParseError 'class C { F(){} F($o){} [int] F($o) {return 1} }' MemberAlreadyDefined 24 -SkipAndCheckRuntimeError - ShouldBeParseError 'class C { f(){} f($a){} f(){} }' MemberAlreadyDefined 24 -SkipAndCheckRuntimeError - ShouldBeParseError 'class C { f([int]$a){} f([int]$b){} }' MemberAlreadyDefined 23 -SkipAndCheckRuntimeError - ShouldBeParseError 'class C { $x; [int]$x; }' MemberAlreadyDefined 14 -SkipAndCheckRuntimeError - ShouldBeParseError 'class C { static C($x) {} }' StaticConstructorCantHaveParameters 19 -SkipAndCheckRuntimeError - ShouldBeParseError 'class C { static C([int]$x = 100) {} }' StaticConstructorCantHaveParameters 19 -SkipAndCheckRuntimeError - - ShouldBeParseError 'class C {f(){ return 1} }' VoidMethodHasReturn 14 - ShouldBeParseError 'class C {[int] f(){ return } }' NonVoidMethodMissingReturnValue 20 - ShouldBeParseError 'class C {[int] f(){} }' MethodHasCodePathNotReturn 15 - ShouldBeParseError 'class C {f(){ $x=1; if($x -lt 2){ return } elseif($x -gt 0 ) {return 1} else{return 2} return 3 } }' @("VoidMethodHasReturn", "VoidMethodHasReturn", "VoidMethodHasReturn") @(62,77,87) - - ShouldBeParseError 'class foo { [int] bar() { $y = $z; return $y} }' VariableNotLocal 31 - ShouldBeParseError 'class foo { bar() { foreach ($zz in $yy) { } } }' VariableNotLocal 36 - ShouldBeParseError 'class foo { bar() { foreach ($zz in $global:yy) { $abc = $zzzzz } } }' VariableNotLocal 57 - ShouldBeParseError 'class foo { bar() { try { $zz = 42 } finally { } $zz } }' VariableNotLocal 49 - ShouldBeParseError 'class foo { bar() { try { $zz = 42 } catch { } $zz } }' VariableNotLocal 47 - ShouldBeParseError 'class foo { bar() { switch (@()) { default { $aa = 42 } } $aa } }' VariableNotLocal 58 - ShouldBeParseError 'class C { $x; static bar() { $this.x = 1 } }' NonStaticMemberAccessInStaticMember 29 - ShouldBeParseError 'class C { $x; static $y = $this.x }' NonStaticMemberAccessInStaticMember 26 - - ShouldBeParseError 'class C { $x; static bar() { $this.x = 1 } }' NonStaticMemberAccessInStaticMember 29 - ShouldBeParseError 'class C { $x; static $y = $this.x }' NonStaticMemberAccessInStaticMember 26 - ShouldBeParseError 'class C { $x; static bar() { $This.x = 1 } }' NonStaticMemberAccessInStaticMember 29 - ShouldBeParseError 'class C { $x; static $y = $This.x }' NonStaticMemberAccessInStaticMember 26 - - ShouldBeParseError 'class C { [void]foo() { try { throw "foo"} finally { return } } }' ControlLeavingFinally 53 - ShouldBeParseError 'class C { [int]foo() { return; return 1 } }' NonVoidMethodMissingReturnValue 23 - ShouldBeParseError 'class C { [int]foo() { try { throw "foo"} catch { } } }' MethodHasCodePathNotReturn 15 - ShouldBeParseError 'class C { [int]foo() { try { throw "foo"} catch [ArgumentException] {} catch {throw $_} } }' MethodHasCodePathNotReturn 15 - ShouldBeParseError 'class C { [int]foo() { try { throw "foo"} catch [ArgumentException] {return 1} catch {} } }' MethodHasCodePathNotReturn 15 - ShouldBeParseError 'class C { [int]foo() { while ($false) { return 1 } } }' MethodHasCodePathNotReturn 15 - ShouldBeParseError 'class C { [int]foo() { try { mkdir foo } finally { rm -rec foo } } }' MethodHasCodePathNotReturn 15 - ShouldBeParseError 'class C { [int]foo() { try { mkdir foo; return 1 } catch { } } }' MethodHasCodePathNotReturn 15 - ShouldBeParseError 'class C { [bool] Test() { if ($false) { return $true; } } }' MethodHasCodePathNotReturn 17 - - ShouldBeParseError 'class C { [int]$i; [void] foo() {$i = 10} }' MissingThis 33 - ShouldBeParseError 'class C { static [int]$i; [void] foo() {$i = 10} }' MissingTypeInStaticPropertyAssignment 40 - - ShouldBeParseError 'class C : B' MissingTypeBody 11 - - ShouldBeParseError 'Class foo { q(){} w(){}' MissingEndCurlyBrace 11 -} - -Describe 'Negative methods Tests' -Tags "CI" { - ShouldBeParseError 'class foo { f() { param($x) } }' ParamBlockNotAllowedInMethod 18 - ShouldBeParseError 'class foo { f() { dynamicparam {} } }' NamedBlockNotAllowedInMethod 18 - ShouldBeParseError 'class foo { f() { begin {} } }' NamedBlockNotAllowedInMethod 18 - ShouldBeParseError 'class foo { f() { process {} } }' NamedBlockNotAllowedInMethod 18 - ShouldBeParseError 'class foo { f() { end {} } }' NamedBlockNotAllowedInMethod 18 - ShouldBeParseError 'class foo { f([Parameter()]$a) {} }' AttributeNotAllowedOnDeclaration 14 - ShouldBeParseError 'class foo { [int] foo() { return 1 }}' ConstructorCantHaveReturnType 12 - ShouldBeParseError 'class foo { [void] bar($a, [string][int]$b, $c) {} }' MultipleTypeConstraintsOnMethodParam 35 -} - -Describe 'Negative Assignment Tests' -Tags "CI" { - ShouldBeParseError 'class foo { [string ]$path; f() { $path="" } }' MissingThis 34 - ShouldBeParseError 'class foo { [string ]$path; f() { [string] $path="" } }' MissingThis 43 - ShouldBeParseError 'class foo { [string ]$path; f() { [int] [string] $path="" } }' MissingThis 49 -} - -Describe 'Negative Assignment Tests' -Tags "CI" { - ShouldBeParseError '[DscResource()]class C { [bool] Test() { return $false } [C] Get() { return $this } Set() {} }' DscResourceMissingKeyProperty 0 - - # Test method - ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [C] Get() { return $this } Set() {} }' DscResourceMissingTestMethod 0 - ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [C] Get() { return $this } Set() {} Test() { } }' DscResourceMissingTestMethod 0 - ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [C] Get() { return $this } Set() {} [int] Test() { return 1 } }' DscResourceMissingTestMethod 0 - ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [C] Get() { return $this } Set() {} [bool] Test($a) { return $false } }' DscResourceMissingTestMethod 0 - - # Get method - ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } Set() {} }' DscResourceMissingGetMethod 0 - ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } Set() {} Get() { } }' DscResourceInvalidGetMethod 98 - ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } Set() {} [int] Get() { return 1 } }' DscResourceInvalidGetMethod 98 - ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } Set() {} [C] Get($a) { return $this } }' DscResourceMissingGetMethod 0 - - # Set method - ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } [C] Get() { return $this } }' DscResourceMissingSetMethod 0 - ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } [C] Get() { return $this } [int] Set() { return 1 } }' DscResourceMissingSetMethod 0 - ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } [C] Get() { return $this } Set($a) { } }' DscResourceMissingSetMethod 0 - - # Default ctor - ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } [C] Get() { return $this } Set() {} C($a) { } }' DscResourceMissingDefaultConstructor 0 -} - -Describe 'Negative DscResources Tests' -Tags "CI" { - # Usage errors - ShouldBeParseError '[Flags()]class C{}' AttributeNotAllowedOnDeclaration 0 - ShouldBeParseError 'class C { [Flags()]$field; }' AttributeNotAllowedOnDeclaration 10 - ShouldBeParseError 'class C { [Flags()]foo(){} }' AttributeNotAllowedOnDeclaration 10 - - # Errors related to construction of the attribute - ShouldBeParseError '[UnknownAttr()]class C{}' CustomAttributeTypeNotFound 1 - ShouldBeParseError '[System.Management.Automation.Cmdlet()]class C{}' MethodCountCouldNotFindBest 0 -SkipAndCheckRuntimeError - ShouldBeParseError '[System.Management.Automation.Cmdlet("zz")]class C{}' MethodCountCouldNotFindBest 0 -SkipAndCheckRuntimeError - ShouldBeParseError '[System.Management.Automation.Cmdlet("Get", "Thing", Prop=1)]class C{}' PropertyNotFoundForAttribute 53 - ShouldBeParseError '[System.Management.Automation.Cmdlet("Get", "Thing", ConfirmImpact="foo")]class C{}' CannotConvertValue 67 -SkipAndCheckRuntimeError - ShouldBeParseError '[System.Management.Automation.Cmdlet("Get", "Thing", NounName="foo")]class C{}' ReadOnlyProperty 53 - ShouldBeParseError '[System.Management.Automation.Cmdlet("Get", "Thing", ConfirmImpact=$zed)]class C{}' ParameterAttributeArgumentNeedsToBeConstant 67 - ShouldBeParseError 'class C{ [ValidateScript({})]$p; }' ParameterAttributeArgumentNeedsToBeConstant 25 -} - -Describe 'Negative ClassAttributes Tests' -Tags "CI" { - [System.Management.Automation.Cmdlet("Get", "Thing")]class C{} - $t = [C].GetCustomAttributes($false) - - It "Should have one attribute" {$t.Count | should be 1} - It "Should have instance of CmdletAttribute" {$t[0].GetType().FullName | should be System.Management.Automation.CmdletAttribute } - - [System.Management.Automation.CmdletAttribute]$c = $t[0] - It "Verb should be Get" {$c.VerbName | should be 'Get'} - It "Noun should be Thing" {$c.NounName | should be 'Thing'} - - [System.Management.Automation.Cmdlet("Get", "Thing", SupportsShouldProcess = $true, SupportsPaging = $true)]class C2{} - $t = [C2].GetCustomAttributes($false) - It "Should have one attribute" { $t.Count | should be 1 } - It "Should have instance of CmdletAttribute" { $t[0].GetType().FullName | should be System.Management.Automation.CmdletAttribute } - [System.Management.Automation.CmdletAttribute]$c = $t[0] - It "Verb should be Get" {$c.VerbName | should be 'Get'} - It "Noun should be Thing" {$c.NounName | should be 'Thing'} - - It "SupportsShouldProcess should be $true" { $c.ConfirmImpact | should be $true } - It "SupportsPaging should be `$true" { $c.SupportsPaging | should be $true } - Context "Support ConfirmImpact as an attribute" { - It "ConfirmImpact should be high" -pending { - [System.Management.Automation.Cmdlet("Get", "Thing", ConfirmImpact = 'High', SupportsPaging = $true)]class C3{} - $t = [C3].GetCustomAttributes($false) - It "Should have one attribute" { $t.Count | should be 1 } - It "Should have instance of CmdletAttribute" { $t[0].GetType().FullName | should be System.Management.Automation.CmdletAttribute } - [System.Management.Automation.CmdletAttribute]$c = $t[0] - $c.ConfirmImpact | should be 'High' - - } - } -} - -Describe 'Property Attributes Test' -Tags "CI" { - class C { [ValidateSet('a', 'b')]$p; } - - $t = [C].GetProperty('p').GetCustomAttributes($false) - It "Should have one attribute" { $t.Count | should be 1 } - [ValidateSet]$v = $t[0] - It "Should have 2 valid values" { $v.ValidValues.Count | should be 2 } - It "first value should be a" { $v.ValidValues[0] | should be 'a' } - It "second value should be b" { $v.ValidValues[1] | should be 'b' } -} - -Describe 'Method Attributes Test' -Tags "CI" { - class C { [Obsolete("aaa")][int]f() { return 1 } } - - $t = [C].GetMethod('f').GetCustomAttributes($false) - It "Should have one attribute" {$t.Count | should be 1 } - It "Attribute type should be ObsoleteAttribute" { $t[0].GetType().FullName | should be System.ObsoleteAttribute } -} - -Describe 'Positive SelfClass Type As Parameter Test' -Tags "CI" { - class Point - { - Point($x, $y) { $this.x = $x; $this.y = $y } - Point() {} - - [int] $x = 0 - [int] $y = 0 - Add([Point] $val) { $this.x += $val.x; $this.y += $val.y; } - - Print() { Write-Host "[`$x=$($this.x) `$y=$($this.y)]" } - Set($x, $y) { $this.x = $x; $this.y = $y } - } - It "[Point]::Add works" { - $point = [Point]::new(100,200) - $point2 = [Point]::new(1,2) - $point.Add($point2) - - $point.x | should be 101 - $point.y | should be 202 - } - - It "[Point]::Add works" { - $point = New-Object Point 100,200 - $point2 = New-Object Point 1,2 - $point.Add($point2) - - $point.x | should be 101 - $point.y | should be 202 - } -} - -Describe 'PositiveReturnSelfClassTypeFromMemberFunction Test' -Tags "CI" { - class ReturnObjectFromMemberFunctionTest - { - [ReturnObjectFromMemberFunctionTest] CreateInstance() - { - return [ReturnObjectFromMemberFunctionTest]::new() - } - [string] SayHello() - { - return "Hello1" - } - } - $f = [ReturnObjectFromMemberFunctionTest]::new() - $z = $f.CreateInstance() # Line 13 - It "CreateInstance works" { $z.SayHello() | should be 'Hello1' } -} - -Describe 'TestMultipleArguments Test' -Tags "CI" { - if ( $IsCoreCLR ) { $maxCount = 14 } else { $maxCount = 16 } - for ($i = 0; $i -lt $maxCount; $i++) - { - $properties = $(for ($j = 0; $j -le $i; $j++) { - " [int]`$Prop$j" - }) -join "`n" - - $methodParameters = $(for ($j = 0; $j -le $i; $j++) { - "[int]`$arg$j" - }) -join ", " - - $ctorAssignments = $(for ($j = 0; $j -le $i; $j++) { - " `$this.Prop$j = `$arg$j" - }) -join "`n" - - $methodReturnValue = $(for ($j = 0; $j -le $i; $j++) { - "`$arg$j" - }) -join " + " - - $methodArguments = $(for ($j = 0; $j -le $i; $j++) { - $j - }) -join ", " - - $addUpProperties = $(for ($j = 0; $j -le $i; $j++) { - "`$inst.`Prop$j" - }) -join " + " - - $expectedTotal = (0..$i | Measure-Object -Sum).Sum - - $class = @" - class Foo - { -$properties - - Foo($methodParameters) - { -$ctorAssignments - } - - [int] DoSomething($methodParameters) - { - return $methodReturnValue - } - } - - `$inst = [Foo]::new($methodArguments) - `$sum = $addUpProperties - It "ExpectedTotal" { `$sum | should be $expectedTotal } - It "ExpectedTotal"{ `$inst.DoSomething($methodArguments) | should be $expectedTotal } -"@ - - Invoke-Expression $class - } -} - -Describe 'Scopes Test' -Tags "CI" { - class C1 - { - static C1() { - $global:foo = $script:foo - } - C1() { - $script:bar = $global:foo - } - static [int] f1() { - return $script:bar + $global:bar - } - [int] f2() { - return $script:bar + $global:bar - } - } -} - -Describe 'Check PS Class Assembly Test' -Tags "CI" { - class C1 {} - $assem = [C1].Assembly - $attrs = @($assem.GetCustomAttributes($true)) - $expectedAttr = @($attrs | Where-Object { $_ -is [System.Management.Automation.DynamicClassImplementationAssemblyAttribute] }) - It "Expected a DynamicClassImplementationAssembly attribute" { $expectedAttr.Length | should be 1} -} - -Describe 'ScriptScopeAccessFromClassMethod' -Tags "CI" { - Import-Module "$PSScriptRoot\MSFT_778492.psm1" - try - { - $c = Get-MSFT_778492 - It "Method should have found variable in module scope" { $c.F() | should be 'MSFT_778492 script scope'} - } - finally - { - Remove-Module MSFT_778492 - } -} - -Describe 'Hidden Members Test ' -Tags "CI" { - class C1 - { - [int]$visibleX - [int]$visibleY - hidden [int]$hiddenZ - } - - # Create an instance - $instance = [C1]@{ visibleX = 10; visibleY = 12; hiddenZ = 42 } - - It "Access hidden property should still work" { $instance.hiddenZ | should be 42 } - - - # Formatting should not include hidden members by default - $tableOutput = $instance | Format-Table -HideTableHeaders -AutoSize | Out-String - It "Table formatting should not have included hidden member hiddenZ - should contain 10" { $tableOutput.Contains(10) | should be $true} - It "Table formatting should not have included hidden member hiddenZ- should contain 12" { $tableOutput.Contains(12) | should be $true} - It "Table formatting should not have included hidden member hiddenZ - should not contain 42" { $tableOutput.Contains(42) | should be $false} - - # Get-Member should not include hidden members by default - $member = $instance | Get-Member hiddenZ - it "Get-Member should not find hidden member w/o -Force" { $member | should be $null } - - # Get-Member should include hidden members with -Force - $member = $instance | Get-Member hiddenZ -Force - It "Get-Member should find hidden member w/ -Force" { $member | should not be $null } - - # Tab completion should not return a hidden member - $line = 'class C2 { hidden [int]$hiddenZ } [C2]::new().h' - $completions = [System.Management.Automation.CommandCompletion]::CompleteInput($line, $line.Length, $null) - It "Tab completion should not return a hidden member" { $completions.CompletionMatches.Count | should be 0 } -} - -Describe 'BaseMethodCall Test ' -Tags "CI" { - It "Derived class method call" {"abc".ToString() | should be "abc" } - # call [object] ToString() method as a base class method. - It "Base class method call" {([object]"abc").ToString() | should be "System.String" } -} - -Describe 'Scoped Types Test' -Tags "CI" { - class C1 { [string] GetContext() { return "Test scope" } } - - filter f1 - { - class C1 { [string] GetContext() { return "f1 scope" } } - - return [C1]::new().GetContext() - } - - filter f2 - { - class C1 { [string] GetContext() { return "f2 scope" } } - - return (new-object C1).GetContext() - } - - It "New-Object at test scope" { (new-object C1).GetContext() | should be "Test scope" } - It "[C1]::new() at test scope" { [C1]::new().GetContext() | should be "Test scope" } - - It "[C1]::new() in nested scope" { (f1) | should be "f1 scope" } - It "'new-object C1' in nested scope" { (f2) | should be "f2 scope" } - - - It "[C1]::new() in nested scope (in pipeline)" { (1 | f1 | f2 | f1) | should be "f1 scope" } - It "'new-object C1' in nested scope (in pipeline)" { (1 | f2 | f1 | f2) | should be "f2 scope" } -} - -Describe 'ParameterOfClassTypeInModule Test' -Tags "CI" { - try - { - $sb = [scriptblock]::Create(@' -enum EE {one = 1} -function test-it([EE]$ee){$ee} -'@) - $mod = New-Module $sb -Name MSFT_2081529 | Import-Module - $result = test-it -ee one - It "Parameter of class/enum type defined in module should work" { $result | should be 1 } - } - finally - { - Remove-Module -ea ignore MSFT_2081529 - } -} - -Describe 'Type building' -Tags "CI" { - It 'should build the type only once for scriptblock' { - $a = $null - 1..10 | ForEach-Object { - class C {} - if ($a) { - $a -eq [C] | Should Be $true - } - $a = [C] - } - } - - It 'should create a new type every time scriptblock executed?' -Pending { - $sb = [scriptblock]::Create('class A {static [int] $a }; [A]::new()') - 1..2 | ForEach-Object { - $a = $sb.Invoke()[0] - ++$a::a | Should Be 1 - ++$a::a | Should Be 2 - } - } -} - -Describe 'RuntimeType created for TypeDefinitionAst' -Tags "CI" { - - It 'can make cast to the right RuntimeType in two different contexts' -pending { - - $ssfe = [System.Management.Automation.Runspaces.SessionStateFunctionEntry]::new("foo", @' -class Base -{ - [int] foo() { return 100 } -} - -class Derived : Base -{ - [int] foo() { return 2 * ([Base]$this).foo() } -} - -[Derived]::new().foo() -'@) - - $iss = [System.Management.Automation.Runspaces.initialsessionstate]::CreateDefault2() - $iss.Commands.Add($ssfe) - - $ps = [powershell]::Create($iss) - $ps.AddCommand("foo").Invoke() | Should be 200 - $ps.Streams.Error | Should Be $null - - $ps1 = [powershell]::Create($iss) - $ps1.AddCommand("foo").Invoke() | Should be 200 - $ps1.Streams.Error | Should Be $null - - $ps.Commands.Clear() - $ps.Streams.Error.Clear() - $ps.AddScript(". foo").Invoke() | Should be 200 - $ps.Streams.Error | Should Be $null - } -} - -Describe 'TypeTable lookups' -Tags "CI" { - - Context 'Call methods from a different thread' { - $b = [powershell]::Create().AddScript( -@' -class A {} -class B -{ - [object] getA1() { return New-Object A } - [object] getA2() { return [A]::new() } -} - -[B]::new() - -'@).Invoke()[0] - - It 'can do type lookup by name' { - $b.getA1() | Should Be 'A' - } - - It 'can do type lookup by [type]' { - $b.getA2() | Should Be 'A' - } - } -} - -Describe 'Protected method access' -Tags "CI" { - - Add-Type @' -namespace Foo -{ - public class Bar - { - protected int x {get; set;} - } -} -'@ - - It 'doesn''t allow protected methods access outside of inheritance chain' -pending { - $a = [scriptblock]::Create(@' -class A -{ - SetX([Foo.Bar]$bar, [int]$x) - { - $bar.x = $x - } - - [int] GetX([Foo.Bar]$bar) - { - Set-StrictMode -Version latest - return $bar.x - } -} -[A]::new() - -'@).Invoke() - $bar = [Foo.Bar]::new() - $throwCount = 0 - try { - $a.SetX($bar, 42) - } catch { - $_.FullyQualifiedErrorId | Should Be PropertyAssignmentException - $throwCount++ - } - try { - $a.GetX($bar) - } catch { - $_.FullyQualifiedErrorId | Should Be PropertyNotFoundStrict - $throwCount++ - } - $throwCount | Should Be 2 - } - - It 'can call protected methods sequentially from two different contexts' { - $ssfe = [System.Management.Automation.Runspaces.SessionStateFunctionEntry]::new("foo", @' -class A : Foo.Bar -{ - SetX([int]$x) - { - $this.x = $x - } - - [int] GetX() - { - return $this.x - } -} -return [A]::new() -'@) - - $iss = [System.Management.Automation.Runspaces.initialsessionstate]::CreateDefault() - $iss.Commands.Add($ssfe) - - $ps = [powershell]::Create($iss) - $a = $ps.AddCommand("foo").Invoke()[0] - $ps.Streams.Error | Should Be $null - - $ps1 = [powershell]::Create($iss) - $a1 = $ps1.AddCommand("foo").Invoke()[0] - $ps1.Streams.Error | Should Be $null - - $a.SetX(101) - $a1.SetX(103) - - $a.GetX() | Should Be 101 - $a1.GetX() | Should Be 103 - } -} - -Describe 'variable analysis' -Tags "CI" { - It 'can specify type construct on the local variables' { - class A { [string] getFoo() { return 'foo'} } - - class B - { - static [A] getA () - { - [A] $var = [A]::new() - return $var - } - } - - [B]::getA().getFoo() | Should Be 'foo' - } -} - -} finally { - $global:PSdefaultParameterValues = $defaultParamValues -} +# +# Copyright (c) Microsoft Corporation, 2014 +# + +try { +# +# CrossGen'ed assemblies cause a hang to happen intermittently when running this test suite in Linux and OSX. +# The issue has been reported to CoreCLR team. We need to work around it for now with the following approach: +# 1. For pull request and push commit, build without '-CrossGen' and run the parsing tests +# 2. For daily build, build with '-CrossGen' but don't run the parsing tests +# In this way, we will continue to exercise these parsing tests for each CI build, and skip them for daily +# build to avoid a hang. +# Note: this change should be reverted once the 'CrossGen' issue is fixed by CoreCLR. The issue is tracked by +# https://github.com/dotnet/coreclr/issues/9745 +# +$isDailyBuild = $env:TRAVIS_EVENT_TYPE -eq 'cron' -or $env:TRAVIS_EVENT_TYPE -eq 'api' +$defaultParamValues = $PSdefaultParameterValues.Clone() +$IsSkipped = (!$IsWindows -and $isDailyBuild) +$PSDefaultParameterValues["it:skip"] = $IsSkipped +$PSDefaultParameterValues["ShouldBeParseError:SkipInTravisFullBuild"] = $IsSkipped + + +Describe 'Positive Parse Properties Tests' -Tags "CI" { + It 'PositiveParsePropertiesTest' { + # Just a bunch of random basic things here + # This test doesn't need to check anything, if there are + # any parse errors, the entire suite will fail because the + # script will fail to parse. + + # No members + class C1 {} + + # Simple field + class C2 { $x; } + + # Simple typed field + class C3 { [int] $x; } + + # Multiple fields, one line, last w/o semicolon + class C4 { $x; $y } + + # Multiple fields, multiple lines + class C5 + { + $x + $y + } + + # Static field + class C6 { static $x; } + + # Static field w/ type - order doesn't matter + class C7a { static [hashtable] $x; } + class C7b { [hashtable] static $x; } + + # Field using type defined in this scope + class C8a { [C1] $c1; } + class C8b { [c1] $c1; } + + # Field referring to self type + class C9 { [C9] $c9; } + + # Hidden fields + class C10a { hidden $x } + class C10b { hidden [int] $x } + class C10c { hidden static $x; static hidden $y } + class C10d { hidden static [int] $x; static hidden [int] $y } + } + + It 'Positive Parse Methods Tests' { + # Just a bunch of random basic things here + # This test doesn't need to check anything, if there are + # any parse errors, the entire suite will fail because the + # script will fail to parse. + + # No members + class C1 {} + + # Simple method + class C2 { f() {} } + + # Simple method with return type + class C3 { [int] f() { return 1 } } + + # Multiple methods, one line + class C4 { f() {} f1() {} } + + # Multiple methods w/ overloads + class C5 + { + f1() {} + f1($a) {} + } + + # Static method + class C6 { static f() {} } + + # Static method w/ return type + class C7 { static [hashtable] f1() { return @{} } } + + # Method using return type defined in this scope + class C8a { [C1] f1() { return [C1]::new() } } + class C8b { [c1] f1() { return [c1]::new() } } + + # Hidden methods + class C10a { hidden F() { } } + class C10b { hidden [void] F() { } } + class C10c { hidden static F() { } static hidden G() { } } + class C10d { hidden static [void] F() { } static hidden [void] G() { } } + + # return analysis + class C11a { [int]foo() { try {throw "foo"} catch {throw $_} } } + class C11b { [int]foo() { try {throw "foo"} finally {}; try {} catch {} } } + class C11c { [int]foo() { try {throw "foo"} catch [ArgumentException] {throw $_} catch {throw $_} } } + class C11d { [int]foo() { try {if (1 -eq 2) { throw "1"} else {throw "2"}} finally {} } } + class C11e { [int]foo() { try {throw "foo"} catch [ArgumentException] {throw $_} catch {return 1} } } + class C11f { [int]foo() { try {} finally {throw "bar"} } } + class C11g { [int]foo() { do { return 1 } while ($false) } } + class C11h { [int]foo() { try {throw "foo"} finally {} } } + + # local variables + class C12a { static f() { [bigint]$foo = 42 } } + class C12b { [void] f() { [bigint]$foo = 42 } } + class C12c { [void] f() { [System.Management.Automation.Host.Rectangle]$foo = [System.Management.Automation.Host.Rectangle]::new(0, 0, 0, 0) } } + } + + context "Positive ParseMethods return type Test" { + # Method with return type of self + class C9 { [C9] f() { return [C9]::new() } } + $c9 = [C9]::new().f() + It "Expected a C9 returned" { $c9.GetType().Name | should be C9 } + class C9a { [C9a[]] f() { return [C9a]::new() } } + $c9a = [C9a]::new().f() + It "Expected a C9a[] returned" { $c9a.GetType().Name | should be C9a[] } + class C9b { [System.Collections.Generic.List[C9b]] f() { return [C9b]::new() } } + $c9b = [C9b]::new().f() + It "Expected a System.Collections.Generic.List[C9b] returned" { $c9b -is [System.Collections.Generic.List[C9b]] | should be $true } + } + + It 'Positive ParseProperty Attributes Test' { + class C1a { [ValidateNotNull()][int]$x; } + class C1b + { + [ValidateNotNull()] + [int] + $x + } + class C1c + { + [ValidateNotNull()] + [int]$x + } + class C1d + { + [ValidateNotNull()][int] + $x + } + } + + It 'PositiveParseMethodAttributesTest' { + class C1a { [Obsolete()][int] f() { return 0 } } + class C1b + { + [Obsolete()] + [int] + f() { return 1 } + } + class C1c + { + [Obsolete("Message")] + [int] f() { return 0 } + } + class C1d + { + [Obsolete()][int] + f(){ return -1 } + } + } + + It 'Class Method Reference ConstantVars' { + class C1 + { + [bool] f1() { return $true } + [bool] f2() { return $false } + [object] f3() { return $null } + } + } + + It 'Positive Parsing Of DscResource' { + [DscResource()] + class C1 + { + [DscProperty(Key)][string]$Key + [bool] Test() { return $false } + [C1] Get() { return $this } + Set() {} + } + + [DscResource()] + class C2 + { + [DscProperty(Key)][int]$Key = 1 + [bool] Test() { return $false } + [C2] Get() { return $this } + Set() {} + } + + [DscResource()] + class C4 + { + [DscProperty(Key)][byte]$Key=1 + C4() { } + C4($a) { } + [bool] Test() { return $false } + [C4] Get() { return $this } + Set() {} + } + + [DscResource()] + class C5 + { + [DscProperty(Key)][int]$Key = 1 + C5() { } + static C5() { } + C5($a) { } + [bool] Test() { return $false } + [C5] Get() { return $this } + Set() {} + } + } + + It 'allows some useful implicit variables inside methods' { + class C { + [void] m() + { + $LASTEXITCODE + $lastexitcode + '111' -match '1' + $Matches + $mAtches + $Error[0] + $error + $pwd + foreach ($i in 1..10) {$foreach} + switch ($i) + { + '1' { + $switch + } + } + } + } + } + + It 'allowes [ordered] attribute inside methods' { + class A + { + $h + A() + { + $this.h = [ordered] @{} + } + } + [A]::new().h.GetType().Name | Should Be 'OrderedDictionary' + } +} + +Describe 'Negative Parsing Tests' -Tags "CI" { + ShouldBeParseError 'class' MissingNameAfterKeyword 5 + ShouldBeParseError 'class foo' MissingTypeBody 9 + ShouldBeParseError 'class foo {' MissingEndCurlyBrace 11 + ShouldBeParseError 'class foo { [int] }' IncompleteMemberDefinition 17 + ShouldBeParseError 'class foo { $private: }' InvalidVariableReference 12 + ShouldBeParseError 'class foo { [int]$global: }' InvalidVariableReference 17 + ShouldBeParseError 'class foo { [Attr()] }' IncompleteMemberDefinition 20 + ShouldBeParseError 'class foo {} class foo {}' MemberAlreadyDefined 13 + ShouldBeParseError 'class foo { $x; $x; }' MemberAlreadyDefined 16 -SkipAndCheckRuntimeError + ShouldBeParseError 'class foo { [int][string]$x; }' TooManyTypes 17 + ShouldBeParseError 'class foo { [int][string]$x; }' TooManyTypes 17 + ShouldBeParseError 'class foo { static static $x; }' DuplicateQualifier 19 + ShouldBeParseError 'class foo { [zz]$x; }' TypeNotFound 13 + ShouldBeParseError 'class foo { [zz]f() { return 0 } }' TypeNotFound 13 + ShouldBeParseError 'class foo { f([zz]$x) {} }' TypeNotFound 15 + + ShouldBeParseError 'class C {} class C {}' MemberAlreadyDefined 11 + ShouldBeParseError 'class C { f(){} f(){} }' MemberAlreadyDefined 16 -SkipAndCheckRuntimeError + ShouldBeParseError 'class C { F(){} F($o){} [int] F($o) {return 1} }' MemberAlreadyDefined 24 -SkipAndCheckRuntimeError + ShouldBeParseError 'class C { f(){} f($a){} f(){} }' MemberAlreadyDefined 24 -SkipAndCheckRuntimeError + ShouldBeParseError 'class C { f([int]$a){} f([int]$b){} }' MemberAlreadyDefined 23 -SkipAndCheckRuntimeError + ShouldBeParseError 'class C { $x; [int]$x; }' MemberAlreadyDefined 14 -SkipAndCheckRuntimeError + ShouldBeParseError 'class C { static C($x) {} }' StaticConstructorCantHaveParameters 19 -SkipAndCheckRuntimeError + ShouldBeParseError 'class C { static C([int]$x = 100) {} }' StaticConstructorCantHaveParameters 19 -SkipAndCheckRuntimeError + + ShouldBeParseError 'class C {f(){ return 1} }' VoidMethodHasReturn 14 + ShouldBeParseError 'class C {[int] f(){ return } }' NonVoidMethodMissingReturnValue 20 + ShouldBeParseError 'class C {[int] f(){} }' MethodHasCodePathNotReturn 15 + ShouldBeParseError 'class C {f(){ $x=1; if($x -lt 2){ return } elseif($x -gt 0 ) {return 1} else{return 2} return 3 } }' @("VoidMethodHasReturn", "VoidMethodHasReturn", "VoidMethodHasReturn") @(62,77,87) + + ShouldBeParseError 'class foo { [int] bar() { $y = $z; return $y} }' VariableNotLocal 31 + ShouldBeParseError 'class foo { bar() { foreach ($zz in $yy) { } } }' VariableNotLocal 36 + ShouldBeParseError 'class foo { bar() { foreach ($zz in $global:yy) { $abc = $zzzzz } } }' VariableNotLocal 57 + ShouldBeParseError 'class foo { bar() { try { $zz = 42 } finally { } $zz } }' VariableNotLocal 49 + ShouldBeParseError 'class foo { bar() { try { $zz = 42 } catch { } $zz } }' VariableNotLocal 47 + ShouldBeParseError 'class foo { bar() { switch (@()) { default { $aa = 42 } } $aa } }' VariableNotLocal 58 + ShouldBeParseError 'class C { $x; static bar() { $this.x = 1 } }' NonStaticMemberAccessInStaticMember 29 + ShouldBeParseError 'class C { $x; static $y = $this.x }' NonStaticMemberAccessInStaticMember 26 + + ShouldBeParseError 'class C { $x; static bar() { $this.x = 1 } }' NonStaticMemberAccessInStaticMember 29 + ShouldBeParseError 'class C { $x; static $y = $this.x }' NonStaticMemberAccessInStaticMember 26 + ShouldBeParseError 'class C { $x; static bar() { $This.x = 1 } }' NonStaticMemberAccessInStaticMember 29 + ShouldBeParseError 'class C { $x; static $y = $This.x }' NonStaticMemberAccessInStaticMember 26 + + ShouldBeParseError 'class C { [void]foo() { try { throw "foo"} finally { return } } }' ControlLeavingFinally 53 + ShouldBeParseError 'class C { [int]foo() { return; return 1 } }' NonVoidMethodMissingReturnValue 23 + ShouldBeParseError 'class C { [int]foo() { try { throw "foo"} catch { } } }' MethodHasCodePathNotReturn 15 + ShouldBeParseError 'class C { [int]foo() { try { throw "foo"} catch [ArgumentException] {} catch {throw $_} } }' MethodHasCodePathNotReturn 15 + ShouldBeParseError 'class C { [int]foo() { try { throw "foo"} catch [ArgumentException] {return 1} catch {} } }' MethodHasCodePathNotReturn 15 + ShouldBeParseError 'class C { [int]foo() { while ($false) { return 1 } } }' MethodHasCodePathNotReturn 15 + ShouldBeParseError 'class C { [int]foo() { try { mkdir foo } finally { rm -rec foo } } }' MethodHasCodePathNotReturn 15 + ShouldBeParseError 'class C { [int]foo() { try { mkdir foo; return 1 } catch { } } }' MethodHasCodePathNotReturn 15 + ShouldBeParseError 'class C { [bool] Test() { if ($false) { return $true; } } }' MethodHasCodePathNotReturn 17 + + ShouldBeParseError 'class C { [int]$i; [void] foo() {$i = 10} }' MissingThis 33 + ShouldBeParseError 'class C { static [int]$i; [void] foo() {$i = 10} }' MissingTypeInStaticPropertyAssignment 40 + + ShouldBeParseError 'class C : B' MissingTypeBody 11 + + ShouldBeParseError 'Class foo { q(){} w(){}' MissingEndCurlyBrace 11 +} + +Describe 'Negative methods Tests' -Tags "CI" { + ShouldBeParseError 'class foo { f() { param($x) } }' ParamBlockNotAllowedInMethod 18 + ShouldBeParseError 'class foo { f() { dynamicparam {} } }' NamedBlockNotAllowedInMethod 18 + ShouldBeParseError 'class foo { f() { begin {} } }' NamedBlockNotAllowedInMethod 18 + ShouldBeParseError 'class foo { f() { process {} } }' NamedBlockNotAllowedInMethod 18 + ShouldBeParseError 'class foo { f() { end {} } }' NamedBlockNotAllowedInMethod 18 + ShouldBeParseError 'class foo { f([Parameter()]$a) {} }' AttributeNotAllowedOnDeclaration 14 + ShouldBeParseError 'class foo { [int] foo() { return 1 }}' ConstructorCantHaveReturnType 12 + ShouldBeParseError 'class foo { [void] bar($a, [string][int]$b, $c) {} }' MultipleTypeConstraintsOnMethodParam 35 +} + +Describe 'Negative Assignment Tests' -Tags "CI" { + ShouldBeParseError 'class foo { [string ]$path; f() { $path="" } }' MissingThis 34 + ShouldBeParseError 'class foo { [string ]$path; f() { [string] $path="" } }' MissingThis 43 + ShouldBeParseError 'class foo { [string ]$path; f() { [int] [string] $path="" } }' MissingThis 49 +} + +Describe 'Negative Assignment Tests' -Tags "CI" { + ShouldBeParseError '[DscResource()]class C { [bool] Test() { return $false } [C] Get() { return $this } Set() {} }' DscResourceMissingKeyProperty 0 + + # Test method + ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [C] Get() { return $this } Set() {} }' DscResourceMissingTestMethod 0 + ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [C] Get() { return $this } Set() {} Test() { } }' DscResourceMissingTestMethod 0 + ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [C] Get() { return $this } Set() {} [int] Test() { return 1 } }' DscResourceMissingTestMethod 0 + ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [C] Get() { return $this } Set() {} [bool] Test($a) { return $false } }' DscResourceMissingTestMethod 0 + + # Get method + ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } Set() {} }' DscResourceMissingGetMethod 0 + ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } Set() {} Get() { } }' DscResourceInvalidGetMethod 98 + ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } Set() {} [int] Get() { return 1 } }' DscResourceInvalidGetMethod 98 + ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } Set() {} [C] Get($a) { return $this } }' DscResourceMissingGetMethod 0 + + # Set method + ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } [C] Get() { return $this } }' DscResourceMissingSetMethod 0 + ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } [C] Get() { return $this } [int] Set() { return 1 } }' DscResourceMissingSetMethod 0 + ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } [C] Get() { return $this } Set($a) { } }' DscResourceMissingSetMethod 0 + + # Default ctor + ShouldBeParseError '[DscResource()]class C { [DscProperty(Key)][string]$Key; [bool] Test() { return $false } [C] Get() { return $this } Set() {} C($a) { } }' DscResourceMissingDefaultConstructor 0 +} + +Describe 'Negative DscResources Tests' -Tags "CI" { + # Usage errors + ShouldBeParseError '[Flags()]class C{}' AttributeNotAllowedOnDeclaration 0 + ShouldBeParseError 'class C { [Flags()]$field; }' AttributeNotAllowedOnDeclaration 10 + ShouldBeParseError 'class C { [Flags()]foo(){} }' AttributeNotAllowedOnDeclaration 10 + + # Errors related to construction of the attribute + ShouldBeParseError '[UnknownAttr()]class C{}' CustomAttributeTypeNotFound 1 + ShouldBeParseError '[System.Management.Automation.Cmdlet()]class C{}' MethodCountCouldNotFindBest 0 -SkipAndCheckRuntimeError + ShouldBeParseError '[System.Management.Automation.Cmdlet("zz")]class C{}' MethodCountCouldNotFindBest 0 -SkipAndCheckRuntimeError + ShouldBeParseError '[System.Management.Automation.Cmdlet("Get", "Thing", Prop=1)]class C{}' PropertyNotFoundForAttribute 53 + ShouldBeParseError '[System.Management.Automation.Cmdlet("Get", "Thing", ConfirmImpact="foo")]class C{}' CannotConvertValue 67 -SkipAndCheckRuntimeError + ShouldBeParseError '[System.Management.Automation.Cmdlet("Get", "Thing", NounName="foo")]class C{}' ReadOnlyProperty 53 + ShouldBeParseError '[System.Management.Automation.Cmdlet("Get", "Thing", ConfirmImpact=$zed)]class C{}' ParameterAttributeArgumentNeedsToBeConstant 67 + ShouldBeParseError 'class C{ [ValidateScript({})]$p; }' ParameterAttributeArgumentNeedsToBeConstant 25 +} + +Describe 'Negative ClassAttributes Tests' -Tags "CI" { + [System.Management.Automation.Cmdlet("Get", "Thing")]class C{} + $t = [C].GetCustomAttributes($false) + + It "Should have one attribute" {$t.Count | should be 1} + It "Should have instance of CmdletAttribute" {$t[0].GetType().FullName | should be System.Management.Automation.CmdletAttribute } + + [System.Management.Automation.CmdletAttribute]$c = $t[0] + It "Verb should be Get" {$c.VerbName | should be 'Get'} + It "Noun should be Thing" {$c.NounName | should be 'Thing'} + + [System.Management.Automation.Cmdlet("Get", "Thing", SupportsShouldProcess = $true, SupportsPaging = $true)]class C2{} + $t = [C2].GetCustomAttributes($false) + It "Should have one attribute" { $t.Count | should be 1 } + It "Should have instance of CmdletAttribute" { $t[0].GetType().FullName | should be System.Management.Automation.CmdletAttribute } + [System.Management.Automation.CmdletAttribute]$c = $t[0] + It "Verb should be Get" {$c.VerbName | should be 'Get'} + It "Noun should be Thing" {$c.NounName | should be 'Thing'} + + It "SupportsShouldProcess should be $true" { $c.ConfirmImpact | should be $true } + It "SupportsPaging should be `$true" { $c.SupportsPaging | should be $true } + Context "Support ConfirmImpact as an attribute" { + It "ConfirmImpact should be high" -pending { + [System.Management.Automation.Cmdlet("Get", "Thing", ConfirmImpact = 'High', SupportsPaging = $true)]class C3{} + $t = [C3].GetCustomAttributes($false) + It "Should have one attribute" { $t.Count | should be 1 } + It "Should have instance of CmdletAttribute" { $t[0].GetType().FullName | should be System.Management.Automation.CmdletAttribute } + [System.Management.Automation.CmdletAttribute]$c = $t[0] + $c.ConfirmImpact | should be 'High' + + } + } +} + +Describe 'Property Attributes Test' -Tags "CI" { + class C { [ValidateSet('a', 'b')]$p; } + + $t = [C].GetProperty('p').GetCustomAttributes($false) + It "Should have one attribute" { $t.Count | should be 1 } + [ValidateSet]$v = $t[0] + It "Should have 2 valid values" { $v.ValidValues.Count | should be 2 } + It "first value should be a" { $v.ValidValues[0] | should be 'a' } + It "second value should be b" { $v.ValidValues[1] | should be 'b' } +} + +Describe 'Method Attributes Test' -Tags "CI" { + class C { [Obsolete("aaa")][int]f() { return 1 } } + + $t = [C].GetMethod('f').GetCustomAttributes($false) + It "Should have one attribute" {$t.Count | should be 1 } + It "Attribute type should be ObsoleteAttribute" { $t[0].GetType().FullName | should be System.ObsoleteAttribute } +} + +Describe 'Positive SelfClass Type As Parameter Test' -Tags "CI" { + class Point + { + Point($x, $y) { $this.x = $x; $this.y = $y } + Point() {} + + [int] $x = 0 + [int] $y = 0 + Add([Point] $val) { $this.x += $val.x; $this.y += $val.y; } + + Print() { Write-Host "[`$x=$($this.x) `$y=$($this.y)]" } + Set($x, $y) { $this.x = $x; $this.y = $y } + } + It "[Point]::Add works" { + $point = [Point]::new(100,200) + $point2 = [Point]::new(1,2) + $point.Add($point2) + + $point.x | should be 101 + $point.y | should be 202 + } + + It "[Point]::Add works" { + $point = New-Object Point 100,200 + $point2 = New-Object Point 1,2 + $point.Add($point2) + + $point.x | should be 101 + $point.y | should be 202 + } +} + +Describe 'PositiveReturnSelfClassTypeFromMemberFunction Test' -Tags "CI" { + class ReturnObjectFromMemberFunctionTest + { + [ReturnObjectFromMemberFunctionTest] CreateInstance() + { + return [ReturnObjectFromMemberFunctionTest]::new() + } + [string] SayHello() + { + return "Hello1" + } + } + $f = [ReturnObjectFromMemberFunctionTest]::new() + $z = $f.CreateInstance() # Line 13 + It "CreateInstance works" { $z.SayHello() | should be 'Hello1' } +} + +Describe 'TestMultipleArguments Test' -Tags "CI" { + if ( $IsCoreCLR ) { $maxCount = 14 } else { $maxCount = 16 } + for ($i = 0; $i -lt $maxCount; $i++) + { + $properties = $(for ($j = 0; $j -le $i; $j++) { + " [int]`$Prop$j" + }) -join "`n" + + $methodParameters = $(for ($j = 0; $j -le $i; $j++) { + "[int]`$arg$j" + }) -join ", " + + $ctorAssignments = $(for ($j = 0; $j -le $i; $j++) { + " `$this.Prop$j = `$arg$j" + }) -join "`n" + + $methodReturnValue = $(for ($j = 0; $j -le $i; $j++) { + "`$arg$j" + }) -join " + " + + $methodArguments = $(for ($j = 0; $j -le $i; $j++) { + $j + }) -join ", " + + $addUpProperties = $(for ($j = 0; $j -le $i; $j++) { + "`$inst.`Prop$j" + }) -join " + " + + $expectedTotal = (0..$i | Measure-Object -Sum).Sum + + $class = @" + class Foo + { +$properties + + Foo($methodParameters) + { +$ctorAssignments + } + + [int] DoSomething($methodParameters) + { + return $methodReturnValue + } + } + + `$inst = [Foo]::new($methodArguments) + `$sum = $addUpProperties + It "ExpectedTotal" { `$sum | should be $expectedTotal } + It "ExpectedTotal"{ `$inst.DoSomething($methodArguments) | should be $expectedTotal } +"@ + + Invoke-Expression $class + } +} + +Describe 'Scopes Test' -Tags "CI" { + class C1 + { + static C1() { + $global:foo = $script:foo + } + C1() { + $script:bar = $global:foo + } + static [int] f1() { + return $script:bar + $global:bar + } + [int] f2() { + return $script:bar + $global:bar + } + } +} + +Describe 'Check PS Class Assembly Test' -Tags "CI" { + class C1 {} + $assem = [C1].Assembly + $attrs = @($assem.GetCustomAttributes($true)) + $expectedAttr = @($attrs | Where-Object { $_ -is [System.Management.Automation.DynamicClassImplementationAssemblyAttribute] }) + It "Expected a DynamicClassImplementationAssembly attribute" { $expectedAttr.Length | should be 1} +} + +Describe 'ScriptScopeAccessFromClassMethod' -Tags "CI" { + Import-Module "$PSScriptRoot\MSFT_778492.psm1" + try + { + $c = Get-MSFT_778492 + It "Method should have found variable in module scope" { $c.F() | should be 'MSFT_778492 script scope'} + } + finally + { + Remove-Module MSFT_778492 + } +} + +Describe 'Hidden Members Test ' -Tags "CI" { + class C1 + { + [int]$visibleX + [int]$visibleY + hidden [int]$hiddenZ + } + + # Create an instance + $instance = [C1]@{ visibleX = 10; visibleY = 12; hiddenZ = 42 } + + It "Access hidden property should still work" { $instance.hiddenZ | should be 42 } + + + # Formatting should not include hidden members by default + $tableOutput = $instance | Format-Table -HideTableHeaders -AutoSize | Out-String + It "Table formatting should not have included hidden member hiddenZ - should contain 10" { $tableOutput.Contains(10) | should be $true} + It "Table formatting should not have included hidden member hiddenZ- should contain 12" { $tableOutput.Contains(12) | should be $true} + It "Table formatting should not have included hidden member hiddenZ - should not contain 42" { $tableOutput.Contains(42) | should be $false} + + # Get-Member should not include hidden members by default + $member = $instance | Get-Member hiddenZ + it "Get-Member should not find hidden member w/o -Force" { $member | should be $null } + + # Get-Member should include hidden members with -Force + $member = $instance | Get-Member hiddenZ -Force + It "Get-Member should find hidden member w/ -Force" { $member | should not be $null } + + # Tab completion should not return a hidden member + $line = 'class C2 { hidden [int]$hiddenZ } [C2]::new().h' + $completions = [System.Management.Automation.CommandCompletion]::CompleteInput($line, $line.Length, $null) + It "Tab completion should not return a hidden member" { $completions.CompletionMatches.Count | should be 0 } +} + +Describe 'BaseMethodCall Test ' -Tags "CI" { + It "Derived class method call" {"abc".ToString() | should be "abc" } + # call [object] ToString() method as a base class method. + It "Base class method call" {([object]"abc").ToString() | should be "System.String" } +} + +Describe 'Scoped Types Test' -Tags "CI" { + class C1 { [string] GetContext() { return "Test scope" } } + + filter f1 + { + class C1 { [string] GetContext() { return "f1 scope" } } + + return [C1]::new().GetContext() + } + + filter f2 + { + class C1 { [string] GetContext() { return "f2 scope" } } + + return (new-object C1).GetContext() + } + + It "New-Object at test scope" { (new-object C1).GetContext() | should be "Test scope" } + It "[C1]::new() at test scope" { [C1]::new().GetContext() | should be "Test scope" } + + It "[C1]::new() in nested scope" { (f1) | should be "f1 scope" } + It "'new-object C1' in nested scope" { (f2) | should be "f2 scope" } + + + It "[C1]::new() in nested scope (in pipeline)" { (1 | f1 | f2 | f1) | should be "f1 scope" } + It "'new-object C1' in nested scope (in pipeline)" { (1 | f2 | f1 | f2) | should be "f2 scope" } +} + +Describe 'ParameterOfClassTypeInModule Test' -Tags "CI" { + try + { + $sb = [scriptblock]::Create(@' +enum EE {one = 1} +function test-it([EE]$ee){$ee} +'@) + $mod = New-Module $sb -Name MSFT_2081529 | Import-Module + $result = test-it -ee one + It "Parameter of class/enum type defined in module should work" { $result | should be 1 } + } + finally + { + Remove-Module -ea ignore MSFT_2081529 + } +} + +Describe 'Type building' -Tags "CI" { + It 'should build the type only once for scriptblock' { + $a = $null + 1..10 | ForEach-Object { + class C {} + if ($a) { + $a -eq [C] | Should Be $true + } + $a = [C] + } + } + + It 'should create a new type every time scriptblock executed?' -Pending { + $sb = [scriptblock]::Create('class A {static [int] $a }; [A]::new()') + 1..2 | ForEach-Object { + $a = $sb.Invoke()[0] + ++$a::a | Should Be 1 + ++$a::a | Should Be 2 + } + } +} + +Describe 'RuntimeType created for TypeDefinitionAst' -Tags "CI" { + + It 'can make cast to the right RuntimeType in two different contexts' -pending { + + $ssfe = [System.Management.Automation.Runspaces.SessionStateFunctionEntry]::new("foo", @' +class Base +{ + [int] foo() { return 100 } +} + +class Derived : Base +{ + [int] foo() { return 2 * ([Base]$this).foo() } +} + +[Derived]::new().foo() +'@) + + $iss = [System.Management.Automation.Runspaces.initialsessionstate]::CreateDefault2() + $iss.Commands.Add($ssfe) + + $ps = [powershell]::Create($iss) + $ps.AddCommand("foo").Invoke() | Should be 200 + $ps.Streams.Error | Should Be $null + + $ps1 = [powershell]::Create($iss) + $ps1.AddCommand("foo").Invoke() | Should be 200 + $ps1.Streams.Error | Should Be $null + + $ps.Commands.Clear() + $ps.Streams.Error.Clear() + $ps.AddScript(". foo").Invoke() | Should be 200 + $ps.Streams.Error | Should Be $null + } +} + +Describe 'TypeTable lookups' -Tags "CI" { + + Context 'Call methods from a different thread' { + $b = [powershell]::Create().AddScript( +@' +class A {} +class B +{ + [object] getA1() { return New-Object A } + [object] getA2() { return [A]::new() } +} + +[B]::new() + +'@).Invoke()[0] + + It 'can do type lookup by name' { + $b.getA1() | Should Be 'A' + } + + It 'can do type lookup by [type]' { + $b.getA2() | Should Be 'A' + } + } +} + +Describe 'Protected method access' -Tags "CI" { + + Add-Type @' +namespace Foo +{ + public class Bar + { + protected int x {get; set;} + } +} +'@ + + It 'doesn''t allow protected methods access outside of inheritance chain' -pending { + $a = [scriptblock]::Create(@' +class A +{ + SetX([Foo.Bar]$bar, [int]$x) + { + $bar.x = $x + } + + [int] GetX([Foo.Bar]$bar) + { + Set-StrictMode -Version latest + return $bar.x + } +} +[A]::new() + +'@).Invoke() + $bar = [Foo.Bar]::new() + $throwCount = 0 + try { + $a.SetX($bar, 42) + } catch { + $_.FullyQualifiedErrorId | Should Be PropertyAssignmentException + $throwCount++ + } + try { + $a.GetX($bar) + } catch { + $_.FullyQualifiedErrorId | Should Be PropertyNotFoundStrict + $throwCount++ + } + $throwCount | Should Be 2 + } + + It 'can call protected methods sequentially from two different contexts' { + $ssfe = [System.Management.Automation.Runspaces.SessionStateFunctionEntry]::new("foo", @' +class A : Foo.Bar +{ + SetX([int]$x) + { + $this.x = $x + } + + [int] GetX() + { + return $this.x + } +} +return [A]::new() +'@) + + $iss = [System.Management.Automation.Runspaces.initialsessionstate]::CreateDefault() + $iss.Commands.Add($ssfe) + + $ps = [powershell]::Create($iss) + $a = $ps.AddCommand("foo").Invoke()[0] + $ps.Streams.Error | Should Be $null + + $ps1 = [powershell]::Create($iss) + $a1 = $ps1.AddCommand("foo").Invoke()[0] + $ps1.Streams.Error | Should Be $null + + $a.SetX(101) + $a1.SetX(103) + + $a.GetX() | Should Be 101 + $a1.GetX() | Should Be 103 + } +} + +Describe 'variable analysis' -Tags "CI" { + It 'can specify type construct on the local variables' { + class A { [string] getFoo() { return 'foo'} } + + class B + { + static [A] getA () + { + [A] $var = [A]::new() + return $var + } + } + + [B]::getA().getFoo() | Should Be 'foo' + } +} + +} finally { + $global:PSdefaultParameterValues = $defaultParamValues +} diff --git a/test/powershell/Language/Classes/Scripting.Classes.Break.Tests.ps1 b/test/powershell/Language/Classes/Scripting.Classes.Break.Tests.ps1 index b4d15b3eddc..3274bf80947 100644 --- a/test/powershell/Language/Classes/Scripting.Classes.Break.Tests.ps1 +++ b/test/powershell/Language/Classes/Scripting.Classes.Break.Tests.ps1 @@ -1,145 +1,145 @@ -Describe 'Break statements with classes' -Tags "CI" { - - function Get-Errors([string]$sourceCode) { - $tokens = $null - $errors = $null - $ast = [System.Management.Automation.Language.Parser]::ParseInput($sourceCode, [ref] $tokens, [ref] $errors) - return $errors - } - - Context 'break is inside a class method' { - It 'reports parse error for break on non-existing label' { - $errors = Get-Errors @' -class A -{ - static [int] foo() - { - while (1) { break some_label } - return 1 - } -} -'@ - $errors.Count | Should be 1 - $errors[0].ErrorId | Should be 'LabelNotFound' - } - - It 'reports parse error for break outside of loop' { - $errors = Get-Errors @' -class A -{ - static [int] foo() - { - break some_label - return 1 - } -} -'@ - $errors.Count | Should be 1 - $errors[0].ErrorId | Should be 'LabelNotFound' - } - - It 'work fine, when break is legit' { - class C - { - static [int] foo() - { - foreach ($i in 101..102) { - break - } - return $i - } - } - [C]::foo() | Should be 101 - } - } - - Context 'continue inside a class method' { - It 'reports parse error for continue on non-existing label' { - $errors = Get-Errors @' -class A -{ - static [int] foo() - { - while (1) { continue some_label } - return 1 - } -} -'@ - $errors.Count | Should be 1 - $errors[0].ErrorId | Should be 'LabelNotFound' - } - } - - Context 'break is in called function' { - It 'doesn''t terminate caller method' -Skip { - - function ImBreak() { - break - } - - class C - { - static [int] getInt() - { - ImBreak - return 123 - } - } - - $canary = $false - try { - [C]::getInt() | Should Be 123 - $canary = $true - } finally { - $canary | Should be $true - } - } - - It 'doesn''t allow goto outside of function with break' -Skip { - - function ImBreak() { - break label1 - } - - class C - { - static [int] getInt() - { - $count = 123 - :label1 - foreach ($i in 0..3) { - foreach ($i in 0..3) { - ImBreak - $count++ - } - } - return $count - } - } - - $canary = $false - try { - [C]::getInt() | Should Be (123 + 4*4) - $canary = $true - } finally { - $canary | Should be $true - } - } - } - - Context 'no classes involved' { - - It 'doesn''t report parse error for non-existing label' { - $errors = Get-Errors @' -function foo() -{ - while (1) { break some_label } - while (1) { continue another_label } - return 1 -} -'@ - $errors.Count | Should be 0 - } - - } -} +Describe 'Break statements with classes' -Tags "CI" { + + function Get-Errors([string]$sourceCode) { + $tokens = $null + $errors = $null + $ast = [System.Management.Automation.Language.Parser]::ParseInput($sourceCode, [ref] $tokens, [ref] $errors) + return $errors + } + + Context 'break is inside a class method' { + It 'reports parse error for break on non-existing label' { + $errors = Get-Errors @' +class A +{ + static [int] foo() + { + while (1) { break some_label } + return 1 + } +} +'@ + $errors.Count | Should be 1 + $errors[0].ErrorId | Should be 'LabelNotFound' + } + + It 'reports parse error for break outside of loop' { + $errors = Get-Errors @' +class A +{ + static [int] foo() + { + break some_label + return 1 + } +} +'@ + $errors.Count | Should be 1 + $errors[0].ErrorId | Should be 'LabelNotFound' + } + + It 'work fine, when break is legit' { + class C + { + static [int] foo() + { + foreach ($i in 101..102) { + break + } + return $i + } + } + [C]::foo() | Should be 101 + } + } + + Context 'continue inside a class method' { + It 'reports parse error for continue on non-existing label' { + $errors = Get-Errors @' +class A +{ + static [int] foo() + { + while (1) { continue some_label } + return 1 + } +} +'@ + $errors.Count | Should be 1 + $errors[0].ErrorId | Should be 'LabelNotFound' + } + } + + Context 'break is in called function' { + It 'doesn''t terminate caller method' -Skip { + + function ImBreak() { + break + } + + class C + { + static [int] getInt() + { + ImBreak + return 123 + } + } + + $canary = $false + try { + [C]::getInt() | Should Be 123 + $canary = $true + } finally { + $canary | Should be $true + } + } + + It 'doesn''t allow goto outside of function with break' -Skip { + + function ImBreak() { + break label1 + } + + class C + { + static [int] getInt() + { + $count = 123 + :label1 + foreach ($i in 0..3) { + foreach ($i in 0..3) { + ImBreak + $count++ + } + } + return $count + } + } + + $canary = $false + try { + [C]::getInt() | Should Be (123 + 4*4) + $canary = $true + } finally { + $canary | Should be $true + } + } + } + + Context 'no classes involved' { + + It 'doesn''t report parse error for non-existing label' { + $errors = Get-Errors @' +function foo() +{ + while (1) { break some_label } + while (1) { continue another_label } + return 1 +} +'@ + $errors.Count | Should be 0 + } + + } +} diff --git a/test/powershell/Language/Classes/Scripting.Classes.Exceptions.Tests.ps1 b/test/powershell/Language/Classes/Scripting.Classes.Exceptions.Tests.ps1 index 5b95b3f6513..258354c5062 100644 --- a/test/powershell/Language/Classes/Scripting.Classes.Exceptions.Tests.ps1 +++ b/test/powershell/Language/Classes/Scripting.Classes.Exceptions.Tests.ps1 @@ -1,349 +1,349 @@ -Describe 'Exceptions flow for classes' -Tags "CI" { - - $canaryHashtable = @{} - - $iss = [initialsessionstate]::CreateDefault() - $iss.Variables.Add([System.Management.Automation.Runspaces.SessionStateVariableEntry]::new('canaryHashtable', $canaryHashtable, $null)) - $iss.Commands.Add([System.Management.Automation.Runspaces.SessionStateFunctionEntry]::new('Get-Canary', '$canaryHashtable')) - $ps = [powershell]::Create($iss) - - BeforeEach { - $canaryHashtable.Clear() - $ps.Commands.Clear() - } - - Context 'All calls are inside classes' { - - It 'does not execute statements after instance method with exception' { - - # Put try-catch outside to avoid try-catch logic altering analysis - try { - - $ps.AddScript( @' -class C -{ - [void] m1() - { - $canaryHashtable = Get-Canary - $canaryHashtable['canary'] = 42 - $this.ImThrow() - $canaryHashtable['canary'] = 100 - } - - [void] ImThrow() - { - throw 'I told you' - } -} -[C]::new().m1() -'@).Invoke() - - } catch {} - - $canaryHashtable['canary'] | Should Be 42 - } - - It 'does not execute statements after static method with exception' { - - # Put try-catch outside to avoid try-catch logic altering analysis - try { - - $ps.AddScript( @' -class C -{ - static [void] s1() - { - $canaryHashtable = Get-Canary - $canaryHashtable['canary'] = 43 - [C]::ImThrow() - $canaryHashtable['canary'] = 100 - } - - static [void] ImThrow() - { - 1 / 0 - } -} -[C]::s1() -'@).Invoke() - - } catch {} - - $canaryHashtable['canary'] | Should Be 43 - } - - It 'does not execute statements after instance method with exception and deep stack' { - - # Put try-catch outside to avoid try-catch logic altering analysis - try { - - $ps.AddScript( @' -class C -{ - [void] m1() - { - $canaryHashtable = Get-Canary - $canaryHashtable['canary'] = 1 - $this.m2() - $canaryHashtable['canary'] = -6101 - } - - [void] m2() - { - $canaryHashtable = Get-Canary - $canaryHashtable['canary'] += 10 - $this.m3() - $canaryHashtable['canary'] = -6102 - } - - [void] m3() - { - $canaryHashtable = Get-Canary - $canaryHashtable['canary'] += 100 - $this.m4() - $canaryHashtable['canary'] = -6103 - } - - [void] m4() - { - $canaryHashtable = Get-Canary - $canaryHashtable['canary'] += 1000 - $this.ImThrow() - $canaryHashtable['canary'] = -6104 - } - - [void] ImThrow() - { - $canaryHashtable = Get-Canary - $canaryHashtable['canary'] += 10000 - - 1 / 0 - } -} -[C]::new().m1() -'@).Invoke() - - } catch {} - - $canaryHashtable['canary'] | Should Be 11111 - } - } - - Context 'Class method call PS function' { - - $body = @' -class C -{ - [void] m1() - { - m2 - } - - static [void] s1() - { - s2 - } -} - - -function m2() -{ - $canary = Get-Canary - $canary['canaryM'] = 45 - ImThrow - $canary['canaryM'] = 100 -} - -function s2() -{ - $canary = Get-Canary - $canary['canaryS'] = 46 - CallImThrow - $canary['canaryS'] = 100 -} - -function CallImThrow() -{ - ImThrow -} - -function ImThrow() -{ - 1 / 0 -} - -'@ - - It 'does not execute statements after function with exception called from instance method' { - - # Put try-catch outside to avoid try-catch logic altering analysis - try { - - $ps.AddScript($body).Invoke() - $ps.AddScript('$c = [C]::new(); $c.m1()').Invoke() - - } catch {} - - $canaryHashtable['canaryM'] | Should Be 45 - } - - It 'does not execute statements after function with exception called from static method' { - - # Put try-catch outside to avoid try-catch logic altering analysis - try { - - $ps.AddScript($body).Invoke() - $ps.AddScript('[C]::s1()').Invoke() - - } catch {} - - $canaryHashtable['canaryS'] | Should Be 46 - } - - } - - Context "No class is involved" { - It "functions calls continue execution by default" { - - try { - - $ps.AddScript( @' - -$canaryHashtable = Get-Canary -function foo() { 1 / 0; $canaryHashtable['canary'] += 10 } -$canaryHashtable['canary'] = 1 -foo -$canaryHashtable['canary'] += 100 - -'@).Invoke() - - } catch {} - - $canaryHashtable['canary'] | Should Be 111 - } - } -} - -Describe "Exception error position" -Tags "CI" { - class MSFT_3090412 - { - static f1() { [MSFT_3090412]::bar = 42 } - static f2() { throw "an error in f2" } - static f3() { "".Substring(0, 10) } - static f4() { dir nosuchfile -ea Stop } - } - - It "Setting a property that doesn't exist" { - try { - [MSFT_3090412]::f1() - throw "f1 should have thrown" - } catch { - $_.InvocationInfo.Line | Should Match ([regex]::Escape('[MSFT_3090412]::bar = 42')) - } - } - - It "Throwing an exception" { - try { - [MSFT_3090412]::f2() - throw "f2 should have thrown" - } catch { - $_.InvocationInfo.Line | Should Match ([regex]::Escape('throw "an error in f2"')) - } - } - - It "Calling a .Net method that throws" { - try { - [MSFT_3090412]::f3() - throw "f3 should have thrown" - } catch { - $_.InvocationInfo.Line | Should Match ([regex]::Escape('"".Substring(0, 10)')) - } - } - - It "Terminating error" { - try { - [MSFT_3090412]::f4() - throw "f4 should have thrown" - } catch { - $_.InvocationInfo.Line | Should Match ([regex]::Escape('dir nosuchfile -ea Stop')) - } - } -} - -Describe "Exception from initializer" -Tags "CI" { - class MSFT_6397334a - { - [int]$a = "zz" - MSFT_6397334a() {} - } - - class MSFT_6397334b - { - [int]$a = "zz" - } - - class MSFT_6397334c - { - static [int]$a = "zz" - static MSFT_6397334a() {} - } - - class MSFT_6397334d - { - static [int]$a = "zz" - } - - It "instance member w/ ctor" { - try { - [MSFT_6397334a]::new() - throw "[MSFT_6397334a]::new() should have thrown" - } - catch - { - $e = $_ - $e.FullyQualifiedErrorId | Should Be InvalidCastFromStringToInteger - $e.InvocationInfo.Line | Should Match 'a = "zz"' - } - } - - It "instance member w/o ctor" { - try { - [MSFT_6397334b]::new() - throw "[MSFT_6397334b]::new() should have thrown" - } - catch - { - $e = $_ - $e.FullyQualifiedErrorId | Should Be InvalidCastFromStringToInteger - $e.InvocationInfo.Line | Should Match 'a = "zz"' - } - } - - It "static member w/ ctor" { - try { - $null = [MSFT_6397334c]::a - throw "No Exception!" - } - catch - { - $_.Exception | Should BeOfType System.TypeInitializationException - $e = $_.Exception.InnerException.InnerException.ErrorRecord - $e.FullyQualifiedErrorId | Should Be InvalidCastFromStringToInteger - $e.InvocationInfo.Line | Should Match 'a = "zz"' - } - } - - It "static member w/o ctor" { - try { - $null = [MSFT_6397334d]::a - throw "No Exception!" - } - catch - { - $_.Exception | Should BeOfType System.TypeInitializationException - $e = $_.Exception.InnerException.InnerException.ErrorRecord - $e.FullyQualifiedErrorId | Should Be InvalidCastFromStringToInteger - $e.InvocationInfo.Line | Should Match 'a = "zz"' - } - } -} +Describe 'Exceptions flow for classes' -Tags "CI" { + + $canaryHashtable = @{} + + $iss = [initialsessionstate]::CreateDefault() + $iss.Variables.Add([System.Management.Automation.Runspaces.SessionStateVariableEntry]::new('canaryHashtable', $canaryHashtable, $null)) + $iss.Commands.Add([System.Management.Automation.Runspaces.SessionStateFunctionEntry]::new('Get-Canary', '$canaryHashtable')) + $ps = [powershell]::Create($iss) + + BeforeEach { + $canaryHashtable.Clear() + $ps.Commands.Clear() + } + + Context 'All calls are inside classes' { + + It 'does not execute statements after instance method with exception' { + + # Put try-catch outside to avoid try-catch logic altering analysis + try { + + $ps.AddScript( @' +class C +{ + [void] m1() + { + $canaryHashtable = Get-Canary + $canaryHashtable['canary'] = 42 + $this.ImThrow() + $canaryHashtable['canary'] = 100 + } + + [void] ImThrow() + { + throw 'I told you' + } +} +[C]::new().m1() +'@).Invoke() + + } catch {} + + $canaryHashtable['canary'] | Should Be 42 + } + + It 'does not execute statements after static method with exception' { + + # Put try-catch outside to avoid try-catch logic altering analysis + try { + + $ps.AddScript( @' +class C +{ + static [void] s1() + { + $canaryHashtable = Get-Canary + $canaryHashtable['canary'] = 43 + [C]::ImThrow() + $canaryHashtable['canary'] = 100 + } + + static [void] ImThrow() + { + 1 / 0 + } +} +[C]::s1() +'@).Invoke() + + } catch {} + + $canaryHashtable['canary'] | Should Be 43 + } + + It 'does not execute statements after instance method with exception and deep stack' { + + # Put try-catch outside to avoid try-catch logic altering analysis + try { + + $ps.AddScript( @' +class C +{ + [void] m1() + { + $canaryHashtable = Get-Canary + $canaryHashtable['canary'] = 1 + $this.m2() + $canaryHashtable['canary'] = -6101 + } + + [void] m2() + { + $canaryHashtable = Get-Canary + $canaryHashtable['canary'] += 10 + $this.m3() + $canaryHashtable['canary'] = -6102 + } + + [void] m3() + { + $canaryHashtable = Get-Canary + $canaryHashtable['canary'] += 100 + $this.m4() + $canaryHashtable['canary'] = -6103 + } + + [void] m4() + { + $canaryHashtable = Get-Canary + $canaryHashtable['canary'] += 1000 + $this.ImThrow() + $canaryHashtable['canary'] = -6104 + } + + [void] ImThrow() + { + $canaryHashtable = Get-Canary + $canaryHashtable['canary'] += 10000 + + 1 / 0 + } +} +[C]::new().m1() +'@).Invoke() + + } catch {} + + $canaryHashtable['canary'] | Should Be 11111 + } + } + + Context 'Class method call PS function' { + + $body = @' +class C +{ + [void] m1() + { + m2 + } + + static [void] s1() + { + s2 + } +} + + +function m2() +{ + $canary = Get-Canary + $canary['canaryM'] = 45 + ImThrow + $canary['canaryM'] = 100 +} + +function s2() +{ + $canary = Get-Canary + $canary['canaryS'] = 46 + CallImThrow + $canary['canaryS'] = 100 +} + +function CallImThrow() +{ + ImThrow +} + +function ImThrow() +{ + 1 / 0 +} + +'@ + + It 'does not execute statements after function with exception called from instance method' { + + # Put try-catch outside to avoid try-catch logic altering analysis + try { + + $ps.AddScript($body).Invoke() + $ps.AddScript('$c = [C]::new(); $c.m1()').Invoke() + + } catch {} + + $canaryHashtable['canaryM'] | Should Be 45 + } + + It 'does not execute statements after function with exception called from static method' { + + # Put try-catch outside to avoid try-catch logic altering analysis + try { + + $ps.AddScript($body).Invoke() + $ps.AddScript('[C]::s1()').Invoke() + + } catch {} + + $canaryHashtable['canaryS'] | Should Be 46 + } + + } + + Context "No class is involved" { + It "functions calls continue execution by default" { + + try { + + $ps.AddScript( @' + +$canaryHashtable = Get-Canary +function foo() { 1 / 0; $canaryHashtable['canary'] += 10 } +$canaryHashtable['canary'] = 1 +foo +$canaryHashtable['canary'] += 100 + +'@).Invoke() + + } catch {} + + $canaryHashtable['canary'] | Should Be 111 + } + } +} + +Describe "Exception error position" -Tags "CI" { + class MSFT_3090412 + { + static f1() { [MSFT_3090412]::bar = 42 } + static f2() { throw "an error in f2" } + static f3() { "".Substring(0, 10) } + static f4() { dir nosuchfile -ea Stop } + } + + It "Setting a property that doesn't exist" { + try { + [MSFT_3090412]::f1() + throw "f1 should have thrown" + } catch { + $_.InvocationInfo.Line | Should Match ([regex]::Escape('[MSFT_3090412]::bar = 42')) + } + } + + It "Throwing an exception" { + try { + [MSFT_3090412]::f2() + throw "f2 should have thrown" + } catch { + $_.InvocationInfo.Line | Should Match ([regex]::Escape('throw "an error in f2"')) + } + } + + It "Calling a .Net method that throws" { + try { + [MSFT_3090412]::f3() + throw "f3 should have thrown" + } catch { + $_.InvocationInfo.Line | Should Match ([regex]::Escape('"".Substring(0, 10)')) + } + } + + It "Terminating error" { + try { + [MSFT_3090412]::f4() + throw "f4 should have thrown" + } catch { + $_.InvocationInfo.Line | Should Match ([regex]::Escape('dir nosuchfile -ea Stop')) + } + } +} + +Describe "Exception from initializer" -Tags "CI" { + class MSFT_6397334a + { + [int]$a = "zz" + MSFT_6397334a() {} + } + + class MSFT_6397334b + { + [int]$a = "zz" + } + + class MSFT_6397334c + { + static [int]$a = "zz" + static MSFT_6397334a() {} + } + + class MSFT_6397334d + { + static [int]$a = "zz" + } + + It "instance member w/ ctor" { + try { + [MSFT_6397334a]::new() + throw "[MSFT_6397334a]::new() should have thrown" + } + catch + { + $e = $_ + $e.FullyQualifiedErrorId | Should Be InvalidCastFromStringToInteger + $e.InvocationInfo.Line | Should Match 'a = "zz"' + } + } + + It "instance member w/o ctor" { + try { + [MSFT_6397334b]::new() + throw "[MSFT_6397334b]::new() should have thrown" + } + catch + { + $e = $_ + $e.FullyQualifiedErrorId | Should Be InvalidCastFromStringToInteger + $e.InvocationInfo.Line | Should Match 'a = "zz"' + } + } + + It "static member w/ ctor" { + try { + $null = [MSFT_6397334c]::a + throw "No Exception!" + } + catch + { + $_.Exception | Should BeOfType System.TypeInitializationException + $e = $_.Exception.InnerException.InnerException.ErrorRecord + $e.FullyQualifiedErrorId | Should Be InvalidCastFromStringToInteger + $e.InvocationInfo.Line | Should Match 'a = "zz"' + } + } + + It "static member w/o ctor" { + try { + $null = [MSFT_6397334d]::a + throw "No Exception!" + } + catch + { + $_.Exception | Should BeOfType System.TypeInitializationException + $e = $_.Exception.InnerException.InnerException.ErrorRecord + $e.FullyQualifiedErrorId | Should Be InvalidCastFromStringToInteger + $e.InvocationInfo.Line | Should Match 'a = "zz"' + } + } +} diff --git a/test/powershell/Language/Classes/Scripting.Classes.MiscOps.Tests.ps1 b/test/powershell/Language/Classes/Scripting.Classes.MiscOps.Tests.ps1 index 5696caed7f6..45162a1dcba 100644 --- a/test/powershell/Language/Classes/Scripting.Classes.MiscOps.Tests.ps1 +++ b/test/powershell/Language/Classes/Scripting.Classes.MiscOps.Tests.ps1 @@ -1,117 +1,117 @@ -Describe 'Misc Test' -Tags "CI" { - - Context 'Where' { - class C1 { - [int[]] $Wheels = @(1,2,3); - [string] Foo() { - return (1..10).Where({ $PSItem -in $this.Wheels; }) -join ';' - } - - [string] Bar() - { - return (1..10 | Where-Object { $PSItem -in $this.Wheels; }) -join ';' - } - } - It 'Invoke Where' { - [C1]::new().Foo() | should be "1;2;3" - } - It 'Pipe to where' { - [C1]::new().Bar() | should be "1;2;3" - } - } - - Context 'ForEach' { - class C1 { - [int[]] $Wheels = @(1,2,3); - [string] Foo() { - $ret="" - Foreach($PSItem in $this.Wheels) { $ret +="$PSItem;"} - return $ret - } - - [string] Bar() - { - $ret = "" - $this.Wheels | ForEach-Object { $ret += "$_;" } - return $ret - } - } - It 'Invoke Foreach' { - [C1]::new().Foo() | should be "1;2;3;" - } - It 'Pipe to Foreach' { - [C1]::new().Bar() | should be "1;2;3;" - } - } - - Context 'Class instantiation' { - Class C1 { - [string] Foo() { - return (Get-TestText) - } - } - - BeforeAll { - $ExpectedTextFromBoundInstance = "Class C1 was defined in this Runspace" - $ExpectedTextFromUnboundInstance = "New Runspace without class C1 defined" - - ## Define 'Get-TestText' in the current Runspace - function Get-TestText { return $ExpectedTextFromBoundInstance } - - $NewRunspaceFunctionDefinitions = @" - ## Define 'Get-TestText' in the new Runspace - function Get-TestText { return '$ExpectedTextFromUnboundInstance' } - - ## Define the function to create an instance of the given type using the default constructor - function New-UnboundInstance([Type]`$type) { `$type::new() } - - ## Define the function to call 'Foo()' on the given C1 instance, and return the result - function Run-Foo(`$C1Instance) { `$C1Instance.Foo() } -"@ - ## Create a new Runspace and define helper functions in it - $powershell = [powershell]::Create() - $powershell.AddScript($NewRunspaceFunctionDefinitions).Invoke() > $null - $powershell.Commands.Clear() - - function InstantiateInNewRunspace([Type]$type) { - try { - $result = $powershell.AddCommand("New-UnboundInstance").AddParameter("type", $type).Invoke() - $result.Count | Should Be 1 > $null - return $result[0] - } finally { - $powershell.Commands.Clear() - } - } - - function RunFooInNewRunspace($instance) { - try { - $result = $powershell.AddCommand("Run-Foo").AddParameter("C1Instance", $instance).Invoke() - $result.Count | Should Be 1 > $null - return $result[0] - } finally { - $powershell.Commands.Clear() - } - } - } - - AfterAll { - $powershell.Dispose() - } - - It "Create instance that is bound to a SessionState" { - $instance = [C1]::new() - ## For a bound class instance, the execution of an instance method is - ## done in the Runspace/SessionState the instance is bound to. - $instance.Foo() | Should Be $ExpectedTextFromBoundInstance - RunFooInNewRunspace $instance | Should Be $ExpectedTextFromBoundInstance - } - - It "Create instance that is NOT bound to a SessionState" { - $instance = InstantiateInNewRunspace ([C1]) - ## For an unbound class instance, the execution of an instance method is done in - ## the Runspace/SessionState where the call to the instance method is made. - $instance.Foo() | Should Be $ExpectedTextFromBoundInstance - RunFooInNewRunspace $instance | Should Be $ExpectedTextFromUnboundInstance - } - } -} +Describe 'Misc Test' -Tags "CI" { + + Context 'Where' { + class C1 { + [int[]] $Wheels = @(1,2,3); + [string] Foo() { + return (1..10).Where({ $PSItem -in $this.Wheels; }) -join ';' + } + + [string] Bar() + { + return (1..10 | Where-Object { $PSItem -in $this.Wheels; }) -join ';' + } + } + It 'Invoke Where' { + [C1]::new().Foo() | should be "1;2;3" + } + It 'Pipe to where' { + [C1]::new().Bar() | should be "1;2;3" + } + } + + Context 'ForEach' { + class C1 { + [int[]] $Wheels = @(1,2,3); + [string] Foo() { + $ret="" + Foreach($PSItem in $this.Wheels) { $ret +="$PSItem;"} + return $ret + } + + [string] Bar() + { + $ret = "" + $this.Wheels | ForEach-Object { $ret += "$_;" } + return $ret + } + } + It 'Invoke Foreach' { + [C1]::new().Foo() | should be "1;2;3;" + } + It 'Pipe to Foreach' { + [C1]::new().Bar() | should be "1;2;3;" + } + } + + Context 'Class instantiation' { + Class C1 { + [string] Foo() { + return (Get-TestText) + } + } + + BeforeAll { + $ExpectedTextFromBoundInstance = "Class C1 was defined in this Runspace" + $ExpectedTextFromUnboundInstance = "New Runspace without class C1 defined" + + ## Define 'Get-TestText' in the current Runspace + function Get-TestText { return $ExpectedTextFromBoundInstance } + + $NewRunspaceFunctionDefinitions = @" + ## Define 'Get-TestText' in the new Runspace + function Get-TestText { return '$ExpectedTextFromUnboundInstance' } + + ## Define the function to create an instance of the given type using the default constructor + function New-UnboundInstance([Type]`$type) { `$type::new() } + + ## Define the function to call 'Foo()' on the given C1 instance, and return the result + function Run-Foo(`$C1Instance) { `$C1Instance.Foo() } +"@ + ## Create a new Runspace and define helper functions in it + $powershell = [powershell]::Create() + $powershell.AddScript($NewRunspaceFunctionDefinitions).Invoke() > $null + $powershell.Commands.Clear() + + function InstantiateInNewRunspace([Type]$type) { + try { + $result = $powershell.AddCommand("New-UnboundInstance").AddParameter("type", $type).Invoke() + $result.Count | Should Be 1 > $null + return $result[0] + } finally { + $powershell.Commands.Clear() + } + } + + function RunFooInNewRunspace($instance) { + try { + $result = $powershell.AddCommand("Run-Foo").AddParameter("C1Instance", $instance).Invoke() + $result.Count | Should Be 1 > $null + return $result[0] + } finally { + $powershell.Commands.Clear() + } + } + } + + AfterAll { + $powershell.Dispose() + } + + It "Create instance that is bound to a SessionState" { + $instance = [C1]::new() + ## For a bound class instance, the execution of an instance method is + ## done in the Runspace/SessionState the instance is bound to. + $instance.Foo() | Should Be $ExpectedTextFromBoundInstance + RunFooInNewRunspace $instance | Should Be $ExpectedTextFromBoundInstance + } + + It "Create instance that is NOT bound to a SessionState" { + $instance = InstantiateInNewRunspace ([C1]) + ## For an unbound class instance, the execution of an instance method is done in + ## the Runspace/SessionState where the call to the instance method is made. + $instance.Foo() | Should Be $ExpectedTextFromBoundInstance + RunFooInNewRunspace $instance | Should Be $ExpectedTextFromUnboundInstance + } + } +} diff --git a/test/powershell/Language/Classes/Scripting.Classes.Modules.Tests.ps1 b/test/powershell/Language/Classes/Scripting.Classes.Modules.Tests.ps1 index 3f657e78c5a..c25cb49c5c6 100644 --- a/test/powershell/Language/Classes/Scripting.Classes.Modules.Tests.ps1 +++ b/test/powershell/Language/Classes/Scripting.Classes.Modules.Tests.ps1 @@ -1,113 +1,113 @@ -Describe 'PSModuleInfo.GetExportedTypeDefinitions()' -Tags "CI" { - It "doesn't throw for any module" { - $discard = Get-Module -ListAvailable | ForEach-Object { $_.GetExportedTypeDefinitions() } - $true | Should Be $true # we only verify that we didn't throw. This line contains a dummy Should to make pester happy. - } -} - -Describe 'use of a module from two runspaces' -Tags "CI" { - function New-TestModule { - param( - [string]$Name, - [string]$Content - ) - - $TestModulePath = Join-Path -Path $TestDrive -ChildPath "TestModule" - $ModuleFolder = Join-Path -Path $TestModulePath -ChildPath $Name - New-Item -Path $ModuleFolder -ItemType Directory -Force > $null - - Set-Content -Path "$ModuleFolder\$Name.psm1" -Value $Content - - $manifestParams = @{ - Path = "$ModuleFolder\$Name.psd1" - RootModule = "$Name.psm1" - } - New-ModuleManifest @manifestParams - - if ($env:PSModulePath -notlike "*$TestModulePath*") { - $env:PSModulePath += "$([System.IO.Path]::PathSeparator)$TestModulePath" - } - } - - $originalPSModulePath = $env:PSModulePath - try { - - New-TestModule -Name 'Random' -Content @' -$script:random = Get-Random -class RandomWrapper -{ - [int] getRandom() - { - return $script:random - } -} -'@ - - It 'use different sessionStates for different modules' { - $ps = 1..2 | ForEach-Object { $p = [powershell]::Create().AddScript(@' -Import-Module Random -'@) - $p.Invoke() > $null - $p - } - $res = 1..2 | ForEach-Object { - 0..1 | ForEach-Object { - $ps[$_].Commands.Clear() - # The idea: instance created inside the context, in one runspace. - # Method is called on instance in the different runspace, but it should know about the origin. - $w = $ps[$_].AddScript('& (Get-Module Random) { [RandomWrapper]::new() }').Invoke()[0] - $w.getRandom() - } - } - - $res.Count | Should Be 4 - $res[0] | Should Not Be $res[1] - $res[0] | Should Be $res[2] - $res[1] | Should Be $res[3] - } - - } finally { - $env:PSModulePath = $originalPSModulePath - } - -} - -Describe 'Module reloading with Class definition' -Tags "CI" { - - BeforeAll { - Set-Content -Path TestDrive:\TestModule.psm1 -Value @' -$passedArgs = $args -class Root { $passedIn = $passedArgs } -function Get-PassedArgsRoot { [Root]::new().passedIn } -function Get-PassedArgsNoRoot { $passedArgs } -'@ - $Arg_Hello = 'Hello' - $Arg_World = 'World' - } - - AfterEach { - Remove-Module TestModule -Force -ErrorAction SilentlyContinue - } - - It "Class execution reflects changes in module reloading with '-Force'" { - Import-Module TestDrive:\TestModule.psm1 -ArgumentList $Arg_Hello - Get-PassedArgsRoot | Should Be $Arg_Hello - Get-PassedArgsNoRoot | Should Be $Arg_Hello - - Import-Module TestDrive:\TestModule.psm1 -ArgumentList $Arg_World -Force - Get-PassedArgsRoot | Should Be $Arg_World - Get-PassedArgsNoRoot | Should Be $Arg_World - } - - It "Class execution reflects changes in module reloading with 'Remove-Module' and 'Import-Module'" { - Import-Module TestDrive:\TestModule.psm1 -ArgumentList $Arg_Hello - Get-PassedArgsRoot | Should Be $Arg_Hello - Get-PassedArgsNoRoot | Should Be $Arg_Hello - - Remove-Module TestModule - - Import-Module TestDrive:\TestModule.psm1 -ArgumentList $Arg_World - Get-PassedArgsRoot | Should Be $Arg_World - Get-PassedArgsNoRoot | Should Be $Arg_World - } -} +Describe 'PSModuleInfo.GetExportedTypeDefinitions()' -Tags "CI" { + It "doesn't throw for any module" { + $discard = Get-Module -ListAvailable | ForEach-Object { $_.GetExportedTypeDefinitions() } + $true | Should Be $true # we only verify that we didn't throw. This line contains a dummy Should to make pester happy. + } +} + +Describe 'use of a module from two runspaces' -Tags "CI" { + function New-TestModule { + param( + [string]$Name, + [string]$Content + ) + + $TestModulePath = Join-Path -Path $TestDrive -ChildPath "TestModule" + $ModuleFolder = Join-Path -Path $TestModulePath -ChildPath $Name + New-Item -Path $ModuleFolder -ItemType Directory -Force > $null + + Set-Content -Path "$ModuleFolder\$Name.psm1" -Value $Content + + $manifestParams = @{ + Path = "$ModuleFolder\$Name.psd1" + RootModule = "$Name.psm1" + } + New-ModuleManifest @manifestParams + + if ($env:PSModulePath -notlike "*$TestModulePath*") { + $env:PSModulePath += "$([System.IO.Path]::PathSeparator)$TestModulePath" + } + } + + $originalPSModulePath = $env:PSModulePath + try { + + New-TestModule -Name 'Random' -Content @' +$script:random = Get-Random +class RandomWrapper +{ + [int] getRandom() + { + return $script:random + } +} +'@ + + It 'use different sessionStates for different modules' { + $ps = 1..2 | ForEach-Object { $p = [powershell]::Create().AddScript(@' +Import-Module Random +'@) + $p.Invoke() > $null + $p + } + $res = 1..2 | ForEach-Object { + 0..1 | ForEach-Object { + $ps[$_].Commands.Clear() + # The idea: instance created inside the context, in one runspace. + # Method is called on instance in the different runspace, but it should know about the origin. + $w = $ps[$_].AddScript('& (Get-Module Random) { [RandomWrapper]::new() }').Invoke()[0] + $w.getRandom() + } + } + + $res.Count | Should Be 4 + $res[0] | Should Not Be $res[1] + $res[0] | Should Be $res[2] + $res[1] | Should Be $res[3] + } + + } finally { + $env:PSModulePath = $originalPSModulePath + } + +} + +Describe 'Module reloading with Class definition' -Tags "CI" { + + BeforeAll { + Set-Content -Path TestDrive:\TestModule.psm1 -Value @' +$passedArgs = $args +class Root { $passedIn = $passedArgs } +function Get-PassedArgsRoot { [Root]::new().passedIn } +function Get-PassedArgsNoRoot { $passedArgs } +'@ + $Arg_Hello = 'Hello' + $Arg_World = 'World' + } + + AfterEach { + Remove-Module TestModule -Force -ErrorAction SilentlyContinue + } + + It "Class execution reflects changes in module reloading with '-Force'" { + Import-Module TestDrive:\TestModule.psm1 -ArgumentList $Arg_Hello + Get-PassedArgsRoot | Should Be $Arg_Hello + Get-PassedArgsNoRoot | Should Be $Arg_Hello + + Import-Module TestDrive:\TestModule.psm1 -ArgumentList $Arg_World -Force + Get-PassedArgsRoot | Should Be $Arg_World + Get-PassedArgsNoRoot | Should Be $Arg_World + } + + It "Class execution reflects changes in module reloading with 'Remove-Module' and 'Import-Module'" { + Import-Module TestDrive:\TestModule.psm1 -ArgumentList $Arg_Hello + Get-PassedArgsRoot | Should Be $Arg_Hello + Get-PassedArgsNoRoot | Should Be $Arg_Hello + + Remove-Module TestModule + + Import-Module TestDrive:\TestModule.psm1 -ArgumentList $Arg_World + Get-PassedArgsRoot | Should Be $Arg_World + Get-PassedArgsNoRoot | Should Be $Arg_World + } +} diff --git a/test/powershell/Language/Classes/scripting.Classes.NestedModules.tests.ps1 b/test/powershell/Language/Classes/scripting.Classes.NestedModules.tests.ps1 index 307e6b85530..f16a39db1c9 100644 --- a/test/powershell/Language/Classes/scripting.Classes.NestedModules.tests.ps1 +++ b/test/powershell/Language/Classes/scripting.Classes.NestedModules.tests.ps1 @@ -1,124 +1,124 @@ -Describe 'NestedModules' -Tags "CI" { - - function New-TestModule { - param( - [string]$Name, - [string]$Content, - [string[]]$NestedContents - ) - - new-item -type directory -Force "TestDrive:\$Name" > $null - $manifestParams = @{ - Path = "TestDrive:\$Name\$Name.psd1" - } - - if ($Content) { - Set-Content -Path "${TestDrive}\$Name\$Name.psm1" -Value $Content - $manifestParams['RootModule'] = "$Name.psm1" - } - - if ($NestedContents) { - $manifestParams['NestedModules'] = 1..$NestedContents.Count | ForEach-Object { - $null = new-item -type directory TestDrive:\$Name\Nested$_ - $null = Set-Content -Path "${TestDrive}\$Name\Nested$_\Nested$_.psm1" -Value $NestedContents[$_ - 1] - "Nested$_" - } - } - - New-ModuleManifest @manifestParams - - $resolvedTestDrivePath = Split-Path ((get-childitem TestDrive:\)[0].FullName) - if (-not ($env:PSModulePath -like "*$resolvedTestDrivePath*")) { - $env:PSModulePath += "$([System.IO.Path]::PathSeparator)$resolvedTestDrivePath" - } - } - - $originalPSModulePath = $env:PSModulePath - - try { - - - # Create modules in TestDrive:\ - New-TestModule -Name NoRoot -NestedContents @( - 'class A { [string] foo() { return "A1"} }', - 'class A { [string] foo() { return "A2"} }' - ) - - New-TestModule -Name WithRoot -NestedContents @( - 'class A { [string] foo() { return "A1"} }', - 'class A { [string] foo() { return "A2"} }' - ) -Content 'class A { [string] foo() { return "A0"} }' - - New-TestModule -Name ABC -NestedContents @( - 'class A { [string] foo() { return "A"} }', - 'class B { [string] foo() { return "B"} }' - ) -Content 'class C { [string] foo() { return "C"} }' - - It 'Get-Module is able to find types' { - $module = Get-Module NoRoot -ListAvailable - $module.GetExportedTypeDefinitions().Count | Should Be 1 - - $module = Get-Module WithRoot -ListAvailable - $module.GetExportedTypeDefinitions().Count | Should Be 1 - - $module = Get-Module ABC -ListAvailable - $module.GetExportedTypeDefinitions().Count | Should Be 3 - } - - It 'Import-Module pick the right type' { - $module = Import-Module ABC -PassThru - $module.GetExportedTypeDefinitions().Count | Should Be 3 - $module = Import-Module ABC -PassThru -Force - $module.GetExportedTypeDefinitions().Count | Should Be 3 - - $module = Import-Module NoRoot -PassThru - $module.GetExportedTypeDefinitions().Count | Should Be 1 - $module = Import-Module NoRoot -PassThru -Force - $module.GetExportedTypeDefinitions().Count | Should Be 1 - [scriptblock]::Create(@' -using module NoRoot -[A]::new().foo() -'@ -).Invoke() | Should Be A2 - - $module = Import-Module WithRoot -PassThru - $module.GetExportedTypeDefinitions().Count | Should Be 1 - $module = Import-Module WithRoot -PassThru -Force - $module.GetExportedTypeDefinitions().Count | Should Be 1 - [scriptblock]::Create(@' -using module WithRoot -[A]::new().foo() -'@ -).Invoke() | Should Be A0 - } - - Context 'execute type creation in the module context' { - - # let's define types to make it more fun - class A { [string] foo() { return "local"} } - class B { [string] foo() { return "local"} } - class C { [string] foo() { return "local"} } - - # We need to think about it: should it work or not. - # Currently, types are resolved in compile-time to the 'local' versions - # So at runtime we don't call the module versions. - It 'Can execute type creation in the module context with new()' -pending { - & (Get-Module ABC) { [C]::new().foo() } | Should Be C - & (Get-Module NoRoot) { [A]::new().foo() } | Should Be A2 - & (Get-Module WithRoot) { [A]::new().foo() } | Should Be A0 - & (Get-Module ABC) { [A]::new().foo() } | Should Be A - } - - It 'Can execute type creation in the module context with New-Object' { - & (Get-Module ABC) { (New-Object C).foo() } | Should Be C - & (Get-Module NoRoot) { (New-Object A).foo() } | Should Be A2 - & (Get-Module WithRoot) { (New-Object A).foo() } | Should Be A0 - & (Get-Module ABC) { (New-Object A).foo() } | Should Be A - } - } - - } finally { - $env:PSModulePath = $originalPSModulePath - Get-Module @('ABC', 'NoRoot', 'WithRoot') | Remove-Module - } -} +Describe 'NestedModules' -Tags "CI" { + + function New-TestModule { + param( + [string]$Name, + [string]$Content, + [string[]]$NestedContents + ) + + new-item -type directory -Force "TestDrive:\$Name" > $null + $manifestParams = @{ + Path = "TestDrive:\$Name\$Name.psd1" + } + + if ($Content) { + Set-Content -Path "${TestDrive}\$Name\$Name.psm1" -Value $Content + $manifestParams['RootModule'] = "$Name.psm1" + } + + if ($NestedContents) { + $manifestParams['NestedModules'] = 1..$NestedContents.Count | ForEach-Object { + $null = new-item -type directory TestDrive:\$Name\Nested$_ + $null = Set-Content -Path "${TestDrive}\$Name\Nested$_\Nested$_.psm1" -Value $NestedContents[$_ - 1] + "Nested$_" + } + } + + New-ModuleManifest @manifestParams + + $resolvedTestDrivePath = Split-Path ((get-childitem TestDrive:\)[0].FullName) + if (-not ($env:PSModulePath -like "*$resolvedTestDrivePath*")) { + $env:PSModulePath += "$([System.IO.Path]::PathSeparator)$resolvedTestDrivePath" + } + } + + $originalPSModulePath = $env:PSModulePath + + try { + + + # Create modules in TestDrive:\ + New-TestModule -Name NoRoot -NestedContents @( + 'class A { [string] foo() { return "A1"} }', + 'class A { [string] foo() { return "A2"} }' + ) + + New-TestModule -Name WithRoot -NestedContents @( + 'class A { [string] foo() { return "A1"} }', + 'class A { [string] foo() { return "A2"} }' + ) -Content 'class A { [string] foo() { return "A0"} }' + + New-TestModule -Name ABC -NestedContents @( + 'class A { [string] foo() { return "A"} }', + 'class B { [string] foo() { return "B"} }' + ) -Content 'class C { [string] foo() { return "C"} }' + + It 'Get-Module is able to find types' { + $module = Get-Module NoRoot -ListAvailable + $module.GetExportedTypeDefinitions().Count | Should Be 1 + + $module = Get-Module WithRoot -ListAvailable + $module.GetExportedTypeDefinitions().Count | Should Be 1 + + $module = Get-Module ABC -ListAvailable + $module.GetExportedTypeDefinitions().Count | Should Be 3 + } + + It 'Import-Module pick the right type' { + $module = Import-Module ABC -PassThru + $module.GetExportedTypeDefinitions().Count | Should Be 3 + $module = Import-Module ABC -PassThru -Force + $module.GetExportedTypeDefinitions().Count | Should Be 3 + + $module = Import-Module NoRoot -PassThru + $module.GetExportedTypeDefinitions().Count | Should Be 1 + $module = Import-Module NoRoot -PassThru -Force + $module.GetExportedTypeDefinitions().Count | Should Be 1 + [scriptblock]::Create(@' +using module NoRoot +[A]::new().foo() +'@ +).Invoke() | Should Be A2 + + $module = Import-Module WithRoot -PassThru + $module.GetExportedTypeDefinitions().Count | Should Be 1 + $module = Import-Module WithRoot -PassThru -Force + $module.GetExportedTypeDefinitions().Count | Should Be 1 + [scriptblock]::Create(@' +using module WithRoot +[A]::new().foo() +'@ +).Invoke() | Should Be A0 + } + + Context 'execute type creation in the module context' { + + # let's define types to make it more fun + class A { [string] foo() { return "local"} } + class B { [string] foo() { return "local"} } + class C { [string] foo() { return "local"} } + + # We need to think about it: should it work or not. + # Currently, types are resolved in compile-time to the 'local' versions + # So at runtime we don't call the module versions. + It 'Can execute type creation in the module context with new()' -pending { + & (Get-Module ABC) { [C]::new().foo() } | Should Be C + & (Get-Module NoRoot) { [A]::new().foo() } | Should Be A2 + & (Get-Module WithRoot) { [A]::new().foo() } | Should Be A0 + & (Get-Module ABC) { [A]::new().foo() } | Should Be A + } + + It 'Can execute type creation in the module context with New-Object' { + & (Get-Module ABC) { (New-Object C).foo() } | Should Be C + & (Get-Module NoRoot) { (New-Object A).foo() } | Should Be A2 + & (Get-Module WithRoot) { (New-Object A).foo() } | Should Be A0 + & (Get-Module ABC) { (New-Object A).foo() } | Should Be A + } + } + + } finally { + $env:PSModulePath = $originalPSModulePath + Get-Module @('ABC', 'NoRoot', 'WithRoot') | Remove-Module + } +} diff --git a/test/powershell/Language/Classes/scripting.Classes.inheritance.tests.ps1 b/test/powershell/Language/Classes/scripting.Classes.inheritance.tests.ps1 index 2c951cb3ba3..d69d7501e11 100644 --- a/test/powershell/Language/Classes/scripting.Classes.inheritance.tests.ps1 +++ b/test/powershell/Language/Classes/scripting.Classes.inheritance.tests.ps1 @@ -1,545 +1,545 @@ -# -# Copyright (c) Microsoft Corporation, 2015 -# - -try { -# -# CrossGen'ed assemblies cause a hang to happen intermittently when running this test suite in Linux and OSX. -# The issue has been reported to CoreCLR team. We need to work around it for now with the following approach: -# 1. For pull request and push commit, build without '-CrossGen' and run the parsing tests -# 2. For daily build, build with '-CrossGen' but don't run the parsing tests -# In this way, we will continue to exercise these parsing tests for each CI build, and skip them for daily -# build to avoid a hang. -# Note: this change should be reverted once the 'CrossGen' issue is fixed by CoreCLR. The issue is tracked by -# https://github.com/dotnet/coreclr/issues/9745 -# -$isDailyBuild = $env:TRAVIS_EVENT_TYPE -eq 'cron' -or $env:TRAVIS_EVENT_TYPE -eq 'api' -$defaultParamValues = $PSdefaultParameterValues.Clone() -$IsSkipped = (!$IsWindows -and $isDailyBuild) -$PSDefaultParameterValues["it:skip"] = $IsSkipped -$PSDefaultParameterValues["ShouldBeParseError:SkipInTravisFullBuild"] = $IsSkipped - - -Describe 'Classes inheritance syntax' -Tags "CI" { - - It 'Base types' { - class C1 {} - class C2a : C1 {} - class C2b:C1 {} - - [C2a]::new().GetType().BaseType.Name | Should Be "C1" - [C2b].BaseType.Name | Should Be "C1" - } - - It 'inheritance from abstract base class with no abstract methods and protected ctor' { - class C3 : system.collections.collectionbase {} - - class C4 { C4([int]$a) {} } - class C5 : C4 { C5() : base(1) {} } - } - - It 'inheritance from base class with implicit ctor' { - class C6 {} - class C7 : C6 { C7() : base() {} } - } - - It 'inheritance syntax allows newlines in various places' { - class C {} - class C2a:C,system.IDisposable{ [void] Dispose() { }} - class C2b - : - C - , - system.IDisposable - { - [void] Dispose() {} - C2b() - : # there are extra spaces here - base - ( - ) - { - } - } - - [C2a].GetInterface("System.IDisposable") | Should Not Be $null - [C2b].GetInterface("System.IDisposable") | Should Not Be $null - } - - It 'can subclass .NET type' { - class MyIntList : system.collections.generic.list[int] {} - [MyIntList]::new().GetType().BaseType.FullName.StartsWith('System.Collections.Generic.List') | Should Be $true - } - - It 'can implement .NET interface' { - class MyComparable : system.IComparable - { - [int] CompareTo([object] $obj) - { - return 0; - } - } - [MyComparable].GetInterface("System.IComparable") | Should Not Be $null - } - - It 'allows use of defined later type as a property type' { - class A { static [B]$b } - class B : A {} - [A]::b = [B]::new() - try { - [A]::b = "bla" - throw "No Exception!" - } catch { - $_.Exception | Should BeOfType 'System.Management.Automation.SetValueInvocationException' - } - } -} - -Describe 'Classes inheritance syntax errors' -Tags "CI" { - ShouldBeParseError "class A : NonExistingClass {}" TypeNotFound 10 - ShouldBeParseError "class A : {}" TypeNameExpected 9 - ShouldBeParseError "class A {}; class B : A, {}" TypeNameExpected 24 - ShouldBeParseError "class A{} ; class B : A[] {}" SubtypeArray 22 -SkipAndCheckRuntimeError - ShouldBeParseError "class A : System.Collections.Generic.List``1 {}" SubtypeUnclosedGeneric 10 -SkipAndCheckRuntimeError - - ShouldBeParseError "class A {}; class B : A, NonExistingInterface {}" TypeNotFound 25 - ShouldBeParseError "class A {} ; class B {}; class C : A, B {}" InterfaceNameExpected 38 -SkipAndCheckRuntimeError - ShouldBeParseError "class A{} ; class B : A, System.IDisposable[] {}" SubtypeArray 25 -SkipAndCheckRuntimeError - ShouldBeParseError "class A {}; class B : A, NonExistingInterface {}" TypeNotFound 25 - - # base should be accepted only on instance ctors - ShouldBeParseError 'class A { A($a){} } ; class B : A { foo() : base(1) {} }' MissingFunctionBody 41 - ShouldBeParseError 'class A { static A() {} }; class B { static B() : base() {} }' MissingFunctionBody 47 - - # Incomplete input - ShouldBeParseError 'class A { A($a){} } ; class B : A { B() : bas {} }' MissingBaseCtorCall 41 - ShouldBeParseError 'class A { A($a){} } ; class B : A { B() : base( {} }' @('MissingEndParenthesisInMethodCall', 'MissingFunctionBody') @(50, 39) - ShouldBeParseError 'class A { A($a){} } ; class B : A { B() : base {} }' @('MissingMethodParameterList', 'UnexpectedToken') @(46, 50) - - # Sealed base - ShouldBeParseError "class baz : string {}" SealedBaseClass 12 -SkipAndCheckRuntimeError - # Non-existing Interface - ShouldBeParseError "class bar {}; class baz : bar, Non.Existing.Interface {}" TypeNotFound 31 -SkipAndCheckRuntimeError - - # .NET abstract method not implemented - ShouldBeParseError "class MyType : Type {}" TypeCreationError 0 -SkipAndCheckRuntimeError - - # inheritance doesn't allow non linear order - ShouldBeParseError "class A : B {}; class B {}" TypeNotFound 10 -SkipAndCheckRuntimeError - - # inheritance doesn't allow circular order - ShouldBeParseError "class A : B {}; class B : A {}" TypeNotFound 10 -SkipAndCheckRuntimeError - ShouldBeParseError "class A : C {}; class B : A {}; class C : B {}" TypeNotFound 10 -SkipAndCheckRuntimeError -} - -Describe 'Classes methods with inheritance' -Tags "CI" { - - Context 'Method calls' { - - It 'can call instance method on base class' { - class bar - { - [int]foo() {return 100500} - } - class baz : bar {} - [baz]::new().foo() | Should Be 100500 - } - - It 'can call static method on base class' { - class bar - { - static [int]foo() {return 100500} - } - class baz : bar {} - [baz]::foo() | Should Be 100500 - } - - It 'can access static and instance base class property' { - class A - { - static [int]$si - [int]$i - } - class B : A - { - [void]foo() - { - $this::si = 1001 - $this.i = 1003 - } - } - $b = [B]::new() - $b.foo() - [A]::si | Should Be 1001 - ($b.i) | Should Be 1003 - } - - It 'works with .NET types' { - class MyIntList : system.collections.generic.list[int] {} - $intList = [MyIntList]::new() - $intList.Add(100501) - $intList.Add(100502) - $intList.Count | Should Be 2 - $intList[0] | Should Be 100501 - $intList[1] | Should Be 100502 - } - - It 'overrides instance method' { - class bar - { - [int]foo() {return 100500} - } - class baz : bar - { - [int]foo() {return 200600} - } - [baz]::new().foo() | Should Be 200600 - } - - It 'allows base class method call and doesn''t fall into recursion' { - class bar - { - [int]foo() {return 1001} - } - class baz : bar - { - [int] $fooCallCounter - [int]foo() - { - if ($this.fooCallCounter++ -gt 0) - { - throw "Recursion happens" - } - return 3 * ([bar]$this).foo() - } - } - - $res = [baz]::new().foo() - $res | Should Be 3003 - } - - It 'case insensitive for base class method calls' { - class bar - { - [int]foo() {return 1001} - } - class baz : bar - { - [int] $fooCallCounter - [int]fOo() - { - if ($this.fooCallCounter++ -gt 0) - { - throw "Recursion happens" - } - return ([bAr]$this).fOo() + ([bAr]$this).FOO() - } - } - - $res = [baz]::new().foo() - $res | Should Be 2002 - } - - It 'allows any call from the inheritance hierarchy' { - class A - { - [string]GetName() {return "A"} - } - class B : A - { - [string]GetName() {return "B"} - } - class C : B - { - [string]GetName() {return "C"} - } - class D : C - { - [string]GetName() {return "D"} - } - $d = [D]::new() - - ([A]$d).GetName() | Should Be "A" - ([B]$d).GetName() | Should Be "B" - ([C]$d).GetName() | Should Be "C" - ([D]$d).GetName() | Should Be "D" - $d.GetName() | Should Be "D" - } - - It 'can call base method with params' { - class A - { - [string]ToStr([int]$a) {return "A" + $a} - } - class B : A - { - [string]ToStr([int]$a) {return "B" + $a} - } - $b = [B]::new() - ([A]$b).ToStr(101) | Should Be "A101" - $b.ToStr(100) | Should Be "B100" - } - - It 'can call base method with many params' { - class A - { - [string]ToStr([int]$a1, [int]$a2, [int]$a3, [int]$a4, [int]$a5, [int]$a6, [int]$a7, [int]$a8, [int]$a9, [int]$a10, [int]$a11, [int]$a12, [int]$a13, [int]$a14) - { - return "A" - } - - [void]Noop([int]$a1, [int]$a2, [int]$a3, [int]$a4, [int]$a5, [int]$a6, [int]$a7, [int]$a8, [int]$a9, [int]$a10, [int]$a11, [int]$a12, [int]$a13, [int]$a14) - { - } - } - class B : A - { - [string]ToStr([int]$a1, [int]$a2, [int]$a3, [int]$a4, [int]$a5, [int]$a6, [int]$a7, [int]$a8, [int]$a9, [int]$a10, [int]$a11, [int]$a12, [int]$a13, [int]$a14) - { - return "B" - } - - [void]Noop([int]$a1, [int]$a2, [int]$a3, [int]$a4, [int]$a5, [int]$a6, [int]$a7, [int]$a8, [int]$a9, [int]$a10, [int]$a11, [int]$a12, [int]$a13, [int]$a14) - { - } - } - $b = [B]::new() - - # we don't really care about methods results, we only checks that calls doesn't throw - - # 14 args is a limit - $b.ToStr(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) | Should Be 'B' - ([A]$b).ToStr(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) | Should Be 'A' - - # 14 args is a limit - $b.Noop(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) - ([A]$b).Noop(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) - } - - It 'overrides void method call' { - $script:voidOverrideVar = $null - class A - { - [void]SetStr([int]$a) {$script:voidOverrideVar = "A" + $a} - [void]SetStr() {$script:voidOverrideVar = "A"} - } - class B : A - { - [void]SetStr([int]$a) {$script:voidOverrideVar = "B" + $a} - [void]SetStr() {$script:voidOverrideVar = "B"} - } - $b = [B]::new() - ([A]$b).SetStr(101) - $script:voidOverrideVar | Should Be "A101" - $b.SetStr(100) - $script:voidOverrideVar | Should Be "B100" - ([A]$b).SetStr() - $script:voidOverrideVar | Should Be "A" - $b.SetStr() - $script:voidOverrideVar | Should Be "B" - } - - It 'hides final .NET method' { - class MyIntList : system.collections.generic.list[int] - { - # Add is final, can we hide it? - [void] Add([int]$arg) - { - ([system.collections.generic.list[int]]$this).Add($arg * 2) - } - } - - $intList = [MyIntList]::new() - $intList.Add(100201) - $intList.Count | Should Be 1 - $intList[0] | Should Be 200402 - } - } - - Context 'base static method call' { - class A - { - static [string]ToStr([int]$a) {return "A" + $a} - } - class B : A - { - static [string]ToStr([int]$a) {return "B" + $a} - } - - $b = [B]::new() - - # MSFT:1911652 - # MSFT:2973835 - It 'doesn''t affect static method call on type' -Skip { - ([A]$b)::ToStr(101) | Should Be "A101" - } - - It 'overrides static method call on instance' { - $b::ToStr(100) | Should Be "B100" - } - } -} - - -Describe 'Classes inheritance ctors syntax errors' -Tags "CI" { - - #DotNet.Interface.NotImplemented - ShouldBeParseError "class MyComparable : system.IComparable {}" TypeCreationError 0 -SkipAndCheckRuntimeError - - #DotNet.Interface.WrongSignature - ShouldBeParseError 'class MyComparable : system.IComparable { [void] CompareTo([object]$obj) {} }' TypeCreationError 0 -SkipAndCheckRuntimeError - - #DotNet.NoDefaultCtor - ShouldBeParseError "class MyCollection : System.Collections.ObjectModel.ReadOnlyCollection[int] {}" BaseClassNoDefaultCtor 0 -SkipAndCheckRuntimeError - - #NoDefaultCtor - ShouldBeParseError 'class A { A([int]$a) {} }; class B : A {}' BaseClassNoDefaultCtor 27 -SkipAndCheckRuntimeError -} - -Describe 'Classes inheritance ctors' -Tags "CI" { - - It 'can call base ctor' { - class A { - [int]$a - A([int]$a) - { - $this.a = $a - } - } - - class B : A - { - B([int]$a) : base($a * 2) {} - } - - $b = [B]::new(101) - $b.a | Should Be 202 - } - - # TODO: can we detect it in the parse time? - It 'cannot call base ctor with the wrong number of parameters' { - class A { - [int]$a - A([int]$a) - { - $this.a = $a - } - } - - class B : A - { - B([int]$a) : base($a * 2, 100) {} - } - - try { - [B]::new(101) - throw "No Exception!" - } catch { - $_.Exception | Should BeOfType "System.Management.Automation.MethodException" - } - } - - It 'call default base ctor implicitly' { - class A { - [int]$a - A() - { - $this.a = 1007 - } - } - - class B : A - { - B() {} - } - - class C : A - { - } - - $b = [B]::new() - $c = [C]::new() - $b.a | Should Be 1007 - $c.a | Should Be 1007 - } - - It 'doesn''t allow base ctor as an explicit method call' { - $o = [object]::new() - try { - # we should not allow direct .ctor call. - $o.{.ctor}() - } catch { - $_.FullyQualifiedErrorId | Should Be MethodNotFound - return - } - # Fail - '' | Should Be "Exception expected" - } - - It 'allow use conversion [string -> int] in base ctor call' { - class A { - [int]$a - A([int]$a) - { - $this.a = $a - } - } - - class B : A - { - B() : base("103") {} - } - - $b = [B]::new() - $b.a | Should Be 103 - } - - It 'resolves ctor call based on argument type' { - class A { - [int]$i - [string]$s - A([int]$a) - { - $this.i = $a - } - A([string]$a) - { - $this.s = $a - } - } - - class B : A - { - B($a) : base($a) {} - } - - $b1 = [B]::new("foo") - $b2 = [B]::new(1001) - $b1.s | Should Be "foo" - $b2.i | Should Be 1001 - } -} - -Describe 'Type creation' -Tags "CI" { - It 'can call super-class methods sequentially' { - $sb = [scriptblock]::Create(@' -class Base -{ - [int] foo() { return 100 } -} - -class Derived : Base -{ - [int] foo() { return 2 * ([Base]$this).foo() } -} - -[Derived]::new().foo() -'@) - $sb.Invoke() | Should Be 200 - $sb.Invoke() | Should Be 200 - } -} - -} finally { - $global:PSdefaultParameterValues = $defaultParamValues -} +# +# Copyright (c) Microsoft Corporation, 2015 +# + +try { +# +# CrossGen'ed assemblies cause a hang to happen intermittently when running this test suite in Linux and OSX. +# The issue has been reported to CoreCLR team. We need to work around it for now with the following approach: +# 1. For pull request and push commit, build without '-CrossGen' and run the parsing tests +# 2. For daily build, build with '-CrossGen' but don't run the parsing tests +# In this way, we will continue to exercise these parsing tests for each CI build, and skip them for daily +# build to avoid a hang. +# Note: this change should be reverted once the 'CrossGen' issue is fixed by CoreCLR. The issue is tracked by +# https://github.com/dotnet/coreclr/issues/9745 +# +$isDailyBuild = $env:TRAVIS_EVENT_TYPE -eq 'cron' -or $env:TRAVIS_EVENT_TYPE -eq 'api' +$defaultParamValues = $PSdefaultParameterValues.Clone() +$IsSkipped = (!$IsWindows -and $isDailyBuild) +$PSDefaultParameterValues["it:skip"] = $IsSkipped +$PSDefaultParameterValues["ShouldBeParseError:SkipInTravisFullBuild"] = $IsSkipped + + +Describe 'Classes inheritance syntax' -Tags "CI" { + + It 'Base types' { + class C1 {} + class C2a : C1 {} + class C2b:C1 {} + + [C2a]::new().GetType().BaseType.Name | Should Be "C1" + [C2b].BaseType.Name | Should Be "C1" + } + + It 'inheritance from abstract base class with no abstract methods and protected ctor' { + class C3 : system.collections.collectionbase {} + + class C4 { C4([int]$a) {} } + class C5 : C4 { C5() : base(1) {} } + } + + It 'inheritance from base class with implicit ctor' { + class C6 {} + class C7 : C6 { C7() : base() {} } + } + + It 'inheritance syntax allows newlines in various places' { + class C {} + class C2a:C,system.IDisposable{ [void] Dispose() { }} + class C2b + : + C + , + system.IDisposable + { + [void] Dispose() {} + C2b() + : # there are extra spaces here + base + ( + ) + { + } + } + + [C2a].GetInterface("System.IDisposable") | Should Not Be $null + [C2b].GetInterface("System.IDisposable") | Should Not Be $null + } + + It 'can subclass .NET type' { + class MyIntList : system.collections.generic.list[int] {} + [MyIntList]::new().GetType().BaseType.FullName.StartsWith('System.Collections.Generic.List') | Should Be $true + } + + It 'can implement .NET interface' { + class MyComparable : system.IComparable + { + [int] CompareTo([object] $obj) + { + return 0; + } + } + [MyComparable].GetInterface("System.IComparable") | Should Not Be $null + } + + It 'allows use of defined later type as a property type' { + class A { static [B]$b } + class B : A {} + [A]::b = [B]::new() + try { + [A]::b = "bla" + throw "No Exception!" + } catch { + $_.Exception | Should BeOfType 'System.Management.Automation.SetValueInvocationException' + } + } +} + +Describe 'Classes inheritance syntax errors' -Tags "CI" { + ShouldBeParseError "class A : NonExistingClass {}" TypeNotFound 10 + ShouldBeParseError "class A : {}" TypeNameExpected 9 + ShouldBeParseError "class A {}; class B : A, {}" TypeNameExpected 24 + ShouldBeParseError "class A{} ; class B : A[] {}" SubtypeArray 22 -SkipAndCheckRuntimeError + ShouldBeParseError "class A : System.Collections.Generic.List``1 {}" SubtypeUnclosedGeneric 10 -SkipAndCheckRuntimeError + + ShouldBeParseError "class A {}; class B : A, NonExistingInterface {}" TypeNotFound 25 + ShouldBeParseError "class A {} ; class B {}; class C : A, B {}" InterfaceNameExpected 38 -SkipAndCheckRuntimeError + ShouldBeParseError "class A{} ; class B : A, System.IDisposable[] {}" SubtypeArray 25 -SkipAndCheckRuntimeError + ShouldBeParseError "class A {}; class B : A, NonExistingInterface {}" TypeNotFound 25 + + # base should be accepted only on instance ctors + ShouldBeParseError 'class A { A($a){} } ; class B : A { foo() : base(1) {} }' MissingFunctionBody 41 + ShouldBeParseError 'class A { static A() {} }; class B { static B() : base() {} }' MissingFunctionBody 47 + + # Incomplete input + ShouldBeParseError 'class A { A($a){} } ; class B : A { B() : bas {} }' MissingBaseCtorCall 41 + ShouldBeParseError 'class A { A($a){} } ; class B : A { B() : base( {} }' @('MissingEndParenthesisInMethodCall', 'MissingFunctionBody') @(50, 39) + ShouldBeParseError 'class A { A($a){} } ; class B : A { B() : base {} }' @('MissingMethodParameterList', 'UnexpectedToken') @(46, 50) + + # Sealed base + ShouldBeParseError "class baz : string {}" SealedBaseClass 12 -SkipAndCheckRuntimeError + # Non-existing Interface + ShouldBeParseError "class bar {}; class baz : bar, Non.Existing.Interface {}" TypeNotFound 31 -SkipAndCheckRuntimeError + + # .NET abstract method not implemented + ShouldBeParseError "class MyType : Type {}" TypeCreationError 0 -SkipAndCheckRuntimeError + + # inheritance doesn't allow non linear order + ShouldBeParseError "class A : B {}; class B {}" TypeNotFound 10 -SkipAndCheckRuntimeError + + # inheritance doesn't allow circular order + ShouldBeParseError "class A : B {}; class B : A {}" TypeNotFound 10 -SkipAndCheckRuntimeError + ShouldBeParseError "class A : C {}; class B : A {}; class C : B {}" TypeNotFound 10 -SkipAndCheckRuntimeError +} + +Describe 'Classes methods with inheritance' -Tags "CI" { + + Context 'Method calls' { + + It 'can call instance method on base class' { + class bar + { + [int]foo() {return 100500} + } + class baz : bar {} + [baz]::new().foo() | Should Be 100500 + } + + It 'can call static method on base class' { + class bar + { + static [int]foo() {return 100500} + } + class baz : bar {} + [baz]::foo() | Should Be 100500 + } + + It 'can access static and instance base class property' { + class A + { + static [int]$si + [int]$i + } + class B : A + { + [void]foo() + { + $this::si = 1001 + $this.i = 1003 + } + } + $b = [B]::new() + $b.foo() + [A]::si | Should Be 1001 + ($b.i) | Should Be 1003 + } + + It 'works with .NET types' { + class MyIntList : system.collections.generic.list[int] {} + $intList = [MyIntList]::new() + $intList.Add(100501) + $intList.Add(100502) + $intList.Count | Should Be 2 + $intList[0] | Should Be 100501 + $intList[1] | Should Be 100502 + } + + It 'overrides instance method' { + class bar + { + [int]foo() {return 100500} + } + class baz : bar + { + [int]foo() {return 200600} + } + [baz]::new().foo() | Should Be 200600 + } + + It 'allows base class method call and doesn''t fall into recursion' { + class bar + { + [int]foo() {return 1001} + } + class baz : bar + { + [int] $fooCallCounter + [int]foo() + { + if ($this.fooCallCounter++ -gt 0) + { + throw "Recursion happens" + } + return 3 * ([bar]$this).foo() + } + } + + $res = [baz]::new().foo() + $res | Should Be 3003 + } + + It 'case insensitive for base class method calls' { + class bar + { + [int]foo() {return 1001} + } + class baz : bar + { + [int] $fooCallCounter + [int]fOo() + { + if ($this.fooCallCounter++ -gt 0) + { + throw "Recursion happens" + } + return ([bAr]$this).fOo() + ([bAr]$this).FOO() + } + } + + $res = [baz]::new().foo() + $res | Should Be 2002 + } + + It 'allows any call from the inheritance hierarchy' { + class A + { + [string]GetName() {return "A"} + } + class B : A + { + [string]GetName() {return "B"} + } + class C : B + { + [string]GetName() {return "C"} + } + class D : C + { + [string]GetName() {return "D"} + } + $d = [D]::new() + + ([A]$d).GetName() | Should Be "A" + ([B]$d).GetName() | Should Be "B" + ([C]$d).GetName() | Should Be "C" + ([D]$d).GetName() | Should Be "D" + $d.GetName() | Should Be "D" + } + + It 'can call base method with params' { + class A + { + [string]ToStr([int]$a) {return "A" + $a} + } + class B : A + { + [string]ToStr([int]$a) {return "B" + $a} + } + $b = [B]::new() + ([A]$b).ToStr(101) | Should Be "A101" + $b.ToStr(100) | Should Be "B100" + } + + It 'can call base method with many params' { + class A + { + [string]ToStr([int]$a1, [int]$a2, [int]$a3, [int]$a4, [int]$a5, [int]$a6, [int]$a7, [int]$a8, [int]$a9, [int]$a10, [int]$a11, [int]$a12, [int]$a13, [int]$a14) + { + return "A" + } + + [void]Noop([int]$a1, [int]$a2, [int]$a3, [int]$a4, [int]$a5, [int]$a6, [int]$a7, [int]$a8, [int]$a9, [int]$a10, [int]$a11, [int]$a12, [int]$a13, [int]$a14) + { + } + } + class B : A + { + [string]ToStr([int]$a1, [int]$a2, [int]$a3, [int]$a4, [int]$a5, [int]$a6, [int]$a7, [int]$a8, [int]$a9, [int]$a10, [int]$a11, [int]$a12, [int]$a13, [int]$a14) + { + return "B" + } + + [void]Noop([int]$a1, [int]$a2, [int]$a3, [int]$a4, [int]$a5, [int]$a6, [int]$a7, [int]$a8, [int]$a9, [int]$a10, [int]$a11, [int]$a12, [int]$a13, [int]$a14) + { + } + } + $b = [B]::new() + + # we don't really care about methods results, we only checks that calls doesn't throw + + # 14 args is a limit + $b.ToStr(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) | Should Be 'B' + ([A]$b).ToStr(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) | Should Be 'A' + + # 14 args is a limit + $b.Noop(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) + ([A]$b).Noop(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) + } + + It 'overrides void method call' { + $script:voidOverrideVar = $null + class A + { + [void]SetStr([int]$a) {$script:voidOverrideVar = "A" + $a} + [void]SetStr() {$script:voidOverrideVar = "A"} + } + class B : A + { + [void]SetStr([int]$a) {$script:voidOverrideVar = "B" + $a} + [void]SetStr() {$script:voidOverrideVar = "B"} + } + $b = [B]::new() + ([A]$b).SetStr(101) + $script:voidOverrideVar | Should Be "A101" + $b.SetStr(100) + $script:voidOverrideVar | Should Be "B100" + ([A]$b).SetStr() + $script:voidOverrideVar | Should Be "A" + $b.SetStr() + $script:voidOverrideVar | Should Be "B" + } + + It 'hides final .NET method' { + class MyIntList : system.collections.generic.list[int] + { + # Add is final, can we hide it? + [void] Add([int]$arg) + { + ([system.collections.generic.list[int]]$this).Add($arg * 2) + } + } + + $intList = [MyIntList]::new() + $intList.Add(100201) + $intList.Count | Should Be 1 + $intList[0] | Should Be 200402 + } + } + + Context 'base static method call' { + class A + { + static [string]ToStr([int]$a) {return "A" + $a} + } + class B : A + { + static [string]ToStr([int]$a) {return "B" + $a} + } + + $b = [B]::new() + + # MSFT:1911652 + # MSFT:2973835 + It 'doesn''t affect static method call on type' -Skip { + ([A]$b)::ToStr(101) | Should Be "A101" + } + + It 'overrides static method call on instance' { + $b::ToStr(100) | Should Be "B100" + } + } +} + + +Describe 'Classes inheritance ctors syntax errors' -Tags "CI" { + + #DotNet.Interface.NotImplemented + ShouldBeParseError "class MyComparable : system.IComparable {}" TypeCreationError 0 -SkipAndCheckRuntimeError + + #DotNet.Interface.WrongSignature + ShouldBeParseError 'class MyComparable : system.IComparable { [void] CompareTo([object]$obj) {} }' TypeCreationError 0 -SkipAndCheckRuntimeError + + #DotNet.NoDefaultCtor + ShouldBeParseError "class MyCollection : System.Collections.ObjectModel.ReadOnlyCollection[int] {}" BaseClassNoDefaultCtor 0 -SkipAndCheckRuntimeError + + #NoDefaultCtor + ShouldBeParseError 'class A { A([int]$a) {} }; class B : A {}' BaseClassNoDefaultCtor 27 -SkipAndCheckRuntimeError +} + +Describe 'Classes inheritance ctors' -Tags "CI" { + + It 'can call base ctor' { + class A { + [int]$a + A([int]$a) + { + $this.a = $a + } + } + + class B : A + { + B([int]$a) : base($a * 2) {} + } + + $b = [B]::new(101) + $b.a | Should Be 202 + } + + # TODO: can we detect it in the parse time? + It 'cannot call base ctor with the wrong number of parameters' { + class A { + [int]$a + A([int]$a) + { + $this.a = $a + } + } + + class B : A + { + B([int]$a) : base($a * 2, 100) {} + } + + try { + [B]::new(101) + throw "No Exception!" + } catch { + $_.Exception | Should BeOfType "System.Management.Automation.MethodException" + } + } + + It 'call default base ctor implicitly' { + class A { + [int]$a + A() + { + $this.a = 1007 + } + } + + class B : A + { + B() {} + } + + class C : A + { + } + + $b = [B]::new() + $c = [C]::new() + $b.a | Should Be 1007 + $c.a | Should Be 1007 + } + + It 'doesn''t allow base ctor as an explicit method call' { + $o = [object]::new() + try { + # we should not allow direct .ctor call. + $o.{.ctor}() + } catch { + $_.FullyQualifiedErrorId | Should Be MethodNotFound + return + } + # Fail + '' | Should Be "Exception expected" + } + + It 'allow use conversion [string -> int] in base ctor call' { + class A { + [int]$a + A([int]$a) + { + $this.a = $a + } + } + + class B : A + { + B() : base("103") {} + } + + $b = [B]::new() + $b.a | Should Be 103 + } + + It 'resolves ctor call based on argument type' { + class A { + [int]$i + [string]$s + A([int]$a) + { + $this.i = $a + } + A([string]$a) + { + $this.s = $a + } + } + + class B : A + { + B($a) : base($a) {} + } + + $b1 = [B]::new("foo") + $b2 = [B]::new(1001) + $b1.s | Should Be "foo" + $b2.i | Should Be 1001 + } +} + +Describe 'Type creation' -Tags "CI" { + It 'can call super-class methods sequentially' { + $sb = [scriptblock]::Create(@' +class Base +{ + [int] foo() { return 100 } +} + +class Derived : Base +{ + [int] foo() { return 2 * ([Base]$this).foo() } +} + +[Derived]::new().foo() +'@) + $sb.Invoke() | Should Be 200 + $sb.Invoke() | Should Be 200 + } +} + +} finally { + $global:PSdefaultParameterValues = $defaultParamValues +} diff --git a/test/powershell/Language/Classes/scripting.Classes.using.tests.ps1 b/test/powershell/Language/Classes/scripting.Classes.using.tests.ps1 index 7620696108d..b4120d072d4 100644 --- a/test/powershell/Language/Classes/scripting.Classes.using.tests.ps1 +++ b/test/powershell/Language/Classes/scripting.Classes.using.tests.ps1 @@ -1,549 +1,549 @@ -Describe 'using module' -Tags "CI" { - BeforeAll { - $originalPSModulePath = $env:PSModulePath - - function New-TestModule { - param( - [string]$Name, - [string]$Content, - [switch]$Manifest, - [version]$Version = '1.0', # ignored, if $Manifest -eq $false - [string]$ModulePathPrefix = 'modules' # module is created under TestDrive:\$ModulePathPrefix\$Name - ) - - if ($manifest) { - new-item -type directory -Force "${TestDrive}\$ModulePathPrefix\$Name\$Version" > $null - Set-Content -Path "${TestDrive}\$ModulePathPrefix\$Name\$Version\$Name.psm1" -Value $Content - New-ModuleManifest -RootModule "$Name.psm1" -Path "${TestDrive}\$ModulePathPrefix\$Name\$Version\$Name.psd1" -ModuleVersion $Version - } else { - new-item -type directory -Force "${TestDrive}\$ModulePathPrefix\$Name" > $null - Set-Content -Path "${TestDrive}\$ModulePathPrefix\$Name\$Name.psm1" -Value $Content - } - - $resolvedTestDrivePath = Split-Path ((get-childitem "${TestDrive}\$ModulePathPrefix")[0].FullName) - if (-not ($env:PSModulePath -like "*$resolvedTestDrivePath*")) { - $env:PSModulePath += "$([System.IO.Path]::PathSeparator)$resolvedTestDrivePath" - } - } - - } - - AfterAll { - $env:PSModulePath = $originalPSModulePath - } - - It 'Import-Module has ImplementedAssembly, when classes are present in the module' { - # Create modules in TestDrive:\ - New-TestModule -Name Foo -Content 'class Foo { [string] GetModuleName() { return "Foo" } }' - New-TestModule -Manifest -Name FooWithManifest -Content 'class Foo { [string] GetModuleName() { return "FooWithManifest" } }' - - $module = Import-Module Foo -PassThru - try { - $module.ImplementingAssembly | Should Not Be $null - } finally { - $module | Remove-Module - } - } - - It "can use class from another module as a base class with using module" { - $barType = [scriptblock]::Create(@" -using module Foo -class Bar : Foo {} -[Bar] -"@).Invoke() - - $barType.BaseType.Name | Should Be 'Foo' - } - - It "can use class from another module in New-Object" { - $foo = [scriptblock]::Create(@" -using module FooWithManifest -using module Foo -New-Object FooWithManifest.Foo -New-Object Foo.Foo -"@).Invoke() - - $foo.Count | Should Be 2 - $foo[0].GetModuleName() | Should Be 'FooWithManifest' - $foo[1].GetModuleName() | Should Be 'Foo' - } - - It "can use class from another module by full name as base class and [type]" { - $fooObject = [scriptblock]::Create(@" -using module Foo -class Bar : Foo.Foo {} -[Foo.Foo]::new() -"@).Invoke() - $fooObject.GetModuleName() | Should Be 'Foo' - } - - It "can use modules with classes collision" { - # we use 3 classes with name Foo at the same time - # two of them come from 'using module' and one is defined in the scriptblock itself. - # we should be able to use first two of them by the module-qualified name and the third one it's name. - $fooModuleName = [scriptblock]::Create(@" -using module Foo -using module FooWithManifest - -class Foo { [string] GetModuleName() { return "This" } } - -class Bar1 : Foo.Foo {} -class Bar2 : FooWithManifest.Foo {} -class Bar : Foo {} - -[Bar1]::new().GetModuleName() # Foo -[Bar2]::new().GetModuleName() # FooWithManifest -[Bar]::new().GetModuleName() # This -(New-Object Foo).GetModuleName() # This -"@).Invoke() - - $fooModuleName.Count | Should Be 4 - $fooModuleName[0] | Should Be 'Foo' - $fooModuleName[1] | Should Be 'FooWithManifest' - $fooModuleName[2] | Should Be 'This' - $fooModuleName[3] | Should Be 'This' - } - - It "doesn't mess up two consecutive scripts" { - $sb1 = [scriptblock]::Create(@" -using module Foo -class Bar : Foo {} -[Bar]::new().GetModuleName() -"@) - - $sb2 = [scriptblock]::Create(@" -using module Foo - -class Foo { [string] GetModuleName() { return "This" } } -class Bar : Foo {} -[Bar]::new().GetModuleName() - -"@) - $sb1.Invoke() | Should Be 'Foo' - $sb2.Invoke() | Should Be 'This' - } - - It "can use modules with classes collision simple" { - $fooModuleName = [scriptblock]::Create(@" -using module Foo - -class Foo { [string] GetModuleName() { return "This" } } - -class Bar1 : Foo.Foo {} -class Bar : Foo {} - -[Foo.Foo]::new().GetModuleName() # Foo -[Bar1]::new().GetModuleName() # Foo -[Bar]::new().GetModuleName() # This -[Foo]::new().GetModuleName() # This -(New-Object Foo).GetModuleName() # This -"@).Invoke() - - $fooModuleName.Count | Should Be 5 - $fooModuleName[0] | Should Be 'Foo' - $fooModuleName[1] | Should Be 'Foo' - $fooModuleName[2] | Should Be 'This' - $fooModuleName[3] | Should Be 'This' - $fooModuleName[4] | Should Be 'This' - } - - It "can use class from another module as a base class with using module with manifest" { - $barType = [scriptblock]::Create(@" -using module FooWithManifest -class Bar : Foo {} -[Bar] -"@).Invoke() - - $barType.BaseType.Name | Should Be 'Foo' - } - - It "can instantiate class from another module" { - $foo = [scriptblock]::Create(@" -using module Foo -[Foo]::new() -"@).Invoke() - - $foo.GetModuleName() | Should Be 'Foo' - } - - It "cannot instantiate class from another module without using statement" { - $err = Get-RuntimeError @" -#using module Foo -[Foo]::new() -"@ - $err.FullyQualifiedErrorId | Should Be TypeNotFound - } - - It "can use class from another module in New-Object by short name" { - $foo = [scriptblock]::Create(@" -using module FooWithManifest -New-Object Foo -"@).Invoke() - $foo.GetModuleName() | Should Be 'FooWithManifest' - } - - It "can use class from this module in New-Object by short name" { - $foo = [scriptblock]::Create(@" -class Foo {} -New-Object Foo -"@).Invoke() - $foo | Should Not Be $null - } - - # Pending reason: - # it's not yet implemented. - It "accept module specification" { - $foo = [scriptblock]::Create(@" -using module @{ ModuleName = 'FooWithManifest'; ModuleVersion = '1.0' } -New-Object Foo -"@).Invoke() - $foo.GetModuleName() | Should Be 'FooWithManifest' - } - - Context 'parse time errors' { - - It "report an error about not found module" { - $err = Get-ParseResults "using module ThisModuleDoesntExist" - $err.Count | Should Be 1 - $err[0].ErrorId | Should Be 'ModuleNotFoundDuringParse' - } - - It "report an error about misformatted module specification" { - $err = Get-ParseResults "using module @{ Foo = 'Foo' }" - $err.Count | Should Be 1 - $err[0].ErrorId | Should Be 'RequiresModuleInvalid' - } - - It "report an error about wildcard in the module name" { - $err = Get-ParseResults "using module fo*" - $err.Count | Should Be 1 - $err[0].ErrorId | Should Be 'WildCardModuleNameError' - } - - It "report an error about wildcard in the module path" { - $err = Get-ParseResults "using module C:\fo*" - $err.Count | Should Be 1 - $err[0].ErrorId | Should Be 'WildCardModuleNameError' - } - - It "report an error about wildcard in the module name inside ModuleSpecification hashtable" { - $err = Get-ParseResults "using module @{ModuleName = 'Fo*'; RequiredVersion = '1.0'}" - $err.Count | Should Be 1 - $err[0].ErrorId | Should Be 'WildCardModuleNameError' - } - - # MSFT:5246105 - It "report an error when tokenizer encounters comma" { - $err = Get-ParseResults "using module ,FooWithManifest" - $err.Count | Should Be 1 - $err[0].ErrorId | Should Be 'MissingUsingItemName' - } - - It "report an error when tokenizer encounters nothing" { - $err = Get-ParseResults "using module " - $err.Count | Should Be 1 - $err[0].ErrorId | Should Be 'MissingUsingItemName' - } - - It "report an error on badly formatted RequiredVersion" { - $err = Get-ParseResults "using module @{ModuleName = 'FooWithManifest'; RequiredVersion = 1. }" - $err.Count | Should Be 1 - $err[0].ErrorId | Should Be 'RequiresModuleInvalid' - } - - # MSFT:6897275 - It "report an error on incomplete using input" { - $err = Get-ParseResults "using module @{ModuleName = 'FooWithManifest'; FooWithManifest = 1." # missing closing bracket - $err.Count | Should Be 2 - $err[0].ErrorId | Should Be 'MissingEndCurlyBrace' - $err[1].ErrorId | Should Be 'RequiresModuleInvalid' - } - - It "report an error when 'using module' terminating by NewLine" { - $err = Get-ParseResults "using module" - $err.Count | Should Be 1 - $err[0].ErrorId | Should Be 'MissingUsingItemName' - } - - It "report an error when 'using module' terminating by Semicolon" { - $err = Get-ParseResults "using module; $testvar=1" - $err.Count | Should Be 1 - $err[0].ErrorId | Should Be 'MissingUsingItemName' - } - - It "report an error when a value after 'using module' is a unallowed expression" { - $err = Get-ParseResults "using module )" - $err.Count | Should Be 1 - $err[0].ErrorId | Should Be 'InvalidValueForUsingItemName' - } - - It "report an error when a value after 'using module' is not a valid module name" { - $err = Get-ParseResults "using module 123" - $err.Count | Should Be 1 - $err[0].ErrorId | Should Be 'InvalidValueForUsingItemName' - } - } - - Context 'short name in case of name collision' { - It "cannot use as base class" { - $err = Get-RuntimeError @" -using module Foo -using module FooWithManifest -class Bar : Foo {} -"@ - $err.FullyQualifiedErrorId | Should Be AmbiguousTypeReference - } - - It "cannot use as [...]" { - $err = Get-RuntimeError @" -using module Foo -using module FooWithManifest -[Foo] -"@ - $err.FullyQualifiedErrorId | Should Be AmbiguousTypeReference - } - - It "cannot use in New-Object" { - $err = Get-RuntimeError @" -using module Foo -using module FooWithManifest -New-Object Foo -"@ - $err.FullyQualifiedErrorId | Should Be 'AmbiguousTypeReference,Microsoft.PowerShell.Commands.NewObjectCommand' - } - - It "cannot use [type] cast from string" { - $err = Get-RuntimeError @" -using module Foo -using module FooWithManifest -[type]"Foo" -"@ - $err.FullyQualifiedErrorId | Should Be AmbiguousTypeReference - } - } - - Context 'using use the latest version of module after Import-Module -Force' { - BeforeAll { - New-TestModule -Name Foo -Content 'class Foo { [string] GetModuleName() { return "Foo2" } }' - Import-Module Foo -Force - } - It "can use class from another module as a base class with using module" { - $moduleName = [scriptblock]::Create(@" -using module Foo -[Foo]::new().GetModuleName() -"@).Invoke() - - $moduleName | Should Be 'Foo2' - } - } - - Context 'Side by side' { - BeforeAll { - # Add side-by-side module - $newVersion = '3.4.5' - New-TestModule -Manifest -Name FooWithManifest -Content 'class Foo { [string] GetModuleName() { return "Foo230" } }' -Version '2.3.0' - New-TestModule -Manifest -Name FooWithManifest -Content 'class Foo { [string] GetModuleName() { return "Foo345" } }' -Version '3.4.5' -ModulePathPrefix 'Modules2' - } - - # 'using module' behavior must be aligned with Import-Module. - # Import-Module does the following: - # 1) find the first directory from $env:PSModulePath that contains the module - # 2) Import highest available version of the module - # In out case TestDrive:\Module is before TestDrive:\Modules2 and so 2.3.0 is the right version - It "uses the last module, if multiple versions are present" { - $foo = [scriptblock]::Create(@" -using module FooWithManifest -[Foo]::new() -"@).Invoke() - $foo.GetModuleName() | Should Be 'Foo230' - } - - It "uses right version, when RequiredModule=1.0 specified" { - $foo = [scriptblock]::Create(@" -using module @{ModuleName = 'FooWithManifest'; RequiredVersion = '1.0'} -[Foo]::new() -"@).Invoke() - $foo.GetModuleName() | Should Be 'FooWithManifest' - } - - It "uses right version, when RequiredModule=2.3.0 specified" { - $foo = [scriptblock]::Create(@" -using module @{ModuleName = 'FooWithManifest'; RequiredVersion = '2.3.0'} -[Foo]::new() -"@).Invoke() - $foo.GetModuleName() | Should Be 'Foo230' - } - - It "uses right version, when RequiredModule=3.4.5 specified" { - $foo = [scriptblock]::Create(@" -using module @{ModuleName = 'FooWithManifest'; RequiredVersion = '3.4.5'} -[Foo]::new() -"@).Invoke() - $foo.GetModuleName() | Should Be 'Foo345' - } - } - - Context 'Use module with runtime error' { - BeforeAll { - New-TestModule -Name ModuleWithRuntimeError -Content @' -class Foo { [string] GetModuleName() { return "ModuleWithRuntimeError" } } -throw 'error' -'@ - } - - It "handles runtime errors in imported module" { - $err = Get-RuntimeError @" -using module ModuleWithRuntimeError -[Foo]::new().GetModuleName() -"@ - - $err | Should Be 'error' - } - } - - Context 'shared InitialSessionState' { - - It 'can pick the right module' { - - $scriptToProcessPath = "${TestDrive}\toProcess.ps1" - Set-Content -Path $scriptToProcessPath -Value @' -using module Foo -function foo() -{ - [Foo]::new() -} -'@ - # resolve name to absolute path - $scriptToProcessPath = (get-childitem $scriptToProcessPath).FullName - $iss = [System.Management.Automation.Runspaces.initialsessionstate]::CreateDefault() - $iss.StartupScripts.Add($scriptToProcessPath) - - $ps = [powershell]::Create($iss) - $ps.AddCommand("foo").Invoke() | Should be Foo - $ps.Streams.Error | Should Be $null - - $ps1 = [powershell]::Create($iss) - $ps1.AddCommand("foo").Invoke() | Should be Foo - $ps1.Streams.Error | Should Be $null - - $ps.Commands.Clear() - $ps.Streams.Error.Clear() - $ps.AddScript(". foo").Invoke() | Should be Foo - $ps.Streams.Error | Should Be $null - } - } - - - # here we are back to normal $env:PSModulePath, but all modules are there - Context "Module by path" { - BeforeAll { - # this is a setup for Context "Module by path" - New-TestModule -Name FooForPaths -Content 'class Foo { [string] GetModuleName() { return "FooForPaths" } }' - $env:PSModulePath = $originalPSModulePath - - new-item -type directory -Force TestDrive:\FooRelativeConsumer - Set-Content -Path "${TestDrive}\FooRelativeConsumer\FooRelativeConsumer.ps1" -Value @' -using module ..\modules\FooForPaths -class Bar : Foo {} -[Bar]::new() -'@ - - Set-Content -Path "${TestDrive}\FooRelativeConsumerErr.ps1" -Value @' -using module FooForPaths -class Bar : Foo {} -[Bar]::new() -'@ - } - - It 'use non-modified PSModulePath' { - $env:PSModulePath | Should Be $originalPSModulePath - } - - It "can be accessed by relative path" { - $barObject = & TestDrive:\FooRelativeConsumer\FooRelativeConsumer.ps1 - $barObject.GetModuleName() | Should Be 'FooForPaths' - } - - It "cannot be accessed by relative path without .\ from a script" { - $err = Get-RuntimeError '& TestDrive:\FooRelativeConsumerErr.ps1' - $err.FullyQualifiedErrorId | Should Be ModuleNotFoundDuringParse - } - - It "can be accessed by absolute path" { - $resolvedTestDrivePath = Split-Path ((get-childitem TestDrive:\modules)[0].FullName) - $s = @" -using module $resolvedTestDrivePath\FooForPaths -[Foo]::new() -"@ - $err = Get-ParseResults $s - $err.Count | Should Be 0 - $barObject = [scriptblock]::Create($s).Invoke() - $barObject.GetModuleName() | Should Be 'FooForPaths' - } - - It "can be accessed by absolute path with file extension" { - $resolvedTestDrivePath = Split-Path ((get-childitem TestDrive:\modules)[0].FullName) - $barObject = [scriptblock]::Create(@" -using module $resolvedTestDrivePath\FooForPaths\FooForPaths.psm1 -[Foo]::new() -"@).Invoke() - $barObject.GetModuleName() | Should Be 'FooForPaths' - } - - It "can be accessed by relative path without file" { - # we should not be able to access .\FooForPaths without cd - $err = Get-RuntimeError @" -using module .\FooForPaths -[Foo]::new() -"@ - $err.FullyQualifiedErrorId | Should Be ModuleNotFoundDuringParse - - Push-Location TestDrive:\modules - try { - $barObject = [scriptblock]::Create(@" -using module .\FooForPaths -[Foo]::new() -"@).Invoke() - $barObject.GetModuleName() | Should Be 'FooForPaths' - } finally { - Pop-Location - } - } - - It "cannot be accessed by relative path without .\" { - Push-Location TestDrive:\modules - try { - $err = Get-RuntimeError @" -using module FooForPaths -[Foo]::new() -"@ - $err.FullyQualifiedErrorId | Should Be ModuleNotFoundDuringParse - } finally { - Pop-Location - } - } - } - - Context "module has non-terminating error handled with 'SilentlyContinue'" { - BeforeAll { - $testFile = Join-Path -Path $TestDrive -ChildPath "testmodule.psm1" - $content = @' -Get-Command -CommandType Application -Name NonExisting -ErrorAction SilentlyContinue -class TestClass { [string] GetName() { return "TestClass" } } -'@ - Set-Content -Path $testFile -Value $content -Force - } - AfterAll { - Remove-Module -Name testmodule -Force -ErrorAction SilentlyContinue - } - - It "'using module' should succeed" { - $result = [scriptblock]::Create(@" -using module $testFile -[TestClass]::new() -"@).Invoke() - $result.GetName() | Should Be "TestClass" - } - } -} - +Describe 'using module' -Tags "CI" { + BeforeAll { + $originalPSModulePath = $env:PSModulePath + + function New-TestModule { + param( + [string]$Name, + [string]$Content, + [switch]$Manifest, + [version]$Version = '1.0', # ignored, if $Manifest -eq $false + [string]$ModulePathPrefix = 'modules' # module is created under TestDrive:\$ModulePathPrefix\$Name + ) + + if ($manifest) { + new-item -type directory -Force "${TestDrive}\$ModulePathPrefix\$Name\$Version" > $null + Set-Content -Path "${TestDrive}\$ModulePathPrefix\$Name\$Version\$Name.psm1" -Value $Content + New-ModuleManifest -RootModule "$Name.psm1" -Path "${TestDrive}\$ModulePathPrefix\$Name\$Version\$Name.psd1" -ModuleVersion $Version + } else { + new-item -type directory -Force "${TestDrive}\$ModulePathPrefix\$Name" > $null + Set-Content -Path "${TestDrive}\$ModulePathPrefix\$Name\$Name.psm1" -Value $Content + } + + $resolvedTestDrivePath = Split-Path ((get-childitem "${TestDrive}\$ModulePathPrefix")[0].FullName) + if (-not ($env:PSModulePath -like "*$resolvedTestDrivePath*")) { + $env:PSModulePath += "$([System.IO.Path]::PathSeparator)$resolvedTestDrivePath" + } + } + + } + + AfterAll { + $env:PSModulePath = $originalPSModulePath + } + + It 'Import-Module has ImplementedAssembly, when classes are present in the module' { + # Create modules in TestDrive:\ + New-TestModule -Name Foo -Content 'class Foo { [string] GetModuleName() { return "Foo" } }' + New-TestModule -Manifest -Name FooWithManifest -Content 'class Foo { [string] GetModuleName() { return "FooWithManifest" } }' + + $module = Import-Module Foo -PassThru + try { + $module.ImplementingAssembly | Should Not Be $null + } finally { + $module | Remove-Module + } + } + + It "can use class from another module as a base class with using module" { + $barType = [scriptblock]::Create(@" +using module Foo +class Bar : Foo {} +[Bar] +"@).Invoke() + + $barType.BaseType.Name | Should Be 'Foo' + } + + It "can use class from another module in New-Object" { + $foo = [scriptblock]::Create(@" +using module FooWithManifest +using module Foo +New-Object FooWithManifest.Foo +New-Object Foo.Foo +"@).Invoke() + + $foo.Count | Should Be 2 + $foo[0].GetModuleName() | Should Be 'FooWithManifest' + $foo[1].GetModuleName() | Should Be 'Foo' + } + + It "can use class from another module by full name as base class and [type]" { + $fooObject = [scriptblock]::Create(@" +using module Foo +class Bar : Foo.Foo {} +[Foo.Foo]::new() +"@).Invoke() + $fooObject.GetModuleName() | Should Be 'Foo' + } + + It "can use modules with classes collision" { + # we use 3 classes with name Foo at the same time + # two of them come from 'using module' and one is defined in the scriptblock itself. + # we should be able to use first two of them by the module-qualified name and the third one it's name. + $fooModuleName = [scriptblock]::Create(@" +using module Foo +using module FooWithManifest + +class Foo { [string] GetModuleName() { return "This" } } + +class Bar1 : Foo.Foo {} +class Bar2 : FooWithManifest.Foo {} +class Bar : Foo {} + +[Bar1]::new().GetModuleName() # Foo +[Bar2]::new().GetModuleName() # FooWithManifest +[Bar]::new().GetModuleName() # This +(New-Object Foo).GetModuleName() # This +"@).Invoke() + + $fooModuleName.Count | Should Be 4 + $fooModuleName[0] | Should Be 'Foo' + $fooModuleName[1] | Should Be 'FooWithManifest' + $fooModuleName[2] | Should Be 'This' + $fooModuleName[3] | Should Be 'This' + } + + It "doesn't mess up two consecutive scripts" { + $sb1 = [scriptblock]::Create(@" +using module Foo +class Bar : Foo {} +[Bar]::new().GetModuleName() +"@) + + $sb2 = [scriptblock]::Create(@" +using module Foo + +class Foo { [string] GetModuleName() { return "This" } } +class Bar : Foo {} +[Bar]::new().GetModuleName() + +"@) + $sb1.Invoke() | Should Be 'Foo' + $sb2.Invoke() | Should Be 'This' + } + + It "can use modules with classes collision simple" { + $fooModuleName = [scriptblock]::Create(@" +using module Foo + +class Foo { [string] GetModuleName() { return "This" } } + +class Bar1 : Foo.Foo {} +class Bar : Foo {} + +[Foo.Foo]::new().GetModuleName() # Foo +[Bar1]::new().GetModuleName() # Foo +[Bar]::new().GetModuleName() # This +[Foo]::new().GetModuleName() # This +(New-Object Foo).GetModuleName() # This +"@).Invoke() + + $fooModuleName.Count | Should Be 5 + $fooModuleName[0] | Should Be 'Foo' + $fooModuleName[1] | Should Be 'Foo' + $fooModuleName[2] | Should Be 'This' + $fooModuleName[3] | Should Be 'This' + $fooModuleName[4] | Should Be 'This' + } + + It "can use class from another module as a base class with using module with manifest" { + $barType = [scriptblock]::Create(@" +using module FooWithManifest +class Bar : Foo {} +[Bar] +"@).Invoke() + + $barType.BaseType.Name | Should Be 'Foo' + } + + It "can instantiate class from another module" { + $foo = [scriptblock]::Create(@" +using module Foo +[Foo]::new() +"@).Invoke() + + $foo.GetModuleName() | Should Be 'Foo' + } + + It "cannot instantiate class from another module without using statement" { + $err = Get-RuntimeError @" +#using module Foo +[Foo]::new() +"@ + $err.FullyQualifiedErrorId | Should Be TypeNotFound + } + + It "can use class from another module in New-Object by short name" { + $foo = [scriptblock]::Create(@" +using module FooWithManifest +New-Object Foo +"@).Invoke() + $foo.GetModuleName() | Should Be 'FooWithManifest' + } + + It "can use class from this module in New-Object by short name" { + $foo = [scriptblock]::Create(@" +class Foo {} +New-Object Foo +"@).Invoke() + $foo | Should Not Be $null + } + + # Pending reason: + # it's not yet implemented. + It "accept module specification" { + $foo = [scriptblock]::Create(@" +using module @{ ModuleName = 'FooWithManifest'; ModuleVersion = '1.0' } +New-Object Foo +"@).Invoke() + $foo.GetModuleName() | Should Be 'FooWithManifest' + } + + Context 'parse time errors' { + + It "report an error about not found module" { + $err = Get-ParseResults "using module ThisModuleDoesntExist" + $err.Count | Should Be 1 + $err[0].ErrorId | Should Be 'ModuleNotFoundDuringParse' + } + + It "report an error about misformatted module specification" { + $err = Get-ParseResults "using module @{ Foo = 'Foo' }" + $err.Count | Should Be 1 + $err[0].ErrorId | Should Be 'RequiresModuleInvalid' + } + + It "report an error about wildcard in the module name" { + $err = Get-ParseResults "using module fo*" + $err.Count | Should Be 1 + $err[0].ErrorId | Should Be 'WildCardModuleNameError' + } + + It "report an error about wildcard in the module path" { + $err = Get-ParseResults "using module C:\fo*" + $err.Count | Should Be 1 + $err[0].ErrorId | Should Be 'WildCardModuleNameError' + } + + It "report an error about wildcard in the module name inside ModuleSpecification hashtable" { + $err = Get-ParseResults "using module @{ModuleName = 'Fo*'; RequiredVersion = '1.0'}" + $err.Count | Should Be 1 + $err[0].ErrorId | Should Be 'WildCardModuleNameError' + } + + # MSFT:5246105 + It "report an error when tokenizer encounters comma" { + $err = Get-ParseResults "using module ,FooWithManifest" + $err.Count | Should Be 1 + $err[0].ErrorId | Should Be 'MissingUsingItemName' + } + + It "report an error when tokenizer encounters nothing" { + $err = Get-ParseResults "using module " + $err.Count | Should Be 1 + $err[0].ErrorId | Should Be 'MissingUsingItemName' + } + + It "report an error on badly formatted RequiredVersion" { + $err = Get-ParseResults "using module @{ModuleName = 'FooWithManifest'; RequiredVersion = 1. }" + $err.Count | Should Be 1 + $err[0].ErrorId | Should Be 'RequiresModuleInvalid' + } + + # MSFT:6897275 + It "report an error on incomplete using input" { + $err = Get-ParseResults "using module @{ModuleName = 'FooWithManifest'; FooWithManifest = 1." # missing closing bracket + $err.Count | Should Be 2 + $err[0].ErrorId | Should Be 'MissingEndCurlyBrace' + $err[1].ErrorId | Should Be 'RequiresModuleInvalid' + } + + It "report an error when 'using module' terminating by NewLine" { + $err = Get-ParseResults "using module" + $err.Count | Should Be 1 + $err[0].ErrorId | Should Be 'MissingUsingItemName' + } + + It "report an error when 'using module' terminating by Semicolon" { + $err = Get-ParseResults "using module; $testvar=1" + $err.Count | Should Be 1 + $err[0].ErrorId | Should Be 'MissingUsingItemName' + } + + It "report an error when a value after 'using module' is a unallowed expression" { + $err = Get-ParseResults "using module )" + $err.Count | Should Be 1 + $err[0].ErrorId | Should Be 'InvalidValueForUsingItemName' + } + + It "report an error when a value after 'using module' is not a valid module name" { + $err = Get-ParseResults "using module 123" + $err.Count | Should Be 1 + $err[0].ErrorId | Should Be 'InvalidValueForUsingItemName' + } + } + + Context 'short name in case of name collision' { + It "cannot use as base class" { + $err = Get-RuntimeError @" +using module Foo +using module FooWithManifest +class Bar : Foo {} +"@ + $err.FullyQualifiedErrorId | Should Be AmbiguousTypeReference + } + + It "cannot use as [...]" { + $err = Get-RuntimeError @" +using module Foo +using module FooWithManifest +[Foo] +"@ + $err.FullyQualifiedErrorId | Should Be AmbiguousTypeReference + } + + It "cannot use in New-Object" { + $err = Get-RuntimeError @" +using module Foo +using module FooWithManifest +New-Object Foo +"@ + $err.FullyQualifiedErrorId | Should Be 'AmbiguousTypeReference,Microsoft.PowerShell.Commands.NewObjectCommand' + } + + It "cannot use [type] cast from string" { + $err = Get-RuntimeError @" +using module Foo +using module FooWithManifest +[type]"Foo" +"@ + $err.FullyQualifiedErrorId | Should Be AmbiguousTypeReference + } + } + + Context 'using use the latest version of module after Import-Module -Force' { + BeforeAll { + New-TestModule -Name Foo -Content 'class Foo { [string] GetModuleName() { return "Foo2" } }' + Import-Module Foo -Force + } + It "can use class from another module as a base class with using module" { + $moduleName = [scriptblock]::Create(@" +using module Foo +[Foo]::new().GetModuleName() +"@).Invoke() + + $moduleName | Should Be 'Foo2' + } + } + + Context 'Side by side' { + BeforeAll { + # Add side-by-side module + $newVersion = '3.4.5' + New-TestModule -Manifest -Name FooWithManifest -Content 'class Foo { [string] GetModuleName() { return "Foo230" } }' -Version '2.3.0' + New-TestModule -Manifest -Name FooWithManifest -Content 'class Foo { [string] GetModuleName() { return "Foo345" } }' -Version '3.4.5' -ModulePathPrefix 'Modules2' + } + + # 'using module' behavior must be aligned with Import-Module. + # Import-Module does the following: + # 1) find the first directory from $env:PSModulePath that contains the module + # 2) Import highest available version of the module + # In out case TestDrive:\Module is before TestDrive:\Modules2 and so 2.3.0 is the right version + It "uses the last module, if multiple versions are present" { + $foo = [scriptblock]::Create(@" +using module FooWithManifest +[Foo]::new() +"@).Invoke() + $foo.GetModuleName() | Should Be 'Foo230' + } + + It "uses right version, when RequiredModule=1.0 specified" { + $foo = [scriptblock]::Create(@" +using module @{ModuleName = 'FooWithManifest'; RequiredVersion = '1.0'} +[Foo]::new() +"@).Invoke() + $foo.GetModuleName() | Should Be 'FooWithManifest' + } + + It "uses right version, when RequiredModule=2.3.0 specified" { + $foo = [scriptblock]::Create(@" +using module @{ModuleName = 'FooWithManifest'; RequiredVersion = '2.3.0'} +[Foo]::new() +"@).Invoke() + $foo.GetModuleName() | Should Be 'Foo230' + } + + It "uses right version, when RequiredModule=3.4.5 specified" { + $foo = [scriptblock]::Create(@" +using module @{ModuleName = 'FooWithManifest'; RequiredVersion = '3.4.5'} +[Foo]::new() +"@).Invoke() + $foo.GetModuleName() | Should Be 'Foo345' + } + } + + Context 'Use module with runtime error' { + BeforeAll { + New-TestModule -Name ModuleWithRuntimeError -Content @' +class Foo { [string] GetModuleName() { return "ModuleWithRuntimeError" } } +throw 'error' +'@ + } + + It "handles runtime errors in imported module" { + $err = Get-RuntimeError @" +using module ModuleWithRuntimeError +[Foo]::new().GetModuleName() +"@ + + $err | Should Be 'error' + } + } + + Context 'shared InitialSessionState' { + + It 'can pick the right module' { + + $scriptToProcessPath = "${TestDrive}\toProcess.ps1" + Set-Content -Path $scriptToProcessPath -Value @' +using module Foo +function foo() +{ + [Foo]::new() +} +'@ + # resolve name to absolute path + $scriptToProcessPath = (get-childitem $scriptToProcessPath).FullName + $iss = [System.Management.Automation.Runspaces.initialsessionstate]::CreateDefault() + $iss.StartupScripts.Add($scriptToProcessPath) + + $ps = [powershell]::Create($iss) + $ps.AddCommand("foo").Invoke() | Should be Foo + $ps.Streams.Error | Should Be $null + + $ps1 = [powershell]::Create($iss) + $ps1.AddCommand("foo").Invoke() | Should be Foo + $ps1.Streams.Error | Should Be $null + + $ps.Commands.Clear() + $ps.Streams.Error.Clear() + $ps.AddScript(". foo").Invoke() | Should be Foo + $ps.Streams.Error | Should Be $null + } + } + + + # here we are back to normal $env:PSModulePath, but all modules are there + Context "Module by path" { + BeforeAll { + # this is a setup for Context "Module by path" + New-TestModule -Name FooForPaths -Content 'class Foo { [string] GetModuleName() { return "FooForPaths" } }' + $env:PSModulePath = $originalPSModulePath + + new-item -type directory -Force TestDrive:\FooRelativeConsumer + Set-Content -Path "${TestDrive}\FooRelativeConsumer\FooRelativeConsumer.ps1" -Value @' +using module ..\modules\FooForPaths +class Bar : Foo {} +[Bar]::new() +'@ + + Set-Content -Path "${TestDrive}\FooRelativeConsumerErr.ps1" -Value @' +using module FooForPaths +class Bar : Foo {} +[Bar]::new() +'@ + } + + It 'use non-modified PSModulePath' { + $env:PSModulePath | Should Be $originalPSModulePath + } + + It "can be accessed by relative path" { + $barObject = & TestDrive:\FooRelativeConsumer\FooRelativeConsumer.ps1 + $barObject.GetModuleName() | Should Be 'FooForPaths' + } + + It "cannot be accessed by relative path without .\ from a script" { + $err = Get-RuntimeError '& TestDrive:\FooRelativeConsumerErr.ps1' + $err.FullyQualifiedErrorId | Should Be ModuleNotFoundDuringParse + } + + It "can be accessed by absolute path" { + $resolvedTestDrivePath = Split-Path ((get-childitem TestDrive:\modules)[0].FullName) + $s = @" +using module $resolvedTestDrivePath\FooForPaths +[Foo]::new() +"@ + $err = Get-ParseResults $s + $err.Count | Should Be 0 + $barObject = [scriptblock]::Create($s).Invoke() + $barObject.GetModuleName() | Should Be 'FooForPaths' + } + + It "can be accessed by absolute path with file extension" { + $resolvedTestDrivePath = Split-Path ((get-childitem TestDrive:\modules)[0].FullName) + $barObject = [scriptblock]::Create(@" +using module $resolvedTestDrivePath\FooForPaths\FooForPaths.psm1 +[Foo]::new() +"@).Invoke() + $barObject.GetModuleName() | Should Be 'FooForPaths' + } + + It "can be accessed by relative path without file" { + # we should not be able to access .\FooForPaths without cd + $err = Get-RuntimeError @" +using module .\FooForPaths +[Foo]::new() +"@ + $err.FullyQualifiedErrorId | Should Be ModuleNotFoundDuringParse + + Push-Location TestDrive:\modules + try { + $barObject = [scriptblock]::Create(@" +using module .\FooForPaths +[Foo]::new() +"@).Invoke() + $barObject.GetModuleName() | Should Be 'FooForPaths' + } finally { + Pop-Location + } + } + + It "cannot be accessed by relative path without .\" { + Push-Location TestDrive:\modules + try { + $err = Get-RuntimeError @" +using module FooForPaths +[Foo]::new() +"@ + $err.FullyQualifiedErrorId | Should Be ModuleNotFoundDuringParse + } finally { + Pop-Location + } + } + } + + Context "module has non-terminating error handled with 'SilentlyContinue'" { + BeforeAll { + $testFile = Join-Path -Path $TestDrive -ChildPath "testmodule.psm1" + $content = @' +Get-Command -CommandType Application -Name NonExisting -ErrorAction SilentlyContinue +class TestClass { [string] GetName() { return "TestClass" } } +'@ + Set-Content -Path $testFile -Value $content -Force + } + AfterAll { + Remove-Module -Name testmodule -Force -ErrorAction SilentlyContinue + } + + It "'using module' should succeed" { + $result = [scriptblock]::Create(@" +using module $testFile +[TestClass]::new() +"@).Invoke() + $result.GetName() | Should Be "TestClass" + } + } +} + diff --git a/test/powershell/Language/Classes/scripting.enums.tests.ps1 b/test/powershell/Language/Classes/scripting.enums.tests.ps1 index 8da968cb9c1..23a5532e53f 100644 --- a/test/powershell/Language/Classes/scripting.enums.tests.ps1 +++ b/test/powershell/Language/Classes/scripting.enums.tests.ps1 @@ -1,91 +1,91 @@ -# -# Copyright (c) Microsoft Corporation, 2015 -# - -Describe 'enums' -Tags "CI" { - Context 'basic enums' { - enum E1 - { - e0 - e1 - e2 - } - - It "has correct value 0" { [E1]::e0 | Should Be ([E1]0) } - It "has correct value 1" { [E1]::e1 | Should Be ([E1]1) } - It "has correct value 2" { [E1]::e2 | Should Be ([E1]2) } - It "cast from string" { [E1]::e1 | Should Be 'e1' } - It "cast to string" { 'e2' | Should Be ([E1]::e2) } - } - - Context 'Basic enum with initial value' { - enum E2 - { - e0 - e1 = 5 - e2 - } - - It "has correct value 0" { [E2]::e0 | Should Be ([E2]0) } - It "has correct value 5" { [E2]::e1 | Should Be ([E2]5) } - It "has correct value 6" { [E2]::e2 | Should Be ([E2]6) } - It "cast from string" { [E2]::e1 | Should Be 'e1' } - It "cast to string" { 'e2' | Should Be ([E2]::e2) } - } - - Context 'Basic enum with initial value expression' { - enum E3 - { - e0 - e1 = 5 - e2 = [int]::MaxValue - e3 = 1 # This shouldn't be an error even though previous member was max int - } - - It "has correct value 0" { [E3]::e0 | Should Be ([E3]0) } - It "has correct value 5" { [E3]::e1 | Should Be ([E3]5) } - It "has correct value [int]::MaxValue" { [E3]::e2 | Should Be ([E3]([int]::MaxValue)) } - It "has correct value 1" { [E3]::e3 | Should Be ([E3]1) } - It "cast from string" { [E3]::e2 | Should Be 'e2' } - It "cast to string" { 'e3' | Should Be ([E3]::e3) } - } - - Context 'Enum with complicated initial value' { - enum E4 - { - e0 = [E5]::e0 + 2 - } - - enum E5 - { - e0 = [E6]::e0 + 2 - } - - # Don't add space after 'e0 ='! Fix #2543 - enum E6 - { - e0 =38 - } - - It 'E4 has correct value' { [E4]::e0 | Should Be ([E4]42) } - It 'E5 has correct value' { [E5]::e0 | Should Be ([E5]40) } - It 'E6 has correct value' { [E6]::e0 | Should Be ([E6]38) } - } -} - -Describe 'Basic enum errors' -Tags "CI" { - ShouldBeParseError 'enum' MissingNameAfterKeyword 4 - ShouldBeParseError 'enum foo' MissingTypeBody 8 - ShouldBeParseError 'enum foo {' MissingEndCurlyBrace 10 - ShouldBeParseError 'enum foo { x = }' ExpectedValueExpression 14 - ShouldBeParseError 'enum foo { x =' ExpectedValueExpression,MissingEndCurlyBrace 14,10 - ShouldBeParseError 'enum foo {} enum foo {}' MemberAlreadyDefined 12 - ShouldBeParseError 'enum foo { x; x }' MemberAlreadyDefined 14 -SkipAndCheckRuntimeError - ShouldBeParseError 'enum foo { X; x }' MemberAlreadyDefined 14 -SkipAndCheckRuntimeError - ShouldBeParseError 'enum foo1 { x = [foo2]::x } enum foo2 { x = [foo1]::x }' CycleInEnumInitializers,CycleInEnumInitializers 0,28 -SkipAndCheckRuntimeError - ShouldBeParseError 'enum foo { e = [int]::MaxValue; e2 }' EnumeratorValueTooLarge 33 -SkipAndCheckRuntimeError - ShouldBeParseError 'enum foo { e = [int]::MaxValue + 1 }' EnumeratorValueTooLarge 15 -SkipAndCheckRuntimeError - ShouldBeParseError 'enum foo { e = $foo }' EnumeratorValueMustBeConstant 15 -SkipAndCheckRuntimeError - ShouldBeParseError 'enum foo { e = "hello" }' CannotConvertValue 15 -SkipAndCheckRuntimeError - ShouldBeParseError 'enum foo { a;b;c;' MissingEndCurlyBrace 10 -} +# +# Copyright (c) Microsoft Corporation, 2015 +# + +Describe 'enums' -Tags "CI" { + Context 'basic enums' { + enum E1 + { + e0 + e1 + e2 + } + + It "has correct value 0" { [E1]::e0 | Should Be ([E1]0) } + It "has correct value 1" { [E1]::e1 | Should Be ([E1]1) } + It "has correct value 2" { [E1]::e2 | Should Be ([E1]2) } + It "cast from string" { [E1]::e1 | Should Be 'e1' } + It "cast to string" { 'e2' | Should Be ([E1]::e2) } + } + + Context 'Basic enum with initial value' { + enum E2 + { + e0 + e1 = 5 + e2 + } + + It "has correct value 0" { [E2]::e0 | Should Be ([E2]0) } + It "has correct value 5" { [E2]::e1 | Should Be ([E2]5) } + It "has correct value 6" { [E2]::e2 | Should Be ([E2]6) } + It "cast from string" { [E2]::e1 | Should Be 'e1' } + It "cast to string" { 'e2' | Should Be ([E2]::e2) } + } + + Context 'Basic enum with initial value expression' { + enum E3 + { + e0 + e1 = 5 + e2 = [int]::MaxValue + e3 = 1 # This shouldn't be an error even though previous member was max int + } + + It "has correct value 0" { [E3]::e0 | Should Be ([E3]0) } + It "has correct value 5" { [E3]::e1 | Should Be ([E3]5) } + It "has correct value [int]::MaxValue" { [E3]::e2 | Should Be ([E3]([int]::MaxValue)) } + It "has correct value 1" { [E3]::e3 | Should Be ([E3]1) } + It "cast from string" { [E3]::e2 | Should Be 'e2' } + It "cast to string" { 'e3' | Should Be ([E3]::e3) } + } + + Context 'Enum with complicated initial value' { + enum E4 + { + e0 = [E5]::e0 + 2 + } + + enum E5 + { + e0 = [E6]::e0 + 2 + } + + # Don't add space after 'e0 ='! Fix #2543 + enum E6 + { + e0 =38 + } + + It 'E4 has correct value' { [E4]::e0 | Should Be ([E4]42) } + It 'E5 has correct value' { [E5]::e0 | Should Be ([E5]40) } + It 'E6 has correct value' { [E6]::e0 | Should Be ([E6]38) } + } +} + +Describe 'Basic enum errors' -Tags "CI" { + ShouldBeParseError 'enum' MissingNameAfterKeyword 4 + ShouldBeParseError 'enum foo' MissingTypeBody 8 + ShouldBeParseError 'enum foo {' MissingEndCurlyBrace 10 + ShouldBeParseError 'enum foo { x = }' ExpectedValueExpression 14 + ShouldBeParseError 'enum foo { x =' ExpectedValueExpression,MissingEndCurlyBrace 14,10 + ShouldBeParseError 'enum foo {} enum foo {}' MemberAlreadyDefined 12 + ShouldBeParseError 'enum foo { x; x }' MemberAlreadyDefined 14 -SkipAndCheckRuntimeError + ShouldBeParseError 'enum foo { X; x }' MemberAlreadyDefined 14 -SkipAndCheckRuntimeError + ShouldBeParseError 'enum foo1 { x = [foo2]::x } enum foo2 { x = [foo1]::x }' CycleInEnumInitializers,CycleInEnumInitializers 0,28 -SkipAndCheckRuntimeError + ShouldBeParseError 'enum foo { e = [int]::MaxValue; e2 }' EnumeratorValueTooLarge 33 -SkipAndCheckRuntimeError + ShouldBeParseError 'enum foo { e = [int]::MaxValue + 1 }' EnumeratorValueTooLarge 15 -SkipAndCheckRuntimeError + ShouldBeParseError 'enum foo { e = $foo }' EnumeratorValueMustBeConstant 15 -SkipAndCheckRuntimeError + ShouldBeParseError 'enum foo { e = "hello" }' CannotConvertValue 15 -SkipAndCheckRuntimeError + ShouldBeParseError 'enum foo { a;b;c;' MissingEndCurlyBrace 10 +} diff --git a/test/powershell/Language/CompletionTestSupport.psm1 b/test/powershell/Language/CompletionTestSupport.psm1 index 148714ae559..a15b57a4cec 100644 --- a/test/powershell/Language/CompletionTestSupport.psm1 +++ b/test/powershell/Language/CompletionTestSupport.psm1 @@ -1,142 +1,142 @@ - -class CompletionResult -{ - [string]$CompletionText - [string]$ListItemText - [System.Management.Automation.CompletionResultType]$ResultType - [string]$ToolTip - [bool]$Found - - [bool] Equals($Other) - { - if ($Other -isnot [CompletionResult] -and - $Other -isnot [System.Management.Automation.CompletionResult]) - { - return $false - } - - # Comparison is intentionally fuzzy - CompletionText and ResultType must be specified - # but the other properties don't need to match if they aren't specified - - if ($this.CompletionText -cne $Other.CompletionText -or - $this.ResultType -ne $Other.ResultType) - { - return $false - } - - if ($this.ListItemText -cne $Other.ListItemText -and - ![string]::IsNullOrEmpty($this.ListItemText) -and ![string]::IsNullOrEmpty($Other.ListItemText)) - { - return $false - } - - if ($this.ToolTip -cne $Other.ToolTip -and - ![string]::IsNullOrEmpty($this.ToolTip) -and ![string]::IsNullOrEmpty($Other.ToolTip)) - { - return $false - } - - return $true - } -} - -class CompletionTestCase -{ - [string]$Description - [CompletionResult[]]$ExpectedResults - [string[]]$NotExpectedResults - [hashtable]$TestInput -} - -function Get-Completions -{ - [CmdletBinding()] - param([string]$InputScript, [int]$CursorColumn, $Options = $null) - - if (!$PSBoundParameters.ContainsKey('CursorColumn')) - { - $CursorColumn = $InputScript.IndexOf('<#CURSOR#>') - if ($CursorColumn -lt 0) - { - $CursorColumn = $InputScript.Length - } - else - { - $InputScript = $InputScript -replace '<#CURSOR#>','' - } - } - - $results = [System.Management.Automation.CommandCompletion]::CompleteInput( - <#inputScript#> $InputScript, - <#cursorColumn#> $CursorColumn, - <#options#> $Options) - - return $results -} - -function Get-CompletionTestCaseData -{ - param( - [Parameter(ValueFromPipeline)] - [hashtable[]]$Data) - - process - { - Write-Output ([CompletionTestCase[]]$Data) - } -} - -function Test-Completions -{ - param( - [Parameter(ValueFromPipeline)] - [CompletionTestCase[]]$TestCases, - [string] - $Description) - - process - { - foreach ($test in $TestCases) - { - Describe $test.Description -Tags "CI" { - $hash = $Test.TestInput - $results = Get-Completions @hash - - foreach ($expected in $test.ExpectedResults) - { - foreach ($result in $results.CompletionMatches) - { - - if ($expected.Equals($result)) - { - It "Checking for duplicates of: $($expected.CompletionText)" { - # We should only find 1 of each expected result - $expected.Found | Should Be $false - } - $expected.Found = $true - } - } - } - - foreach ($expected in $test.ExpectedResults) - { - It "Checking for presence of expected result: $($expected.CompletionText)" { - $expected.Found | Should Be $true - } - } - - foreach ($notExpected in $test.NotExpectedResults) - { - foreach ($result in $results.CompletionMatches) - { - It "Checking for results that should not be found: $notExpected" { - $result.CompletionText -cne $notExpected | Should Be $true - } - } - } - - } - } - } -} - + +class CompletionResult +{ + [string]$CompletionText + [string]$ListItemText + [System.Management.Automation.CompletionResultType]$ResultType + [string]$ToolTip + [bool]$Found + + [bool] Equals($Other) + { + if ($Other -isnot [CompletionResult] -and + $Other -isnot [System.Management.Automation.CompletionResult]) + { + return $false + } + + # Comparison is intentionally fuzzy - CompletionText and ResultType must be specified + # but the other properties don't need to match if they aren't specified + + if ($this.CompletionText -cne $Other.CompletionText -or + $this.ResultType -ne $Other.ResultType) + { + return $false + } + + if ($this.ListItemText -cne $Other.ListItemText -and + ![string]::IsNullOrEmpty($this.ListItemText) -and ![string]::IsNullOrEmpty($Other.ListItemText)) + { + return $false + } + + if ($this.ToolTip -cne $Other.ToolTip -and + ![string]::IsNullOrEmpty($this.ToolTip) -and ![string]::IsNullOrEmpty($Other.ToolTip)) + { + return $false + } + + return $true + } +} + +class CompletionTestCase +{ + [string]$Description + [CompletionResult[]]$ExpectedResults + [string[]]$NotExpectedResults + [hashtable]$TestInput +} + +function Get-Completions +{ + [CmdletBinding()] + param([string]$InputScript, [int]$CursorColumn, $Options = $null) + + if (!$PSBoundParameters.ContainsKey('CursorColumn')) + { + $CursorColumn = $InputScript.IndexOf('<#CURSOR#>') + if ($CursorColumn -lt 0) + { + $CursorColumn = $InputScript.Length + } + else + { + $InputScript = $InputScript -replace '<#CURSOR#>','' + } + } + + $results = [System.Management.Automation.CommandCompletion]::CompleteInput( + <#inputScript#> $InputScript, + <#cursorColumn#> $CursorColumn, + <#options#> $Options) + + return $results +} + +function Get-CompletionTestCaseData +{ + param( + [Parameter(ValueFromPipeline)] + [hashtable[]]$Data) + + process + { + Write-Output ([CompletionTestCase[]]$Data) + } +} + +function Test-Completions +{ + param( + [Parameter(ValueFromPipeline)] + [CompletionTestCase[]]$TestCases, + [string] + $Description) + + process + { + foreach ($test in $TestCases) + { + Describe $test.Description -Tags "CI" { + $hash = $Test.TestInput + $results = Get-Completions @hash + + foreach ($expected in $test.ExpectedResults) + { + foreach ($result in $results.CompletionMatches) + { + + if ($expected.Equals($result)) + { + It "Checking for duplicates of: $($expected.CompletionText)" { + # We should only find 1 of each expected result + $expected.Found | Should Be $false + } + $expected.Found = $true + } + } + } + + foreach ($expected in $test.ExpectedResults) + { + It "Checking for presence of expected result: $($expected.CompletionText)" { + $expected.Found | Should Be $true + } + } + + foreach ($notExpected in $test.NotExpectedResults) + { + foreach ($result in $results.CompletionMatches) + { + It "Checking for results that should not be found: $notExpected" { + $result.CompletionText -cne $notExpected | Should Be $true + } + } + } + + } + } + } +} + diff --git a/test/powershell/Language/Parser/Ast.Tests.ps1 b/test/powershell/Language/Parser/Ast.Tests.ps1 index 5e2047f075c..25ffd6d05a3 100644 --- a/test/powershell/Language/Parser/Ast.Tests.ps1 +++ b/test/powershell/Language/Parser/Ast.Tests.ps1 @@ -1,40 +1,40 @@ -using Namespace System.Management.Automation.Language -Describe "The SafeGetValue method on AST returns safe values" -Tags "CI" { - It "A hashtable is returned from a HashtableAst" { - $HashtableAstType = [HashtableAst] - $HtAst = { - @{ one = 1 } - }.ast.Find({$args[0] -is $HashtableAstType}, $true) - $HtAst | Should Not BeNullOrEmpty - $HtAst.SafeGetValue() | Should BeOfType "Hashtable" - } - It "An Array is returned from a LiteralArrayAst" { - $ArrayAstType = [ArrayLiteralAst] - $ArrayAst = { - @( 1,2,3,4) - }.ast.Find({$args[0] -is $ArrayAstType}, $true) - $ArrayAst | Should Not BeNullOrEmpty - ,$ArrayAst.SafeGetValue() | Should BeOfType "Object[]" - } - It "The proper error is returned when a variable is referenced" { - $ast = { $a }.Ast.Find({$args[0] -is "VariableExpressionAst"},$true) - try { - $ast.SafeGetValue() | out-null - throw "No Exception!" - } - catch { - $_.FullyQualifiedErrorId | Should be "InvalidOperationException" - $_.ToString() | Should Match '\$a' - } - } - It "A ScriptBlock AST fails with the proper error" { - try { - { 1 }.Ast.SafeGetValue() - throw "No Exception!" - } - catch { - $_.FullyQualifiedErrorId | Should be "InvalidOperationException" - } - } - -} +using Namespace System.Management.Automation.Language +Describe "The SafeGetValue method on AST returns safe values" -Tags "CI" { + It "A hashtable is returned from a HashtableAst" { + $HashtableAstType = [HashtableAst] + $HtAst = { + @{ one = 1 } + }.ast.Find({$args[0] -is $HashtableAstType}, $true) + $HtAst | Should Not BeNullOrEmpty + $HtAst.SafeGetValue() | Should BeOfType "Hashtable" + } + It "An Array is returned from a LiteralArrayAst" { + $ArrayAstType = [ArrayLiteralAst] + $ArrayAst = { + @( 1,2,3,4) + }.ast.Find({$args[0] -is $ArrayAstType}, $true) + $ArrayAst | Should Not BeNullOrEmpty + ,$ArrayAst.SafeGetValue() | Should BeOfType "Object[]" + } + It "The proper error is returned when a variable is referenced" { + $ast = { $a }.Ast.Find({$args[0] -is "VariableExpressionAst"},$true) + try { + $ast.SafeGetValue() | out-null + throw "No Exception!" + } + catch { + $_.FullyQualifiedErrorId | Should be "InvalidOperationException" + $_.ToString() | Should Match '\$a' + } + } + It "A ScriptBlock AST fails with the proper error" { + try { + { 1 }.Ast.SafeGetValue() + throw "No Exception!" + } + catch { + $_.FullyQualifiedErrorId | Should be "InvalidOperationException" + } + } + +} diff --git a/test/powershell/Language/Parser/AutomaticVariables.Tests.ps1 b/test/powershell/Language/Parser/AutomaticVariables.Tests.ps1 index b73d68dfabd..b3948430775 100644 --- a/test/powershell/Language/Parser/AutomaticVariables.Tests.ps1 +++ b/test/powershell/Language/Parser/AutomaticVariables.Tests.ps1 @@ -1,21 +1,21 @@ - -Describe 'Automatic variable $input' -Tags "CI" { - # Skip on hold for discussion on https://github.com/PowerShell/PowerShell/issues/1563 - # $input type in advanced functions - It '$input Type should be enumerator' -Skip { - function from_begin { [cmdletbinding()]param() begin { Write-Output -NoEnumerate $input } } - function from_process { [cmdletbinding()]param() process { Write-Output -NoEnumerate $input } } - function from_end { [cmdletbinding()]param() end { Write-Output -NoEnumerate $input } } - - (from_begin) -is [System.Collections.IEnumerator] | Should Be $true - (from_process) -is [System.Collections.IEnumerator] | Should Be $true - (from_end) -is [System.Collections.IEnumerator] | Should Be $true - } - - It 'Empty $input really is empty' { - & { @($input).Count } | Should Be 0 - & { [cmdletbinding()]param() begin { @($input).Count } } | Should Be 0 - & { [cmdletbinding()]param() process { @($input).Count } } | Should Be 0 - & { [cmdletbinding()]param() end { @($input).Count } } | Should Be 0 - } -} + +Describe 'Automatic variable $input' -Tags "CI" { + # Skip on hold for discussion on https://github.com/PowerShell/PowerShell/issues/1563 + # $input type in advanced functions + It '$input Type should be enumerator' -Skip { + function from_begin { [cmdletbinding()]param() begin { Write-Output -NoEnumerate $input } } + function from_process { [cmdletbinding()]param() process { Write-Output -NoEnumerate $input } } + function from_end { [cmdletbinding()]param() end { Write-Output -NoEnumerate $input } } + + (from_begin) -is [System.Collections.IEnumerator] | Should Be $true + (from_process) -is [System.Collections.IEnumerator] | Should Be $true + (from_end) -is [System.Collections.IEnumerator] | Should Be $true + } + + It 'Empty $input really is empty' { + & { @($input).Count } | Should Be 0 + & { [cmdletbinding()]param() begin { @($input).Count } } | Should Be 0 + & { [cmdletbinding()]param() process { @($input).Count } } | Should Be 0 + & { [cmdletbinding()]param() end { @($input).Count } } | Should Be 0 + } +} diff --git a/test/powershell/Language/Parser/BNotOperator.Tests.ps1 b/test/powershell/Language/Parser/BNotOperator.Tests.ps1 index dd956ac7a35..3c8c0f12f75 100644 --- a/test/powershell/Language/Parser/BNotOperator.Tests.ps1 +++ b/test/powershell/Language/Parser/BNotOperator.Tests.ps1 @@ -1,142 +1,142 @@ - - -$baseTypes = @{ - [SByte] = 'sbyte'; [Byte] = 'byte' - [Int16] = 'short'; [UInt16] = 'ushort' - [Int32] = 'int'; [UInt32] = 'uint' - [Int64] = 'long'; [UInt64] = 'ulong' -} - -$ns = [Guid]::NewGuid() -replace '-','' - -$typeDefinition = "namespace ns_$ns`n{" - -$enumTypeNames = foreach ($baseType in $baseTypes.Keys) -{ - $baseTypeName = $baseTypes[$baseType] - $typeDefinition += @" - public enum E_$baseTypeName : $baseTypeName - { - Min = $($baseType::MinValue), - MinPlus1 = $($baseType::MinValue + 1), - MaxMinus1 = $($baseType::MaxValue - 1), - Max = $($baseType::MaxValue) - } -"@ - - "ns_$ns.E_$baseTypeName" -} - -$typeDefinition += "`n}" - -Write-Verbose $typeDefinition -Add-Type $typeDefinition - -Describe "bnot on enums" -Tags "CI" { - foreach ($enumType in [type[]]$enumTypeNames) - { - Context $enumType.Name { - It "max - 1" { - $res = -bnot $enumType::MaxMinus1 - $res | Should Be $enumType::MinPlus1 - $res | Should BeOfType $enumType - } - - It "min + 1" { - $res = -bnot $enumType::MinPlus1 - $res | Should Be $enumType::MaxMinus1 - $res | Should BeOfType $enumType - } - - It "Max" { - $res = -bnot $enumType::Max - $res | Should Be $enumType::Min - $res | Should BeOfType $enumType - } - - It "Min" { - $res = -bnot $enumType::Min - $res | Should Be $enumType::Max - $res | Should BeOfType $enumType - } - } - } -} - -Describe "bnot on integral types" -Tags "CI" { - foreach ($baseType in $baseTypes.Keys) - { - Context $baseType.Name { - - $max = $baseType::MaxValue - $maxMinus1 = $max - 1 - $min = $baseType::MinValue - $minPlus1 = $min + 1 - - if ([System.Runtime.InteropServices.Marshal]::SizeOf([type]$baseType) -lt 4) - { - $expectedResultType = [int] - } - else - { - $expectedResultType = $baseType - } - - if ($baseType -eq [byte] -or $baseType -eq [uint16]) - { - # Because of type promotion rules, unsigned types smaller than int - # don't quite follow the pattern of "flip all the bits", so our - # tests are a little different. - It "max - 1" { - $res = -bnot $maxMinus1 - $res | Should Be (-bnot [int]$maxMinus1) - $res | Should BeOfType $expectedResultType - } - - It "min + 1" { - $res = -bnot $minPlus1 - $res | Should Be (-bnot [int]$minPlus1) - $res | Should BeOfType $expectedResultType - } - - It "max" { - $res = -bnot $max - $res | Should Be (-bnot [int]$max) - $res | Should BeOfType $expectedResultType - } - - It "min" { - $res = -bnot $min - $res | Should Be (-bnot [int]$min) - $res | Should BeOfType $expectedResultType - } - return - } - - It "max - 1" { - $res = -bnot $maxMinus1 - $res | Should Be $minPlus1 - $res | Should BeOfType $expectedResultType - } - - It "min + 1" { - $res = -bnot $minPlus1 - $res | Should Be $maxMinus1 - $res | Should BeOfType $expectedResultType - } - - It "max" { - $res = -bnot $max - $res | Should Be $min - $res | Should BeOfType $expectedResultType - } - - It "min" { - $res = -bnot $min - $res | Should Be $max - $res | Should BeOfType $expectedResultType - } - } - } -} - + + +$baseTypes = @{ + [SByte] = 'sbyte'; [Byte] = 'byte' + [Int16] = 'short'; [UInt16] = 'ushort' + [Int32] = 'int'; [UInt32] = 'uint' + [Int64] = 'long'; [UInt64] = 'ulong' +} + +$ns = [Guid]::NewGuid() -replace '-','' + +$typeDefinition = "namespace ns_$ns`n{" + +$enumTypeNames = foreach ($baseType in $baseTypes.Keys) +{ + $baseTypeName = $baseTypes[$baseType] + $typeDefinition += @" + public enum E_$baseTypeName : $baseTypeName + { + Min = $($baseType::MinValue), + MinPlus1 = $($baseType::MinValue + 1), + MaxMinus1 = $($baseType::MaxValue - 1), + Max = $($baseType::MaxValue) + } +"@ + + "ns_$ns.E_$baseTypeName" +} + +$typeDefinition += "`n}" + +Write-Verbose $typeDefinition +Add-Type $typeDefinition + +Describe "bnot on enums" -Tags "CI" { + foreach ($enumType in [type[]]$enumTypeNames) + { + Context $enumType.Name { + It "max - 1" { + $res = -bnot $enumType::MaxMinus1 + $res | Should Be $enumType::MinPlus1 + $res | Should BeOfType $enumType + } + + It "min + 1" { + $res = -bnot $enumType::MinPlus1 + $res | Should Be $enumType::MaxMinus1 + $res | Should BeOfType $enumType + } + + It "Max" { + $res = -bnot $enumType::Max + $res | Should Be $enumType::Min + $res | Should BeOfType $enumType + } + + It "Min" { + $res = -bnot $enumType::Min + $res | Should Be $enumType::Max + $res | Should BeOfType $enumType + } + } + } +} + +Describe "bnot on integral types" -Tags "CI" { + foreach ($baseType in $baseTypes.Keys) + { + Context $baseType.Name { + + $max = $baseType::MaxValue + $maxMinus1 = $max - 1 + $min = $baseType::MinValue + $minPlus1 = $min + 1 + + if ([System.Runtime.InteropServices.Marshal]::SizeOf([type]$baseType) -lt 4) + { + $expectedResultType = [int] + } + else + { + $expectedResultType = $baseType + } + + if ($baseType -eq [byte] -or $baseType -eq [uint16]) + { + # Because of type promotion rules, unsigned types smaller than int + # don't quite follow the pattern of "flip all the bits", so our + # tests are a little different. + It "max - 1" { + $res = -bnot $maxMinus1 + $res | Should Be (-bnot [int]$maxMinus1) + $res | Should BeOfType $expectedResultType + } + + It "min + 1" { + $res = -bnot $minPlus1 + $res | Should Be (-bnot [int]$minPlus1) + $res | Should BeOfType $expectedResultType + } + + It "max" { + $res = -bnot $max + $res | Should Be (-bnot [int]$max) + $res | Should BeOfType $expectedResultType + } + + It "min" { + $res = -bnot $min + $res | Should Be (-bnot [int]$min) + $res | Should BeOfType $expectedResultType + } + return + } + + It "max - 1" { + $res = -bnot $maxMinus1 + $res | Should Be $minPlus1 + $res | Should BeOfType $expectedResultType + } + + It "min + 1" { + $res = -bnot $minPlus1 + $res | Should Be $maxMinus1 + $res | Should BeOfType $expectedResultType + } + + It "max" { + $res = -bnot $max + $res | Should Be $min + $res | Should BeOfType $expectedResultType + } + + It "min" { + $res = -bnot $min + $res | Should Be $max + $res | Should BeOfType $expectedResultType + } + } + } +} + diff --git a/test/powershell/Language/Parser/Conversions.Tests.ps1 b/test/powershell/Language/Parser/Conversions.Tests.ps1 index fcc116bb448..b568a34fa5b 100644 --- a/test/powershell/Language/Parser/Conversions.Tests.ps1 +++ b/test/powershell/Language/Parser/Conversions.Tests.ps1 @@ -1,129 +1,129 @@ -Describe 'conversion syntax' -Tags "CI" { - # these test suite covers ([]).() syntax. - # it mixes two purposes: casting and super-class method calls. - - It 'converts array of single enum to bool' { - # This test relies on the fact that [ConsoleColor]::Black is 0 and all other values are non-zero - [bool]@([ConsoleColor]::Black) | Should Be $false - [bool]@([ConsoleColor]::Yellow) | Should Be $true - } - - It 'calls virtual method non-virtually' { - ([object]"abc").ToString() | Should Be "System.String" - - # generate random string to avoid JIT optimization - $r = [guid]::NewGuid().Guid - ([object]($r + "a")).Equals(($r + "a")) | Should Be $false - } - - It 'calls method on a super-type, when conversion syntax used' { - # This test relies on the fact that there are overloads (at least 2) for ToString method. - ([System.Management.Automation.ActionPreference]"Stop").ToString() | Should Be "Stop" - } - - Context "Cast object[] to more narrow generic collection" { - BeforeAll { - $testCases1 = @( - ## It's intentional to have 'Command' to be `{$result = ...}` and run it with `. $Command`. - ## This is because `$result = & {[List[int]]@(1,2)}` will cause the resulted List to be unraveled, - ## and in that case `$result` would be just an object array. - ## To prevent unraveling, Command needs to be `{, [List[int]]@(1,2)}`, but then the test case title - ## would become `, [List[int]]@(1,2)`, which is more confusing than `$result = [List[int]]@(1,2)`. - ## This is why the current form of `$result = [List[int]]@(1,2)` is used intentionally here. - - @{ Command = {$result = [Collections.Generic.List[int]]@(1)}; CollectionType = 'List`1'; ElementType = "Int32"; Elements = @(1) } - @{ Command = {$result = [Collections.Generic.List[int]]@(1,2)}; CollectionType = 'List`1'; ElementType = "Int32"; Elements = @(1,2) } - @{ Command = {$result = [Collections.Generic.List[int]]"4"}; CollectionType = 'List`1'; ElementType = "Int32"; Elements = @(4) } - @{ Command = {$result = [Collections.Generic.List[int]]@("4","5")}; CollectionType = 'List`1'; ElementType = "Int32"; Elements = @(4,5) } - - @{ Command = {$result = [Collections.Generic.List[string]]@(1)}; CollectionType = 'List`1'; ElementType = "String"; Elements = @("1") } - @{ Command = {$result = [Collections.Generic.List[string]]@(1,2)}; CollectionType = 'List`1'; ElementType = "String"; Elements = @("1","2") } - @{ Command = {$result = [Collections.Generic.List[string]]1}; CollectionType = 'List`1'; ElementType = "String"; Elements = @("1") } - @{ Command = {$result = [Collections.Generic.List[string]]@("4")}; CollectionType = 'List`1'; ElementType = "String"; Elements = @("4") } - - @{ Command = {$result = [System.Collections.ObjectModel.Collection[int]]@(1)}; CollectionType = 'Collection`1'; ElementType = "Int32"; Elements = @(1) } - @{ Command = {$result = [System.Collections.ObjectModel.Collection[int]]@(1,2)}; CollectionType = 'Collection`1'; ElementType = "Int32"; Elements = @(1,2) } - @{ Command = {$result = [System.Collections.ObjectModel.Collection[int]]"4"}; CollectionType = 'Collection`1'; ElementType = "Int32"; Elements = @(4) } - @{ Command = {$result = [System.Collections.ObjectModel.Collection[int]]@("4","5")}; CollectionType = 'Collection`1'; ElementType = "Int32"; Elements = @(4,5) } - - @{ Command = {$result = [Collections.Generic.List[System.IO.FileInfo]]@('TestFile')}; - CollectionType = 'List`1'; ElementType = "FileInfo"; Elements = @('TestFile') } - @{ Command = {$result = [Collections.Generic.List[System.IO.FileInfo]]@('TestFile1', 'TestFile2')}; - CollectionType = 'List`1'; ElementType = "FileInfo"; Elements = @('TestFile1', 'TestFile2') } - @{ Command = {$result = [Collections.Generic.List[System.IO.FileInfo]]'TestFile'}; - CollectionType = 'List`1'; ElementType = "FileInfo"; Elements = @('TestFile') } - ) - } - - It "" -TestCases $testCases1 { - param($Command, $CollectionType, $ElementType, $Elements) - - $result = $null - . $Command - - $result | Should Not BeNullOrEmpty - $result.GetType().Name | Should Be $CollectionType - - $genericArgs = $result.GetType().GetGenericArguments() - $genericArgs.Length | Should Be 1 - $genericArgs[0].Name | Should Be $ElementType - - $result.Count | Should Be $Elements.Length - $result -join ";" | Should Be ($Elements -join ";") - } - } -} - -Describe "Type resolution should prefer assemblies in powershell assembly cache" -Tags "Feature" { - - BeforeAll { - $cmdletCode = @' -namespace TestTypeResolution { - using System.Management.Automation; - [Cmdlet("Test", "TypeResolution")] - public class TestTypeResolutionCommand : PSCmdlet { - [Parameter()] - public string Name { get; set; } - - protected override void BeginProcessing() { - WriteObject(Name); - } - } - - public class TestTypeFoo { - public string Foo { get; set; } - } -} -'@ - $dupTypeCode = @' -namespace TestTypeResolution { - public class TestTypeFoo { - public string Bar { get; set; } - } -} -'@ - - $cmdletDllDir = Join-Path $TestDrive "cmdlet" - $dupTypeDllDir = Join-Path $TestDrive "dupType" - - $null = New-Item -Path $cmdletDllDir, $dupTypeDllDir -ItemType Directory -Force - - $cmdletDllPath = Join-Path $cmdletDllDir "TestCmdlet.dll" - $dupTypeDllPath = Join-Path $dupTypeDllDir "TestType.dll" - - Add-Type $cmdletCode -OutputAssembly $cmdletDllPath - Add-Type $dupTypeCode -OutputAssembly $dupTypeDllPath - - $powershell = Join-Path $PSHOME "powershell" - } - - It "validate Type resolution should prefer the assembly loaded by Import-Module" { - $command = @" - Add-Type -Path $dupTypeDllPath - Import-Module $cmdletDllPath - [TestTypeResolution.TestTypeFoo].Assembly.Location -"@ - $location = & $powershell -noprofile -command $command - $location | Should Be $cmdletDllPath - } -} +Describe 'conversion syntax' -Tags "CI" { + # these test suite covers ([]).() syntax. + # it mixes two purposes: casting and super-class method calls. + + It 'converts array of single enum to bool' { + # This test relies on the fact that [ConsoleColor]::Black is 0 and all other values are non-zero + [bool]@([ConsoleColor]::Black) | Should Be $false + [bool]@([ConsoleColor]::Yellow) | Should Be $true + } + + It 'calls virtual method non-virtually' { + ([object]"abc").ToString() | Should Be "System.String" + + # generate random string to avoid JIT optimization + $r = [guid]::NewGuid().Guid + ([object]($r + "a")).Equals(($r + "a")) | Should Be $false + } + + It 'calls method on a super-type, when conversion syntax used' { + # This test relies on the fact that there are overloads (at least 2) for ToString method. + ([System.Management.Automation.ActionPreference]"Stop").ToString() | Should Be "Stop" + } + + Context "Cast object[] to more narrow generic collection" { + BeforeAll { + $testCases1 = @( + ## It's intentional to have 'Command' to be `{$result = ...}` and run it with `. $Command`. + ## This is because `$result = & {[List[int]]@(1,2)}` will cause the resulted List to be unraveled, + ## and in that case `$result` would be just an object array. + ## To prevent unraveling, Command needs to be `{, [List[int]]@(1,2)}`, but then the test case title + ## would become `, [List[int]]@(1,2)`, which is more confusing than `$result = [List[int]]@(1,2)`. + ## This is why the current form of `$result = [List[int]]@(1,2)` is used intentionally here. + + @{ Command = {$result = [Collections.Generic.List[int]]@(1)}; CollectionType = 'List`1'; ElementType = "Int32"; Elements = @(1) } + @{ Command = {$result = [Collections.Generic.List[int]]@(1,2)}; CollectionType = 'List`1'; ElementType = "Int32"; Elements = @(1,2) } + @{ Command = {$result = [Collections.Generic.List[int]]"4"}; CollectionType = 'List`1'; ElementType = "Int32"; Elements = @(4) } + @{ Command = {$result = [Collections.Generic.List[int]]@("4","5")}; CollectionType = 'List`1'; ElementType = "Int32"; Elements = @(4,5) } + + @{ Command = {$result = [Collections.Generic.List[string]]@(1)}; CollectionType = 'List`1'; ElementType = "String"; Elements = @("1") } + @{ Command = {$result = [Collections.Generic.List[string]]@(1,2)}; CollectionType = 'List`1'; ElementType = "String"; Elements = @("1","2") } + @{ Command = {$result = [Collections.Generic.List[string]]1}; CollectionType = 'List`1'; ElementType = "String"; Elements = @("1") } + @{ Command = {$result = [Collections.Generic.List[string]]@("4")}; CollectionType = 'List`1'; ElementType = "String"; Elements = @("4") } + + @{ Command = {$result = [System.Collections.ObjectModel.Collection[int]]@(1)}; CollectionType = 'Collection`1'; ElementType = "Int32"; Elements = @(1) } + @{ Command = {$result = [System.Collections.ObjectModel.Collection[int]]@(1,2)}; CollectionType = 'Collection`1'; ElementType = "Int32"; Elements = @(1,2) } + @{ Command = {$result = [System.Collections.ObjectModel.Collection[int]]"4"}; CollectionType = 'Collection`1'; ElementType = "Int32"; Elements = @(4) } + @{ Command = {$result = [System.Collections.ObjectModel.Collection[int]]@("4","5")}; CollectionType = 'Collection`1'; ElementType = "Int32"; Elements = @(4,5) } + + @{ Command = {$result = [Collections.Generic.List[System.IO.FileInfo]]@('TestFile')}; + CollectionType = 'List`1'; ElementType = "FileInfo"; Elements = @('TestFile') } + @{ Command = {$result = [Collections.Generic.List[System.IO.FileInfo]]@('TestFile1', 'TestFile2')}; + CollectionType = 'List`1'; ElementType = "FileInfo"; Elements = @('TestFile1', 'TestFile2') } + @{ Command = {$result = [Collections.Generic.List[System.IO.FileInfo]]'TestFile'}; + CollectionType = 'List`1'; ElementType = "FileInfo"; Elements = @('TestFile') } + ) + } + + It "" -TestCases $testCases1 { + param($Command, $CollectionType, $ElementType, $Elements) + + $result = $null + . $Command + + $result | Should Not BeNullOrEmpty + $result.GetType().Name | Should Be $CollectionType + + $genericArgs = $result.GetType().GetGenericArguments() + $genericArgs.Length | Should Be 1 + $genericArgs[0].Name | Should Be $ElementType + + $result.Count | Should Be $Elements.Length + $result -join ";" | Should Be ($Elements -join ";") + } + } +} + +Describe "Type resolution should prefer assemblies in powershell assembly cache" -Tags "Feature" { + + BeforeAll { + $cmdletCode = @' +namespace TestTypeResolution { + using System.Management.Automation; + [Cmdlet("Test", "TypeResolution")] + public class TestTypeResolutionCommand : PSCmdlet { + [Parameter()] + public string Name { get; set; } + + protected override void BeginProcessing() { + WriteObject(Name); + } + } + + public class TestTypeFoo { + public string Foo { get; set; } + } +} +'@ + $dupTypeCode = @' +namespace TestTypeResolution { + public class TestTypeFoo { + public string Bar { get; set; } + } +} +'@ + + $cmdletDllDir = Join-Path $TestDrive "cmdlet" + $dupTypeDllDir = Join-Path $TestDrive "dupType" + + $null = New-Item -Path $cmdletDllDir, $dupTypeDllDir -ItemType Directory -Force + + $cmdletDllPath = Join-Path $cmdletDllDir "TestCmdlet.dll" + $dupTypeDllPath = Join-Path $dupTypeDllDir "TestType.dll" + + Add-Type $cmdletCode -OutputAssembly $cmdletDllPath + Add-Type $dupTypeCode -OutputAssembly $dupTypeDllPath + + $powershell = Join-Path $PSHOME "powershell" + } + + It "validate Type resolution should prefer the assembly loaded by Import-Module" { + $command = @" + Add-Type -Path $dupTypeDllPath + Import-Module $cmdletDllPath + [TestTypeResolution.TestTypeFoo].Assembly.Location +"@ + $location = & $powershell -noprofile -command $command + $location | Should Be $cmdletDllPath + } +} diff --git a/test/powershell/Language/Parser/ExtensibleCompletion.Tests.ps1 b/test/powershell/Language/Parser/ExtensibleCompletion.Tests.ps1 index 7082f91f352..c1c86ebd291 100644 --- a/test/powershell/Language/Parser/ExtensibleCompletion.Tests.ps1 +++ b/test/powershell/Language/Parser/ExtensibleCompletion.Tests.ps1 @@ -1,357 +1,357 @@ -<# - Much of this script belongs in a module, but we don't support importing classes yet. -#> -using namespace System.Management.Automation -using namespace System.Management.Automation.Language -using namespace System.Collections -using namespace System.Collections.Generic - -#region Testcase infrastructure - -class CompletionTestResult -{ - [string]$CompletionText - [string]$ListItemText - [CompletionResultType]$ResultType - [string]$ToolTip - [bool]$Found - - [bool] Equals($Other) - { - if ($Other -isnot [CompletionTestResult] -and - $Other -isnot [CompletionResult]) - { - return $false - } - - # Comparison is intentionally fuzzy - CompletionText and ResultType must be specified - # but the other properties don't need to match if they aren't specified - - if ($this.CompletionText -cne $Other.CompletionText -or - $this.ResultType -ne $Other.ResultType) - { - return $false - } - - if ($this.ListItemText -cne $Other.ListItemText -and - ![string]::IsNullOrEmpty($this.ListItemText) -and ![string]::IsNullOrEmpty($Other.ListItemText)) - { - return $false - } - - if ($this.ToolTip -cne $Other.ToolTip -and - ![string]::IsNullOrEmpty($this.ToolTip) -and ![string]::IsNullOrEmpty($Other.ToolTip)) - { - return $false - } - - return $true - } -} - -class CompletionTestCase -{ - [CompletionTestResult[]]$ExpectedResults - [string[]]$NotExpectedResults - [string]$TestInput -} - -function Get-Completions -{ - param([string]$inputScript, [int]$cursorColumn = $inputScript.Length) - - $results = [System.Management.Automation.CommandCompletion]::CompleteInput( - <#inputScript#> $inputScript, - <#cursorColumn#> $cursorColumn, - <#options#> $null) - - return $results -} - -function Get-CompletionTestCaseData -{ - param( - [Parameter(ValueFromPipeline)] - [hashtable[]]$Data) - - process - { - Write-Output ([CompletionTestCase[]]$Data) - } -} - -function Test-Completions -{ - param( - [Parameter(ValueFromPipeline)] - [CompletionTestCase[]]$TestCases) - - process - { - foreach ($test in $TestCases) - { - Context ("Command line: <" + $test.TestInput + ">") { - $results = Get-Completions $test.TestInput - foreach ($result in $results.CompletionMatches) - { - foreach ($expected in $test.ExpectedResults) - { - if ($expected.Equals($result)) - { - $expected.Found = $true - } - } - } - foreach ($expected in $test.ExpectedResults) - { - $skip = $false - if ( $expected.CompletionText -match "System.Management.Automation.PerformanceData|System.Management.Automation.Security" ) { $skip = $true } - It ($expected.CompletionText) -skip:$skip { - $expected.Found | Should Be $true - } - } - - foreach ($notExpected in $test.NotExpectedResults) - { - It "Not expected: $notExpected" { - foreach ($result in $results.CompletionMatches) - { - ($result.CompletionText -ceq $notExpected) | Should Be $False - } - } - } - } - } - } -} - -#endregion Testcase infrastructure - -function AlphaArgumentCompleter -{ - param( - [string] $CommandName, - [string] $parameterName, - [string] $wordToComplete, - [CommandAst] $commandAst, - [IDictionary] $fakeBoundParameters) - - $beta = $fakeBoundParameters['beta'] - $gamma = $fakeBoundParameters['Gamma'] - $result = "beta: $beta gamma: $gamma command: $commandName parameterName: $parameterName wordToComplete: $wordToComplete" - [CompletionResult]::new($result, $result, "ParameterValue", $result) -} - -class BetaArgumentCompleter : IArgumentCompleter -{ - [IEnumerable[CompletionResult]] CompleteArgument( - [string] $CommandName, - [string] $parameterName, - [string] $wordToComplete, - [CommandAst] $commandAst, - [IDictionary] $fakeBoundParameters) - { - $resultList = [List[CompletionResult]]::new() - - $alpha = $fakeBoundParameters['Alpha'] - $gamma = $fakeBoundParameters['Gamma'] - $result = "alpha: $alpha gamma: $gamma command: $commandName parameterName: $parameterName wordToComplete: $wordToComplete" - $resultList.Add([CompletionResult]::new($result, $result, "ParameterValue", $result)) - - return $resultList - } -} - -function TestFunction -{ - param( - [ArgumentCompleter({ AlphaArgumentCompleter @args })] - $Alpha, - [ArgumentCompleter([BetaArgumentCompleter])] - $Beta, - $Gamma - ) -} - -Describe "Script block based extensible completion" -Tags "CI" { - @{ - ExpectedResults = @( - @{CompletionText = "beta: 11 gamma: 22 command: TestFunction parameterName: Alpha wordToComplete: aa" - ResultType = "ParameterValue"}) - TestInput = 'TestFunction -Beta 11 -Gamma 22 -Alpha aa' - } | Get-CompletionTestCaseData | Test-Completions -} - -Describe "Test class based extensible completion" -Tags "CI" { - @{ - ExpectedResults = @( - @{CompletionText = "alpha: 42 gamma: 44 command: TestFunction parameterName: Beta wordToComplete: zz" - ResultType = "ParameterValue"}) - TestInput = 'TestFunction -Alpha 42 -Gamma 44 -Beta zz' - } | Get-CompletionTestCaseData | Test-Completions -} - -Describe "Test registration based extensible completion" -Tags "CI" { - Register-ArgumentCompleter -Command TestFunction -Parameter Gamma -ScriptBlock { - param( - [string] $CommandName, - [string] $parameterName, - [string] $wordToComplete, - [CommandAst] $commandAst, - [IDictionary] $fakeBoundParameters) - - $beta = $fakeBoundParameters['beta'] - $alpha = $fakeBoundParameters['alpha'] - $result = "beta: $beta alpha: $alpha command: $commandName parameterName: $parameterName wordToComplete: $wordToComplete" - [CompletionResult]::new($result, $result, "ParameterValue", $result) - } - - @{ - ExpectedResults = @( - @{CompletionText = "beta: bb alpha: aa command: TestFunction parameterName: Gamma wordToComplete: 42" - ResultType = "ParameterValue"}) - TestInput = 'TestFunction -Alpha aa -Beta bb -Gamma 42' - } | Get-CompletionTestCaseData | Test-Completions -} - -Describe "Test extensible completion of native commands" -Tags "CI" { - Register-ArgumentCompleter -Command netsh -Native -ScriptBlock { - [CompletionResult]::new('advfirewall', 'advfirewall', "ParameterValue", 'advfirewall') - [CompletionResult]::new('bridge', 'bridge', "ParameterValue", 'bridge') - } - - @{ - ExpectedResults = @( - @{CompletionText = "advfirewall"; ResultType = "ParameterValue"} - @{CompletionText = "bridge"; ResultType = "ParameterValue"} - ) - TestInput = 'netsh ' - } | Get-CompletionTestCaseData | Test-Completions -} - -Describe "Test completion of parameters for native commands" -Tags "CI" { - Register-ArgumentCompleter -Native -CommandName foo -ScriptBlock { - Param($wordToComplete) - - @("-dir", "-verbose", "-help", "-version") | - Where-Object { - $_ -match "$wordToComplete*" - } | - ForEach-Object { - [CompletionResult]::new($_, $_, [CompletionResultType]::ParameterName, $_) - } - } - - @{ - ExpectedResults = @( - @{CompletionText = "-version"; ResultType = "ParameterName"} - @{CompletionText = "-verbose"; ResultType = "ParameterName"} - @{CompletionText = "-dir"; ResultType = "ParameterName"} - @{CompletionText = "-help"; ResultType = "ParameterName"} - ) - TestInput = 'foo -' - } | Get-CompletionTestCaseData | Test-Completions - - @{ - ExpectedResults = @( - @{CompletionText = "-version"; ResultType = "ParameterName"} - @{CompletionText = "-verbose"; ResultType = "ParameterName"} - ) - TestInput = 'foo -v' - } | Get-CompletionTestCaseData | Test-Completions -} - -Describe "Test extensible completion of using namespace" -Tags "CI" { - @{ - ExpectedResults = @( - @{CompletionText = "System"; ResultType = "Namespace"} - ) - TestInput = 'Using namespace sys' - }, - @{ - ExpectedResults = @( - @{CompletionText = "System.Xml"; ResultType = "Namespace"} - @{CompletionText = "System.Data"; ResultType = "Namespace"} - @{CompletionText = "System.Collections"; ResultType = "Namespace"} - @{CompletionText = "System.IO"; ResultType = "Namespace"} - ) - TestInput = 'Using namespace system.' - }, - @{ - ExpectedResults = @( - @{CompletionText = "System.Management.Automation"; ResultType = "Namespace"} - ) - TestInput = 'Using namespace System.Management.Automati' - }, - @{ - ExpectedResults = @( - @{CompletionText = "System.Management.Automation.Host"; ResultType = "Namespace"} - @{CompletionText = "System.Management.Automation.Internal"; ResultType = "Namespace"} - @{CompletionText = "System.Management.Automation.Language"; ResultType = "Namespace"} - @{CompletionText = "System.Management.Automation.PerformanceData"; ResultType = "Namespace"} - @{CompletionText = "System.Management.Automation.Provider"; ResultType = "Namespace"} - @{CompletionText = "System.Management.Automation.Remoting"; ResultType = "Namespace"} - @{CompletionText = "System.Management.Automation.Runspaces"; ResultType = "Namespace"} - @{CompletionText = "System.Management.Automation.Security"; ResultType = "Namespace"} - ) - TestInput = 'using namespace System.Management.Automation.' - } | Get-CompletionTestCaseData | Test-Completions -} - -Describe "Type extensible completion of type after using namespace" -Tags "CI" { - @{ - ExpectedResults = @( - @{CompletionText = "IO.TextReader"; ResultType = "Type"} - ) - TestInput = 'using namespace System; [TextR' - }, - @{ - ExpectedResults = @( - @{CompletionText = "TextReader"; ResultType = "Type"} - ) - TestInput = 'using namespace System.IO; [TextR' - }, - @{ - ExpectedResults = @( - @{CompletionText = "Alias"; ResultType = "Type"} - ) - TestInput = '[aliasatt' - }, - @{ - ExpectedResults = @( - @{CompletionText = "string"; ResultType = "Type"} - ) - TestInput = 'using namespace System; [strin' - } | Get-CompletionTestCaseData | Test-Completions -} - -Describe "Additional type name completion tests" -Tags "CI" { - @{ - ExpectedResults = @( - @{CompletionText = "System"; ResultType = "Namespace"} - @{CompletionText = "System.Security.AccessControl.SystemAcl"; ResultType = "Type"} - ) - TestInput = 'Get-Command -ParameterType System' - }, - @{ - ExpectedResults = @( - @{CompletionText = "System.Action"; ResultType = "Type"} - @{CompletionText = "System.Activator"; ResultType = "Type"} - ) - TestInput = 'Get-Command -ParameterType System.' - }, - @{ - ExpectedResults = @( - @{CompletionText = "System.Collections.Generic.LinkedList"; ResultType = "Type"; ListItemText = "LinkedList<>"; ToolTip = "System.Collections.Generic.LinkedList[T]"} - @{CompletionText = "System.Collections.Generic.LinkedListNode"; ResultType = "Type"; ListItemText = "LinkedListNode<>"; ToolTip = "System.Collections.Generic.LinkedListNode[T]"} - @{CompletionText = "System.Collections.Generic.List"; ResultType = "Type"; ListItemText = "List<>"; ToolTip = "System.Collections.Generic.List[T]"} - ) - TestInput = 'Get-Command -ParameterType System.Collections.Generic.Li' - }, - @{ - ExpectedResults = @( - @{CompletionText = "System.Collections.Generic.Dictionary"; ResultType = "Type"; ListItemText = "Dictionary<>"; ToolTip = "System.Collections.Generic.Dictionary[T1, T2]"} - ) - TestInput = 'Get-Command -ParameterType System.Collections.Generic.Dic' - } | Get-CompletionTestCaseData | Test-Completions -} +<# + Much of this script belongs in a module, but we don't support importing classes yet. +#> +using namespace System.Management.Automation +using namespace System.Management.Automation.Language +using namespace System.Collections +using namespace System.Collections.Generic + +#region Testcase infrastructure + +class CompletionTestResult +{ + [string]$CompletionText + [string]$ListItemText + [CompletionResultType]$ResultType + [string]$ToolTip + [bool]$Found + + [bool] Equals($Other) + { + if ($Other -isnot [CompletionTestResult] -and + $Other -isnot [CompletionResult]) + { + return $false + } + + # Comparison is intentionally fuzzy - CompletionText and ResultType must be specified + # but the other properties don't need to match if they aren't specified + + if ($this.CompletionText -cne $Other.CompletionText -or + $this.ResultType -ne $Other.ResultType) + { + return $false + } + + if ($this.ListItemText -cne $Other.ListItemText -and + ![string]::IsNullOrEmpty($this.ListItemText) -and ![string]::IsNullOrEmpty($Other.ListItemText)) + { + return $false + } + + if ($this.ToolTip -cne $Other.ToolTip -and + ![string]::IsNullOrEmpty($this.ToolTip) -and ![string]::IsNullOrEmpty($Other.ToolTip)) + { + return $false + } + + return $true + } +} + +class CompletionTestCase +{ + [CompletionTestResult[]]$ExpectedResults + [string[]]$NotExpectedResults + [string]$TestInput +} + +function Get-Completions +{ + param([string]$inputScript, [int]$cursorColumn = $inputScript.Length) + + $results = [System.Management.Automation.CommandCompletion]::CompleteInput( + <#inputScript#> $inputScript, + <#cursorColumn#> $cursorColumn, + <#options#> $null) + + return $results +} + +function Get-CompletionTestCaseData +{ + param( + [Parameter(ValueFromPipeline)] + [hashtable[]]$Data) + + process + { + Write-Output ([CompletionTestCase[]]$Data) + } +} + +function Test-Completions +{ + param( + [Parameter(ValueFromPipeline)] + [CompletionTestCase[]]$TestCases) + + process + { + foreach ($test in $TestCases) + { + Context ("Command line: <" + $test.TestInput + ">") { + $results = Get-Completions $test.TestInput + foreach ($result in $results.CompletionMatches) + { + foreach ($expected in $test.ExpectedResults) + { + if ($expected.Equals($result)) + { + $expected.Found = $true + } + } + } + foreach ($expected in $test.ExpectedResults) + { + $skip = $false + if ( $expected.CompletionText -match "System.Management.Automation.PerformanceData|System.Management.Automation.Security" ) { $skip = $true } + It ($expected.CompletionText) -skip:$skip { + $expected.Found | Should Be $true + } + } + + foreach ($notExpected in $test.NotExpectedResults) + { + It "Not expected: $notExpected" { + foreach ($result in $results.CompletionMatches) + { + ($result.CompletionText -ceq $notExpected) | Should Be $False + } + } + } + } + } + } +} + +#endregion Testcase infrastructure + +function AlphaArgumentCompleter +{ + param( + [string] $CommandName, + [string] $parameterName, + [string] $wordToComplete, + [CommandAst] $commandAst, + [IDictionary] $fakeBoundParameters) + + $beta = $fakeBoundParameters['beta'] + $gamma = $fakeBoundParameters['Gamma'] + $result = "beta: $beta gamma: $gamma command: $commandName parameterName: $parameterName wordToComplete: $wordToComplete" + [CompletionResult]::new($result, $result, "ParameterValue", $result) +} + +class BetaArgumentCompleter : IArgumentCompleter +{ + [IEnumerable[CompletionResult]] CompleteArgument( + [string] $CommandName, + [string] $parameterName, + [string] $wordToComplete, + [CommandAst] $commandAst, + [IDictionary] $fakeBoundParameters) + { + $resultList = [List[CompletionResult]]::new() + + $alpha = $fakeBoundParameters['Alpha'] + $gamma = $fakeBoundParameters['Gamma'] + $result = "alpha: $alpha gamma: $gamma command: $commandName parameterName: $parameterName wordToComplete: $wordToComplete" + $resultList.Add([CompletionResult]::new($result, $result, "ParameterValue", $result)) + + return $resultList + } +} + +function TestFunction +{ + param( + [ArgumentCompleter({ AlphaArgumentCompleter @args })] + $Alpha, + [ArgumentCompleter([BetaArgumentCompleter])] + $Beta, + $Gamma + ) +} + +Describe "Script block based extensible completion" -Tags "CI" { + @{ + ExpectedResults = @( + @{CompletionText = "beta: 11 gamma: 22 command: TestFunction parameterName: Alpha wordToComplete: aa" + ResultType = "ParameterValue"}) + TestInput = 'TestFunction -Beta 11 -Gamma 22 -Alpha aa' + } | Get-CompletionTestCaseData | Test-Completions +} + +Describe "Test class based extensible completion" -Tags "CI" { + @{ + ExpectedResults = @( + @{CompletionText = "alpha: 42 gamma: 44 command: TestFunction parameterName: Beta wordToComplete: zz" + ResultType = "ParameterValue"}) + TestInput = 'TestFunction -Alpha 42 -Gamma 44 -Beta zz' + } | Get-CompletionTestCaseData | Test-Completions +} + +Describe "Test registration based extensible completion" -Tags "CI" { + Register-ArgumentCompleter -Command TestFunction -Parameter Gamma -ScriptBlock { + param( + [string] $CommandName, + [string] $parameterName, + [string] $wordToComplete, + [CommandAst] $commandAst, + [IDictionary] $fakeBoundParameters) + + $beta = $fakeBoundParameters['beta'] + $alpha = $fakeBoundParameters['alpha'] + $result = "beta: $beta alpha: $alpha command: $commandName parameterName: $parameterName wordToComplete: $wordToComplete" + [CompletionResult]::new($result, $result, "ParameterValue", $result) + } + + @{ + ExpectedResults = @( + @{CompletionText = "beta: bb alpha: aa command: TestFunction parameterName: Gamma wordToComplete: 42" + ResultType = "ParameterValue"}) + TestInput = 'TestFunction -Alpha aa -Beta bb -Gamma 42' + } | Get-CompletionTestCaseData | Test-Completions +} + +Describe "Test extensible completion of native commands" -Tags "CI" { + Register-ArgumentCompleter -Command netsh -Native -ScriptBlock { + [CompletionResult]::new('advfirewall', 'advfirewall', "ParameterValue", 'advfirewall') + [CompletionResult]::new('bridge', 'bridge', "ParameterValue", 'bridge') + } + + @{ + ExpectedResults = @( + @{CompletionText = "advfirewall"; ResultType = "ParameterValue"} + @{CompletionText = "bridge"; ResultType = "ParameterValue"} + ) + TestInput = 'netsh ' + } | Get-CompletionTestCaseData | Test-Completions +} + +Describe "Test completion of parameters for native commands" -Tags "CI" { + Register-ArgumentCompleter -Native -CommandName foo -ScriptBlock { + Param($wordToComplete) + + @("-dir", "-verbose", "-help", "-version") | + Where-Object { + $_ -match "$wordToComplete*" + } | + ForEach-Object { + [CompletionResult]::new($_, $_, [CompletionResultType]::ParameterName, $_) + } + } + + @{ + ExpectedResults = @( + @{CompletionText = "-version"; ResultType = "ParameterName"} + @{CompletionText = "-verbose"; ResultType = "ParameterName"} + @{CompletionText = "-dir"; ResultType = "ParameterName"} + @{CompletionText = "-help"; ResultType = "ParameterName"} + ) + TestInput = 'foo -' + } | Get-CompletionTestCaseData | Test-Completions + + @{ + ExpectedResults = @( + @{CompletionText = "-version"; ResultType = "ParameterName"} + @{CompletionText = "-verbose"; ResultType = "ParameterName"} + ) + TestInput = 'foo -v' + } | Get-CompletionTestCaseData | Test-Completions +} + +Describe "Test extensible completion of using namespace" -Tags "CI" { + @{ + ExpectedResults = @( + @{CompletionText = "System"; ResultType = "Namespace"} + ) + TestInput = 'Using namespace sys' + }, + @{ + ExpectedResults = @( + @{CompletionText = "System.Xml"; ResultType = "Namespace"} + @{CompletionText = "System.Data"; ResultType = "Namespace"} + @{CompletionText = "System.Collections"; ResultType = "Namespace"} + @{CompletionText = "System.IO"; ResultType = "Namespace"} + ) + TestInput = 'Using namespace system.' + }, + @{ + ExpectedResults = @( + @{CompletionText = "System.Management.Automation"; ResultType = "Namespace"} + ) + TestInput = 'Using namespace System.Management.Automati' + }, + @{ + ExpectedResults = @( + @{CompletionText = "System.Management.Automation.Host"; ResultType = "Namespace"} + @{CompletionText = "System.Management.Automation.Internal"; ResultType = "Namespace"} + @{CompletionText = "System.Management.Automation.Language"; ResultType = "Namespace"} + @{CompletionText = "System.Management.Automation.PerformanceData"; ResultType = "Namespace"} + @{CompletionText = "System.Management.Automation.Provider"; ResultType = "Namespace"} + @{CompletionText = "System.Management.Automation.Remoting"; ResultType = "Namespace"} + @{CompletionText = "System.Management.Automation.Runspaces"; ResultType = "Namespace"} + @{CompletionText = "System.Management.Automation.Security"; ResultType = "Namespace"} + ) + TestInput = 'using namespace System.Management.Automation.' + } | Get-CompletionTestCaseData | Test-Completions +} + +Describe "Type extensible completion of type after using namespace" -Tags "CI" { + @{ + ExpectedResults = @( + @{CompletionText = "IO.TextReader"; ResultType = "Type"} + ) + TestInput = 'using namespace System; [TextR' + }, + @{ + ExpectedResults = @( + @{CompletionText = "TextReader"; ResultType = "Type"} + ) + TestInput = 'using namespace System.IO; [TextR' + }, + @{ + ExpectedResults = @( + @{CompletionText = "Alias"; ResultType = "Type"} + ) + TestInput = '[aliasatt' + }, + @{ + ExpectedResults = @( + @{CompletionText = "string"; ResultType = "Type"} + ) + TestInput = 'using namespace System; [strin' + } | Get-CompletionTestCaseData | Test-Completions +} + +Describe "Additional type name completion tests" -Tags "CI" { + @{ + ExpectedResults = @( + @{CompletionText = "System"; ResultType = "Namespace"} + @{CompletionText = "System.Security.AccessControl.SystemAcl"; ResultType = "Type"} + ) + TestInput = 'Get-Command -ParameterType System' + }, + @{ + ExpectedResults = @( + @{CompletionText = "System.Action"; ResultType = "Type"} + @{CompletionText = "System.Activator"; ResultType = "Type"} + ) + TestInput = 'Get-Command -ParameterType System.' + }, + @{ + ExpectedResults = @( + @{CompletionText = "System.Collections.Generic.LinkedList"; ResultType = "Type"; ListItemText = "LinkedList<>"; ToolTip = "System.Collections.Generic.LinkedList[T]"} + @{CompletionText = "System.Collections.Generic.LinkedListNode"; ResultType = "Type"; ListItemText = "LinkedListNode<>"; ToolTip = "System.Collections.Generic.LinkedListNode[T]"} + @{CompletionText = "System.Collections.Generic.List"; ResultType = "Type"; ListItemText = "List<>"; ToolTip = "System.Collections.Generic.List[T]"} + ) + TestInput = 'Get-Command -ParameterType System.Collections.Generic.Li' + }, + @{ + ExpectedResults = @( + @{CompletionText = "System.Collections.Generic.Dictionary"; ResultType = "Type"; ListItemText = "Dictionary<>"; ToolTip = "System.Collections.Generic.Dictionary[T1, T2]"} + ) + TestInput = 'Get-Command -ParameterType System.Collections.Generic.Dic' + } | Get-CompletionTestCaseData | Test-Completions +} diff --git a/test/powershell/Language/Parser/LanguageAndParser.TestFollowup.Tests.ps1 b/test/powershell/Language/Parser/LanguageAndParser.TestFollowup.Tests.ps1 index a1bd1ac23c3..288f3c45cc9 100644 --- a/test/powershell/Language/Parser/LanguageAndParser.TestFollowup.Tests.ps1 +++ b/test/powershell/Language/Parser/LanguageAndParser.TestFollowup.Tests.ps1 @@ -1,219 +1,219 @@ -$powershellexe = (get-process -id $PID).mainmodule.filename - -Describe "Clone array" -Tags "CI" { - It "Cast in target expr" { - (([int[]](42)).clone()) | Should Be 42 - (([int[]](1..5)).clone()).Length | Should Be 5 - (([int[]](1..5)).clone()).GetType() | Should Be ([int[]]) - - } - It "Cast not in target expr" { - $e = [int[]](42) - $e.Clone() | Should Be 42 - $e = [int[]](1..5) - $e.Clone().Length | Should Be 5 - $e.Clone().GetType() | Should Be ([int[]]) - } -} - -Describe "Set fields through PSMemberInfo" -Tags "CI" { - Add-Type @" - public struct AStruct { public string s; } -"@ - - It "via cast" { - ([AStruct]@{s = "abc" }).s | Should Be "abc" - } - It "via new-object" { - (new-object AStruct -prop @{s="abc"}).s | Should Be "abc" - } - It "via PSObject" { - $x = [AStruct]::new() - $x.psobject.properties['s'].Value = 'abc' - $x.s | Should Be "abc" - } -} - -Describe "MSFT:3309783" -Tags "CI" { - - It "Run in another process" { - # For a reliable test, we must run this in a new process because an earlier binding in this process - # could mask the bug/fix. - & $powershellexe -noprofile -command "[psobject] | ForEach-Object FullName" | Should Be System.Management.Automation.PSObject - } - - It "Run in current process" { - # For good measure, do the same thing in this process - [psobject] | ForEach-Object FullName | Should Be System.Management.Automation.PSObject - } - - It "Pipe objects derived from PSObject" { - # Related - make sure we can still pipe objects derived from PSObject - class MyPsObj : PSObject - { - MyPsObj($obj) : base($obj) { } - [string] ToString() { - # Don't change access via .psobject, that was also a bug. - return "MyObj: " + $this.psobject.BaseObject - } - } - - [MyPsObj]::new("abc").psobject.ToString() | Should Be "MyObj: abc" - [MyPsObj]::new("def") | Out-String | ForEach-Object Trim | Should Be "MyObj: def" - } -} - -Describe "ScriptBlockAst.GetScriptBlock throws on error" -Tags "CI" { - - $e = $null - - It "with parse error" { - $ast = [System.Management.Automation.Language.Parser]::ParseInput('function ', [ref]$null, [ref]$e) - { $ast.GetScriptBlock() } | Should Throw - } - - - It "with semantic errors" { - $ast = [System.Management.Automation.Language.Parser]::ParseInput('function foo{param()begin{}end{[ref][ref]1}dynamicparam{}}', [ref]$null, [ref]$e) - - { $ast.GetScriptBlock() } | Should Throw - { $ast.EndBlock.Statements[0].Body.GetScriptBlock() } | Should Throw - } -} - -Describe "Hashtable key property syntax" -Tags "CI" { - $script = @' - # First create a hashtable wrapped in PSObject - $hash = New-Object hashtable - $key = [ConsoleColor]::Red - $null = $hash.$key - $hash = @{} - $hash.$key = 'Hello' - # works in PS 2,3,4. Fails in PS 5: - $hash.$key -'@ - - It "In current process" { - # Run in current process, but something that ran earlier could influence - # the result - Invoke-Expression $script | Should Be Hello - } - - It "In different process" { - # So also run in a fresh process - $bytes = [System.Text.Encoding]::Unicode.GetBytes($script) - & $powershellexe -noprofile -encodedCommand ([Convert]::ToBase64String($bytes)) | Should Be Hello - } -} - -Describe "Assign automatic variables" -Tags "CI" { - - $autos = '_', 'args', 'this', 'input', 'pscmdlet', 'psboundparameters', 'myinvocation', 'psscriptroot', 'pscommandpath' - - foreach ($auto in $autos) - { - It "Assign auto w/ invalid type constraint - $auto" { - { & ([ScriptBlock]::Create("[datetime]`$$auto = 1")) } | Should Throw $auto - { . ([ScriptBlock]::Create("[datetime]`$$auto = 1")) } | Should Throw $auto - { & ([ScriptBlock]::Create("[runspace]`$$auto = 1")) } | Should Throw $auto - { . ([ScriptBlock]::Create("[runspace]`$$auto = 1")) } | Should Throw $auto - { & ([ScriptBlock]::Create("[notexist]`$$auto = 1")) } | Should Throw $auto - { . ([ScriptBlock]::Create("[notexist]`$$auto = 1")) } | Should Throw $auto - } - } - - foreach ($auto in $autos) - { - It "Assign auto w/o type constraint - $auto" { - & ([ScriptBlock]::Create("`$$auto = 1; `$$auto")) | Should Be 1 - . ([ScriptBlock]::Create("`$$auto = 1; `$$auto")) | Should Be 1 - } - } - - It "Assign auto w/ correct type constraint" { - & { [object]$_ = 1; $_ } | Should Be 1 - & { [object[]]$args = 1; $args } | Should Be 1 - & { [object]$this = 1; $this } | Should Be 1 - & { [object]$input = 1; $input } | Should Be 1 - # Can't test PSCmdlet or PSBoundParameters, they use an internal type - & { [System.Management.Automation.InvocationInfo]$myInvocation = $myInvocation; $myInvocation.Line } | Should Match Automation.InvocationInfo - & { [string]$PSScriptRoot = 'abc'; $PSScriptRoot } | Should Be abc - & { [string]$PSCommandPath = 'abc'; $PSCommandPath } | Should Be abc - } -} - -Describe "Assign readonly/constant variables" -Tags "CI" { - - $testCase = @( - @{ sb_wo_conversion = { $? = 1 }; name = '$? = 1' } - @{ sb_wo_conversion = { $HOME = 1 }; name = '$HOME = 1' } - @{ sb_wo_conversion = { $PID = 1 }; name = '$PID = 1' } - ) - - It "Assign readonly/constant variables w/o type constraint - ''" -TestCases $testCase { - param($sb_wo_conversion) - { & $sb_wo_conversion } | Should Throw - { . $sb_wo_conversion } | Should Throw - } - - $testCase = @( - @{ sb_w_conversion = { [datetime]$? = 1 }; name = '[datetime]$? = 1' } - @{ sb_w_conversion = { [datetime]$HOME = 1 }; name = '[datetime]$HOME = 1' } - @{ sb_w_conversion = { [datetime]$PID = 1 }; name = '[datetime]$PID = 1' } - ) - - It "Assign readonly/constant variables w/ type constraint - ''" -TestCases $testCase { - param($sb_w_conversion) - { & $sb_w_conversion } | Should Throw - { . $sb_w_conversion } | Should Throw - } -} - -Describe "Attribute error position" -Tags "CI" { - It "Ambiguous overloads" { - try - { - & { - param( - [ValidateNotNull(1,2,3,4)] - $param - ) - } - throw "Should have thrown" - } - catch - { - $_.InvocationInfo.Line | Should Match ValidateNotNull - $_.FullyQualifiedErrorId | Should Be MethodCountCouldNotFindBest - } - } -} - -Describe "Multiple alias attributes" -Tags "CI" { - It "basic test" { - function foo { - param( - [alias('aa')] - [alias('bb')] - $cc - ) - $cc - } - - foo -aa 1 | Should Be 1 - foo -bb 2 | Should Be 2 - foo -cc 3 | Should Be 3 - } -} - -Describe "Members of System.Type" -Tags "CI" { - It "Members in public classes derived from System.Type should be found" { - class MyType : System.Collections.IEnumerable - { - [System.Collections.IEnumerator] GetEnumerator() { return $null } - } - - [type] | Get-Member ImplementedInterfaces | Should Be 'System.Collections.Generic.IEnumerable[type] ImplementedInterfaces {get;}' - [MyType].ImplementedInterfaces | Should Be System.Collections.IEnumerable - } -} +$powershellexe = (get-process -id $PID).mainmodule.filename + +Describe "Clone array" -Tags "CI" { + It "Cast in target expr" { + (([int[]](42)).clone()) | Should Be 42 + (([int[]](1..5)).clone()).Length | Should Be 5 + (([int[]](1..5)).clone()).GetType() | Should Be ([int[]]) + + } + It "Cast not in target expr" { + $e = [int[]](42) + $e.Clone() | Should Be 42 + $e = [int[]](1..5) + $e.Clone().Length | Should Be 5 + $e.Clone().GetType() | Should Be ([int[]]) + } +} + +Describe "Set fields through PSMemberInfo" -Tags "CI" { + Add-Type @" + public struct AStruct { public string s; } +"@ + + It "via cast" { + ([AStruct]@{s = "abc" }).s | Should Be "abc" + } + It "via new-object" { + (new-object AStruct -prop @{s="abc"}).s | Should Be "abc" + } + It "via PSObject" { + $x = [AStruct]::new() + $x.psobject.properties['s'].Value = 'abc' + $x.s | Should Be "abc" + } +} + +Describe "MSFT:3309783" -Tags "CI" { + + It "Run in another process" { + # For a reliable test, we must run this in a new process because an earlier binding in this process + # could mask the bug/fix. + & $powershellexe -noprofile -command "[psobject] | ForEach-Object FullName" | Should Be System.Management.Automation.PSObject + } + + It "Run in current process" { + # For good measure, do the same thing in this process + [psobject] | ForEach-Object FullName | Should Be System.Management.Automation.PSObject + } + + It "Pipe objects derived from PSObject" { + # Related - make sure we can still pipe objects derived from PSObject + class MyPsObj : PSObject + { + MyPsObj($obj) : base($obj) { } + [string] ToString() { + # Don't change access via .psobject, that was also a bug. + return "MyObj: " + $this.psobject.BaseObject + } + } + + [MyPsObj]::new("abc").psobject.ToString() | Should Be "MyObj: abc" + [MyPsObj]::new("def") | Out-String | ForEach-Object Trim | Should Be "MyObj: def" + } +} + +Describe "ScriptBlockAst.GetScriptBlock throws on error" -Tags "CI" { + + $e = $null + + It "with parse error" { + $ast = [System.Management.Automation.Language.Parser]::ParseInput('function ', [ref]$null, [ref]$e) + { $ast.GetScriptBlock() } | Should Throw + } + + + It "with semantic errors" { + $ast = [System.Management.Automation.Language.Parser]::ParseInput('function foo{param()begin{}end{[ref][ref]1}dynamicparam{}}', [ref]$null, [ref]$e) + + { $ast.GetScriptBlock() } | Should Throw + { $ast.EndBlock.Statements[0].Body.GetScriptBlock() } | Should Throw + } +} + +Describe "Hashtable key property syntax" -Tags "CI" { + $script = @' + # First create a hashtable wrapped in PSObject + $hash = New-Object hashtable + $key = [ConsoleColor]::Red + $null = $hash.$key + $hash = @{} + $hash.$key = 'Hello' + # works in PS 2,3,4. Fails in PS 5: + $hash.$key +'@ + + It "In current process" { + # Run in current process, but something that ran earlier could influence + # the result + Invoke-Expression $script | Should Be Hello + } + + It "In different process" { + # So also run in a fresh process + $bytes = [System.Text.Encoding]::Unicode.GetBytes($script) + & $powershellexe -noprofile -encodedCommand ([Convert]::ToBase64String($bytes)) | Should Be Hello + } +} + +Describe "Assign automatic variables" -Tags "CI" { + + $autos = '_', 'args', 'this', 'input', 'pscmdlet', 'psboundparameters', 'myinvocation', 'psscriptroot', 'pscommandpath' + + foreach ($auto in $autos) + { + It "Assign auto w/ invalid type constraint - $auto" { + { & ([ScriptBlock]::Create("[datetime]`$$auto = 1")) } | Should Throw $auto + { . ([ScriptBlock]::Create("[datetime]`$$auto = 1")) } | Should Throw $auto + { & ([ScriptBlock]::Create("[runspace]`$$auto = 1")) } | Should Throw $auto + { . ([ScriptBlock]::Create("[runspace]`$$auto = 1")) } | Should Throw $auto + { & ([ScriptBlock]::Create("[notexist]`$$auto = 1")) } | Should Throw $auto + { . ([ScriptBlock]::Create("[notexist]`$$auto = 1")) } | Should Throw $auto + } + } + + foreach ($auto in $autos) + { + It "Assign auto w/o type constraint - $auto" { + & ([ScriptBlock]::Create("`$$auto = 1; `$$auto")) | Should Be 1 + . ([ScriptBlock]::Create("`$$auto = 1; `$$auto")) | Should Be 1 + } + } + + It "Assign auto w/ correct type constraint" { + & { [object]$_ = 1; $_ } | Should Be 1 + & { [object[]]$args = 1; $args } | Should Be 1 + & { [object]$this = 1; $this } | Should Be 1 + & { [object]$input = 1; $input } | Should Be 1 + # Can't test PSCmdlet or PSBoundParameters, they use an internal type + & { [System.Management.Automation.InvocationInfo]$myInvocation = $myInvocation; $myInvocation.Line } | Should Match Automation.InvocationInfo + & { [string]$PSScriptRoot = 'abc'; $PSScriptRoot } | Should Be abc + & { [string]$PSCommandPath = 'abc'; $PSCommandPath } | Should Be abc + } +} + +Describe "Assign readonly/constant variables" -Tags "CI" { + + $testCase = @( + @{ sb_wo_conversion = { $? = 1 }; name = '$? = 1' } + @{ sb_wo_conversion = { $HOME = 1 }; name = '$HOME = 1' } + @{ sb_wo_conversion = { $PID = 1 }; name = '$PID = 1' } + ) + + It "Assign readonly/constant variables w/o type constraint - ''" -TestCases $testCase { + param($sb_wo_conversion) + { & $sb_wo_conversion } | Should Throw + { . $sb_wo_conversion } | Should Throw + } + + $testCase = @( + @{ sb_w_conversion = { [datetime]$? = 1 }; name = '[datetime]$? = 1' } + @{ sb_w_conversion = { [datetime]$HOME = 1 }; name = '[datetime]$HOME = 1' } + @{ sb_w_conversion = { [datetime]$PID = 1 }; name = '[datetime]$PID = 1' } + ) + + It "Assign readonly/constant variables w/ type constraint - ''" -TestCases $testCase { + param($sb_w_conversion) + { & $sb_w_conversion } | Should Throw + { . $sb_w_conversion } | Should Throw + } +} + +Describe "Attribute error position" -Tags "CI" { + It "Ambiguous overloads" { + try + { + & { + param( + [ValidateNotNull(1,2,3,4)] + $param + ) + } + throw "Should have thrown" + } + catch + { + $_.InvocationInfo.Line | Should Match ValidateNotNull + $_.FullyQualifiedErrorId | Should Be MethodCountCouldNotFindBest + } + } +} + +Describe "Multiple alias attributes" -Tags "CI" { + It "basic test" { + function foo { + param( + [alias('aa')] + [alias('bb')] + $cc + ) + $cc + } + + foo -aa 1 | Should Be 1 + foo -bb 2 | Should Be 2 + foo -cc 3 | Should Be 3 + } +} + +Describe "Members of System.Type" -Tags "CI" { + It "Members in public classes derived from System.Type should be found" { + class MyType : System.Collections.IEnumerable + { + [System.Collections.IEnumerator] GetEnumerator() { return $null } + } + + [type] | Get-Member ImplementedInterfaces | Should Be 'System.Collections.Generic.IEnumerable[type] ImplementedInterfaces {get;}' + [MyType].ImplementedInterfaces | Should Be System.Collections.IEnumerable + } +} diff --git a/test/powershell/Language/Parser/MethodInvocation.Tests.ps1 b/test/powershell/Language/Parser/MethodInvocation.Tests.ps1 index 1c560cd41b2..7ec310f8772 100644 --- a/test/powershell/Language/Parser/MethodInvocation.Tests.ps1 +++ b/test/powershell/Language/Parser/MethodInvocation.Tests.ps1 @@ -1,81 +1,81 @@ -if ( $IsCoreCLR ) { - return -} - -Describe "Interface inheritance with remoting proxies" -Tags "CI" { - $src = @" -using System; -using System.ServiceModel; - -namespace MSFT_716893 -{ - [ServiceContract] - public interface IInterface1 - { - [OperationContract]string BaseOperation(int i); - } - - [ServiceContract] - public interface IInterface2 : IInterface1 - { - [OperationContract(Name="op1")]string Operation(string a); - [OperationContract(Name="op2")]string Operation(string a, string b); - } - - public class ServiceImplementation : IInterface2 - { - public string Operation(string a) { return "1 - " + a; } - public string Operation(string a, string b) { return "2 - " + a + " " + b; } - public string BaseOperation(int i) { return "3 - " + i; } - } - - public static class Service - { - static ServiceHost serviceHost; - - public static void Init() - { - Uri baseAddress = new Uri("http://localhost:8080/service"); - serviceHost = new ServiceHost(typeof(ServiceImplementation), baseAddress); - serviceHost.Open(); - } - - public static IInterface1 GetProxy() - { - ChannelFactory factory = new ChannelFactory( - serviceHost.Description.Endpoints[0].Binding, - serviceHost.Description.Endpoints[0].Address); - return factory.CreateChannel(); - } - - public static void Close() - { - serviceHost.Close(); - } - } -} -"@ - - Add-Type -TypeDefinition $src -ReferencedAssemblies System.ServiceModel.dll - - BeforeEach { - [MSFT_716893.Service]::Init() - $proxy = [MSFT_716893.Service]::GetProxy() - } - - AfterEach { - [MSFT_716893.Service]::Close() - } - - It "Direct invocation" { - $proxy.Operation("a") | Should Be "1 - a" - $proxy.Operation("a", "b") | Should Be "2 - a b" - $proxy.BaseOperation(42) | Should Be "3 - 42" - } - - It "Invocation via method constraints" { - ([MSFT_716893.IInterface2]$proxy).Operation("c") | Should Be "1 - c" - ([MSFT_716893.IInterface2]$proxy).Operation("d", "e") | Should Be "2 - d e" - ([MSFT_716893.IInterface1]$proxy).BaseOperation(22) | Should Be "3 - 22" - } -} +if ( $IsCoreCLR ) { + return +} + +Describe "Interface inheritance with remoting proxies" -Tags "CI" { + $src = @" +using System; +using System.ServiceModel; + +namespace MSFT_716893 +{ + [ServiceContract] + public interface IInterface1 + { + [OperationContract]string BaseOperation(int i); + } + + [ServiceContract] + public interface IInterface2 : IInterface1 + { + [OperationContract(Name="op1")]string Operation(string a); + [OperationContract(Name="op2")]string Operation(string a, string b); + } + + public class ServiceImplementation : IInterface2 + { + public string Operation(string a) { return "1 - " + a; } + public string Operation(string a, string b) { return "2 - " + a + " " + b; } + public string BaseOperation(int i) { return "3 - " + i; } + } + + public static class Service + { + static ServiceHost serviceHost; + + public static void Init() + { + Uri baseAddress = new Uri("http://localhost:8080/service"); + serviceHost = new ServiceHost(typeof(ServiceImplementation), baseAddress); + serviceHost.Open(); + } + + public static IInterface1 GetProxy() + { + ChannelFactory factory = new ChannelFactory( + serviceHost.Description.Endpoints[0].Binding, + serviceHost.Description.Endpoints[0].Address); + return factory.CreateChannel(); + } + + public static void Close() + { + serviceHost.Close(); + } + } +} +"@ + + Add-Type -TypeDefinition $src -ReferencedAssemblies System.ServiceModel.dll + + BeforeEach { + [MSFT_716893.Service]::Init() + $proxy = [MSFT_716893.Service]::GetProxy() + } + + AfterEach { + [MSFT_716893.Service]::Close() + } + + It "Direct invocation" { + $proxy.Operation("a") | Should Be "1 - a" + $proxy.Operation("a", "b") | Should Be "2 - a b" + $proxy.BaseOperation(42) | Should Be "3 - 42" + } + + It "Invocation via method constraints" { + ([MSFT_716893.IInterface2]$proxy).Operation("c") | Should Be "1 - c" + ([MSFT_716893.IInterface2]$proxy).Operation("d", "e") | Should Be "2 - d e" + ([MSFT_716893.IInterface1]$proxy).BaseOperation(22) | Should Be "3 - 22" + } +} diff --git a/test/powershell/Language/Parser/ParameterBinding.Tests.ps1 b/test/powershell/Language/Parser/ParameterBinding.Tests.ps1 index a34b92b1631..b259b5b07cd 100644 --- a/test/powershell/Language/Parser/ParameterBinding.Tests.ps1 +++ b/test/powershell/Language/Parser/ParameterBinding.Tests.ps1 @@ -1,100 +1,100 @@ - -Describe 'Argument transformation attribute on optional argument with explicit $null' -Tags "CI" { - $tdefinition = @' - using System; - using System.Management.Automation; - using System.Reflection; - - namespace MSFT_1407291 - { - [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] - public class AddressTransformationAttribute : ArgumentTransformationAttribute - { - public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) - { - return (ulong) 42; - } - } - - [Cmdlet(VerbsLifecycle.Invoke, "CSharpCmdletTakesUInt64")] - [OutputType(typeof(System.String))] - public class Cmdlet1 : PSCmdlet - { - [Parameter(Mandatory = false)] - [AddressTransformation] - public ulong Address { get; set; } - - protected override void ProcessRecord() - { - WriteObject(Address); - } - } - - [Cmdlet(VerbsLifecycle.Invoke, "CSharpCmdletTakesObject")] - [OutputType(typeof(System.String))] - public class Cmdlet2 : PSCmdlet - { - [Parameter(Mandatory = false)] - [AddressTransformation] - public object Address { get; set; } - - protected override void ProcessRecord() - { - WriteObject(Address ?? "passed in null"); - } - } - } -'@ - $mod = Add-Type -PassThru -TypeDefinition $tdefinition - - Import-Module $mod[0].Assembly -ErrorVariable ErrorImportingModule - - function Invoke-ScriptFunctionTakesObject - { - param([MSFT_1407291.AddressTransformation()] - [Parameter(Mandatory = $false)] - [object]$Address = "passed in null") - - return $Address - } - - function Invoke-ScriptFunctionTakesUInt64 - { - param([MSFT_1407291.AddressTransformation()] - [Parameter(Mandatory = $false)] - [Uint64]$Address = 11) - - return $Address - } - - - It "There was no error importing the in-memory module" { - $ErrorImportingModule | Should Be $null - } - - It "Script function takes object" { - Invoke-ScriptFunctionTakesObject | Should Be 42 - } - It "Script function takes uint64" { - Invoke-ScriptFunctionTakesUInt64 | Should Be 42 - } - it "csharp cmdlet takes object" { - Invoke-CSharpCmdletTakesObject | Should Be "passed in null" - } - it "csharp cmdlet takes uint64" { - Invoke-CSharpCmdletTakesUInt64 | Should Be 0 - } - - it "script function takes object when parameter is null" { - Invoke-ScriptFunctionTakesObject -Address $null | Should Be 42 - } - it "script function takes unit64 when parameter is null" { - Invoke-ScriptFunctionTakesUInt64 -Address $null | Should Be 42 - } - it "script csharp cmdlet takes object when parameter is null" { - Invoke-CSharpCmdletTakesObject -Address $null | Should Be 42 - } - it "script csharp cmdlet takes uint64 when parameter is null" { - Invoke-CSharpCmdletTakesUInt64 -Address $null | Should Be 42 - } -} + +Describe 'Argument transformation attribute on optional argument with explicit $null' -Tags "CI" { + $tdefinition = @' + using System; + using System.Management.Automation; + using System.Reflection; + + namespace MSFT_1407291 + { + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] + public class AddressTransformationAttribute : ArgumentTransformationAttribute + { + public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) + { + return (ulong) 42; + } + } + + [Cmdlet(VerbsLifecycle.Invoke, "CSharpCmdletTakesUInt64")] + [OutputType(typeof(System.String))] + public class Cmdlet1 : PSCmdlet + { + [Parameter(Mandatory = false)] + [AddressTransformation] + public ulong Address { get; set; } + + protected override void ProcessRecord() + { + WriteObject(Address); + } + } + + [Cmdlet(VerbsLifecycle.Invoke, "CSharpCmdletTakesObject")] + [OutputType(typeof(System.String))] + public class Cmdlet2 : PSCmdlet + { + [Parameter(Mandatory = false)] + [AddressTransformation] + public object Address { get; set; } + + protected override void ProcessRecord() + { + WriteObject(Address ?? "passed in null"); + } + } + } +'@ + $mod = Add-Type -PassThru -TypeDefinition $tdefinition + + Import-Module $mod[0].Assembly -ErrorVariable ErrorImportingModule + + function Invoke-ScriptFunctionTakesObject + { + param([MSFT_1407291.AddressTransformation()] + [Parameter(Mandatory = $false)] + [object]$Address = "passed in null") + + return $Address + } + + function Invoke-ScriptFunctionTakesUInt64 + { + param([MSFT_1407291.AddressTransformation()] + [Parameter(Mandatory = $false)] + [Uint64]$Address = 11) + + return $Address + } + + + It "There was no error importing the in-memory module" { + $ErrorImportingModule | Should Be $null + } + + It "Script function takes object" { + Invoke-ScriptFunctionTakesObject | Should Be 42 + } + It "Script function takes uint64" { + Invoke-ScriptFunctionTakesUInt64 | Should Be 42 + } + it "csharp cmdlet takes object" { + Invoke-CSharpCmdletTakesObject | Should Be "passed in null" + } + it "csharp cmdlet takes uint64" { + Invoke-CSharpCmdletTakesUInt64 | Should Be 0 + } + + it "script function takes object when parameter is null" { + Invoke-ScriptFunctionTakesObject -Address $null | Should Be 42 + } + it "script function takes unit64 when parameter is null" { + Invoke-ScriptFunctionTakesUInt64 -Address $null | Should Be 42 + } + it "script csharp cmdlet takes object when parameter is null" { + Invoke-CSharpCmdletTakesObject -Address $null | Should Be 42 + } + it "script csharp cmdlet takes uint64 when parameter is null" { + Invoke-CSharpCmdletTakesUInt64 -Address $null | Should Be 42 + } +} diff --git a/test/powershell/Language/Parser/Parser.Tests.ps1 b/test/powershell/Language/Parser/Parser.Tests.ps1 index 460de2c1029..75ee09c2b45 100644 --- a/test/powershell/Language/Parser/Parser.Tests.ps1 +++ b/test/powershell/Language/Parser/Parser.Tests.ps1 @@ -1,918 +1,918 @@ -Describe "ParserTests (admin\monad\tests\monad\src\engine\core\ParserTests.cs)" -Tags "CI" { - BeforeAll { - $functionDefinitionFile = Join-Path -Path $TestDrive -ChildPath "functionDefinition.ps1" - $functionDefinition = @' - function testcmd-parserbvt - { - [CmdletBinding()] - param ( - [Parameter(Position = 0)] - [string] $Property1 = "unset", - - [Parameter(Position = 1)] - [string] $Property2 = "unset", - - [Parameter(Position = 2)] - [string] $Property3 = "unset", - - [Parameter()] - [ValidateSet("default","array","object","nestedobject","struct","mshobject","nulltostring")] - [string]$ReturnType = "default" - ) - - BEGIN {} - - PROCESS { - if ( ! $ReturnType ) { - $ReturnType = "default" - } - - switch ( $ReturnType ) - { - "default" { - $result = "$Property1;$Property2;$Property3" - break - } - "array" { - $result = 1,2,3 - break - } - "object" { - $result = new-object psobject - break - } - "nestedobject" { - $result = [pscustomobject]@{Name="John";Person=[pscustomobject]@{Name="John";Age=30}} - break - } - "struct" { - $result = [pscustomobject]@{Name="John";Age=30} - break - } - "mshobject" { - $result = new-object psobject - break - } - "nulltostring" { - $result = $null - break - } - default { - throw ([invalidoperationexception]::new("ReturnType parameter wasn't of any Expected value!")) - break - } - } - return $result - } - - END {} - } -'@ - $functionDefinition>$functionDefinitionFile - - $PowerShell = [powershell]::Create() - $PowerShell.AddScript(". $functionDefinitionFile").Invoke() - $PowerShell.Commands.Clear() - function ExecuteCommand { - param ([string]$command) - try { - $PowerShell.AddScript($command).Invoke() - } - finally { - $PowerShell.Commands.Clear() - } - } - } - BeforeEach { - $testfile = Join-Path -Path $TestDrive -ChildPath "testfile.ps1" - $shellfile = Join-Path -Path $TestDrive -ChildPath "testfile.cmd" - $testfolder1 = Join-Path -Path $TestDrive -ChildPath "dir1" - $testfolder2 = Join-Path -Path $testfolder1 -ChildPath "dir2" - if(-not(Test-Path $testfolder1)) - { - New-Item $testfolder1 -Type Directory - } - if(-not(Test-Path $testfolder2)) - { - New-Item $testfolder2 -Type Directory - } - $testdirfile1 = Join-Path -Path $testfolder2 -ChildPath "testdirfile1.txt" - $testdirfile2 = Join-Path -Path $testfolder2 -ChildPath "testdirfile2.txt" - "">$testdirfile1 - "">$testdirfile2 - } - AfterEach { - if(Test-Path $testfile) - { - Remove-Item $testfile - } - if(Test-Path $shellfile) - { - Remove-Item $shellfile - } - if(Test-Path $testdirfile1) - { - Remove-Item $testdirfile1 - } - if(Test-Path $testdirfile2) - { - Remove-Item $testdirfile2 - } - if(Test-Path $testfolder2) - { - Remove-Item $testfolder2 - } - if(Test-Path $testfolder1) - { - Remove-Item $testfolder1 - } - } - - AfterAll { - if(Test-Path $functionDefinitionFile) - { - Remove-Item $functionDefinitionFile - } - } - - It "Throws a syntax error when parsing a string without a closing quote. (line 164)" { - try { - ExecuteCommand '"This is a test' - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | Should be "IncompleteParseException" - } - } - - It "Throws an error if an open parenthesis is not closed (line 176)" { - try { - ExecuteCommand "(" - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | should be "IncompleteParseException" - } - } - - It "Throws an exception if the the first statement starts with an empty pipe element (line 188)" { - try { - ExecuteCommand "| get-location" - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | should be "ParseException" - } - } - - It "Throws an CommandNotFoundException exception if using a label in front of an if statement is not allowed. (line 225)"{ - $PowerShell.Streams.Error.Clear() - ExecuteCommand ":foo if ($x -eq 3) { 1 }" - $PowerShell.HadErrors | should be $true - $PowerShell.Streams.Error.FullyQualifiedErrorId | should be "CommandNotFoundException" - } - - It "Pipe an expression into a value expression. (line 237)" { - try { - ExecuteCommand "testcmd-parserbvt | 3" - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | should be "ParseException" - } - - try { - ExecuteCommand "testcmd-parserbvt | $(1 + 1)" - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | should be "ParseException" - } - - try { - ExecuteCommand "testcmd-parserbvt | 'abc'" - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | should be "ParseException" - } - } - - It "Throws when you pipe into a value expression (line 238)" { - foreach($command in "1;2;3|3",'1;2;3|$(1+1)',"1;2;3|'abc'") { - try { - ExecuteCommand $command - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | Should be "ParseException" - } - } - } - - It "Throws an incomplete parse exception when a comma follows an expression (line 247)" { - try { - ExecuteCommand "(1+ 1)," - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | Should be "IncompleteParseException" - } - } - - - It "Test that invoke has a higher precedence for a script than for an executable. (line 279)" { - "1">$testfile - $result = ExecuteCommand ". $testfile" - $result | should be 1 - } - - It "This test will check that a path is correctly interpreted when using '..' and '.' (line 364)" { - $result = ExecuteCommand "set-location $TestDrive; get-childitem dir1\.\.\.\..\dir1\.\dir2\..\..\dir1\.\dir2" - $result.Count | should be 2 - $result[0].Name | should be "testdirfile1.txt" - $result[1].Name | should be "testdirfile2.txt" - } - - It "This test will check that the parser can handle a mix of forward slashes and back slashes in the path (line 417)" { - $result = ExecuteCommand "get-childitem $TestDrive/dir1/./.\.\../dir1/.\dir2\../..\dir1\.\dir2" - $result.Count | should be 2 - $result[0].Name | should be "testdirfile1.txt" - $result[1].Name | should be "testdirfile2.txt" - } - - It "This test checks that the asterisk globs as expected. (line 545)" { - $result = ExecuteCommand "get-childitem $TestDrive/dir1\dir2\*.txt" - $result.Count | should be 2 - $result[0].Name | should be "testdirfile1.txt" - $result[1].Name | should be "testdirfile2.txt" - } - - It "This test checks that we can use a range for globbing: [1-2] (line 557)" { - $result = ExecuteCommand "get-childitem $TestDrive/dir1\dir2\testdirfile[1-2].txt" - $result.Count | should be 2 - $result[0].Name | should be "testdirfile1.txt" - $result[1].Name | should be "testdirfile2.txt" - } - - It "This test will check that escaping the $ sigil inside single quotes simply returns the $ character. (line 583)" { - $result = ExecuteCommand "'`$'" - $result | should be "`$" - } - - It "Test that escaping a space just returns that space. (line 593)" { - $result = ExecuteCommand '"foo` bar"' - $result | should be "foo bar" - } - - It "Test that escaping the character 'e' returns the ESC character (0x1b)." { - $result = ExecuteCommand '"`e"' - $result | should be ([char]0x1b) - } - - Context "Test Unicode escape sequences." { - # These tests require the file to be saved with a BOM. Unfortunately when this UTF8 file is read by - # PowerShell without a BOM, the file is incorrectly interpreted as ASCII. - It 'Test that the bracketed Unicode escape sequence `u{0} returns minimum char.' { - $result = ExecuteCommand '"`u{0}"' - [int]$result[0] | should be 0 - } - - It 'Test that the bracketed Unicode escape sequence `u{10FFFF} returns maximum surrogate char pair.' { - $result = ExecuteCommand '"`u{10FFFF}"' - [int]$result[0] | should be 0xDBFF # max value for high surrogate of surrogate pair - [int]$result[1] | should be 0xDFFF # max value for low surrogate of surrogate pair - } - - It 'Test that the bracketed Unicode escape sequence `u{a9} returns the © character.' { - $result = ExecuteCommand '"`u{a9}"' - $result | should be '©' - } - - It 'Test that Unicode escape sequence `u{2195} in string returns the ↕ character.' { - $result = ExecuteCommand '"foo`u{2195}abc"' - $result | should be "foo↕abc" - } - - It 'Test that the bracketed Unicode escape sequence `u{1f44d} returns surrogate pair for emoji 👍 character.' { - $result = ExecuteCommand '"`u{1f44d}"' - $result | should be "👍" - } - - It 'Test that Unicode escape sequence `u{2195} in here string returns the ↕ character.' { - $result = ExecuteCommand ("@`"`n`n" + 'foo`u{2195}abc' + "`n`n`"@") - $result | should be "`nfoo↕abc`n" - } - - It 'Test that Unicode escape sequence in single quoted is not processed.' { - $result = ExecuteCommand '''foo`u{2195}abc''' - $result | should be 'foo`u{2195}abc' - } - - It 'Test that Unicode escape sequence in single quoted here string is not processed.' { - $result = ExecuteCommand @" -@' - -foo``u{2195}abc - -'@ -"@ - $result | should be "`r`nfoo``u{2195}abc`r`n" - } - - It "Test that two consecutive Unicode escape sequences are tokenized correctly." { - $result = ExecuteCommand '"`u{007b}`u{007d}"' - $result | should be '{}' - } - - It "Test that a Unicode escape sequence can be used in a command name." { - function xyzzy`u{2195}($p) {$p} - $cmd = Get-Command xyzzy`u{2195} -ErrorAction SilentlyContinue - $cmd | should not BeNullOrEmpty - $cmd.Name | should be 'xyzzy↕' - xyzzy`u{2195} 42 | should be 42 - } - - It "Test that a Unicode escape sequence can be used in a variable name." { - ${fooxyzzy`u{2195}} = 42 - $var = Get-Variable -Name fooxyzzy* -ErrorAction SilentlyContinue - $var | should not BeNullOrEmpty - $var.Name | should be "fooxyzzy↕" - $var.Value | should be 42 - } - - It "Test that a Unicode escape sequence can be used in an argument." { - Write-Output `u{a9}` Acme` Inc | should be "© Acme Inc" - } - } - - It "Test that escaping any character with no special meaning just returns that char. (line 602)" { - $result = ExecuteCommand '"fo`obar"' - $result | should be "foobar" - } - - Context "Test that we support all of the C# escape sequences. We use the ` instead of \. (line 613)" { - # the first two sequences are tricky, because we need to provide something to - # execute without causing an incomplete parse error - $tests = @{ sequence = "write-output ""`'"""; expected = ([char]39) }, - @{ sequence = 'write-output "`""'; expected = ([char]34) }, - # this is a string, of 2 "\", the initial backtick should essentially be ignored - @{ sequence = '"`\\"'; expected = '\\' }, - # control sequences - @{ sequence = '"`0"'; expected = ([char]0) }, # null - @{ sequence = '"`a"'; expected = ([char]7) }, - @{ sequence = '"`b"'; expected = ([char]8) }, # backspace - @{ sequence = '"`f"'; expected = ([char]12) }, # form - @{ sequence = '"`n"'; expected = ([char]10) }, # newline - @{ sequence = '"`r"'; expected = ([char]13) }, # return - @{ sequence = '"`t"'; expected = ([char]9) }, # tab - @{ sequence = '"`v"'; expected = ([char]11) } - It "C# escape sequence is supported using `` instead of \. (line 613)" -TestCases $tests { - param ( $sequence, $expected ) - $result = ExecuteCommand $sequence - $result | should be $expected - } - } - - - It "This test checks that array substitution occurs inside double quotes. (line 646)" { - $result = ExecuteCommand '$MyArray = "a","b";"Hello $MyArray"' - $result | should be "Hello a b" - } - - It "This tests declaring an array in nested variable tables. (line 761)" { - $result = ExecuteCommand "`$Variable:vtbl1:vtbl2:b=@(5,6);`$Variable:vtbl1:vtbl2:b" - $result.Count | should be 2 - $result[0] | should be 5 - $result[1] | should be 6 - } - - It "Test a simple multiple assignment. (line 773)" { - $result = ExecuteCommand '$one,$two = 1,2,3; "One = $one"; "Two = $two"' - $result.Count | should be 2 - $result[0] | should be "One = 1" - $result[1] | should be "Two = 2 3" - } - - It "Tests script, global and local scopes from a function inside a script. (line 824)" { - "`$var = 'script';function func { `$var; `$var = 'local'; `$local:var; `$script:var; `$global:var };func;`$var;">$testfile - ExecuteCommand "`$var = 'global'" - $result = ExecuteCommand "$testfile" - $result.Count | should be 5 - $result[0] | should be "script" - $result[1] | should be "local" - $result[2] | should be "script" - $result[3] | should be "global" - $result[4] | should be "script" - } - - It "Use break inside of a loop that is inside another loop. (line 945)" { - $commands = " while (1) { 1; while(1) { 2; break; 3; }; 4; break; 5; } ", - " for (;;) { 1; for(;;) { 2; break; 3; }; 4; break; 5; } ", - " foreach(`$a in 1,2,3) { 1; foreach( `$b in 1,2,3 ) { 2; break; 3; }; 4; break; 5; } " - $results = "1", "2", "4" - $i = 0 - for(;$i -lt $commands.Count;$i++) - { - $result = ExecuteCommand $commands[$i] - $result | should be $results - } - } - - It "Use break in two loops with same label. (line 967)" { - $commands = " :foo while (1) { 1; :foo while(1) { 2; break foo; 3; }; 4; break; 5; } ", - " :foo for (;;) { 1; :foo for(;;) { 2; break foo; 3; }; 4; break; 5; } ", - " :foo foreach(`$a in 1,2,3) { 1; :foo foreach( `$b in 1,2,3 ) { 2; break foo; 3; }; 4; break; 5; } " - $results = "1", "2", "4" - $i = 0 - for(;$i -lt $commands.Count;$i++) - { - $result = ExecuteCommand $commands[$i] - $result | should be $results - } - } - - It "Try continue inside of different loop statements. (line 1039)" { - $commands = " `$a = 0; while (`$a -lt 2) { `$a; `$a += 1; continue; 2; } ", - " for (`$a = 0;`$a -lt 2; `$a += 1) { 9; continue; 3; } ", - " foreach(`$a in 0,1) { `$a; continue; 2; } " - $result = ExecuteCommand $commands[0] - $result | should be "0", "1" - $result = ExecuteCommand $commands[1] - $result | should be "9", "9" - $result = ExecuteCommand $commands[2] - $result | should be "0", "1" - } - - It "Use a label to continue an inner loop. (line 1059)" { - $commands = " `$x = 0; while (`$x -lt 1) { `$x += 1; `$x; `$a = 0; :foo while(`$a -lt 2) { `$a += 1; `$a; continue foo; 3; }; 4; continue; 5; } ", - " for (`$x = 0;`$x -lt 1;`$x += 1) { 1; :foo for(`$a = 0; `$a -lt 2; `$a += 1) { `$a; continue foo; 3; }; 4; continue; 5; } ", - " foreach(`$a in 1) { 1; :foo foreach( `$b in 1,2 ) { `$b; continue foo; 3; }; 4; continue; 5; } " - $result = ExecuteCommand $commands[0] - $result | should be "1", "1", "2", "4" - $result = ExecuteCommand $commands[1] - $result | should be "1", "0", "1", "4" - $result = ExecuteCommand $commands[2] - $result | should be "1", "1", "2", "4" - } - - It "Use continue with a label on a nested loop. (line 1059)" { - $commands = " `$x = 0; :foo while (`$x -lt 2) { `$x; `$x += 1; :bar while(1) { 2; continue foo; 3; }; 4; continue; 5; } ", - " :foo for (`$x = 0;`$x -lt 2;`$x += 1) { 1; :bar for(;;) { 2; continue foo; 3; }; 4; continue; 5; } ", - " :foo foreach(`$a in 1,2) { 1; :bar foreach( `$b in 1,2,3 ) { 2; continue foo; 3; }; 4; continue; 5; } " - $result = ExecuteCommand $commands[0] - $result | should be "0", "2", "1", "2" - $result = ExecuteCommand $commands[1] - $result | should be "1", "2", "1", "2" - $result = ExecuteCommand $commands[2] - $result | should be "1", "2", "1", "2" - } - - It "This test will check that it is a syntax error to use if without a code block. (line 1141)" { - try { - ExecuteCommand 'if ("true")' - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | Should be "IncompleteParseException" - } - } - - It "This test will check that it is a syntax error if the if condition is not complete. (line 1150)" { - try { - ExecuteCommand 'if (' - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | Should be "IncompleteParseException" - } - } - - It "This test will check that it is a syntax error to have an if condition without parentheses. (line 1159)" { - try { - ExecuteCommand 'if "true" { 1} else {2}' - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | Should be "ParseException" - } - } - - It "This test will check that the parser throws a syntax error when the if condition is missing the closing parentheses. (line 1168)" { - try { - ExecuteCommand 'if ("true" { 1};' - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | Should be "ParseException" - } - } - - It "This test will check that it is a syntax error to have an else keyword without the corresponding code block. (line 1177)" { - try { - ExecuteCommand 'if ("true") {1} else' - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | Should be "IncompleteParseException" - } - } - - It "This test will check that the parser throws a syntax error when a foreach loop is not complete. (line 1238)" { - try { - ExecuteCommand '$count=0;$files = $(get-childitem / -filter *.txt );foreach ($i ;$count' - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | Should be "ParseException" - } - } - - It "This test will check that the parser throws a syntax error if the foreach loop is not complete. (line 1248)" { - try { - ExecuteCommand '$count=0;$files = $(get-childitem / -filter *.txt );foreach ($i in ;$count' - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | Should be "ParseException" - } - } - - It "This will test that the parser throws a syntax error if the foreach loop is missing a closing parentheses. (line 1258)" { - try { - ExecuteCommand '$count=0;$files = $(get-childitem / -filter *.txt );foreach ($i in $files ;$count' - throw "Execution OK" - } - catch { - $_.FullyQualifiedErrorId | Should be "ParseException" - } - } - - It "Test that if an exception is thrown from the try block it will be caught in the appropropriate catch block and that the finally block will run regardless of whether an exception is thrown. (line 1317)" { - $result = ExecuteCommand 'try { try { throw (new-object System.ArgumentException) } catch [System.DivideByZeroException] { } finally { "Finally" } } catch { $_.Exception.GetType().FullName }' - $result | should be "Finally", "System.ArgumentException" - } - - It "Test that null can be passed to a method that expects a reference type. (line 1439)" { - $result = ExecuteCommand '$test = "String";$test.CompareTo($())' - $result | should be 1 - } - - It "Tests that command expansion operators can be used as a parameter to an object method. (line 1507)" { - $result = ExecuteCommand '$test = "String";$test.SubString($("hello" | foreach-object { $_.length - 2 } ))' - $result | should be "ing" - } - - It "Test that & can be used as a parameter as long as it is quoted. (line 1606)" { - $result = ExecuteCommand 'testcmd-parserbvt `&get-childitem' - $result | should be "&get-childitem;unset;unset" - $result = ExecuteCommand 'testcmd-parserbvt `&*' - $result | should be "&*;unset;unset" - } - - It "Run a command with parameters. (line 1621)" { - $result = ExecuteCommand 'testcmd-parserBVT -Property1 set' - $result | should be "set;unset;unset" - } - - It "Test that typing a number at the command line will return that number. (line 1630)" { - $result = ExecuteCommand '3' - $result | should be "3" - $result.gettype() |should be ([int]) - } - - It "This test will check that an msh script can be run without invoking. (line 1641)" { - "1">$testfile - $result = ExecuteCommand ". $testfile" - $result | should be 1 - } - - It "Test that an alias is resolved before a function. (line 1657)" { - $result = ExecuteCommand 'set-alias parserInvokeTest testcmd-parserBVT;function parserInvokeTest { 3 };parserInvokeTest' - $result | should be "unset;unset;unset" - } - - It "Test that functions are resolved before cmdlets. (line 1678)"{ - $result_cmdlet = $PowerShell.AddScript('function test-parserfunc { [CmdletBinding()] Param() PROCESS { "cmdlet" } };test-parserfunc').Invoke() - $result_func = ExecuteCommand 'function test-parserfunc { "func" };test-parserfunc' - $PowerShell.Commands.Clear() - $result_cmdlet | should be "cmdlet" - $result_func | should be "func" - } - - It "Check that a command that uses shell execute can be run from the command line and that no exception is thrown. (line 1702)" { - if ( $IsLinux -or $IsOSX ) { - # because we execute on *nix based on executable bit, and the file name doesn't matter - # so we can use the same filename as for windows, just make sure it's executable with chmod - "#!/bin/sh`necho ""Hello World""" | out-file -encoding ASCII $shellfile - /bin/chmod +x $shellfile - } - else { - "@echo Hello, I'm a Cmd script!">$shellfile - } - { ExecuteCommand "$shellfile" } | Should Not Throw - } - - Context "Boolean Tests (starting at line 1723 to line 1772)" { - $testData = @( - @{ Script = '"False"'; Expected = $true } - @{ Script = 'if ("A") { $true } else { $false }'; Expected = $true } - @{ Script = 'if (" ") { $true } else { $false }'; Expected = $true } - @{ Script = 'if ("String with spaces") { $true } else { $false }'; Expected = $true } - @{ Script = 'if ("DoubleQuoted") { $true } else { $false }'; Expected = $true } - @{ Script = 'if ("StringWithNullVar$aEmbedded") { $true } else { $false }'; Expected = $true } - @{ Script = 'if (0) { $true } else { $false }'; Expected = $false } - @{ Script = '$a = $(0);if ($a) { $true } else { $false }'; Expected = $false } - @{ Script = '$obj = testcmd-parserBVT -ReturnType object;if ($obj) { $true } else { $false }'; Expected = $true } - ) - It "