← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~raoul-snyman/openlp/wix-packaging into lp:openlp/packaging

 

Raoul Snyman has proposed merging lp:~raoul-snyman/openlp/wix-packaging into lp:openlp/packaging.

Commit message:
Build a Windows Installer (MSI) file instead of using InnoSetup

Requested reviews:
  OpenLP Core (openlp-core)

For more details, see:
https://code.launchpad.net/~raoul-snyman/openlp/wix-packaging/+merge/365880

Build a Windows Installer (MSI) file instead of using InnoSetup
-- 
Your team OpenLP Core is requested to review the proposed merge of lp:~raoul-snyman/openlp/wix-packaging into lp:openlp/packaging.
=== modified file 'builders/builder.py'
--- builders/builder.py	2019-02-18 20:10:59 +0000
+++ builders/builder.py	2019-04-11 20:55:56 +0000
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
 
 ###############################################################################
 # OpenLP - Open Source Lyrics Projection                                      #
@@ -276,8 +276,11 @@
         """
         self._print('Running PyInstaller...')
         os.chdir(self.work_path)
-        cmd = [self.python,
-               self.pyinstaller_exe,
+        if self.pyinstaller_exe.endswith('.py'):
+            cmd = [self.python, self.pyinstaller_exe]
+        else:
+            cmd = [self.pyinstaller_exe]
+        cmd.extend([
                '--clean',
                '--noconfirm',
                '--windowed',
@@ -287,7 +290,8 @@
                '-i', self.icon_path,
                '-n', 'OpenLP',
                *self.get_extra_parameters(),  # Adds any extra parameters we wish to use
-               self.openlp_script]
+               self.openlp_script
+        ])
         if self.args.verbose:
             cmd.append('--log-level=DEBUG')
         else:

=== modified file 'builders/windows-builder.py'
--- builders/windows-builder.py	2019-03-13 21:00:05 +0000
+++ builders/windows-builder.py	2019-04-11 20:55:56 +0000
@@ -1,10 +1,10 @@
 # -*- coding: utf-8 -*-
-# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
 
 ###############################################################################
 # OpenLP - Open Source Lyrics Projection                                      #
 # --------------------------------------------------------------------------- #
-# Copyright (c) 2004-2016 OpenLP Developers                                   #
+# Copyright (c) OpenLP Developers                                             #
 # --------------------------------------------------------------------------- #
 # This program is free software; you can redistribute it and/or modify it     #
 # under the terms of the GNU General Public License as published by the Free  #
@@ -36,8 +36,9 @@
     This script expects the precompiled, installable version of PyEnchant to be
     installed. You can find this on the PyEnchant site.
 
-Inno Setup 5
-    Inno Setup should be installed into "C:\\%PROGRAMFILES%\\Inno Setup 5"
+WiX Toolset
+    The toolset should be installed into "C:\\%PROGRAMFILES%\\WiX Toolset v3.11"
+    or similar.
 
 Sphinx
     This is used to build the documentation.  The documentation trunk must be at
@@ -61,15 +62,6 @@
     This script, of course. It should be in the "windows-installer" directory
     at the same level as OpenLP trunk.
 
-psvince.dll
-    This dll is used during the actual install of OpenLP to check if OpenLP is
-    running on the users machine prior to the setup.  If OpenLP is running,
-    the install will fail.  The dll can be obtained from here:
-
-        http://www.vincenzo.net/isxkb/index.php?title=PSVince
-
-    The dll is presently included with this script.
-
 Mako
     Mako Templates for Python.  This package is required for building the
     remote plugin.  It can be installed by going to your
@@ -83,11 +75,6 @@
     mupdf.com, extract it, and set the mutoolbin option in the config file to
     point to mutool.exe.
 
-MediaInfo
-    Required for the media plugin. Download the 32-bit CLI windows build from
-    https://mediaarea.net/nn/MediaInfo/Download/Windows and set the
-    mediainfobin option in the config file to point to MediaInfo.exe.
-
 Portable App Builds
     The following are required if you are planning to make a portable build of
     OpenLP.  The portable build conforms to the standards published by
@@ -112,8 +99,12 @@
 import glob
 import sys
 from distutils import dir_util
+from hashlib import md5
 from shutil import copy, move, rmtree
 
+from lxml.etree import fromstring, tostring
+from lxml.builder import E
+
 from builder import Builder
 
 
@@ -123,29 +114,107 @@
     to build a Windows installer.
     """
 
