New-BCDevContainer.ps1

# Version 1.0.0.0
function New-BCDevContainer {
  <#
 
.SYNOPSIS
  Creates BC container
.DESCRIPTION
  Creates BC container
.PARAMETER containerName
  Name of container
.PARAMETER BCLicense
  The path to the license file
.PARAMETER version
  The version for the artificates to download
.PARAMETER sqlBackupfile
  The file path to the SQL bakcup file
.Parameter databaseServer
  Name of database server when using external SQL Server (omit if using database inside the container)
.Parameter databaseInstance
  Name of database instance when using external SQL Server (omit if using database inside the container)
.Parameter databasePrefix
  Prefix of databases when using external SQL Server (omit if using database inside the container)
.Parameter databaseName
  Name of database to connect to when using external SQL Server (omit if using database inside the container)
.Parameter includeTestToolkit
  Specify this parameter to add the test toolkit and the standard tests to the container
.Parameter includePerformanceToolkit
  Include the performance toolkit app (only 17.x and later)
.Parameter useTraefik
  Set the necessary options to make the container work behind a traefik proxy as explained here https://www.axians-infoma.com/techblog/running-multiple-nav-bc-containers-on-an-azure-vm/
.Parameter PublicDnsName
  Use this parameter to specify which public dns name is pointing to this container.
  This parameter is necessary if you want to be able to connect to the container from outside the host.
.Parameter timeout
  Specify the number of seconds to wait for activity. Default is 1800 (30 min.). -1 means wait forever.
.Parameter enableTaskScheduler
  Include this switch if you want to do Enable the Task Scheduler
.Parameter isolation
  Isolation mode for the container (default is process isolation if host and container OS match)
 .Parameter type
  OnPrem or Sandbox (default is Sandbox)
.Parameter useSSL
  Include this switch if you want to use SSL (https) with a self-signed certificate
.Parameter installCertificateOnHost
  Include this switch if you want to use SSL (https) with a self-signed certificate
.Parameter assignPremiumPlan
  Assign Premium plan to admin user
.Parameter multitenant
  Setup container for multitenancy by adding this switch
.Parameter credential
  Username and Password for the Container
.Parameter AuthenticationEmail
  AuthenticationEmail of the admin user
.Parameter auth
  Set auth to Windows, NavUserPassword or AAD depending on which authentication mechanism your container should use
.Parameter databaseCredential
  Credentials for the database connection when using external SQL Server (omit if using database inside the container)
.Parameter replaceExternalDatabases
  Include this switch to allow New-BcContainer to create/replace databases on the external SQL Server.
  This parameter is ignored unless databaseServer, databasePrefix and databaseName is specified
  This parameter uses Remove-BcDatabase and Restore-BcDatabaseFromArtifacts to remove and create the databases
  Access to the SQL Server on the host must be Windows Authentication
.Parameter assignPremiumPlan
  Assign Premium plan to admin user
.EXAMPLE
 
  New-BCDevContainer -containerName BCDev -BCLicense "C:\DockerShare\License\BCDev.flf" -version "16.0"
 
.EXAMPLE
 
  New-BCDevContainer -containerName BCDev -BCLicense "C:\DockerShare\License\BCDev.flf" -version "16.0" -sqlBackupfile "C:\DockerShare\mssql\Demo Database NAV (11-0).bak"
 
.EXAMPLE
 
  New-BCDevContainer -containerName BCDev -BCLicense "C:\DockerShare\License\BCDev.flf" -version "16.0" -includeTestToolkit
 
.EXAMPLE
  Remember to activate the SQL login for the database server and to active sql login for the sa user
 
  New-BCDevContainer -containerName $containerName -version 17.3 -databaseServer 'host.docker.internal' -databaseName 'cronus'
 
  Following code might be need to create the user in the database.
  New-NavContainerNavUser `
    -containerName $containerName `
    -Credential $credential `
    -ChangePasswordAtNextLogOn:$false `
    -PermissionSetId SUPER `
    -tenant 'Default'
#>

  [CmdletBinding()]
  param(
    [string] $containerName = 'bcdev', 
    [string] $bcLicense = 'https://dynapro.blob.core.windows.net/license/6937402.bclicense',
    [string] $version,
    [string] $country = 'no',
    [string] $sqlBackupfile,
    [string] $databaseServer,
    [string] $databaseInstance = '',
    [string] $databaseName, 
    [string] $databasePrefix = "",
    [switch] $includeTestToolkit,
    [switch] $includePerformanceToolkit,
    [switch] $includeAL,
    [switch] $includeCSide,
    [switch] $doNotExportObjectsToText,
    [switch] $enableSymbolLoading ,
    [switch] $useTraefik,
    [string] $PublicDnsName,
    [switch] $enableTaskScheduler,
    [ValidateSet('', 'process', 'hyperv')]
    [string] $isolation = "",
    [ValidateSet('', 'OnPrem', 'Sandbox')]
    [string] $type = "OnPrem",
    [switch] $useSSL = $false,
    [switch] $installCertificateOnHost = $false,
    [switch] $multitenant,
    [PSCredential] $credential,
    [string] $authenticationEMail = "",
    [string] $AadTenant = "",
    [string] $AadAppId = "",
    [string] $AadAppIdUri = "",
    [PSCredential] $databaseCredential = $null,
    [switch] $replaceExternalDatabases,
    [ValidateSet('Windows','NavUserPassword','UserPassword','AAD')]
    [string] $auth='UserPassword'
  )
  PROCESS {
    try { 
      $RootDrive = (get-location).Drive.Root
      $RootFolderPath = join-path $RootDrive 'DockerShare\'
      $auth = 'NavUserPassword' 
      if ([string]::IsNullOrEmpty($credential.UserName)) {
        $credential = New-Object PSCredential -ArgumentList 'admin', (ConvertTo-SecureString -String 'Welcome2Us' -AsPlainText -Force)
      }
      if ([string]::IsNullOrEmpty($dbcredentials.UserName)) {
        $dbcredentials = New-Object PSCredential -ArgumentList 'sa', $credential.Password
      }
      $additionalParametersString = '-v ' + $RootFolderPath + ':C:\DockerShare'
      if ([string]::IsNullOrEmpty($sqlBackupfile)) {
        $additionalParameters = @(("$additionalParametersString"))
      }
      else {
        $additionalParameters = @(("$additionalParametersString"), ('--env bakfile=' + $sqlBackupfile))
      }
      if ([string]::IsNullOrEmpty($version)) {
        $artifactUrl = Get-BCArtifactUrl -type:$type -country $country -select Latest
      }
      else {
        $artifactUrl = Get-BCArtifactUrl -type:$type -country $country -version $version -select Latest
      }
      if ($useTraefik) {
        $imageName = $artifactUrl
        if ($imageName.Contains('https://bcartifacts.azureedge.net')) {
          $imageName = 'bcimage:' + $imageName.Substring('https://bcartifacts.azureedge.net'.Length + 1).Replace('/', '-')
        }
        else {
          $imageName = 'bcimage:' + $imageName.Substring('https://bcartifacts.blob.core.windows.net'.Length + 1).Replace('/', '-')
        }
      }

      if ([string]::IsNullOrEmpty($databaseName)) {
        New-BCContainer -isolation:$isolation  -accept_eula `
          -doNotCheckHealth `
          -updateHosts `
          -artifactUrl $artifactUrl `
          -imageName $imageName `
          -containerName $containerName `
          -auth $auth `
          -Credential $credential `
          -licenseFile $BCLicense `
          -additionalParameters @($additionalParameters) `
          -useBestContainerOS `
          -includeAL:$includeAL `
          -useSSL:$useSSL -installCertificateOnHost:$installCertificateOnHost `
          -enableTaskScheduler:$enableTaskScheduler `
          -includeTestToolkit:$includeTestToolkit `
          -includePerformanceToolkit:$includePerformanceToolkit `
          -includeCSide:$includeCSide `
          -doNotExportObjectsToText:$doNotExportObjectsToText `
          -enableSymbolLoading:$enableSymbolLoading `
          -useTraefik:$useTraefik `
          -multitenant:$multitenant `
          -PublicDnsName:$PublicDnsName `
          -authenticationEMail: $authenticationEMail `
          -AadAppId: $AadAppId `
          -AadAppIdUri: $AadAppIdUri `
          -AadTenant: $AadTenant `
          -assignPremiumPlan
      }
      else {
        New-BCContainer -accept_eula `
          -doNotCheckHealth `
          -updateHosts `
          -artifactUrl $artifactUrl `
          -imageName $imageName `
          -containerName $containerName `
          -databaseInstance $databaseInstance `
          -databasePrefix $databasePrefix `
          -databaseServer $databaseServer `
          -databaseName $databaseName `
          -databaseCredential $dbcredentials `
          -auth $auth `
          -Credential $credential `
          -licenseFile $BCLicense `
          -additionalParameters @($additionalParameters) `
          -useBestContainerOS `
          -includeAL:$includeAL `
          -useSSL:$useSSL -installCertificateOnHost:$installCertificateOnHost `
          -enableTaskScheduler:$enableTaskScheduler `
          -includeTestToolkit:$includeTestToolkit `
          -includePerformanceToolkit:$includePerformanceToolkit `
          -includeCSide:$includeCSide `
          -doNotExportObjectsToText:$doNotExportObjectsToText `
          -enableSymbolLoading:$enableSymbolLoading `
          -useTraefik:$useTraefik `
          -multitenant:$multitenant `
          -replaceExternalDatabases:$replaceExternalDatabases `
          -PublicDnsName:$PublicDnsName `
          -authenticationEMail: $authenticationEMail `
          -AadAppId: $AadAppId `
          -AadAppIdUri: $AadAppIdUri `
          -AadTenant: $AadTenant `
          -assignPremiumPlan 
      } 
    }
    catch [Exception] {
      "New-BCDevContainer :`n`n " + $_.Exception
    }
    finally {
      # Clean up copied backup file after restore completes successfully
    }
  }
}
Export-ModuleMember -Function New-BCDevContainer


# SIG # Begin signature block
# MIIVlQYJKoZIhvcNAQcCoIIVhjCCFYICAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUtuC17o0VNWYp22hUG6JAwASW
# DxagghH1MIIFbzCCBFegAwIBAgIQSPyTtGBVlI02p8mKidaUFjANBgkqhkiG9w0B
# AQwFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVy
# MRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEh
# MB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTIxMDUyNTAwMDAw
# MFoXDTI4MTIzMTIzNTk1OVowVjELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3Rp
# Z28gTGltaXRlZDEtMCsGA1UEAxMkU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5n
# IFJvb3QgUjQ2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjeeUEiIE
# JHQu/xYjApKKtq42haxH1CORKz7cfeIxoFFvrISR41KKteKW3tCHYySJiv/vEpM7
# fbu2ir29BX8nm2tl06UMabG8STma8W1uquSggyfamg0rUOlLW7O4ZDakfko9qXGr
# YbNzszwLDO/bM1flvjQ345cbXf0fEj2CA3bm+z9m0pQxafptszSswXp43JJQ8mTH
# qi0Eq8Nq6uAvp6fcbtfo/9ohq0C/ue4NnsbZnpnvxt4fqQx2sycgoda6/YDnAdLv
# 64IplXCN/7sVz/7RDzaiLk8ykHRGa0c1E3cFM09jLrgt4b9lpwRrGNhx+swI8m2J
# mRCxrds+LOSqGLDGBwF1Z95t6WNjHjZ/aYm+qkU+blpfj6Fby50whjDoA7NAxg0P
# OM1nqFOI+rgwZfpvx+cdsYN0aT6sxGg7seZnM5q2COCABUhA7vaCZEao9XOwBpXy
# bGWfv1VbHJxXGsd4RnxwqpQbghesh+m2yQ6BHEDWFhcp/FycGCvqRfXvvdVnTyhe
# Be6QTHrnxvTQ/PrNPjJGEyA2igTqt6oHRpwNkzoJZplYXCmjuQymMDg80EY2NXyc
# uu7D1fkKdvp+BRtAypI16dV60bV/AK6pkKrFfwGcELEW/MxuGNxvYv6mUKe4e7id
# FT/+IAx1yCJaE5UZkADpGtXChvHjjuxf9OUCAwEAAaOCARIwggEOMB8GA1UdIwQY
# MBaAFKARCiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBQy65Ka/zWWSC8oQEJw
# IDaRXBeF5jAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zATBgNVHSUE
# DDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEMGA1Ud
# HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0FBQUNlcnRpZmlj
# YXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0
# cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUAA4IBAQASv6Hvi3Sa
# mES4aUa1qyQKDKSKZ7g6gb9Fin1SB6iNH04hhTmja14tIIa/ELiueTtTzbT72ES+
# BtlcY2fUQBaHRIZyKtYyFfUSg8L54V0RQGf2QidyxSPiAjgaTCDi2wH3zUZPJqJ8
# ZsBRNraJAlTH/Fj7bADu/pimLpWhDFMpH2/YGaZPnvesCepdgsaLr4CnvYFIUoQx
# 2jLsFeSmTD1sOXPUC4U5IOCFGmjhp0g4qdE2JXfBjRkWxYhMZn0vY86Y6GnfrDyo
# XZ3JHFuu2PMvdM+4fvbXg50RlmKarkUT2n/cR/vfw1Kf5gZV6Z2M8jpiUbzsJA8p
# 1FiAhORFe1rYMIIGGjCCBAKgAwIBAgIQYh1tDFIBnjuQeRUgiSEcCjANBgkqhkiG
# 9w0BAQwFADBWMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVk
# MS0wKwYDVQQDEyRTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYw
# HhcNMjEwMzIyMDAwMDAwWhcNMzYwMzIxMjM1OTU5WjBUMQswCQYDVQQGEwJHQjEY
# MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1Ymxp
# YyBDb2RlIFNpZ25pbmcgQ0EgUjM2MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
# igKCAYEAmyudU/o1P45gBkNqwM/1f/bIU1MYyM7TbH78WAeVF3llMwsRHgBGRmxD
# eEDIArCS2VCoVk4Y/8j6stIkmYV5Gej4NgNjVQ4BYoDjGMwdjioXan1hlaGFt4Wk
# 9vT0k2oWJMJjL9G//N523hAm4jF4UjrW2pvv9+hdPX8tbbAfI3v0VdJiJPFy/7Xw
# iunD7mBxNtecM6ytIdUlh08T2z7mJEXZD9OWcJkZk5wDuf2q52PN43jc4T9OkoXZ
# 0arWZVeffvMr/iiIROSCzKoDmWABDRzV/UiQ5vqsaeFaqQdzFf4ed8peNWh1OaZX
# nYvZQgWx/SXiJDRSAolRzZEZquE6cbcH747FHncs/Kzcn0Ccv2jrOW+LPmnOyB+t
# AfiWu01TPhCr9VrkxsHC5qFNxaThTG5j4/Kc+ODD2dX/fmBECELcvzUHf9shoFvr
# n35XGf2RPaNTO2uSZ6n9otv7jElspkfK9qEATHZcodp+R4q2OIypxR//YEb3fkDn
# 3UayWW9bAgMBAAGjggFkMIIBYDAfBgNVHSMEGDAWgBQy65Ka/zWWSC8oQEJwIDaR
# XBeF5jAdBgNVHQ4EFgQUDyrLIIcouOxvSK4rVKYpqhekzQwwDgYDVR0PAQH/BAQD
# AgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwGwYD
# VR0gBBQwEjAGBgRVHSAAMAgGBmeBDAEEATBLBgNVHR8ERDBCMECgPqA8hjpodHRw
# Oi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ1Jvb3RS
# NDYuY3JsMHsGCCsGAQUFBwEBBG8wbTBGBggrBgEFBQcwAoY6aHR0cDovL2NydC5z
# ZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdSb290UjQ2LnA3YzAj
# BggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEM
# BQADggIBAAb/guF3YzZue6EVIJsT/wT+mHVEYcNWlXHRkT+FoetAQLHI1uBy/YXK
# ZDk8+Y1LoNqHrp22AKMGxQtgCivnDHFyAQ9GXTmlk7MjcgQbDCx6mn7yIawsppWk
# vfPkKaAQsiqaT9DnMWBHVNIabGqgQSGTrQWo43MOfsPynhbz2Hyxf5XWKZpRvr3d
# MapandPfYgoZ8iDL2OR3sYztgJrbG6VZ9DoTXFm1g0Rf97Aaen1l4c+w3DC+IkwF
# kvjFV3jS49ZSc4lShKK6BrPTJYs4NG1DGzmpToTnwoqZ8fAmi2XlZnuchC4NPSZa
# PATHvNIzt+z1PHo35D/f7j2pO1S8BCysQDHCbM5Mnomnq5aYcKCsdbh0czchOm8b
# kinLrYrKpii+Tk7pwL7TjRKLXkomm5D1Umds++pip8wH2cQpf93at3VDcOK4N7Ew
# oIJB0kak6pSzEu4I64U6gZs7tS/dGNSljf2OSSnRr7KWzq03zl8l75jy+hOds9TW
# SenLbjBQUGR96cFr6lEUfAIEHVC1L68Y1GGxx4/eRI82ut83axHMViw1+sVpbPxg
# 51Tbnio1lB93079WPFnYaOvfGAA0e0zcfF/M9gXr+korwQTh2Prqooq2bYNMvUoU
# KD85gnJ+t0smrWrb8dee2CvYZXD5laGtaAxOfy/VKNmwuWuAh9kcMIIGYDCCBMig
# AwIBAgIRANm8nd1n4WvloMcEQ5z43dkwDQYJKoZIhvcNAQEMBQAwVDELMAkGA1UE
# BhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGln
# byBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNjAeFw0yMTEwMjIwMDAwMDBaFw0y
# NDEwMjEyMzU5NTlaMEcxCzAJBgNVBAYTAk5PMQ4wDAYDVQQIDAVWaWtlbjETMBEG
# A1UECgwKRHluYXBybyBBUzETMBEGA1UEAwwKRHluYXBybyBBUzCCAiIwDQYJKoZI
# hvcNAQEBBQADggIPADCCAgoCggIBAODd7SFuO0KPfAVdjt1o/NGqrIZXT7qOqrrL
# jI+cheKE/mCHJXFyHWAXgvNz5h++mTAG4bHGDYMYGplt+S3INAm2lnkh3kxerfLP
# +kmjaiQ/cT4nXomJkpAXnlVaoSXcJDcWDBDsmkD1+lFjE9nbEdeJOvQ4Q72Cn7OH
# sXthZchhiVJfPP0wywFG/uQsCMXgOqUFJwrpvOLOIqTUTH4+ZiwelFeGq4T+CEtF
# ic8rL8f6/lYotRv1MoRYsmV7iDnrY7e1drswAiv8bQNi842LfQ62uSCS4cYHpPOt
# b3rbqZHzTuL2o9Nqz2NcffwG4mkrKyYiWCvOKKg868z7/jc8uiMSt500SiJyjQA9
# zM0pqH1EbWIUBufpJuSc0TqnxxI0DG9z3m5xGV5Sydz5zfHVWhXP/nXtsf+8dAIT
# 1zUEC4HfMtVO/X3NVaZYmYwpmAuscVJCxdm786XLMTe3Nh18v1RdTn28uxr0JnoR
# wsmPRoYyJkUb3nbh1q+xMHv75QV3KPlfTe1UwpEs7K9YnOfpXLcJhn0u13ENN5Sm
# FNznnfkGxP0jSI5MZ3f2EI7ks1TsjZNeTSznW94hQz36Ttehm8y7uL5ew4jajYeW
# 6OUu/zGhJCpZNP2Hfyi0f06ISyJFWkog1Q3G0udZhUYf31pJ6G42ZxqS5ihdPLmG
# 1dYLGWd9AgMBAAGjggG4MIIBtDAfBgNVHSMEGDAWgBQPKssghyi47G9IritUpimq
# F6TNDDAdBgNVHQ4EFgQUx2vSVcLaMddlQfJKC3538TBe1ecwDgYDVR0PAQH/BAQD
# AgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4
# QgEBBAQDAgQQMEoGA1UdIARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUH
# AgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEATBJBgNVHR8EQjBA
# MD6gPKA6hjhodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl
# U2lnbmluZ0NBUjM2LmNybDB5BggrBgEFBQcBAQRtMGswRAYIKwYBBQUHMAKGOGh0
# dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FS
# MzYuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAaBgNV
# HREEEzARgQ9wb3N0QGR5bmFwcm8ubm8wDQYJKoZIhvcNAQEMBQADggGBAAe6J7g+
# cJ7iWZ1DyGKy/2Ber7rIqOeiLi16R3xz8l21++ruItAygqW3JBtLj5cAxCAgJJZe
# XlShKQh+fuoSxIWEWCpMC0k8865hZIhjzfX/TKdF4Bs4VsJqha72j412IITjNNnf
# ZxfZninStkY2wA1M7D7YZUYEqnN+9UO8iEVO4SY8aKIm4YCXI5LlpDoonXGqY/yA
# YBUvMRGutUNBoNWToY8xHeavrEZ/S5CUOzaeRByG9NMYtbfLJjV5APo1Aup0hZWj
# 424wSAWt8tkc+wErO/s1yMZqU8lw/ucqXB2WirvJr4zeJMh3RywOscJfxg8WONu0
# UVlHkly6DGurGpqM1ekFIFXVko/RPuaoIhsuTpO9rZTDTcZ5tNej3jzk8scDqOSo
# SsgrEDE3XeVXlyZD2p6P2XJzoSdZwfsHRlY/Ji0gyB9dBuxicOmcKk1fxvVgcjm6
# 6wjiMHOrZa2JiIxYtBVGinEEMU83eyq0deVNO1DqZcuLGAyGH4p96dKEYDGCAwow
# ggMGAgEBMGkwVDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRl
# ZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNgIR
# ANm8nd1n4WvloMcEQ5z43dkwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAI
# oAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIB
# CzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFMcJv57XTAT9Z5YCqlJV
# bGDJc4oXMA0GCSqGSIb3DQEBAQUABIICAG0fV8Ccn45q6pxJqp1NR23ta8sAW+Wp
# /8OW3uHWJswrGQS8800yXsGAmLlJD7H401dhUw+I0vZe+Ryy440ElJ2NA7mQWYWG
# z/VFdNaFDqr/Wk6B4hJKN0u22ATDd1Y5tG4RuIEtpd7q01bUUnCmRJhh+VCnRP8S
# VUIYa7CDwpV2RMiNvHMYK/Zs2Rs5dxIcBoGMRbfnkJqeIkEWBEgZDANq+2mulaqs
# 1SnDh6WGdaErLHDqegAHxRwwMg5b/e4FCTebBsZb+XfzlnhHPkK2PJxKMF+syYGx
# ofn3BO/opwrmXieacvj+zU5BEkSwDjWDdZsaDuvPnEjK3o3cZnsuh9h3wsq6+mgd
# kfUd4E+jp0j6pRHLlZpvkhYLAye6WChFZOcj3p5guK86JFYOGZWwqPc0U64z/ciT
# N1O+n0MP7k2DBItdQTIHsMd72zEPVSEgxEQT1Bnl+z1v5v3Z4KjgkEmn3ne7zBxt
# hCEliiiEWK90S+Gt9zh6Ynvt2b0ny3tCU9DVqjGr3f/9G15aw2CAfJNgZRwfhPjJ
# OZCkNgXpo6r3iaCVaYXYq8YfiFDph3TAGWgInPcA/EdJUVtEKZ7q+vcJfUVrS9rQ
# 1N9C1jTqMoCFQmfT9uzAFnysTeCYMay6/OaQ39iEXfNx9PODvmQCMILBsto0V49G
# OZGxnVzRaNBK
# SIG # End signature block