Install-BCAppFromRepo.ps1

function Install-BCAppFromRepo {
  <#
   
  .SYNOPSIS
    Creates BC container
  .DESCRIPTION
    Creates BC container
  .PARAMETER serverInstance
    Name of server instance
  .PARAMETER companyName
    Name of the company in the DevOps URL
  .PARAMETER repoName
    Name of the Azure BLOB Container where the app file are stored
  .PARAMETER AppName
    Name of the Dynapro App
  .PARAMETER unPublish
    Unpublish the lower version after publishing and upgrading
  .Parameter ForceSync
    Run the sync function with the Force mode. It can delete data in the app
   
  .EXAMPLE
   
  Install-BCApp -serverInstance $serverInstance -repoName 'Dynapro Base' -AppName 'Dynapro Base' -unPublish
   
  #>

  [CmdletBinding()]
  Param(
    [string] $serverInstance,
    [string] $companyName,
    [string] $repoName,
    [string] $AppName,
    [switch] $unPublish,
    [switch] $ForceSync,
    [string] $AppRootFolder = 'C:\Dynapro\BC'
  )
  PROCESS {
    $AppFolder = Join-Path $AppRootFolder 'apps'
    $ArchiveFolder = Join-Path $AppFolder 'Archive'
    if (!(Test-Path -Path $AppFolder )) {
      Write-Host -ForegroundColor Yellow "Creating folder "  $AppFolder 
      New-Item -ItemType directory -Path $AppFolder
    }
    if (!(Test-Path -Path $ArchiveFolder )) {
      Write-Host -NoNewLine -ForegroundColor Yellow "Creating folder "  $ArchiveFolder 
      New-Item -ItemType directory -Path $ArchiveFolder
    }
    $source = "https://$companyName.blob.core.windows.net/$repoName/latest/apps.zip"
    write-Host -ForegroundColor Yellow "Downloading file from URL " $source 
    $destination = Join-Path $AppFolder ($repoName + '_latest.zip') 
    if ([System.IO.File]::Exists($destination)) {
      write-Host ForegroundColor Yellow "Move file from URL " $destination " to " $ArchiveFolder
      Get-ChildItem -Path $destination | Move-Item -Destination $ArchiveFolder -Force
    }
    try { 
      $webClient = [System.Net.WebClient]::new()
      $webClient.DownloadFile($source, $destination)
    }
    catch [Exception] {
      "Install-BCApp DownloadFile:`n`n " + $_.Exception
    }
    Expand-Archive -Path $destination -DestinationPath $AppRootFolder -Force
    $NewestAppFileName = 'Dynapro AS_' + $AppName + '_*.app'
    $AppFileName = Join-Path -Path $AppFolder -ChildPath $NewestAppFileName -Resolve | Sort-Object Name -Descending | Select-Object -First 1
    if ([System.IO.File]::Exists($AppFileName)) {
      Publish-NAVApp -ServerInstance $ServerInstance -SkipVerification -Path $AppFileName 
      $AppsInfo = @()
      $AppsInfo += Get-NAVAppInfo -ServerInstance $ServerInstance | Where-Object { ($_.Name -like $AppName) } 
      if ($AppsInfo.Count -gt 1) {
        $ToVersion = [version]$AppsInfo[0].Version
        $FromVersion = @()
        foreach ($AppInfo in $AppsInfo) {
          if ([version]$AppInfo.Version -gt [version]$ToVersion) {
            $FromVersion += [version]$ToVersion
            $ToVersion = [version]$AppInfo.Version
          }
          else {
            if ([version]$AppInfo.Version -lt [version]$ToVersion) {
              $FromVersion += [version]$AppInfo.Version
            }
          }
        }
        Write-Host -NoNewLine -ForegroundColor Yellow "Upgrading "  $AppName 
        Write-Host -NoNewLine -ForegroundColor Yellow "Upgrading From Version "  $FromVersion
        Write-Host -NoNewLine -ForegroundColor Yellow "Upgrading To Version "  $ToVersion
        try { 
          if ($ForceSync) {
            Sync-NavApp -ServerInstance $ServerInstance -Name $AppName -Version $ToVersion -Mode ForceSync
          }
          else {
            Sync-NavApp -ServerInstance $ServerInstance -Name $AppName -Version $ToVersion
          }
          try { 
            Start-NAVAppDataUpgrade -ServerInstance $ServerInstance -Name $AppName -Version $ToVersion
          }
          catch [Exception] {
            "Install-BCApp Start-NAVAppDataUpgrade:`n`n " + $_.Exception
          }
        }
        catch [Exception] {
          "Install-BCApp failed with error:`n`n " + $_.Exception
        }
        try { 
          if ($Unpublish) {
            if ($FromVersion.Count -ge 1) {
              foreach ($Version in $FromVersion) {
                Unpublish-NavApp -ServerInstance $ServerInstance -Name $AppName -Version $Version
              }
            }
          }
        }
        catch [Exception] {
          "Install-BCApp Unpublish-NavApp:`n`n " + $_.Exception
        }
        if ([System.IO.File]::Exists($AppFileName)) {
          write-Host "Move file from " $AppFileName" to " $ArchiveFolder
          Get-ChildItem -Path $AppFileName | Move-Item -Destination $ArchiveFolder -Force
        }
        if ([System.IO.File]::Exists($destination)) {
          write-Host "Move file from " $destination" to " $ArchiveFolder
          Get-ChildItem -Path $destination | Move-Item -Destination $ArchiveFolder -Force
        }
        write-Host  $AppName "is upraded to version " $ToVersion
      }
      else {
        Write-Host $AppName $AppsInfo[0].Version "is already installed"
      }
    }
    else {
      Write-Host "app file is missing"
    }
  }
}
Export-ModuleMember -Function Install-BCAppFromRepo
# SIG # Begin signature block
# MIIx7gYJKoZIhvcNAQcCoIIx3zCCMdsCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCU9aCtV6odYOR6
# 3z4hroi4xgprtzAQ47MjNT4kUb97LKCCFrwwggNfMIICR6ADAgECAgsEAAAAAAEh
# WFMIojANBgkqhkiG9w0BAQsFADBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3Qg
# Q0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
# bjAeFw0wOTAzMTgxMDAwMDBaFw0yOTAzMTgxMDAwMDBaMEwxIDAeBgNVBAsTF0ds
# b2JhbFNpZ24gUm9vdCBDQSAtIFIzMRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYD
# VQQDEwpHbG9iYWxTaWduMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
# zCV2kHkGeCIW9cCDtoTKKJ79BXYRxa2IcvxGAkPHsoqdBF8kyy5L4WCCRuFSqwyB
# R3Bs3WTR6/Usow+CPQwrrpfXthSGEHm7OxOAd4wI4UnSamIvH176lmjfiSeVOJ8G
# 1z7JyyZZDXPesMjpJg6DFcbvW4vSBGDKSaYo9mk79svIKJHlnYphVzesdBTcdOA6
# 7nIvLpz70Lu/9T0A4QYz6IIrrlOmOhZzjN1BDiA6wLSnoemyT5AuMmDpV8u5BJJo
# aOU4JmB1sp93/5EU764gSfytQBVI0QIxYRleuJfvrXe3ZJp6v1/BE++bYvsNbOBU
# aRapA9pu6YOTcXbGaYWCFwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T
# AQH/BAUwAwEB/zAdBgNVHQ4EFgQUj/BLf6guRSSuTVD6Y5qL3uLdG7wwDQYJKoZI
# hvcNAQELBQADggEBAEtA28BQqv7IDO/3llRFSbuWAAlBrLMThoYoBzPKa+Z0uboA
# La6kCtP18fEPir9zZ0qDx0R7eOCvbmxvAymOMzlFw47kuVdsqvwSluxTxi3kJGy5
# lGP73FNoZ1Y+g7jPNSHDyWj+ztrCU6rMkIrp8F1GjJXdelgoGi8d3s0AN0GP7URt
# 11Mol37zZwQeFdeKlrTT3kwnpEwbc3N29BeZwh96DuMtCK0KHCz/PKtVDg+Rfjbr
# w1dJvuEuLXxgi8NBURMjnc73MmuUAaiZ5ywzHzo7JdKGQM47LIZ4yWEvFLru21Vv
# 34TuBQlNvSjYcs7TYlBlHuuSl4Mx2bO1ykdYP18wggWiMIIEiqADAgECAhB4AxhC
# RXCKQc9vAbjutKlUMA0GCSqGSIb3DQEBDAUAMEwxIDAeBgNVBAsTF0dsb2JhbFNp
# Z24gUm9vdCBDQSAtIFIzMRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpH
# bG9iYWxTaWduMB4XDTIwMDcyODAwMDAwMFoXDTI5MDMxODAwMDAwMFowUzELMAkG
# A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExKTAnBgNVBAMTIEds
# b2JhbFNpZ24gQ29kZSBTaWduaW5nIFJvb3QgUjQ1MIICIjANBgkqhkiG9w0BAQEF
# AAOCAg8AMIICCgKCAgEAti3FMN166KuQPQNysDpLmRZhsuX/pWcdNxzlfuyTg6qE
# 9aNDm5hFirhjV12bAIgEJen4aJJLgthLyUoD86h/ao+KYSe9oUTQ/fU/IsKjT5GN
# swWyKIKRXftZiAULlwbCmPgspzMk7lA6QczwoLB7HU3SqFg4lunf+RuRu4sQLNLH
# Qx2iCXShgK975jMKDFlrjrz0q1qXe3+uVfuE8ID+hEzX4rq9xHWhb71hEHREspgH
# 4nSr/2jcbCY+6R/l4ASHrTDTDI0DfFW4FnBcJHggJetnZ4iruk40mGtwEd44ytS+
# ocCc4d8eAgHYO+FnQ4S2z/x0ty+Eo7+6CTc9Z2yxRVwZYatBg/WsHet3DUZHc86/
# vZWV7Z0riBD++ljop1fhs8+oWukHJZsSxJ6Acj2T3IyU3ztE5iaA/NLDA/CMDNJF
# 1i7nj5ie5gTuQm5nfkIWcWLnBPlgxmShtpyBIU4rxm1olIbGmXRzZzF6kfLUjHlu
# fKa7fkZvTcWFEivPmiJECKiFN84HYVcGFxIkwMQxc6GYNVdHfhA6RdktpFGQmKmg
# BzfEZRqqHGsWd/enl+w/GTCZbzH76kCy59LE+snQ8FB2dFn6jW0XMr746X4D9OeH
# dZrUSpEshQMTAitCgPKJajbPyEygzp74y42tFqfT3tWbGKfGkjrxgmPxLg4kZN8C
# AwEAAaOCAXcwggFzMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcD
# AzAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQfAL9GgAr8eDm3pbRD2VZQu86W
# OzAfBgNVHSMEGDAWgBSP8Et/qC5FJK5NUPpjmove4t0bvDB6BggrBgEFBQcBAQRu
# MGwwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vY3NwLmdsb2JhbHNpZ24uY29tL3Jvb3Ry
# MzA7BggrBgEFBQcwAoYvaHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9jYWNl
# cnQvcm9vdC1yMy5jcnQwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
# YWxzaWduLmNvbS9yb290LXIzLmNybDBHBgNVHSAEQDA+MDwGBFUdIAAwNDAyBggr
# BgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8w
# DQYJKoZIhvcNAQEMBQADggEBAKz3zBWLMHmoHQsoiBkJ1xx//oa9e1ozbg1nDnti
# 2eEYXLC9E10dI645UHY3qkT9XwEjWYZWTMytvGQTFDCkIKjgP+icctx+89gMI7qo
# Lao89uyfhzEHZfU5p1GCdeHyL5f20eFlloNk/qEdUfu1JJv10ndpvIUsXPpYd9Gu
# p7EL4tZ3u6m0NEqpbz308w2VXeb5ekWwJRcxLtv3D2jmgx+p9+XUnZiM02FLL8Mo
# fnrekw60faAKbZLEtGY/fadY7qz37MMIAas4/AocqcWXsojICQIZ9lyaGvFNbDDU
# swarAGBIDXirzxetkpNiIHd1bL3IMrTcTevZ38GQlim9wX8wgga/MIIEp6ADAgEC
# AhEAgU5CF6Epf+1azNQX+JGtdTANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJC
# RTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEpMCcGA1UEAxMgR2xvYmFsU2ln
# biBDb2RlIFNpZ25pbmcgUm9vdCBSNDUwHhcNMjQwNjE5MDMyNTExWhcNMzgwNzI4
# MDAwMDAwWjBZMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1z
# YTEvMC0GA1UEAxMmR2xvYmFsU2lnbiBHQ0MgUjQ1IENvZGVTaWduaW5nIENBIDIw
# MjAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDWQk3540/GI/RsHYGm
# MPdIPc/Q5Y3lICKWB0Q1XQbPDx1wYOYmVPpTI2ACqF8CAveOyW49qXgFvY71Txkk
# mXzPERabH3tr0qN7aGV3q9ixLD/TcgYyXFusUGcsJU1WBjb8wWJMfX2GFpWaXVS6
# UNCwf6JEGenWbmw+E8KfEdRfNFtRaDFjCvhb0N66WV8xr4loOEA+COhTZ05jtiGO
# 792NhUFVnhy8N9yVoMRxpx8bpUluCiBZfomjWBWXACVp397CalBlTlP7a6GfGB6K
# Dl9UXr3gW8/yDATS3gihECb3svN6LsKOlsE/zqXa9FkojDdloTGWC46kdncVSYRm
# giXnQwp3UrGZUUL/obLdnNLcGNnBhqlAHUGXYoa8qP+ix2MXBv1mejaUASCJeB+Q
# 9HupUk5qT1QGKoCvnsdQQvplCuMB9LFurA6o44EZqDjIngMohqR0p0eVfnJaKnsV
# ahzEaeawvkAZmcvSfVVOIpwQ4KFbw7MueovE3vFLH4woeTBFf2wTtj0s/y1Kiirs
# KA8tytScmIpKbVo2LC/fusviQUoIdxiIrTVhlBLzpHLr7jaep1EnkTz3ohrM/Ifl
# l+FRh2npIsyDwLcPRWwH4UNP1IxKzs9jsbWkEHr5DQwosGs0/iFoJ2/s+PomhFt1
# Qs2JJnlZnWurY3FikCUNCCDx/wIDAQABo4IBhjCCAYIwDgYDVR0PAQH/BAQDAgGG
# MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0O
# BBYEFNqzjcAkkKNrd9MMoFndIWdkdgt4MB8GA1UdIwQYMBaAFB8Av0aACvx4Obel
# tEPZVlC7zpY7MIGTBggrBgEFBQcBAQSBhjCBgzA5BggrBgEFBQcwAYYtaHR0cDov
# L29jc3AuZ2xvYmFsc2lnbi5jb20vY29kZXNpZ25pbmdyb290cjQ1MEYGCCsGAQUF
# BzAChjpodHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9jb2Rlc2ln
# bmluZ3Jvb3RyNDUuY3J0MEEGA1UdHwQ6MDgwNqA0oDKGMGh0dHA6Ly9jcmwuZ2xv
# YmFsc2lnbi5jb20vY29kZXNpZ25pbmdyb290cjQ1LmNybDAuBgNVHSAEJzAlMAgG
# BmeBDAEEATALBgkrBgEEAaAyATIwDAYKKwYBBAGgMgoEAjANBgkqhkiG9w0BAQsF
# AAOCAgEAMhDkvBelgxBAndOp/SfPRXKpxR9LM1lvLDIxeXGE1jZn1at0/NTyBjpu
# tdbL8UKDlr193pUsGu1q40EcpsiJMcJZbIm8KiMDWVBHSf1vUw4qKMxIVO/zIxhb
# kjZOvKNj1MP7AA+A0SDCyuWWuvCaW6qkJXoZ2/rbe1NP+baj2WPVdV8BpSjbthgp
# FGV5nNu064iYFFNQYDEMZrNR427JKSZk8BTRc3jEhI0+FKWSWat5QUbqNM+BdkY6
# kXgZc77+BvXXwYQ5oHBMCjUAXtgqMCQfMne24Xzfs0ZB4fptjePjC58vQNmlOg1k
# yb6M0RrJZSA64gD6TnohN0FwmZ1QH5l7dZB0c01FpU5Yf912apBYiWaTZKP+VPdN
# quvlIO5114iyHQw8vKGSoFbkR/xnD+p4Kd+Po8fZ4zF4pwsplGscJ10hJ4fio+/I
# QJAuXBcoJdMBRBergNp8lKhbI/wgnpuRoZD/sw3lckQsRxXz1JFyJvnyBeMBZ/dp
# td4Ftv4okIx/oSk7tyzaZCJplsT001cNKoXGu2horIvxUktkbqq4t+xNFBz6qBQ4
# zuwl6+Ri3TX5uHsHXRtDZwIIaz2/JSODgZZzB+7+WFo8N9qg21/SnDpGkpzEJhwJ
# MNol5A4dkHPUHodOaYSBkc1lfuc1+oOAatM0HUaneAimeDIlZnowggbsMIIE1KAD
# AgECAgw2nw7cp6+OSBEHtLQwDQYJKoZIhvcNAQELBQAwWTELMAkGA1UEBhMCQkUx
# GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExLzAtBgNVBAMTJkdsb2JhbFNpZ24g
# R0NDIFI0NSBDb2RlU2lnbmluZyBDQSAyMDIwMB4XDTI0MDgyNzEzNDcyOVoXDTI3
# MDgyODEzNDcyOVowWjELMAkGA1UEBhMCTk8xETAPBgNVBAgTCEFrZXJzaHVzMQ4w
# DAYDVQQHEwVBc2tlcjETMBEGA1UEChMKRFlOQVBSTyBBUzETMBEGA1UEAxMKRFlO
# QVBSTyBBUzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKoaZQGUHy7H
# bm2tnE2xVpmHgZTH9MOW+8hR1J74U1/g89Av+fjRijGi+H9pwJd1fuPkoZRrCTrI
# yGai6d7HJHciyPZEqWbc2uhDTOM7tY938fZVUSdLHw///Chq6c6xp1K+AvbKwfCt
# sOQXjnSEb/Hncx+hGJYyoLgMmJ6/hPSwsXfkIRf0+gg2r1Z/y1ulasXVjog/GSv7
# TrvmfK+9o5DTD/Wd4TdLNV+nQmDEcYHPHODYXnYVlCJ7F3BMDcluzcwC2kL6udnQ
# hybp5cN5JGmuwtGackrI+rb6HP0bQ63tZm7+z5DWv92QXidEaTH8zogwRc9yAirG
# AdUzIEk6PPx/+ZdR7+EVa3vQLHjH4owtjjCyONt6JKyJ3mpiY48RkJ/xyQDw9vNu
# hMx0I+4kER0/qOU0BN0KkdErQvox8kU20mGFoKZdNFBz0YNlhbaiQAwxv/HWNYXC
# EynPdRX4q4NAfpsM3yJIRyEgAf5vTRMVONPmRtosY2l7v3lCRbJ+IRlz0zmV4hSw
# Wa+0O+5EyapmcsPCy90ia9hNPTiLziniViN0qSCtAbFFUROpipKGN+IMQA7RJ6UL
# TEfFcphPELxaSruxN3EHxTeu59TafVdRucrIyFjvdwyTThqe+/SJC7cxzZPrJWUD
# IVHksJpDKBm1OUAOzv2SGTa37twSHGrHAgMBAAGjggGxMIIBrTAOBgNVHQ8BAf8E
# BAMCB4AwgZsGCCsGAQUFBwEBBIGOMIGLMEoGCCsGAQUFBzAChj5odHRwOi8vc2Vj
# dXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc2djY3I0NWNvZGVzaWduY2EyMDIw
# LmNydDA9BggrBgEFBQcwAYYxaHR0cDovL29jc3AuZ2xvYmFsc2lnbi5jb20vZ3Nn
# Y2NyNDVjb2Rlc2lnbmNhMjAyMDBWBgNVHSAETzBNMEEGCSsGAQQBoDIBMjA0MDIG
# CCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5
# LzAIBgZngQwBBAEwCQYDVR0TBAIwADBFBgNVHR8EPjA8MDqgOKA2hjRodHRwOi8v
# Y3JsLmdsb2JhbHNpZ24uY29tL2dzZ2NjcjQ1Y29kZXNpZ25jYTIwMjAuY3JsMBMG
# A1UdJQQMMAoGCCsGAQUFBwMDMB8GA1UdIwQYMBaAFNqzjcAkkKNrd9MMoFndIWdk
# dgt4MB0GA1UdDgQWBBTZQpJHpM67VSenVd2tOVfaZsvwZDANBgkqhkiG9w0BAQsF
# AAOCAgEAYPMNPx2sFGEHEOUnPkR0gHNXTb32ClH2wa5w5Mo2L0SWeYwfIiP3kC/C
# P1riV9c8IWit5plVsqsivR3FybBSvX7Jz4xrTSPZmAXimbecgrxYaKxG/lNESB2q
# 8mngyjdJVq2HUJLlhlZFi/aewJkwsRb3cLPn85NTW8tu5QnF2ftFlbeiBLtIzy7d
# cnQbdjq1y8teL6jV1388IcVZATdg5KkKECyqqwKMNvuv94xjT0Dk85ib+3poMDVB
# YrnsPEhv7QetogYA4QStrgH+M2FBlRO4vRnKz/j/HSHPxqzWvA3Ev6LdJOrZfof6
# jGALFcPlkbdzaBUYPSRa8hLEZElMU6cMihiREfsAwCNbWWx6Fousjj5Nz8rNLnvx
# rrdE28LCYOO1FSSSKSroT+McsI6rMJx07dGwKOSqLda0nsE912Fogkc0PLLtzfWR
# WLWF7+m5clPZgZEFrkq+91tDNf6GPCy5ea7ay97cBvrjjMz8aZZYNh6zVN/aegSz
# Cxrd/FRpGROPteaKmUvr8cqbkhp2BIgIMMt6gjKpDrA4xb5wTCZdNwAzBusaci9P
# OdVo7U6iHJibW+zX5BzI6axfNPUbB4aIHC8YtaKbFuIVO9IRqhRs2tqAMuwy1JR2
# lp7BViciCUbSiPsQMDoXwMSd6cWjYVjhh1TtzGgdxiyB78o9smcxghqIMIIahAIB
# ATBpMFkxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMS8w
# LQYDVQQDEyZHbG9iYWxTaWduIEdDQyBSNDUgQ29kZVNpZ25pbmcgQ0EgMjAyMAIM
# Np8O3KevjkgRB7S0MA0GCWCGSAFlAwQCAQUAoIGSMBkGCSqGSIb3DQEJAzEMBgor
# BgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCYGCisGAQQB
# gjcCAQwxGDAWoAKAAKEQgA53d3cuZHluYXByby5ubzAvBgkqhkiG9w0BCQQxIgQg
# j6HGdHBpqx8IJZI3YHyFG7G/ZNiVZcsKCNhISpkx4zEwDQYJKoZIhvcNAQEBBQAE
# ggIAFXnCUs4eHDABFVrUWGs/l/tl0i5DN1w5XfkSDy2xt6WgkrUpAR28uQW15D7x
# E2nz7l5Ezop0qKiVkG00N4Ob4HVptDw/Nwu9jeM0EKBYjaJ8j4PchpBH+hQUxkcB
# fvxqoQ2NRMYdIm6AhIcRX2CGKANRsBbDQqG4Q8Of2Qo9R6UPNF8Qs2Db/dIjbNZP
# vYqDBOAN4hDYvsatu9FcSlcOd8XlnGOMq6aV2DKKC47ErmDbcgB/zjkCsecUYU5x
# l3EwpPALQjLGOFyA2OFNDE+/PDnx3N6F0lm4VQCvxRMRKANiOWMY03CHCHe+Xnw1
# vjV9F8UGbq/LJe9KkA0npkL6yfNuEA3R8nG1BYH3Q8n/btIFtnmbmizNNu94k1al
# Sc95cIm8mt3m3VfwO1HmkQyZMxYXzaTv1ZFcfaxq2FaKD9TiA/tVycQLFuN+zX3l
# KwHNtEyInqq3CSnCtoYvctXBzw3fLn036u3wSG82a7sVeTlTiuCfs6F+3hhPQGh0
# rfK1F97tmN0sJaW+JhPicGeFkqKdZP3q4quWxpHqC4YyHBWLC3wzuBc8qfuEaguh
# ZmTbZ9AGjzlP98sIQCOqF6aheXT19zqvzONjcAVjCLe8e/fE9htL4M+TGG4o9ocS
# gay1KjPaKaDO6ccheZ3qLObdZTmEjgSk1oAoQRrF2GOukkqhghdbMIIXVwYKKwYB
# BAGCNwMDATGCF0cwghdDBgkqhkiG9w0BBwKgghc0MIIXMAIBAzEPMA0GCWCGSAFl
# AwQCAgUAMIGIBgsqhkiG9w0BCRABBKB5BHcwdQIBAQYJYIZIAYb9bAcBMEEwDQYJ
# YIZIAWUDBAICBQAEMLt2wDPSlmNbVR10F9REJ9P/RxjuLHi7m80xiTy1FEijEmjW
# 46gikkiYlKUlnis2GgIRAM33ljp8E/3QDeVl9kZ8ozEYDzIwMjUwMTAyMTExNDE4
# WqCCEwMwgga8MIIEpKADAgECAhALrma8Wrp/lYfG+ekE4zMEMA0GCSqGSIb3DQEB
# CwUAMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkG
# A1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3Rh
# bXBpbmcgQ0EwHhcNMjQwOTI2MDAwMDAwWhcNMzUxMTI1MjM1OTU5WjBCMQswCQYD
# VQQGEwJVUzERMA8GA1UEChMIRGlnaUNlcnQxIDAeBgNVBAMTF0RpZ2lDZXJ0IFRp
# bWVzdGFtcCAyMDI0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvmpz
# n/aVIauWMLpbbeZZo7Xo/ZEfGMSIO2qZ46XB/QowIEMSvgjEdEZ3v4vrrTHleW1J
# WGErrjOL0J4L0HqVR1czSzvUQ5xF7z4IQmn7dHY7yijvoQ7ujm0u6yXF2v1CrzZo
# pykD07/9fpAT4BxpT9vJoJqAsP8YuhRvflJ9YeHjes4fduksTHulntq9WelRWY++
# TFPxzZrbILRYynyEy7rS1lHQKFpXvo2GePfsMRhNf1F41nyEg5h7iOXv+vjX0K8R
# hUisfqw3TTLHj1uhS66YX2LZPxS4oaf33rp9HlfqSBePejlYeEdU740GKQM7SaVS
# H3TbBL8R6HwX9QVpGnXPlKdE4fBIn5BBFnV+KwPxRNUNK6lYk2y1WSKour4hJN0S
# MkoaNV8hyyADiX1xuTxKaXN12HgR+8WulU2d6zhzXomJ2PleI9V2yfmfXSPGYanG
# gxzqI+ShoOGLomMd3mJt92nm7Mheng/TBeSA2z4I78JpwGpTRHiT7yHqBiV2ngUI
# yCtd0pZ8zg3S7bk4QC4RrcnKJ3FbjyPAGogmoiZ33c1HG93Vp6lJ415ERcC7bFQM
# RbxqrMVANiav1k425zYyFMyLNyE1QulQSgDpW9rtvVcIH7WvG9sqYup9j8z9J1Xq
# bBZPJ5XLln8mS8wWmdDLnBHXgYly/p1DhoQo5fkCAwEAAaOCAYswggGHMA4GA1Ud
# DwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMI
# MCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATAfBgNVHSMEGDAWgBS6
# FtltTYUvcyl2mi91jGogj57IbzAdBgNVHQ4EFgQUn1csA3cOKBWQZqVjXu5Pkh92
# oFswWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0Rp
# Z2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNybDCB
# kAYIKwYBBQUHAQEEgYMwgYAwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj
# ZXJ0LmNvbTBYBggrBgEFBQcwAoZMaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t
# L0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNy
# dDANBgkqhkiG9w0BAQsFAAOCAgEAPa0eH3aZW+M4hBJH2UOR9hHbm04IHdEoT8/T
# 3HuBSyZeq3jSi5GXeWP7xCKhVireKCnCs+8GZl2uVYFvQe+pPTScVJeCZSsMo1JC
# oZN2mMew/L4tpqVNbSpWO9QGFwfMEy60HofN6V51sMLMXNTLfhVqs+e8haupWiAr
# SozyAmGH/6oMQAh078qRh6wvJNU6gnh5OruCP1QUAvVSu4kqVOcJVozZR5RRb/zP
# d++PGE3qF1P3xWvYViUJLsxtvge/mzA75oBfFZSbdakHJe2BVDGIGVNVjOp8sNt7
# 0+kEoMF+T6tptMUNlehSR7vM+C13v9+9ZOUKzfRUAYSyyEmYtsnpltD/GWX8eM70
# ls1V6QG/ZOB6b6Yum1HvIiulqJ1Elesj5TMHq8CWT/xrW7twipXTJ5/i5pkU5E16
# RSBAdOp12aw8IQhhA/vEbFkEiF2abhuFixUDobZaA0VhqAsMHOmaT3XThZDNi5U2
# zHKhUs5uHHdG6BoQau75KiNbh0c+hatSF+02kULkftARjsyEpHKsF7u5zKRbt5oK
# 5YGwFvgc4pEVUNytmB3BpIiowOIIuDgP5M9WArHYSAR16gc0dP2XdkMEP5eBsX7b
# f/MGN4K3HP50v/01ZHo/Z5lGLvNwQ7XHBx1yomzLP8lx4Q1zZKDyHcp4VQJLu2kW
# TsKsOqQwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEB
# CwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNV
# BAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQg
# Um9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNV
# BAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNl
# cnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIi
# MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3
# qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOW
# bfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt
# 69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3
# YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECn
# wHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUmcJgmf6Aa
# RyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTy
# UpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8U
# NM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCON
# WPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBAS
# A31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp61
# 03a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAd
# BgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJx
# XWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF
# BwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln
# aWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJo
# dHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNy
# bDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQEL
# BQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CK
# Daopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbP
# FXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaH
# bJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxur
# JB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/N
# h4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNB
# zU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37xJV77Qpf
# MzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1Oby
# F5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B
# 2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqk
# hQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIFjTCCBHWg
# AwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG
# EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
# cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcN
# MjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEVMBMG
# A1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
# HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEB
# AQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp
# pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+
# n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYykt
# zuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw
# 2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6Qu
# BX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC
# 5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK
# 3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3
# IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEP
# lAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98
# THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3l
# GwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7NfjgtJx
# XWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8w
# DgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0
# cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0
# cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MEUGA1Ud
# HwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFz
# c3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRVHSAAMA0GCSqGSIb3DQEB
# DAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyhhyzshV6pGrsi+IcaaVQi
# 7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO0Cre+i1Wz/n096wwepqL
# sl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo8L8vC6bp8jQ87PcDx4eo
# 0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++hUD38dglohJ9vytsgjTVg
# HAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5xaiNrIv8SuFQtJ37YOtnw
# toeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMYIDhjCCA4ICAQEwdzBjMQswCQYDVQQG
# EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0
# IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBAhALrma8
# Wrp/lYfG+ekE4zMEMA0GCWCGSAFlAwQCAgUAoIHhMBoGCSqGSIb3DQEJAzENBgsq
# hkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjUwMTAyMTExNDE4WjArBgsqhkiG
# 9w0BCRACDDEcMBowGDAWBBTb04XuYtvSPnvk9nFIUIck1YZbRTA3BgsqhkiG9w0B
# CRACLzEoMCYwJDAiBCB2dp+o8mMvH0MLOiMwrtZWdf7Xc9sF1mW5BZOYQ4+a2zA/
# BgkqhkiG9w0BCQQxMgQwR//Oi6/4j6XlmWd4EIG9VdB9CMdAAJXtxXjSbUc0Pay8
# OaKj10g3hNxHugBl5UxkMA0GCSqGSIb3DQEBAQUABIICALWFR+NNd6tGlpuByAFS
# lOvkKls4dSQ3Wc36lFUR4Z+/DcPLt4mwvojR6L/cQwTv1jgHBga6FdtcV9UDY6F3
# pcYaZrDy9HJvg57cq37nRO7l3sQNgTFcNbQzGNcAjxMOyXftrZS8w7JrSj7TnI+3
# z8qcCEtvASFdMsMglPWaacAapie91lOUrxk6wOOLsD7GZgatPkdNJQYewtwJBv06
# XrRvhADzAZDbqREHDZs3knBGPiSn6pxqNjnIOy/uhy+1Zi8MTtNsSUVT0RW+7vqq
# s9pTdcLS9qjnGMkM/wfHFgrLLZu3aV/8jVrOnNfr6ZW1CRvqt3nRjB/pNYEQfYaW
# mj3HFKGEkxFK+0hD1c+NAgp86s2SXHAFdSwWxMeUGQdy9OrVIepRBkxEEC9NEjvi
# IDKBDDyFalFKz4jEAagK77vGD6mkw2prw2/T/24aloxwptvmMzBHMzKpqMqlkryP
# oEVEudtxquOSatLAW1bYgFY9si0wAdbNrL03aUY/naqQcKpaYfXTaCfQdjY5ekGO
# 9RlwvRyYxTci+sHUa27tzGof16MDuP7K11G44Os1UABTNto7s2m6VqQYePlhp/Sq
# iQBY7m2tTI0FF3epHefoTmlhYsFjKBhSSxvbnIXsuXS17IRQwjolIpV9ak44qtqi
# waKJnSNvQ14CLx+jYHRQVXi5
# SIG # End signature block