public/Get-IvantiWCRegistry.ps1
|
<#
.SYNOPSIS Reads and parses Ivanti Workspace Control registry sets from a Building Block XML file or a standalone .reg file. .DESCRIPTION Accepts either: - An Ivanti Workspace Control Building Block XML file: extracts every <registry type="registry"> node, decodes the hex-encoded registryfile, and parses it. Name and description are taken from the <name> and <description> XML elements. - A standalone .reg file: parses it directly. Name and description are read from the ;<PFNAME> and ;<PFDESC> comment tags if present. Each value entry is returned as a structured object with its registry hive, key, value name, value data, value type, and an optional per-value description captured from the ;<PF>...</PF> comment tag that may follow the value line. Supports all standard .reg value types: - REG_SZ (quoted string or hex(1):) - REG_EXPAND_SZ (hex(2):) - REG_BINARY (hex: / hex(3):) - REG_DWORD (dword: / hex(4):) - REG_MULTI_SZ (hex(7):) - REG_QWORD (qword: / hex(b):) .PARAMETER Path Path to an Ivanti Workspace Control Building Block XML file or a standalone .reg file. .PARAMETER ExportFor Target export format. 'AppVentiX' adds the AppVentiXParams property to each output object. .EXAMPLE # From a Building Block XML Get-IvantiWCRegistry -Path 'C:\temp\LAB-BB.xml' .EXAMPLE # From a standalone .reg file, exported for AppVentiX Get-IvantiWCRegistry -Path 'C:\temp\registry.reg' -ExportFor AppVentiX .LINK Import-IvantiWCRegistry .NOTES Function : Get-IvantiWCRegistry Author : John Billekens Copyright : (c) John Billekens Consultancy & AppVentiX Version : 2026.0825.1200 #> function Get-IvantiWCRegistry { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [ValidateScript({ Test-Path $_ -PathType Leaf })] [string]$Path, [ValidateSet('AppVentiX', 'WEM')] [string]$ExportFor = 'AppVentiX' ) #region Internal helpers function Convert-HexToString { param([string]$HexString) if ([string]::IsNullOrEmpty($HexString)) { return '' } $bytes = for ($i = 0; $i -lt $HexString.Length; $i += 2) { [System.Convert]::ToByte($HexString.Substring($i, 2), 16) } return [System.Text.Encoding]::GetEncoding(1252).GetString($bytes) } function Convert-RegEscapedString { # .reg string values escape a backslash as \\ and a quote as \". Without this a path # such as "%userprofile%\\Documents" keeps its doubled separators. param([string]$Value) return $Value -replace '\\([\\"])', '$1' } function Convert-RegistryHexToValue { param([string]$hexString, [string]$type) $hexData = $hexString -replace '^hex\(\w+\):', '' -replace '[,\s]', '' if ([string]::IsNullOrEmpty($hexData)) { return $null } try { $bytes = for ($i = 0; $i -lt $hexData.Length; $i += 2) { [System.Convert]::ToByte($hexData.Substring($i, 2), 16) } switch ($type) { 'REG_SZ' { return [System.Text.Encoding]::Unicode.GetString($bytes).TrimEnd([char]0) } 'REG_EXPAND_SZ' { return [System.Text.Encoding]::Unicode.GetString($bytes).TrimEnd([char]0) } 'REG_BINARY' { return [System.BitConverter]::ToString($bytes) } 'REG_DWORD' { if ($bytes.Count -eq 4) { return [System.BitConverter]::ToUInt32($bytes, 0) } return $null } 'REG_MULTI_SZ' { $fullString = [System.Text.Encoding]::Unicode.GetString($bytes) return ($fullString -split '\0' | Where-Object { $_ }) } 'REG_QWORD' { if ($bytes.Count -eq 8) { return [System.BitConverter]::ToUInt64($bytes, 0) } return $null } default { return [System.BitConverter]::ToString($bytes) } } } catch { Write-Warning "Could not decode hex value for type $type. Error: $_" return $hexString } } function ConvertTo-RegistryEntries { param( [string]$Name, [string]$Description, [string]$RegContent, [string]$SourceFile, [bool]$Enabled = $true, [bool]$RunOnce = $false, [string]$ExportFor = 'WEM', [PSCustomObject[]]$Assignments = @() ) $lines = $RegContent.Split([string[]]@("`r`n", "`n", "`r"), [StringSplitOptions]::None) # If name/description not provided, fall back to PFNAME/PFDESC tags in the content $resolvedName = $Name $resolvedDescription = $Description if ([string]::IsNullOrEmpty($resolvedName) -or [string]::IsNullOrEmpty($resolvedDescription)) { foreach ($line in $lines) { if ([string]::IsNullOrEmpty($resolvedName) -and $line -match ';<PFNAME>(.+)</PFNAME>') { $resolvedName = $Matches[1].Trim() } if ([string]::IsNullOrEmpty($resolvedDescription) -and $line -match ';<PFDESC>(.+)</PFDESC>') { $resolvedDescription = $Matches[1].Trim() } if (-not [string]::IsNullOrEmpty($resolvedName) -and -not [string]::IsNullOrEmpty($resolvedDescription)) { break } } } Write-Verbose "Registry set: '$resolvedName' | Description: '$resolvedDescription' | Enabled: '$Enabled' | RunOnce: '$RunOnce'" $entries = [System.Collections.Generic.List[PSCustomObject]]::new() $currentHive = '' $currentKey = '' for ($i = 0; $i -lt $lines.Length; $i++) { $line = $lines[$i] # Section header: [HKEY_...] or ![HKEY_...] (delete entire key) if ($line -match '^(!?)\[((HKEY_[^\\]+)(\\(.+))?)\]$') { $isKeyDeletion = $Matches[1] -eq '!' $sectionHive = $Matches[3] $sectionKey = if ($Matches[5]) { $Matches[5] } else { '' } if ($isKeyDeletion) { # Emit a key-deletion entry; do not update current section context Write-Verbose " Delete key: $sectionHive\$sectionKey" $entries.Add([PSCustomObject]([ordered]@{ RegistryHive = $sectionHive RegistryKey = $sectionKey RegistryKeyPath = if ([string]::IsNullOrEmpty($sectionKey)) { $sectionHive } else { "$sectionHive\$sectionKey" } RegistryValueName = $null Value = $null ValueType = $null Description = '' Delete = $true })) } else { $currentHive = $sectionHive $currentKey = $sectionKey Write-Verbose " Section: $currentHive\$currentKey" } continue } # Skip comments, blank lines, and the editor header if ([string]::IsNullOrWhiteSpace($line) -or $line.StartsWith(';') -or $line.StartsWith('Windows Registry Editor')) { continue } # Skip structural placeholder default values (@="") on keys with no meaningful path # These are Ivanti reg file artifacts — empty-string default values on intermediate keys if ($line -match '^@=""$' -and [string]::IsNullOrEmpty($currentKey)) { continue } # Deletion marker on value: !"ValueName"=... $isDeletion = $false $parsedLine = $line if ($parsedLine.TrimStart().StartsWith('!"')) { $isDeletion = $true $parsedLine = $parsedLine.TrimStart().Substring(1) } $valueName = $null $rawValue = $null if ($parsedLine -match '^"([^"]*)"=(.+)') { $valueName = $Matches[1] $rawValue = $Matches[2].Trim() } elseif ($parsedLine -match '^@=(.+)') { $valueName = '' $rawValue = $Matches[1].Trim() } else { continue } # Skip empty-string default values on intermediate keys (structural artifacts) if ($valueName -eq '' -and $rawValue -eq '""') { continue } # Peek at next line for optional ;<PF>...</PF> per-value description $valueDescription = '' if (($i + 1) -lt $lines.Length -and $lines[$i + 1] -match ';<PF>(.+)</PF>') { $valueDescription = $Matches[1].Trim() } # Decode value data and determine type $registryValue = $null $registryValueType = 'Unknown' if ($rawValue.StartsWith('dword:')) { $registryValueType = 'REG_DWORD' try { $registryValue = [uint64]("0x" + $rawValue.Substring(6)) } catch { $registryValue = $rawValue; $registryValueType = 'Unknown' } } elseif ($rawValue.StartsWith('qword:')) { $registryValueType = 'REG_QWORD' try { $registryValue = [uint64]("0x" + $rawValue.Substring(6)) } catch { $registryValue = $rawValue; $registryValueType = 'Unknown' } } elseif ($rawValue.StartsWith('"') -and $rawValue.EndsWith('"')) { $registryValueType = 'REG_SZ' $registryValue = Convert-RegEscapedString -Value $rawValue.Substring(1, $rawValue.Length - 2) } elseif ($rawValue.StartsWith('hex(1):')) { $registryValueType = 'REG_SZ' $registryValue = Convert-RegistryHexToValue -hexString $rawValue -type 'REG_SZ' } elseif ($rawValue.StartsWith('hex(2):')) { $registryValueType = 'REG_EXPAND_SZ' $registryValue = Convert-RegistryHexToValue -hexString $rawValue -type 'REG_EXPAND_SZ' } elseif ($rawValue.StartsWith('hex(3):') -or $rawValue.StartsWith('hex:')) { $registryValueType = 'REG_BINARY' $registryValue = Convert-RegistryHexToValue -hexString $rawValue -type 'REG_BINARY' } elseif ($rawValue.StartsWith('hex(4):')) { $registryValueType = 'REG_DWORD' $registryValue = Convert-RegistryHexToValue -hexString $rawValue -type 'REG_DWORD' } elseif ($rawValue.StartsWith('hex(7):')) { $registryValueType = 'REG_MULTI_SZ' $registryValue = Convert-RegistryHexToValue -hexString $rawValue -type 'REG_MULTI_SZ' } elseif ($rawValue.StartsWith('hex(b):')) { $registryValueType = 'REG_QWORD' $registryValue = Convert-RegistryHexToValue -hexString $rawValue -type 'REG_QWORD' } else { $registryValueType = 'REG_SZ' $registryValue = $rawValue } $entries.Add( [PSCustomObject]( [PSCustomObject]@{ RegistryHive = $currentHive RegistryKey = $currentKey RegistryKeyPath = if ([string]::IsNullOrEmpty($currentKey)) { $currentHive } else { "$currentHive\$currentKey" } RegistryValueName = $valueName Value = $registryValue ValueType = $registryValueType Description = $valueDescription Delete = $isDeletion } ) ) } Write-Verbose " Parsed $($entries.Count) registry value(s)" $output = [ordered]@{ Name = $resolvedName Description = $resolvedDescription Enabled = $Enabled RunOnce = $RunOnce Entries = $entries.ToArray() SourceFile = $SourceFile } if ($ExportFor -eq 'AppVentiX') { $registryEntries = @( foreach ($entry in $entries) { $deleteKey = $false if ($entry.Delete -eq $true -and [string]::IsNullOrEmpty($entry.RegistryValueName)) { $deleteKey = $true } $valueType = $entry.ValueType if ([string]::IsNullOrEmpty(($valueType))) { $valueType = 'REG_SZ' } [PSCustomObject]@{ RootKey = $entry.RegistryHive KeyPath = $entry.RegistryKey ValueName = $entry.RegistryValueName ValueData = $entry.Value ValueType = $valueType Action = if ($entry.Delete) { 'Remove' } else { 'Set' } DeleteKey = $deleteKey } } ) $output.AppVentiXAssignments = @($Assignments | Select-Object Sid, Name, Type, DomainFQDN) $output.AppVentiXParams = ( [ordered]@{ FriendlyName = $resolvedName Description = $resolvedDescription RegistryEntries = @($registryEntries) } ) } elseif ($ExportFor -eq 'WEM') { Write-Warning "WEM export format is not implemented yet for registry sets!" } [PSCustomObject]$output } #endregion $absolutePath = (Resolve-Path -LiteralPath $Path).Path $extension = [System.IO.Path]::GetExtension($absolutePath).ToLower() if ($extension -eq '.xml') { # Building Block XML — extract all <registry type="registry"> nodes Write-Verbose "Loading Building Block XML: $absolutePath" try { # ConvertFrom-IvantiBB strips <webtop> sections, these contain nested XML declarations that XmlDocument rejects $xmlContent = ConvertFrom-IvantiBB -XmlFilePath $absolutePath } catch { $PSCmdlet.ThrowTerminatingError( [System.Management.Automation.ErrorRecord]::new( [System.Xml.XmlException]::new("Failed to parse XML file '$absolutePath': $($_.Exception.Message)"), 'XmlParseError', [System.Management.Automation.ErrorCategory]::InvalidData, $absolutePath ) ) } $registryNodes = @($xmlContent.GetElementsByTagName('registry') | Where-Object { $_.type -eq 'registry' }) Write-Verbose "Found $($registryNodes.Count) registry set node(s)" if ($registryNodes.Count -eq 0) { Write-Warning "No <registry type='registry'> nodes found in '$absolutePath'" return } foreach ($node in $registryNodes) { $nodeName = $node.name $nodeDescription = $node.description $decodedContent = (Convert-HexToString -HexString $node.registryfile).TrimStart([char]0xFEFF) if ($node.enabled -ieq "yes") { $enabled = $true } else { $enabled = $false } if ($node.runonce -ieq "yes") { $runOnce = $true } else { $runOnce = $false } Write-Verbose "Processing registry set: '$nodeName'" $Assignments = @(ConvertFrom-IvantiAccessControl -AccessControl $node.accesscontrol -IWCComponentName $nodeName -IWCComponent "Policy") ConvertTo-RegistryEntries -Name $nodeName -Description $nodeDescription -RunOnce $runOnce -RegContent $decodedContent -SourceFile $absolutePath -ExportFor $ExportFor -Assignments $Assignments } } else { # Standalone .reg file Write-Verbose "Loading .reg file: $absolutePath" try { $rawContent = Get-Content -LiteralPath $absolutePath -Raw -ErrorAction Stop } catch { $PSCmdlet.ThrowTerminatingError( [System.Management.Automation.ErrorRecord]::new( [System.IO.IOException]::new("Failed to read file '$absolutePath': $($_.Exception.Message)"), 'RegFileReadError', [System.Management.Automation.ErrorCategory]::ReadError, $absolutePath ) ) } ConvertTo-RegistryEntries -Name '' -Description '' -RegContent $rawContent -SourceFile $absolutePath -ExportFor $ExportFor } } # SIG # Begin signature block # MII5zAYJKoZIhvcNAQcCoII5vTCCObkCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAMq9/ASovpoeV8 # /wOsoaaKDiwv5Vvq1lk+hR4VkubxK6CCIfAwggXMMIIDtKADAgECAhBUmNLR1FsZ # lUgTecgRwIeZMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu # dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy # MDAeFw0yMDA0MTYxODM2MTZaFw00NTA0MTYxODQ0NDBaMHcxCzAJBgNVBAYTAlVT # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jv # c29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo # b3JpdHkgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALORKgeD # Bmf9np3gx8C3pOZCBH8Ppttf+9Va10Wg+3cL8IDzpm1aTXlT2KCGhFdFIMeiVPvH # or+Kx24186IVxC9O40qFlkkN/76Z2BT2vCcH7kKbK/ULkgbk/WkTZaiRcvKYhOuD # PQ7k13ESSCHLDe32R0m3m/nJxxe2hE//uKya13NnSYXjhr03QNAlhtTetcJtYmrV # qXi8LW9J+eVsFBT9FMfTZRY33stuvF4pjf1imxUs1gXmuYkyM6Nix9fWUmcIxC70 # ViueC4fM7Ke0pqrrBc0ZV6U6CwQnHJFnni1iLS8evtrAIMsEGcoz+4m+mOJyoHI1 # vnnhnINv5G0Xb5DzPQCGdTiO0OBJmrvb0/gwytVXiGhNctO/bX9x2P29Da6SZEi3 # W295JrXNm5UhhNHvDzI9e1eM80UHTHzgXhgONXaLbZ7LNnSrBfjgc10yVpRnlyUK # xjU9lJfnwUSLgP3B+PR0GeUw9gb7IVc+BhyLaxWGJ0l7gpPKWeh1R+g/OPTHU3mg # trTiXFHvvV84wRPmeAyVWi7FQFkozA8kwOy6CXcjmTimthzax7ogttc32H83rwjj # O3HbbnMbfZlysOSGM1l0tRYAe1BtxoYT2v3EOYI9JACaYNq6lMAFUSw0rFCZE4e7 # swWAsk0wAly4JoNdtGNz764jlU9gKL431VulAgMBAAGjVDBSMA4GA1UdDwEB/wQE # AwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIftJqhSobyhmYBAcnz1AQ # T2ioojAQBgkrBgEEAYI3FQEEAwIBADANBgkqhkiG9w0BAQwFAAOCAgEAr2rd5hnn # LZRDGU7L6VCVZKUDkQKL4jaAOxWiUsIWGbZqWl10QzD0m/9gdAmxIR6QFm3FJI9c # Zohj9E/MffISTEAQiwGf2qnIrvKVG8+dBetJPnSgaFvlVixlHIJ+U9pW2UYXeZJF # xBA2CFIpF8svpvJ+1Gkkih6PsHMNzBxKq7Kq7aeRYwFkIqgyuH4yKLNncy2RtNwx # AQv3Rwqm8ddK7VZgxCwIo3tAsLx0J1KH1r6I3TeKiW5niB31yV2g/rarOoDXGpc8 # FzYiQR6sTdWD5jw4vU8w6VSp07YEwzJ2YbuwGMUrGLPAgNW3lbBeUU0i/OxYqujY # lLSlLu2S3ucYfCFX3VVj979tzR/SpncocMfiWzpbCNJbTsgAlrPhgzavhgplXHT2 # 6ux6anSg8Evu75SjrFDyh+3XOjCDyft9V77l4/hByuVkrrOj7FjshZrM77nq81YY # uVxzmq/FdxeDWds3GhhyVKVB0rYjdaNDmuV3fJZ5t0GNv+zcgKCf0Xd1WF81E+Al # GmcLfc4l+gcK5GEh2NQc5QfGNpn0ltDGFf5Ozdeui53bFv0ExpK91IjmqaOqu/dk # ODtfzAzQNb50GQOmxapMomE2gj4d8yu8l13bS3g7LfU772Aj6PXsCyM2la+YZr9T # 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggalMIIEjaADAgECAhMzAAYWnItq # 2rzK2H0+AAAABhacMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDMwHhcNMjYwOTEzMTYwNjIyWhcNMjYwOTE2 # MTYwNjIyWjBoMQswCQYDVQQGEwJOTDEWMBQGA1UECBMNTm9vcmQtSG9sbGFuZDEP # MA0GA1UEBxMGSGVpbG9vMRcwFQYDVQQKEw5BcHBWZW50aVggQi5WLjEXMBUGA1UE # AxMOQXBwVmVudGlYIEIuVi4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIB # gQCJ8RAejS/ySdKh4AYMzB7lDhSpY0sEWhyrSC2FFLV/CZ6tmKo3CDBkc+CZcagY # E+wQyP2mUo62Ftwg426HCOcrQFvqN/9KB9isXnIt2eVscoY0mFO5dTXQRlBZi+In # 4WZVwiraEwgsSOexXhV8cy8XHb6XFAhbkFF9yCDtm+ht9wLWKcLrR+GaX0PTwSyD # 6OmHqgz5ktBmrx1dOIg6U5lK6GKWnJdhdyKmCia6GZMGILib7fhG9X9mFo0avT78 # g+zHVOZs3xjXgxgJC3hEXY29bVyzY8J/bBFt7eEfxXoQ5SAKsRd9nQKGpSQsSxn+ # gqBN4jUAlnTE9xgPiIfLoGxiHu3StQK/Zj74x01zjTkf0xZzie0cbCZiljBJwVKB # x0Mxd1Mhl/gPGlWEoIwpXpmou1aIj+xwGm2HgPYstv3BXXpSWN/wkloyrtBluKl+ # i89Y7994lVPHZfAS71hEGnvSUN9PokEZ2/lOccGqY20pIwS93U/vhJ1gBW3YiGnh # oW8CAwEAAaOCAdQwggHQMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDsG # A1UdJQQ0MDIGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhorBgEEAYI3YaL8yC6uh9F6 # gZ2lyVCBwcKCJzAdBgNVHQ4EFgQU5eqUD0Rjq+0fZ7GOJBIsgqiVpiUwHwYDVR0j # BBgwFoAUa16lNMMFxWJKIVqOq3NgYtSsY4UwZwYDVR0fBGAwXjBcoFqgWIZWaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQl # MjBWZXJpZmllZCUyMENTJTIwRU9DJTIwQ0ElMjAwMy5jcmwwdAYIKwYBBQUHAQEE # aDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUyMENB # JTIwMDMuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w # DQYJKoZIhvcNAQEMBQADggIBAK0MeKtzOlQmTEz6035FrN7FV6WFbJKwxNCaCOnx # U7GvTjFyTLdEaRD5f8Okn7ETAfytQZ48MaK8Io4jjfhT2lx7SYrdWFdhNjiv1pCm # v/5LApBsRGrL8oixP70qPhGAE3yyw/D/ZQCqYBFHZjNqz7jZhWD5jL81stBa+5OX # hnHQKlOTAdfLgIRsnigcm3OKiPPcGQRWxZvIRfFTO2t2dg7PQ/oBqwqNc94p8cQ0 # Z4BC/jNGZJYmtPhgC74MMJPhI2zzZgq+ILbr/HuZ7+P+yQzPnc/kdvD9AI5pmiO3 # KEsfDR13ixQ+INCjDG1dOsRODE3spjzhnu7fQUpNA9i6o7tnAbfhVmy1DxyxEjwo # VtbiasWKbaVABy6TEYqt7mIkhnElUcW3cUuApBrP6NsZ/P/NuPLUNjmBV/LL2rLU # nkE5Xj5LZJksm6eRlMhv5kPR6815/QZVAN1/x8/1pjBnuycHeQGKEmR+8bdzwwuN # K9aLGVoZFODQ9PVlofey5+dqpPDvtKQPRnxJQkAFmInB2LtbU+qeoblliZQolgfo # 069cEuBiDv74gFi+nX1INBt+CrH0XmQe9yQK5sVtoQbYkj7Ig2jJZn5ru2kYiCRc # uTN9yDeLpoOJWCgDY0ZqoE3ma8Cye8wpqhYSKd+snyQlrIaXDA4xtLQky0LWc3Ty # zAcXMIIGpTCCBI2gAwIBAgITMwAGFpyLatq8yth9PgAAAAYWnDANBgkqhkiG9w0B # AQwFADBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgRU9DIENBIDAz # MB4XDTI2MDkxMzE2MDYyMloXDTI2MDkxNjE2MDYyMlowaDELMAkGA1UEBhMCTkwx # FjAUBgNVBAgTDU5vb3JkLUhvbGxhbmQxDzANBgNVBAcTBkhlaWxvbzEXMBUGA1UE # ChMOQXBwVmVudGlYIEIuVi4xFzAVBgNVBAMTDkFwcFZlbnRpWCBCLlYuMIIBojAN # BgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAifEQHo0v8knSoeAGDMwe5Q4UqWNL # BFocq0gthRS1fwmerZiqNwgwZHPgmXGoGBPsEMj9plKOthbcIONuhwjnK0Bb6jf/ # SgfYrF5yLdnlbHKGNJhTuXU10EZQWYviJ+FmVcIq2hMILEjnsV4VfHMvFx2+lxQI # W5BRfcgg7ZvobfcC1inC60fhml9D08Esg+jph6oM+ZLQZq8dXTiIOlOZSuhilpyX # YXcipgomuhmTBiC4m+34RvV/ZhaNGr0+/IPsx1TmbN8Y14MYCQt4RF2NvW1cs2PC # f2wRbe3hH8V6EOUgCrEXfZ0ChqUkLEsZ/oKgTeI1AJZ0xPcYD4iHy6BsYh7t0rUC # v2Y++MdNc405H9MWc4ntHGwmYpYwScFSgcdDMXdTIZf4DxpVhKCMKV6ZqLtWiI/s # cBpth4D2LLb9wV16Uljf8JJaMq7QZbipfovPWO/feJVTx2XwEu9YRBp70lDfT6JB # Gdv5TnHBqmNtKSMEvd1P74SdYAVt2Ihp4aFvAgMBAAGjggHUMIIB0DAMBgNVHRMB # Af8EAjAAMA4GA1UdDwEB/wQEAwIHgDA7BgNVHSUENDAyBgorBgEEAYI3YQEABggr # BgEFBQcDAwYaKwYBBAGCN2Gi/MgurofReoGdpclQgcHCgicwHQYDVR0OBBYEFOXq # lA9EY6vtH2exjiQSLIKolaYlMB8GA1UdIwQYMBaAFGtepTTDBcViSiFajqtzYGLU # rGOFMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w # a2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUy # MENBJTIwMDMuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUy # MFZlcmlmaWVkJTIwQ1MlMjBFT0MlMjBDQSUyMDAzLmNydDBUBgNVHSAETTBLMEkG # BFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br # aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQCtDHir # czpUJkxM+tN+RazexVelhWySsMTQmgjp8VOxr04xcky3RGkQ+X/DpJ+xEwH8rUGe # PDGivCKOI434U9pce0mK3VhXYTY4r9aQpr/+SwKQbERqy/KIsT+9Kj4RgBN8ssPw # /2UAqmARR2Yzas+42YVg+Yy/NbLQWvuTl4Zx0CpTkwHXy4CEbJ4oHJtziojz3BkE # VsWbyEXxUztrdnYOz0P6AasKjXPeKfHENGeAQv4zRmSWJrT4YAu+DDCT4SNs82YK # viC26/x7me/j/skMz53P5Hbw/QCOaZojtyhLHw0dd4sUPiDQowxtXTrETgxN7KY8 # 4Z7u30FKTQPYuqO7ZwG34VZstQ8csRI8KFbW4mrFim2lQAcukxGKre5iJIZxJVHF # t3FLgKQaz+jbGfz/zbjy1DY5gVfyy9qy1J5BOV4+S2SZLJunkZTIb+ZD0evNef0G # VQDdf8fP9aYwZ7snB3kBihJkfvG3c8MLjSvWixlaGRTg0PT1ZaH3sufnaqTw77Sk # D0Z8SUJABZiJwdi7W1PqnqG5ZYmUKJYH6NOvXBLgYg7++IBYvp19SDQbfgqx9F5k # HvckCubFbaEG2JI+yINoyWZ+a7tpGIgkXLkzfcg3i6aDiVgoA2NGaqBN5mvAsnvM # KaoWEinfrJ8kJayGlwwOMbS0JMtC1nN08swHFzCCBygwggUQoAMCAQICEzMAAAAV # BT5uGY6TKdkAAAAAABUwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMCVVMxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0 # IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAzMjYxODEx # MjhaFw0zMTAzMjYxODExMjhaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmll # ZCBDUyBFT0MgQ0EgMDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDg # 9Ms9AqovDnMePvMOe+KybhCd8+lokzYORlS3kBVXseecbyGwBcsenlm5bLtMGPji # IFLzBQF+ghlVV/U29q5GcdeEEBCHTTGhL2koIrLc4UrliMRcbv9mOMtR/l7/xAmv # 0Fx4BJHn1dHt37fvrBqXmKjKfGf5DpyO/+hnV7TEreMtS19iO+bjZ/9Hnpg3PCk0 # e7YSbRTFkx97FZwRWpC4s3NepRfRXQh/WMAj7JmsYeVZohi4TF5yW2JMrJZqwHcy # zJZYtD2Hlno5ZEJkdiZcEaxHOobmwO06Z1J9c23ps9PGIhGaq1sKLEAz9Doc5rLk # YWGteDrscKhAp2kIc/oYlH9Ij6BkOqqgWINEkEtC8ZNG1Mak+h3o65aj0iQKmdxW # 7IZaHO5cuyoMi+KtYfXeIIg3sVIbS2EL8kUtsDGdEqNqAq/isqTi1jXqLe6iKp1n # i1SPdvPW9G03CTsYF68b/yuIQRwbdoBCXemMNJCS0dorCRY4b2WAAy4ng7SANcEg # rBgZf535+QfLU5hGzrKjIpbMabauWb5FKWUKkMsPcXFkXRWO4noKPm4KWlFypqOp # bJ/KONVReIlxHQRegAOBzIhRB7gr9IDQ1sc2MgOgQ+xVGW4oq4HD0mfAiwiyLskZ # rkaQ7JoanYjBNcR9RS26YxAVbcBtLitFTzCIEg5ZdQIDAQABo4IB3DCCAdgwDgYD # VR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRrXqU0wwXF # YkohWo6rc2Bi1KxjhTBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYz # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku # aHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQIMAYBAf8C # AQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0fBGkwZzBl # oGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9z # b2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAy # MS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZp # ZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqGSIb3DQEB # DAUAA4ICAQBdbiI8zwXLX8glJEh/8Q22UMCUhWBO46Z9FPhwOR3mdlqRVLkYOon/ # MczUwrjDhx3X99SPH5PSflkGoTvnO9ZWHM5YFVYpO7NYuB+mfVSGAGZwiGOASWk0 # i2B7vn9nElJJmoiXxugfH5YdBsrUgTt0AFNXkzmqTgk+S1Hxb1u/0HCqEHVZPk2A # /6eJXYbtpRM5Fcz00jisUl9BRZgSebODV85bBzOveqyC3f0PnHCxRJNhMb8xP/sB # /VI7pf2rheSV7zqUSv8vn/fIMblXeaVIlpqoq8SP9BJMjE/CoVXJxnkZQRM1Fa7k # N9yztvReOhxSgPgpZx/Xl/jkwyEFVJTBfBp3sTgfIc/pmqv2ehtakL2AEj78EmOP # QohxJT3wyX+P78GA25tLpAvzj3RMMHd8z18ZuuVi+60MAzGpOASH1L8Nlr3fZRZn # QO+pyye2DCvYmHaIfdUgYJqn7noxxGVv89+RaETh1tgCDvwNpFCSG7vl5A4ako+2 # fx409r9TWjXC7Oif1IQ5ZJzB4Rf8GvBiHYjvMmHpledp1FGRLdSRFVpC3/OKpZY6 # avIqZp7+8pP/WQP903DdgrvAT6W4xPOBxXPa4tGksN3SuqJaiFYHSNyeBufn8ise # ujW4IbBSbHD4BPqbF3qZ+7nG9d/d/G2/Lx4kH9cCmBfmsZdSkHmukDCCB54wggWG # oAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAwdzELMAkG # A1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UE # AxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENlcnRpZmlj # YXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQwMTIwMTUy # MFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQ # Q0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLwwK8ZiCji # 3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQacr1AwoN # cHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4As1Bs076I # u+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLLw0nV+ayQ # 2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmrKDp5+Tcm # JX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDpHOLJs+qG # 8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9NEJv9weF # xhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE/5VpIVbc # Nr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+eKpWLtr+b # Gecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtSRtR8bvxV # FyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2ogc+qM6K # 4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNVHQ8BAf8E # BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns72nX9c0p # nqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJ # KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME # GDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRl # bnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRo # b3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsGAQUFBzAC # hnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m # dCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRl # JTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVv # Y3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEAfyUqnv7U # q+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQEeW4LqK0 # wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYEa3oW8oVH # +KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbAzPt9ThVN # 3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hNh3UEauY0 # byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSLWjinMLXN # OAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry358ZTFcx # 0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQVoCgPCqr+ # PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdVVVNSyALQ # e6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k7Yww94lD # f+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2TdaC1ZOmBX # iCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghcyMIIXLgIBATBxMFoxCzAJBgNV # BAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMT # Ik1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBFT0MgQ0EgMDMCEzMABhaci2ravMrY # fT4AAAAGFpwwDQYJYIZIAWUDBAIBBQCgXjAQBgorBgEEAYI3AgEMMQIwADAZBgkq # hkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQgNjVWHyU2H1Bq # zNMdjvy2pjdrhRfjfGnjsS5oc/+OypUwDQYJKoZIhvcNAQEBBQAEggGANaJPKoEm # 7hCDC5RUrvI1GZ2JgGhfOr36j0RzSLf0KAi7WmL9pX9/bY+OrB0O2OfUpc9aBPHe # /ZlLmBwTakv0Job7b7t8134Z4hvmimsaIHF7wBPMpr4rO2CJkMb8UojOwyoj4GT0 # eA6IH1wImnk5wjS9hCeEKCyn9CHF/VR7Kh3UMDj1dxG002Gv5it/xuOQFxOrcjky # LAeaFkui6pm3611RHYU5r1iQ6WtR5NUSsvFbabn/dLA8v+XsJxtXrXKBjitEPSKt # 296oTWIQ6WZ2UWY15NK0OKwjZjRS+Xg/TXLGQPHl7+MqR24xQYmah9GXLzDwKfNn # M1eqdXBqH/S+RKYd7FxRAR3OTWkBIi9m7Bd4gpLf7/dwyy/2MKKTyF4/b/xJV3w2 # 10BMpeBhp1vfMuO6OGwqPnVkTHQtfbETJEj7FxTEt7/dcXwE2K6BIsZgchOwgy5I # XIyYfEEnEejbqEYK1S7QWxadTU+Slq+sr3t5M1RkOiYo81EpDcl602ZxoYIUsjCC # FK4GCisGAQQBgjcDAwExghSeMIIUmgYJKoZIhvcNAQcCoIIUizCCFIcCAQMxDzAN # BglghkgBZQMEAgEFADCCAWoGCyqGSIb3DQEJEAEEoIIBWQSCAVUwggFRAgEBBgor # BgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIOlU+6K9DOFIEwC//942M8WzlN5c # hJu9yXxc0/1bECXhAgZqmrFLiisYEzIwMjYwOTE1MTE1OTU0LjM1M1owBIACAfSg # gemkgeYwgeMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTAr # BgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUG # A1UECxMeblNoaWVsZCBUU1MgRVNOOjdCMUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxN # aWNyb3NvZnQgUHVibGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eaCCDykw # ggeCMIIFaqADAgECAhMzAAAABeXPD/9mLsmHAAAAAAAFMA0GCSqGSIb3DQEBDAUA # MHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # SDBGBgNVBAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBD # ZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMDExMTkyMDMyMzFaFw0zNTEx # MTkyMDQyMzFaMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y # cG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFt # cGluZyBDQSAyMDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnnzn # UmP94MWfBX1jtQYioxwe1+eXM9ETBb1lRkd3kcFdcG9/sqtDlwxKoVIcaqDb+omF # io5DHC4RBcbyQHjXCwMk/l3TOYtgoBjxnG/eViS4sOx8y4gSq8Zg49REAf5huXhI # kQRKe3Qxs8Sgp02KHAznEa/Ssah8nWo5hJM1xznkRsFPu6rfDHeZeG1Wa1wISvlk # pOQooTULFm809Z0ZYlQ8Lp7i5F9YciFlyAKwn6yjN/kR4fkquUWfGmMopNq/B8U/ # pdoZkZZQbxNlqJOiBGgCWpx69uKqKhTPVi3gVErnc/qi+dR8A2MiAz0kN0nh7SqI # NGbmw5OIRC0EsZ31WF3Uxp3GgZwetEKxLms73KG/Z+MkeuaVDQQheangOEMGJ4pQ # ZH55ngI0Tdy1bi69INBV5Kn2HVJo9XxRYR/JPGAaM6xGl57Ei95HUw9NV/uC3yFj # rhc087qLJQawSC3xzY/EXzsT4I7sDbxOmM2rl4uKK6eEpurRduOQ2hTkmG1hSuWY # BunFGNv21Kt4N20AKmbeuSnGnsBCd2cjRKG79+TX+sTehawOoxfeOO/jR7wo3liw # kGdzPJYHgnJ54UxbckF914AqHOiEV7xTnD1a69w/UTxwjEugpIPMIIE67SFZ2PMo # 27xjlLAHWW3l1CEAFjLNHd3EQ79PUr8FUXetXr0CAwEAAaOCAhswggIXMA4GA1Ud # DwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUa2koOjUvSGNA # z3vYr0npPtk92yEwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0 # dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0 # bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMA # QTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFMh+0mqFKhvKGZgEByfPUBBP # aKiiMIGEBgNVHR8EfTB7MHmgd6B1hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v # cGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUy # MFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3JsMIGUBggr # BgEFBQcBAQSBhzCBhDCBgQYIKwYBBQUHMAKGdWh0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmlj # YXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNy # dDANBgkqhkiG9w0BAQwFAAOCAgEAX4h2x35ttVoVdedMeGj6TuHYRJklFaW4sTQ5 # r+k77iB79cSLNe+GzRjv4pVjJviceW6AF6ycWoEYR0LYhaa0ozJLU5Yi+LCmcrdo # vkl53DNt4EXs87KDogYb9eGEndSpZ5ZM74LNvVzY0/nPISHz0Xva71QjD4h+8z2X # MOZzY7YQ0Psw+etyNZ1CesufU211rLslLKsO8F2aBs2cIo1k+aHOhrw9xw6JCWON # NboZ497mwYW5EfN0W3zL5s3ad4Xtm7yFM7Ujrhc0aqy3xL7D5FR2J7x9cLWMq7eb # 0oYioXhqV2tgFqbKHeDick+P8tHYIFovIP7YG4ZkJWag1H91KlELGWi3SLv10o4K # Gag42pswjybTi4toQcC/irAodDW8HNtX+cbz0sMptFJK+KObAnDFHEsukxD+7jFf # EV9Hh/+CSxKRsmnuiovCWIOb+H7DRon9TlxydiFhvu88o0w35JkNbJxTk4MhF/Kg # aXn0GxdH8elEa2Imq45gaa8D+mTm8LWVydt4ytxYP/bqjN49D9NZ81coE6aQWm88 # TwIf4R4YZbOpMKN0CyejaPNN41LGXHeCUMYmBx3PkP8ADHD1J2Cr/6tjuOOCztfp # +o9Nc+ZoIAkpUcA/X2gSMkgHAPUvIdtoSAHEUKiBhI6JQivRepyvWcl+JYbYbBh7 # pmgAXVswggefMIIFh6ADAgECAhMzAAAAWXzacemNXvXAAAAAAABZMA0GCSqGSIb3 # DQEBDAUAMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGlu # ZyBDQSAyMDIwMB4XDTI2MDEwODE4NTkwMVoXDTI3MDEwNzE4NTkwMVowgeMxCzAJ # BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jv # c29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVs # ZCBUU1MgRVNOOjdCMUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVi # bGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEB # BQADggIPADCCAgoCggIBAKYu5/40eEX+hT+5jFa146bid3dA4LnXYntvkP3CGw4L # GARFhnvLMSJ/VtsubzDaeFnm7yb2KSM70WmHQprdCVqpvUH7l0uB4jNw7urLoAR9 # kKHLE0VlMlDStDSxUBI3qwsdrjvdmvV0k+9/njuDEiSlzJTf7Dowd1K3bO4beRya # FhR+Y8tymECOqlOAffYrG2wZdVM51+QSBSe+PEykr8C6OnnqSipuF8fZvCb6/huk # 0Zm6ZwsaixSHIAT2IEGvS7c63Im8jV3a8R0K6i2yiw0NNlnTSpwy/Zfv7iwsLBwh # fbjBTn+XOl6mPzDXQQ3V+SRP9xXbGKOsBTxzGid7aKAHw3o4Ahl9UGWLH9kNP3VU # okE6JYkjlfpuUGZ6gQyqDewfxD4VoYIlopt4HZ0xQvqajuJx+cr8LR/IZ56gLLmw # yMzde5+vtjBoilry/gSZwVGwgkvkIgpKPBQHGsSB0y3szr7Y7wEb6v0yZal1XUvW # nnz3inTaSWsCFrLPVwVmXy3ncY5/d25VpOkht+m697GWNbvsNOhAOHRaftE9j/hh # koM6RsyJfBLnhqMcA/wcavf5oj5NeyRQdGZeLKcls9csKS3sBUzPidxx2iiNH9CP # aDq/bLJEOXasYohXMnRinu+fUk81s8VO7DQSF6ffn5oqSHoV8lf1Ax6u+kdShb8B # AgMBAAGjggHLMIIBxzAdBgNVHQ4EFgQUj5bnC18D0vlnSRhCOiODGGuXNnYwHwYD # VR0jBBgwFoAUa2koOjUvSGNAz3vYr0npPtk92yEwbAYDVR0fBGUwYzBhoF+gXYZb # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw # UHVibGljJTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNybDB5Bggr # BgEFBQcBAQRtMGswaQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwUHVibGljJTIwUlNBJTIwVGltZXN0 # YW1waW5nJTIwQ0ElMjAyMDIwLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQM # MAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBmBgNVHSAEXzBdMFEGDCsGAQQB # gjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v # cGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQCMA0GCSqGSIb3DQEB # DAUAA4ICAQBEMhzC/ZcjpG/zURE7z2Yp5vrUxUjsE5Xa3t/2RGvESwvbmsk3bLHh # SFAajgo2XQ8xoGDP3sUhKCLPeICSbkVv6V8sSp8fJ8Jos6yrawf2YVis8tcV+OO7 # U9S6JGPQzpmPncfzQc4ne1fqZ4+HiKabIDEoFdddQT2Egkk9fzxCY/EZ52avJ27d # SfrI/IDmyn9V10O3iQpg2F+C9vNTrk7nVgoDoHa9+Q3pYr0IHGnSmt5irgGT436z # o5WnXP8FxMhswH1aiyiSZiVzhor10C9C52cP3C8/PEoMKUXstLjoPO0TMkeW/1Fr # 186KXD45QRgBo0xImgtWTdzWFnlD+p7+iDBIuSrNcRXDRYuq/aYZaDhWSI0SYdPI # WVh5XvXuWA31a8oQ0SO+oPa3Nk80k0864wiiyJ1KsbSnaaefg9vspeghrpY8ljCw # xfCUtx5HQRNgAJOI8IKACK4d014Mk0hlRO0lQVRHegqIg29K6Xqkc360W2ZJGUcs # tlKokkVj6KAHjGyrLRPzepYfiZUJq4gXyxbpvKb1XJ2FN2682aUoNXo9RyRK1ch0 # f66k6+yj88kzvuC7+vJWtNDs/UpIM6Hhm0kU64JUJ7MMEQcAc7kpft7Gm7YeRK+o # KgqUgYXCfmzbX8nJXJZnPa8ADWVsIqsuNAxCI0CZXkULofqo5Be6zzGCA9QwggPQ # AgEBMHgwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5n # IENBIDIwMjACEzMAAABZfNpx6Y1e9cAAAAAAAFkwDQYJYIZIAWUDBAIBBQCgggEt # MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgF6a6 # VE23BYQJf8hPCwubSKxaPBak+yAFDasZovEqAUQwgd0GCyqGSIb3DQEJEAIvMYHN # MIHKMIHHMIGgBCDLRbqx24bpscXEJ+Hjj9xrcUVw7R8OyyMfSB2YGK3+vDB8MGWk # YzBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0Eg # MjAyMAITMwAAAFl82nHpjV71wAAAAAAAWTAiBCC0LOq2BEF0enj4k0IyqA2xoXMd # nTHq7tt4mGVsKOxLbzANBgkqhkiG9w0BAQsFAASCAgCSdpVp3Nw1gKvAzf24l7o1 # qrjYI3ffXBWV4ySVxCWSiNo3va0vuaNwnhD8FrNFvGdB2xlsXsLkntPKOKsAR0sU # ECBEoBqO8j0gTdufiPc6W6ZdpUMWV30T/bBO7UHcakUBblRhpG9cG1qvz7ikTvIU # GK2k1nrPnlK+Lp1T8qzej9FcEteiqQ1cBS/HjL+qfjvk9JC0r3F2FnzH8g3ycLEz # hC3CsizC5NCPTUh9gLN474MOjnm8kVFiBKWeX7UP6LfKSLjOwyeju0BC0poKZHDu # YOIbHVFONLzV/5BH3SPSxZL7MkEMZ8OZLEgbdg3goXEpqvD10UoqfMYAgdeZF470 # MZ9z7ku/IE/+bu4Fk+neo3Eew7HUQyddZgrSw2qSGfiF1RtfbxeOMs5qlAiKJtT2 # vMx8Ccs4Anv0LNU3E3eo4IvFzzm8WcLuDN3aLN0Vr0PmcIUISurMnwEg4yKBYwtG # A++SLOokqikmGvbMJdMcce0yQfmpQCvU9rAiuP6KA04Jub+JQ1SiIpuRm7kb3tNx # llAUcBnOWSspnzxIsME9zwKc0EBj6nQKElNFGiUrXd+DM6C5acsfyXz9lvbgJczz # 2xuh1VVKcY6BvR5MDsn5OybWr5IkE68/DCOMQ2lS840s3E31WytCWwdgHd2l6vhM # Ff4AdlKo7ErF81S9J3i9Pg== # SIG # End signature block |