HEX
Server: Apache/2.4.46 (Win64) OpenSSL/1.1.1j PHP/8.4.25
System: Windows NT DESKTOP-4TAV2RJ 10.0 build 19045 (Windows 10) AMD64
User: fred (0)
PHP: 8.4.25
Disabled: NONE
Upload Files
File: C:/DefenderUpdateWinImage.ps1
<#PSScriptInfo

.VERSION 1.0

.GUID 6ae58a11-4c1a-47ee-ab8e-76e9ed385055

.AUTHOR [email protected]

.COMPANYNAME Microsoft Corporation

.COPYRIGHT 2020 Microsoft Corporation. All rights reserved.

.TAGS 

.LICENSEURI 

.PROJECTURI 

.ICONURI 

.EXTERNALMODULEDEPENDENCIES 

.REQUIREDSCRIPTS 

.EXTERNALSCRIPTDEPENDENCIES 

.RELEASENOTES
#>

<#
.SYNOPSIS

Performs Defender update servicing of Windows Install image.

.DESCRIPTION

Script to update Windows install image(WIM or VHD) with input Defender update package.
It can add or remove the update or display the details of patched Defender package.
Note: For Server images, the Windows-Defender feature gets automatically enabled if not already.
Note: Supported Architectures amd64 & x86

.PARAMETER WorkingDirectory

Specifies a local empty folder as working directory, to place the temporarily
generated files and a mount point to for OS install image to mount. Items in
this directory are deleted after each operation. Note: This directory should
be local, network shares are not supported.

.PARAMETER Action

Specifies the servicing action to be performed. The supported actions are
'AddUpdate','RemoveUpdate','ShowUpdate'.
AddUpdate       - Adds the input Defender update package to Image.
RemoveUpdate    - Removes the last updated Defender package present in the image.
ShowUpdate      - Displays the details of Defender update package applied on the image.

.PARAMETER ImagePath

Specifies the Windows install image path to be updated.

.PARAMETER ImageIndex

Specifies the index of image in a WIM or VHD file to update. Default assumed as 1.
For a VHD file, the index must be 1.

.PARAMETER Package

Specifies the path to Windows Defender update package to be added into windows
install image.

.PARAMETER LogPath

Specifies the path to log file where actions are logged.

.INPUTS

None. You cannot pipe objects to DefenderUpdateWinImage.ps1.

.OUTPUTS

None. Update-Month.ps1 does not generate any output.

.EXAMPLE

PS> .\DefenderUpdateWinImage.ps1 -WorkingDirectory "D:\TempDir" -Action AddUpdate -ImagePath "C:\imagestore\install.wim" -Package "C:\packages\Defender-Dism-x86fre.cab"
This command updates the image install.wim present at C:\imagestore with package C:\packages\Defender-Dism-x86fre.cab.
For this operation it uses D:\Tempdir as a temporary working directory.

.EXAMPLE

PS> .\DefenderUpdateWinImage.ps1 -WorkingDirectory "D:\TempDir" -Action RemoveUpdate -ImagePath "C:\vhds\Windows10_client_en-US.vhd"
This command removes the Defender update package applied on VHD image C:\vhds\Windows10_client_en-US.vhd.

.EXAMPLE

PS> .\DefenderUpdateWinImage.ps1 -WorkingDirectory "D:\TempDir" -Action ShowUpdate -ImagePath "C:\vhds\Windows2016_server_serverdatacenter_en-us.vhd"
This command displays the details of Defender update package applied on the VHD image C:\vhds\Windows2016_server_serverdatacenter_en-us.vhd

#>

#Requires -Version 5.1
#Requires -RunAsAdministrator
#Requires -Modules Microsoft.PowerShell.Security, Dism

[CmdletBinding()]
param (
    # The temporary location where the Windows image is mounted for servicing.
    # TODO: If not specified, shall use the \Windows\%Temp%\DefenderDism-<randomHex> directory.
    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [string] $WorkingDirectory,

    # Image Servicing Action (AddUpdate | RemoveUpdate | ShowUpdate)
    [Parameter(Mandatory=$true)]
    [ValidateSet('AddUpdate','RemoveUpdate','ShowUpdate')]
    [string] $Action,

    # Path to OS Image to be serviced
    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [string] $ImagePath,

    # Index of the image to be serviced. Default value is 1.
    [Parameter(Mandatory=$false)]
    [ValidateNotNullOrEmpty()]
    [string] $ImageIndex = 1,

    # Specifies the path to Windows Defender Update Package to be added into windows Install image.
    [Parameter(Mandatory=$false)]
    [string] $Package,

    # Specifies the full path and file name to log to. If not set, the default is %WINDIR%\Logs\Dism\dism.log
    [Parameter(Mandatory=$false)]
    [string] $LogPath
)
$ErrorActionPreference = "Stop"

Set-Variable S_OK               -option Constant -value 0
Set-Variable E_FAIL             -option Constant -value 1
Set-Variable E_INVALIDINPUT     -option Constant -value 2
Set-Variable E_INVALIDOPERATION -option Constant -value 3
Set-Variable E_INVALIDPATH      -option Constant -value 4
Set-Variable E_INVALIDPACKAGE   -option Constant -value 5
Set-Variable E_ABORT            -option Constant -value 6
Set-Variable E_ACCESSDENIED     -option Constant -value 7
Set-Variable E_COMMANDMISSING   -option Constant -value 8
Set-Variable E_UNSUPPORTED      -option Constant -value 9

