Container/New-BCDevContainer.ps1
Function New-BCDevContainer { param ( [Parameter(Mandatory = $false)] [ValidateSet('bricklead', 'primus-by-bricklead')][string]$DevOpsSignature = 'bricklead', [Parameter(Mandatory = $false)] [ValidateSet("Sandbox", "OnPrem")][string]$SubVersion = 'Sandbox', [Parameter(Mandatory = $false)] [ValidateSet("AppSource", "Master", "Release-Candidate")] [string]$SourceApp = 'Release-Candidate', [Parameter(Mandatory = $false)] [System.Management.Automation.PSCredential]$AdminCredential = (New-Object System.Management.Automation.PSCredential -argumentList "ADMIN", (ConvertTo-SecureString -String "P@ssword1" -AsPlainText -Force)), [Parameter(Mandatory = $false)] [boolean]$launchBrowser = $true, [switch]$Insider, [switch]$CopyCRONUS, [switch]$NoTestLibrary, [Switch]$NoCleanArtifact ) Clear-Host $DevOpsSignature = $DevOpsSignature.ToLower() $Profil = "Consultant" if (Test-Path "$($env:USERPROFILE)\.vscode\extensions\ms-dynamics-smb.al-*") { $Profil = "Developer" } if ($NoTestLibrary) { $Profil = "Consultant" } #Checking container permissions Write-Host "Checking container permissions" -foregroun Yellow Check-BcContainerHelperPermissions -Fix # Version Write-Host Write-Host "Getting D365BC $SubVersion Artifacts..." -foregroun Yellow $TempJson = "$env:TEMP\$([Guid]::newguid().ToString()).json" $SourceVersion = 'https://bribcextension.blob.core.windows.net/devops/bcartifactversion/bc' + $SubVersion if ($insider) { $SourceVersion += 'insider' } $SourceVersion += '.json' Get-BCDevFile -SourceURl $SourceVersion.ToLowerInvariant() -destination $TempJson $BCVersions = Get-Content $TempJson | ConvertFrom-Json Remove-Item $TempJson -Force -ErrorAction SilentlyContinue # Master $VersionMajor = $BCVersions.Major | Sort-Object | Get-Unique if ($VersionMajor.length -gt 1) { $VersionMajor = Get-Choice -ChoiceList $VersionMajor -DefaultChoice ($VersionMajor.Length - 1) } # Minor $VersionMinor = ($BCVersions | Where-Object Major -eq $VersionMajor).Minor | Sort-Object | Get-Unique if ($VersionMinor.length -gt 1) { $VersionMinor = Get-Choice -Caption "Please select a cumulative update" -ChoiceList $VersionMinor -DefaultChoice ($VersionMinor.Length - 1) } # Country $Countries = ($BCVersions | Where-Object Major -eq $VersionMajor | Where-Object Minor -EQ $VersionMinor).country if ($Countries.Length -gt 2) { $Countries = @("base") + $Countries } if ($Countries.length -gt 1) { $Default = ($Countries.IndexOf("fr")) if (($Profil -eq "Developer") -and ($Countries.IndexOf("base") -gt -1 )) { $Default = ($Countries.IndexOf("base")) } $Country = Get-Choice -Caption "Please select a country version" -ChoiceList $Countries -DefaultChoice $Default } # Container Name $ContainerName = ($SubVersion + $VersionMajor + '-' + $VersionMinor + '-' + $Country).ToLower() $ContainerName = $ContainerName.Replace('-0', '').Replace('-base', '') Write-Host $ContainerName = Get-FromUser -Message "Container Name" -DefaultValue $ContainerName $ContainerName = $ContainerName.ToLower() # Select Extension to Insert $TempJson = "$env:TEMP\$([Guid]::NewGuid().ToString()).json" Get-BCDevFile -SourceURl "https://bribcextension.blob.core.windows.net/devops/availability/$DevOpsSignature/available-extensions.json" -destination $TempJson $ExtensionList = (Get-Content $TempJson | ConvertFrom-Json).extension $AppList = $(foreach ($Ext in $ExtensionList) { $Ext.Name }) | Sort-Object Remove-Item $TempJson -Force -ErrorAction SilentlyContinue $AddExtensions = Get-FromList -Values $AppList # Get Artifact Write-Host Write-Host "Getting latest D365BC $SubVersion $VersionMajor.$VersionMinor $Country Artifacts..." -foregroun Yellow if ($Insider) { $ArtifactURL = Get-BCArtifactUrl -type $SubVersion -Version "$VersionMajor.$VersionMinor" -country $Country -storageAccount bcinsider -accept_insiderEula } else { $ArtifactURL = Get-BCArtifactUrl -type $SubVersion -Version "$VersionMajor.$VersionMinor" -country $Country } Write-Host Write-Host "Container version : $($ArtifactURL.split('/')[3]) $($ArtifactURL.split('/')[4]) $($ArtifactURL.split('/')[5])" -ForegroundColor Green # License File $LicenseTemp = "$env:TEMP\$([Guid]::newguid().ToString())" if ($ArtifactURL.Split('/')[4].Split('.')[0] -ge 19) { $LicenseSignature = 'bclicense' } else { $LicenseSignature = 'flf' }; $LicenseCountry = $Country; if ($LicenseCountry -eq 'base') { $LicenseCountry = 'w1' }; Try { $LicenseUrl = "https://bribcresource.blob.core.windows.net/resource/license/$DevOpsSignature/$VersionMajor/$LicenseCountry.$LicenseSignature".ToLowerInvariant() Get-BCDevFile -SourceURL $LicenseUrl -destination $LicenseTemp Write-Host "License : $DevOpsSignature - $VersionMajor $LicenseCountry" -ForegroundColor Green } catch { Try { $LicenseUrl = "https://bribcresource.blob.core.windows.net/resource/license/$DevOpsSignature/$VersionMajor/w1.$LicenseSignature".ToLowerInvariant() Get-BCDevFile -SourceURL $LicenseUrl -destination $LicenseTemp Write-Host "License : $DevOpsSignature - $VersionMajor w1" -ForegroundColor Green } catch { Try { $LicenseUrl = "https://bribcresource.blob.core.windows.net/resource/license/$DevOpsSignature/latest/$LicenseCountry.$LicenseSignature".ToLowerInvariant() Get-BCDevFile -SourceURL $LicenseUrl -destination $LicenseTemp Write-Host "License : $DevOpsSignature - latest $LicenseCountry" -ForegroundColor Green } catch { $LicenseUrl = "https://bribcresource.blob.core.windows.net/resource/license/$DevOpsSignature/latest/w1.$LicenseSignature".ToLowerInvariant() Get-BCDevFile -SourceURL $LicenseUrl -destination $LicenseTemp Write-Host "License : $DevOpsSignature - latest w1" -ForegroundColor Green } } } Remove-Item -Path $LicenseTemp -ErrorAction SilentlyContinue # Not a Developpement License if ($null -eq (Select-String -Path $LicenseTemp -Pattern "Solution Developer")) { $Profil = "Consultant" } # Shortcuts Folder $NewShortcutsFolder = "$($bcContainerHelperConfig.hostHelperFolder)\Extensions\$ContainerName\Shortcuts" $AppsFolder = "$($bcContainerHelperConfig.hostHelperFolder)\Extensions\$ContainerName\Apps" Remove-Item -Path $NewShortcutsFolder -Recurse -ErrorAction SilentlyContinue -Force | Out-Null # Build Container arguments $arguments = @{} $arguments.containerName = $ContainerName $arguments.accept_eula = $true $arguments.accept_insiderEula = $true $arguments.accept_outdated = $true $arguments.alwaysPull = $true $arguments.auth = "NavUserPassword" $arguments.Credential = $AdminCredential $arguments.artifactUrl = $ArtifactURL $arguments.memoryLimit = "8G" $arguments.licenseFile = $LicenseURL $arguments.shortcuts = "Desktop" $arguments.assignPremiumPlan = $true $arguments.updateHosts = $true $arguments.UseBestContainerOS = $true $arguments.enableTaskScheduler = $true $arguments.timeout = -1 # $arguments.isolation = "hyperv" ### In case of fail if ($Profil -eq "Developer") { $arguments.includeTestToolkit = $true $arguments.includeTestLibrariesOnly = $true if ($VersionMajor -eq 14) { $arguments.includeCSide = $true $arguments.doNotExportObjectsToText = $true $arguments.enableSymbolLoading = $true } } Start-Sleep -Seconds 3 # Create Container Write-Host "Creating Container $ContainerName - $($ArtifactURL.split('/')[3]) $($ArtifactURL.split('/')[4]) $($ArtifactURL.split('/')[5])" -ForegroundColor Yellow New-BcContainer @arguments # New Shortcut Folder New-Item -Path $NewShortcutsFolder -ItemType Directory -ErrorAction SilentlyContinue -Force | Out-Null # Save Log Write-Host Write-Host "Saving Container log" -ForegroundColor Yellow docker logs $ContainerName | Out-File "$NewShortcutsFolder\$ContainerName Container Log.txt" -Force # Move shortcuts Write-Host Write-Host "Moving shortcuts" -ForegroundColor Yellow Move-Item -Path "$([Environment]::GetFolderPath("Desktop"))\$ContainerName *" ` -Destination "$NewShortcutsFolder\" ` -Force # Adding fonts <# if (Test-Path "C:\Windows\Fonts\arial*.ttf") { Write-Host Write-Host "Adding Arial family fonts" -ForegroundColor Yellow Add-FontsToBcContainer -containerName $ContainerName -path @("C:\Windows\Fonts\arial*.ttf") } if (Test-Path "C:\Windows\Fonts\IDAutomation*.ttf") { Write-Host "Adding IDAutomation Codabar fonts" -ForegroundColor Yellow Add-FontsToBcContainer -containerName $ContainerName -path @("C:\Windows\Fonts\IDAutomation*.ttf") } #> # Insert Test Users if ($Profil -eq "Developer") { Write-Host Write-Host "Adding Test Users" -ForegroundColor Yellow Setup-BcContainerTestUsers -containerName $ContainerName -credential $AdminCredential -Password (ConvertTo-SecureString -String "P@ssword1" -AsPlainText -Force) } # Insert Extensions if (($AddExtensions.Length) -gt 0) { Write-Host Write-Host "Searching $SourceApp Extensions" -ForegroundColor Yellow New-BCDevDirectory -Path $AppsFolder $bcContainerHelperConfig.TrustedNuGetFeeds = @( [PSCustomObject]@{ "url" = "https://pkgs.dev.azure.com/isaISV/_packaging/$SourceApp/nuget/v3/index.json".ToLower(); "token" = '4gaswdlecvwh5x22ybfsgf6uagtakrpjfdxt3zpd3bwnvw24wb2a'; "patterns" = @("*") } ) foreach ($Extension in $AddExtensions) { $PackageId = ($ExtensionList | Where-Object { $_.name -eq $Extension } ).AppID Download-BcNuGetPackageToFolder -packageName $PackageId -downloadDependencies allButMicrosoft -folder $AppsFolder } $AppFiles = @() foreach ($Files in (Get-Item "$AppsFolder\*.app")) { $AppFiles += $Files.FullName } Write-Host "Sorting $($AppFiles.Length) extensions..." -ForegroundColor Yellow $AppFiles = Sort-AppFilesByDependencies -appFiles $AppFiles $AppFiles | ForEach-Object { Write-Host $_.split('\')[-1] } Write-Host Write-Host "Publishing extensions..." -ForegroundColor Yellow foreach ($Files in $AppFiles) { try { Publish-BcContainerApp -containerName $ContainerName -appfile $Files -useDevEndpoint -syncMode ForceSync -install -credential $AdminCredential } catch { Write-Host "$Files not installed." -ForegroundColor Red } } } # Create a Cronus Copy if ($CopyCRONUS) { Write-Host Write-Host "Copying CRONUS to zCompany" -ForegroundColor Yellow $CompanyInDocker = (Get-CompanyInNavContainer -containerName $ContainerName | Where-Object { $_.CompanyName -like "*CRONUS*" } | Select-Object -First 1).CompanyName try { Copy-CompanyInBcContainer -containerName $ContainerName ` -sourceCompanyName $CompanyInDocker ` -destinationCompanyName "z$CompanyInDocker" } catch { Write-Host "zCompany creation failed." -ForegroundColor Red } } # Launch Browser if ($launchBrowser) { $URL = Get-Content "$NewShortcutsFolder\$ContainerName Container Log.txt" $URL = $URL | Where-Object { $_ -like "Web Client*" } $URL = $URL.split(":")[2] Write-Host Write-Host "Launching Browser http:$URL" -ForegroundColor Yellow Start-Process "http:$URL" } if (!($NoCleanArtifact)) { Write-Host Write-Host "Cleaning BC Artifacts" -ForegroundColor Yellow Docker image prune -f Flush-ContainerHelperCache -cache bcartifacts -keepDays 2 } } Export-ModuleMember -Function New-BCDevContainer # SIG # Begin signature block # MIInngYJKoZIhvcNAQcCoIInjzCCJ4sCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDoZhcU5s+bATuE # hR6HSy7S5fF0OQ5YgiQb3eBYbqYpsaCCILUwggWNMIIEdaADAgECAhAOmxiO+dAt # 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV # BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa # Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy # dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD # ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC # ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E # MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy # unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF # xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1 # 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB # MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR # WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6 # nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB # YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S # UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x # q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB # NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP # TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC # AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp # Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv # bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0 # aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB # LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc # Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov # Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy # oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW # juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF # mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z # twGpn1eqXijiuZQwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqG # SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx # GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy # dXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMx # CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy # RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg # Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXH # JQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMf # UBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w # 1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRk # tFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYb # qMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUm # cJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP6 # 5x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzK # QtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo # 80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjB # Jgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXche # MBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB # /wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU # 7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoG # CCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29j # c3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDig # NqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v # dEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZI # hvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd # 4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiC # qBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl # /Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeC # RK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYT # gAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/ # a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37 # xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmL # NriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0 # YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJ # RyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIG # vDCCBKSgAwIBAgIQC65mvFq6f5WHxvnpBOMzBDANBgkqhkiG9w0BAQsFADBjMQsw # CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRp # Z2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENB # MB4XDTI0MDkyNjAwMDAwMFoXDTM1MTEyNTIzNTk1OVowQjELMAkGA1UEBhMCVVMx # ETAPBgNVBAoTCERpZ2lDZXJ0MSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAg # MjAyNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL5qc5/2lSGrljC6 # W23mWaO16P2RHxjEiDtqmeOlwf0KMCBDEr4IxHRGd7+L660x5XltSVhhK64zi9Ce # C9B6lUdXM0s71EOcRe8+CEJp+3R2O8oo76EO7o5tLuslxdr9Qq82aKcpA9O//X6Q # E+AcaU/byaCagLD/GLoUb35SfWHh43rOH3bpLEx7pZ7avVnpUVmPvkxT8c2a2yC0 # WMp8hMu60tZR0ChaV76Nhnj37DEYTX9ReNZ8hIOYe4jl7/r419CvEYVIrH6sN00y # x49boUuumF9i2T8UuKGn9966fR5X6kgXj3o5WHhHVO+NBikDO0mlUh902wS/Eeh8 # F/UFaRp1z5SnROHwSJ+QQRZ1fisD8UTVDSupWJNstVkiqLq+ISTdEjJKGjVfIcsg # A4l9cbk8Smlzddh4EfvFrpVNnes4c16Jidj5XiPVdsn5n10jxmGpxoMc6iPkoaDh # i6JjHd5ibfdp5uzIXp4P0wXkgNs+CO/CacBqU0R4k+8h6gYldp4FCMgrXdKWfM4N # 0u25OEAuEa3JyidxW48jwBqIJqImd93NRxvd1aepSeNeREXAu2xUDEW8aqzFQDYm # r9ZONuc2MhTMizchNULpUEoA6Vva7b1XCB+1rxvbKmLqfY/M/SdV6mwWTyeVy5Z/ # JkvMFpnQy5wR14GJcv6dQ4aEKOX5AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMC # B4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAE # GTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3Mp # dpovdYxqII+eyG8wHQYDVR0OBBYEFJ9XLAN3DigVkGalY17uT5IfdqBbMFoGA1Ud # HwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRy # dXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUF # BwEBBIGDMIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20w # WAYIKwYBBQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2Vy # dFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZI # hvcNAQELBQADggIBAD2tHh92mVvjOIQSR9lDkfYR25tOCB3RKE/P09x7gUsmXqt4 # 0ouRl3lj+8QioVYq3igpwrPvBmZdrlWBb0HvqT00nFSXgmUrDKNSQqGTdpjHsPy+ # LaalTW0qVjvUBhcHzBMutB6HzeledbDCzFzUy34VarPnvIWrqVogK0qM8gJhh/+q # DEAIdO/KkYesLyTVOoJ4eTq7gj9UFAL1UruJKlTnCVaM2UeUUW/8z3fvjxhN6hdT # 98Vr2FYlCS7Mbb4Hv5swO+aAXxWUm3WpByXtgVQxiBlTVYzqfLDbe9PpBKDBfk+r # abTFDZXoUke7zPgtd7/fvWTlCs30VAGEsshJmLbJ6ZbQ/xll/HjO9JbNVekBv2Tg # em+mLptR7yIrpaidRJXrI+UzB6vAlk/8a1u7cIqV0yef4uaZFORNekUgQHTqddms # PCEIYQP7xGxZBIhdmm4bhYsVA6G2WgNFYagLDBzpmk9104WQzYuVNsxyoVLObhx3 # RugaEGru+SojW4dHPoWrUhftNpFC5H7QEY7MhKRyrBe7ucykW7eaCuWBsBb4HOKR # FVDcrZgdwaSIqMDiCLg4D+TPVgKx2EgEdeoHNHT9l3ZDBD+XgbF+23/zBjeCtxz+ # dL/9NWR6P2eZRi7zcEO1xwcdcqJsyz/JceENc2Sg8h3KeFUCS7tpFk7CrDqkMIIG # vzCCBKegAwIBAgIRAIFOQhehKX/tWszUF/iRrXUwDQYJKoZIhvcNAQELBQAwUzEL # MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExKTAnBgNVBAMT # IEdsb2JhbFNpZ24gQ29kZSBTaWduaW5nIFJvb3QgUjQ1MB4XDTI0MDYxOTAzMjUx # MVoXDTM4MDcyODAwMDAwMFowWTELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2Jh # bFNpZ24gbnYtc2ExLzAtBgNVBAMTJkdsb2JhbFNpZ24gR0NDIFI0NSBDb2RlU2ln # bmluZyBDQSAyMDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1kJN # +eNPxiP0bB2BpjD3SD3P0OWN5SAilgdENV0Gzw8dcGDmJlT6UyNgAqhfAgL3jslu # Pal4Bb2O9U8ZJJl8zxEWmx97a9Kje2hld6vYsSw/03IGMlxbrFBnLCVNVgY2/MFi # TH19hhaVml1UulDQsH+iRBnp1m5sPhPCnxHUXzRbUWgxYwr4W9DeullfMa+JaDhA # PgjoU2dOY7Yhju/djYVBVZ4cvDfclaDEcacfG6VJbgogWX6Jo1gVlwAlad/ewmpQ # ZU5T+2uhnxgeig5fVF694FvP8gwE0t4IoRAm97Lzei7CjpbBP86l2vRZKIw3ZaEx # lguOpHZ3FUmEZoIl50MKd1KxmVFC/6Gy3ZzS3BjZwYapQB1Bl2KGvKj/osdjFwb9 # Zno2lAEgiXgfkPR7qVJOak9UBiqAr57HUEL6ZQrjAfSxbqwOqOOBGag4yJ4DKIak # dKdHlX5yWip7FWocxGnmsL5AGZnL0n1VTiKcEOChW8OzLnqLxN7xSx+MKHkwRX9s # E7Y9LP8tSooq7CgPLcrUnJiKSm1aNiwv37rL4kFKCHcYiK01YZQS86Ry6+42nqdR # J5E896IazPyH5ZfhUYdp6SLMg8C3D0VsB+FDT9SMSs7PY7G1pBB6+Q0MKLBrNP4h # aCdv7Pj6JoRbdULNiSZ5WZ1rq2NxYpAlDQgg8f8CAwEAAaOCAYYwggGCMA4GA1Ud # DwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDAzASBgNVHRMBAf8ECDAGAQH/ # AgEAMB0GA1UdDgQWBBTas43AJJCja3fTDKBZ3SFnZHYLeDAfBgNVHSMEGDAWgBQf # AL9GgAr8eDm3pbRD2VZQu86WOzCBkwYIKwYBBQUHAQEEgYYwgYMwOQYIKwYBBQUH # MAGGLWh0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL2NvZGVzaWduaW5ncm9vdHI0 # NTBGBggrBgEFBQcwAoY6aHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9jYWNl # cnQvY29kZXNpZ25pbmdyb290cjQ1LmNydDBBBgNVHR8EOjA4MDagNKAyhjBodHRw # Oi8vY3JsLmdsb2JhbHNpZ24uY29tL2NvZGVzaWduaW5ncm9vdHI0NS5jcmwwLgYD # VR0gBCcwJTAIBgZngQwBBAEwCwYJKwYBBAGgMgEyMAwGCisGAQQBoDIKBAIwDQYJ # KoZIhvcNAQELBQADggIBADIQ5LwXpYMQQJ3Tqf0nz0VyqcUfSzNZbywyMXlxhNY2 # Z9WrdPzU8gY6brXWy/FCg5a9fd6VLBrtauNBHKbIiTHCWWyJvCojA1lQR0n9b1MO # KijMSFTv8yMYW5I2TryjY9TD+wAPgNEgwsrllrrwmluqpCV6Gdv623tTT/m2o9lj # 1XVfAaUo27YYKRRleZzbtOuImBRTUGAxDGazUeNuySkmZPAU0XN4xISNPhSlklmr # eUFG6jTPgXZGOpF4GXO+/gb118GEOaBwTAo1AF7YKjAkHzJ3tuF837NGQeH6bY3j # 4wufL0DZpToNZMm+jNEayWUgOuIA+k56ITdBcJmdUB+Ze3WQdHNNRaVOWH/ddmqQ # WIlmk2Sj/lT3Tarr5SDuddeIsh0MPLyhkqBW5Ef8Zw/qeCnfj6PH2eMxeKcLKZRr # HCddISeH4qPvyECQLlwXKCXTAUQXq4DafJSoWyP8IJ6bkaGQ/7MN5XJELEcV89SR # cib58gXjAWf3abXeBbb+KJCMf6EpO7cs2mQiaZbE9NNXDSqFxrtoaKyL8VJLZG6q # uLfsTRQc+qgUOM7sJevkYt01+bh7B10bQ2cCCGs9vyUjg4GWcwfu/lhaPDfaoNtf # 0pw6RpKcxCYcCTDaJeQOHZBz1B6HTmmEgZHNZX7nNfqDgGrTNB1Gp3gIpngyJWZ6 # MIIG6zCCBNOgAwIBAgIMfDeOzfSMBpXQEWmrMA0GCSqGSIb3DQEBCwUAMFkxCzAJ # BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMS8wLQYDVQQDEyZH # bG9iYWxTaWduIEdDQyBSNDUgQ29kZVNpZ25pbmcgQ0EgMjAyMDAeFw0yNDA5MTkx # MjE3MjJaFw0yNTEwMjcwODE1NTlaMFkxCzAJBgNVBAYTAkZSMREwDwYDVQQIEwhN # b3JiaWhhbjEPMA0GA1UEBxMGVmFubmVzMRIwEAYDVQQKEwlCUklDS0xFQUQxEjAQ # BgNVBAMTCUJSSUNLTEVBRDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB # ANysgL1dmPiIH07tM4uKTz5r2+xZ0EHWijxeWhGiJAb0DvOSfJX08pqkb3Q8MMcm # SgTIggnzr68GzO8oU9JqM8+uHFJUVsAWMptAa8FxaUI0q9/8MdVKOoTkRmyDGBMK # bgDdYf+YVbLeYmsE267LQeOF1koiSmK7WRkytnjwbOZMFr/qObysIL6DnMiM802A # C4dFP1Z6hDKJuAu1mOmSZpqgBQZ4atM2TiOBw2qApZHbbur+bM2fEah2j46TIjTi # QZ/YD7Sznuv2feHDB9h3on8MMWff8POZURkZRFbJRn8EUk/S4+3xRLE2ylNuYIg6 # gFW1QJaaUEU90ay1hLdfFJLF5WMnRyFaTaJwX3cYjP8khR/vbA966bQ4l0lHMbf2 # tLUpeMShi0vr5f1vOqSZ10qR3hzYyYMLSmj/dIHFR3ngprG5QTcjfIwFSdro8Aij # 0HYmN1tQ6HC8rV4yUJ8pDzKayQy5JDIKVYfq9jwaD45KGLUUtrot1lCPI9Zm0Hf6 # lMjGBLpM16MKK8U9E8ZXz5gseqUaMJg4g34vl+gbEObOPdGtbEVicEqip1mSHseR # HrDIOzTNA8IzI9F10csChBOlVfGZZYLZTN2DJQyhYdm6gEFzrNmBE48rH+Fzdcf4 # J1VvRgDrxSAdtpVLqbe5iR996zpfb/50JtGrc3e59YmxAgMBAAGjggGxMIIBrTAO # BgNVHQ8BAf8EBAMCB4AwgZsGCCsGAQUFBwEBBIGOMIGLMEoGCCsGAQUFBzAChj5o # dHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc2djY3I0NWNvZGVz # aWduY2EyMDIwLmNydDA9BggrBgEFBQcwAYYxaHR0cDovL29jc3AuZ2xvYmFsc2ln # bi5jb20vZ3NnY2NyNDVjb2Rlc2lnbmNhMjAyMDBWBgNVHSAETzBNMEEGCSsGAQQB # oDIBMjA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNvbS9y # ZXBvc2l0b3J5LzAIBgZngQwBBAEwCQYDVR0TBAIwADBFBgNVHR8EPjA8MDqgOKA2 # hjRodHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL2dzZ2NjcjQ1Y29kZXNpZ25jYTIw # MjAuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMDMB8GA1UdIwQYMBaAFNqzjcAkkKNr # d9MMoFndIWdkdgt4MB0GA1UdDgQWBBT6laBcJjcU8FGox8y/wQdZCLUf2zANBgkq # hkiG9w0BAQsFAAOCAgEAaJ+rcBMAnoJ+aDWDFOBe363c6HTqXcC5Rf4RIJt/mbzG # NBYDf6S2y+oA1q4mHJ/8TByYTKIvHKCQHFTvN1tl2zsulY7FtaeXC6PICPxXI5Yu # jeYTAO6b9GMjCbxQ/IdJex6KJXuwHViTXP86G6ZwKAfczYXAmqRoC5cmlt+XQy9b # ZNC5+GpKc6qvbVON1h7lWl1Y5Mm9rTvEzWNC06CRwZbhPeeFMRXs2/z9VtunN+S9 # k+uXLR/vaC2ptuZkZjacAK9GjX9Pbw+TJ1dxR8/0wq5eIXQfgEe/Q8ZR3LWUudZB # sRWRIswUBsNjyfTI02B0vuG4tv8kuS+i45mtOPGZ5KZRquIGLjrhsOopmbAFNOh+ # iBLCq1ouWoNqkqOMZq81PN3fYb4rTdKX9OogYQn0AQ4UXFsAChqEC4B1XhXy/TW7 # fRWWxZRA8HXbyvid8n/9XX7p56PFipX/HJDG85PVLg+h8CJmsjrNw6qq0M3949gu # YO79tylNhDEdI6eC5roGS4qReRsjvwYd+xUNM98oSCA8rXjMkLEZufRmJVfJt+Oi # qEst933qbVeUyfN/tqbd1vpxwm1Owm5Dl0ap0GuAo01DEzlm8602Rw+Y7h53dsMM # nQRrK4YLB6L1My2rUikqdtvzx7uUogzLDLAVR5hkpjF5DA6AeXNfpTJFtbyN51kx # ggY/MIIGOwIBATBpMFkxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWdu # IG52LXNhMS8wLQYDVQQDEyZHbG9iYWxTaWduIEdDQyBSNDUgQ29kZVNpZ25pbmcg # Q0EgMjAyMAIMfDeOzfSMBpXQEWmrMA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQB # gjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYK # KwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEICTsfMUw # JhyxaC9AaPE+WaPlokU4DOhKwpjlHNbm5ub3MA0GCSqGSIb3DQEBAQUABIICAJcf # c9V3V3uX2aml+G/DaS+bDb3dFuRh/XdfT8E95d0OoiWP1I0ZrpwNsLdetfpG4wTI # UBYFvpYKIvUbjUOBU2KTrJYw/KyBTX5w+t4FRso+ApFIRIneX7SKYES9YhORu/xE # qHQnz+ct/AxWanDYq92MPSfO7/j47f2eOkDr0jIdtOajjy/ypjij56wAP5xtc8VY # 0Ib/JhRso80ICS8TQpYqY/+KczZn4/GhZznm187ntyP+Et2BZFBJ8IiJ2M9zH7YG # W1MxLAXkXtWIkzjESbIjc219B0NRI0kRW2kDadZSNi1D0Z+TLsJscatSWGqTPEND # pZ/kuH/s6di4a3V770wGFnlpZhuCfMJyHFbHc7sa4i3x4mLBwuUMuN+RPwm+Waur # EPQ/T3UbxdMi1cRi4AcMv7NtIFVIPtSWcL9GV823CAfWueWrVaVOuT2TYHSTGUfe # LYQV0n/cpPSSQopUcAOp7TP6yLJsCc5bDrPxo7tNdWzBBLrV4UV1zINnLulT/NhZ # Xp+j5Y7uG5E+q2qmPpOaJLHYotnA+9rAhkeshP2v0QILbfI42/bdRZrJHGvP635o # 1L5waRCpLWRGNQW67LCIxtIw29H/RTaRBd1bI33JXtm1IwpRvQvEbCdPPXzNiniH # Bog29fbXiZ+KrkhrlZ2mnkulKBdLG0o2GT69BLjkoYIDIDCCAxwGCSqGSIb3DQEJ # BjGCAw0wggMJAgEBMHcwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0 # LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hB # MjU2IFRpbWVTdGFtcGluZyBDQQIQC65mvFq6f5WHxvnpBOMzBDANBglghkgBZQME # AgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8X # DTI0MTAxNjE0MzIxMFowLwYJKoZIhvcNAQkEMSIEIDSV7FJN03BKyNh8284oTCHz # +q+ewaZmb1sLmT1KZoWDMA0GCSqGSIb3DQEBAQUABIICABcFsmYs4jQZuMRlweox # LgWnEg7h8lkiL68+5oCZJKE477696YZQ5vl0m5oB5rdvTaf1nBovT4ckNUmXNRyn # LnwtDOpnBct+/MNyTnsauAfzvdTnZ/VSGExkPJ8M5gstP551nOyytKibgZY4p+Rr # TMC4xmnaruvXVXinBzH/r8ow2qiiG9JkhT++BT4QoHnay0ird2GJNOj2GaERYFQ0 # EpRFDu/w+EDKr1kEFplw0P6Uohks/X/Uqygn5yZhhh1KZ7axZH/zIGQBafprJ0Sj # nuVxFfpxFoL+MTN1BU/IvRcSxGk/iNqVaNaV3HhyqCkARt5JPSIkI34RS5Q0cg9v # uLQvrv5xoFyxTzeMhQh7XRs47ovJADh3O2bI7kNUFMs8z1RH74Zrb1AyBlfCK3ZJ # Cx/zNMKJdUe92PDA6yAZT4sxyM72iB9OZ+sWxD81XcnMnUmpDHdgVQTHzh3jeeb2 # /Wt0895zMP06GnK8buMTN9ShPvYpyddoJnQOWZ0ErynJPdSHkOuDxH5q8zxDoG6V # l4zb6GGp/Szq+cWx4KcJ288J4JpvaoOnpReBNO/N9Ml2enbHu8VULqqPimJJhSZm # WzQJ6Xuad2MlL9jFf+b47v/i2zdBzi50uw9oYewBHBvoG/EeTDdl+StOOv4ibchp # IeojsS2wJqIIgfoBVQPHmpo4 # SIG # End signature block |