ISOHelper.psm1

#Requires -Version 5.1

# the module uses native windows Image Mastering API (IMAPI2) to create ISO images on Windows
# https://learn.microsoft.com/en-us/windows/win32/imapi

# compile the C# class into a usable .NET type.
# the type is only compiled if it is not already loaded in the .NET AppDomain;
# Add-Type throws an error if the same type is loaded twice, including on module reload.

# Writable IMAPI_MEDIA_PHYSICAL_TYPE values
# https://learn.microsoft.com/en-us/windows/win32/api/imapi2/ne-imapi2-imapi_media_physical_type
# Non-writable types (UNKNOWN, CDROM, DVDROM, HDDVDROM, HDDVDR, HDDVDRAM, BDROM are excluded as they cannot
# be used for the CreateResultImage() process.
enum WritableImapiMediaType {
    IMAPI_MEDIA_TYPE_CDR                 = 0x02  # Write-once CD
    IMAPI_MEDIA_TYPE_CDRW                = 0x03  # Rewritable CD
    IMAPI_MEDIA_TYPE_DVDRAM              = 0x05  # Random-access DVD-RAM
    IMAPI_MEDIA_TYPE_DVDPLUSR            = 0x06  # Write-once DVD+R
    IMAPI_MEDIA_TYPE_DVDPLUSRW           = 0x07  # Rewritable DVD+RW
    IMAPI_MEDIA_TYPE_DVDPLUSR_DUALLAYER  = 0x08  # Write-once DVD+R DL (8.5GB)
    IMAPI_MEDIA_TYPE_DVDDASHR            = 0x09  # Write-once DVD-R
    IMAPI_MEDIA_TYPE_DVDDASHRW           = 0x0a  # Rewritable DVD-RW
    IMAPI_MEDIA_TYPE_DVDDASHR_DUALLAYER  = 0x0b  # Write-once DVD-R DL (8.5GB)
    IMAPI_MEDIA_TYPE_DISK                = 0x0c  # Generic random-access media
    IMAPI_MEDIA_TYPE_DVDPLUSRW_DUALLAYER = 0x0d  # Rewritable DVD+RW DL
    IMAPI_MEDIA_TYPE_BDR                 = 0x12  # Write-once Blu-ray (25GB)
    IMAPI_MEDIA_TYPE_BDRE                = 0x13  # Rewritable Blu-ray
    IMAPI_MEDIA_TYPE_MAX                 = 0x13  #
}

$ModuleRoot = $PSScriptRoot

if (-not ('ISOHelper' -as [type])) {
    $TypeDefinition = Get-Content -LiteralPath (Join-Path -Path $ModuleRoot -ChildPath 'Classes\ISOHelper.cs') -Raw
    try {
        Add-Type -TypeDefinition $TypeDefinition -ErrorAction Stop
    }
    catch {
        $ErrorMessage = 'Failed to load ISOHelper C# class: {0}' -f $_.Exception.Message
        Write-Error -Message $ErrorMessage
        if ($_.Exception.InnerException) {
            Write-Error -Message $_.Exception.InnerException.Message
        }
        throw
    }
}

$ModuleName = 'ISOHelper'
$PublicFunctionsPath = Join-Path -Path $ModuleRoot -ChildPath 'Public'
# get all public functions in the module Public directory (if it exists)
if (Test-Path -Path $PublicFunctionsPath) {
    $PublicFunctions = Get-ChildItem -Path $PublicFunctionsPath -Filter '*.ps1' -File
}
# check for command name conflicts for all public functions
foreach ($Function in $PublicFunctions) {
    $FunctionName = $Function.BaseName
    $ExistingCommand = Get-Command -Name $FunctionName -ErrorAction SilentlyContinue
    if ($ExistingCommand -and ($ExistingCommand.ModuleName -ne $ModuleName)) {
        # if a command with the same name is already loaded and if it does not belong to this module, issue a
        # warning about the conflict and how to use the function from this module to avoid ambiguity

        $WarningMessage = 'Another command named [{0}] (type: [{1}]) is already loaded in module [{2}]. You may need to use "{3}\{0}" command syntax to run this module''s function [{0}].' -f
        $FunctionName,
        $ExistingCommand.CommandType,
        $ExistingCommand.ModuleName,
        $ModuleName

        Write-Warning -Message $WarningMessage
    }
}

