param([string]$CSVPath,[string]$MachineNameHeader,[string]$RefreshToken,[int]$AgentLastActiveDays=30,[switch]$TrainingMode, [switch]$DemoMode) #Validate Inputs if ($CSVPath -eq '' -or $CSVPath -eq $null){ Write-Error "Please enter the path of the CSV file that has the machine names into the CSVPath argument" exit 0 } if ($MachineNameHeader -eq '' -or $MachineNameHeader -eq $null){ Write-Error "The CSV file should include a header for the machine name column, please enter the header name into the MachineNameHeader argument" exit 0 } if ($RefreshToken -eq '' -or $RefreshToken -eq $null){ Write-Error "You need to pass in a refresh token using the RefreshToken argument. You may find your refresh token by logging onto Cyber Crucible and navigating to the Rest Integration page" exit 0 } if ($AgentLastActiveDays -lt 0){ Write-Error "The AgentLastActiveDays argument cannot be a negative number" exit 0 } $machineNames=@() Import-Csv -Path $CSVPath | ForEach-Object { if ($_ -ne '' -and $_ -ne $null -and $_.$MachineNameHeader -ne $null -and $_.$MachineNameHeader.Trim() -ne ''){ $machineNames+=$_.$MachineNameHeader.Trim() } } if($machineNames.Length -lt 1){ Write-Error "Error, did not find any machine names from the CSV file." exit 0 } Write-Host "Successfully found machine names from CSV." #Generate Access Token $awsHeaders = @{ "Content-Type"="application/x-www-form-urlencoded" } $awsReqBody = @{ "grant_type"="refresh_token" "client_id"="73ul9p1lhi9is87n01pusfomhq" "refresh_token"=$RefreshToken } $awsResponse = Invoke-RestMethod -Uri "https://ransomwarerewind.auth.us-west-2.amazoncognito.com/oauth2/token" -Headers $awsHeaders -Body $awsReqBody -Method "POST" -UseBasicParsing $accessToken = $awsResponse.access_token if ($accessToken -eq '' -or $accessToken -eq $null){ Write-Error "Error, could not generate an access token from the given refresh token" exit 0 } Write-Host "Successfully retrieved access token." #Get agents $traingModeForRequest = "false" $demoModeForRequest = "false" if($TrainingMode){ $traingModeForRequest = "true" } if($DemoMode){ $demoModeForRequest = "true" } $apiHeaders = @{ "Content-Type"="application/json" "Accept"="application/json" "Authorization"="Bearer $accessToken" } $apiReqBody = @{ "trainingMode"=$traingModeForRequest "demoMode"=$demoModeForRequest } $apiReqBody = ConvertTo-Json -InputObject $apiReqBody $apiResponse = Invoke-RestMethod -Uri "https://web.tasking.rpp.cybercrucible.com/agentListReactive" -Headers $apiHeaders -Body $apiReqBody -Method "POST" -UseBasicParsing if($apiResponse.Length -lt 1){ Write-Host "No agents were found for this user" exit 0 } function RemoveLicenseFromAgent { param ($agentId) try { $removeLicenseReqBody = @{ "trainingMode"=$traingModeForRequest "demoMode"=$demoModeForRequest "agentId"=$agentId } $removeLicenseReqBody = ConvertTo-Json -InputObject $removeLicenseReqBody Invoke-RestMethod -Uri "https://web.tasking.rpp.cybercrucible.com/releaseAgentLicenseReactive" -Headers $apiHeaders -Body $removeLicenseReqBody -Method "POST" -UseBasicParsing | Out-Null } catch {} } #Prep current date with AgentLastActiveDays $currentDate = Get-Date if($AgentLastActiveDays -gt 0){ $currentDate = $currentDate.AddDays(-$AgentLastActiveDays) #- to subtract days } $utcDateGreaterThan = $currentDate.ToUniversalTime() $agentMachineNamesList=@() $agentsMatchedAndCalledInWithinDaysCounter=0 Write-Host "Attempting to release licenses from agents with matching machine names, leave the script running until completion." foreach ($agent in $apiResponse){ if ($agent.agentId -ne $null -and $agent.machineName -ne $null -and $agent.machineName -ne '' -and $machineNames.Contains($agent.machineName.Trim())){ #matches with machine names from csv file #check last validate date before calling to remove the license $callToRemoveLicense = $true #defaults to true if($agent.lastValidateDateTime -ne $null -and $AgentLastActiveDays -gt 0){ try{ $agentLastValidateDate = Get-Date $agent.lastValidateDateTime $agentLastValidateDate = $agentLastValidateDate.ToUniversalTime() if($agentLastValidateDate -ne $null -and $agentLastValidateDate -gt $utcDateGreaterThan){ $callToRemoveLicense = $false } } catch{} } if($callToRemoveLicense){ RemoveLicenseFromAgent -agentId $agent.agentId } else{ $agentsMatchedAndCalledInWithinDaysCounter++ } } if($agent.machineName -ne $null -and $agent.machineName -ne ''){ $agentMachineNamesList+=$agent.machineName.Trim() } } #Keep track of machine names from the csv file that we don't find an agent for $machineNamesFoundCounter = 0 $machineNamesNotFoundCounter = 0 foreach ($machineName in $machineNames){ if ($agentMachineNamesList.Contains($machineName.Trim())){ $machineNamesFoundCounter++ } else{ $machineNamesNotFoundCounter++ } } if($machineNamesNotFoundCounter -gt 0){ Write-Host "From the given CSV file of machine names, $machineNamesNotFoundCounter machines were not found. Please make sure the user associated with the refresh token is a member of all machine groups" } # SIG # Begin signature block # MIIt9gYJKoZIhvcNAQcCoIIt5zCCLeMCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUoy8juTghHQdE9jmpXhbV8LOr # W+GggidWMIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0B # AQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk # IElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQsw # CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu # ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw # ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz # 7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS # 5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7 # bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfI # SKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jH # trHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14 # Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2 # h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt # 6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPR # iQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ER # ElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4K # Jpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAd # BgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SS # y4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAk # BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAC # hjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURS # b290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0 # LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRV # HSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyh # hyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO # 0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo # 8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++h # UD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5x # aiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMIIFkDCCA3ig # AwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG # EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl # cnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMw # ODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UE # ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD # VQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Y # q3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lX # FllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxe # TsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbu # yntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I # 9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmg # Z92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse # 5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKy # Ebe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwh # HbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/ # Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwID # AQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4E # FgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQADggIBALth2X2p # bL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY # ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdN # Oj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4 # i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJ # EVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9NcCOGDErcgdLM # MpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N0XWs0Mr7QbhD # parTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb/UdK # Dd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP # 0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLS # oCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9T # dSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+MIIGrjCCBJagAwIBAgIQBzY3tyRU # fNhHrP0oZipeWzANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UE # ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD # VQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAwMDAwWhcN # MzcwMzIyMjM1OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs # IEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEy # NTYgVGltZVN0YW1waW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC # AgEAxoY1BkmzwT1ySVFVxyUDxPKRN6mXUaHW0oPRnkyibaCwzIP5WvYRoUQVQl+k # iPNo+n3znIkLf50fng8zH1ATCyZzlm34V6gCff1DtITaEfFzsbPuK4CEiiIY3+va # PcQXf6sZKz5C3GeO6lE98NZW1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCHRgB720RB # idx8ald68Dd5n12sy+iEZLRS8nZH92GDGd1ftFQLIWhuNyG7QKxfst5Kfc71ORJn # 7w6lY2zkpsUdzTYNXNXmG6jBZHRAp8ByxbpOH7G1WE15/tePc5OsLDnipUjW8LAx # E6lXKZYnLvWHpo9OdhVVJnCYJn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2nuY7W+yB # 3iIU2YIqx5K/oN7jPqJz+ucfWmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp88qqlnNC # aJ+2RrOdOqPVA+C/8KI8ykLcGEh/FDTP0kyr75s9/g64ZCr6dSgkQe1CvwWcZklS # UPRR8zZJTYsg0ixXNXkrqPNFYLwjjVj33GHek/45wPmyMKVM1+mYSlg+0wOI/rOP # 015LdhJRk8mMDDtbiiKowSYI+RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl27KtdRnXi # YKNYCQEoAA6EVO7O6V3IXjASvUaetdN2udIOa5kM0jO0zbECAwEAAaOCAV0wggFZ # MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaaL3WMaiCP # nshvMB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQE # AwIBhjATBgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYB # BQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0 # cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5j # cnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0Rp # Z2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJ # YIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ZtbYIULh # sBguEE0TzzBTzr8Y+8dQXeJLKftwig2qKWn8acHPHQfpPmDI2AvlXFvXbYf6hCAl # NDFnzbYSlm/EUExiHQwIgqgWvalWzxVzjQEiJc6VaT9Hd/tydBTX/6tPiix6q4XN # Q1/tYLaqT5Fmniye4Iqs5f2MvGQmh2ySvZ180HAKfO+ovHVPulr3qRCyXen/KFSJ # 8NWKcXZl2szwcqMj+sAngkSumScbqyQeJsG33irr9p6xeZmBo1aGqwpFyd/EjaDn # mPv7pp1yr8THwcFqcdnGE4AJxLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3fpNTrDsd # CEkPlM05et3/JWOZJyw9P2un8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t5TRxktcm # a+Q4c6umAU+9Pzt4rUyt+8SVe+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejxmF/7K9h+ # 8kaddSweJywm228Vex4Ziza4k9Tm8heZWcpw8De/mADfIBZPJ/tgZxahZrrdVcA6 # KYawmKAr7ZVBtzrVFZgxtGIJDwq9gdkT/r+k0fNX2bwE+oLeMt8EifAAzV3C+dAj # fwAL5HYCJtnwZXZCpimHCUcr5n8apIUP/JiW9lVUKx+A+sDyDivl1vupL0QVSucT # Dh3bNzgaoSv27dZ8/DCCBrAwggSYoAMCAQICEAitQLJg0pxMn17Nqb2TrtkwDQYJ # KoZIhvcNAQEMBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IElu # YzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQg # VHJ1c3RlZCBSb290IEc0MB4XDTIxMDQyOTAwMDAwMFoXDTM2MDQyODIzNTk1OVow # aTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQD # EzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4 # NCAyMDIxIENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW0L0LQ # KK14t13VOVkbsYhC9TOM6z2Bl3DFu8SFJjCfpI5o2Fz16zQkB+FLT9N4Q/QX1x7a # +dLVZxpSTw6hV/yImcGRzIEDPk1wJGSzjeIIfTR9TIBXEmtDmpnyxTsf8u/LR1oT # pkyzASAl8xDTi7L7CPCK4J0JwGWn+piASTWHPVEZ6JAheEUuoZ8s4RjCGszF7pNJ # cEIyj/vG6hzzZWiRok1MghFIUmjeEL0UV13oGBNlxX+yT4UsSKRWhDXW+S6cqgAV # 0Tf+GgaUwnzI6hsy5srC9KejAw50pa85tqtgEuPo1rn3MeHcreQYoNjBI0dHs6EP # bqOrbZgGgxu3amct0r1EGpIQgY+wOwnXx5syWsL/amBUi0nBk+3htFzgb+sm+YzV # svk4EObqzpH1vtP7b5NhNFy8k0UogzYqZihfsHPOiyYlBrKD1Fz2FRlM7WLgXjPy # 6OjsCqewAyuRsjZ5vvetCB51pmXMu+NIUPN3kRr+21CiRshhWJj1fAIWPIMorTmG # 7NS3DVPQ+EfmdTCN7DCTdhSmW0tddGFNPxKRdt6/WMtyEClB8NXFbSZ2aBFBE1ia # 3CYrAfSJTVnbeM+BSj5AR1/JgVBzhRAjIVlgimRUwcwhGug4GXxmHM14OEUwmU// # Y09Mu6oNCFNBfFg9R7P6tuyMMgkCzGw8DFYRAgMBAAGjggFZMIIBVTASBgNVHRMB # Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBRoN+Drtjv4XxGG+/5hewiIZfROQjAfBgNV # HSMEGDAWgBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYD # VR0lBAwwCgYIKwYBBQUHAwMwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhho # dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNl # cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1Ud # HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRy # dXN0ZWRSb290RzQuY3JsMBwGA1UdIAQVMBMwBwYFZ4EMAQMwCAYGZ4EMAQQBMA0G # CSqGSIb3DQEBDAUAA4ICAQA6I0Q9jQh27o+8OpnTVuACGqX4SDTzLLbmdGb3lHKx # AMqvbDAnExKekESfS/2eo3wm1Te8Ol1IbZXVP0n0J7sWgUVQ/Zy9toXgdn43ccsi # 91qqkM/1k2rj6yDR1VB5iJqKisG2vaFIGH7c2IAaERkYzWGZgVb2yeN258TkG19D # +D6U/3Y5PZ7Umc9K3SjrXyahlVhI1Rr+1yc//ZDRdobdHLBgXPMNqO7giaG9OeE4 # Ttpuuzad++UhU1rDyulq8aI+20O4M8hPOBSSmfXdzlRt2V0CFB9AM3wD4pWywiF1 # c1LLRtjENByipUuNzW92NyyFPxrOJukYvpAHsEN/lYgggnDwzMrv/Sk1XB+JOFX3 # N4qLCaHLC+kxGv8uGVw5ceG+nKcKBtYmZ7eS5k5f3nqsSc8upHSSrds8pJyGH+PB # VhsrI/+PteqIe3Br5qC6/To/RabE6BaRUotBwEiES5ZNq0RA443wFSjO7fEYVgcq # LxDEDAhkPDOPriiMPMuPiAsNvzv0zh57ju+168u38HcT5ucoP6wSrqUvImxB+YJc # FWbMbA7KxYbD9iYzDAdLoNMHAmpqQDBISzSoUSC7rRuFCOJZDW3KBVAr6kocnqX9 # oKcfBnTn8tZSkP2vhUgh+Vc7tJwD7YZF9LRhbr9o4iZghurIr6n+lB3nYxs6hlZ4 # TjCCBsIwggSqoAMCAQICEAVEr/OUnQg5pr/bP1/lYRYwDQYJKoZIhvcNAQELBQAw # YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD # EzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGlu # ZyBDQTAeFw0yMzA3MTQwMDAwMDBaFw0zNDEwMTMyMzU5NTlaMEgxCzAJBgNVBAYT # AlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjEgMB4GA1UEAxMXRGlnaUNlcnQg # VGltZXN0YW1wIDIwMjMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCj # U0WHHYOOW6w+VLMj4M+f1+XS512hDgncL0ijl3o7Kpxn3GIVWMGpkxGnzaqyat0Q # KYoeYmNp01icNXG/OpfrlFCPHCDqx5o7L5Zm42nnaf5bw9YrIBzBl5S0pVCB8s/L # B6YwaMqDQtr8fwkklKSCGtpqutg7yl3eGRiF+0XqDWFsnf5xXsQGmjzwxS55Dxtm # UuPI1j5f2kPThPXQx/ZILV5FdZZ1/t0QoRuDwbjmUpW1R9d4KTlr4HhZl+NEK0rV # lc7vCBfqgmRN/yPjyobutKQhZHDr1eWg2mOzLukF7qr2JPUdvJscsrdf3/Dudn0x # mWVHVZ1KJC+sK5e+n+T9e3M+Mu5SNPvUu+vUoCw0m+PebmQZBzcBkQ8ctVHNqkxm # g4hoYru8QRt4GW3k2Q/gWEH72LEs4VGvtK0VBhTqYggT02kefGRNnQ/fztFejKqr # UBXJs8q818Q7aESjpTtC/XN97t0K/3k0EH6mXApYTAA+hWl1x4Nk1nXNjxJ2VqUk # +tfEayG66B80mC866msBsPf7Kobse1I4qZgJoXGybHGvPrhvltXhEBP+YUcKjP7w # tsfVx95sJPC/QoLKoHE9nJKTBLRpcCcNT7e1NtHJXwikcKPsCvERLmTgyyIryvEo # EyFJUX4GZtM7vvrrkTjYUQfKlLfiUKHzOtOKg8tAewIDAQABo4IBizCCAYcwDgYD # VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUH # AwgwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMB8GA1UdIwQYMBaA # FLoW2W1NhS9zKXaaL3WMaiCPnshvMB0GA1UdDgQWBBSltu8T5+/N0GSh1VapZTGj # 3tXjSTBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v # RGlnaUNlcnRUcnVzdGVkRzRSU0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0EuY3Js # MIGQBggrBgEFBQcBAQSBgzCBgDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln # aWNlcnQuY29tMFgGCCsGAQUFBzAChkxodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j # b20vRGlnaUNlcnRUcnVzdGVkRzRSU0E0MDk2U0hBMjU2VGltZVN0YW1waW5nQ0Eu # Y3J0MA0GCSqGSIb3DQEBCwUAA4ICAQCBGtbeoKm1mBe8cI1PijxonNgl/8ss5M3q # XSKS7IwiAqm4z4Co2efjxe0mgopxLxjdTrbebNfhYJwr7e09SI64a7p8Xb3CYTdo # SXej65CqEtcnhfOOHpLawkA4n13IoC4leCWdKgV6hCmYtld5j9smViuw86e9NwzY # mHZPVrlSwradOKmB521BXIxp0bkrxMZ7z5z6eOKTGnaiaXXTUOREEr4gDZ6pRND4 # 5Ul3CFohxbTPmJUaVLq5vMFpGbrPFvKDNzRusEEm3d5al08zjdSNd311RaGlWCZq # A0Xe2VC1UIyvVr1MxeFGxSjTredDAHDezJieGYkD6tSRN+9NUvPJYCHEVkft2hFL # jDLDiOZY4rbbPvlfsELWj+MXkdGqwFXjhr+sJyxB0JozSqg21Llyln6XeThIX8rC # 3D0y33XWNmdaifj2p8flTzU8AL2+nCpseQHc2kTmOt44OwdeOVj0fHMxVaCAEcsU # DH6uvP6k63llqmjWIso765qCNVcoFstp8jKastLYOrixRoZruhf9xHdsFWyuq69z # OuhJRrfVf8y2OMDY7Bz1tqG4QyzfTkx9HmhwwHcK1ALgXGC7KP845VJa1qwXIiNO # 9OzTF/tQa/8Hdx9xl0RBybhG02wyfFgvZ0dl5Rtztpn5aywGRu9BHvDwX+Db2a2Q # gESvgBBBijCCCAEwggXpoAMCAQICEAhP7bjN24LRsb+hZGDtW3cwDQYJKoZIhvcN # AQELBQAwaTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEw # PwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2 # IFNIQTM4NCAyMDIxIENBMTAeFw0yMjA5MDgwMDAwMDBaFw0yMzA5MTIyMzU5NTla # MIHWMRMwEQYLKwYBBAGCNzwCAQMTAlVTMRkwFwYLKwYBBAGCNzwCAQITCERlbGF3 # YXJlMR0wGwYDVQQPDBRQcml2YXRlIE9yZ2FuaXphdGlvbjEQMA4GA1UEBRMHNTY0 # ODAxODELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE1hcnlsYW5kMRUwEwYDVQQHEwxT # ZXZlcm5hIFBhcmsxHTAbBgNVBAoTFEN5YmVyIENydWNpYmxlLCBJbmMuMR0wGwYD # VQQDExRDeWJlciBDcnVjaWJsZSwgSW5jLjCCAiIwDQYJKoZIhvcNAQEBBQADggIP # ADCCAgoCggIBAJn23jaq0FLFKPmhEHJ2eVAr6+prAMTklBqTxxac2qKOOVXGBbI8 # 2ZuMXZgxlpNTns8TBTYnVJQRXdJAP9f/J/X5h9nLmLAPh2ZyB5VajupGB6I9Omp9 # xgzC3JcGI6WRn07BRM1Xr9E946ipwabDbSM5eNRdJB7OqyajmvZtD+i3kPVpARG5 # AGqK8shB0w1VwlWE4Kwd69A8ieCubc6k4Zg1SZuAKdsyHF3AOkSWJbHnbDOmchQL # uqQ4aqeVVSmd/Hhx2lxedsEgLOeYdtVmAMYBeDbD2KRCoK2AnBjkVurhcHz/EyDB # dtll1D80pWODH+mZp06jdRgJnhh/WXwIHx8qw0S1wYBKEyVezfBDcIQgIMYkKPFO # gMjfjd226EL4MTJBkxEFi+W1tLU3Vu7ycDliRz8MaH8l4j6LQCulCsKpr1clTYyp # eo4iSxDo+t4U2R3XLuRxydtQTo+ojzgiJP2/4V462kQwG+HsfYeqLq7/cKZqRwb/ # WK/odCsTv9QMm7d5fa1FKVYxYrLmN875TE+5kA8qMriyacIwN13J8Hmebx9Qr+WD # rp1KpUrX74PnoG2A7vEiQ4P9rGnzZAMsp6gXiTQHfIFZv7F0Sw7qigoJogf8Cue+ # E2TepBrc9N4SB1k4twyUcWDtdacREcBhA/JxB0OtLiCvzV3FUCrR0UebAgMBAAGj # ggI1MIICMTAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNVHQ4E # FgQUiMSbD8v7i/7BHpgTbOYOKjHNxvwwLgYDVR0RBCcwJaAjBggrBgEFBQcIA6AX # MBUME1VTLURFTEFXQVJFLTU2NDgwMTgwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQM # MAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6Ly9jcmwzLmRp # Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNI # QTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5kaWdpY2VydC5jb20v # RGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0Ex # LmNybDA9BgNVHSAENjA0MDIGBWeBDAEDMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93 # d3cuZGlnaWNlcnQuY29tL0NQUzCBlAYIKwYBBQUHAQEEgYcwgYQwJAYIKwYBBQUH # MAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBcBggrBgEFBQcwAoZQaHR0cDov # L2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25p # bmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG # 9w0BAQsFAAOCAgEAE4coPC8V//WDEK7uIxYgXNPpjVz25NanXYGLvaBhFGe+kdSu # D5cGxjEv/vUZRYepxrqOq7nDLGGxDKkDU+JItGMeNBoX1F/olPchbdM1zYmpVBJ6 # 8uAPHBV7rDxZz3szGHyo4GSNlEVEp887+0Dl0krs8IV7Ye7sjXiytCiDcXbRPxDq # XiE/2WYaX7WE6SlOkYL5mL3K+iT0RFusq6s9/BcrIvoMLROMSpc16QdyO9tfCMmf # 3HpHzkf4bkc/jpb/wVeLr3ioz/Ns1IQGqdRG4O3X4CGu4+l63gzzlRb441bqPdRC # 29lZxh3Tff0yfLdbvojloTNFBRylmcjP72+RJe4Vypqwt1S0nuLxpIkk51854OLS # ie89ekrrRoO8STWQN4OPV547c0Wcu+3wbtLEyQmByDjAbltQGOcmg4PYXl33Kqof # 0X3qSzjO9v36gC9or9JOXNNP+VQdrxQCDk+CRukiCiAXWm6TfDAByXEk7TKD3M+m # SPLw+X66HgvUTkeDm7oNE/1rsN61xzxd7mvutrFG/vwJCX9su/75D6wObH/LVPlI # an/MRKbWyj4ZfdZwmO9x/n0WwDnkick+hxq304tKINWQ8pWaLTTuDOEBh0tm3bPt # ITO1e0+ArrYPDlQJ3wqlnUZBDBu7XcYwB3l8v5g2pLaW64Xxsh4ZlN7ukHgxggYK # MIIGBgIBATB9MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5j # LjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNB # NDA5NiBTSEEzODQgMjAyMSBDQTECEAhP7bjN24LRsb+hZGDtW3cwCQYFKw4DAhoF # AKBAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMCMGCSqGSIb3DQEJBDEWBBTz # KP7OU9N7CbXucAiDsTwgIPi+STANBgkqhkiG9w0BAQEFAASCAgBeJP0pLgz8rFFe # SMi6cF30g6V8lk5+RimzYwpe52OoTyccDJ1THXTmAKJehYk/p9yVi8CrqI2X3AF/ # sMRgKlOFO+K77oNAFAh12+AK08AAIXz0AZ0uVL/biCtQpPVkzVLEKfTvCWEC2GGW # a7s1HsDgdS5uQR6rQTJQFgszbibta+UQ5r0UUDB8QjpB9w+BDgTzVe6eh08crCx0 # FVFLUJx22dOPqz3Guff3d0YeSmXQE3fJmU1uHS4k9SAKYVk2iwHId23/NCZDY9AI # d/0deX26Zxai0n2B3osxrqvrgTovySVnH/XItS4zjWLbZVGmMg36gmywteyUYpCH # 2NnXBGvsidcKX2CUHan6XiNJPRIdjJB6SOl0zAsWDGfbRITFv25bxZSukVyj+wMB # zv27nMT9Kmk8b+b/3XUa7uXftYMatkVm5bMBjnK1CM22S24BppfKrV/t3zAgy8+A # 3h/VyNbtWGMuV24Tyy72w5q6f7qV1k2v+gqezztb67K6GR6a3Bn98ybdIxTbZ973 # sRHdvoj++1UGRZyforkFDCugEI3h7KmqJzL6cO6ha9JAn/BShvl8VPayqtTZ78Qy # 6czzzKawkbfibCoAXX0L/jUT7GRifT/UbnVPMwBDMx5k2n3phWjXfRqct/AluvOL # t9Fd52Hp0rVaNMMH8FVhHe2/FNLbxqGCAyAwggMcBgkqhkiG9w0BCQYxggMNMIID # CQIBATB3MGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7 # MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1l # U3RhbXBpbmcgQ0ECEAVEr/OUnQg5pr/bP1/lYRYwDQYJYIZIAWUDBAIBBQCgaTAY # BgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yMzA4MTEx # NjAyMzJaMC8GCSqGSIb3DQEJBDEiBCCe49bOT2pWJkB3QPF5ygA13HtP0Cn8WXH8 # DvP7vYEbQjANBgkqhkiG9w0BAQEFAASCAgBSiO1STWBDIffCORO3PGIVaMVjBSDC # Vl2MS32ZNbvSUCJ/qBVZbSVxgvUnxo0q1TptyICSKkKh1t6gdzmQ1SvXJ+/65kHK # F0Y/A7ZFQqD89N/p7zH2o8WosyvXT1G0hOc36YT7Q4/Eb0qP/ur83UT81CEr2PPN # CIWqxP1Pas46Mih683X2MAuSZ6NbLBqZYn2gqU5kLEc+1iIYkZFNRxASEQgGf33l # RDqen2LFHfDpMIT3RmKokCZF/7cqJ/keTweY8uMvf67MSkFWHXRu9yJsMNVQTndZ # sVYjBxHcoY9pff3QEEbHWNrd2jBR+EAa/lEdvt+gnipc2CtnvxNUjuak4D097qOw # xGjm1os4weYFnmO1gczt96VGYethC3MRMZgr+RWaP8tD5XYw2B9Nn8Rtw87mfCxP # HAyqDoXb7hPT+UaEvp0uW5NS5Qqj5Zz1JzFs+63gijBW7idi4sWRi47hHs9wBHe3 # IEZoWtXFk8/3tr1d7HBp4+7b7vgWBLrRUtRuWCoP2ljoUs/7waU0nGe+aBknSM2/ # VMKSk2N6J3Nz5wObdZzzSqboCsPl4BPGU8MCo/cxsGKO9uUi8ZsxipDl8t3pCocK # KuqUkM/eLNZzHda6omsWDsqHIuTj0ukC+2iLHwyv2e8YWwenRsOWKRv36mawOhpn # L/9W4JSkmETefQ== # SIG # End signature block