diff --git a/AppPackages/KiwixWebApp_0.9.989.0_AnyCPU_bundle.appxupload b/AppPackages/KiwixWebApp_0.9.989.0_AnyCPU_bundle.appxupload new file mode 100644 index 00000000..2ea711d6 Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_AnyCPU_bundle.appxupload differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.ps1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.ps1 new file mode 100644 index 00000000..2b980873 --- /dev/null +++ b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.ps1 @@ -0,0 +1,754 @@ +# +# Add-AppxDevPackage.ps1 is a PowerShell script designed to install app +# packages created by Visual Studio for developers. To run this script from +# Explorer, right-click on its icon and choose "Run with PowerShell". +# +# Visual Studio supplies this script in the folder generated with its +# "Prepare Package" command. The same folder will also contain the app +# package (a .appx file), the signing certificate (a .cer file), and a +# "Dependencies" subfolder containing all the framework packages used by the +# app. +# +# This script simplifies installing these packages by automating the +# following functions: +# 1. Find the app package and signing certificate in the script directory +# 2. Prompt the user to acquire a developer license and to install the +# certificate if necessary +# 3. Find dependency packages that are applicable to the operating system's +# CPU architecture +# 4. Install the package along with all applicable dependencies +# +# All command line parameters are reserved for use internally by the script. +# Users should launch this script from Explorer. +# + +# .Link +# http://go.microsoft.com/fwlink/?LinkId=243053 + +param( + [switch]$Force = $false, + [switch]$GetDeveloperLicense = $false, + [string]$CertificatePath = $null +) + +$ErrorActionPreference = "Stop" + +# The language resources for this script are placed in the +# "Add-AppDevPackage.resources" subfolder alongside the script. Since the +# current working directory might not be the directory that contains the +# script, we need to create the full path of the resources directory to +# pass into Import-LocalizedData +$ScriptPath = $null +try +{ + $ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path + $ScriptDir = Split-Path -Parent $ScriptPath +} +catch {} + +if (!$ScriptPath) +{ + PrintMessageAndExit $UiStrings.ErrorNoScriptPath $ErrorCodes.NoScriptPath +} + +$LocalizedResourcePath = Join-Path $ScriptDir "Add-AppDevPackage.resources" +Import-LocalizedData -BindingVariable UiStrings -BaseDirectory $LocalizedResourcePath + +$ErrorCodes = Data { + ConvertFrom-StringData @' + Success = 0 + NoScriptPath = 1 + NoPackageFound = 2 + ManyPackagesFound = 3 + NoCertificateFound = 4 + ManyCertificatesFound = 5 + BadCertificate = 6 + PackageUnsigned = 7 + CertificateMismatch = 8 + ForceElevate = 9 + LaunchAdminFailed = 10 + GetDeveloperLicenseFailed = 11 + InstallCertificateFailed = 12 + AddPackageFailed = 13 + ForceDeveloperLicense = 14 + CertUtilInstallFailed = 17 + CertIsCA = 18 + BannedEKU = 19 + NoBasicConstraints = 20 + NoCodeSigningEku = 21 + InstallCertificateCancelled = 22 + BannedKeyUsage = 23 + ExpiredCertificate = 24 +'@ +} + +function PrintMessageAndExit($ErrorMessage, $ReturnCode) +{ + Write-Host $ErrorMessage + if (!$Force) + { + Pause + } + exit $ReturnCode +} + +# +# Warns the user about installing certificates, and presents a Yes/No prompt +# to confirm the action. The default is set to No. +# +function ConfirmCertificateInstall +{ + $Answer = $host.UI.PromptForChoice( + "", + $UiStrings.WarningInstallCert, + [System.Management.Automation.Host.ChoiceDescription[]]@($UiStrings.PromptYesString, $UiStrings.PromptNoString), + 1) + + return $Answer -eq 0 +} + +# +# Validates whether a file is a valid certificate using CertUtil. +# This needs to be done before calling Get-PfxCertificate on the file, otherwise +# the user will get a cryptic "Password: " prompt for invalid certs. +# +function ValidateCertificateFormat($FilePath) +{ + # certutil -verify prints a lot of text that we don't need, so it's redirected to $null here + certutil.exe -verify $FilePath > $null + if ($LastExitCode -lt 0) + { + PrintMessageAndExit ($UiStrings.ErrorBadCertificate -f $FilePath, $LastExitCode) $ErrorCodes.BadCertificate + } + + # Check if certificate is expired + $cert = Get-PfxCertificate $FilePath + if (($cert.NotBefore -gt (Get-Date)) -or ($cert.NotAfter -lt (Get-Date))) + { + PrintMessageAndExit ($UiStrings.ErrorExpiredCertificate -f $FilePath) $ErrorCodes.ExpiredCertificate + } +} + +# +# Verify that the developer certificate meets the following restrictions: +# - The certificate must contain a Basic Constraints extension, and its +# Certificate Authority (CA) property must be false. +# - The certificate's Key Usage extension must be either absent, or set to +# only DigitalSignature. +# - The certificate must contain an Extended Key Usage (EKU) extension with +# Code Signing usage. +# - The certificate must NOT contain any other EKU except Code Signing and +# Lifetime Signing. +# +# These restrictions are enforced to decrease security risks that arise from +# trusting digital certificates. +# +function CheckCertificateRestrictions +{ + Set-Variable -Name BasicConstraintsExtensionOid -Value "2.5.29.19" -Option Constant + Set-Variable -Name KeyUsageExtensionOid -Value "2.5.29.15" -Option Constant + Set-Variable -Name EkuExtensionOid -Value "2.5.29.37" -Option Constant + Set-Variable -Name CodeSigningEkuOid -Value "1.3.6.1.5.5.7.3.3" -Option Constant + Set-Variable -Name LifetimeSigningEkuOid -Value "1.3.6.1.4.1.311.10.3.13" -Option Constant + + $CertificateExtensions = (Get-PfxCertificate $CertificatePath).Extensions + $HasBasicConstraints = $false + $HasCodeSigningEku = $false + + foreach ($Extension in $CertificateExtensions) + { + # Certificate must contain the Basic Constraints extension + if ($Extension.oid.value -eq $BasicConstraintsExtensionOid) + { + # CA property must be false + if ($Extension.CertificateAuthority) + { + PrintMessageAndExit $UiStrings.ErrorCertIsCA $ErrorCodes.CertIsCA + } + $HasBasicConstraints = $true + } + + # If key usage is present, it must be set to digital signature + elseif ($Extension.oid.value -eq $KeyUsageExtensionOid) + { + if ($Extension.KeyUsages -ne "DigitalSignature") + { + PrintMessageAndExit ($UiStrings.ErrorBannedKeyUsage -f $Extension.KeyUsages) $ErrorCodes.BannedKeyUsage + } + } + + elseif ($Extension.oid.value -eq $EkuExtensionOid) + { + # Certificate must contain the Code Signing EKU + $EKUs = $Extension.EnhancedKeyUsages.Value + if ($EKUs -contains $CodeSigningEkuOid) + { + $HasCodeSigningEKU = $True + } + + # EKUs other than code signing and lifetime signing are not allowed + foreach ($EKU in $EKUs) + { + if ($EKU -ne $CodeSigningEkuOid -and $EKU -ne $LifetimeSigningEkuOid) + { + PrintMessageAndExit ($UiStrings.ErrorBannedEKU -f $EKU) $ErrorCodes.BannedEKU + } + } + } + } + + if (!$HasBasicConstraints) + { + PrintMessageAndExit $UiStrings.ErrorNoBasicConstraints $ErrorCodes.NoBasicConstraints + } + if (!$HasCodeSigningEKU) + { + PrintMessageAndExit $UiStrings.ErrorNoCodeSigningEku $ErrorCodes.NoCodeSigningEku + } +} + +# +# Performs operations that require administrative privileges: +# - Prompt the user to obtain a developer license +# - Install the developer certificate (if -Force is not specified, also prompts the user to confirm) +# +function DoElevatedOperations +{ + if ($GetDeveloperLicense) + { + Write-Host $UiStrings.GettingDeveloperLicense + + if ($Force) + { + PrintMessageAndExit $UiStrings.ErrorForceDeveloperLicense $ErrorCodes.ForceDeveloperLicense + } + try + { + Show-WindowsDeveloperLicenseRegistration + } + catch + { + $Error[0] # Dump details about the last error + PrintMessageAndExit $UiStrings.ErrorGetDeveloperLicenseFailed $ErrorCodes.GetDeveloperLicenseFailed + } + } + + if ($CertificatePath) + { + Write-Host $UiStrings.InstallingCertificate + + # Make sure certificate format is valid and usage constraints are followed + ValidateCertificateFormat $CertificatePath + CheckCertificateRestrictions + + # If -Force is not specified, warn the user and get consent + if ($Force -or (ConfirmCertificateInstall)) + { + # Add cert to store + certutil.exe -addstore TrustedPeople $CertificatePath + if ($LastExitCode -lt 0) + { + PrintMessageAndExit ($UiStrings.ErrorCertUtilInstallFailed -f $LastExitCode) $ErrorCodes.CertUtilInstallFailed + } + } + else + { + PrintMessageAndExit $UiStrings.ErrorInstallCertificateCancelled $ErrorCodes.InstallCertificateCancelled + } + } +} + +# +# Checks whether the machine is missing a valid developer license. +# +function CheckIfNeedDeveloperLicense +{ + $Result = $true + try + { + $Result = (Get-WindowsDeveloperLicense | Where-Object { $_.IsValid } | Measure-Object).Count -eq 0 + } + catch {} + + return $Result +} + +# +# Launches an elevated process running the current script to perform tasks +# that require administrative privileges. This function waits until the +# elevated process terminates, and checks whether those tasks were successful. +# +function LaunchElevated +{ + # Set up command line arguments to the elevated process + $RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '"' + + if ($Force) + { + $RelaunchArgs += ' -Force' + } + if ($NeedDeveloperLicense) + { + $RelaunchArgs += ' -GetDeveloperLicense' + } + if ($NeedInstallCertificate) + { + $RelaunchArgs += ' -CertificatePath "' + $DeveloperCertificatePath.FullName + '"' + } + + # Launch the process and wait for it to finish + try + { + $AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru + } + catch + { + $Error[0] # Dump details about the last error + PrintMessageAndExit $UiStrings.ErrorLaunchAdminFailed $ErrorCodes.LaunchAdminFailed + } + + while (!($AdminProcess.HasExited)) + { + Start-Sleep -Seconds 2 + } + + # Check if all elevated operations were successful + if ($NeedDeveloperLicense) + { + if (CheckIfNeedDeveloperLicense) + { + PrintMessageAndExit $UiStrings.ErrorGetDeveloperLicenseFailed $ErrorCodes.GetDeveloperLicenseFailed + } + else + { + Write-Host $UiStrings.AcquireLicenseSuccessful + } + } + if ($NeedInstallCertificate) + { + $Signature = Get-AuthenticodeSignature $DeveloperPackagePath -Verbose + if ($Signature.Status -ne "Valid") + { + PrintMessageAndExit ($UiStrings.ErrorInstallCertificateFailed -f $Signature.Status) $ErrorCodes.InstallCertificateFailed + } + else + { + Write-Host $UiStrings.InstallCertificateSuccessful + } + } +} + +# +# Finds all applicable dependency packages according to OS architecture, and +# installs the developer package with its dependencies. The expected layout +# of dependencies is: +# +# +# \Dependencies +# .appx +# \x86 +# .appx +# \x64 +# .appx +# \arm +# .appx +# +function InstallPackageWithDependencies +{ + $DependencyPackagesDir = (Join-Path $ScriptDir "Dependencies") + $DependencyPackages = @() + if (Test-Path $DependencyPackagesDir) + { + # Get architecture-neutral dependencies + $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "*.appx") | Where-Object { $_.Mode -NotMatch "d" } + + # Get architecture-specific dependencies + if (($Env:Processor_Architecture -eq "x86" -or $Env:Processor_Architecture -eq "amd64") -and (Test-Path (Join-Path $DependencyPackagesDir "x86"))) + { + $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "x86\*.appx") | Where-Object { $_.Mode -NotMatch "d" } + } + if (($Env:Processor_Architecture -eq "amd64") -and (Test-Path (Join-Path $DependencyPackagesDir "x64"))) + { + $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "x64\*.appx") | Where-Object { $_.Mode -NotMatch "d" } + } + if (($Env:Processor_Architecture -eq "arm") -and (Test-Path (Join-Path $DependencyPackagesDir "arm"))) + { + $DependencyPackages += Get-ChildItem (Join-Path $DependencyPackagesDir "arm\*.appx") | Where-Object { $_.Mode -NotMatch "d" } + } + } + Write-Host $UiStrings.InstallingPackage + + $AddPackageSucceeded = $False + try + { + if ($DependencyPackages.FullName.Count -gt 0) + { + Write-Host $UiStrings.DependenciesFound + $DependencyPackages.FullName + Add-AppxPackage -Path $DeveloperPackagePath.FullName -DependencyPath $DependencyPackages.FullName -ForceApplicationShutdown + } + else + { + Add-AppxPackage -Path $DeveloperPackagePath.FullName -ForceApplicationShutdown + } + $AddPackageSucceeded = $? + } + catch + { + $Error[0] # Dump details about the last error + } + + if (!$AddPackageSucceeded) + { + if ($NeedInstallCertificate) + { + PrintMessageAndExit $UiStrings.ErrorAddPackageFailedWithCert $ErrorCodes.AddPackageFailed + } + else + { + PrintMessageAndExit $UiStrings.ErrorAddPackageFailed $ErrorCodes.AddPackageFailed + } + } +} + +# +# Main script logic when the user launches the script without parameters. +# +function DoStandardOperations +{ + # List all .appx files in the script directory + $PackagePath = Get-ChildItem (Join-Path $ScriptDir "*.appx") | Where-Object { $_.Mode -NotMatch "d" } + $PackageCount = ($PackagePath | Measure-Object).Count + + # List all .appxbundle files in the script directory + $BundlePath = Get-ChildItem (Join-Path $ScriptDir "*.appxbundle") | Where-Object { $_.Mode -NotMatch "d" } + $BundleCount = ($BundlePath | Measure-Object).Count + + # List all .eappx files in the script directory + $EncryptedPackagePath = Get-ChildItem (Join-Path $ScriptDir "*.eappx") | Where-Object { $_.Mode -NotMatch "d" } + $EncryptedPackageCount = ($EncryptedPackagePath | Measure-Object).Count + + # List all .eappxbundle files in the script directory + $EncryptedBundlePath = Get-ChildItem (Join-Path $ScriptDir "*.eappxbundle") | Where-Object { $_.Mode -NotMatch "d" } + $EncryptedBundleCount = ($EncryptedBundlePath | Measure-Object).Count + + $NumberOfPackages = $PackageCount + $EncryptedPackageCount + $NumberOfBundles = $BundleCount + $EncryptedBundleCount + + # There must be at least one package or bundle + if ($NumberOfPackages + $NumberOfBundles -lt 1) + { + PrintMessageAndExit $UiStrings.ErrorNoPackageFound $ErrorCodes.NoPackageFound + } + # We must have exactly one bundle OR no bundle and exactly one package + elseif ($NumberOfBundles -gt 1 -or + ($NumberOfBundles -eq 0 -and $NumberOfpackages -gt 1)) + { + PrintMessageAndExit $UiStrings.ErrorManyPackagesFound $ErrorCodes.ManyPackagesFound + } + + # First attempt to install a bundle or encrypted bundle. If neither exists, fall back to packages and then encrypted packages + if ($BundleCount -eq 1) + { + $DeveloperPackagePath = $BundlePath + Write-Host ($UiStrings.BundleFound -f $DeveloperPackagePath.FullName) + } + elseif ($EncryptedBundleCount -eq 1) + { + $DeveloperPackagePath = $EncryptedBundlePath + Write-Host ($UiStrings.EncryptedBundleFound -f $DeveloperPackagePath.FullName) + } + elseif ($PackageCount -eq 1) + { + $DeveloperPackagePath = $PackagePath + Write-Host ($UiStrings.PackageFound -f $DeveloperPackagePath.FullName) + } + elseif ($EncryptedPackageCount -eq 1) + { + $DeveloperPackagePath = $EncryptedPackagePath + Write-Host ($UiStrings.EncryptedPackageFound -f $DeveloperPackagePath.FullName) + } + + # The package must be signed + $PackageSignature = Get-AuthenticodeSignature $DeveloperPackagePath + $PackageCertificate = $PackageSignature.SignerCertificate + if (!$PackageCertificate) + { + PrintMessageAndExit $UiStrings.ErrorPackageUnsigned $ErrorCodes.PackageUnsigned + } + + # Test if the package signature is trusted. If not, the corresponding certificate + # needs to be present in the current directory and needs to be installed. + $NeedInstallCertificate = ($PackageSignature.Status -ne "Valid") + + if ($NeedInstallCertificate) + { + # List all .cer files in the script directory + $DeveloperCertificatePath = Get-ChildItem (Join-Path $ScriptDir "*.cer") | Where-Object { $_.Mode -NotMatch "d" } + $DeveloperCertificateCount = ($DeveloperCertificatePath | Measure-Object).Count + + # There must be exactly 1 certificate + if ($DeveloperCertificateCount -lt 1) + { + PrintMessageAndExit $UiStrings.ErrorNoCertificateFound $ErrorCodes.NoCertificateFound + } + elseif ($DeveloperCertificateCount -gt 1) + { + PrintMessageAndExit $UiStrings.ErrorManyCertificatesFound $ErrorCodes.ManyCertificatesFound + } + + Write-Host ($UiStrings.CertificateFound -f $DeveloperCertificatePath.FullName) + + # The .cer file must have the format of a valid certificate + ValidateCertificateFormat $DeveloperCertificatePath + + # The package signature must match the certificate file + if ($PackageCertificate -ne (Get-PfxCertificate $DeveloperCertificatePath)) + { + PrintMessageAndExit $UiStrings.ErrorCertificateMismatch $ErrorCodes.CertificateMismatch + } + } + + $NeedDeveloperLicense = CheckIfNeedDeveloperLicense + + # Relaunch the script elevated with the necessary parameters if needed + if ($NeedDeveloperLicense -or $NeedInstallCertificate) + { + Write-Host $UiStrings.ElevateActions + if ($NeedDeveloperLicense) + { + Write-Host $UiStrings.ElevateActionDevLicense + } + if ($NeedInstallCertificate) + { + Write-Host $UiStrings.ElevateActionCertificate + } + + $IsAlreadyElevated = ([Security.Principal.WindowsIdentity]::GetCurrent().Groups.Value -contains "S-1-5-32-544") + if ($IsAlreadyElevated) + { + if ($Force -and $NeedDeveloperLicense) + { + PrintMessageAndExit $UiStrings.ErrorForceDeveloperLicense $ErrorCodes.ForceDeveloperLicense + } + if ($Force -and $NeedInstallCertificate) + { + Write-Warning $UiStrings.WarningInstallCert + } + } + else + { + if ($Force) + { + PrintMessageAndExit $UiStrings.ErrorForceElevate $ErrorCodes.ForceElevate + } + else + { + Write-Host $UiStrings.ElevateActionsContinue + Pause + } + } + + LaunchElevated + } + + InstallPackageWithDependencies +} + +# +# Main script entry point +# +if ($GetDeveloperLicense -or $CertificatePath) +{ + DoElevatedOperations +} +else +{ + DoStandardOperations + PrintMessageAndExit $UiStrings.Success $ErrorCodes.Success +} + +# SIG # Begin signature block +# MIIiAgYJKoZIhvcNAQcCoIIh8zCCIe8CAQExDzANBglghkgBZQMEAgEFADB5Bgor +# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG +# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD3yPh68jVLB6Y5 +# fW4NOjuwOC6cBBdFeciIm7493scwe6CCC1YwggTeMIIDxqADAgECAhMzAAABzLVb +# QhcHYBMRAAAAAAHMMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD +# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy +# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p +# bmcgUENBIDIwMTAwHhcNMTcwOTEyMTgwNzA2WhcNMTgwOTEyMTgwNzA2WjB0MQsw +# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u +# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy +# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +# AQCpkHWajIMyG+isxN7HWH5SZZnnaBLtBXRLEpiJMDY/cSmbclWZF6E+H3v0HvLo +# hCALULWOtm+3EjbVybEjYo5+Qi7pDLBgdmiHLEjUkxt8N5VlUIdpp9Apb4hl4pnC +# MAyXYLAap4sKZFjds1GyrnH2V08otBfl1mCwK4Z5KCtZ9Bu+XDn0tM38OzmQaRl/ +# Z0xLO7qfWVUaBj/spPvlkKr+nungSu5JMg8xScKSzfkHNMcrADAQ/RDKGewkY+rd +# rYqT9caaCJQiz0KjQKdtzCxd1fFBx5N1yi9+K25guWjyqjBFNfnvkuF1JIlAXJ6m +# CZM33hi8CbRtRZpCwrlzMHGLAgMBAAGjggFdMIIBWTAfBgNVHSUEGDAWBgorBgEE +# AYI3PQYBBggrBgEFBQcDAzAdBgNVHQ4EFgQUWVXEgo8svduWnjnVL9Gj/TICsn8w +# NAYDVR0RBC0wK6QpMCcxDTALBgNVBAsTBE1PUFIxFjAUBgNVBAUTDTIzMDg2NSsy +# NDI0MDYwHwYDVR0jBBgwFoAU5vxfe7siAFjkck619CF0IzLm76wwVgYDVR0fBE8w +# TTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj +# dHMvTWljQ29kU2lnUENBXzIwMTAtMDctMDYuY3JsMFoGCCsGAQUFBwEBBE4wTDBK +# BggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9N +# aWNDb2RTaWdQQ0FfMjAxMC0wNy0wNi5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG +# 9w0BAQsFAAOCAQEA0ZPuJ7HuV62ZGYwja2MQzDn3VRhyWDvxqbfO4MqWMFFTzJjw +# ElMYK+gamKQJtQHRI0ahePf/Zc5OWx5gLnN+sAl6SufXfXcCf9HFEYmwPzLthrfz +# EAnbjhHTVh30hVcCKf7quFG/Q+58VJ8fuZ3J4AwMThjQOPePqnDwKhu08ythe3CK +# Fu8799o79p+eLqW/hGUJJTmx0iAJ2rjZD+QnfUqDAXXsgnfQuaBDK6Y+pR71SwN0 +# JYijYGIlzY069pEKGwO9Z0LJo6uak/16Wu5R1vmGbkznAFgsQ9P6RMgDHp/vxMzh +# zbDJ6/pdCNpHgVcRJ25xwcZPfkQIrxzuq5UOozCCBnAwggRYoAMCAQICCmEMUkwA +# AAAAAAMwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX +# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg +# Q29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRl +# IEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwNjIwNDAxN1oXDTI1MDcwNjIwNTAxN1ow +# fjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl +# ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMf +# TWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMDCCASIwDQYJKoZIhvcNAQEB +# BQADggEPADCCAQoCggEBAOkOZFB5Z7XE4/0JAEyelKz3VmjqRNjPxVhPqaV2fG1F +# utM5krSkHvn5ZYLkF9KP/UScCOhlk84sVYS/fQjjLiuoQSsYt6JLbklMaxUH3tHS +# wokecZTNtX9LtK8I2MyI1msXlDqTziY/7Ob+NJhX1R1dSfayKi7VhbtZP/iQtCuD +# dMorsztG4/BGScEXZlTJHL0dxFViV3L4Z7klIDTeXaallV6rKIDN1bKe5QO1Y9Oy +# FMjByIomCll/B+z/Du2AEjVMEqa+Ulv1ptrgiwtId9aFR9UQucboqu6Lai0FXGDG +# tCpbnCMcX0XjGhQebzfLGTOAaolNo2pmY3iT1TDPlR8CAwEAAaOCAeMwggHfMBAG +# CSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTm/F97uyIAWORyTrX0IXQjMubvrDAZ +# BgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +# BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8E +# TzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9k +# dWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBM +# MEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRz +# L01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDCBnQYDVR0gBIGVMIGSMIGPBgkr +# BgEEAYI3LgMwgYEwPQYIKwYBBQUHAgEWMWh0dHA6Ly93d3cubWljcm9zb2Z0LmNv +# bS9QS0kvZG9jcy9DUFMvZGVmYXVsdC5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABl +# AGcAYQBsAF8AUABvAGwAaQBjAHkAXwBTAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJ +# KoZIhvcNAQELBQADggIBABp071dPKXvEFoV4uFDTIvwJnayCl/g0/yosl5US5eS/ +# z7+TyOM0qduBuNweAL7SNW+v5X95lXflAtTx69jNTh4bYaLCWiMa8IyoYlFFZwjj +# Pzwek/gwhRfIOUCm1w6zISnlpaFpjCKTzHSY56FHQ/JTrMAPMGl//tIlIG1vYdPf +# B9XZcgAsaYZ2PVHbpjlIyTdhbQfdUxnLp9Zhwr/ig6sP4GubldZ9KFGwiUpRpJps +# yLcfShoOaanX3MF+0Ulwqratu3JHYxf6ptaipobsqBBEm2O2smmJBsdGhnoYP+jF +# HSHVe/kCIy3FQcu/HUzIFu+xnH/8IktJim4V46Z/dlvRU3mRhZ3V0ts9czXzPK5U +# slJHasCqE5XSjhHamWdeMoz7N4XR3HWFnIfGWleFwr/dDY+Mmy3rtO7PJ9O1Xmn6 +# pBYEAackZ3PPTU+23gVWl3r36VJN9HcFT4XG2Avxju1CCdENduMjVngiJja+yrGM +# bqod5IXaRzNij6TJkTNfcR5Ar5hlySLoQiElihwtYNk3iUGJKhYP12E8lGhgUu/W +# R5mggEDuFYF3PpzgUxgaUB04lZseZjMTJzkXeIc2zk7DX7L1PUdTtuDl2wthPSrX +# kizON1o+QEIxpB8QCMJWnL8kXVECnWp50hfT2sGUjgd7JXFEqwZq5tTG3yOalnXF +# MYIWAjCCFf4CAQEwgZUwfjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0 +# b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh +# dGlvbjEoMCYGA1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMAIT +# MwAAAcy1W0IXB2ATEQAAAAABzDANBglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0B +# CQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAv +# BgkqhkiG9w0BCQQxIgQgcdLBsbFqcvjXpRp3s6raoVbVHK2k7Ub/tMzXZiCAaQgw +# QgYKKwYBBAGCNwIBDDE0MDKgFIASAE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6 +# Ly93d3cubWljcm9zb2Z0LmNvbTANBgkqhkiG9w0BAQEFAASCAQCJQh5dULpok+ta +# 4M2McgkkLpsSESowzVE6H1l+HhWAMTRy1Xeme++BuN/lHtOohM1c+XFtc+mt4cTy +# V2ANqg13qkUXkseMMeDpJpATmIIRQgNw0lHbr0XGZ3rcVzvOlQcXv5bW2p098G9q +# mguDTROP+6lvG7lefP96TN5cLHslqtDhcNgjOea9CBG0p1xAr81VG9vM6LS5W0qI +# uLQlTS+p2Oqq+Za7a2Mu1EqSkluvXNdblHsHsI8NO6yICTd5ZZpNfAbkzGkLclDi +# A8uqVjwFWyu1Ky9P6dfOZUT1AvpvyjWuD1bBFZnHeN3bHIZqvWUwX7mtGdzn78N5 +# qn2MeT1UoYITjDCCE4gGCisGAQQBgjcDAwExghN4MIITdAYJKoZIhvcNAQcCoIIT +# ZTCCE2ECAQMxDzANBglghkgBZQMEAgEFADCCAVMGCyqGSIb3DQEJEAEEoIIBQgSC +# AT4wggE6AgEBBgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIE31bGQW/FDP +# hXv07bxBMU6pSqZfhlkE33WLidWXfy+xAgZbgFUHsLcYEjIwMTgwODI4MDgyODQw +# Ljc2WjAHAgEBgAIB9KCB0KSBzTCByjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh +# c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD +# b3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9u +# czEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046N0FCNS0yREYyLURBM0YxJTAjBgNV +# BAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2Wggg75MIIGcTCCBFmgAwIB +# AgIKYQmBKgAAAAAAAjANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzAR +# BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p +# Y3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2Vy +# dGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMTAwNzAxMjEzNjU1WhcNMjUwNzAx +# MjE0NjU1WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G +# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYw +# JAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCCASIwDQYJKoZI +# hvcNAQEBBQADggEPADCCAQoCggEBAKkdDbx3EYo6IOz8E5f1+n9plGt0VBDVpQoA +# goX77XxoSyxfxcPlYcJ2tz5mK1vwFVMnBDEfQRsalR3OCROOfGEwWbEwRA/xYIiE +# VEMM1024OAizQt2TrNZzMFcmgqNFDdDq9UeBzb8kYDJYYEbyWEeGMoQedGFnkV+B +# VLHPk0ySwcSmXdFhE24oxhr5hoC732H8RsEnHSRnEnIaIYqvS2SJUGKxXf13Hz3w +# V3WsvYpCTUBR0Q+cBj5nf/VmwAOWRH7v0Ev9buWayrGo8noqCjHw2k4GkbaICDXo +# eByw6ZnNPOcvRLqn9NxkvaQBwSAJk3jN/LzAyURdXhacAQVPIk0CAwEAAaOCAeYw +# ggHiMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTVYzpcijGQ80N7fEYbxTNo +# WoVtVTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD +# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBW +# BgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny +# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUH +# AQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp +# L2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDCBoAYDVR0gAQH/BIGV +# MIGSMIGPBgkrBgEEAYI3LgMwgYEwPQYIKwYBBQUHAgEWMWh0dHA6Ly93d3cubWlj +# cm9zb2Z0LmNvbS9QS0kvZG9jcy9DUFMvZGVmYXVsdC5odG0wQAYIKwYBBQUHAgIw +# NB4yIB0ATABlAGcAYQBsAF8AUABvAGwAaQBjAHkAXwBTAHQAYQB0AGUAbQBlAG4A +# dAAuIB0wDQYJKoZIhvcNAQELBQADggIBAAfmiFEN4sbgmD+BcQM9naOhIW+z66bM +# 9TG+zwXiqf76V20ZMLPCxWbJat/15/B4vceoniXj+bzta1RXCCtRgkQS+7lTjMz0 +# YBKKdsxAQEGb3FwX/1z5Xhc1mCRWS3TvQhDIr79/xn/yN31aPxzymXlKkVIArzgP +# F/UveYFl2am1a+THzvbKegBvSzBEJCI8z+0DpZaPWSm8tv0E4XCfMkon/VWvL/62 +# 5Y4zu2JfmttXQOnxzplmkIz/amJ/3cVKC5Em4jnsGUpxY517IW3DnKOiPPp/fZZq +# kHimbdLhnPkd/DjYlPTGpQqWhqS9nhquBEKDuLWAmyI4ILUl5WTs9/S/fmNZJQ96 +# LjlXdqJxqgaKD4kWumGnEcua2A5HmoDF0M2n0O99g/DhO3EJ3110mCIIYdqwUB5v +# vfHhAN/nMQekkzr3ZUd46PioSKv33nJ+YWtvd6mBy6cJrDm77MbL2IK0cs0d9LiF +# AR6A+xuJKlQ5slvayA1VmXqHczsI5pgt6o3gMy4SKfXAL1QnIffIrE7aKLixqduW +# sqdCosnPGUFN4Ib5KpqjEWYw07t0MkvfY3v1mYovG8chr1m1rtxEPJdQcdeh0sVV +# 42neV8HR3jDA/czmTfsNv11P6Z0eGTgvvM9YBS7vDaBQNdrvCScc1bN+NR4Iuto2 +# 29Nfj950iEkSMIIE8TCCA9mgAwIBAgITMwAAAOk70bdbjku57AAAAAAA6TANBgkq +# hkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ +# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u +# MSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0xODA4 +# MjMyMDI3MTZaFw0xOTExMjMyMDI3MTZaMIHKMQswCQYDVQQGEwJVUzETMBEGA1UE +# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z +# b2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVy +# YXRpb25zMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjo3QUI1LTJERjItREEzRjEl +# MCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCASIwDQYJKoZI +# hvcNAQEBBQADggEPADCCAQoCggEBAIRsuE5EtCtYIXk4l1CKhUhsjyywW8YPB3vu +# A/TVw6YpvjCTndLB2edT19K9tLbmUAR6KYOUIIa9Z0H8tj0bTgJFj37ctCAaXp9g +# cmmeQzpaVbyPlpGqVP+ge8wbe/kgM+t0IwMSCkJLZgA4fRdi48HzxukXJ+YT9ur8 +# MxZHhuMLBcdztpdjnJ/aaWbjlu85RaNmIY6+XBAHTlk6w2o0pdybBQY5mAg02XHC +# YFxK3767QuXwWJWuulGidbIIu3WfcQ2hzZXiudhwbdBSnsa5r0ET1DeVRswj62R7 +# 37qahvs1vDJQqDI3S0+2O+efD7eWbKFbIEUeWXiQkyzr9b5xyLECAwEAAaOCARsw +# ggEXMB0GA1UdDgQWBBSPBiE/dcg20mGeqwoxKBB33C0x3DAfBgNVHSMEGDAWgBTV +# YzpcijGQ80N7fEYbxTNoWoVtVTBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3Js +# Lm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNUaW1TdGFQQ0FfMjAx +# MC0wNy0wMS5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8v +# d3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1RpbVN0YVBDQV8yMDEwLTA3 +# LTAxLmNydDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqG +# SIb3DQEBCwUAA4IBAQCefzkR1AIK0nsxO3W0Vw1jzlklk0b5hGznQe/WhZN4pget +# So1swFPbzGI8XtYP5DaiyB5tRfM55I+FtnOjnlKUK+vT/yu+ZL4lWYk8HliIAii9 +# xhvE5f/pR8zokorqpDj2b4fyyONexP3p1Zu4hA0Zd2NP04szCZlTneF2XCOW4zWK +# 9+rhS3mkauQ8b2YFjmt3pe2AmiWFgXMxlQLK7AL206YQYrUyMvNOv/gy9MzLT5IE +# FWAyz00Gw8NrKuYyg90Kl1oKYFGSMjKg6Hn8o4I6pNk2zfxflFVVNQjjjW8nd0oY +# AIITBgo+aXKDplc+ABw92RvOi6++sg81DQwI025VoYIDizCCAnMCAQEwgfqhgdCk +# gc0wgcoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH +# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNV +# BAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJjAkBgNVBAsTHVRoYWxl +# cyBUU1MgRVNOOjdBQjUtMkRGMi1EQTNGMSUwIwYDVQQDExxNaWNyb3NvZnQgVGlt +# ZS1TdGFtcCBTZXJ2aWNloiUKAQEwCQYFKw4DAhoFAAMVAJ6RGyV/F2FkeVjeFRxM +# uu+2kSiUoIHBMIG+pIG7MIG4MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu +# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv +# cmF0aW9uMQwwCgYDVQQLEwNBT0MxJzAlBgNVBAsTHm5DaXBoZXIgTlRTIEVTTjoy +# NjY1LTRDM0YtQzVERTErMCkGA1UEAxMiTWljcm9zb2Z0IFRpbWUgU291cmNlIE1h +# c3RlciBDbG9jazANBgkqhkiG9w0BAQUFAAIFAN8u6/0wIhgPMjAxODA4MjcyMTMw +# MzdaGA8yMDE4MDgyODIxMzAzN1owczA5BgorBgEEAYRZCgQBMSswKTAKAgUA3y7r +# /QIBADAGAgEAAgFaMAcCAQACAhm7MAoCBQDfMD19AgEAMDYGCisGAQQBhFkKBAIx +# KDAmMAwGCisGAQQBhFkKAwGgCjAIAgEAAgMW42ChCjAIAgEAAgMHoSAwDQYJKoZI +# hvcNAQEFBQADggEBACEhCtdwWxxLhqsHI5l1h5DUk5jonNN3zkYJIwGgCi+ygr/X +# vrAlSI+dN2PNiRP83e2Eeubb0SQ9ICsgafHV12QOeBpL5KKy98fpKLdVOuZgnKJ4 +# EO/1JoYXM1HR698KmcLsvBdeH4hcsZ8A5DeuK7xHd9Z1hTrCrVGK9Kucw5UKxQa1 +# AczUefaK8RgUGUMFIDBDT7FPGv2h3CNscciXo0Sd9pWt4FakSZVyjuM1QL7NWC6i +# vmqhNz89g+sMs11mbFoHpUItY3bNieBfAM2n/x6njLEgiHeAFQxqgoiDL2G1tTOT +# S2SGGDqNHyVxBYuGmhNZlIRYeIQwTGVogeMlhOAxggL1MIIC8QIBATCBkzB8MQsw +# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u +# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNy +# b3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAOk70bdbjku57AAAAAAA6TAN +# BglghkgBZQMEAgEFAKCCATIwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8G +# CSqGSIb3DQEJBDEiBCClUU3ZdVay+Bf+z3RL7ofCAxoJBwBG+Kpe4iRCEBbPcTCB +# 4gYLKoZIhvcNAQkQAgwxgdIwgc8wgcwwgbEEFJ6RGyV/F2FkeVjeFRxMuu+2kSiU +# MIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO +# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm +# MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAADpO9G3 +# W45LuewAAAAAAOkwFgQUoZeFsNshxkylm3bbK2PGQ2qflB0wDQYJKoZIhvcNAQEL +# BQAEggEAHagk1ae2Id7Xty+nkbSV4zf/zQkvUZdyYqARffnuvLhyPzfd5tr2voGK +# GG+fvt+/RIZi46lR0rNt1ZRbP5cOedo3xFo1sy61NwPymefnnCRUqwsoS58D0tWj +# bAXS1Oc1VgnFcO1kinXFDyz0YCFiqr4j/w6ay/rqa5UzDMuS/ghZsutLDvGENtIc +# +rrKnbild9+dzKKMAFStem7xWCtbxQqZksPccw0tXuN3j5ckUHiFHFW9qyKp2fwT +# +Wlk+fVnKKkXe0nfaODwn3M8Dd7zKY5F4GvAhzl59C4GYHGQq3Vfuz66J5foc2+7 +# YA4YXEcQVR/MTZumoXqFwBs2wDvXwA== +# SIG # End signature block diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..89c0d417 Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..533300d4 Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/cs-CZ/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..d0744fef Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/de-DE/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..89c0d417 Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/en-US/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..3b2b9617 Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/es-ES/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..6b400bf7 Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/fr-FR/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..270e388b Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/it-IT/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..c8536545 Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/ja-JP/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..979867af Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/ko-KR/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..7d18a7ff Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/pl-PL/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..03968e13 Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/pt-BR/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..6bc7dc69 Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/ru-RU/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..21fd8523 Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/tr-TR/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..b34919e4 Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/zh-CN/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 new file mode 100644 index 00000000..c19e10ae Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/Add-AppDevPackage.resources/zh-TW/Add-AppDevPackage.psd1 differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/KiwixWebApp_0.9.989.0_AnyCPU.appxbundle b/AppPackages/KiwixWebApp_0.9.989.0_Test/KiwixWebApp_0.9.989.0_AnyCPU.appxbundle new file mode 100644 index 00000000..2bdc2d0f Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/KiwixWebApp_0.9.989.0_AnyCPU.appxbundle differ diff --git a/AppPackages/KiwixWebApp_0.9.989.0_Test/KiwixWebApp_0.9.989.0_AnyCPU.cer b/AppPackages/KiwixWebApp_0.9.989.0_Test/KiwixWebApp_0.9.989.0_AnyCPU.cer new file mode 100644 index 00000000..007f8355 Binary files /dev/null and b/AppPackages/KiwixWebApp_0.9.989.0_Test/KiwixWebApp_0.9.989.0_AnyCPU.cer differ diff --git a/package.appxmanifest b/package.appxmanifest index e06eea58..d8169056 100644 --- a/package.appxmanifest +++ b/package.appxmanifest @@ -1,6 +1,6 @@  - + Kiwix JS diff --git a/www/js/init.js b/www/js/init.js index 660d38c5..26f45b6a 100644 --- a/www/js/init.js +++ b/www/js/init.js @@ -30,7 +30,7 @@ window.onerror = function (msg, url) { // Parameters that define overall operation of app var params = {}; -params['version'] = "0.9.9.89 Beta-dev"; //DEV: do not set this dynamically -- it is compared to the cookie "version" in order to show first-time info, and the cookie is updated in app.js +params['version'] = "0.9.9.89 Beta"; //DEV: do not set this dynamically -- it is compared to the cookie "version" in order to show first-time info, and the cookie is updated in app.js params['packagedFile'] = "wikipedia_en_ray_charles_novid_2018-10.zim"; //For packaged Kiwix JS (e.g. with Wikivoyage file), set this to the filename (for split files, give the first chunk *.zimaa) and place file(s) in default storage params['fileVersion'] = "wikipedia_en_ray_charles_novid_2018-10.zim (12-Oct-2018)"; //Use generic name for actual file, and give version here params['cachedStartPage'] = false; //If you have cached the start page for quick start, give its URI here