# dot-source all public functions
foreach ($PublicFunction in $PublicFunctions) {
    . $PublicFunction.FullName
}

# SIG # Begin signature block
# MIIpKAYJKoZIhvcNAQcCoIIpGTCCKRUCAQExDzANBglghkgBZQMEAgIFADCBiQYK
# KwYBBAGCNwIBBKB7MHkwNAYKKwYBBAGCNwIBHjAmAgMBAAAEEB/MO2BZSwhOtyTS
# xil+81ECAQACAQACAQACAQACAQAwQTANBglghkgBZQMEAgIFAAQwA0jDLhTO9V6l
# 4TxC3TjojBj+LGbZawSBNLzQnjWxRPva+QLdg6P1P4Q60/sd+QzIoIIMXTCCBhow
# ggQCoAMCAQICEGIdbQxSAZ47kHkVIIkhHAowDQYJKoZIhvcNAQEMBQAwVjELMAkG
# A1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEtMCsGA1UEAxMkU2Vj
# dGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIFJvb3QgUjQ2MB4XDTIxMDMyMjAwMDAw
# MFoXDTM2MDMyMTIzNTk1OVowVDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3Rp
# Z28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5n
# IENBIFIzNjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAJsrnVP6NT+O
# YAZDasDP9X/2yFNTGMjO02x+/FgHlRd5ZTMLER4ARkZsQ3hAyAKwktlQqFZOGP/I
# +rLSJJmFeRno+DYDY1UOAWKA4xjMHY4qF2p9YZWhhbeFpPb09JNqFiTCYy/Rv/ze
# dt4QJuIxeFI61tqb7/foXT1/LW2wHyN79FXSYiTxcv+18Irpw+5gcTbXnDOsrSHV
# JYdPE9s+5iRF2Q/TlnCZGZOcA7n9qudjzeN43OE/TpKF2dGq1mVXn37zK/4oiETk
# gsyqA5lgAQ0c1f1IkOb6rGnhWqkHcxX+HnfKXjVodTmmV52L2UIFsf0l4iQ0UgKJ
# Uc2RGarhOnG3B++OxR53LPys3J9AnL9o6zlviz5pzsgfrQH4lrtNUz4Qq/Va5MbB
# wuahTcWk4UxuY+PynPjgw9nV/35gRAhC3L81B3/bIaBb659+Vxn9kT2jUztrkmep
# /aLb+4xJbKZHyvahAEx2XKHafkeKtjiMqcUf/2BG935A591GsllvWwIDAQABo4IB
# ZDCCAWAwHwYDVR0jBBgwFoAUMuuSmv81lkgvKEBCcCA2kVwXheYwHQYDVR0OBBYE
# FA8qyyCHKLjsb0iuK1SmKaoXpM0MMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
# CDAGAQH/AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYEVR0g
# ADAIBgZngQwBBAEwSwYDVR0fBEQwQjBAoD6gPIY6aHR0cDovL2NybC5zZWN0aWdv
# LmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdSb290UjQ2LmNybDB7BggrBgEF
# BQcBAQRvMG0wRgYIKwYBBQUHMAKGOmh0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2Vj
# dGlnb1B1YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5wN2MwIwYIKwYBBQUHMAGGF2h0
# dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4ICAQAG/4Lhd2M2
# bnuhFSCbE/8E/ph1RGHDVpVx0ZE/haHrQECxyNbgcv2FymQ5PPmNS6Dah66dtgCj
# BsULYAor5wxxcgEPRl05pZOzI3IEGwwsepp+8iGsLKaVpL3z5CmgELIqmk/Q5zFg
# R1TSGmxqoEEhk60FqONzDn7D8p4W89h8sX+V1imaUb693TGqWp3T32IKGfIgy9jk
# d7GM7YCa2xulWfQ6E1xZtYNEX/ewGnp9ZeHPsNwwviJMBZL4xVd40uPWUnOJUoSi
# ugaz0yWLODRtQxs5qU6E58KKmfHwJotl5WZ7nIQuDT0mWjwEx7zSM7fs9Tx6N+Q/
# 3+49qTtUvAQsrEAxwmzOTJ6Jp6uWmHCgrHW4dHM3ITpvG5Ipy62KyqYovk5O6cC+
# 040Si15KJpuQ9VJnbPvqYqfMB9nEKX/d2rd1Q3DiuDexMKCCQdJGpOqUsxLuCOuF
# OoGbO7Uv3RjUpY39jkkp0a+yls6tN85fJe+Y8voTnbPU1knpy24wUFBkfenBa+pR
# FHwCBB1QtS+vGNRhsceP3kSPNrrfN2sRzFYsNfrFaWz8YOdU254qNZQfd9O/VjxZ
# 2Gjr3xgANHtM3HxfzPYF6/pKK8EE4dj66qKKtm2DTL1KFCg/OYJyfrdLJq1q2/HX
# ntgr2GVw+ZWhrWgMTn8v1SjZsLlrgIfZHDCCBjswggSjoAMCAQICEQCOb5nN9RcU
# vOdHUaKd3s+pMA0GCSqGSIb3DQEBDAUAMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQK
# Ew9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUg
# U2lnbmluZyBDQSBSMzYwHhcNMjQxMDMxMDAwMDAwWhcNMjcxMDMxMjM1OTU5WjBR
# MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxGDAWBgNVBAoMD1NlcnZlcnMu
# Y29tIEluYzEYMBYGA1UEAwwPU2VydmVycy5jb20gSW5jMIICIjANBgkqhkiG9w0B
# AQEFAAOCAg8AMIICCgKCAgEAvp24We3pIGAO3Vgmlu1/s/FmAOPUHB54iVPzo7rt
# 8OnKaNrf6rrACGGmy+/PAhG3S/pVhIcE3dMAMbsKy9OZzvhTOFpu7eNy2nox/NV4
# 3+4ohdhs395u4M884wCGBt34LFL6lAcxjMBiYD4F9eJ4SPzy1z4s7eeWeqmkrVpu
# C5w0J5UC9DcNkz1phxTLD5ZH4XVbBavHMWi2eMWr+SIB80NVrNpk5Zokx3PoHC92
# Ny5fFPE+xQqgVYokVmLA9/IAtw8kyMxS6uy1b7l9y435RTceHUUjCCQJx/DB73bv
# tZ4mLdUVGCMtAdjHrf//ZqzXEJODoYr0Be6GALtWzItEtNgLCwzEs3MbyLZ2o4jS
# aVNOUCZJT0Ybr3jGrjH40HiWtDKJkM5o21vHhXSwEj6FbP59WXZgz1wFwobGpwsy
# 16u0S6MtAErVTrFqjNU1QTBqQRngtN+1dUmzxbnCOOOM/J/EQHCILWuDqSSW+3Xm
# XIBmhOH6JNgRBYefFUOkXOzKHYWhou4e01Ek0iIXnIEevnX0Ot2W/EzPDnpBk0BE
# nroE9eV68lyIJPM6V0v5UTCtU84ueNCyRVwfrgFt/LpDt2k0c5MM913S+4CiX2NV
# 8CAO98ziPcrZKvoQ9Td6CQd1dWXl8WS4Elqdd1XFemVcukMmvbHqNUqKuWzsyVyb
# GN0CAwEAAaOCAYkwggGFMB8GA1UdIwQYMBaAFA8qyyCHKLjsb0iuK1SmKaoXpM0M
# MB0GA1UdDgQWBBSv2va0R2h+vgq1aXEU2nHKmS3m5DAOBgNVHQ8BAf8EBAMCB4Aw
# DAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzBKBgNVHSAEQzBBMDUG
# DCsGAQQBsjEBAgEDAjAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29t
# L0NQUzAIBgZngQwBBAEwSQYDVR0fBEIwQDA+oDygOoY4aHR0cDovL2NybC5zZWN0
# aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdDQVIzNi5jcmwweQYIKwYB
# BQUHAQEEbTBrMEQGCCsGAQUFBzAChjhodHRwOi8vY3J0LnNlY3RpZ28uY29tL1Nl
# Y3RpZ29QdWJsaWNDb2RlU2lnbmluZ0NBUjM2LmNydDAjBggrBgEFBQcwAYYXaHR0
# cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEMBQADggGBAHEbul2S+/ox
# 9Ircz1n8YqKwbk6T6YyCUcIn7Bz91BhIpgJVRd5n5pukFimCo6jWuLdCRkerv8bB
# NYkrjkWeg3tUwI2oT/yxuSbwmkfS5DQZ2WBBg4GEIDCRRfdyipJMQ8fk1/afHM8H
# 38edvzwfcXdqRbDxJODuZyU4ZOU7Witf8wrzOXhXUyg+4hr6gV24EZz8UbCqyKJP
# sxzqmON7TZg61uypGIcA8P0NUBatE3TDD9cJesv5t8+fDkiW/Hym9ziWiYIlw0N+
# 7nkiFUHrIJCtBCv7U4zz+xv9l40LglasVuEIornU0lt02XUOYNKc9vkx9V0wGeBW
# wKNDMln6f9LNZY3GNE+2lmY5UQq7LyMRQZABdkVq5sIEFy2STBmAN33NVoxZbmul
# 5uama9f8+maPbLQBkqPJLpnXT898DYiOl8ndZ9bfVnKFtv1KU5n637cdZNzt+gYz
# 9oV4YVZO0Wuwd5CYSNwmviz0fyLKtK5VsAA6/2W7fsdCePVedw502DGCHBAwghwM
# AgEBMGkwVDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEr
# MCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNgIRAI5v
# mc31FxS850dRop3ez6kwDQYJYIZIAWUDBAICBQCggYwwEAYKKwYBBAGCNwIBDDEC
# MAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwG
# CisGAQQBgjcCARUwPwYJKoZIhvcNAQkEMTIEMI5PATwMm7JghzyDZvSfVXQ8fuIe
# QjmupWn8mZt7VpT1jRumRv5SJbwBF3E3jLxg+zANBgkqhkiG9w0BAQEFAASCAgCr
# DfhIh+E2uA/Z8tZGMaQx0nJK4wkzC9pto/H8oDPvepjh0cNgX5xftNo+ucFOtbie
# vVTrVy2rDMJ2Re3N5QQM4m26cJYDH44G/AXs1nfzNTJmhMKUhWnZUv610jjmg4/R
# dXToClAly/KaMD37UTDhXJBEblHcc2L4G08gl/0D/ykCTuz3MItcm5MGyBgYefbU
# BQMpW7dfJ2vJHvyU+Qpa9+eBnTcxtzOMR+sftgA5ffBViTvCw3uMdEAJU2CCD3E2
# sUJPqir3ZUoC7vcOJsAFqYgWsK1M8brKNiodKrLnyXb7MAWAS1xK/ypCw7tj+lqz
# 6ZLHaKhcgCiyAB+vcP2QzLsxry/Y3WHRmqr42trtEDtLVKj7dNXAy88OD4QAe9BC
# cLORMB9RO1+stVyg+zBWxPbqhWKlfn5+jloJkcTdDvRAbYe/WpE8XUWB3MisJrTc
# u91Dpk4xv9WkARqt1JrgtHHmPW7ooYovaPOl+/5fNimL0V41/0Gy0xAkh69FBrbk
# NDkl02ytiHCZJXY5LhHC90M/nAPIDZMZtcwJZNHuaw31fklA1NgTNkn71NGnkQn1
# 4gA6BtCxffZIWo4ZS2O6OiI3BpOr0en6E7t14avA4zkRB3RFf0IiDPzJIEvbeCea
# A5VuKgLI4Hxo5Pm/YuMPEFk/QGq2L9cgVtJEH9pwCKGCGOkwghjlBgorBgEEAYI3
# AwMBMYIY1TCCGNEGCSqGSIb3DQEHAqCCGMIwghi+AgEDMQ8wDQYJYIZIAWUDBAIC
# BQAwggEIBgsqhkiG9w0BCRABBKCB+ASB9TCB8gIBAQYKKwYBBAGyMQIBATBBMA0G
# CWCGSAFlAwQCAgUABDCKQhtRqbBvl7ZuMQHYILsaNVWhGuTPTrYzgL5rXWaldGLv
# qRciQtSflNhRdBCoQPMCFQCurw4r3xnKFhx2px6+qwx7Rb/edRgPMjAyNjA1MTEw
# OTI0MDNaoHakdDByMQswCQYDVQQGEwJHQjEXMBUGA1UECBMOV2VzdCBZb3Jrc2hp
# cmUxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEwMC4GA1UEAxMnU2VjdGlnbyBQ
# dWJsaWMgVGltZSBTdGFtcGluZyBTaWduZXIgUjM2oIITBDCCBmIwggTKoAMCAQIC
# EQCkKTtuHt3XpzQIh616TrckMA0GCSqGSIb3DQEBDAUAMFUxCzAJBgNVBAYTAkdC
# MRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLDAqBgNVBAMTI1NlY3RpZ28gUHVi
# bGljIFRpbWUgU3RhbXBpbmcgQ0EgUjM2MB4XDTI1MDMyNzAwMDAwMFoXDTM2MDMy
# MTIzNTk1OVowcjELMAkGA1UEBhMCR0IxFzAVBgNVBAgTDldlc3QgWW9ya3NoaXJl
# MRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxMDAuBgNVBAMTJ1NlY3RpZ28gUHVi
# bGljIFRpbWUgU3RhbXBpbmcgU2lnbmVyIFIzNjCCAiIwDQYJKoZIhvcNAQEBBQAD
# ggIPADCCAgoCggIBANOElfRupFN48j0QS3gSBzzclIFTZ2Gsn7BjsmBF659/kpA2
# Ey7NXK3MP6JdrMBNU8wdmkf+SSIyjX++UAYWtg3Y/uDRDyg8RxHeHRJ+0U1jHEyH
# 5uPdk1ttiPC3x/gOxIc9P7Gn3OgW7DQc4x07exZ4DX4XyaGDq5LoEmk/BdCM1Iel
# VMKB3WA6YpZ/XYdJ9JueOXeQObSQ/dohQCGyh0FhmwkDWKZaqQBWrBwZ++zqlt+z
# /QYTgEnZo6dyIo2IhXXANFkCHutL8765NBxvolXMFWY8/reTnFxk3MajgM5NX6wz
# WdWsPJxYRhLxtJLSUJJ5yWRNw+NBqH1ezvFs4GgJ2ZqFJ+Dwqbx9+rw+F2gBdgo4
# j7CVomP49sS7CbqsdybbiOGpB9DJhs5QVMpYV73TVV3IwLiBHBECrTgUfZVOMF0K
# SEq2zk/LsfvehswavE3W4aBXJmGjgWSpcDz+6TqeTM8f1DIcgQPdz0IYgnT3yFTg
# iDbFGOFNt6eCidxdR6j9x+kpcN5RwApy4pRhE10YOV/xafBvKpRuWPjOPWRBlKdm
# 53kS2aMh08spx7xSEqXn4QQldCnUWRz3Lki+TgBlpwYwJUbR77DAayNwAANE7taB
# rz2v+MnnogMrvvct0iwvfIA1W8kp155Lo44SIfqGmrbJP6Mn+Udr3MR2oWozAgMB
# AAGjggGOMIIBijAfBgNVHSMEGDAWgBRfWO1MMXqiYUKNUoC6s2GXGaIymzAdBgNV
# HQ4EFgQUiGGMoSo3ZIEoYKGbMdCM/SwCzk8wDgYDVR0PAQH/BAQDAgbAMAwGA1Ud
# EwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwSgYDVR0gBEMwQTA1Bgwr
# BgEEAbIxAQIBAwgwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9D
# UFMwCAYGZ4EMAQQCMEoGA1UdHwRDMEEwP6A9oDuGOWh0dHA6Ly9jcmwuc2VjdGln
# by5jb20vU2VjdGlnb1B1YmxpY1RpbWVTdGFtcGluZ0NBUjM2LmNybDB6BggrBgEF
# BQcBAQRuMGwwRQYIKwYBBQUHMAKGOWh0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2Vj
# dGlnb1B1YmxpY1RpbWVTdGFtcGluZ0NBUjM2LmNydDAjBggrBgEFBQcwAYYXaHR0
# cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEMBQADggGBAAKBPqSGclEh
# +WWpLj1SiuHlm8xLE0SThI2yLuq+75s11y6SceBchpnKpxWaGtXc8dya1Aq3RuW/
# /y3wMThsvT4fSba2AoSWlR67rA4fTYGMIhgzocsids0ct/pHaocLVJSwnTYxY2pE
# 0hPoZAvRebctbsTqENmZHyOVjOFlwN2R3DRweFeNs4uyZN5LRJ5EnVYlcTOq3bl1
# tI5poru9WaQRWQ4eynXp7Pj0Fz4DKr86HYECRJMWiDjeV0QqAcQMFsIjJtrYTw7m
# U81qf4FBc4u4swphLeKRNyn9DDrd3HIMJ+CpdhSHEGleeZ5I79YDg3B3A/fmVY2G
# aMik1Vm+FajEMv4/EN2mmHf4zkOuhYZNzVm4NrWJeY4UAriLBOeVYODdA1GxFr1y
# cbcUEGlUecc4RCPgYySs4d00NNuicR4a9n7idJlevAJbha/arIYMEuUqTeRRbWkh
# JwMKmb9yEvppRudKyu1t6l21sIuIZqcpVH8oLWCxHS0LpDRF9Y4jijCCBhQwggP8
# oAMCAQICEHojrtpTaZYPkcg+XPTH4z8wDQYJKoZIhvcNAQEMBQAwVzELMAkGA1UE
# BhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEuMCwGA1UEAxMlU2VjdGln
# byBQdWJsaWMgVGltZSBTdGFtcGluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBa
# Fw0zNjAzMjEyMzU5NTlaMFUxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdv
# IExpbWl0ZWQxLDAqBgNVBAMTI1NlY3RpZ28gUHVibGljIFRpbWUgU3RhbXBpbmcg
# Q0EgUjM2MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAzZjYQ0GrboIr
# 7PYzfiY05ImM0+8iEoBUPu8mr4wOgYPjoiIz5vzf7d5wu8GFK1JWN5hciN9rdqOh
# bdxLcSVwnOTJmUGfAMQm4eXOls3iQwfapEFWuOsYmBKXPNSpwZAFoLGl5y1EaGGc
# 5LByM8wjcbSF52/Z42YaJRsPXY545E3QAPN2mxDh0OLozhiGgYT1xtjXVfEzYBVm
# fQaI5QL35cTTAjsJAp85R+KAsOfuL9Z7LFnjdcuPkZWjssMETFIueH69rxbFOUD6
# 4G+rUo7xFIdRAuDNvWBsv0iGDPGaR2nZlY24tz5fISYk1sPY4gir99aXAGnoo0vX
# 3Okew4MsiyBn5ZnUDMKzUcQrpVavGacrIkmDYu/bcOUR1mVBIZ0X7P4bKf38JF7M
# p7tY3LFF/h7hvBS2tgTYXlD7TnIMPrxyXCfB5yQq3FFoXRXM3/DvqQ4shoVWF/mw
# wz9xoRku05iphp22fTfjKRIVpm4gFT24JKspEpM8mFa9eTgKWWCvAgMBAAGjggFc
# MIIBWDAfBgNVHSMEGDAWgBT2d2rdP/0BE/8WoWyCAi/QCj0UJTAdBgNVHQ4EFgQU
# X1jtTDF6omFCjVKAurNhlxmiMpswDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQI
# MAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwgwEQYDVR0gBAowCDAGBgRVHSAA
# MEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGln
# b1B1YmxpY1RpbWVTdGFtcGluZ1Jvb3RSNDYuY3JsMHwGCCsGAQUFBwEBBHAwbjBH
# BggrBgEFBQcwAoY7aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGlj
# VGltZVN0YW1waW5nUm9vdFI0Ni5wN2MwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3Nw
# LnNlY3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4ICAQAS13sgrQ41WAyegR0lWP1M
# LWd0r8diJiH2VVRpxqFGhnZbaF+IQ7JATGceTWOS+kgnMAzGYRzpm8jIcjlSQ8Jt
# cqymKhgx1s6cFZBSfvfeoyigF8iCGlH+SVSo3HHr98NepjSFJTU5KSRKK+3nVSWY
# kSVQgJlgGh3MPcz9IWN4I/n1qfDGzqHCPWZ+/Mb5vVyhgaeqxLPbBIqv6cM74Nvy
# o1xNsllECJJrOvsrJQkajVz4xJwZ8blAdX5umzwFfk7K/0K3fpjgiXpqNOpXaJ+K
# SRW0HdE0FSDC7+ZKJJSJx78mn+rwEyT+A3z7Ss0gT5CpTrcmhUwIw9jbvnYuYRKx
# FVWjKklW3z83epDVzoWJttxFpujdrNmRwh1YZVIB2guAAjEQoF42H0BA7WBCueHV
# MDyV1e4nM9K4As7PVSNvQ8LI1WRaTuGSFUd9y8F8jw22BZC6mJoB40d7SlZIYfai
# ldlgpgbgtu6SDsek2L8qomG57Yp5qTqof0DwJ4Q4HsShvRl/59T4IJBovRwmqWaf
# H0cIPEX7cEttS5+tXrgRtMjjTOp6A9l0D6xcKZtxnLqiTH9KPCy6xZEi0UDcMTww
# 5Fl4VvoGbMG2oonuX3f1tsoHLaO/Fwkj3xVr3lDkmeUqivebQTvGkx5hGuJaSVQ+
# x60xJ/Y29RBr8Tm9XJ59AjCCBoIwggRqoAMCAQICEDbCsL18Gzrno7PdNsvJdWgw
# DQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVy
# c2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVT
# VCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24g
# QXV0aG9yaXR5MB4XDTIxMDMyMjAwMDAwMFoXDTM4MDExODIzNTk1OVowVzELMAkG
# A1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEuMCwGA1UEAxMlU2Vj
# dGlnbyBQdWJsaWMgVGltZSBTdGFtcGluZyBSb290IFI0NjCCAiIwDQYJKoZIhvcN
# AQEBBQADggIPADCCAgoCggIBAIid2LlFZ50d3ei5JoGaVFTAfEkFm8xaFQ/ZlBBE
# tEFAgXcUmanU5HYsyAhTXiDQkiUvpVdYqZ1uYoZEMgtHES1l1Cc6HaqZzEbOOp6Y
# iTx63ywTon434aXVydmhx7Dx4IBrAou7hNGsKioIBPy5GMN7KmgYmuu4f92sKKjb
# xqohUSfjk1mJlAjthgF7Hjx4vvyVDQGsd5KarLW5d73E3ThobSkob2SL48LpUR/O
# 627pDchxll+bTSv1gASn/hp6IuHJorEu6EopoB1CNFp/+HpTXeNARXUmdRMKbnXW
# flq+/g36NJXB35ZvxQw6zid61qmrlD/IbKJA6COw/8lFSPQwBP1ityZdwuCysCKZ
# 9ZjczMqbUcLFyq6KdOpuzVDR3ZUwxDKL1wCAxgL2Mpz7eZbrb/JWXiOcNzDpQsmw
# GQ6Stw8tTCqPumhLRPb7YkzM8/6NnWH3T9ClmcGSF22LEyJYNWCHrQqYubNeKolz
# qUbCqhSqmr/UdUeb49zYHr7ALL8bAJyPDmubNqMtuaobKASBqP84uhqcRY/pjnYd
# +V5/dcu9ieERjiRKKsxCG1t6tG9oj7liwPddXEcYGOUiWLm742st50jGwTzxbMpe
# pmOP1mLnJskvZaN5e45NuzAHteORlsSuDt5t4BBRCJL+5EZnnw0ezntk9R8QJyAk
# L6/bAgMBAAGjggEWMIIBEjAfBgNVHSMEGDAWgBRTeb9aqitKz1SA4dibwJ3ysgNm
# yzAdBgNVHQ4EFgQU9ndq3T/9ARP/FqFsggIv0Ao9FCUwDgYDVR0PAQH/BAQDAgGG
# MA8GA1UdEwEB/wQFMAMBAf8wEwYDVR0lBAwwCgYIKwYBBQUHAwgwEQYDVR0gBAow
# CDAGBgRVHSAAMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0
# LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDA1Bggr
# BgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5j
# b20wDQYJKoZIhvcNAQEMBQADggIBAA6+ZUHtaES45aHF1BGH5Lc7JYzrftrIF5Ht
# 2PFDxKKFOct/awAEWgHQMVHol9ZLSyd/pYMbaC0IZ+XBW9xhdkkmUV/KbUOiL7g9
# 8M/yzRyqUOZ1/IY7Ay0YbMniIibJrPcgFp73WDnRDKtVutShPSZQZAdtFwXnuiWl
# 8eFARK3PmLqEm9UsVX+55DbVIz33Mbhba0HUTEYv3yJ1fwKGxPBsP/MgTECimh7e
# XomvMm0/GPxX2uhwCcs/YLxDnBdVVlxvDjHjO1cuwbOpkiJGHmLXXVNbsdXUC2xB
# rq9fLrfe8IBsA4hopwsCj8hTuwKXJlSTrZcPRVSccP5i9U28gZ7OMzoJGlxZ5384
# OKm0r568Mo9TYrqzKeKZgFo0fj2/0iHbj55hc20jfxvK3mQi+H7xpbzxZOFGm/yV
# Qkpo+ffv5gdhp+hv1GDsvJOtJinJmgGbBFZIThbqI+MHvAmMmkfb3fTxmSkop2mS
# JL1Y2x/955S29Gu0gSJIkc3z30vU/iXrMpWx2tS7UVfVP+5tKuzGtgkP7d/doqDr
# LF1u6Ci3TpjAZdeLLlRQZm867eVeXED58LXd1Dk6UvaAhvmWYXoiLz4JA5gPBcz7
# J311uahxCweNxE+xxxR3kT0WKzASo5G/PyDez6NHdIUKBeE3jDPs2ACc6CkJ1Sji
# 4PKWVT0/MYIEkjCCBI4CAQEwajBVMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2Vj
# dGlnbyBMaW1pdGVkMSwwKgYDVQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1w
# aW5nIENBIFIzNgIRAKQpO24e3denNAiHrXpOtyQwDQYJYIZIAWUDBAICBQCgggH5
# MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYw
# NTExMDkyNDAzWjA/BgkqhkiG9w0BCQQxMgQwryfB1izP3EMIGFIFjMsMuqg/TmuT
# FD111C11lywx5aP9aKIlBcNV0JVzqjr+S4ejMIIBegYLKoZIhvcNAQkQAgwxggFp
# MIIBZTCCAWEwFgQUOMkUgRBEtNxmPpPUdEuBQYaptbEwgYcEFMauVOR4hvF8PVUS
# SIxpw0p6+cLdMG8wW6RZMFcxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdv
# IExpbWl0ZWQxLjAsBgNVBAMTJVNlY3RpZ28gUHVibGljIFRpbWUgU3RhbXBpbmcg
# Um9vdCBSNDYCEHojrtpTaZYPkcg+XPTH4z8wgbwEFIU9Yy2TgoJhfNCQNcSR3pLB
# QtrHMIGjMIGOpIGLMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNl
# eTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1Qg
# TmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1
# dGhvcml0eQIQNsKwvXwbOuejs902y8l1aDANBgkqhkiG9w0BAQEFAASCAgBXuhtr
# txXeudsH+5N/7IewCvLPa2AeGBlYrZ5VX2llLu27LGL0HoJVANb/UqaSFja1ai9N
# stgcnHo/6KD3wOp8Jodu0ld6jaThalgqnH+WddakZ08+6sylfORyn2RrOT8tlvaZ
# 2Cnv0s5XSV4Kms0nDOA9h6n1HkJYtVXleaUv3J14b+/Y5hfdt5yGPv2Jk/LaTXiS
# qfuFd9OxDip82pTD/U37KuHcpfkwkv48cFuDAuKiKv58teaEYmqyWOGPJneWCx/8
# wlci0ZHwou+sxxgevtEBH3D5IofgbBnjBMunkZqPSJnmZbVG0I/pa+YOd6LVb5AU
# LoiiMIapacbgmLwGcdZ1v5m/ajy7zv0cLObe9890SwVsBRr/ahwuZ+0JA1j7dRrY
# SpFf0rUxGyrpEd8kOpdLuzSqElswUS4poqSSa1uWVjYLIN0fly/qrN7bLq3Xxzk4
# z/HQfHTQFWTdSw7c1rZrWG+9cedXKzR3iEu4eqagY2l7h5+DQ/7M74mn0nSR5Xzf
# jTufxR3mD4NOc6/FoAmPjohpIgKWD22bVYjNxR0LO/0HKWbv0cSVYim23TgukDjA
# ICZtnecfRAHHzyO3arG3XQ94thYoknzETI0ctieCX+b1U5Wj6nJEUwJvCP7tJLva
# I6XVy6zW1gu7K4xD+Z8+Dpspsgc845xUuievPQ==
# SIG # End signature block