Framework/Helpers/AppInsightsHelper.ps1
Set-StrictMode -Version Latest class AppInsightsHelper { static hidden [string[]] $EventsToSendForOrgTelemetry = @("TODO:"); static hidden [string[]] $EventsToSendForUsageTelemetry = @("TODO:"); static hidden [string[]] $KeysToMaskForUsageTelemetry = @("TODO:"); static hidden [string[]] $KeysToDropForUsageTelemetry = @("TODO:"); static hidden [Microsoft.ApplicationInsights.TelemetryClient] $OrgTelemetryClient; static hidden [Microsoft.ApplicationInsights.TelemetryClient] $UsageTelemetryClient; static AppInsightsHelper() { [AppInsightsHelper]::OrgTelemetryClient = [Microsoft.ApplicationInsights.TelemetryClient]::new() [AppInsightsHelper]::UsageTelemetryClient = [Microsoft.ApplicationInsights.TelemetryClient]::new() } static [void] TrackEvent([string] $Name) { [AppInsightsHelper]::TrackEvent($Name, $null, $null); } static [void] TrackEventWithOnlyProperties([string] $Name, [hashtable] $Properties) { [AppInsightsHelper]::TrackEvent($Name, $Properties, $null); } static [void] TrackEventWithOnlyMetrics([string] $Name, [hashtable] $Metrics) { [AppInsightsHelper]::TrackEvent($Name, $null, $Metrics); } static [void] TrackEvent([string] $Name, [hashtable] $Properties, [hashtable] $Metrics) { if (![RemoteReportHelper]::IsControlTelemetryEnabled()) { return; }; [AppInsightsHelper]::TrackEventInternal($Name, $Properties, $Metrics); [AppInsightsHelper]::OrgTelemetryClient.Flush(); } static [void] TrackEvents([System.Collections.ArrayList] $events) { if (![RemoteReportHelper]::IsControlTelemetryEnabled()) { return; }; foreach ($item in $events) { [AppInsightsHelper]::TrackEventInternal($item.Name, $item.Properties, $item.Metrics); } [AppInsightsHelper]::OrgTelemetryClient.Flush(); } static [void] TrackCommandExecution([string] $Name, [hashtable] $Properties, [hashtable] $Metrics, [System.Management.Automation.InvocationInfo] $invocationContext) { if (![RemoteReportHelper]::IsControlTelemetryEnabled()) { return; }; $Properties = [AppInsightsHelper]::AttachInvocationInfo($Properties, $invocationContext); [AppInsightsHelper]::TrackEventInternal($Name, $Properties, $Metrics); [AppInsightsHelper]::OrgTelemetryClient.Flush(); } static [void] TrackException([System.Management.Automation.ErrorRecord] $ErrorRecord) { [AppInsightsHelper]::TrackException($ErrorRecord, $null, $null); } static [void] TrackExceptionWithOnlyProperties([System.Management.Automation.ErrorRecord] $ErrorRecord, [hashtable] $Properties) { [AppInsightsHelper]::TrackException($ErrorRecord, $Properties, $null); } static [void] TrackExceptionWithOnlyMetrics([System.Management.Automation.ErrorRecord] $ErrorRecord, [hashtable] $Metrics) { [AppInsightsHelper]::TrackException($ErrorRecord, $null, $Metrics); } static [void] TrackException([System.Management.Automation.ErrorRecord] $ErrorRecord, [hashtable] $Properties, [hashtable] $Metrics) { #TODO: } hidden static [void] TrackEventInternal([string] $Name, [hashtable] $Properties, [hashtable] $Metrics) { $Properties = [AppInsightsHelper]::AttachCommonProperties($Properties); $Metrics = [AppInsightsHelper]::AttachCommonMetrics($Metrics); try { $event = [Microsoft.ApplicationInsights.DataContracts.EventTelemetry]::new() $event.Name = $Name $Properties.Keys | ForEach-Object { try { $event.Properties.Add($_, ($Properties[$_].ToString())); } catch { } } $Metrics.Keys | ForEach-Object { try { $event.Metrics.Add($_, $Metrics[$_]); } catch { } } [AppInsightsHelper]::OrgTelemetryClient.InstrumentationKey = [RemoteReportHelper]::GetControlTelemetryKey(); [AppInsightsHelper]::OrgTelemetryClient.TrackEvent($event); } catch { } } hidden static [hashtable] AttachCommonProperties([hashtable] $Properties) { if ($Properties -eq $null) { $Properties = @{} } else { $Properties = $Properties.Clone() } try { $NA = "NA"; try { $Properties.Add("ScanSource", [RemoteReportHelper]::GetScanSource()); } catch {} try { $module = Get-Module 'AzSDK*' | Select-Object -First 1 $Properties.Add("ScannerModuleName", $module.Name); $Properties.Add("ScannerVersion", $module.Version.ToString()); } catch {} try { $azureContext = Get-AzureRmContext try { $Properties.Add([TelemetryKeys]::SubscriptionId, $azureContext.Subscription.Id) } catch {} try { $Properties.Add([TelemetryKeys]::SubscriptionName, $azureContext.Subscription.Name) } catch {} try { $Properties.Add("AzureEnv", $azureContext.Environment.Name) } catch {} try { $Properties.Add("TenantId", $azureContext.Tenant.Id) } catch {} try { $Properties.Add("AccountId", $azureContext.Account.Id) } catch {} try { if ($Properties.ContainsKey("RunIdentifier")) { $actualRunId = $Properties["RunIdentifier"] $Properties["UniqueRunIdentifier"] = [RemoteReportHelper]::Mask($azureContext.Account.Id + '##' + $actualRunId.ToString()) } } catch {} try { $Properties.Add("AccountType", $azureContext.Account.Type); } catch {} } catch { } } catch { } return $Properties; } hidden static [hashtable] AttachCommonMetrics([hashtable] $Metrics) { if ($Metrics -eq $null) { $Metrics = @{} } else { $Metrics = $Metrics.Clone() } return $Metrics; } hidden static [hashtable] AttachInvocationInfo([hashtable] $Properties, [System.Management.Automation.InvocationInfo] $invocationContext) { if ($Properties -eq $null) { $Properties = @{} } else { $Properties = $Properties.Clone() } if ($invocationContext -eq $null) { return $Properties}; $Properties.Add("Command", $invocationContext.MyCommand.Name) $invocationContext.BoundParameters.Keys | ForEach-Object { $Properties.Add("Param" + $_, $invocationContext.BoundParameters[$_].ToString()) } $loadedModules = Get-Module | % { $_.Name + "=" + $_.Version.ToString()} $Properties.Add("LoadedModules" , ($loadedModules -join ';')) return $Properties; } } # SIG # Begin signature block # MIIkBwYJKoZIhvcNAQcCoIIj+DCCI/QCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDN+Vv6Ud5VB5cE # vldFz3BdNz48U1SBrXENk8LyTcyUP6CCDZMwggYRMIID+aADAgECAhMzAAAAjoeR # pFcaX8o+AAAAAACOMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMTYxMTE3MjIwOTIxWhcNMTgwMjE3MjIwOTIxWjCBgzEL # MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v # bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9Q # UjEeMBwGA1UEAxMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMIIBIjANBgkqhkiG9w0B # AQEFAAOCAQ8AMIIBCgKCAQEA0IfUQit+ndnGetSiw+MVktJTnZUXyVI2+lS/qxCv # 6cnnzCZTw8Jzv23WAOUA3OlqZzQw9hYXtAGllXyLuaQs5os7efYjDHmP81LfQAEc # wsYDnetZz3Pp2HE5m/DOJVkt0slbCu9+1jIOXXQSBOyeBFOmawJn+E1Zi3fgKyHg # 78CkRRLPA3sDxjnD1CLcVVx3Qv+csuVVZ2i6LXZqf2ZTR9VHCsw43o17lxl9gtAm # +KWO5aHwXmQQ5PnrJ8by4AjQDfJnwNjyL/uJ2hX5rg8+AJcH0Qs+cNR3q3J4QZgH # uBfMorFf7L3zUGej15Tw0otVj1OmlZPmsmbPyTdo5GPHzwIDAQABo4IBgDCCAXww # HwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYBBQUHAwMwHQYDVR0OBBYEFKvI1u2y # FdKqjvHM7Ww490VK0Iq7MFIGA1UdEQRLMEmkRzBFMQ0wCwYDVQQLEwRNT1BSMTQw # MgYDVQQFEysyMzAwMTIrYjA1MGM2ZTctNzY0MS00NDFmLWJjNGEtNDM0ODFlNDE1 # ZDA4MB8GA1UdIwQYMBaAFEhuZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEsw # SaBHoEWGQ2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0Nv # ZFNpZ1BDQTIwMTFfMjAxMS0wNy0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsG # AQUFBzAChkVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01p # Y0NvZFNpZ1BDQTIwMTFfMjAxMS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkq # hkiG9w0BAQsFAAOCAgEARIkCrGlT88S2u9SMYFPnymyoSWlmvqWaQZk62J3SVwJR # avq/m5bbpiZ9CVbo3O0ldXqlR1KoHksWU/PuD5rDBJUpwYKEpFYx/KCKkZW1v1rO # qQEfZEah5srx13R7v5IIUV58MwJeUTub5dguXwJMCZwaQ9px7eTZ56LadCwXreUM # tRj1VAnUvhxzzSB7pPrI29jbOq76kMWjvZVlrkYtVylY1pLwbNpj8Y8zon44dl7d # 8zXtrJo7YoHQThl8SHywC484zC281TllqZXBA+KSybmr0lcKqtxSCy5WJ6PimJdX # jrypWW4kko6C4glzgtk1g8yff9EEjoi44pqDWLDUmuYx+pRHjn2m4k5589jTajMW # UHDxQruYCen/zJVVWwi/klKoCMTx6PH/QNf5mjad/bqQhdJVPlCtRh/vJQy4njpI # BGPveJiiXQMNAtjcIKvmVrXe7xZmw9dVgh5PgnjJnlQaEGC3F6tAE5GusBnBmjOd # 7jJyzWXMT0aYLQ9RYB58+/7b6Ad5B/ehMzj+CZrbj3u2Or2FhrjMvH0BMLd7Hald # G73MTRf3bkcz1UDfasouUbi1uc/DBNM75ePpEIzrp7repC4zaikvFErqHsEiODUF # he/CBAANa8HYlhRIFa9+UrC4YMRStUqCt4UqAEkqJoMnWkHevdVmSbwLnHhwCbww # ggd6MIIFYqADAgECAgphDpDSAAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYD # VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv # ZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5 # MDlaFw0yNjA3MDgyMTA5MDlaMH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo # aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y # cG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIw # MTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQ # TTS68rZYIZ9CGypr6VpQqrgGOBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULT # iQ15ZId+lGAkbK+eSZzpaF7S35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYS # L+erCFDPs0S3XdjELgN1q2jzy23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494H # DdVceaVJKecNvqATd76UPe/74ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZ # PrGMXeiJT4Qa8qEvWeSQOy2uM1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5 # bmR/U7qcD60ZI4TL9LoDho33X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGS # rhwjp6lm7GEfauEoSZ1fiOIlXdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADh # vKwCgl/bwBWzvRvUVUvnOaEP6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON # 7E1JMKerjt/sW5+v/N2wZuLBl4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xc # v3coKPHtbcMojyyPQDdPweGFRInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqw # iBfenk70lrC8RqBsmNLg1oiMCwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMC # AQAwHQYDVR0OBBYEFEhuZOVQBdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQM # HgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1Ud # IwQYMBaAFHItOgIxkEO5FAVO4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0 # dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0Nl # ckF1dDIwMTFfMjAxMV8wM18yMi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUF # BzAChkJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0Nl # ckF1dDIwMTFfMjAxMV8wM18yMi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGC # Ny4DMIGDMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp # b3BzL2RvY3MvcHJpbWFyeWNwcy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcA # YQBsAF8AcABvAGwAaQBjAHkAXwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZI # hvcNAQELBQADggIBAGfyhqWY4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4s # PvjDctFtg/6+P+gKyju/R6mj82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKL # UtCw/WvjPgcuKZvmPRul1LUdd5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7 # pKkFDJvtaPpoLpWgKj8qa1hJYx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft # 0N3zDq+ZKJeYTQ49C/IIidYfwzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4 # MnEnGn+x9Cf43iw6IGmYslmJaG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxv # FX1Fp3blQCplo8NdUmKGwx1jNpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG # 0QaxdR8UvmFhtfDcxhsEvt9Bxw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf # 0AApxbGbpT9Fdx41xtKiop96eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkY # S//WsyNodeav+vyL6wuA6mk7r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrv # QQqxP/uozKRdwaGIm1dxVk5IRcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIV # yjCCFcYCAQEwgZUwfjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEoMCYGA1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAA # AI6HkaRXGl/KPgAAAAAAjjANBglghkgBZQMEAgEFAKCBtjAZBgkqhkiG9w0BCQMx # DAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkq # hkiG9w0BCQQxIgQgC7aXRV5/50cXFHjs8l3DdxTsfVKbQEawZIa3oTdbgQMwSgYK # KwYBBAGCNwIBDDE8MDqgGIAWAEEAegBTAEQASwAgADIALgA1AC4AMaEegBxodHRw # czovL2FrYS5tcy9henNka29zc2RvY3MgMA0GCSqGSIb3DQEBAQUABIIBAKMPeoJH # SQey+IqCOboxBw2MWx3SeI/EC7jZsNPyjsTUhSjOLVGEmOuDlCtW5k2gNnIVxDcW # /IMPkU2Oah78uVvMhqwu3wpRYIDViwMyjng223c53RtMIFpyWPxCQ0P4ukntDgul # FiRVm1jbP+5Xk/uz+Ff55M4B6qqpMQjBOZV2so+b7Ej3ocK065a/vfBz0jqh117a # ap1vWVCjnYgq8kGPijc43YVW1sQwm3n7/AY7BzFMcZ23EI7YFr/D+1V2Zrd6fdGu # coytDrOcr0E72LwbhqzV1uHvs5+i5G4DlLAp6dwITo+jyfNQMCJt1Z9eJQWh5+BE # TIa2Vls1Aeqk5wahghNMMIITSAYKKwYBBAGCNwMDATGCEzgwghM0BgkqhkiG9w0B # BwKgghMlMIITIQIBAzEPMA0GCWCGSAFlAwQCAQUAMIIBPAYLKoZIhvcNAQkQAQSg # ggErBIIBJzCCASMCAQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEFAAQgKuTw # ya8DOzC1P3luLXZyBDgGqvehhQRuZHB4fRc3afICBllWiiwNuxgSMjAxNzA5MDUw # NzAzNDEuMjFaMAcCAQGAAgH0oIG5pIG2MIGzMQswCQYDVQQGEwJVUzETMBEGA1UE # CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z # b2Z0IENvcnBvcmF0aW9uMQ0wCwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVy # IERTRSBFU046NTg0Ny1GNzYxLTRGNzAxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1l # LVN0YW1wIFNlcnZpY2Wggg7QMIIGcTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTAwHhcNMTAwNzAxMjEzNjU1WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg # VGltZS1TdGFtcCBQQ0EgMjAxMDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC # ggEBAKkdDbx3EYo6IOz8E5f1+n9plGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5m # K1vwFVMnBDEfQRsalR3OCROOfGEwWbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcm # gqNFDdDq9UeBzb8kYDJYYEbyWEeGMoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5 # hoC732H8RsEnHSRnEnIaIYqvS2SJUGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/Vm # wAOWRH7v0Ev9buWayrGo8noqCjHw2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQB # wSAJk3jN/LzAyURdXhacAQVPIk0CAwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQD # AgEAMB0GA1UdDgQWBBTVYzpcijGQ80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIE # DB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNV # HSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVo # dHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29D # ZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAC # hj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1 # dF8yMDEwLTA2LTIzLmNydDCBoAYDVR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMw # gYEwPQYIKwYBBQUHAgEWMWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9j # cy9DUFMvZGVmYXVsdC5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8A # UABvAGwAaQBjAHkAXwBTAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQEL # BQADggIBAAfmiFEN4sbgmD+BcQM9naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJ # at/15/B4vceoniXj+bzta1RXCCtRgkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1 # mCRWS3TvQhDIr79/xn/yN31aPxzymXlKkVIArzgPF/UveYFl2am1a+THzvbKegBv # SzBEJCI8z+0DpZaPWSm8tv0E4XCfMkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/ # amJ/3cVKC5Em4jnsGUpxY517IW3DnKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqW # hqS9nhquBEKDuLWAmyI4ILUl5WTs9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua # 2A5HmoDF0M2n0O99g/DhO3EJ3110mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46Pio # SKv33nJ+YWtvd6mBy6cJrDm77MbL2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqH # czsI5pgt6o3gMy4SKfXAL1QnIffIrE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw # 07t0MkvfY3v1mYovG8chr1m1rtxEPJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P # 6Z0eGTgvvM9YBS7vDaBQNdrvCScc1bN+NR4Iuto229Nfj950iEkSMIIE2jCCA8Kg # AwIBAgITMwAAALM5u9QSkxWp/gAAAAAAszANBgkqhkiG9w0BAQsFADB8MQswCQYD # VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3Nv # ZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0xNjA5MDcxNzU2NThaFw0xODA5MDcx # NzU2NThaMIGzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMQ0w # CwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIERTRSBFU046NTg0Ny1GNzYx # LTRGNzAxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEi # MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCeNnl43rgvzB1J/X4pIlia9mJa # e8s5Xb3pJWhwJnfLKI9cbzWOq2jXFKmAeAIParLBEYtfZKdrO0QS95eKloQ936p/ # YWmiiAbOCfSJ5oZmQYSUM8HWIvNUWADaPV7+sKOJpmfsjT1u0yyBf2iL3eVITEPJ # Dm4bfg0CxroFalsC1A57Kw3zqleTnBJD8QXyWC2O+NUGTE3GyytRvMlkhPD2lWqV # sDNYU9QObnUVIr64s81gWwQNCV6YXQALCwBxcnemEeIy0NO23apVBYPGh0F8Phrq # IhQQHOjO8JKuy/uMd6HrxMfe/fHwPBAxpvB9EshmWpWxIybLNfY0GEupIrm1AgMB # AAGjggEbMIIBFzAdBgNVHQ4EFgQU013t1ltKqWi+VWZkSYdz6xfwInAwHwYDVR0j # BBgwFoAU1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0 # cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3Rh # UENBXzIwMTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+ # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0Ff # MjAxMC0wNy0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcD # CDANBgkqhkiG9w0BAQsFAAOCAQEAIld7o1TvUu0RDKAzReQ2fRhybhCzAM9ldRn2 # 9YKLG6rlSUxBXHv/QDtoEWuWk1QFcOFsygBjcDhrMszMmyPKiN8jOyRwQ5NZ4u35 # qVVvp8MTIMUOQTEcCaYV3UZbQumFGcF1s1aZ/HCJXqvbrsqSCC+hG08CAm44b7bg # 82lQ354sybzHJSxp2bUmr8Qw7qSziMFrtuyHEu3kFHICxGNiwQDnypy6E82eeUO4 # pqEhe4tepRb61VxSjitjINUbIuBCYVVZ8JDVy3O1ugd6d2ltmNc3mWtZ227e76hg # tDTPbdJmVFMMiprgIhCMwMMwmd3kOTLki5jaKjYg+UwZZs8py6GCA3kwggJhAgEB # MIHjoYG5pIG2MIGzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ # MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MQ0wCwYDVQQLEwRNT1BSMScwJQYDVQQLEx5uQ2lwaGVyIERTRSBFU046NTg0Ny1G # NzYxLTRGNzAxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2Wi # JQoBATAJBgUrDgMCGgUAAxUAvvnB9NoPFT/wkAMDvnilmtqK3LmggcIwgb+kgbww # gbkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsT # BE1PUFIxJzAlBgNVBAsTHm5DaXBoZXIgTlRTIEVTTjo0REU5LTBDNUUtM0UwOTEr # MCkGA1UEAxMiTWljcm9zb2Z0IFRpbWUgU291cmNlIE1hc3RlciBDbG9jazANBgkq # hkiG9w0BAQUFAAIFAN1YrSkwIhgPMjAxNzA5MDUwNDU3MTNaGA8yMDE3MDkwNjA0 # NTcxM1owdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA3VitKQIBADAKAgEAAgIM0gIB # /zAHAgEAAgIZMjAKAgUA3Vn+qQIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEE # AYRZCgMBoAowCAIBAAIDFuNgoQowCAIBAAIDB6EgMA0GCSqGSIb3DQEBBQUAA4IB # AQAX2sl87V6ggc+krdTGDw28VEOChDIPNgj/h4xO6TBc/xmccyf73hzfmUmbLzOQ # hwL4y2KeN6PhwkkyaU/fevJG/iKJHugFjO8sjqs45El+m1YSRfjiun2NtGn1tliF # XJqXAQX811ea/T8lGikN91X1SuCJkg5TissUCDjP5MsJ110XNyU9a2JP5GBncvuO # efOcbM87uaTuNkB2PZT832jOyN1/CAbAO+W9LEUx3K4xzIIFTL7Ox2GygDHcbhBs # AhpxkpL8DfKiIwq9k+9Yp3rFpSwtCVxyufqSQsGz7fXFRPvRmytbDW/8Er+1lRaH # U8cT8314QaKAiR7YtaZXEE1IMYIC9TCCAvECAQEwgZMwfDELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUt # U3RhbXAgUENBIDIwMTACEzMAAACzObvUEpMVqf4AAAAAALMwDQYJYIZIAWUDBAIB # BQCgggEyMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQx # IgQgTakPHrZ/SCLfHIsA6QIR9IzYyaXhPg0C63wMAcAHTHkwgeIGCyqGSIb3DQEJ # EAIMMYHSMIHPMIHMMIGxBBS++cH02g8VP/CQAwO+eKWa2orcuTCBmDCBgKR+MHwx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p # Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAAszm71BKTFan+AAAAAACz # MBYEFEGOWQsgs7Bn+hDk7sob3olX7DUzMA0GCSqGSIb3DQEBCwUABIIBAFd1zVhL # 0Leremjzibse9L+5fZcbFXjUrmSry7hw5QR67+L3e4VJwnZixt65kL2O0j8Haxbp # cBeJWKPz5ZtyPw/XfVQUamgPfnzHVbamK7FVzk9X5t7AjxrmyPPpecxFVp9p9TA3 # 6d2YLRNEROtlEm1DPWfm/rFkOmc6MDjjASEsXga11xsAORVZFj89nltgia68+4zy # nKOBuRyJCB7KWbYjOUOgTL/7JnFshFK7+iYQMgXxpLoYwcLQhNZ5eQzUVKYDAoRK # ZQ7JFNA26LwV5Zf/cZllzMccT15HzojmOewv7u1DhQTQaZPeDu5ABA3y343pvr2d # Y8TS/OKti13Zh+g= # SIG # End signature block |