Get-AppVManifestInfo.ps1
function Get-AppVManifestInfo{ <# .SYNOPSIS Get and anylyse a the AppXanifest.xml inside a App-V Package .DESCRIPTION Get and anylyse the AppXanifest.xml inside a App-V Package. Supply informations about the package ans skripts .PARAMETER Path Path to the .appv file .EXAMPLE Get-AppVManifestInfo -Path paintdotnet.appv .NOTES Andreas Nick - 2019 .LINK https://www.software-virtualisierung.de #> [Alias()] [OutputType('AppxManifestInfo')] param( [Parameter( Position=0, Mandatory, ValueFromPipeline)] [System.IO.FileInfo] $Path ) Process { #CONSTANT #Namespaces #$NamespaceXmlns = 'http://schemas.microsoft.com/appx/2010/manifest' #$NamespaceAppv = 'http://schemas.microsoft.com/appv/2010/manifest' $NamespaceAppv1_1 = 'http://schemas.microsoft.com/appv/2013/manifest' $NamespaceAppv1_2 = 'http://schemas.microsoft.com/appv/2014/manifest' [xml] $appxxml = $NUll [xml] $appvStreamMapp = $NUll $fileCount = 0 try { if(Test-Path $Path.FullName){ [System.IO.Compression.zipArchive] $arc = [System.IO.Compression.ZipFile]::OpenRead($Path.FullName) [System.IO.Compression.ZipArchiveEntry]$appxmanifest = $arc.GetEntry("AppxManifest.xml") $maxfileSize=0 $maxfileName="" $uncompressedSize=0 $fileCount = $arc.Entries.Count foreach($file in $arc.Entries){ if($file.Length -gt $maxfileSize){ $maxfileSize = $file.Length $maxfileName = $file.FullName } $UncompressedSize += $file.Length } [system.IO.StreamReader]$z = $appxmanifest.Open() $appxxml = $z.ReadToEnd() $z = $null #$null=$z.Close() #$z.Dispose() [System.IO.Compression.ZipArchiveEntry] $appxmanifest = $arc.GetEntry("StreamMap.xml") [system.IO.StreamReader] $z = $appxmanifest.Open() $appvStreamMapp = $z.ReadToEnd() $z = $null #$null=$z.Close() #$z.Dispose() $arc.Dispose() } else { Write-Verbose "AppV file not found" throw [System.IO.FileNotFoundException] "$Path not found." } } catch [System.UnauthorizedAccessException] { [Management.Automation.ErrorRecord]$e = $_ $info = [PSCustomObject]@{ Exception = $e.Exception.Message Reason = $e.CategoryInfo.Reason Target = $e.CategoryInfo.TargetName Script = $e.InvocationInfo.ScriptName Line = $e.InvocationInfo.ScriptLineNumber Column = $e.InvocationInfo.OffsetInLine } return $info } #$ErrorActionPreference = 'SilentlyContinue' #$ErrorActionPreference = 'Continue' #Create Object #AppVInProcExt attribute in Office! #BrowserPlugInsEnabled, Microsoft create a command for disabled PlugIns :-( $InfoObj = @("Name, Discription, ConfigPath, AppVSchemaVersion, OSMinVersion, OSMaxVersionTested, TargetOSes, MaxfileSize, MaxfilePath, FileCount, HasShortcuts, Shortcuts, HasFileTypeAssociation, FileTypeAssociation, UncompressedSize, ComMode,InProcessEnabled, OutOfProcessEnabled, FullVFSWriteMode, HasApplicationCapabilities, ApplicationCapabilities, AppVInProcExt, AssetIntelligence, HasFonts, HasSxSAssemblys, SxSAssemblys, HasComComponents, HasApplications, Applications, HasFB1, HasShellExtensions, HasEnvironmentVariables, EmptyStreamMap, PackageFullLoad, HasActiveXComponents, HasUserScripts, UserScripts, HasMachineScripts, MachineScripts, HasBrowserPlugins, HasBrowserHelpObject, ApplicationCapabilitiesEnabled, EnvironmentVariablesEnabled , ShortCutsEnabled, FileTypeAssociationsEnabled, ObjectsEnabled, ObjectsMode, ServicesEnabled, HasServices, Services, RegistryEnabled, FileSystemEnabled, FontsEnabled, SoftwareClientsEnabled".replace("`n", "").replace("`r", "").replace(" ", "").split(',')) $AppxInfo = New-Object PSCustomObject $InfoObj | ForEach-Object {$AppxInfo | add-member -membertype NoteProperty -name $_ -Value $null } $AppxInfo.MaxfilePath = $maxfileName $AppxInfo.MaxfileSize = $maxfileSize $AppxInfo.UncompressedSize = $UncompressedSize $AppxInfo.FileCount = $fileCount $AppxInfo.ConfigPath = $Path #Test for Schema $Namespaces = @($appxxml.SelectNodes('//namespace::*[not(. = ../../namespace::*)]')) $AppxInfo.AppVSchemaVersion = 1 if($Namespaces.'#Text'.Contains($NamespaceAppv1_1)){ $AppxInfo.AppVSchemaVersion = 2 } if($Namespaces.'#Text'.Contains($NamespaceAppv1_2)){ $AppxInfo.AppVSchemaVersion = 3 } #Test for FeatureBlock 1 $AppxInfo.EmptyStreamMap = $false $AppxInfo.PackageFullLoad = $false if(($null -ne $appvStreamMapp.StreamMap.FeatureBlock) -and ($appvStreamMapp.StreamMap.FeatureBlock.Id.Contains("PrimaryFeatureBlock"))){ $AppxInfo.HasFB1 = $true foreach($block in $appvStreamMapp.StreamMap.FeatureBlock){ #Hier ist ein Fehler! if($appvStreamMapp.StreamMap.FeatureBlock.GetAttribute("LoadAll") -eq $true){ $AppxInfo.PackageFullLoad = $true } } } else { $AppxInfo.HasFB1 = $false if($null -eq $appvStreamMapp.StreamMap.FeatureBlock){ $AppxInfo.EmptyStreamMap = $true } } #Basedata $AppxInfo.OSMinVersion = $appxxml.Package.Prerequisites.OSMinVersion $AppxInfo.OSMaxVersionTested = $appxxml.Package.Prerequisites.OSMaxVersionTested $AppxInfo.TargetOSes = $appxxml.Package.Prerequisites.TargetOSes $AppxInfo.Discription = $appxxml.Package.Properties.AppVPackageDescription #Shortcuts $AppxInfo.HasShortcuts = ([string]($appxxml.Package.Extensions.Extension.Shortcut)).trim().Length -gt 0 $AppxInfo.Shortcuts = New-Object System.Collections.ArrayList if($AppxInfo.HasShortcuts ){ foreach($sub in @($appxxml.Package.Extensions.ChildNodes)){ if($sub.Category -eq "AppV.Shortcut"){ $sk = "" | Select-Object -Property Icon, Target, File, Arguments $sk.Icon = $sub.shortcut.Icon $sk.File = $sub.shortcut.File $sk.Arguments = $sub.shortcut.Arguments $sk.Target = $sub.shortcut.Target $null = $AppxInfo.Shortcuts.add($sk) } } } #Objects if($null -ne $appxxml.Package.Extensions.Extension.Objects.NotIsolate){ $AppxInfo.ObjectsMode = "NotIsolate" } else { $AppxInfo.ObjectsMode = "Isolate" } #FileTypeAssosinations $AppxInfo.HasFileTypeAssociation = ([string]($appxxml.Package.Extensions.Extension.FileTypeAssociation)).trim().Length -gt 0 $AppxInfo.FileTypeAssociation = New-Object System.Collections.ArrayList if ( $AppxInfo.HasFileTypeAssociation) { #Array! $AppxInfo.HasFileTypeAssociation = $true foreach ($sub in @($appxxml.Package.Extensions.ChildNodes)) { if ($sub.Category -eq "AppV.FileTypeAssociation") { if ($null -ne $sub.FileTypeAssociation.FileExtension.Name) { $sk = "" | Select-Object -Property Name, ProcID $sk.Name = $sub.FileTypeAssociation.FileExtension.Name $sk.ProcID = $sub.FileTypeAssociation.FileExtension.ProgId $null = $AppxInfo.FileTypeAssociation.add($sk) } } } } #Services $AppxInfo.HasServices = ([string]($appxxml.Package.Extensions.Extension.Service)).trim().Length -gt 0 $AppxInfo.Services = New-Object System.Collections.ArrayList if($AppxInfo.HasServices){ $AppxInfo.HasServices = $true foreach($sub in @($appxxml.Package.Extensions.ChildNodes)){ if($sub.Category -eq "AppV.Service"){ $serObj = "" | Select-Object -Property Name,DisplayName,Description,ImagePath,StartType,ServiceType,ObjectName $serObj.Name = $sub.Service.Name $serObj.DisplayName = $sub.Service.DisplayName $serObj.Description =$sub.Service.Description $serObj.ImagePath =$sub.Service.ImagePath $serObj.StartType =$sub.Service.StartType $serObj.ServiceType =$sub.Service.ServiceType $serObj.ObjectName =$sub.Service.ObjectName $null = $AppxInfo.Services.Add($serObj) } } $AppxInfo.HasServices = $true } #Applications $AppxInfo.HasApplications = $false $AppxInfo.Applications = New-Object System.Collections.ArrayList if($null -ne $appxxml.Package.Extensions.Extension.Shortcut){ $AppxInfo.HasShortcuts = $true $AppxInfo.HasApplications = $true foreach($sub in @($appxxml.Package.Applications.ChildNodes)){ $sk = "" | Select-Object -Property Icon, Target #Generate Application ID Entry $sk = "" | Select-Object -Property Name, ID $sk.Name = $Sub.VisualElements.Name $sk.ID = $sub.Target $null = $AppxInfo.Applications.add($sk) } } #Test for Fonts $AppxInfo.HasFonts = ([string]($appxxml.Package.Extensions.Extension.Fonts)).trim().Length -gt 0 #HasComCOmponents? $AppxInfo.HasComComponents = ([string]($appxxml.Package.Extensions.Extension.com)).trim().Length -gt 0 $AppxInfo.Name = $appxxml.package.Properties.DisplayName #ActiveX $AppxInfo.HasActiveXComponents = ([string]($appxxml.Package.Extensions.Extension.ActiveX.registration)).trim().Length -gt 0 #BrowserPlugIns $AppxInfo.HasBrowserPlugins = ([string]($appxxml.Package.Extensions.Extension.BrowserPlugin)).trim().Length -gt 0 #BrowerHelpObjects if($AppxInfo.HasBrowserPlugins) { $AppxInfo.HasBrowserHelpObject = $appxxml.Package.Extensions.Extension.BrowserPlugin.subcategory.Contains("BrowserHelperObject") } else { $AppxInfo.HasBrowserHelpObject = $false} $AppxInfo.FullVFSWriteMode = Get-FalseOrTrue -value $appxxml.Package.Properties.FullVFSWriteMode $AppxInfo.AppVInProcExt = Get-FalseOrTrue -value $appxxml.Package.Properties.AppVInProcExt #ComMode $AppxInfo.ComMode = "Isolated" $AppxInfo.InProcessEnabled = $true $AppxInfo.OutOfProcessEnabled = $false #Maybe empty if(($null -ne $appxxml.Package.ExtensionsConfiguration) -and ($null -ne $appxxml.Package.ExtensionsConfiguration.COM)){ $AppxInfo.ComMode = $appxxml.Package.ExtensionsConfiguration.COM.Mode $AppxInfo.InProcessEnabled = $appxxml.Package.ExtensionsConfiguration.COM.IntegratedCOMAttributes.InProcessEnabled $AppxInfo.OutOfProcessEnabled = $appxxml.Package.ExtensionsConfiguration.COM.IntegratedCOMAttributes.OutOfProcessEnabled } #AssetIntelligence $AppxInfo.AssetIntelligence = @() $AppAssets = New-Object PSObject foreach($asset in $appxxml.Package.AssetIntelligence.childNodes ){ $AppAssets = New-Object PSObject foreach($item in @("SoftwareCode", "ProductName", "ProductVersion", "Publisher", "ProductID", "Language", "ChannelCode", "InstallDate","RegisteredUser","InstalledLocation","CM_DSLID","VersionMajor","VersionMinor","ServicePack","UpgradeCode","OsComponent" )){ $AppAssets | Add-Member -MemberType NoteProperty -Name $item -Value $($asset."$Item") } $AppxInfo.AssetIntelligence += $AppAssets } #Assemblies $AppxInfo.HasSxSAssemblys = ([string]($appxxml.Package.Extensions.Extension.SxSAssembly)).trim().Length -gt 0 $AppxInfo.SxSAssemblys = New-Object System.Collections.ArrayList #Test for Assemblies if($AppxInfo.HasSxSAssemblys){ $AppxInfo.SxSAssemblys = @($appxxml.Package.Extensions.Extension.SxSAssembly.Name) } else { $AppxInfo.HasSxSAssemblys= $false } #ApplicationCapabilities with CapabilitiesWow64 hive $AppxInfo.ApplicationCapabilities = new-Object System.Collections.ArrayList $capBase = $appxxml.Package.Extensions.Extension.ApplicationCapabilities.CapabilityGroup.Capabilities.FileAssociationList if($null -eq $capBase){ $capBase = $appxxml.Package.Extensions.Extension.ApplicationCapabilities.CapabilityGroup.CapabilitiesWOW64.FileAssociationList } #Test for ApplicationCapabilities - or CapabilitiesWow64 if($null -ne $capBase){ $AppxInfo.HasApplicationCapabilities = $true foreach($item in $capBase.FileAssociation){ $sk = "" | Select-Object -Property Name, ProcID $sk.Name = $Item.Extension $sk.ProcID = $Item.ProgId $null = $AppxInfo.ApplicationCapabilities.add($sk) } } else { $AppxInfo.HasApplicationCapabilities = $false } #Test for Environment $AppxInfo.HasEnvironmentVariables = ([string]($appxxml.Package.Extensions.Extension.EnvironmentVariables)).trim().Length -gt 0 #Test for ShellExtensions $AppxInfo.HasShellExtensions = ([string]($appxxml.Package.Extensions.Extension.ShellExtension)).trim().Length -gt 0 #UserScripts $AppxInfo.HasUserScripts = $false $UserScriptConstants = @('StartProcess','ExitProcess','StartVirtualEnvironment','TerminateVirtualEnvironment','PublishPackage','UnpublishPackage') $AppxInfo.UserScripts = New-Object System.Collections.ArrayList $AppxInfo.HasUserScripts=$false foreach($sc in $appxxml.Package.UserScripts){ $AppxInfo.HasUserScripts=$true foreach($type in $UserScriptConstants){ if($null -ne $sc.$type){ $sk = "" | Select-Object -Property Path, ApplicationId, Trigger $sk.Trigger = $type $sk.Path = $sc.$type.Path $sk.ApplicationID = $sc.$type.ApplicationID $null = $AppxInfo.UserScripts.add($sk) } } } #MachineScripts $AppxInfo.HasMachineScripts = $false $UserScriptConstants = @('PublishPackage','UnpublishPackage','AddPackage','RemovePackage') $AppxInfo.MachineScripts = New-Object System.Collections.ArrayList $AppxInfo.HasMachineScripts=$false foreach($sc in $appxxml.Package.MachineScripts){ $AppxInfo.HasMachineScripts=$true foreach($type in $UserScriptConstants){ if($null -ne $sc.$type){ $sk = "" | Select-Object -Property Path, ApplicationId, Trigger $sk.Trigger = $type $sk.Path = $sc.$type.Path $sk.ApplicationID = $sc.$type.ApplicationID $null = $AppxInfo.MachineScripts.add($sk) } } } #Subsystems Extension configuration $AppxInfo.ApplicationCapabilitiesEnabled = $true $AppxInfo.EnvironmentVariablesEnabled = $true $AppxInfo.ShortCutsEnabled = $true $AppxInfo.FileTypeAssociationsEnabled = $true $AppxInfo.ObjectsEnabled = $true $AppxInfo.ServicesEnabled = $true $AppxInfo.RegistryEnabled = $true $AppxInfo.FileSystemEnabled = $true $AppxInfo.FontsEnabled = $true $AppxInfo.SoftwareClientsEnabled = $true if($appxxml.Package.ExtensionsConfiguration.ApplicationCapabilities.Enabled -eq $false){ $AppxInfo.ApplicationCapabilitiesEnabled = $false } if($appxxml.Package.ExtensionsConfiguration.EnvironmentVariables.Enabled -eq $false){ $AppxInfo.EnvironmentVariablesEnabledEnabled = $false } if($appxxml.Package.ExtensionsConfiguration.ShortCuts.Enabled -eq $false){ $AppxInfo.ShortCutsEnabled = $false } if($appxxml.Package.ExtensionsConfiguration.FileTypeAssociations.Enabled -eq $false){ $AppxInfo.ileTypeAssociationsEnabled = $false } if($appxxml.Package.ExtensionsConfiguration.Objects.Enabled -eq $false){ $AppxInfo.ObjectsEnabled = $false } if($appxxml.Package.ExtensionsConfiguration.Services.Enabled -eq $false){ $AppxInfo.ServicesEnabled = $false } if($appxxml.Package.ExtensionsConfiguration.Registry.Enabled -eq $false){ $AppxInfo.RegistryEnabled = $false } if($appxxml.Package.ExtensionsConfiguration.FileSystem.Enabled -eq $false){ $AppxInfo.FileSystemEnabled = $false } if($appxxml.Package.ExtensionsConfiguration.Fonts.Enabled -eq $false){ $AppxInfo.FontsEnabled = $false } if($appxxml.Package.ExtensionsConfiguration.SoftwareClients.Enabled -eq $false){ $AppxInfo.SoftwareClientsEnabled = $false } return $AppxInfo } } # SIG # Begin signature block # MIIetQYJKoZIhvcNAQcCoIIepjCCHqICAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU+//kSs2T87ZiJ8KRZlRlT12Z # PQugghm/MIIEhDCCA2ygAwIBAgIQQhrylAmEGR9SCkvGJCanSzANBgkqhkiG9w0B # AQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNV # BAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRU # cnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTA1MDYwNzA4MDkxMFoXDTIwMDUzMDEw # NDgzOFowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2Fs # dCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8G # A1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNF # UkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6q # gT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VRloTN2+O5bj4x # 2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ # w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbH # d2pBnqcP1/vulBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh # 2JU022R5KP+6LhHC5ehbkkj7RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzT # bafc8H9vg2XiaquHhnUCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rE # JlTvA73gJMtUGjAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwDgYDVR0P # AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQG # A1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVz # dEV4dGVybmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGG # GWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEFBQADggEBAE1C # L6bBiusHgJBYRoz4GTlmKjxaLG3P1NmHVY15CxKIe0CP1cf4S41VFmOtt1fcOyu9 # 08FPHgOHS0Sb4+JARSbzJkkraoTxVHrUQtr802q7Zn7Knurpu9wHx8OSToM8gUmf # ktUyCepJLqERcZo20sVOaLbLDhslFq9s3l122B9ysZMmhhfbGN6vRenf+5ivFBjt # pF72iZRF8FUESt3/J90GSkD2tLzx5A+ZArv9XQ4uKMG+O18aP5cQhLwWPtijnGMd # ZstcX9o+8w8KCTUi29vAPwD55g1dZ9H9oB4DK9lA977Mh2ZUgKajuPUZYtXSJrGY # Ju6ay0SnRVqBlRUa9VEwggTmMIIDzqADAgECAhBiXE2QjNVC+6supXM/8VQZMA0G # CSqGSIb3DQEBBQUAMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNV # BAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdv # cmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMU # VVROLVVTRVJGaXJzdC1PYmplY3QwHhcNMTEwNDI3MDAwMDAwWhcNMjAwNTMwMTA0 # ODM4WjB6MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVy # MRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEg # MB4GA1UEAxMXQ09NT0RPIFRpbWUgU3RhbXBpbmcgQ0EwggEiMA0GCSqGSIb3DQEB # AQUAA4IBDwAwggEKAoIBAQCqgvGEqVvYcbXSXSvt9BMgDPmb6dGPdF5u7uspSNjI # vizrCmFgzL2SjXzddLsKnmhOqnUkcyeuN/MagqVtuMgJRkx+oYPp4gNgpCEQJ0Ca # WeFtrz6CryFpWW1jzM6x9haaeYOXOh0Mr8l90U7Yw0ahpZiqYM5V1BIR8zsLbMaI # upUu76BGRTl8rOnjrehXl1/++8IJjf6OmqU/WUb8xy1dhIfwb1gmw/BC/FXeZb5n # OGOzEbGhJe2pm75I30x3wKoZC7b9So8seVWx/llaWm1VixxD9rFVcimJTUA/vn9J # AV08m1wI+8ridRUFk50IYv+6Dduq+LW/EDLKcuoIJs0ZAgMBAAGjggFKMIIBRjAf # BgNVHSMEGDAWgBTa7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQUZCKGtkqJ # yQQP0ARYkiuzbj0eJ2wwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8C # AQAwEwYDVR0lBAwwCgYIKwYBBQUHAwgwEQYDVR0gBAowCDAGBgRVHSAAMEIGA1Ud # HwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZp # cnN0LU9iamVjdC5jcmwwdAYIKwYBBQUHAQEEaDBmMD0GCCsGAQUFBzAChjFodHRw # Oi8vY3J0LnVzZXJ0cnVzdC5jb20vVVROQWRkVHJ1c3RPYmplY3RfQ0EuY3J0MCUG # CCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEB # BQUAA4IBAQARyT3hBeg7ZazJdDEDt9qDOMaSuv3N+Ntjm30ekKSYyNlYaDS18Ash # U55ZRv1jhd/+R6pw5D9eCJUoXxTx/SKucOS38bC2Vp+xZ7hog16oYNuYOfbcSV4T # p5BnS+Nu5+vwQ8fQL33/llqnA9abVKAj06XCoI75T9GyBiH+IV0njKCv2bBS7vzI # 7bec8ckmONalMu1Il5RePeA9NbSwyVivx1j/YnQWkmRB2sqo64sDvcFOrh+RMrjh # JDt77RRoCYaWKMk7yWwowiVp9UphreAn+FOndRWwUTGw8UH/PlomHmB+4uNqOZrE # 6u4/5rITP1UDBE0LkHLU6/u8h5BRsjgZMIIE/jCCA+agAwIBAgIQK3PbdGMRTFpb # MkryMFdySTANBgkqhkiG9w0BAQUFADB6MQswCQYDVQQGEwJHQjEbMBkGA1UECBMS # R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD # T01PRE8gQ0EgTGltaXRlZDEgMB4GA1UEAxMXQ09NT0RPIFRpbWUgU3RhbXBpbmcg # Q0EwHhcNMTkwNTAyMDAwMDAwWhcNMjAwNTMwMTA0ODM4WjCBgzELMAkGA1UEBhMC # R0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9y # ZDEYMBYGA1UECgwPU2VjdGlnbyBMaW1pdGVkMSswKQYDVQQDDCJTZWN0aWdvIFNI # QS0xIFRpbWUgU3RhbXBpbmcgU2lnbmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A # MIIBCgKCAQEAv1I2gjrcdDcNeNV/FlAZZu26GpnRYziaDGayQNungFC/aS42Lwpn # P0ChSopjNZvQGcx0qhcZkSu1VSAZ+8AaOm3KOZuC8rqVoRrYNMe4iXtwiHBRZmns # d/7GlHJ6zyWB7TSCmt8IFTcxtG2uHL8Y1Q3P/rXhxPuxR3Hp+u5jkezx7M5ZBBF8 # rgtgU+oq874vAg/QTF0xEy8eaQ+Fm0WWwo0Si2euH69pqwaWgQDfkXyVHOaeGWTf # dshgRC9J449/YGpFORNEIaW6+5H6QUDtTQK0S3/f4uA9uKrzGthBg49/M+1BBuJ9 # nj9ThI0o2t12xr33jh44zcDLYCQD3npMqwIDAQABo4IBdDCCAXAwHwYDVR0jBBgw # FoAUZCKGtkqJyQQP0ARYkiuzbj0eJ2wwHQYDVR0OBBYEFK7u2WC6XvUsARL9jo2y # VXI1Rm/xMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQM # MAoGCCsGAQUFBwMIMEAGA1UdIAQ5MDcwNQYMKwYBBAGyMQECAQMIMCUwIwYIKwYB # BQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMEIGA1UdHwQ7MDkwN6A1oDOG # MWh0dHA6Ly9jcmwuc2VjdGlnby5jb20vQ09NT0RPVGltZVN0YW1waW5nQ0FfMi5j # cmwwcgYIKwYBBQUHAQEEZjBkMD0GCCsGAQUFBzAChjFodHRwOi8vY3J0LnNlY3Rp # Z28uY29tL0NPTU9ET1RpbWVTdGFtcGluZ0NBXzIuY3J0MCMGCCsGAQUFBzABhhdo # dHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQUFAAOCAQEAen+pStKw # pBwdDZ0tXMauWt2PRR3wnlyQ9l6scP7T2c3kGaQKQ3VgaoOkw5mEIDG61v5MzxP4 # EPdUCX7q3NIuedcHTFS3tcmdsvDyHiQU0JzHyGeqC2K3tPEG5OfkIUsZMpk0uRlh # dwozkGdswIhKkvWhQwHzrqJvyZW9ljj3g/etfCgf8zjfjiHIcWhTLcuuquIwF4Mi # KRi14YyJ6274fji7kE+5Xwc0EmuX1eY7kb4AFyFu4m38UnnvgSW6zxPQ+90rzYG2 # V4lO8N3zC0o0yoX/CLmWX+sRE+DhxQOtVxzhXZIGvhvIPD+lIJ9p0GnBxcLJPufF # cvfqG5bilK+GLjCCBWMwggRLoAMCAQICEQCNpmTSLuzUmCLFvasjR87HMA0GCSqG # SIb3DQEBCwUAMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNo # ZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1p # dGVkMSMwIQYDVQQDExpDT01PRE8gUlNBIENvZGUgU2lnbmluZyBDQTAeFw0xODA3 # MDgwMDAwMDBaFw0yMDA3MDcyMzU5NTlaMIGtMQswCQYDVQQGEwJERTEOMAwGA1UE # EQwFMzA1MzkxFjAUBgNVBAgMDU5pZWRlcnNhY2hzZW4xETAPBgNVBAcMCEhhbm5v # dmVyMRMwEQYDVQQJDApEcmlidXNjaCAyMSYwJAYDVQQKDB1OaWNrIEluZm9ybWF0 # aW9uc3RlY2huaWsgR21iSDEmMCQGA1UEAwwdTmljayBJbmZvcm1hdGlvbnN0ZWNo # bmlrIEdtYkgwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrc6lZm8xu # lPRIGaegFWyjuDkhYm5qdzcj0ZcLh+GLefGrZsTb8ZwqD3XwhNsKeYmRlds5chg8 # Y7YVnHbtXVThuL51O64W6B5n2CzZyeJVFrc6AyAGEnUPl8ooyywcS6Ch+a2879Jm # otLXWKwRnDbvGz/OAGYE8MYWp/uD/xkSvqW5RwJoDK3/e3n6aVESXDyj+MfMiZQy # KKGL7W5tdcMngApa1Ner3ifk0+GevD7zRyImBH5mglzXq22DBlbMLBfhi7IWiDFf # eWbmoxP3sd+imMRlejR//kA+QxHdxnlvpvgz6uvyPzZDuf9my3YYR/IHJb/rwi5S # TXLB4BH0uTqxAgMBAAGjggGrMIIBpzAfBgNVHSMEGDAWgBQpkWD/ik366/mmarjP # +eZLvUnOEjAdBgNVHQ4EFgQUJoBGq4fcme5y6uv+6ukStosAu4MwDgYDVR0PAQH/ # BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZI # AYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQMCMCswKQYIKwYB # BQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5uZXQvQ1BTMEMGA1UdHwQ8MDow # OKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JTQUNvZGVTaWdu # aW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA+BggrBgEFBQcwAoYyaHR0cDovL2Ny # dC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5jcnQwJAYIKwYB # BQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTAcBgNVHREEFTATgRFhLm5p # Y2tAbmljay1pdC5kZTANBgkqhkiG9w0BAQsFAAOCAQEAB9Yo3aM+0hPf1l3Ckn3x # xdlVtZZ/yhhaXDB2eMSkL3RuSGsmkvWBa64+S44DawxcdOqsZcMkmyMFC7NE9NHK # r31mSVAfakNoOcVV18pGxmUermlsKIYkyrHki8AMOVYYxWI1gWV9tLWYZmswqWQa # YACmcu+8Rm964vjcDVcNC+ENGFxT2WOiWSolUvbgn8nz/mO4gVJkI34ZuxT5gj6m # EPLUt2pWYaSswDHHQ9ytrsQrbumqeu9ygm9xWW5pzv7FNxSMtj/XpCtKUphmaLWK # J99HIz3ypySk+hat6x5Sfre49claJnb/mU6PyVWp3yR3p4KjfTsJF0yvQrmmKV8X # YTCCBeAwggPIoAMCAQICEC58h8wOk0pS/pT9HLfNNK8wDQYJKoZIhvcNAQEMBQAw # gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO # BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD # VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDUw # OTAwMDAwMFoXDTI4MDUwODIzNTk1OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT # EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR # Q09NT0RPIENBIExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBSU0EgQ29kZSBTaWdu # aW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAppiQY3eRNH+K # 0d3pZzER68we/TEds7liVz+TvFvjnx4kMhEna7xRkafPnp4ls1+BqBgPHR4gMA77 # YXuGCbPj/aJonRwsnb9y4+R1oOU1I47Jiu4aDGTH2EKhe7VSA0s6sI4jS0tj4CKU # N3vVeZAKFBhRLOb+wRLwHD9hYQqMotz2wzCqzSgYdUjBeVoIzbuMVYz31HaQOjNG # UHOYXPSFSmsPgN1e1r39qS/AJfX5eNeNXxDCRFU8kDwxRstwrgepCuOvwQFvkBoj # 4l8428YIXUezg0HwLgA3FLkSqnmSUs2HD3vYYimkfjC9G7WMcrRI8uPoIfleTGJ5 # iwIGn3/VCwIDAQABo4IBUTCCAU0wHwYDVR0jBBgwFoAUu69+Aj36pvE8hI6t7jiY # 7NkyMtQwHQYDVR0OBBYEFCmRYP+KTfrr+aZquM/55ku9Sc4SMA4GA1UdDwEB/wQE # AwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEG # A1UdIAQKMAgwBgYEVR0gADBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNv # bW9kb2NhLmNvbS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBx # BggrBgEFBQcBAQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2Eu # Y29tL0NPTU9ET1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8v # b2NzcC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAAI/AjnD7vjKO4ne # DG1NsfFOkk+vwjgsBMzFYxGrCWOvq6LXAj/MbxnDPdYaCJT/JdipiKcrEBrgm7EH # IhpRHDrU4ekJv+YkdK8eexYxbiPvVFEtUgLidQgFTPG3UeFRAMaH9mzuEER2V2rx # 31hrIapJ1Hw3Tr3/tnVUQBg2V2cRzU8C5P7z2vx1F9vst/dlCSNJH0NXg+p+IHdh # yE3yu2VNqPeFRQevemknZZApQIvfezpROYyoH3B5rW1CIKLPDGwDjEzNcweU51qO # OgS6oqF8H8tjOhWn1BUbp1JHMqn0v2RH0aofU04yMHPCb7d4gp1c/0a7ayIdiAv4 # G6o0pvyM9d1/ZYyMMVcx0DbsR6HPy4uo7xwYWMUGd8pLm1GvTAhKeo/io1Lijo7M # JuSy2OU4wqjtxoGcNWupWGFKCpe0S0K2VZ2+medwbVn4bSoMfxlgXwyaiGwwrFIJ # kBYb/yud29AgyonqKH4yjhnfe0gzHtdl+K7J+IMUk3Z9ZNCOzr41ff9yMU2fnr0e # bC+ojwwGUPuMJ7N2yfTm18M04oyHIYZh/r9VdOEhdwMKaGy75Mmp5s9ZJet87EUO # eWZo6CLNuO+YhU2WETwJitB/vCgoE/tqylSNklzNwmWYBp7OSFvUtTeTRkF8B93P # +kPvumdh/31J4LswfVyA4+YWOUunMYIEYDCCBFwCAQEwgZIwfTELMAkGA1UEBhMC # R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9y # ZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBS # U0EgQ29kZSBTaWduaW5nIENBAhEAjaZk0i7s1Jgixb2rI0fOxzAJBgUrDgMCGgUA # oHgwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYB # BAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0B # CQQxFgQUBIm+RPQTFpTUhHyBCPQOphClMS4wDQYJKoZIhvcNAQEBBQAEggEAL0DR # YGWTFs0hrEJgY5+6fpjKB4aps49qJ0U8BO93O7RBPJ2wA63iF0nbM89HSYIFTw/4 # NQ6qF5pHnysh9iCSxWrLnsjRU0vncVmEY9FdESUgp33ZdmH9CTZKPU4qVHmiUw3x # T/KlOGD+D3WJeZpthJPO65bRGW6QV9Pxpew6QH3336GrmQ4KpDO9ilyR4mg0myno # 0yMRvfj2uJLR49cgsqjGRpzt9KSzvAQE/F08p3+FGqShyATpUa8u1ngrlBBiH+vK # n5OQca4fnXS/FnDzp69Qc/2P84BPa4bP9WdUROEjf4afuxgXZPllOOet8NyrtPTL # inFkCVq2cp/0X+XNzaGCAigwggIkBgkqhkiG9w0BCQYxggIVMIICEQIBATCBjjB6 # MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD # VQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEgMB4GA1UE # AxMXQ09NT0RPIFRpbWUgU3RhbXBpbmcgQ0ECECtz23RjEUxaWzJK8jBXckkwCQYF # Kw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkF # MQ8XDTIwMDEyMjE0MTIzOVowIwYJKoZIhvcNAQkEMRYEFFcV5tfjLtmKPX6hD1uG # T7JP3BB2MA0GCSqGSIb3DQEBAQUABIIBALHDlBYUMPh38wpLIbH9jAK+vH6WktxL # HyYFUYsHv/K3ddCU0vBl4Du2fX3qqjHOPD0L9DmitcgznD7LM/W+wDIz8zXxXm+j # gTbfPGyUzuRoFqjvb5m35SsZjrlHK86WuSX1HCqmm3M6Mzgbni8J25Qtv/S4DM4P # sPp3Atq3grgVAo3cTII81kBzTRB2n7PrPxw2OPoqYDdbb4iXtEs2CsBnnAqANG9Y # QnKi+SeA3L6/kUVApZl1SYeGQqWv7lpWbNsquJv/m1bYiUzCGUP6OZdxyfRl9Aju # VYVYYlzpaHXacv04aSiuJT5taCN2RDjIeV5DvAsHX2BnoBnfNdABhBc= # SIG # End signature block |