dbatools.psm1
#requires -Version 3.0 param( [Collections.IDictionary] [Alias('Options')] $Option = @{ } ) $script:start = [DateTime]::Now function Write-ImportTime { param ( [string]$Text, $Timestamp = ([DateTime]::now) ) if (-not $script:dbatools_previousImportPerformance) { $script:dbatools_previousImportPerformance = $script:start } $duration = New-Timespan -Start $script:dbatools_previousImportPerformance -End $Timestamp if (-not $script:dbatools_ImportPerformance) { $script:dbatools_ImportPerformance = New-Object Collections.ArrayList } $script:dbatools_ImportPerformance.Add( [pscustomobject]@{ Action = $Text Duration = $duration }) $script:dbatools_previousImportPerformance = $Timestamp } Write-ImportTime -Text "Started" -Timestamp $script:start $script:PSModuleRoot = $PSScriptRoot if (-not $Env:TEMP) { $Env:TEMP = [System.IO.Path]::GetTempPath() } $script:libraryroot = Get-DbatoolsLibraryPath -ErrorAction Ignore if (-not $script:libraryroot) { # for the people who bypass the psd1 Import-Module dbatools.library -ErrorAction Ignore $script:libraryroot = Get-DbatoolsLibraryPath -ErrorAction Ignore if (-not $script:libraryroot) { throw "The dbatools library, dbatools.library, was module not found. Please install it from the PowerShell Gallery." } Write-ImportTime -Text "Couldn't find location for dbatools library module, loading it up" } # Load our own custom library # Should always come before function imports . $psScriptRoot\bin\library.ps1 Write-ImportTime -Text "Loading dbatools library" <# If dbatools has not been imported yet, it also hasn't done libraries yet. Fix that. Previously checked for SMO being available, but that would break import with SqlServer loaded Some people also use the dbatools library for other things without the module, so also check, whether the modulebase has been set (first thing it does after loading library through dbatools import) Theoretically, there's a minor cuncurrency collision risk with that, but since the cost is only a little import time loss if that happens ... #> Import-Command -Path "$script:psScriptRoot/private/scripts/libraryimport.ps1" Write-ImportTime -Text "Initial import of SMO libraries" Import-Command -Path "$psScriptRoot/bin/typealiases.ps1" Write-ImportTime -Text "Loading type aliases" # Tell the library where the module is based, just in case [Dataplat.Dbatools.dbaSystem.SystemHost]::ModuleBase = $script:PSModuleRoot If ($PSVersionTable.PSEdition -in "Desktop", $null) { $netversion = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse -ErrorAction Ignore | Get-ItemProperty -Name version -ErrorAction Ignore | Where-Object PSChildName -eq Full | Select-Object -First 1 -ExpandProperty Version if ($netversion -lt [version]"4.6") { # it actually works with 4.6 somehow, but 4.6.2 and above is recommended throw "Modern versions of dbatools require at least .NET 4.6.2. Please update your .NET Framework or downgrade to dbatools 1.0.173" } } Write-ImportTime -Text "Checking for .NET" if (($PSVersionTable.PSVersion.Major -lt 6) -or ($PSVersionTable.Platform -and $PSVersionTable.Platform -eq 'Win32NT')) { $script:isWindows = $true } else { $script:isWindows = $false # this doesn't exist by default # https://github.com/PowerShell/PowerShell/issues/1262 try { $env:COMPUTERNAME = hostname } catch { $env:COMPUTERNAME = "unknown" } } Write-ImportTime -Text "Setting some OS variables" Add-Type -AssemblyName System.Security Write-ImportTime -Text "Loading System.Security" # SQLSERVER:\ path not supported if ($ExecutionContext.SessionState.Path.CurrentLocation.Drive.Name -eq 'SqlServer') { Write-Warning "SQLSERVER:\ provider not supported. Please change to another directory and reload the module." Write-Warning "Going to continue loading anyway, but expect issues." } Write-ImportTime -Text "Resolved path to not SQLSERVER PSDrive" if ($PSVersionTable.PSEdition -and $PSVersionTable.PSEdition -ne 'Desktop') { $script:core = $true } else { $script:core = $false } if ($psVersionTable.Platform -ne 'Unix' -and 'Microsoft.Win32.Registry' -as [Type]) { $regType = 'Microsoft.Win32.Registry' -as [Type] $hkcuNode = $regType::CurrentUser.OpenSubKey("SOFTWARE\Microsoft\WindowsPowerShell\dbatools\System") if ($dbaToolsSystemNode) { $userValues = @{ } foreach ($v in $hkcuNode.GetValueNames()) { $userValues[$v] = $hkcuNode.GetValue($v) } $dbatoolsSystemUserNode = $systemValues } $hklmNode = $regType::LocalMachine.OpenSubKey("SOFTWARE\Microsoft\WindowsPowerShell\dbatools\System") if ($dbaToolsSystemNode) { $systemValues = @{ } foreach ($v in $hklmNode.GetValueNames()) { $systemValues[$v] = $hklmNode.GetValue($v) } $dbatoolsSystemSystemNode = $systemValues } } else { $dbatoolsSystemUserNode = @{ } $dbatoolsSystemSystemNode = @{ } } Write-ImportTime -Text "Checking for OS and loaded registry values" #region Dot Sourcing # Detect whether at some level dotsourcing was enforced $script:serialimport = $dbatools_dotsourcemodule -or $dbatoolsSystemSystemNode.SerialImport -or $dbatoolsSystemUserNode.SerialImport -or $option.SerialImport #endregion Dot Sourcing $gitDir = $script:PSModuleRoot, '.git' -join [IO.Path]::DirectorySeparatorChar if ($dbatools_enabledebug -or $option.Debug -or $DebugPreference -ne 'SilentlyContinue' -or [IO.Directory]::Exists($gitDir)) { $script:serialimport = $true } Write-ImportTime -Text "Checking for debugging preference" # People will need to unblock files for themselves, removed <# Do the rest of the loading # This technique helped a little bit # https://becomelotr.wordpress.com/2017/02/13/expensive-dot-sourcing/ #> if (-not (Test-Path -Path "$psScriptRoot\dbatools.dat") -or $script:serialimport) { # All internal functions privately available within the toolset foreach ($file in (Get-ChildItem -Path "$psScriptRoot/private/functions/" -Recurse -Filter *.ps1)) { . $file.FullName } Write-ImportTime -Text "Loading internal commands via dotsource" # All exported functions foreach ($file in (Get-ChildItem -Path "$script:PSModuleRoot/public/" -Recurse -Filter *.ps1)) { . $file.FullName } Write-ImportTime -Text "Loading external commands via dotsource" } else { Import-Command -Path "$script:PSModuleRoot/dbatools.dat" Write-ImportTime -Text "Loading dbatools.ps1 using Import-Command" } # Load configuration system - Should always go after library and path setting # this has its own Write-ImportTimes Import-Command -Path "$psScriptRoot/private/configurations/configuration.ps1" # Resolving the path was causing trouble when it didn't exist yet # Not converting the path separators based on OS was also an issue. if (-not ([Dataplat.Dbatools.Message.LogHost]::LoggingPath)) { [Dataplat.Dbatools.Message.LogHost]::LoggingPath = Join-DbaPath $script:AppData "PowerShell" "dbatools" } # Run all optional code # Note: Each optional file must include a conditional governing whether it's run at all. # Validations were moved into the other files, in order to prevent having to update dbatools.psm1 every time if ($PSVersionTable.PSVersion.Major -lt 5) { foreach ($file in (Get-ChildItem -Path "$script:PSScriptRoot/opt" -Filter *.ps1)) { Import-Command -Path $file.FullName } Write-ImportTime -Text "Loading Optional Commands" } # Process TEPP parameters Import-Command -Path "$psScriptRoot/private/scripts/insertTepp.ps1" Write-ImportTime -Text "Loading TEPP" # Process transforms Import-Command -Path "$psScriptRoot/private/scripts/message-transforms.ps1" Write-ImportTime -Text "Loading Message Transforms" # Load scripts that must be individually run at the end # #-------------------------------------------------------# # Start the logging system (requires the configuration system up and running) Import-Command -Path "$psScriptRoot/private/scripts/logfilescript.ps1" Write-ImportTime -Text "Loading Script: Logging" # Start the tepp asynchronous update system (requires the configuration system up and running) Import-Command -Path "$psScriptRoot/private/scripts/updateTeppAsync.ps1" Write-ImportTime -Text "Loading Script: Asynchronous TEPP Cache" # Start the maintenance system (requires pretty much everything else already up and running) Import-Command -Path "$psScriptRoot/private/scripts/dbatools-maintenance.ps1" Write-ImportTime -Text "Loading Script: Maintenance" # New 3-char aliases $shortcuts = @{ 'ivq' = 'Invoke-DbaQuery' 'cdi' = 'Connect-DbaInstance' } foreach ($sc in $shortcuts.GetEnumerator()) { New-Alias -Name $sc.Key -Value $sc.Value } # Leave forever $forever = @{ 'Get-DbaRegisteredServer' = 'Get-DbaRegServer' 'Attach-DbaDatabase' = 'Mount-DbaDatabase' 'Detach-DbaDatabase' = 'Dismount-DbaDatabase' 'Start-SqlMigration' = 'Start-DbaMigration' 'Write-DbaDataTable' = 'Write-DbaDbTableData' 'Get-DbaDbModule' = 'Get-DbaModule' 'Get-DbaBuildReference' = 'Get-DbaBuild' } foreach ($_ in $forever.GetEnumerator()) { Set-Alias -Name $_.Key -Value $_.Value } #endregion Aliases # apparently this is no longer required? :O if ($PSVersionTable.PSVersion.Major -lt 5) { # region Commands $script:xplat = @( 'Start-DbaMigration', 'Copy-DbaDatabase', 'Copy-DbaLogin', 'Copy-DbaAgentServer', 'Copy-DbaSpConfigure', 'Copy-DbaDbMail', 'Copy-DbaDbAssembly', 'Copy-DbaAgentSchedule', 'Copy-DbaAgentOperator', 'Copy-DbaAgentJob', 'Copy-DbaCustomError', 'Copy-DbaInstanceAuditSpecification', 'Copy-DbaEndpoint', 'Copy-DbaInstanceAudit', 'Copy-DbaServerRole', 'Copy-DbaResourceGovernor', 'Copy-DbaXESession', 'Copy-DbaInstanceTrigger', 'Copy-DbaRegServer', 'Copy-DbaSysDbUserObject', 'Copy-DbaAgentProxy', 'Copy-DbaAgentAlert', 'Copy-DbaStartupProcedure', 'Get-DbaDbDetachedFileInfo', 'Copy-DbaAgentJobCategory', 'Get-DbaLinkedServerLogin', 'Test-DbaPath', 'Export-DbaLogin', 'Watch-DbaDbLogin', 'Expand-DbaDbLogFile', 'Test-DbaMigrationConstraint', 'Test-DbaNetworkLatency', 'Find-DbaDbDuplicateIndex', 'Remove-DbaDatabaseSafely', 'Set-DbaTempdbConfig', 'Test-DbaTempdbConfig', 'Repair-DbaDbOrphanUser', 'Remove-DbaDbOrphanUser', 'Find-DbaDbUnusedIndex', 'Get-DbaDbSpace', 'Test-DbaDbOwner', 'Set-DbaDbOwner', 'Test-DbaAgentJobOwner', 'Set-DbaAgentJobOwner', 'Measure-DbaDbVirtualLogFile', 'Get-DbaDbRestoreHistory', 'Get-DbaTcpPort', 'Test-DbaDbCompatibility', 'Test-DbaDbCollation', 'Test-DbaConnectionAuthScheme', 'Test-DbaInstanceName', 'Repair-DbaInstanceName', 'Stop-DbaProcess', 'Find-DbaOrphanedFile', 'Get-DbaAvailabilityGroup', 'Get-DbaLastGoodCheckDb', 'Get-DbaProcess', 'Get-DbaRunningJob', 'Set-DbaMaxDop', 'Test-DbaDbRecoveryModel', 'Test-DbaMaxDop', 'Remove-DbaBackup', 'Get-DbaPermission', 'Get-DbaLastBackup', 'Connect-DbaInstance', 'Get-DbaDbBackupHistory', 'Get-DbaAgBackupHistory', 'Read-DbaBackupHeader', 'Test-DbaLastBackup', 'Get-DbaMaxMemory', 'Set-DbaMaxMemory', 'Get-DbaDbSnapshot', 'Remove-DbaDbSnapshot', 'Get-DbaDbRoleMember', 'Get-DbaServerRoleMember', 'Get-DbaDbAsymmetricKey', 'New-DbaDbAsymmetricKey', 'Remove-DbaDbAsymmetricKey', 'Invoke-DbaDbTransfer', 'Invoke-DbaDbAzSqlTips', 'New-DbaDbTransfer', 'Remove-DbaDbData', 'Resolve-DbaNetworkName', 'Export-DbaAvailabilityGroup', 'Write-DbaDbTableData', 'New-DbaDbSnapshot', 'Restore-DbaDbSnapshot', 'Get-DbaInstanceTrigger', 'Get-DbaDbTrigger', 'Get-DbaDbState', 'Set-DbaDbState', 'Get-DbaHelpIndex', 'Get-DbaAgentAlert', 'Get-DbaAgentOperator', 'Get-DbaSpConfigure', 'Rename-DbaLogin', 'Find-DbaAgentJob', 'Find-DbaDatabase', 'Get-DbaXESession', 'Export-DbaXESession', 'Test-DbaOptimizeForAdHoc', 'Find-DbaStoredProcedure', 'Measure-DbaBackupThroughput', 'Get-DbaDatabase', 'Find-DbaUserObject', 'Get-DbaDependency', 'Find-DbaCommand', 'Backup-DbaDatabase', 'Test-DbaBackupEncrypted', 'New-DbaDirectory', 'Get-DbaDbQueryStoreOption', 'Set-DbaDbQueryStoreOption', 'Restore-DbaDatabase', 'Get-DbaDbFileMapping', 'Copy-DbaDbQueryStoreOption', 'Get-DbaExecutionPlan', 'Export-DbaExecutionPlan', 'Set-DbaSpConfigure', 'Test-DbaIdentityUsage', 'Get-DbaDbAssembly', 'Get-DbaAgentJob', 'Get-DbaCustomError', 'Get-DbaCredential', 'Get-DbaBackupDevice', 'Get-DbaAgentProxy', 'Get-DbaDbEncryption', 'Disable-DbaDbEncryption', 'Enable-DbaDbEncryption', 'Get-DbaDbEncryptionKey', 'New-DbaDbEncryptionKey', 'Remove-DbaDbEncryptionKey', 'Start-DbaDbEncryption', 'Stop-DbaDbEncryption', 'Remove-DbaDatabase', 'Get-DbaQueryExecutionTime', 'Get-DbaTempdbUsage', 'Find-DbaDbGrowthEvent', 'Test-DbaLinkedServerConnection', 'Get-DbaDbFile', 'Get-DbaDbFileGrowth', 'Set-DbaDbFileGrowth', 'Read-DbaTransactionLog', 'Get-DbaDbTable', 'Remove-DbaDbTable', 'Invoke-DbaDbShrink', 'Get-DbaEstimatedCompletionTime', 'Get-DbaLinkedServer', 'New-DbaAgentJob', 'Get-DbaLogin', 'New-DbaScriptingOption', 'Save-DbaDiagnosticQueryScript', 'Invoke-DbaDiagnosticQuery', 'Export-DbaDiagnosticQuery', 'Invoke-DbaWhoIsActive', 'Set-DbaAgentJob', 'Remove-DbaAgentJob', 'New-DbaAgentJobStep', 'Set-DbaAgentJobStep', 'Remove-DbaAgentJobStep', 'New-DbaAgentSchedule', 'Set-DbaAgentSchedule', 'Remove-DbaAgentSchedule', 'Backup-DbaDbCertificate', 'Get-DbaDbCertificate', 'Copy-DbaDbCertificate', 'Get-DbaEndpoint', 'Get-DbaDbMasterKey', 'Get-DbaSchemaChangeHistory', 'Get-DbaInstanceAudit', 'Get-DbaInstanceAuditSpecification', 'Get-DbaProductKey', 'Get-DbatoolsError', 'Get-DbatoolsLog', 'Restore-DbaDbCertificate', 'New-DbaDbCertificate', 'New-DbaDbMasterKey', 'New-DbaServiceMasterKey', 'Remove-DbaDbCertificate', 'Remove-DbaDbMasterKey', 'Get-DbaInstanceProperty', 'Get-DbaInstanceUserOption', 'New-DbaConnectionString', 'Get-DbaAgentSchedule', 'Read-DbaTraceFile', 'Get-DbaInstanceInstallDate', 'Backup-DbaDbMasterKey', 'Get-DbaAgentJobHistory', 'Get-DbaMaintenanceSolutionLog', 'Invoke-DbaDbLogShipRecovery', 'Find-DbaTrigger', 'Find-DbaView', 'Invoke-DbaDbUpgrade', 'Get-DbaDbUser', 'Get-DbaAgentLog', 'Get-DbaDbMailLog', 'Get-DbaDbMailHistory', 'Get-DbaDbView', 'Remove-DbaDbView', 'New-DbaSqlParameter', 'Get-DbaDbUdf', 'Get-DbaDbPartitionFunction', 'Get-DbaDbPartitionScheme', 'Remove-DbaDbPartitionScheme', 'Remove-DbaDbPartitionFunction', 'Get-DbaDefaultPath', 'Get-DbaDbStoredProcedure', 'Test-DbaDbCompression', 'Mount-DbaDatabase', 'Dismount-DbaDatabase', 'Get-DbaAgReplica', 'Get-DbaAgDatabase', 'Get-DbaModule', 'Sync-DbaLoginPermission', 'New-DbaCredential', 'Get-DbaFile', 'Set-DbaDbCompression', 'Get-DbaTraceFlag', 'Invoke-DbaCycleErrorLog', 'Get-DbaAvailableCollation', 'Get-DbaUserPermission', 'Get-DbaAgHadr', 'Find-DbaSimilarTable', 'Get-DbaTrace', 'Get-DbaSuspectPage', 'Get-DbaWaitStatistic', 'Clear-DbaWaitStatistics', 'Get-DbaTopResourceUsage', 'New-DbaLogin', 'Get-DbaAgListener', 'Invoke-DbaDbClone', 'Disable-DbaTraceFlag', 'Enable-DbaTraceFlag', 'Start-DbaAgentJob', 'Stop-DbaAgentJob', 'New-DbaAgentProxy', 'Test-DbaDbLogShipStatus', 'Get-DbaXESessionTarget', 'New-DbaXESmartTargetResponse', 'New-DbaXESmartTarget', 'Get-DbaDbVirtualLogFile', 'Get-DbaBackupInformation', 'Start-DbaXESession', 'Stop-DbaXESession', 'Set-DbaDbRecoveryModel', 'Get-DbaDbRecoveryModel', 'Get-DbaWaitingTask', 'Remove-DbaDbUser', 'Get-DbaDump', 'Invoke-DbaAdvancedRestore', 'Format-DbaBackupInformation', 'Get-DbaAgentJobStep', 'Test-DbaBackupInformation', 'Invoke-DbaBalanceDataFiles', 'Select-DbaBackupInformation', 'Publish-DbaDacPackage', 'Copy-DbaDbTableData', 'Copy-DbaDbViewData', 'Invoke-DbaQuery', 'Remove-DbaLogin', 'Get-DbaAgentJobCategory', 'New-DbaAgentJobCategory', 'Remove-DbaAgentJobCategory', 'Set-DbaAgentJobCategory', 'Get-DbaServerRole', 'Find-DbaBackup', 'Remove-DbaXESession', 'New-DbaXESession', 'Get-DbaXEStore', 'New-DbaXESmartTableWriter', 'New-DbaXESmartReplay', 'New-DbaXESmartEmail', 'New-DbaXESmartQueryExec', 'Start-DbaXESmartTarget', 'Get-DbaDbOrphanUser', 'Get-DbaOpenTransaction', 'Get-DbaDbLogShipError', 'Test-DbaBuild', 'Get-DbaXESessionTemplate', 'ConvertTo-DbaXESession', 'Start-DbaTrace', 'Stop-DbaTrace', 'Remove-DbaTrace', 'Set-DbaLogin', 'Copy-DbaXESessionTemplate', 'Get-DbaXEObject', 'ConvertTo-DbaDataTable', 'Find-DbaDbDisabledIndex', 'Get-DbaXESmartTarget', 'Remove-DbaXESmartTarget', 'Stop-DbaXESmartTarget', 'Get-DbaRegServerGroup', 'New-DbaDbUser', 'Measure-DbaDiskSpaceRequirement', 'New-DbaXESmartCsvWriter', 'Invoke-DbaXeReplay', 'Find-DbaInstance', 'Test-DbaDiskSpeed', 'Get-DbaDbExtentDiff', 'Read-DbaAuditFile', 'Get-DbaDbCompression', 'Invoke-DbaDbDecryptObject', 'Get-DbaDbForeignKey', 'Get-DbaDbCheckConstraint', 'Remove-DbaDbCheckConstraint', 'Set-DbaAgentAlert', 'Get-DbaWaitResource', 'Get-DbaDbPageInfo', 'Get-DbaConnection', 'Test-DbaLoginPassword', 'Get-DbaErrorLogConfig', 'Set-DbaErrorLogConfig', 'Get-DbaPlanCache', 'Clear-DbaPlanCache', 'ConvertTo-DbaTimeline', 'Get-DbaDbMail', 'Get-DbaDbMailAccount', 'Get-DbaDbMailProfile', 'Get-DbaDbMailConfig', 'Get-DbaDbMailServer', 'New-DbaDbMailServer', 'New-DbaDbMailAccount', 'New-DbaDbMailProfile', 'Get-DbaResourceGovernor', 'Get-DbaRgResourcePool', 'Get-DbaRgWorkloadGroup', 'Get-DbaRgClassifierFunction', 'Export-DbaInstance', 'Invoke-DbatoolsRenameHelper', 'Measure-DbatoolsImport', 'Get-DbaDeprecatedFeature', 'Test-DbaDeprecatedFeature' 'Get-DbaDbFeatureUsage', 'Stop-DbaEndpoint', 'Start-DbaEndpoint', 'Set-DbaDbMirror', 'Repair-DbaDbMirror', 'Remove-DbaEndpoint', 'Remove-DbaDbMirrorMonitor', 'Remove-DbaDbMirror', 'New-DbaEndpoint', 'Invoke-DbaDbMirroring', 'Invoke-DbaDbMirrorFailover', 'Get-DbaDbMirrorMonitor', 'Get-DbaDbMirror', 'Add-DbaDbMirrorMonitor', 'Test-DbaEndpoint', 'Get-DbaDbSharePoint', 'Get-DbaDbMemoryUsage', 'Clear-DbaLatchStatistics', 'Get-DbaCpuRingBuffer', 'Get-DbaIoLatency', 'Get-DbaLatchStatistic', 'Get-DbaSpinLockStatistic', 'Add-DbaAgDatabase', 'Add-DbaAgListener', 'Add-DbaAgReplica', 'Grant-DbaAgPermission', 'Invoke-DbaAgFailover', 'Join-DbaAvailabilityGroup', 'New-DbaAvailabilityGroup', 'Remove-DbaAgDatabase', 'Remove-DbaAgListener', 'Remove-DbaAvailabilityGroup', 'Revoke-DbaAgPermission', 'Get-DbaDbCompatibility', 'Set-DbaDbCompatibility', 'Invoke-DbatoolsFormatter', 'Remove-DbaAgReplica', 'Resume-DbaAgDbDataMovement', 'Set-DbaAgListener', 'Set-DbaAgReplica', 'Set-DbaAvailabilityGroup', 'Set-DbaEndpoint', 'Suspend-DbaAgDbDataMovement', 'Sync-DbaAvailabilityGroup', 'Get-DbaMemoryCondition', 'Remove-DbaDbBackupRestoreHistory', 'New-DbaDatabase' 'New-DbaDacOption', 'Get-DbaDbccHelp', 'Get-DbaDbccMemoryStatus', 'Get-DbaDbccProcCache', 'Get-DbaDbccUserOption', 'Get-DbaAgentServer', 'Set-DbaAgentServer', 'Invoke-DbaDbccFreeCache' 'Export-DbatoolsConfig', 'Import-DbatoolsConfig', 'Reset-DbatoolsConfig', 'Unregister-DbatoolsConfig', 'Join-DbaPath', 'Resolve-DbaPath', 'Import-DbaCsv', 'Invoke-DbaDbDataMasking', 'New-DbaDbMaskingConfig', 'Get-DbaDbccSessionBuffer', 'Get-DbaDbccStatistic', 'Get-DbaDbDbccOpenTran', 'Invoke-DbaDbccDropCleanBuffer', 'Invoke-DbaDbDbccCheckConstraint', 'Invoke-DbaDbDbccCleanTable', 'Invoke-DbaDbDbccUpdateUsage', 'Get-DbaDbIdentity', 'Set-DbaDbIdentity', 'Get-DbaRegServer', 'Get-DbaRegServerStore', 'Add-DbaRegServer', 'Add-DbaRegServerGroup', 'Export-DbaRegServer', 'Import-DbaRegServer', 'Move-DbaRegServer', 'Move-DbaRegServerGroup', 'Remove-DbaRegServer', 'Remove-DbaRegServerGroup', 'New-DbaCustomError', 'Remove-DbaCustomError', 'Get-DbaDbSequence', 'New-DbaDbSequence', 'Remove-DbaDbSequence', 'Select-DbaDbSequenceNextValue', 'Set-DbaDbSequence', 'Get-DbaDbUserDefinedTableType', 'Get-DbaDbServiceBrokerService', 'Get-DbaDbServiceBrokerQueue ', 'Set-DbaResourceGovernor', 'New-DbaRgResourcePool', 'Set-DbaRgResourcePool', 'Remove-DbaRgResourcePool', 'Get-DbaDbServiceBrokerQueue', 'New-DbaLinkedServer', # Config system 'Get-DbatoolsConfig', 'Get-DbatoolsConfigValue', 'Set-DbatoolsConfig', 'Register-DbatoolsConfig', # Data generator 'New-DbaDbDataGeneratorConfig', 'Invoke-DbaDbDataGenerator', 'Get-DbaRandomizedValue', 'Get-DbaRandomizedDatasetTemplate', 'Get-DbaRandomizedDataset', 'Get-DbaRandomizedType', 'Export-DbaDbTableData', 'Export-DbaBinaryFile', 'Import-DbaBinaryFile', 'Get-DbaBinaryFileTable', 'Backup-DbaServiceMasterKey', 'Invoke-DbaDbPiiScan', 'New-DbaAzAccessToken', 'Add-DbaDbRoleMember', 'Disable-DbaStartupProcedure', 'Enable-DbaStartupProcedure', 'Get-DbaDbFilegroup', 'Get-DbaDbObjectTrigger', 'Get-DbaStartupProcedure', 'Get-DbatoolsChangeLog', 'Get-DbaXESessionTargetFile', 'Get-DbaDbRole', 'New-DbaDbRole', 'New-DbaDbTable', 'New-DbaDiagnosticAdsNotebook', 'New-DbaServerRole', 'Remove-DbaDbRole', 'Remove-DbaDbRoleMember', 'Remove-DbaServerRole', 'Test-DbaDbDataGeneratorConfig', 'Test-DbaDbDataMaskingConfig', 'Get-DbaAgentAlertCategory', 'New-DbaAgentAlertCategory', 'Remove-DbaAgentAlert', 'Remove-DbaAgentAlertCategory', 'Save-DbaKbUpdate', 'Get-DbaKbUpdate', 'Get-DbaDbLogSpace', 'Export-DbaDbRole', 'Export-DbaServerRole', 'Get-DbaBuild', 'Update-DbaBuildReference', 'Install-DbaFirstResponderKit', 'Install-DbaWhoIsActive', 'Update-Dbatools', 'Add-DbaServerRoleMember', 'Get-DbatoolsPath', 'Set-DbatoolsPath', 'Export-DbaSysDbUserObject', 'Test-DbaDbQueryStore', 'Install-DbaMultiTool', 'New-DbaAgentOperator', 'Remove-DbaAgentOperator', 'Remove-DbaDbTableData', 'Get-DbaDbSchema', 'New-DbaDbSchema', 'Set-DbaDbSchema', 'Remove-DbaDbSchema', 'Get-DbaDbSynonym', 'New-DbaDbSynonym', 'Remove-DbaDbSynonym', 'Install-DbaDarlingData', 'New-DbaDbFileGroup', 'Remove-DbaDbFileGroup', 'Set-DbaDbFileGroup', 'Remove-DbaLinkedServer', 'Test-DbaAvailabilityGroup', 'Export-DbaUser', 'Get-DbaSsisExecutionHistory', 'New-DbaConnectionStringBuilder', 'New-DbatoolsSupportPackage', 'Export-DbaScript', 'Get-DbaAgentJobOutputFile', 'Set-DbaAgentJobOutputFile', 'Import-DbaXESessionTemplate', 'Export-DbaXESessionTemplate', 'Import-DbaSpConfigure', 'Export-DbaSpConfigure', 'Test-DbaMaxMemory', 'Install-DbaMaintenanceSolution', 'Get-DbaManagementObject', 'Set-DbaAgentOperator', 'Remove-DbaExtendedProperty', 'Get-DbaExtendedProperty', 'Set-DbaExtendedProperty', 'Add-DbaExtendedProperty', 'Get-DbaOleDbProvider', 'Get-DbaConnectedInstance', 'Disconnect-DbaInstance', 'Set-DbaDefaultPath', 'New-DbaDacProfile', 'Export-DbaDacPackage', 'Remove-DbaDbUdf', 'Save-DbaCommunitySoftware', 'Update-DbaMaintenanceSolution', 'Remove-DbaServerRoleMember', 'Remove-DbaDbMailProfile', 'Remove-DbaDbMailAccount', 'Set-DbaRgWorkloadGroup', 'New-DbaRgWorkloadGroup', 'Remove-DbaRgWorkloadGroup', 'New-DbaLinkedServerLogin', 'Remove-DbaLinkedServerLogin', 'Remove-DbaCredential', 'Remove-DbaAgentProxy' ) $script:noncoresmo = @( # SMO issues 'Get-DbaRepDistributor', 'Copy-DbaPolicyManagement', 'Copy-DbaDataCollector', 'Get-DbaPbmCategory', 'Get-DbaPbmCategorySubscription', 'Get-DbaPbmCondition', 'Get-DbaPbmObjectSet', 'Get-DbaPbmPolicy', 'Get-DbaPbmStore', 'Get-DbaRepPublication', 'Test-DbaRepLatency', 'Export-DbaRepServerSetting', 'Get-DbaRepServer' ) $script:windowsonly = @( # filesystem (\\ related), 'Move-DbaDbFile' 'Copy-DbaBackupDevice', 'Read-DbaXEFile', 'Watch-DbaXESession', # Registry 'Get-DbaRegistryRoot', # GAC 'Test-DbaManagementObject', # CM and Windows functions 'Get-DbaInstalledPatch', 'Get-DbaFirewallRule', 'New-DbaFirewallRule', 'Remove-DbaFirewallRule', 'Rename-DbaDatabase', 'Get-DbaNetworkConfiguration', 'Set-DbaNetworkConfiguration', 'Get-DbaExtendedProtection', 'Set-DbaExtendedProtection', 'Install-DbaInstance', 'Invoke-DbaAdvancedInstall', 'Update-DbaInstance', 'Invoke-DbaAdvancedUpdate', 'Invoke-DbaPfRelog', 'Get-DbaPfDataCollectorCounter', 'Get-DbaPfDataCollectorCounterSample', 'Get-DbaPfDataCollector', 'Get-DbaPfDataCollectorSet', 'Start-DbaPfDataCollectorSet', 'Stop-DbaPfDataCollectorSet', 'Export-DbaPfDataCollectorSetTemplate', 'Get-DbaPfDataCollectorSetTemplate', 'Import-DbaPfDataCollectorSetTemplate', 'Remove-DbaPfDataCollectorSet', 'Add-DbaPfDataCollectorCounter', 'Remove-DbaPfDataCollectorCounter', 'Get-DbaPfAvailableCounter', 'Export-DbaXECsv', 'Get-DbaOperatingSystem', 'Get-DbaComputerSystem', 'Set-DbaPrivilege', 'Set-DbaTcpPort', 'Set-DbaCmConnection', 'Get-DbaUptime', 'Get-DbaMemoryUsage', 'Clear-DbaConnectionPool', 'Get-DbaLocaleSetting', 'Get-DbaFilestream', 'Enable-DbaFilestream', 'Disable-DbaFilestream', 'Get-DbaCpuUsage', 'Get-DbaPowerPlan', 'Get-DbaWsfcAvailableDisk', 'Get-DbaWsfcCluster', 'Get-DbaWsfcDisk', 'Get-DbaWsfcNetwork', 'Get-DbaWsfcNetworkInterface', 'Get-DbaWsfcNode', 'Get-DbaWsfcResource', 'Get-DbaWsfcResourceGroup', 'Get-DbaWsfcResourceType', 'Get-DbaWsfcRole', 'Get-DbaWsfcSharedVolume', 'Export-DbaCredential', 'Export-DbaLinkedServer', 'Get-DbaFeature', 'Update-DbaServiceAccount', 'Remove-DbaClientAlias', 'Disable-DbaAgHadr', 'Enable-DbaAgHadr', 'Stop-DbaService', 'Start-DbaService', 'Restart-DbaService', 'New-DbaClientAlias', 'Get-DbaClientAlias', 'Stop-DbaExternalProcess', 'Get-DbaExternalProcess', 'Remove-DbaNetworkCertificate', 'Enable-DbaForceNetworkEncryption', 'Disable-DbaForceNetworkEncryption', 'Get-DbaForceNetworkEncryption', 'Get-DbaHideInstance', 'Enable-DbaHideInstance', 'Disable-DbaHideInstance', 'New-DbaComputerCertificateSigningRequest', 'Remove-DbaComputerCertificate', 'New-DbaComputerCertificate', 'Get-DbaComputerCertificate', 'Add-DbaComputerCertificate', 'Backup-DbaComputerCertificate', 'Test-DbaComputerCertificateExpiration', 'Get-DbaNetworkCertificate', 'Set-DbaNetworkCertificate', 'Remove-DbaDbLogshipping', 'Invoke-DbaDbLogShipping', 'New-DbaCmConnection', 'Get-DbaCmConnection', 'Remove-DbaCmConnection', 'Test-DbaCmConnection', 'Get-DbaCmObject', 'Set-DbaStartupParameter', 'Get-DbaNetworkActivity', 'Get-DbaInstanceProtocol', 'Get-DbaPrivilege', 'Get-DbaMsdtc', 'Get-DbaPageFileSetting', 'Copy-DbaCredential', 'Test-DbaConnection', 'Reset-DbaAdmin', 'Copy-DbaLinkedServer', 'Get-DbaDiskSpace', 'Test-DbaDiskAllocation', 'Test-DbaPowerPlan', 'Set-DbaPowerPlan', 'Test-DbaDiskAlignment', 'Get-DbaStartupParameter', 'Get-DbaSpn', 'Test-DbaSpn', 'Set-DbaSpn', 'Remove-DbaSpn', 'Get-DbaService', 'Get-DbaClientProtocol', 'Get-DbaWindowsLog', # WPF 'Show-DbaInstanceFileSystem', 'Show-DbaDbList', # AD 'Test-DbaWindowsLogin', 'Find-DbaLoginInGroup', # 3rd party non-core DLL or sqlpackage.exe 'Install-DbaSqlWatch', 'Uninstall-DbaSqlWatch', # Unknown 'Get-DbaErrorLog' ) # If a developer or appveyor calls the psm1 directly, they want all functions # So do not explicitly export because everything else is then implicitly excluded if (-not $script:serialimport) { $exports = @(if (($PSVersionTable.Platform)) { if ($PSVersionTable.Platform -ne "Win32NT") { $script:xplat } else { $script:xplat $script:windowsonly } } else { $script:xplat $script:windowsonly $script:noncoresmo }) $aliasExport = @( foreach ($k in $script:Renames.Keys) { $k } foreach ($k in $script:Forever.Keys) { $k } foreach ($c in $script:shortcuts.Keys) { $c } ) Export-ModuleMember -Alias $aliasExport -Function $exports -Cmdlet Select-DbaObject, Set-DbatoolsConfig Write-ImportTime -Text "Exporting explicit module members" } else { Export-ModuleMember -Alias * -Function * -Cmdlet * Write-ImportTime -Text "Exporting all module members" } } $myInv = $MyInvocation if ($option.LoadTypes -or ($myInv.Line -like '*.psm1*' -and (-not (Get-TypeData -TypeName Microsoft.SqlServer.Management.Smo.Server) ))) { Update-TypeData -AppendPath (Resolve-Path -Path "$script:PSModuleRoot\xml\dbatools.Types.ps1xml") Write-ImportTime -Text "Updating type data" } Import-Command -Path "$script:PSModuleRoot/bin/type-extensions.ps1" Write-ImportTime -Text "Loading type extensions" $loadedModuleNames = (Get-Module sqlserver, sqlps -ErrorAction Ignore).Name if ($loadedModuleNames -contains 'sqlserver' -or $loadedModuleNames -contains 'sqlps') { if (Get-DbatoolsConfigValue -FullName Import.SqlpsCheck) { Write-Warning -Message 'SQLPS or SqlServer was previously imported during this session. If you encounter weird issues with dbatools, please restart PowerShell, then import dbatools without loading SQLPS or SqlServer first.' Write-Warning -Message 'To disable this message, type: Set-DbatoolsConfig -Name Import.SqlpsCheck -Value $false -PassThru | Register-DbatoolsConfig' } } Write-ImportTime -Text "Checking for SqlServer or SQLPS" #endregion Post-Import Cleanup # Removal of runspaces is needed to successfully close PowerShell ISE if (Test-Path -Path Variable:global:psISE) { $onRemoveScript = { Get-Runspace | Where-Object Name -like dbatools* | ForEach-Object -Process { $_.Dispose() } } $ExecutionContext.SessionState.Module.OnRemove += $onRemoveScript Register-EngineEvent -SourceIdentifier ([System.Management.Automation.PsEngineEvent]::Exiting) -Action $onRemoveScript } Write-ImportTime -Text "Checking for some ISE stuff" # Create collection for servers $script:connectionhash = @{ } if (Get-DbatoolsConfigValue -FullName Import.EncryptionMessageCheck) { $trustcert = Get-DbatoolsConfigValue -FullName sql.connection.trustcert $encrypt = Get-DbatoolsConfigValue -FullName sql.connection.encrypt if (-not $trustcert -or $encrypt -in "Mandatory", "$true") { # keep it write-host for psv3 Write-Message -Level Output -Message ' / / / / | O | | O | | |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| | | O | | O | | | | | | O | | O | | | C O M P U T E R | | | O | | O | | | M E S S A G E | | | O | | O | | | | | | O |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -| O | | | | | Microsoft changed the encryption defaults in their SqlClient library, which may cause your connections to fail. You can change the defaults with Set-DbatoolsConfig but dbatools also makes it easy to setup encryption. Check out dbatools.io/newdefaults for more information. To disable this message, run: Set-DbatoolsConfig -Name Import.EncryptionMessageCheck -Value $false -PassThru | Register-DbatoolsConfig' } } [Dataplat.Dbatools.dbaSystem.SystemHost]::ModuleImported = $true # SIG # Begin signature block # MIIjYAYJKoZIhvcNAQcCoIIjUTCCI00CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAy6GgpkcsRBMBT # AAx+GvG20QrxdHujqtxO7/KWqfeJ5KCCHVkwggUaMIIEAqADAgECAhADBbuGIbCh # Y1+/3q4SBOdtMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNV # BAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwHhcN # MjAwNTEyMDAwMDAwWhcNMjMwNjA4MTIwMDAwWjBXMQswCQYDVQQGEwJVUzERMA8G # A1UECBMIVmlyZ2luaWExDzANBgNVBAcTBlZpZW5uYTERMA8GA1UEChMIZGJhdG9v # bHMxETAPBgNVBAMTCGRiYXRvb2xzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB # CgKCAQEAvL9je6vjv74IAbaY5rXqHxaNeNJO9yV0ObDg+kC844Io2vrHKGD8U5hU # iJp6rY32RVprnAFrA4jFVa6P+sho7F5iSVAO6A+QZTHQCn7oquOefGATo43NAadz # W2OWRro3QprMPZah0QFYpej9WaQL9w/08lVaugIw7CWPsa0S/YjHPGKQ+bYgI/kr # EUrk+asD7lvNwckR6pGieWAyf0fNmSoevQBTV6Cd8QiUfj+/qWvLW3UoEX9ucOGX # 2D8vSJxL7JyEVWTHg447hr6q9PzGq+91CO/c9DWFvNMjf+1c5a71fEZ54h1mNom/ # XoWZYoKeWhKnVdv1xVT1eEimibPEfQIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAU # WsS5eyoKo6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFPDAoPu2A4BDTvsJ193ferHL # 454iMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8E # cDBuMDWgM6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVk # LWNzLWcxLmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTIt # YXNzdXJlZC1jcy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggr # BgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEw # gYQGCCsGAQUFBwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNl # cnQuY29tME4GCCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20v # RGlnaUNlcnRTSEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/ # BAIwADANBgkqhkiG9w0BAQsFAAOCAQEAj835cJUMH9Y2pBKspjznNJwcYmOxeBcH # Ji+yK0y4bm+j44OGWH4gu/QJM+WjZajvkydJKoJZH5zrHI3ykM8w8HGbYS1WZfN4 # oMwi51jKPGZPw9neGS2PXrBcKjzb7rlQ6x74Iex+gyf8z1ZuRDitLJY09FEOh0BM # LaLh+UvJ66ghmfIyjP/g3iZZvqwgBhn+01fObqrAJ+SagxJ/21xNQJchtUOWIlxR # kuUn9KkuDYrMO70a2ekHODcAbcuHAGI8wzw4saK1iPPhVTlFijHS+7VfIt/d/18p # MLHHArLQQqe1Z0mTfuL4M4xCUKpebkH8rI3Fva62/6osaXLD0ymERzCCBTAwggQY # oAMCAQICEAQJGBtf1btmdVNDtW+VUAgwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UE # BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj # ZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4X # DTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTAT # BgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEx # MC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBD # QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPjTsxx/DhGvZ3cH0wsx # SRnP0PtFmbE620T1f+Wondsy13Hqdp0FLreP+pJDwKX5idQ3Gde2qvCchqXYJawO # eSg6funRZ9PG+yknx9N7I5TkkSOWkHeC+aGEI2YSVDNQdLEoJrskacLCUvIUZ4qJ # RdQtoaPpiCwgla4cSocI3wz14k1gGL6qxLKucDFmM3E+rHCiq85/6XzLkqHlOzEc # z+ryCuRXu0q16XTmK/5sy350OTYNkO/ktU6kqepqCquE86xnTrXE94zRICUj6whk # PlKWwfIPEvTFjg/BougsUfdzvL2FsWKDc0GCB+Q4i2pzINAPZHM8np+mM6n9Gd8l # k9ECAwEAAaOCAc0wggHJMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQD # AgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEF # BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRw # Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0Eu # Y3J0MIGBBgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20v # RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5k # aWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsME8GA1UdIARI # MEYwOAYKYIZIAYb9bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdp # Y2VydC5jb20vQ1BTMAoGCGCGSAGG/WwDMB0GA1UdDgQWBBRaxLl7KgqjpepxA8Bg # +S32ZXUOWDAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG # 9w0BAQsFAAOCAQEAPuwNWiSz8yLRFcgsfCUpdqgdXRwtOhrE7zBh134LYP3DPQ/E # r4v97yrfIFU3sOH20ZJ1D1G0bqWOWuJeJIFOEKTuP3GOYw4TS63XX0R58zYUBor3 # nEZOXP+QsRsHDpEV+7qvtVHCjSSuJMbHJyqhKSgaOnEoAjwukaPAJRHinBRHoXpo # aK+bp1wgXNlxsQyPu6j4xRJon89Ay0BEpRPw5mQMJQhCMrI2iiQC/i9yfhzXSUWW # 6Fkd6fp0ZGuy62ZD2rOwjNXpDd32ASDOmTFjPQgaGLOBm0/GkxAG/AeB+ova+YJJ # 92JuoVP6EpQYhS6SkepobEQysmah5xikmmRR7zCCBY0wggR1oAMCAQICEA6bGI75 # 0C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAwZTELMAkGA1UEBhMCVVMxFTATBgNV # BAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIG # A1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTIyMDgwMTAwMDAw # MFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD # ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGln # aUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUuySE98orYWcLhKac9WKt2ms2uexuE # DcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8Ug9SH8aeFaV+vp+pVxZZVXKvaJNw # wrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0MG+4g1ckgHWMpLc7sXk7Ik/ghYZs0 # 6wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldXn1RYjgwrt0+nMNlW7sp7XeOtyU9e # 5TXnMcvak17cjo+A2raRmECQecN4x7axxLVqGDgDEI3Y1DekLgV9iPWCPhCRcKtV # gkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFEmjNAvwjXWkmkwuapoGfdpCe8oU85 # tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6SPDgohIbZpp0yt5LHucOY67m1O+S # kjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXfSwQAzH0clcOP9yGyshG3u3/y1Yxw # LEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b235kOkGLimdwHhD5QMIR2yVCkliWzl # DlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ6zHFynIWIgnffEx1P2PsIV/EIFFr # b7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRpL5gdLfXZqbId5RsCAwEAAaOCATow # ggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOzX44LScV1kTN8uZz/nupiu # HA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA4GA1UdDwEB/wQE # AwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp # Z2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu # Y29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDBFBgNVHR8EPjA8MDqgOKA2 # hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290 # Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQwFAAOCAQEAcKC/ # Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVeqRq7IviHGmlUIu2kiHdtvRoU9BNK # ei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3votVs/59PesMHqai7Je1M/RQ0SbQyHr # lnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum6fI0POz3A8eHqNJMQBk1RmppVLC4 # oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJaISfb8rbII01YBwCA8sgsKxYoA5A # Y8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/ErhULSd+2DrZ8LaHlv1b0VysGMNN # n3O3AamfV6peKOK5lDCCBq4wggSWoAMCAQICEAc2N7ckVHzYR6z9KGYqXlswDQYJ # KoZIhvcNAQELBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IElu # YzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQg # VHJ1c3RlZCBSb290IEc0MB4XDTIyMDMyMzAwMDAwMFoXDTM3MDMyMjIzNTk1OVow # YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD # EzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGlu # ZyBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMaGNQZJs8E9cklR # VcclA8TykTepl1Gh1tKD0Z5Mom2gsMyD+Vr2EaFEFUJfpIjzaPp985yJC3+dH54P # Mx9QEwsmc5Zt+FeoAn39Q7SE2hHxc7Gz7iuAhIoiGN/r2j3EF3+rGSs+QtxnjupR # PfDWVtTnKC3r07G1decfBmWNlCnT2exp39mQh0YAe9tEQYncfGpXevA3eZ9drMvo # hGS0UvJ2R/dhgxndX7RUCyFobjchu0CsX7LeSn3O9TkSZ+8OpWNs5KbFHc02DVzV # 5huowWR0QKfAcsW6Th+xtVhNef7Xj3OTrCw54qVI1vCwMROpVymWJy71h6aPTnYV # VSZwmCZ/oBpHIEPjQ2OAe3VuJyWQmDo4EbP29p7mO1vsgd4iFNmCKseSv6De4z6i # c/rnH1pslPJSlRErWHRAKKtzQ87fSqEcazjFKfPKqpZzQmiftkaznTqj1QPgv/Ci # PMpC3BhIfxQ0z9JMq++bPf4OuGQq+nUoJEHtQr8FnGZJUlD0UfM2SU2LINIsVzV5 # K6jzRWC8I41Y99xh3pP+OcD5sjClTNfpmEpYPtMDiP6zj9NeS3YSUZPJjAw7W4oi # qMEmCPkUEBIDfV8ju2TjY+Cm4T72wnSyPx4JduyrXUZ14mCjWAkBKAAOhFTuzuld # yF4wEr1GnrXTdrnSDmuZDNIztM2xAgMBAAGjggFdMIIBWTASBgNVHRMBAf8ECDAG # AQH/AgEAMB0GA1UdDgQWBBS6FtltTYUvcyl2mi91jGogj57IbzAfBgNVHSMEGDAW # gBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAww # CgYIKwYBBQUHAwgwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhhodHRwOi8v # b2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNlcnRzLmRp # Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1UdHwQ8MDow # OKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRS # b290RzQuY3JsMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkq # hkiG9w0BAQsFAAOCAgEAfVmOwJO2b5ipRCIBfmbW2CFC4bAYLhBNE88wU86/GPvH # UF3iSyn7cIoNqilp/GnBzx0H6T5gyNgL5Vxb122H+oQgJTQxZ822EpZvxFBMYh0M # CIKoFr2pVs8Vc40BIiXOlWk/R3f7cnQU1/+rT4osequFzUNf7WC2qk+RZp4snuCK # rOX9jLxkJodskr2dfNBwCnzvqLx1T7pa96kQsl3p/yhUifDVinF2ZdrM8HKjI/rA # J4JErpknG6skHibBt94q6/aesXmZgaNWhqsKRcnfxI2g55j7+6adcq/Ex8HBanHZ # xhOACcS2n82HhyS7T6NJuXdmkfFynOlLAlKnN36TU6w7HQhJD5TNOXrd/yVjmScs # PT9rp/Fmw0HNT7ZAmyEhQNC3EyTN3B14OuSereU0cZLXJmvkOHOrpgFPvT87eK1M # rfvElXvtCl8zOYdBeHo46Zzh3SP9HSjTx/no8Zhf+yvYfvJGnXUsHicsJttvFXse # GYs2uJPU5vIXmVnKcPA3v5gA3yAWTyf7YGcWoWa63VXAOimGsJigK+2VQbc61RWY # MbRiCQ8KvYHZE/6/pNHzV9m8BPqC3jLfBInwAM1dwvnQI38AC+R2AibZ8GV2QqYp # hwlHK+Z/GqSFD/yYlvZVVCsfgPrA8g4r5db7qS9EFUrnEw4d2zc4GqEr9u3WfPww # ggbAMIIEqKADAgECAhAMTWlyS5T6PCpKPSkHgD1aMA0GCSqGSIb3DQEBCwUAMGMx # CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy # RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg # Q0EwHhcNMjIwOTIxMDAwMDAwWhcNMzMxMTIxMjM1OTU5WjBGMQswCQYDVQQGEwJV # UzERMA8GA1UEChMIRGlnaUNlcnQxJDAiBgNVBAMTG0RpZ2lDZXJ0IFRpbWVzdGFt # cCAyMDIyIC0gMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAM/spSY6 # xqnya7uNwQ2a26HoFIV0MxomrNAcVR4eNm28klUMYfSdCXc9FZYIL2tkpP0GgxbX # kZI4HDEClvtysZc6Va8z7GGK6aYo25BjXL2JU+A6LYyHQq4mpOS7eHi5ehbhVsbA # umRTuyoW51BIu4hpDIjG8b7gL307scpTjUCDHufLckkoHkyAHoVW54Xt8mG8qjoH # ffarbuVm3eJc9S/tjdRNlYRo44DLannR0hCRRinrPibytIzNTLlmyLuqUDgN5YyU # XRlav/V7QG5vFqianJVHhoV5PgxeZowaCiS+nKrSnLb3T254xCg/oxwPUAY3ugjZ # Naa1Htp4WB056PhMkRCWfk3h3cKtpX74LRsf7CtGGKMZ9jn39cFPcS6JAxGiS7uY # v/pP5Hs27wZE5FX/NurlfDHn88JSxOYWe1p+pSVz28BqmSEtY+VZ9U0vkB8nt9Kr # FOU4ZodRCGv7U0M50GT6Vs/g9ArmFG1keLuY/ZTDcyHzL8IuINeBrNPxB9Thvdld # S24xlCmL5kGkZZTAWOXlLimQprdhZPrZIGwYUWC6poEPCSVT8b876asHDmoHOWIZ # ydaFfxPZjXnPYsXs4Xu5zGcTB5rBeO3GiMiwbjJ5xwtZg43G7vUsfHuOy2SJ8bHE # uOdTXl9V0n0ZKVkDTvpd6kVzHIR+187i1Dp3AgMBAAGjggGLMIIBhzAOBgNVHQ8B # Af8EBAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAg # BgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZ # bU2FL3MpdpovdYxqII+eyG8wHQYDVR0OBBYEFGKK3tBh/I8xFO2XC809KpQU31Kc # MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdp # Q2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAG # CCsGAQUFBwEBBIGDMIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy # dC5jb20wWAYIKwYBBQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E # aWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQw # DQYJKoZIhvcNAQELBQADggIBAFWqKhrzRvN4Vzcw/HXjT9aFI/H8+ZU5myXm93KK # mMN31GT8Ffs2wklRLHiIY1UJRjkA/GnUypsp+6M/wMkAmxMdsJiJ3HjyzXyFzVOd # r2LiYWajFCpFh0qYQitQ/Bu1nggwCfrkLdcJiXn5CeaIzn0buGqim8FTYAnoo7id # 160fHLjsmEHw9g6A++T/350Qp+sAul9Kjxo6UrTqvwlJFTU2WZoPVNKyG39+Xgmt # dlSKdG3K0gVnK3br/5iyJpU4GYhEFOUKWaJr5yI+RCHSPxzAm+18SLLYkgyRTzxm # lK9dAlPrnuKe5NMfhgFknADC6Vp0dQ094XmIvxwBl8kZI4DXNlpflhaxYwzGRkA7 # zl011Fk+Q5oYrsPJy8P7mxNfarXH4PMFw1nfJ2Ir3kHJU7n/NBBn9iYymHv+XEKU # gZSCnawKi8ZLFUrTmJBFYDOA4CPe+AOk9kVH5c64A0JH6EE2cXet/aLol3ROLtoe # HYxayB6a1cLwxiKoT5u92ByaUcQvmvZfpyeXupYuhVfAYOd4Vn9q78KVmksRAsiC # nMkaBXy6cbVOepls9Oie1FqYyJ+/jbsYXEP10Cro4mLueATbvdH7WwqocH7wl4R4 # 4wgDXUcsY6glOJcB0j862uXl9uab3H4szP8XTE0AotjWAQ64i+7m4HJViSwnGWH2 # dwGMMYIFXTCCBVkCAQEwgYYwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD # ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGln # aUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQQIQAwW7hiGwoWNf # v96uEgTnbTANBglghkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQowCKACgACh # AoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAM # BgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCAw+/mnDGXTtv1Jpvi8SFwwgt0C # iIFtVV7jOZQF3rZL2TANBgkqhkiG9w0BAQEFAASCAQBTezcb6MrsInWOC7Y/b/Ym # PKw7H1WwH0za/eLVL+v+ZKdqhrOrGeodQBkKeIG9YfQc6KcTOjFziwN9arb3c533 # K3BC/GuZ7doTeEAZPjxaATvmXW1CQd3zx0IoS17mopx5vMbwOxGRQtvVLeL/on8F # 9u6TRNErn17EYonuRgqyp0z/evJZ+m6PcicrqHBo6Gye4TP4J6eTS7Wi6jHom0Ab # TWdb39Hnc31KYnAC4enJwxrTWEzXlaiEQe9/jejxPc7K3t16FvD7TGQHFwGgiLxc # SYqDWxpfgPyp9S8BeDjQvv57o2zjmPOCU2fJo4ef3o0o1KrqSth48IiI43PhXrkh # oYIDIDCCAxwGCSqGSIb3DQEJBjGCAw0wggMJAgEBMHcwYzELMAkGA1UEBhMCVVMx # FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVz # dGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQDE1pckuU+jwq # Sj0pB4A9WjANBglghkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0B # BwEwHAYJKoZIhvcNAQkFMQ8XDTIzMDMwNDEzMjcwNFowLwYJKoZIhvcNAQkEMSIE # IKTYo2CXqsc2+hhUQDuT7qabQJ3uo0i+FQKfjLPNh+beMA0GCSqGSIb3DQEBAQUA # BIICAHmy0+qdeV7fBqhSLy+qPm3ISy+K74cZEONOMMhCO4LUbBX5xmLrjuQ9k9HV # MFkzC2+aCE59XXEMMz43CJuqjKF7Csahs8H/2yFbRUxxszXbRCsz5qVOQLE+APII # jkqx4wet8smrRs2Ci6/bfiM9TjLSJk+6KZTHfZWIVTDqtP0l3mIG+GBqr1YkieVY # jRpNNO02hwUseNluOTAKCp9x+XXGVgOm+MGXtzjTe20zA3TcBfzEkDUdJDAJ6xlK # BGYH7X3FrZqGk6dW9IS2kCKv9oa6Cy6s0QOEooHZY1C35HajciQ0pqs8DduPceOY # EpxvAVkYjcf1B/ljkL/fXW1dXwjMxC/JHTSJVJRYHQGRA/oKnFowoNiF6K9KbmEI # eL/EK6bTUPykDUgQ+Y1m0531Omjn2tNfUKY+SSX1cqsAq9q7DdHFljw/+rGsRwWu # Uz3B0DU+MwMnvDeeXWMgLFa0+GpNr/fUnckXPilvmp3hAAEfUMkicC3gq8tfZeel # 7vop216qpMzXBGY9/Qu+/x8h5z1DREsvogGLMuMFvNkWu3JpQ2dNEaTyftpL29jX # Etzm6Nw159+lEPowDmWb3ptjeQvFTfYSJkWAChnwQFjYINo064dxUBzNy+3urZKX # 7Kbq6LWQsvziMH0pT4qM+21MyeJpu0a23/hpH+PdgTZwOrqv # SIG # End signature block |