$ProgramDataDefender        = "ProgramData\Microsoft\Windows Defender"
$ProgramFilesDefender       = "Program Files\Windows Defender"
$ProgramFilesX86Defender    = "Program Files (x86)\Windows Defender"
$DefinitionsUpdatesLocation = Join-Path -Path $ProgramDataDefender -ChildPath "Definition Updates\Updates"
$PlatformLocation           = Join-Path -Path $ProgramDataDefender -ChildPath "Platform"
$WindowsTemp                = "Windows\Temp"
$PackageXml                 = "package-defender.xml"

enum ArchitectureTypes { # Source Dism.Format.ps1xml
    x86     = 0
    arm     = 5
    ia64    = 6
    x64     = 9
	arm64   = 12   #As observed value of DismImageInfo.Architecture returned explicitly.
}

enum InstallationTypes {
    Client
    Server
}

$messages =
@{
    #error messages
    ERR_INVALID_SIGNATURE       = "Update package ({0}) does not have a valid signature. Redownload the package.";
    ERR_UNSUPPORTED_OS_VERSION  = "Unsupported Windows OS image (version={0}). Windows 10 {1} or later versions are supported.";
    ERR_UNSUPPORTED_OS_UPDATE   = "Unsupported Windows 10 version. For Windows 10 RS (Redstone) images, apply the September 2018, or later, update and retry.";
    ERR_UNSUPPORTED_ARC_PACKAGE = "Wrong OS architecture for this package. This package supports {0}.";
    ERR_UNSUPPORTED_OS_ARC      = "Unsupported architecture of OS Image to service.";
    ERR_ADD_UPDATE              = "Failed to add the Defender update.";
    ERR_REMOVE_UPDATE           = "Failed to remove the Defender update.";
    ERR_NO_UPDATE_TO_REMOVE     = "There's no Defender update in this image.";
    ERR_SHOW_UPDATE             = "ShowUpdate failed";
    ERR_COMMAND_MISSING         = "Critical command `"{0}`" is missing. Install the required module and try again.";
    ERR_WORKINGDIR_NOT_EMPTY    = "The input working directory ({0}) is not empty. Clear it or select an empty directory and retry.";
    ERR_UPDATE_ALREADY_EXISTS   = "This image already contains another Defender update (version={0}). Run RemoveUpdate to clear it and try again";
    ERR_FAILED_ENABLE_DEFENDER  = "Failed to enable Defender in image ({1}) due to error ({0})."
    #info messages
    INFO_SERVER_ENABLE_DEFENDER = "Enabling Windows-Defender on the server image.";
    INFO_UPDATE_ENGINE_SIGN     = "Updating security intelligence and antimalware engine.";
    INFO_UPDATE_CAMP            = "Updating platform.";
    INFO_HANDLELING_LOCALIZATION = "Handling localization for {0}";
    INFO_PACKAGE_DETAILS        = "Details of Defender update applied to the image are:`n`tDefender package version: {0}`n`tSecurity intelligence version: {1}`n`tEngine version: {2}`n`tPlatform version: {3}";
    INFO_DISCARD_IMAGE_UPDATE   = "Discarding the changes and returning the OS image to its original state.";
    INFO_ADD_UPDATE_SUCCESS     = "Successfully updated Defender.";
    INFO_REMOVE_UPDATE_SUCCESS  = "Successfully removed the Defender update.";
    INFO_NO_UPDATE_IN_IMAGE     = "This image doesn't have a Defender update applied.";
    INFO_IMAGE_UPDATE_DETAILS   = "Details of the Defender update package in this image:"
    #warnings
}

function ValidateCodeSign([string]$PackageFile)
{
    $signInfo = Get-AuthenticodeSignature $PackageFile
    if ($signInfo."Status" -ne "Valid") {
        Write-Host ($messages.ERR_INVALID_SIGNATURE -f $PackageFile) -ForegroundColor Red
        $signInfo | Format-List
        $global:LASTEXITCODE = $E_INVALIDPACKAGE
        throw ($messages.ERR_INVALID_SIGNATURE -f $PackageFile)
    }
}

function IsWindows10RSWith9CorAbove([version]$OsImageVersion)
{
    #parse for version fields.
    $majorStr,$minorStr,$buildStr,$qfeStr = $OsImageVersion -split "\."
    $major  = [int]$majorStr
    $minor  = [int]$minorStr
    $build  = [int]$buildStr
    $qfe    = [int]$qfeStr

    <#
     #Camp update needs Win10 images updated with September security update.
     #https://microsoft.visualstudio.com/Windows%20Defender/_git/WD.Client?path=%2Famcore%2FAntimalware%2FSource%2FService%2Fmpupdate%2Fdllmain.cpp&version=GBofficial%2Favmain&line=58&lineEnd=59&lineStartColumn=1&lineEndColumn=1&lineStyle=plain
     #>
    if (($major -gt 10) -or                                                                     <#Future #>
        (($major -eq 10) -and ($minor -gt 0)) -or                                               <#Future #>
        (($major -eq 10) -and ($minor -eq 0) -and ($build -ge 17763)) -or                       <#RS5 and greater #>
        (($major -eq 10) -and ($minor -eq 0) -and ($build -eq 17134) -and ($qfe -ge 320))  -or  <#RS4: 17134.320 - https://support.microsoft.com/en-us/help/4458469 #>
        (($major -eq 10) -and ($minor -eq 0) -and ($build -eq 16299) -and ($qfe -ge 699))  -or  <#RS3: 16299.699 - https://support.microsoft.com/en-us/help/4457136 #>
        (($major -eq 10) -and ($minor -eq 0) -and ($build -eq 15063) -and ($qfe -ge 1356)) -or  <#RS2: 15063.1356 - https://support.microsoft.com/en-us/help/4457141 #>
        (($major -eq 10) -and ($minor -eq 0) -and ($build -eq 14393) -and ($qfe -ge 2515))      <#RS1: 14393.2515 https://support.microsoft.com/en-us/help/4457127 #>
        ){
        return $true
    }

    return $false
}

function Get-PackageDetailsFromXml([string]$XmlPath)
{
    if (!(Test-Path -Path $XmlPath)) {
        $global:LASTEXITCODE = $E_INVALIDPATH
        throw "Invalid path $XmlPath"
    }

    [xml]$xmlDoc = Get-Content -Path $XmlPath
    $pkgDetails = @{Architecture        = $xmlDoc.packageinfo.arch;
                    PackageVersion      = $xmlDoc.packageinfo.versions.defender;
                    CampVersion         = $xmlDoc.packageinfo.versions.platform;
                    EngineVersion       = $xmlDoc.packageinfo.versions.engine;
                    SignatureVersion    = $xmlDoc.packageinfo.versions.signatures}
    return $pkgDetails
}

function ValidateCompatibility([version]$OsVersion, [string]$OsArchitecture, [string]$PackageRoot)
{
    # Architecture Check
    $pkgXmlPath = Join-Path -Path $PackageRoot -ChildPath $PackageXml
    $pkgDetails = Get-PackageDetailsFromXml -XmlPath $pkgXmlPath
    $pkgArc = $pkgDetails.Architecture

    if ($pkgArc -notmatch $OsArchitecture) {
        $global:LASTEXITCODE = $E_INVALIDINPUT
        throw ($messages.ERR_UNSUPPORTED_ARC_PACKAGE -f $pkgArc)
    }

    # Win10 RS1 and later are only supported.
    # parse for version fields & compare.
    $major,$minor,$build,$qfe = $OsVersion -split "\."
    if (!(($major -eq 10) -and ($minor -eq 0) -and ([int]$build -ge 14393))) { #Win10 RS1 or later.
        $global:LASTEXITCODE = $E_UNSUPPORTED
        throw ($messages.ERR_UNSUPPORTED_OS_VERSION -f $OsVersion, "RS1")
    }

    # Win10 RS 9c check.
    if (!(IsWindows10RSWith9CorAbove($OsVersion))) {
        $global:LASTEXITCODE = $E_UNSUPPORTED
        throw ($messages.ERR_UNSUPPORTED_OS_UPDATE -f $OsVersion)
    }

    # All checks passed.
    return $S_OK
}

function Add-Update([string]$WorkingDir, [string]$Image, [string]$PkgFile)
{
    # Validate DISM package Code signing information
    ValidateCodeSign -PackageFile $PkgFile

    # Validate Working Directory
    if (Test-Path -path $WorkingDir) {
        if (!(Get-ChildItem $WorkingDir | Measure-Object).Count -eq 0) {
            $global:LASTEXITCODE = $E_INVALIDINPUT
            throw ($messages.ERR_WORKINGDIR_NOT_EMPTY -f $WorkingDir)
        }
    }

    # Get Windows Image Metadata object & refer its properties.
    $imageInfo = Get-WindowsImage -ImagePath $Image -Index $ImageIndex
    $osVersion = $imageInfo.Version
    $installationType = $imageInfo.InstallationType
    $languages = $imageInfo.Languages
    $arch = ""
    if ($imageInfo.Architecture -eq [ArchitectureTypes]::x64) {
        $arch = "amd64"
    }
    elseif ($imageInfo.Architecture -eq [ArchitectureTypes]::x86) {
        $arch = "x86"
    }
	elseif ($imageInfo.Architecture -eq [ArchitectureTypes]::arm64) {
        $arch = "arm64"
	}
    else
    {
        Write-Host $messages.ERR_UNSUPPORTED_OS_ARC -ForegroundColor Red
        $global:LASTEXITCODE = $E_UNSUPPORTED
        throw $messages.ERR_UNSUPPORTED_OS_ARC
    }

    $mountPoint = Join-Path -Path $WorkingDir -ChildPath "os"
    New-Item -itemtype directory -path $mountPoint | Out-Null

    try {
        # Extract Cab
        $cabContent = Join-Path -Path $WorkingDir -ChildPath "cab"
        New-Item -itemtype directory -path $cabContent | Out-Null
        expand $PkgFile -F:* $cabContent

        ValidateCompatibility -OsVersion $osVersion -OsArchitecture $arch -PackageRoot $cabContent
    } catch {
        Write-Host $messages.ERR_ADD_UPDATE -ForegroundColor Red
        Write-Host $_ -ForegroundColor Yellow
        Write-Host $_.ScriptStackTrace -ForegroundColor Yellow
        Remove-Item -Path "$WorkingDir\*" -Recurse
        throw
    }

    try {
        Mount-WindowsImage -ImagePath $Image -Index $ImageIndex -Path $mountPoint | Out-Null

        # Check if there exists any update already applied.
        $installedPkgXml = Join-Path -Path $mountPoint -ChildPath $WindowsTemp | Join-Path -ChildPath $PackageXml
        if (Test-Path -Path $installedPkgXml) {
            # Get package details
            $pkgDetails = Get-PackageDetailsFromXml -XmlPath $installedPkgXml
            $global:LASTEXITCODE = $E_INVALIDINPUT
            throw ($messages.ERR_UPDATE_ALREADY_EXISTS -f $pkgDetails.PackageVersion)
        }

        # Server images need explicit enablement of defender feature.
        if ($installationType -eq [InstallationTypes]::Server) {
            $defenderFeatureState = Get-WindowsOptionalFeature -FeatureName "Windows-Defender" -Path $mountPoint
            if ($defenderFeatureState.State -ne "Enabled") {
                Write-Host ($messages.INFO_SERVER_ENABLE_DEFENDER) -ForegroundColor Yellow
                Enable-WindowsOptionalFeature -Path $mountPoint -FeatureName "Windows-Defender"
                if ($LASTEXITCODE -ne 0) {
                    $global:LASTEXITCODE = $E_FAIL
                    throw ($messages.ERR_FAILED_ENABLE_DEFENDER -f $LASTEXITCODE, $PkgFile)
                }
            }
        }

        # Definition updates
        Write-Host ($messages.INFO_UPDATE_ENGINE_SIGN) -ForegroundColor Yellow
        $defSrc     = Join-Path -Path $cabContent -ChildPath "Definition Updates\Updates"
        $defTarget  = Join-Path -Path $mountPoint -ChildPath $DefinitionsUpdatesLocation
        if (!(Test-Path -Path $defTarget)) { New-Item -itemtype directory -path $defTarget | Out-Null }
        Copy-Item -Path "$defSrc\*" -Destination $defTarget -Recurse

        # Platform updates
        Write-Host ($messages.INFO_UPDATE_CAMP) -ForegroundColor Yellow
        $campSrc    = Join-Path -Path $cabContent -ChildPath "Platform"
        $campTarget = Join-Path -Path $mountPoint -ChildPath $PlatformLocation
        if (!(Test-Path -Path $campTarget)) { New-Item -itemtype directory -path $campTarget | Out-Null }
        Copy-Item -Path "$campSrc\*" -Destination $campTarget -Recurse

        $campVersionFolder = Join-Path -Path $cabContent -ChildPath "Platform"
        $campVersionFolder = Get-ChildItem -Path $campVersionFolder -Directory -Name

        # Add Package Xml to Windows\Temp.
        $temp = Join-Path -Path $mountPoint -ChildPath $WindowsTemp
        $pkgXmlPath = Join-Path -Path $cabContent -ChildPath $PackageXml
        Copy-Item -Path $pkgXmlPath -Destination $temp

        # UnMount Image
        Dismount-WindowsImage -Path $mountPoint -Save | Out-Null
        Write-Host ($messages.INFO_ADD_UPDATE_SUCCESS) -ForegroundColor Green
        # Get package details to display
        $pkgDetails = Get-PackageDetailsFromXml -XmlPath $pkgXmlPath
        Write-Host ($messages.INFO_PACKAGE_DETAILS -f $pkgDetails.PackageVersion, $pkgDetails.SignatureVersion, $pkgDetails.EngineVersion, $pkgDetails.CampVersion) -ForegroundColor Yellow

        $global:LASTEXITCODE = $S_OK
    } catch {
        Write-Host ($messages.ERR_ADD_UPDATE) -ForegroundColor Red
        Write-Host $_ -ForegroundColor Yellow
        Write-Host $_.ScriptStackTrace -ForegroundColor Yellow
        Write-Host ($messages.INFO_DISCARD_IMAGE_UPDATE)
        Dismount-WindowsImage -Path $mountPoint -Discard | Out-Null
        throw
    } finally {
        Remove-Item -Path "$WorkingDir\*" -Recurse
    }
}

function Remove-Update([string]$WorkingDir, [string]$Image)
{
    try {
        # Validate Working Directory
        if (Test-Path -path $WorkingDir) {
            if (!(Get-ChildItem $WorkingDir | Measure-Object).Count -eq 0) {
                $global:LASTEXITCODE = $E_INVALIDINPUT
                throw ($messages.ERR_WORKINGDIR_NOT_EMPTY -f $WorkingDir)
            }
        }

        $mountPoint = Join-Path -Path $WorkingDir -ChildPath "os"
        New-Item -itemtype directory -path $mountPoint | Out-Null

        Mount-WindowsImage -ImagePath $Image -Index $ImageIndex -Path $mountPoint | Out-Null

        # Check if there exists any update already applied.
        $installedPkgXml = Join-Path -Path $mountPoint -ChildPath $WindowsTemp | Join-Path -ChildPath $PackageXml
        if (!(Test-Path -Path $installedPkgXml)) {
            $global:LASTEXITCODE = $E_INVALIDINPUT
            throw $messages.ERR_NO_UPDATE_TO_REMOVE
        }

        # Clear Definition Updates\Updates folder contents
        $defTarget  = Join-Path -Path $mountPoint -ChildPath $DefinitionsUpdatesLocation
        Remove-Item -Path "$defTarget\*" -Recurse

        # Clear the camp (Platform) folder content.
        $campTarget = Join-Path -Path $mountPoint -ChildPath $PlatformLocation
        Remove-Item -Path "$campTarget\*" -Recurse

        # Remove Package Xml
        Remove-Item -Path $installedPkgXml

        # UnMount Image
        Dismount-WindowsImage -Path $mountPoint -Save | Out-Null
        Write-Host ($messages.INFO_REMOVE_UPDATE_SUCCESS) -ForegroundColor Green
        $global:LASTEXITCODE = $S_OK
    } catch {
        Write-Host ($messages.ERR_REMOVE_UPDATE) -ForegroundColor Red
        Write-Host $_ -ForegroundColor Yellow
        Write-Host $_.ScriptStackTrace -ForegroundColor Yellow
        Write-Host ($messages.INFO_DISCARD_IMAGE_UPDATE)
        Dismount-WindowsImage -Path $mountPoint -Discard | Out-Null
        throw
    } finally {
        Remove-Item -Path "$WorkingDir\*" -Recurse
    }
}

function Show-Update([string]$WorkingDir, [string]$Image)
{
    try {
        # Validate Working Directory
        if (Test-Path -path $WorkingDir) {
            if (!(Get-ChildItem $WorkingDir | Measure-Object).Count -eq 0) {
                $global:LASTEXITCODE = $E_INVALIDINPUT
                throw ($messages.ERR_WORKINGDIR_NOT_EMPTY -f $WorkingDir)
            }
        }

        $mountPoint = Join-Path -Path $WorkingDir -ChildPath "os"
        New-Item -itemtype directory -path $mountPoint | Out-Null

        Mount-WindowsImage -ImagePath $Image -Index $ImageIndex -Path $mountPoint | Out-Null

        # Check if there exists any update already applied.
        $installedPkgXml = Join-Path -Path $mountPoint -ChildPath $WindowsTemp | Join-Path -ChildPath $PackageXml
        if (!(Test-Path -Path $installedPkgXml)) {
            Write-Host ($messages.INFO_NO_UPDATE_IN_IMAGE) -ForegroundColor Yellow
        } else {
            # Get package details to output.
            $pkgDetails = Get-PackageDetailsFromXml -XmlPath $installedPkgXml
            Write-Host ($messages.INFO_PACKAGE_DETAILS -f $pkgDetails.PackageVersion, $pkgDetails.SignatureVersion, $pkgDetails.EngineVersion, $pkgDetails.CampVersion) -ForegroundColor Yellow
        }

        # UnMount Image
        Dismount-WindowsImage -Path $mountPoint -Discard | Out-Null
        $global:LASTEXITCODE = $S_OK
    } catch {
        Write-Host ($messages.ERR_SHOW_UPDATE) -ForegroundColor Red
        Write-Host $_ -ForegroundColor Yellow
        Write-Host $_.ScriptStackTrace -ForegroundColor Yellow
        Write-Host ($messages.INFO_DISCARD_IMAGE_UPDATE)
        Dismount-WindowsImage -Path $mountPoint -Discard | Out-Null
        $global:LASTEXITCODE = $E_FAIL
        throw
    } finally {
        Remove-Item -Path "$WorkingDir\*" -Recurse
    }
}

# Check for presense of expand command.
try {
    Get-Command expand | Out-Null
} catch {
    Write-Host ($messages.ERR_COMMAND_MISSING -f "expand") -ForegroundColor Red
    $global:LASTEXITCODE = $E_COMMANDMISSING
    exit
}

Write-Host "Os Image Path      : $ImagePath" -ForegroundColor Gray
Write-Host "Working Directory  : $WorkingDirectory" -ForegroundColor Gray
Write-Host "Action             : $Action" -ForegroundColor Gray

switch ($Action) {
    "AddUpdate" {
        if ([string]::IsNullOrEmpty($Package)) {
            $global:LASTEXITCODE = $E_INVALIDINPUT
            throw "Invalid input: Package"
        }
        Add-Update -WorkingDir $WorkingDirectory -Image $ImagePath -PkgFile $Package
    }
    "RemoveUpdate" {
        Remove-Update -WorkingDir $WorkingDirectory -Image $ImagePath
    }
    "ShowUpdate" {
        Show-Update -WorkingDir $WorkingDirectory -Image $ImagePath
    }
    Default {
        $global:LASTEXITCODE = $E_INVALIDOPERATION
        throw "Invalid Action requested."
    }
}
# SIG # Begin signature block
# MIImewYJKoZIhvcNAQcCoIImbDCCJmgCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBuB3LvQZq4RXf7
# RQgWg6elhDtwUlPlQMW3v0srO3WM+6CCC2cwggTvMIID16ADAgECAhMzAAAFo/Gd
# RD8zE11OAAAAAAWjMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTAwHhcNMjQwODIyMTkyNTU0WhcNMjUwNzA1MTkyNTU0WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQC1cDDecW3JNN1Gif6PC6VFWoXn2rznwhA4fPd16YBOerR0sRpoUfOctESE0bmf
# mXl/wkxMFlcQhpH8EjfVzb5VIDOysiR8uC4hIZ52wN7iqDcdyal7FavUc/WgxdJl
# T4pEvQbunrVU5RYOCAklLcsS8Aw0VuMe7AVqkUvNRmyDS8/+TfjIKTOh31ItgwHT
# hb7aXXp18bRC2xDYq19dFmd4OELCWyNLz1UrJfiveRrvxtlaX2l3/oAXyvsoNA99
# xdogGPqcd22ovkXAuD/dZ3yyJfVCg7guFmtS3xzegJauqigwdQ7g9Qdmmj9cNa1T
# oK7f1B4k7BBWDp0larpvOgYzAgMBAAGjggFuMIIBajAfBgNVHSUEGDAWBgorBgEE
# AYI3CgMVBggrBgEFBQcDAzAdBgNVHQ4EFgQUS+mEzSyidPYsop8Mq5cLkiHygDcw
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
# MBQGA1UEBRMNMjI5ODYxKzUwMjc4ODAfBgNVHSMEGDAWgBTm/F97uyIAWORyTrX0
# IXQjMubvrDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5j
# b20vcGtpL2NybC9wcm9kdWN0cy9NaWNDb2RTaWdQQ0FfMjAxMC0wNy0wNi5jcmww
# WgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29m
# dC5jb20vcGtpL2NlcnRzL01pY0NvZFNpZ1BDQV8yMDEwLTA3LTA2LmNydDAMBgNV
# HRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQB4A/zCKXXJzW6/0Do56PTFNyyV
# d2tHkRjTPSaQCqzTpjTX8cKGYsvXpmgxdQJ8Ey2upxOOLxT2bOH4MQKJf0cTUfSx
# CoIGGnHPfrXNFQVPOGmMOAWq0fGRfXmVyVVfd6hOY0Fg6bV9BR3hyjx/gUzfdYxL
# mPG/3jw4GD4wQkokVskQXPOqlMbkbn9Mt3vdNEMNitPISxHTrbTb7N2EJ7eiE4Hg
# +lzn+jxe6y0xMIEm6hBxuvfjr0KOspMFLsstBqNxEH5FF+CgGiPwQtbb5QFZ8pLl
# ivddZRABtbcJez3a2FL+kAYnzQ+3pL4G45jelG12YTJvJ9EcVt2xr9QMqeTdMIIG
# cDCCBFigAwIBAgIKYQxSTAAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0
# IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMTAwNzA2MjA0MDE3
# WhcNMjUwNzA2MjA1MDE3WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDEw
# MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Q5kUHlntcTj/QkATJ6U
# rPdWaOpE2M/FWE+ppXZ8bUW60zmStKQe+fllguQX0o/9RJwI6GWTzixVhL99COMu
# K6hBKxi3oktuSUxrFQfe0dLCiR5xlM21f0u0rwjYzIjWaxeUOpPOJj/s5v40mFfV
# HV1J9rIqLtWFu1k/+JC0K4N0yiuzO0bj8EZJwRdmVMkcvR3EVWJXcvhnuSUgNN5d
# pqWVXqsogM3Vsp7lA7Vj07IUyMHIiiYKWX8H7P8O7YASNUwSpr5SW/Wm2uCLC0h3
# 1oVH1RC5xuiq7otqLQVcYMa0KlucIxxfReMaFB5vN8sZM4BqiU2jamZjeJPVMM+V
# HwIDAQABo4IB4zCCAd8wEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFOb8X3u7
# IgBY5HJOtfQhdCMy5u+sMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud
# DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjR
# PZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0
# LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNy
# bDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9z
# b2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MIGd
# BgNVHSAEgZUwgZIwgY8GCSsGAQQBgjcuAzCBgTA9BggrBgEFBQcCARYxaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL1BLSS9kb2NzL0NQUy9kZWZhdWx0Lmh0bTBABggr
# BgEFBQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBQAG8AbABpAGMAeQBfAFMAdABhAHQA
# ZQBtAGUAbgB0AC4gHTANBgkqhkiG9w0BAQsFAAOCAgEAGnTvV08pe8QWhXi4UNMi
# /AmdrIKX+DT/KiyXlRLl5L/Pv5PI4zSp24G43B4AvtI1b6/lf3mVd+UC1PHr2M1O
# HhthosJaIxrwjKhiUUVnCOM/PB6T+DCFF8g5QKbXDrMhKeWloWmMIpPMdJjnoUdD
# 8lOswA8waX/+0iUgbW9h098H1dlyACxphnY9UdumOUjJN2FtB91TGcun1mHCv+KD
# qw/ga5uV1n0oUbCJSlGkmmzItx9KGg5pqdfcwX7RSXCqtq27ckdjF/qm1qKmhuyo
# EESbY7ayaYkGx0aGehg/6MUdIdV7+QIjLcVBy78dTMgW77Gcf/wiS0mKbhXjpn92
# W9FTeZGFndXS2z1zNfM8rlSyUkdqwKoTldKOEdqZZ14yjPs3hdHcdYWch8ZaV4XC
# v90Nj4ybLeu07s8n07VeafqkFgQBpyRnc89NT7beBVaXevfpUk30dwVPhcbYC/GO
# 7UIJ0Q124yNWeCImNr7KsYxuqh3khdpHM2KPpMmRM19xHkCvmGXJIuhCISWKHC1g
# 2TeJQYkqFg/XYTyUaGBS79ZHmaCAQO4VgXc+nOBTGBpQHTiVmx5mMxMnORd4hzbO
# TsNfsvU9R1O24OXbC2E9KteSLM43Wj5AQjGkHxAIwlacvyRdUQKdannSF9PawZSO
# B3slcUSrBmrm1MbfI5qWdcUxghpqMIIaZgIBATCBlTB+MQswCQYDVQQGEwJVUzET
# MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBT
# aWduaW5nIFBDQSAyMDEwAhMzAAAFo/GdRD8zE11OAAAAAAWjMA0GCWCGSAFlAwQC
# AQUAoIH1MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsx
# DjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCAqecfT/lGWXG4zoN2QkwKH
# GSmLEoj9k/xtS1uNSdRNCzCBiAYKKwYBBAGCNwIBDDF6MHigWoBYAE0AaQBjAHIA
# bwBzAG8AZgB0ACAAKABSACkAIABBAG4AdABpAC0ATQBhAGwAdwBhAHIAZQAgAFMA
# aQBnAG4AYQB0AHUAcgBlACAAUABhAGMAawBhAGcAZaEagBhodHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20wDQYJKoZIhvcNAQEBBQAEggEAALat/n3kFxd4NEzlx+NcgWe5
# FfKX5xnsvGGRGh6D8tPxinZ+x9dH9C1YLFv6p9vUV6bLS0NcExP8001b9BEP1In2
# J9l67DG2SRbpzWCVsEJMyvrEP1Pn+cGXY9hiVoDL6MKZSe7IIIpBPVUC7D8cTNvr
# Qm5wwh1QKwi8iU0PHBFy8DhD1A/g6HmcBaD+AiBSmHAWgrGbR/HZaLgOY4roEA9J
# 95ss6c4MdcxtAivCrUX078l15Hl1OJhlRtGolCa/DSwlM852vK7yvY4SKDlfD5/L
# QMphtVkHD0gSOYGQetUT2nJOll0nNPhMOa6YrMK7lkqi30hWXGWwOp0PmGAnWaGC
# F60wghepBgorBgEEAYI3AwMBMYIXmTCCF5UGCSqGSIb3DQEHAqCCF4YwgheCAgED
# MQ8wDQYJYIZIAWUDBAIBBQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIBQQIB
# AQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCAzdaieVUllztR7SZgFV5xo
# yL2GXckgRVH13LZoFZTK5AIGZ7+/vNE3GBMyMDI1MDMwODAwMDQzNy45MTJaMASA
# AgH0oIHZpIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQx
# JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo2NTFBLTA1RTAtRDk0NzElMCMGA1UE
# AxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCCEfswggcoMIIFEKADAgEC
# AhMzAAAB9ZkJlLzxxlCMAAEAAAH1MA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYT
# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBU
# aW1lLVN0YW1wIFBDQSAyMDEwMB4XDTI0MDcyNTE4MzEwMVoXDTI1MTAyMjE4MzEw
# MVowgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNV
# BAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UE
# CxMeblNoaWVsZCBUU1MgRVNOOjY1MUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNy
# b3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
# MIICCgKCAgEAzO90cFQTWd/WP84IT7JMIW1fQL61sdfgmhlfT0nvYEb2kvkNF073
# ZwjveuSWot387LjE0TCiG93e6I0HzIFQBnbxGP/WPBUirFq7WE5RAsuhNfYUL+PI
# b9jJq3CwWxICfw5t/pTyIOHjKvo1lQOTWZypir/psZwEE7y2uWAPbZJTFrKen5R7
# 3x2Hbxy4eW1DcmXjym2wFWv10sBH40ajJfe+OkwcTdoYrY3KkpN/RQSjeycK0bhj
# o0CGYIYa+ZMAao0SNR/R1J1Y6sLkiCJO3aQrbS1Sz7l+/qJgy8fyEZMND5Ms7C0s
# EaOvoBHiWSpTM4vc0xDLCmc6PGv03CtWu2KiyqrL8BAB1EYyOShI3IT79arDIDrL
# +de91FfjmSbBY5j+HvS0l3dXkjP3Hon8b74lWwikF0rzErF0n3khVAusx7Sm1oGG
# +06hz9XAy3Wou+T6Se6oa5LDiQgPTfWR/j9FNk8Ju06oSfTh6c03V0ulla0Iwy+H
# zUl+WmYxFLU0PiaXsmgudNwVqn51zr+Bi3XPJ85wWuy6GGT7nBDmXNzTNkzK98DB
# QjTOabQXUZ884Yb9DFNcigmeVTYkyUXZ6hscd8Nyq45A3D3bk+nXnsogK1Z7zZj6
# XbGft7xgOYvveU6p0+frthbF7MXv+i5qcD9HfFmOq4VYHevVesYb6P0CAwEAAaOC
# AUkwggFFMB0GA1UdDgQWBBRV4Hxb9Uo0oHDwJZJe22ixe2B1ATAfBgNVHSMEGDAW
# gBSfpxVdAF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0
# YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUF
# BzAChlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jv
# c29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8E
# AjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkq
# hkiG9w0BAQsFAAOCAgEAcwxmVPaA9xHffuom0TOSp2hspuf1G0cHW/KXHAuhnpW8
# /Svlq5j9aKI/8/G6fGIQMr0zlpau8jy83I4zclGdJjl5S02SxDlUKawtWvgf7ida
# 06PgjeQM1eX4Lut4bbPfT0FEp77G76hhysXxTJNHv5y+fwThUeiiclihZwqcZMpa
# 46m+oV6igTU6I0EnneotMqFs0Q3zHgVVr4WXjnG2Bcnkip42edyg/9iXczqTBrEk
# vTz0UlltpFGaQnLzq+No8VEgq0UG7W1ELZGhmmxFmHABwTT6sPJFV68DfLoC0iB9
# Qbb9VZ8mvbTV5JtISBklTuVAlEkzXi9LIjNmx+kndBfKP8dxG/xbRXptQDQDaCsS
# 6ogLkwLgH6zSs+ul9WmzI0F8zImbhnZhUziIHheFo4H+ZoojPYcgTK6/3bkSbOab
# mQFf95B8B6e5WqXbS5s9OdMdUlW1gTI1r5u+WAwH2KG7dxneoTbf/jYl3TUtP7AH
# pyck2c0nun/Q0Cycpa9QUH/Dy01k6tQomNXGjivg2/BGcgZJ0Hw8C6KVelEJ31xL
# oE21m9+NEgSKCRoFE1Lkma31SyIaynbdYEb8sOlZynMdm8yPldDwuF54vJiEArjr
# cDNXe6BobZUiTWSKvv1DJadR1SUCO/Od21GgU+hZqu+dKgjKAYdeTIvi9R2rtLYw
# ggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUA
# MIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQD
# EylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0y
# MTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w
# IFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0
# ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveV
# U3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTI
# cVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36M
# EBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHI
# NSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxP
# LOJiss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2l
# IH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDy
# t0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymei
# XtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1
# GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgV
# GD94q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQB
# gjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTu
# MB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsG
# AQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUH
# AwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
# EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYD
# VR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwv
# cHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEB
# BE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j
# ZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQAD
# ggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/
# 2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvono
# aeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRW
# qveVtihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8Atq
# gcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7
# hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkct
# wRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu
# +yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FB
# SX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/
# Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ
# 8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDVjCCAj4CAQEw
# ggEBoYHZpIHWMIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQx
# JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo2NTFBLTA1RTAtRDk0NzElMCMGA1UE
# AxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUA
# JsAKu48NbR5YRg3WSBQCyjzdkvaggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEG
# A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFt
# cCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsFAAIFAOt1cj0wIhgPMjAyNTAzMDcxMzI1
# MTdaGA8yMDI1MDMwODEzMjUxN1owdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA63Vy
# PQIBADAHAgEAAgIF8DAHAgEAAgITZDAKAgUA63bDvQIBADA2BgorBgEEAYRZCgQC
# MSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqG
# SIb3DQEBCwUAA4IBAQCZ7bvvqL684p88hSUxGNaeEv2MbyjxLIQKUPnxyR0Z7ye7
# oKgwgXDWrYIc+MiVPmNW4p3krKMOlh3l874p1G6z0vll0THnK5fwizpd2QxjB21A
# H3sMbRxveThUry0mqETbGlYQkKOElCJgwGd2wWSjLs/7U8sgfRRgDDPyNPZWkLSk
# vnuS6R3KIRZOMyD0KBcHUqVdSOl8rx7EsKTcsyjZb04UZsvqXYfQyL5yV8Ud41MY
# CxX3mGNKU/hDjyQwQWtTmanKOtRLWNUtOwc+Q9EWqe4oXGPwZlFC02Ji/MO55Wsc
# o015DDQjokdpueC1qWDydjGlUfk0fluLhPdZF0HKMYIEDTCCBAkCAQEwgZMwfDEL
# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWlj
# cm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAH1mQmUvPHGUIwAAQAAAfUw
# DQYJYIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAv
# BgkqhkiG9w0BCQQxIgQgL7TKNEM1CtBGH5sWUhuW7qF9WXCkZMzi7c+kAvhh8mcw
# gfoGCyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCDB1vLSFwh09ISu4kdEv4/tg9eR
# 1Yk8w5x7j5GThqaPNTCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy
# MDEwAhMzAAAB9ZkJlLzxxlCMAAEAAAH1MCIEIM+j+PuV8Za2KhCMG1QyAmlzy3QL
# gMaNl//HvTqG8NyZMA0GCSqGSIb3DQEBCwUABIICADWDlkhkvyvV9FklwoZ0YyW+
# DUcnrMSw1HFWnKaLVbO2By/PpLTB8fGFq6e7ZpDy5z3c1Ou7KT9p5Dk44o7Npabx
# LJJlxxK9ry/Zkk3JtNiYERKAZS0gaCSR8aAQubXx46H5t9pOzQDIJ8iZrnD993v1
# J4QaREBUdHgD4Ia7xlMcFOan5dpZ5awV7rqlPYcu+NTRX1lV4M8mHs08Pzn+TFeA
# ZIL9QsActF0TCX+523+3WnlcLERg/c/fOcJerswz9FThwy9taEBV9MYUJ3QM0IBQ
# x8rLef5pjH4K/Tl6jLGW3JHULmD8xmwi+6zF0BThxYedzbZWdrKpxRnZKmOzBZ7s
# jDEb2CcgmPmCTmUDq6HCxMz37awKGEgAXj0LpfiCIsGau0j/5Wmk6iG5OLuSS77D
# A4muqjwwThzGgZLGgqkIDhv7liHpFgvMAq8kb48lZ3LMy4TOlFjkPuCW1g3IHvmY
# FZLVe7drTGRHjZIMYAEMad67B+6DP0KIObiSKC/Boq5K4Xh7GI2JC30+ki3VQ0Uo
# Msg7OEH6hRxrrQO2ueEv3PTZ1VX4WfMcTdD+WItv0/KRiFi65hVGijn+ZZVqTKQH
# D6JPHZc7+skHdyx0GG+qKPyAfUYD6XsE1jdZ9HJw6+Xyy1e/1sSDp12nekjVd1bs
# o/XLPa/S8T217xh/IMbI
# SIG # End signature block