-    def _create_innosetup_file(self):
-        """
-        Create an InnoSetup file pointing to the branch being built.
-        """
-        self._print('Creating Inno Setup file...')
-        config_dir = os.path.dirname(self.config_path)
-        with open(os.path.join(config_dir, 'OpenLP.iss.default'), 'r') as input_file, \
-                open(os.path.join(config_dir, 'OpenLP.iss'), 'w') as output_file:
-            content = input_file.read()
-            content = content.replace('%(branch)s', self.branch_path)
-            content = content.replace('%(display_version)s', self.version.replace('-bzr', '.'))
-            content = content.replace('%(arch)s', self.arch)
-            output_file.write(content)
-
-    def _run_innosetup(self):
-        """
-        Run InnoSetup to create an installer.
-        """
-        self._print('Running Inno Setup...')
-        config_dir = os.path.dirname(self.config_path)
-        os.chdir(config_dir)
-        self._run_command([self.innosetup_exe, os.path.join(config_dir, 'OpenLP.iss'), '/q'],
-                          'Error running InnoSetup')
+    def _walk_dirs(self, dir_dict, path):
+        """
+        Walk a dictionary according to path
+        """
+        parts = path.split(os.sep)
+        search_key = parts.pop(0)
+        if search_key in dir_dict.keys():
+            if not parts:
+                return dir_dict[search_key]
+            else:
+                return self._walk_dirs(dir_dict[search_key], os.sep.join(parts))
+        else:
+            return None
+
+    def _get_fragments_from_files(self, start_dir):
+        """
+        Walk down a directory recursively and build up the XML for WiX
+        """
+        start_base, start_path = os.path.split(start_dir)
+        element = E.DirectoryRef(Id='INSTALLDIR')
+        directories = {start_path: {'__dir__': element}}
+        components = []
+
+        for root, _, files in os.walk(start_dir):
+            parent = os.sep.join(root.replace(os.path.join(start_base, ''), '').split(os.sep)[:-1])
+            if root == start_dir:
+                path = ''
+            else:
+                path = root.replace(os.path.join(start_dir, ''), '')
+            base = os.path.basename(root)
+            if root != start_dir:
+                dir_id = 'dir_{parent}_{base}'.format(parent=parent.replace(os.sep, '_'), base=base)
+                element = E.Directory(Id=dir_id, Name=base)
+                new_dir = {'__dir__': element}
+                parent_dir = self._walk_dirs(directories, parent)
+                parent_dir[base] = new_dir
+                parent_dir['__dir__'].append(element)
+            for fname in files:
+                source = os.path.join(path, fname) if path else fname
+                source_id = md5(source.encode('utf8')).hexdigest()
+                file_id = 'file_{source_id}'.format(source_id=source_id)
+                component_id = 'cmp_{source_id}'.format(source_id=source_id)
+                if self.arch == 'x64':
+                    file_ = E.File(Id=file_id, KeyPath="yes", Source=source, ProcessorArchitecture='x64')
+                    component = E.Component(file_, Id=component_id, Guid='*', Win64='yes')
+                else:
+                    file_ = E.File(Id=file_id, KeyPath="yes", Source=source)
+                    component = E.Component(file_, Id=component_id, Guid='*')
+                element.append(component)
+                components.append(component)
+
+        files_fragment = E.Fragment(directories[start_path]['__dir__'])
+        comps_fragment = E.Fragment(E.ComponentGroup(*[E.ComponentRef(Id=c.attrib['Id']) for c in components],
+                                                     Id='Files'))
+        return files_fragment, comps_fragment
+
+    def _create_wix_file(self):
+        """
+        Create a WiX project file
+        """
+        self._print('Creating WiX file...')
+        config_dir = os.path.dirname(self.config_path)
+        self._print_verbose('Reading base WiX file')
+        with open(os.path.join(config_dir, 'OpenLP-base.wxs'), 'rt') as base_file:
+            xml = base_file.read()
+        progfilefolder = 'ProgramFiles64Folder' if self.arch == 'x64' else 'ProgramFilesFolder'
+        xml = xml % dict(dialog=os.path.join(config_dir, 'WizardMain.bmp'),
+                         banner=os.path.join(config_dir, 'WizardBanner.bmp'),
+                         license=os.path.join(config_dir, 'gpl-2.0.rtf'),
+                         platform=self.arch,
+                         progfilefolder=progfilefolder)
+        tree = fromstring(xml.encode('utf8'))
+        self._print_verbose('Creating XML fragments from files and directories')
+        fragments = self._get_fragments_from_files(self.dist_path)
+        self._print_verbose('Inserting XML fragments into base WiX file')
+        for fragment in fragments:
+            tree.append(fragment)
+        self._print_verbose('Writing new WiX file')
+        with open(os.path.join(config_dir, 'OpenLP.wxs'), 'wb') as f:
+            f.write(tostring(tree, encoding='utf-8', xml_declaration=True, pretty_print=True))
+
+    def _run_wix_tools(self):
+        """
+        Run the WiX toolset to create an installer
+        """
+        self._print('Running WiX tools...')
+        if self.arch == 'x64':
+            version = '{}-x64'.format(self.version)
+        else:
+            version = self.version
+        msi_file = os.path.abspath(os.path.join(self.dist_path, '..', 'OpenLP-{}.msi'.format(version)))
+        if os.path.exists(msi_file):
+            self._print_verbose('Removing old MSI file')
+            os.unlink(msi_file)
+        config_dir = os.path.dirname(self.config_path)
+        os.chdir(self.dist_path)
+        self._run_command([self.candle_exe, '-ext', 'WiXUtilExtension', os.path.join(config_dir, 'OpenLP.wxs')],
+                          'Error running WiX tool: candle')
+        self._run_command([self.light_exe, '-ext', 'WiXUtilExtension', '-ext', 'WixUIExtension', 'OpenLP.wixobj',
+                           '-o', msi_file],
+                          'Error running WiX tool: light')
 
     def _create_portableapp_structure(self):
         """
@@ -303,8 +372,6 @@
         copy(self.icon_path, os.path.join(self.dist_path, 'OpenLP.ico'))
         self._print_verbose('... LICENSE.txt')
         copy(self.license_path, os.path.join(self.dist_path, 'LICENSE.txt'))
-        self._print_verbose('... psvince.dll')
-        copy(self.psvince_exe, os.path.join(self.dist_path, 'psvince.dll'))
         if os.path.isfile(os.path.join(self.helpfile_path, 'OpenLP.chm')):
             self._print_verbose('... OpenLP.chm')
             copy(os.path.join(self.helpfile_path, 'OpenLP.chm'), os.path.join(self.dist_path, 'OpenLP.chm'))
@@ -315,11 +382,6 @@
             copy(os.path.join(self.mutool_exe), os.path.join(self.dist_path, 'mutool.exe'))
         else:
             self._print('... WARNING: mutool.exe not found')
-        self._print_verbose('... MediaInfo.exe')
-        if self.mediainfo_exe and os.path.isfile(self.mediainfo_exe):
-            copy(os.path.join(self.mediainfo_exe), os.path.join(self.dist_path, 'MediaInfo.exe'))
-        else:
-            self._print('... WARNING: MediaInfo.exe not found')
 
     def after_run_sphinx(self):
         """
@@ -333,8 +395,8 @@
         """
         Build the installer
         """
-        self._create_innosetup_file()
-        self._run_innosetup()
+        self._create_wix_file()
+        self._run_wix_tools()
         if self.args.portable:
             self._run_portableapp_builder()
 

=== added file 'windows/OpenLP-base.wxs'
--- windows/OpenLP-base.wxs	1970-01-01 00:00:00 +0000
+++ windows/OpenLP-base.wxs	2019-04-11 20:55:56 +0000
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi";
+     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension";>
+  <Product Name="OpenLP" Manufacturer="OpenLP" Id="{98092172-3875-47d3-8DBE-3EB0D5A57CE7}"
+    UpgradeCode="{8C5881AC-8F1E-4937-BB99-B823FABF18F0}" Language="1033" Codepage="1252" Version="2.5.0">
+    <Package Id="*" Keywords="Installer" Description="Free open source church worship presentation software"
+      Comments="OpenLP is open source under the GNU General Public License" Manufacturer="OpenLP Developers"
+      InstallerVersion="251" Languages="1033" Compressed="yes" SummaryCodepage="1252" Platform="%(platform)s"/>
+    <Condition Message="You need to be an administrator to install this product.">Privileged</Condition>
+    <Media Id="1" Cabinet="openlp.cab" EmbedCab="yes" CompressionLevel="high"/>
+    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />
+    <Property Id="ARPPRODUCTICON" Value="OpenLP.ico" />
+    <Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch OpenLP" />
+    <Property Id="WixShellExecTarget" Value="[#file_e368869eb54b01e2288a3359b1cf51f8]" />
+    <CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
+    <UI>
+      <UIRef Id="WixUI_InstallDir" />
+      <Publish Dialog="ExitDialog"
+        Control="Finish" 
+        Event="DoAction" 
+        Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
+    </UI>
+    <WixVariable Id="WixUILicenseRtf" Value="%(license)s" />
+    <WixVariable Id="WixUIDialogBmp" Value="%(dialog)s" />
+    <WixVariable Id="WixUIBannerBmp" Value="%(banner)s" />
+    <Directory Id="TARGETDIR" Name="SourceDir">
+      <Directory Id="%(progfilefolder)s">
+        <Directory Id="INSTALLDIR" Name="OpenLP"/>
+      </Directory>
+      <Directory Id="ProgramMenuFolder" Name="Programs">
+        <Directory Id="ProgramMenuDir" Name="OpenLP">
+          <Component Id="ProgramMenuDir" Guid="{7AABE54C-5B03-4049-AA85-E18B787A19C7}">
+            <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
+            <RegistryValue Root="HKCU" Key="Software\OpenLP\OpenLP" Type="string" Value="" KeyPath="yes" />
+            <Shortcut Id="ApplicationStartMenuShortcut"
+              Name="OpenLP" 
+              Description="Open Source Worship Presentation Software"
+              Target="[#file_e368869eb54b01e2288a3359b1cf51f8]"
+              Icon="OpenLP.ico"
+              WorkingDirectory="RootDirectory"/>
+            <Shortcut Id="DebugStartMenuShortcut"
+              Name="OpenLP (Debug)" 
+              Description="Run OpenLP with debug logging enabled"
+              Target="[#file_e368869eb54b01e2288a3359b1cf51f8]"
+              Arguments="--log-level debug"
+              Icon="OpenLP.ico"
+              WorkingDirectory="RootDirectory"/>
+            <Shortcut Id="HelpStartMenuShortcut"
+              Name="OpenLP Help" 
+              Description="Help file for OpenLP"
+              Target="[#file_436f15ee9b174c85745878fe09b6d47e]"
+              WorkingDirectory="RootDirectory"/>
+            <util:InternetShortcut Id="OpenLPWebSite"
+              Name="OpenLP on the Web"
+              Target="http://openlp.org/"/>
+            <util:InternetShortcut Id="OpenLPForums"
+              Name="Get support for OpenLP"
+              Target="http://forums.openlp.org/"/>
+            <Shortcut Id="UninstallProduct"             
+              Name="Uninstall OpenLP"
+              Target="[SystemFolder]msiexec.exe"
+              Arguments="/x [ProductCode]"
+              Description="Removes OpenLP from your computer" />
+          </Component>
+        </Directory>
+      </Directory>
+      <Directory Id="DesktopFolder" Name="Desktop" />
+    </Directory>
+    <DirectoryRef Id="INSTALLDIR">
+      <Directory Id="RootDirectory" Name="OpenLP" />
+    </DirectoryRef>
+    <Feature Id="Complete" Title="Complete" Description="The OpenLP program files" Level="1"
+      ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no" InstallDefault="local" Absent="disallow">
+      <ComponentGroupRef Id="Files"/>
+      <ComponentRef Id="ProgramMenuDir"/>
+    </Feature>
+    <Icon Id="OpenLP.ico" SourceFile="OpenLP.ico"/>
+  </Product>
+</Wix>

=== removed file 'windows/OpenLP.iss.default'
--- windows/OpenLP.iss.default	2019-03-11 13:46:12 +0000
+++ windows/OpenLP.iss.default	1970-01-01 00:00:00 +0000
@@ -1,187 +0,0 @@
-; Script generated by the Inno Setup Script Wizard.
-; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
-
-#define AppName "OpenLP"
-#define AppVerName "OpenLP %(display_version)s"
-#define AppVersion "%(display_version)s"
-#define AppPublisher "OpenLP Developers"
-#define AppURL "http://openlp.org/";
-#define AppExeName "OpenLP.exe"
-#define Arch "%(arch)s"
-
-#define FileHandle FileOpen("%(branch)s\dist\OpenLP\.version")
-#define FileLine FileRead(FileHandle)
-#define RealVersion FileLine
-#expr FileClose(FileHandle)
-
-[Setup]
-; NOTE: The value of AppId uniquely identifies this application.
-; Do not use the same AppId value in installers for other applications.
-; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
-AppID={{AA7699FA-B2D2-43F4-8A70-D497D03C9485}
-AppName={#AppName}
-AppVerName={cm:NameAndVersion,{#AppName},{#AppVersion}}
-AppVersion={#AppVersion}
-AppPublisher={#AppPublisher}
-AppPublisherURL={#AppURL}
-AppSupportURL={#AppURL}
-AppUpdatesURL={#AppURL}
-DefaultDirName={pf}\{#AppName}
-DefaultGroupName={#AppName}
-AllowNoIcons=true
-LicenseFile=LICENSE.txt
-OutputDir=%(branch)s\dist\
-OutputBaseFilename=OpenLP-{#RealVersion}-{#Arch}-setup
-Compression=lzma/Max
-SolidCompression=true
-SetupIconFile=OpenLP.ico
-VersionInfoVersion={#AppVersion}
-WizardImageFile=WizImageBig.bmp
-WizardSmallImageFile=WizImageSmall.bmp
-ChangesAssociations=true
-
-[Languages]
-Name: english; MessagesFile: compiler:Default.isl
-Name: brazilianportuguese; MessagesFile: compiler:Languages\BrazilianPortuguese.isl
-Name: catalan; MessagesFile: compiler:Languages\Catalan.isl
-Name: czech; MessagesFile: compiler:Languages\Czech.isl
-Name: danish; MessagesFile: compiler:Languages\Danish.isl
-Name: dutch; MessagesFile: compiler:Languages\Dutch.isl
-Name: finnish; MessagesFile: compiler:Languages\Finnish.isl
-Name: french; MessagesFile: compiler:Languages\French.isl
-Name: german; MessagesFile: compiler:Languages\German.isl
-Name: hebrew; MessagesFile: compiler:Languages\Hebrew.isl
-Name: hungarian; MessagesFile: compiler:Languages\Hungarian.isl
-Name: italian; MessagesFile: compiler:Languages\Italian.isl
-Name: japanese; MessagesFile: compiler:Languages\Japanese.isl
-Name: norwegian; MessagesFile: compiler:Languages\Norwegian.isl
-Name: polish; MessagesFile: compiler:Languages\Polish.isl
-Name: portuguese; MessagesFile: compiler:Languages\Portuguese.isl
-Name: russian; MessagesFile: compiler:Languages\Russian.isl
-Name: slovenian; MessagesFile: compiler:Languages\Slovenian.isl
-Name: spanish; MessagesFile: compiler:Languages\Spanish.isl
-
-[Tasks]
-Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}
-Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; OnlyBelowVersion: 0, 6.1
-
-[Files]
-Source: %(branch)s\dist\OpenLP\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
-; DLL used to check if the target program is running at install time
-Source: psvince.dll; flags: dontcopy
-; psvince is installed in {app} folder, so it will be loaded at
-; uninstall time to check if the target program is running
-Source: psvince.dll; DestDir: {app}
-
-[Icons]
-Name: {group}\{#AppName}; Filename: {app}\{#AppExeName}
-Name: {group}\{#AppName} (Debug); Filename: {app}\{#AppExeName}; Parameters: -l debug
-Name: {group}\{#AppName} Help; Filename: {app}\{#AppName}.chm; Check: FileExists(ExpandConstant('{app}\{#AppName}.chm'))
-Name: {group}\{cm:ProgramOnTheWeb,{#AppName}}; Filename: {#AppURL}
-Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe}
-Name: {commondesktop}\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: desktopicon
-Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: quicklaunchicon
-
-[Run]
-Filename: {app}\{#AppExeName}; Description: {cm:LaunchProgram,{#AppName}}; Flags: nowait postinstall skipifsilent
-
-[Registry]
-Root: HKCR; Subkey: .osz; ValueType: string; ValueName: ; ValueData: OpenLP; Flags: uninsdeletevalue
-Root: HKCR; Subkey: .oszl; ValueType: string; ValueName: ; ValueData: OpenLP; Flags: uninsdeletevalue
-Root: HKCR; Subkey: OpenLP; ValueType: string; ValueName: ; ValueData: OpenLP Service; Flags: uninsdeletekey
-Root: HKCR; Subkey: OpenLP\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\OpenLP.exe,0
-Root: HKCR; Subkey: OpenLP\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\OpenLP.exe"" ""%1"""
-
-[UninstallDelete]
-; Remove support directory created when program is run:
-Type: filesandordirs; Name: {app}\support
-; Remove program directory if empty:
-Name: {app}; Type: dirifempty
-
-[Code]
-// Function to call psvince.dll at install time
-function IsModuleLoadedInstall(modulename: AnsiString ):  Boolean;
-external 'IsModuleLoaded@files:psvince.dll stdcall setuponly';
-
-// Function to call psvince.dll at uninstall time
-function IsModuleLoadedUninstall(modulename: AnsiString ):  Boolean;
-external 'IsModuleLoaded@{app}\psvince.dll stdcall uninstallonly' ;
-
-function GetUninstallString(): String;
-var
-  sUnInstPath: String;
-  sUnInstallString: String;
-begin
-  sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1');
-  sUnInstallString := '';
-  if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then
-    RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString);
-  Result := sUnInstallString;
-end;
-
-function IsUpgrade(): Boolean;
-begin
-  Result := (GetUninstallString() <> '');
-end;
-
-// Return Values:
-// 1 - uninstall string is empty
-// 2 - error executing the UnInstallString
-// 3 - successfully executed the UnInstallString
-function UnInstallOldVersion(): Integer;
-var
-  sUnInstallString: String;
-  iResultCode: Integer;
-begin
-  Result := 0;
-  sUnInstallString := GetUninstallString();
-  if sUnInstallString <> '' then
-  begin
-    sUnInstallString := RemoveQuotes(sUnInstallString);
-    if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then
-      Result := 3
-    else
-      Result := 2;
-  end
-  else
-    Result := 1;
-end;
-
-function InitializeSetup(): Boolean;
-begin
-  Result := true;
-  while IsModuleLoadedInstall( 'OpenLP.exe' ) and Result do
-  begin
-    if MsgBox( 'Openlp is currently running, please close it to continue the install.',
-      mbError, MB_OKCANCEL ) =  IDCANCEL then
-	begin
-	  Result := false;
-	end;
-  end;
-end;
-
-procedure CurStepChanged(CurStep: TSetupStep);
-begin
-  if (CurStep=ssInstall) then
-  begin
-    if (IsUpgrade()) then
-    begin
-      UnInstallOldVersion();
-    end;
-  end;
-end;
-
-function InitializeUninstall(): Boolean;
-begin
-  Result := true;
-  while IsModuleLoadedUninstall( 'OpenLP.exe' ) and Result do
-  begin
-    if MsgBox( 'Openlp is currently running, please close it to continue the uninstall.',
-      mbError, MB_OKCANCEL ) =  IDCANCEL then
-	begin
-	  Result := false;
-	end;
-  end;
-// Unload psvince.dll, otherwise it is not deleted
-  UnloadDLL(ExpandConstant('{app}\psvince.dll'));
-end;

=== added file 'windows/WizardBanner.bmp'
Binary files windows/WizardBanner.bmp	1970-01-01 00:00:00 +0000 and windows/WizardBanner.bmp	2019-04-11 20:55:56 +0000 differ
=== added file 'windows/WizardMain.bmp'
Binary files windows/WizardMain.bmp	1970-01-01 00:00:00 +0000 and windows/WizardMain.bmp	2019-04-11 20:55:56 +0000 differ
=== modified file 'windows/config-appveyor.ini'
--- windows/config-appveyor.ini	2019-02-15 21:34:14 +0000
+++ windows/config-appveyor.ini	2019-04-11 20:55:56 +0000
@@ -1,14 +1,13 @@
 [executables]
-innosetup = %(progfiles)s\Inno Setup 5\ISCC.exe
 sphinx = %(pyroot)s\Scripts\sphinx-build.exe
 pyinstaller = %(pyroot)s\Scripts\pyinstaller-script.py
 htmlhelp = %(progfiles)s\HTML Help Workshop\hhc.exe
-psvince = %(here)s\psvince.dll
 lrelease = C:\Qt\5.12\msvc2017\bin\lrelease.exe
 portablelauncher = %(here)s\..\..\PortableApps.comLauncher\PortableApps.comLauncherGenerator.exe
 portableinstaller = %(here)s\..\..\PortableApps.comInstaller\PortableApps.comInstaller.exe
 mutool = %(here)s\..\..\mupdf-1.14.0-windows\mutool.exe
-mediainfo = %(here)s\..\..\MediaInfo\MediaInfo.exe
+candle = %(progfiles)s\WiX Toolset v3.11\bin\candle.exe
+light = %(progfiles)s\WiX Toolset v3.11\bin\light.exe
 
 [paths]
 branch = %(projects)s\openlp-branch

=== modified file 'windows/config.ini.default'
--- windows/config.ini.default	2019-02-15 20:19:31 +0000
+++ windows/config.ini.default	2019-04-11 20:55:56 +0000
@@ -1,22 +1,21 @@
 [executables]
-innosetup = %(progfiles)s\Inno Setup 5\ISCC.exe
 sphinx = %(pyroot)s\Scripts\sphinx-build.exe
 pyinstaller = %(here)s\..\pyinstaller\pyinstaller.py
 htmlhelp = %(progfiles)s\HTML Help Workshop\hhc.exe
-psvince = %(here)s\psvince.dll
 lrelease = %(sitepackages)s\PyQt5\bin\lrelease.exe
 portablelauncher = %(progfiles)s\PortableApps.comLauncher\PortableApps.comLauncherGenerator.exe
 portableinstaller = %(progfiles)s\PortableApps.comInstaller\PortableApps.comInstaller.exe
 mutool = %(here)s\..\mupdf-1.9a-windows\mutool.exe
-mediainfo = %(here)s\..\MediaInfo\MediaInfo.exe
+candle = %(progfiles)s\WiX Toolset v3.11\bin\candle.exe
+light = %(progfiles)s\WiX Toolset v3.11\bin\light.exe
 
 [paths]
 branch = %(projects)s\trunk
 documentation = %(projects)s\documentation
-icon = %(here)s\OpenLP.ico
-hooks = %(here)s\..\pyinstaller-hooks
+icon = %(here)s\windows\OpenLP.ico
+hooks = %(here)s\pyinstaller-hooks
 license = %(here)s\LICENSE.txt
-portable_source = %(here)s\OpenLPPortable
+portable_source = %(here)s\windows\OpenLPPortable
 portable_dest = %(projects)s\OpenLPPortable
 
 [transifex]

=== added file 'windows/gpl-2.0.rtf'
--- windows/gpl-2.0.rtf	1970-01-01 00:00:00 +0000
+++ windows/gpl-2.0.rtf	2019-04-11 20:55:56 +0000
@@ -0,0 +1,95 @@
+{\rtf1\ansi\ansicpg1252\uc1\deff0\deflang1033\deflangfe1033{\fonttbl{\f0\fcharset128 Tahoma;}{\f1\fcharset0 Tahoma;}}
+\f0{\colortbl;\red0\green0\blue0;}{\*\generator Wine Riched20 2.0.????;}\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone GNU GENERAL PUBLIC LICENSE}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone Version }{\cf1\fs24\ulnone 2}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone June }{\cf1\fs24\ulnone 1991}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone Copyright }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone C}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone 1989}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone 1991 }{\cf1\fs24\ulnone Free Software Foundation}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone Inc}{\cf1\fs24\ulnone .  }\line 
+{\cf1\fs24\ulnone 51 }{\cf1\fs24\ulnone Franklin Street}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone Fifth Floor}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone Boston}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone MA  }{\cf1\fs24\ulnone 02110}{\cf1\fs24\ulnone -}{\cf1\fs24\ulnone 1301}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone USA}\line 
+\line 
+{\cf1\fs24\ulnone Everyone is permitted to copy and distribute verbatim copies}\line 
+{\cf1\fs24\ulnone of this license document}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone but changing it is not allowed}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone Preamble}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone The licenses for most software are designed to take away your freedom to share and change it}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone By contrast}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone the GNU General Public License is intended to guarantee your}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone freedom to share and change free software}{\cf1\fs24\ulnone --}{\cf1\fs24\ulnone to make sure the software is free for all its users}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone This General Public License applies to most of the Free Software Foundation}{\cf1\fs24\ulnone '}{\cf1\fs24\ulnone s}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone software and to any other program whose authors commit to using it}{\cf1\fs24\ulnone . (}{\cf1\fs24\ulnone Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead}{\cf1\fs24\ulnone .)}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone You can apply it to your programs}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone too}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone When we speak of free software}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone we are referring to freedom}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone not price}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone Our General Public Licenses are designed to make sure that you have the freedom to distribute copies}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone of free software}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone and charge for this service if you wish}{\cf1\fs24\ulnone )}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone that you receive source code or can get it if you want it}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone that you can change the software or use pieces of it in}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone new free programs}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone and that you know you can do these things}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone To protect your rights}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone These restrictions translate to}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone certain responsibilities for you if you distribute copies of the software}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone or if you modify it}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone For example}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone if you distribute copies of such a program}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone whether gratis or for a fee}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone you must give the recipients all the rights that you have}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone You must make sure that they}{\cf1\fs24\ulnone ,}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone too}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone receive or can get the source code}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone And you must show them these terms so they know their rights}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone We protect your rights with two steps}{\cf1\fs24\ulnone : (}{\cf1\fs24\ulnone 1}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone copyright the software}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone 2}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone offer you this license which gives you legal permission to copy}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone distribute and}{\cf1\fs24\ulnone /}{\cf1\fs24\ulnone or modify the}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone software}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone Also}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone for each author}{\cf1\fs24\ulnone '}{\cf1\fs24\ulnone s protection and ours}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone we want to make certain that everyone understands that there is no warranty for this free software}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone If the software is modified}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone by someone else and passed on}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone we want its recipients to know that what they have is not the original}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone so that any problems introduced by others will not reflect on the}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone original authors}{\cf1\fs24\ulnone ' }{\cf1\fs24\ulnone reputations}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone Finally}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone any free program is threatened constantly by software patents}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone We wish to avoid the danger that redistributors of a free program will individually obtain patent}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone licenses}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone in effect making the program proprietary}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone To prevent this}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone we have made it clear that any patent must be licensed for everyone}{\cf1\fs24\ulnone '}{\cf1\fs24\ulnone s free use or not licensed at all}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone The precise terms and conditions for copying}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone distribution and modification follow}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone TERMS AND CONDITIONS FOR COPYING}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone DISTRIBUTION AND MODIFICATION}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 0}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone Public License}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone The }{\cf1\fs24\ulnone "}{\cf1\fs24\ulnone Program}{\cf1\fs24\ulnone "}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone below}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone refers to any such program or work}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and a }{\cf1\fs24\ulnone "}{\cf1\fs24\ulnone work based on the Program}{\cf1\fs24\ulnone " }{\cf1\fs24\ulnone means either the Program or any derivative work under copyright }{\cf1\fs24\ulnone law}{\cf1\fs24\ulnone :}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone that is to say}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone a work containing the Program or a portion of it}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone either verbatim or with modifications and}{\cf1\fs24\ulnone /}{\cf1\fs24\ulnone or translated into another language}{\cf1\fs24\ulnone . (}{\cf1\fs24\ulnone Hereinafter}{\cf1\fs24\ulnone ,}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone translation is included without limitation in the term}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone "}{\cf1\fs24\ulnone modification}{\cf1\fs24\ulnone ".) }{\cf1\fs24\ulnone Each licensee is addressed as }{\cf1\fs24\ulnone "}{\cf1\fs24\ulnone you}{\cf1\fs24\ulnone ".}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone Activities other than copying}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone distribution and modification are not covered by this License}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone they are outside its scope}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone The act of running the Program is not restricted}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone the output from the Program is covered only if its contents constitute a work based on the Program}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone independent of having been made by running the Program}{\cf1\fs24\ulnone ). }{\cf1\fs24\ulnone Whether that is}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone true depends on what the Program does}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 1}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone You may copy and distribute verbatim copies of the Program}{\cf1\fs24\ulnone '}{\cf1\fs24\ulnone s source code as you receive it}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone in any medium}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone provided that you conspicuously and appropriately publish on}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone each copy an appropriate copyright notice and disclaimer of warranty}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone keep intact all the notices that refer to this License and to the absence of any warranty}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone and give any}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone other recipients of the Program a copy of this License along with the Program}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone You may charge a fee for the physical act of transferring a copy}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and you may at your option offer warranty protection in exchange for a fee}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 2}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone You may modify your copy or copies of the Program or any portion of it}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone thus forming a work based on the Program}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and copy and distribute such modifications or work under}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone the terms of Section}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone 1 }{\cf1\fs24\ulnone above}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone provided that you also meet all of these conditions}{\cf1\fs24\ulnone :}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa0\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi360\ri0\sa0\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone a}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa0\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi360\ri0\sa0\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone b}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone You must cause any work that you distribute or publish}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone that in whole or in part contains or is derived from the Program or any part thereof}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone to be licensed as a whole}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone at no charge to all third parties under the terms of this License}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa0\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi360\ri0\sa0\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone c}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone If the modified program normally reads commands interactively when run}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone you must cause it}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone when started running for such interactive use in the most ordinary way}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone to}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone print or display an announcement including an appropriate copyright notice and a notice that there is no warranty}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone or else}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone saying that you provide a warranty}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone and that}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone users may redistribute the program under these conditions}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and telling the user how to view a copy of this License}{\cf1\fs24\ulnone . (}{\cf1\fs24\ulnone Exception}{\cf1\fs24\ulnone : }{\cf1\fs24\ulnone if the Program itself is interactive but}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone does not normally print such an announcement}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone your work based on the Program is not required to print an announcement}{\cf1\fs24\ulnone .)}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone These requirements apply to the modified work as a whole}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone If identifiable sections of that work are not derived from the Program}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and can be reasonably considered independent}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone and separate works in themselves}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone then this License}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and its terms}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone do not apply to those sections when you distribute them as separate works}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone But when you distribute the same}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone sections as part of a whole which is a work based on the Program}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone the distribution of the whole must be on the terms of this License}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone whose permissions for other licensees}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone extend to the entire whole}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and thus to each and every part regardless of who wrote it}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone Thus}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone it is not the intent of this section to claim rights or contest your rights to work written entirely by you}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone rather}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone the intent is to exercise the right to control the}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone distribution of derivative or collective works based on the Program}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone In addition}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone mere aggregation of another work not based on the Program with the Program }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone or with a work based on the Program}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone on a volume of a storage or distribution medium}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone does not bring the other work under the scope of this License}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 3}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone You may copy and distribute the Program }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone or a work based on it}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone under Section }{\cf1\fs24\ulnone 2}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone in object code or executable form under the terms of Sections }{\cf1\fs24\ulnone 1 }{\cf1\fs24\ulnone and }{\cf1\fs24\ulnone 2 }{\cf1\fs24\ulnone above provided that}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone you also do one of the following}{\cf1\fs24\ulnone :}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa0\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi360\ri0\sa0\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone a}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone Accompany it with the complete corresponding machine}{\cf1\fs24\ulnone -}{\cf1\fs24\ulnone readable source code}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone which must be distributed under the terms of Sections }{\cf1\fs24\ulnone 1 }{\cf1\fs24\ulnone and }{\cf1\fs24\ulnone 2 }{\cf1\fs24\ulnone above on a medium customarily}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone used for software interchange}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone or}{\cf1\fs24\ulnone ,}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa0\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi360\ri0\sa0\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone b}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone Accompany it with a written offer}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone valid for at least three years}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone to give any third party}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone for a charge no more than your cost of physically performing source}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone distribution}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone a complete machine}{\cf1\fs24\ulnone -}{\cf1\fs24\ulnone readable copy of the corresponding source code}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone to be distributed under the terms of Sections }{\cf1\fs24\ulnone 1 }{\cf1\fs24\ulnone and }{\cf1\fs24\ulnone 2 }{\cf1\fs24\ulnone above on a medium customarily used}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone for software interchange}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone or}{\cf1\fs24\ulnone ,}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa0\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi360\ri0\sa0\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone c}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone Accompany it with the information you received as to the offer to distribute corresponding source code}{\cf1\fs24\ulnone . (}{\cf1\fs24\ulnone This alternative is allowed only for noncommercial distribution}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone and only if you received the program in object code or executable form with such an offer}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone in accord with Subsection b above}{\cf1\fs24\ulnone .)}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone The source code for a work means the preferred form of the work for making modifications to it}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone For an executable work}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone complete source code means all the source code for}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone all modules it contains}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone plus any associated interface definition files}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone plus the scripts used to control compilation and installation of the executable}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone However}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone as a special}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone exception}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone the source code distributed need not include anything that is normally distributed }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone in either source or binary form}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone with the major components }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone compiler}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone kernel}{\cf1\fs24\ulnone ,}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone and so on}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone of the operating system on which the executable runs}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone unless that component itself accompanies the executable}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone If distribution of executable or object code is made by offering access to copy from a designated place}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone then offering equivalent access to copy the source code from the}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone same place counts as distribution of the source code}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone even though third parties are not compelled to copy the source along with the object code}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 4}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone You may not copy}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone modify}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone sublicense}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone or distribute the Program except as expressly provided under this License}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone Any attempt otherwise to copy}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone modify}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone sublicense or}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone distribute the Program is void}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and will automatically terminate your rights under this License}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone However}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone parties who have received copies}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone or rights}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone from you under this}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone License will not have their licenses terminated so long as such parties remain in full compliance}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 5}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone You are not required to accept this License}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone since you have not signed it}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone However}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone nothing else grants you permission to modify or distribute the Program or its}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone derivative works}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone These actions are prohibited by law if you do not accept this License}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone Therefore}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone by modifying or distributing the Program }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone or any work based on the }{\cf1\fs24\ulnone Program}{\cf1\fs24\ulnone )}{\cf1\fs24\ulnone ,}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone you indicate your acceptance of this License to do so}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and all its terms and conditions for copying}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone distributing or modifying the Program or works based on it}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 6}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone Each time you redistribute the Program }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone or any work based on the Program}{\cf1\fs24\ulnone )}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone the recipient automatically receives a license from the original licensor to copy}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone distribute}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone or modify the Program subject to these terms and conditions}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone You may not impose any further restrictions on the recipients}{\cf1\fs24\ulnone ' }{\cf1\fs24\ulnone exercise of the rights granted herein}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone You are}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone not responsible for enforcing compliance by third parties to this License}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 7}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone If}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone as a consequence of a court judgment or allegation of patent infringement or for any other reason }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone not limited to patent issues}{\cf1\fs24\ulnone )}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone conditions are imposed on you}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone whether by court order}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone agreement or otherwise}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone that contradict the conditions of this License}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone they do not excuse you from the conditions of this License}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone If you cannot}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone then as a consequence you may not distribute the Program at}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone all}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone For example}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone if a patent license would not permit royalty}{\cf1\fs24\ulnone -}{\cf1\fs24\ulnone free redistribution of the Program by all those who receive copies directly or indirectly through you}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone then the}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone If any portion of this section is held invalid or unenforceable under any particular circumstance}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone the balance of the section is intended to apply and the section as a whole}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone is intended to apply in other circumstances}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone this section has the}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone sole purpose of protecting the integrity of the free software distribution system}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone which is implemented by public license practices}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone Many people have made generous}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone contributions to the wide range of software distributed through that system in reliance on consistent application of that system}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone it is up to the author}{\cf1\fs24\ulnone /}{\cf1\fs24\ulnone donor to decide if he}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone or she is willing to distribute software through any other system and a licensee cannot impose that choice}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 8}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone If the distribution and}{\cf1\fs24\ulnone /}{\cf1\fs24\ulnone or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone the original copyright holder who places}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone the Program under this License may add an explicit geographical distribution limitation excluding those countries}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone so that distribution is permitted only in or among}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone countries not thus excluded}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone In such case}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone this License incorporates the limitation as if written in the body of this License}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 9}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone The Free Software Foundation may publish revised and}{\cf1\fs24\ulnone /}{\cf1\fs24\ulnone or new versions of the General Public License from time to time}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone Such new versions will be similar in spirit to the}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone present version}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone but may differ in detail to address new problems or concerns}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone Each version is given a distinguishing version number}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone If the Program specifies a version number of this License which applies to it and }{\cf1\fs24\ulnone "}{\cf1\fs24\ulnone any later version}{\cf1\fs24\ulnone "}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone you have the}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone If the Program does not specify a}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone version number of this License}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone you may choose any version ever published by the Free Software Foundation}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 10}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone write to the author to ask for permission}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone For}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone software which is copyrighted by the Free Software Foundation}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone write to the Free Software Foundation}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone we sometimes make exceptions for this}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone Our decision will be guided by}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone NO WARRANTY}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 11}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone THERE IS NO WARRANTY FOR THE PROGRAM}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone TO THE EXTENT PERMITTED BY APPLICABLE LAW}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone EXCEPT WHEN OTHERWISE STATED IN WRITING THE}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone COPYRIGHT HOLDERS AND}{\cf1\fs24\ulnone /}{\cf1\fs24\ulnone OR OTHER PARTIES PROVIDE THE PROGRAM }{\cf1\fs24\ulnone "}{\cf1\fs24\ulnone AS IS}{\cf1\fs24\ulnone " }{\cf1\fs24\ulnone WITHOUT WARRANTY OF ANY KIND}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone EITHER EXPRESSED OR IMPLIED}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone INCLUDING}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone BUT NOT LIMITED TO}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone THE IMPLIED WARRANTIES}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone SHOULD THE PROGRAM PROVE DEFECTIVE}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone YOU}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone ASSUME THE COST OF ALL NECESSARY SERVICING}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone REPAIR OR CORRECTION}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone 12}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone OR ANY OTHER PARTY WHO MAY MODIFY AND}{\cf1\fs24\ulnone /}{\cf1\fs24\ulnone OR REDISTRIBUTE THE PROGRAM AS PERMITTED}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone ABOVE}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone BE LIABLE TO YOU FOR DAMAGES}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone INCLUDING ANY GENERAL}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone SPECIAL}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone INCLUDING BUT NOT}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS}{\cf1\fs24\ulnone )}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone EVEN IF SUCH}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone END OF TERMS AND CONDITIONS}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone How to Apply These Terms to Your New Programs}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone If you develop a new program}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and you want it to be of the greatest possible use to the public}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone the best way to achieve this is to make it free software which everyone can}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone redistribute and change under these terms}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone To do so}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone attach the following notices to the program}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone and}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone each file should have at least the}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone "}{\cf1\fs24\ulnone copyright}{\cf1\fs24\ulnone " }{\cf1\fs24\ulnone line and a pointer to where the full notice is found}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone one line to give the program}{\cf1\fs24\ulnone '}{\cf1\fs24\ulnone s name and an idea of what it does}{\cf1\fs24\ulnone .}\line 
+{\cf1\fs24\ulnone Copyright }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone C}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone yyyy  name of author}\line 
+\line 
+{\cf1\fs24\ulnone This program is free software}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone you can redistribute it and}{\cf1\fs24\ulnone /}{\cf1\fs24\ulnone or modify it under the terms of the GNU General Public License as published by the Free Software Foundation}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone either}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone version}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone 2 }{\cf1\fs24\ulnone of the License}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone or }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone at your option}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone any later version}{\cf1\fs24\ulnone .}\line 
+\line 
+{\cf1\fs24\ulnone This program is distributed in the hope that it will be useful}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone but WITHOUT ANY WARRANTY}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone PURPOSE}{\cf1\fs24\ulnone .  }{\cf1\fs24\ulnone See the GNU General Public License for more details}{\cf1\fs24\ulnone .}\line 
+\line 
+{\cf1\fs24\ulnone You should have received a copy of the GNU General Public License along with this program}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone if not}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone write to the Free Software Foundation}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone Inc}{\cf1\fs24\ulnone .}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone 51 }{\cf1\fs24\ulnone Franklin Street}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone Fifth }{\cf1\fs24\ulnone Floor}{\cf1\fs24\ulnone ,}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone Boston}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone MA  }{\cf1\fs24\ulnone 02110}{\cf1\fs24\ulnone -}{\cf1\fs24\ulnone 1301}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone USA}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone Also add information on how to contact you by electronic and paper mail}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone If the program is interactive}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone make it output a short notice like this when it starts in an interactive mode}{\cf1\fs24\ulnone :}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone Gnomovision version }{\cf1\fs24\ulnone 69}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone Copyright }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone C}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone year name of author}\line 
+{\cf1\fs24\ulnone Gnomovision comes with ABSOLUTELY NO WARRANTY}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone for details}\line 
+{\cf1\fs24\ulnone type }{\cf1\fs24\ulnone `}{\cf1\fs24\ulnone show w}{\cf1\fs24\ulnone '}{\cf1\fs24\ulnone .  }{\cf1\fs24\ulnone This is free software}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone and you are welcome}\line 
+{\cf1\fs24\ulnone to redistribute it under certain conditions}{\cf1\fs24\ulnone ; }{\cf1\fs24\ulnone type }{\cf1\fs24\ulnone `}{\cf1\fs24\ulnone show c}{\cf1\fs24\ulnone ' }\line 
+{\cf1\fs24\ulnone for details}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone The hypothetical commands }{\cf1\fs24\ulnone `}{\cf1\fs24\ulnone show w}{\cf1\fs24\ulnone ' }{\cf1\fs24\ulnone and }{\cf1\fs24\ulnone `}{\cf1\fs24\ulnone show c}{\cf1\fs24\ulnone ' }{\cf1\fs24\ulnone should show the appropriate parts of the General Public License}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone Of course}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone the commands you use may be called something}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone other than}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone `}{\cf1\fs24\ulnone show w}{\cf1\fs24\ulnone ' }{\cf1\fs24\ulnone and }{\cf1\fs24\ulnone `}{\cf1\fs24\ulnone show c}{\cf1\fs24\ulnone '; }{\cf1\fs24\ulnone they could even be mouse}{\cf1\fs24\ulnone -}{\cf1\fs24\ulnone clicks or menu items}{\cf1\fs24\ulnone --}{\cf1\fs24\ulnone whatever suits your program}{\cf1\fs24\ulnone .}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone You should also get your employer }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone if you work as a programmer}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone or your school}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone if any}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone to sign a }{\cf1\fs24\ulnone "}{\cf1\fs24\ulnone copyright disclaimer}{\cf1\fs24\ulnone " }{\cf1\fs24\ulnone for the program}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone if necessary}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone Here is a sample}{\cf1\fs24\ulnone ;}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone alter the names}{\cf1\fs24\ulnone :}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone Yoyodyne}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone Inc}{\cf1\fs24\ulnone .}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone hereby disclaims all copyright interest in the program }{\cf1\fs24\ulnone `}{\cf1\fs24\ulnone Gnomovision}{\cf1\fs24\ulnone ' }{\cf1\fs24\ulnone (}{\cf1\fs24\ulnone which makes passes at compilers}{\cf1\fs24\ulnone ) }{\cf1\fs24\ulnone written by James Hacker}{\cf1\fs24\ulnone .}\line 
+\line 
+{\cf1\fs24\ulnone signature of Ty Coon}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone 1 }{\cf1\fs24\ulnone April }{\cf1\fs24\ulnone 1989}\line 
+{\cf1\fs24\ulnone Ty Coon}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone President of Vice}
+\par\pard\sl-240\slmult1\nowidctlpar\li0\fi0\ri0\sa180\sb0\s-1\cfpat0\cbpat0{\cf1\fs24\ulnone This General Public License does not permit incorporating your program into proprietary programs}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone If your program is a subroutine library}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone you may consider it more useful to}{\cf1\fs24\ulnone  }{\cf1\fs24\ulnone permit linking proprietary applications with the library}{\cf1\fs24\ulnone . }{\cf1\fs24\ulnone If this is what you want to do}{\cf1\fs24\ulnone , }{\cf1\fs24\ulnone use the  instead of this License}{\cf1\fs24\ulnone .}
+\par}
\ No newline at end of file

=== removed file 'windows/psvince.dll'
Binary files windows/psvince.dll	2012-06-09 19:02:47 +0000 and windows/psvince.dll	1970-01-01 00:00:00 +0000 differ

Follow ups