summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian2016-04-25 12:01:08 +0200
committerSebastian2016-04-25 12:01:08 +0200
commit5acda3eaeabae9045609539303a8c12c4ce401f1 (patch)
tree7e71975f8570b05aafe2ea6ec0e242a8912387bb
parentinitial commit (diff)
downloadmltk-5acda3eaeabae9045609539303a8c12c4ce401f1.tar.gz
mltk-5acda3eaeabae9045609539303a8c12c4ce401f1.tar.xz
mltk-5acda3eaeabae9045609539303a8c12c4ce401f1.zip
merge with latest dev version
-rw-r--r--.gitignore18
-rw-r--r--core/README.remote (renamed from remote/README.remote)0
-rwxr-xr-xcore/bin/setup_target618
-rw-r--r--core/includes/binutil.inc222
-rw-r--r--core/includes/chroot.inc248
-rw-r--r--core/includes/clean_module_funcs.inc23
-rw-r--r--core/includes/cleanup.inc34
-rw-r--r--core/includes/distribution.inc53
-rw-r--r--core/includes/downloader.inc80
-rw-r--r--core/includes/helper/README.helper2
-rw-r--r--core/includes/helper/distribution.inc4
-rw-r--r--core/includes/helper/fileutil.inc39
-rw-r--r--core/includes/helper/logging.inc53
-rw-r--r--core/includes/helper/string.inc31
-rw-r--r--core/includes/kernel.inc218
-rw-r--r--core/includes/keyvalueutil.inc32
-rw-r--r--core/includes/packagemanager.inc187
-rw-r--r--core/includes/paths.inc31
-rw-r--r--core/includes/qt.inc30
-rw-r--r--core/includes/system.inc37
-rw-r--r--core/includes/useradd.inc238
-rw-r--r--core/includes/versioncompare.inc61
-rw-r--r--core/modules/alsa/data/etc/systemd/system/alsa-default-card.service11
l---------core/modules/alsa/data/etc/systemd/system/multi-user.target.wants/alsa-default-card.service1
-rwxr-xr-xcore/modules/alsa/data/opt/openslx/scripts/alsa-default_card42
-rw-r--r--core/modules/alsa/module.build19
-rw-r--r--core/modules/alsa/module.conf8
-rw-r--r--core/modules/alsa/module.conf.debian10
-rw-r--r--core/modules/alsa/module.conf.fedora13
-rw-r--r--core/modules/alsa/module.conf.opensuse10
-rw-r--r--core/modules/alsa/module.conf.scientific12
-rw-r--r--core/modules/alsa/module.conf.ubuntu7
-rw-r--r--core/modules/alsa/module.conf.ubuntu.126
-rwxr-xr-xcore/modules/beamergui/data/etc/X11/Xsession.d/98-modesetter-wrapper5
-rwxr-xr-xcore/modules/beamergui/data/etc/X11/Xsession.d/99-beamergui-starter_script2
-rwxr-xr-xcore/modules/beamergui/data/opt/openslx/scripts/beamergui-mode_setter165
-rwxr-xr-xcore/modules/beamergui/data/opt/openslx/vmchooser/sessionstart.d/99-kill_beamergui3
-rw-r--r--core/modules/beamergui/module.build27
-rw-r--r--core/modules/beamergui/module.conf9
-rw-r--r--core/modules/beamergui/module.conf.debian8
-rw-r--r--core/modules/beamergui/module.conf.fedora8
-rw-r--r--core/modules/beamergui/module.conf.opensuse8
-rw-r--r--core/modules/beamergui/module.conf.ubuntu8
-rw-r--r--core/modules/brazilian/data/etc/X11/xorg.conf.d/90-keytable.conf5
-rw-r--r--core/modules/brazilian/data/etc/default/locale1
-rw-r--r--core/modules/brazilian/data/etc/systemd/system/basic.target.wants/load-brazilian-keymap.service10
-rw-r--r--core/modules/brazilian/data/etc/systemd/system/load-brazilian-keymap.service10
-rw-r--r--core/modules/brazilian/data/opt/openslx/keymaps/brazilian_qwerty_compose_keyboard_translation.map8568
-rw-r--r--core/modules/brazilian/data/opt/openslx/keymaps/brazilian_qwerty_keyboard_translation.map8500
-rwxr-xr-xcore/modules/brazilian/data/opt/openslx/scripts/systemd-load_brazilian_keymaps22
-rw-r--r--core/modules/brazilian/module.build40
-rw-r--r--core/modules/brazilian/module.conf5
-rw-r--r--core/modules/brazilian/module.conf.debian10
-rw-r--r--core/modules/brazilian/module.conf.opensuse13
-rw-r--r--core/modules/brazilian/module.conf.scientific8
-rw-r--r--core/modules/brazilian/module.conf.ubuntu12
-rw-r--r--core/modules/busybox/fbsplash-center.patch85
-rw-r--r--core/modules/busybox/fbsplash-fillbg.patch74
-rw-r--r--core/modules/busybox/module.build30
-rw-r--r--core/modules/busybox/module.conf7
-rw-r--r--core/modules/busybox/module.conf.centos4
-rw-r--r--core/modules/busybox/openslx-busybox-config1038
-rw-r--r--core/modules/consolekit/TODO1
l---------core/modules/consolekit/data/etc/systemd/system/basic.target.wants/console-kit-daemon.service1
-rw-r--r--core/modules/consolekit/data/etc/systemd/system/console-kit-daemon.service8
-rw-r--r--core/modules/consolekit/data/usr/share/dbus-1/system-services/org.freedesktop.ConsoleKit.service6
-rw-r--r--core/modules/consolekit/module.build28
-rw-r--r--core/modules/consolekit/module.conf17
-rw-r--r--core/modules/consolekit/module.conf.debian6
-rw-r--r--core/modules/consolekit/module.conf.opensuse8
-rw-r--r--core/modules/consolekit/module.conf.ubuntu9
-rw-r--r--core/modules/consolekit/templates/consolekit.dbus.service6
-rw-r--r--core/modules/consolekit/templates/consolekit.systemd.service9
l---------core/modules/cpugovernor/data/etc/systemd/system/basic.target.wants/cpu-governor.service1
-rw-r--r--core/modules/cpugovernor/data/etc/systemd/system/cpu-governor.service6
-rwxr-xr-xcore/modules/cpugovernor/data/opt/openslx/scripts/systemd-cpu_governor62
-rw-r--r--core/modules/cpugovernor/module.build11
-rw-r--r--core/modules/cpugovernor/module.conf3
-rw-r--r--core/modules/cron/data/etc/cron.d/.placeholder2
-rw-r--r--core/modules/cron/data/etc/systemd/system/cron.service10
l---------core/modules/cron/data/etc/systemd/system/multi-user.target.wants/cron.service1
-rwxr-xr-xcore/modules/cron/data/opt/openslx/scripts/cron-sendmail30
-rw-r--r--core/modules/cron/module.build32
-rw-r--r--core/modules/cron/module.conf5
-rw-r--r--core/modules/cups/data/etc/cups/cupsd.conf143
-rw-r--r--core/modules/cups/data/etc/systemd/system/cups.service9
l---------core/modules/cups/data/etc/systemd/system/network.target.wants/cups.service1
-rw-r--r--core/modules/cups/module.build24
-rw-r--r--core/modules/cups/module.conf13
-rw-r--r--core/modules/cups/module.conf.debian10
-rw-r--r--core/modules/cups/module.conf.fedora12
-rw-r--r--core/modules/cups/module.conf.opensuse12
-rw-r--r--core/modules/cups/module.conf.opensuse.13.212
-rw-r--r--core/modules/cups/module.conf.ubuntu10
-rw-r--r--core/modules/cups/module.conf.ubuntu.1216
-rw-r--r--core/modules/cups/module.conf.ubuntu.1312
-rw-r--r--core/modules/cups/module.conf.ubuntu.13.1012
-rw-r--r--core/modules/cups/module.conf.ubuntu.1418
-rw-r--r--core/modules/cups/module.conf.ubuntu.1618
-rw-r--r--core/modules/dbus/data/etc/dbus-1/system.d/99-nsa-prism-module.conf14
-rw-r--r--core/modules/dbus/data/etc/systemd/system/dbus.socket5
l---------core/modules/dbus/data/etc/systemd/system/multi-user.target.wants/dbus.service1
l---------core/modules/dbus/data/etc/systemd/system/sockets.target.wants/dbus.socket1
-rw-r--r--core/modules/dbus/module.build65
-rw-r--r--core/modules/dbus/module.conf16
-rw-r--r--core/modules/dbus/module.conf.centos4
-rw-r--r--core/modules/dbus/module.conf.debian9
-rw-r--r--core/modules/dbus/module.conf.fedora4
-rw-r--r--core/modules/dbus/module.conf.opensuse4
-rw-r--r--core/modules/dbus/module.conf.ubuntu7
-rw-r--r--core/modules/dbus/module.conf.ubuntu.169
-rw-r--r--core/modules/dbus/templates/dbus.service13
-rwxr-xr-xcore/modules/debug/data/addon-init4
-rw-r--r--core/modules/debug/data/etc/systemd/system/debug-udevd_logger.service8
l---------core/modules/debug/data/etc/systemd/system/sysinit.target.wants/debug-udevd_logger.service1
-rwxr-xr-xcore/modules/debug/data/opt/openslx/bin/debug_report98
-rwxr-xr-xcore/modules/debug/data/opt/openslx/scripts/systemd-debug_udevd_logger2
-rw-r--r--core/modules/debug/module.build20
-rw-r--r--core/modules/debug/module.conf18
-rw-r--r--core/modules/debug/module.conf.debian7
-rw-r--r--core/modules/debug/module.conf.opensuse11
-rw-r--r--core/modules/debug/module.conf.ubuntu7
-rw-r--r--core/modules/dhcpc-busybox/README7
l---------core/modules/dhcpc-busybox/data/etc/systemd/system/dhcpc@.service1
-rw-r--r--core/modules/dhcpc-busybox/data/etc/systemd/system/udhcpc@.service10
-rw-r--r--core/modules/dhcpc-busybox/data/etc/tmpfiles.d/udhcpc.conf1
-rwxr-xr-xcore/modules/dhcpc-busybox/data/opt/openslx/scripts/systemd-udhcpc++20
-rwxr-xr-xcore/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx254
-rw-r--r--core/modules/dhcpc-busybox/module.build13
-rw-r--r--core/modules/dhcpc-busybox/module.conf1
-rw-r--r--core/modules/dnbd3/TODO1
-rw-r--r--core/modules/dnbd3/data/etc/fuse.conf8
-rw-r--r--core/modules/dnbd3/data/etc/systemd/system/setup-dnbd3.service11
l---------core/modules/dnbd3/data/etc/systemd/system/sysinit.target.wants/setup-dnbd3.service1
-rw-r--r--core/modules/dnbd3/data/etc/udev/rules.d/90-dnbd3.rules1
-rw-r--r--core/modules/dnbd3/data/opt/openslx/scripts/pam_script_auth.d/10-fuse6
-rwxr-xr-xcore/modules/dnbd3/data/opt/openslx/scripts/systemd-setup_dnbd316
-rw-r--r--core/modules/dnbd3/module.build45
-rw-r--r--core/modules/dnbd3/module.conf10
-rw-r--r--core/modules/dnbd3/module.conf.debian8
-rw-r--r--core/modules/dnbd3/module.conf.opensuse8
-rw-r--r--core/modules/dnbd3/module.conf.ubuntu9
-rwxr-xr-xcore/modules/firefox/data/opt/openslx/scripts/firefox-session6
-rwxr-xr-xcore/modules/firefox/data/usr/share/xsessions/firefox.desktop6
-rw-r--r--core/modules/firefox/module.build15
-rw-r--r--core/modules/firefox/module.conf6
-rw-r--r--core/modules/firefox/module.conf.ubuntu2
-rwxr-xr-xcore/modules/gdisk/data/inc/prepare_localhd.functions163
-rwxr-xr-xcore/modules/gdisk/data/inc/setup_gpt.differentapproach157
-rwxr-xr-xcore/modules/gdisk/data/inc/setup_gpt.old160
-rw-r--r--core/modules/gdisk/module.build19
-rw-r--r--core/modules/gdisk/module.conf94
-rw-r--r--core/modules/gdisk/module.conf.centos5
-rw-r--r--core/modules/german/data/etc/X11/xorg.conf.d/90-keytable.conf6
-rw-r--r--core/modules/german/data/etc/default/locale1
l---------core/modules/german/data/etc/systemd/system/basic.target.wants/load-german-keymap.service1
-rw-r--r--core/modules/german/data/etc/systemd/system/load-german-keymap.service10
-rw-r--r--core/modules/german/data/opt/openslx/keymaps/german_qwertz_compose_keyboard_translation.map967
-rw-r--r--core/modules/german/data/opt/openslx/keymaps/german_qwertz_keyboard_translation.map809
-rwxr-xr-xcore/modules/german/data/opt/openslx/scripts/systemd-load_german_keymaps22
-rw-r--r--core/modules/german/module.build39
-rw-r--r--core/modules/german/module.conf5
-rw-r--r--core/modules/german/module.conf.debian10
-rw-r--r--core/modules/german/module.conf.opensuse13
-rw-r--r--core/modules/german/module.conf.scientific8
-rw-r--r--core/modules/german/module.conf.ubuntu11
-rw-r--r--core/modules/hardware-stats/data/etc/systemd/system/hardware-stats.service11
l---------core/modules/hardware-stats/data/etc/systemd/system/multi-user.target.wants/hardware-stats.service1
-rw-r--r--core/modules/hardware-stats/data/etc/systemd/system/shutdown-usage-log.service11
l---------core/modules/hardware-stats/data/etc/systemd/system/shutdown.target.wants/shutdown-usage-log.service1
-rwxr-xr-xcore/modules/hardware-stats/data/opt/openslx/scripts/cron-system_usage_update25
l---------core/modules/hardware-stats/data/opt/openslx/scripts/pam_script_ses_close.d/usage_stats1
-rw-r--r--core/modules/hardware-stats/data/opt/openslx/scripts/pam_script_ses_open.d/usage_stats8
-rwxr-xr-xcore/modules/hardware-stats/data/opt/openslx/scripts/shutdown-system_usage_update12
-rwxr-xr-xcore/modules/hardware-stats/data/opt/openslx/scripts/systemd-hardware_stats211
-rw-r--r--core/modules/hardware-stats/module.build17
-rw-r--r--core/modules/hardware-stats/module.conf6
-rw-r--r--core/modules/hardware-stats/module.conf.ubuntu12
-rw-r--r--core/modules/idleaction/data/etc/cron.d/openslx-idleaction7
-rwxr-xr-xcore/modules/idleaction/data/opt/openslx/scripts/idleaction-cron_script138
-rwxr-xr-xcore/modules/idleaction/data/opt/openslx/scripts/idleaction-scheduled_action77
-rw-r--r--core/modules/idleaction/module.build16
-rw-r--r--core/modules/idleaction/module.conf4
-rw-r--r--core/modules/idleaction/module.conf.centos6
-rw-r--r--core/modules/idleaction/module.conf.debian6
-rw-r--r--core/modules/idleaction/module.conf.fedora6
-rw-r--r--core/modules/idleaction/module.conf.opensuse6
-rw-r--r--core/modules/idleaction/module.conf.ubuntu6
-rw-r--r--core/modules/idleaction/xprintidle.c136
l---------core/modules/iptables-helper/data/etc/systemd/system/basic.target.wants/openslx-iptables.service1
-rw-r--r--core/modules/iptables-helper/data/etc/systemd/system/openslx-iptables.service6
-rwxr-xr-xcore/modules/iptables-helper/data/opt/openslx/iptables/iptables-reloader5
-rwxr-xr-xcore/modules/iptables-helper/data/opt/openslx/iptables/iptables-reloader-worker112
-rw-r--r--core/modules/iptables-helper/data/opt/openslx/iptables/rules.d/.placeholder1
-rw-r--r--core/modules/iptables-helper/module.build13
-rw-r--r--core/modules/iptables-helper/module.conf1
-rw-r--r--core/modules/kdm/data/etc/branding.svg22
l---------core/modules/kdm/data/etc/kde1
-rw-r--r--core/modules/kdm/data/etc/kde4/kdm/kdmrc52
l---------core/modules/kdm/data/etc/systemd/system/display-manager.service1
-rw-r--r--core/modules/kdm/data/etc/systemd/system/kdm.service10
-rw-r--r--core/modules/kdm/data/etc/tmpfiles.d/kdm.conf2
l---------core/modules/kdm/data/usr/share/config/kdm1
-rwxr-xr-xcore/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/KdmGreeterTheme.desktop8
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/color.pngbin0 -> 177 bytes
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/enter.pngbin0 -> 2642 bytes
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/enter_inactive.pngbin0 -> 2527 bytes
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/environment.pngbin0 -> 3215 bytes
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/main-runner.pngbin0 -> 153 bytes
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/openslx-logo-main.pngbin0 -> 69575 bytes
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/openslx-logo.pngbin0 -> 6770 bytes
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/sessions.pngbin0 -> 2653 bytes
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/sessions_inactive.pngbin0 -> 2529 bytes
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/system.pngbin0 -> 2639 bytes
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/system_inactive.pngbin0 -> 2532 bytes
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/theme.xml235
-rw-r--r--core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/welcome-time-shadowed.pngbin0 -> 1199 bytes
l---------core/modules/kdm/data/usr/share/kde4/config/kdm1
-rw-r--r--core/modules/kdm/data/var/lib/kdm/.placeholder1
-rw-r--r--core/modules/kdm/module.build19
-rw-r--r--core/modules/kdm/module.conf20
-rw-r--r--core/modules/kdm/module.conf.debian29
-rw-r--r--core/modules/kdm/module.conf.fedora26
-rw-r--r--core/modules/kdm/module.conf.opensuse10
-rw-r--r--core/modules/kdm/module.conf.scientific20
-rw-r--r--core/modules/kdm/module.conf.ubuntu29
-rw-r--r--core/modules/kdm/module.conf.ubuntu.1429
-rw-r--r--core/modules/kernel-system/TODO3
-rw-r--r--core/modules/kernel-system/module.build88
-rw-r--r--core/modules/kernel-system/module.conf3
-rw-r--r--core/modules/kernel-system/module.conf.fedora6
-rw-r--r--core/modules/kernel-system/module.conf.opensuse6
-rw-r--r--core/modules/kernel-system/module.conf.ubuntu7
-rwxr-xr-xcore/modules/kernel-system/patch-speaker6
-rw-r--r--core/modules/kernel-vanilla/module.build165
-rw-r--r--core/modules/kernel-vanilla/module.conf5
-rw-r--r--core/modules/kernel/.gitignore3
-rw-r--r--core/modules/kernel/module.build146
-rw-r--r--core/modules/kernel/module.conf3
-rw-r--r--core/modules/kernel/module.conf.centos3
-rw-r--r--core/modules/kernel/module.conf.fedora3
-rw-r--r--core/modules/kernel/module.conf.opensuse3
-rw-r--r--core/modules/kernel/module.conf.ubuntu2
-rw-r--r--core/modules/kernel/module.conf.ubuntu.13.042
-rw-r--r--core/modules/kernel/module.conf.ubuntu.14.042
-rwxr-xr-xcore/modules/kernel/patch-speaker6
-rw-r--r--core/modules/ldm-gtk-greeter/TODO1
-rw-r--r--core/modules/ldm-gtk-greeter/data/etc/fonts/fonts.conf151
-rw-r--r--core/modules/ldm-gtk-greeter/data/etc/lightdm/lightdm-gtk-greeter.conf19
-rw-r--r--core/modules/ldm-gtk-greeter/data/etc/lightdm/lightdm.conf125
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/backgrounds/warty-final-ubuntu.pngbin0 -> 710537 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttfbin0 -> 333616 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-BI.ttfbin0 -> 356980 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-C.ttfbin0 -> 350420 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-L.ttfbin0 -> 415552 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-LI.ttfbin0 -> 409608 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttfbin0 -> 353824 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-RI.ttfbin0 -> 386440 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-B.ttfbin0 -> 191400 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-BI.ttfbin0 -> 216208 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-R.ttfbin0 -> 205748 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-RI.ttfbin0 -> 210216 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/48x48/devices/computer.pngbin0 -> 3331 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/index.theme1662
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/scalable/apps/accessibility.svg8
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/scalable/apps/system-shutdown.svg8
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/banshee.rc23
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/chromium.rc39
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/ff.rc30
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/gedit.rc35
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/gnome-panel.rc118
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/gnome-terminal.rc52
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/arrow-down.pngbin0 -> 195 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/handle-h.pngbin0 -> 80 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/handle-v.pngbin0 -> 80 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-center-normal.pngbin0 -> 306 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-center-prelight.pngbin0 -> 212 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-center-pressed.pngbin0 -> 327 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-left-normal.pngbin0 -> 426 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-left-prelight.pngbin0 -> 368 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-left-pressed.pngbin0 -> 381 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-right-normal.pngbin0 -> 421 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-right-prelight.pngbin0 -> 369 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-right-pressed.pngbin0 -> 387 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel-button-active.pngbin0 -> 514 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel-button-hover.pngbin0 -> 346 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel-button-inactive.pngbin0 -> 285 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel.pngbin0 -> 166 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/nautilus.rc11
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/ubuntuone.rc49
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/gtkrc721
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/gnome-panel.css81
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/gnome-terminal.css114
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/nautilus.css81
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/unity.css38
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/scrollbar_handle.pngbin0 -> 104 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/scrollbar_handle_vertical.pngbin0 -> 104 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider.pngbin0 -> 605 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider_prelight.pngbin0 -> 610 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider_prelight_vertical.pngbin0 -> 585 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider_vertical.pngbin0 -> 560 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/gtk-widgets.css1885
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/gtk.css34
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/settings.ini3
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/index.theme12
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close.pngbin0 -> 885 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_focused_normal.pngbin0 -> 885 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_focused_prelight.pngbin0 -> 914 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_focused_pressed.pngbin0 -> 632 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused.pngbin0 -> 578 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused_over.pngbin0 -> 716 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused_prelight.pngbin0 -> 890 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused_pressed.pngbin0 -> 606 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize.pngbin0 -> 904 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_focused_normal.pngbin0 -> 904 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_focused_prelight.pngbin0 -> 884 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_focused_pressed.pngbin0 -> 567 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused.pngbin0 -> 560 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused_over.pngbin0 -> 671 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused_prelight.pngbin0 -> 884 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused_pressed.pngbin0 -> 565 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/menu.pngbin0 -> 441 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/menu_prelight.pngbin0 -> 414 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/metacity-theme-1.xml558
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize.pngbin0 -> 838 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_focused_normal.pngbin0 -> 838 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_focused_prelight.pngbin0 -> 797 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_focused_pressed.pngbin0 -> 511 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused.pngbin0 -> 504 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused_over.pngbin0 -> 663 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused_prelight.pngbin0 -> 797 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused_pressed.pngbin0 -> 511 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/trough_left.pngbin0 -> 207 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/trough_middle.pngbin0 -> 103 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/trough_right.pngbin0 -> 255 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize.pngbin0 -> 909 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_focused_normal.pngbin0 -> 909 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_focused_prelight.pngbin0 -> 881 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_focused_pressed.pngbin0 -> 565 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused.pngbin0 -> 560 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused_over.pngbin0 -> 677 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused_prelight.pngbin0 -> 881 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused_pressed.pngbin0 -> 565 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close.pngbin0 -> 833 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_focused_normal.pngbin0 -> 833 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_focused_prelight.pngbin0 -> 858 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_focused_pressed.pngbin0 -> 589 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_unfocused.pngbin0 -> 528 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_unfocused_prelight.pngbin0 -> 882 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_unfocused_pressed.pngbin0 -> 560 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize.pngbin0 -> 832 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_focused_normal.pngbin0 -> 832 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_focused_prelight.pngbin0 -> 919 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_focused_pressed.pngbin0 -> 519 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_unfocused.pngbin0 -> 511 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_unfocused_prelight.pngbin0 -> 834 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_unfocused_pressed.pngbin0 -> 521 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize.pngbin0 -> 841 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_focused_normal.pngbin0 -> 841 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_focused_prelight.pngbin0 -> 795 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_focused_pressed.pngbin0 -> 466 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_unfocused.pngbin0 -> 455 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_unfocused_prelight.pngbin0 -> 795 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_unfocused_pressed.pngbin0 -> 466 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize.pngbin0 -> 828 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_focused_normal.pngbin0 -> 828 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_focused_prelight.pngbin0 -> 833 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_focused_pressed.pngbin0 -> 521 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_unfocused.pngbin0 -> 508 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_unfocused_prelight.pngbin0 -> 833 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_unfocused_pressed.pngbin0 -> 521 bytes
-rw-r--r--core/modules/ldm-gtk-greeter/module.build34
-rw-r--r--core/modules/ldm-gtk-greeter/module.conf9
-rw-r--r--core/modules/ldm/TODO1
l---------core/modules/ldm/data/etc/systemd/system/graphical.target.wants/lightdm.service1
-rw-r--r--core/modules/ldm/data/etc/systemd/system/lightdm.service10
-rw-r--r--core/modules/ldm/module.build34
-rw-r--r--core/modules/ldm/module.conf8
-rw-r--r--core/modules/ncp/module.build26
-rw-r--r--core/modules/ncp/module.conf8
-rw-r--r--core/modules/ncp/module.conf.debian26
-rw-r--r--core/modules/ncp/module.conf.ubuntu17
-rw-r--r--core/modules/ncp/module.conf.ubuntu.1424
-rw-r--r--core/modules/netpoint-lightdm/data/etc/lightdm/lightdm.conf164
-rw-r--r--core/modules/netpoint-lightdm/data/etc/sysconfig/displaymanager113
-rw-r--r--core/modules/netpoint-lightdm/data/etc/sysconfig/windowmanager51
-rw-r--r--core/modules/netpoint-lightdm/data/usr/local/bin/guest-account3
-rwxr-xr-xcore/modules/netpoint-lightdm/data/usr/local/bin/guest-cleanup8
-rwxr-xr-xcore/modules/netpoint-lightdm/data/usr/local/bin/guest-session4
-rwxr-xr-xcore/modules/netpoint-lightdm/data/usr/local/bin/guest-setup25
-rwxr-xr-xcore/modules/netpoint-lightdm/data/usr/local/bin/netpoint.py215
-rw-r--r--core/modules/netpoint-lightdm/data/usr/local/share/lightdm/ff-google-smaller.pngbin0 -> 16703 bytes
-rw-r--r--core/modules/netpoint-lightdm/data/usr/local/share/lightdm/ff-rz-smaller.pngbin0 -> 72522 bytes
-rw-r--r--core/modules/netpoint-lightdm/data/usr/local/share/lightdm/netpoint.css16
-rw-r--r--core/modules/netpoint-lightdm/data/usr/local/share/lightdm/netpoint.glade365
-rw-r--r--core/modules/netpoint-lightdm/data/usr/local/share/xgreeters/netpoint.desktop5
-rw-r--r--core/modules/netpoint-lightdm/module.build15
-rw-r--r--core/modules/netpoint-lightdm/module.conf3
-rw-r--r--core/modules/netpoint-lightdm/module.conf.opensuse.13.236
-rw-r--r--core/modules/nscd/data/etc/nscd.conf80
l---------core/modules/nscd/data/etc/systemd/system/basic.target.wants/nscd.service1
-rw-r--r--core/modules/nscd/data/etc/systemd/system/nscd.service15
-rw-r--r--core/modules/nscd/data/etc/tmpfiles.d/nscd.conf1
-rw-r--r--core/modules/nscd/module.build17
-rw-r--r--core/modules/nscd/module.conf3
-rw-r--r--core/modules/nscd/module.conf.centos6
-rw-r--r--core/modules/nscd/module.conf.debian6
-rw-r--r--core/modules/nscd/module.conf.fedora6
-rw-r--r--core/modules/nscd/module.conf.opensuse6
-rw-r--r--core/modules/nscd/module.conf.ubuntu6
-rw-r--r--core/modules/nslcd/module.build42
-rw-r--r--core/modules/nslcd/module.conf6
-rw-r--r--core/modules/nslcd/module.conf.debian6
-rw-r--r--core/modules/nslcd/module.conf.ubuntu6
-rw-r--r--core/modules/nslcd/templates/nslcd-systemd.service8
-rw-r--r--core/modules/nvidia_kernel/module.build56
-rw-r--r--core/modules/nvidia_kernel/module.conf10
-rwxr-xr-xcore/modules/nvidia_libs/data/addon-init10
-rw-r--r--core/modules/nvidia_libs/module.build56
-rw-r--r--core/modules/nvidia_libs/module.conf17
-rw-r--r--core/modules/nvidia_libs/module.conf.ubuntu14
-rw-r--r--core/modules/openbox/data/etc/xdg/openbox/menu.xml29
-rw-r--r--core/modules/openbox/data/etc/xdg/openbox/rc.xml756
-rw-r--r--core/modules/openbox/data/etc/xdg/openbox/rc.xml.safe426
-rw-r--r--core/modules/openbox/data/usr/share/icons/hicolor/48x48/apps/openbox.pngbin0 -> 1528 bytes
-rw-r--r--core/modules/openbox/data/usr/share/xsessions/openbox.desktop9
-rw-r--r--core/modules/openbox/module.build36
-rw-r--r--core/modules/openbox/module.conf11
-rw-r--r--core/modules/openbox/module.conf.debian15
-rw-r--r--core/modules/openbox/module.conf.fedora11
-rw-r--r--core/modules/openbox/module.conf.opensuse13
-rw-r--r--core/modules/openbox/module.conf.ubuntu15
-rw-r--r--core/modules/openbox/module.conf.zypper11
-rw-r--r--core/modules/openstack/README25
-rw-r--r--core/modules/openstack/module.build11
-rw-r--r--core/modules/openstack/module.conf3
-rw-r--r--core/modules/openstack/module.conf.ubuntu.149
-rw-r--r--core/modules/pam-common-share/data/opt/openslx/scripts/pam_script_mount_common_share183
-rw-r--r--core/modules/pam-common-share/module.build11
-rw-r--r--core/modules/pam-common-share/module.conf3
-rw-r--r--core/modules/pam/TODO1
l---------core/modules/pam/data/etc/pam-script/pam_script_auth1
l---------core/modules/pam/data/etc/pam-script/pam_script_ses_close1
l---------core/modules/pam/data/etc/pam-script/pam_script_ses_open1
-rw-r--r--core/modules/pam/data/etc/pam.d/common-account25
-rw-r--r--core/modules/pam/data/etc/pam.d/common-auth25
-rw-r--r--core/modules/pam/data/etc/pam.d/common-password33
-rw-r--r--core/modules/pam/data/etc/pam.d/common-session33
-rw-r--r--core/modules/pam/data/etc/pam.d/common-session-noninteractive31
-rw-r--r--core/modules/pam/data/etc/pam.d/kdm10
-rw-r--r--core/modules/pam/data/etc/pam.d/kdm-np11
-rw-r--r--core/modules/pam/data/etc/pam.d/login101
-rw-r--r--core/modules/pam/data/etc/pam.d/other10
-rw-r--r--core/modules/pam/data/etc/pam.d/passwd6
-rw-r--r--core/modules/pam/data/etc/pam.d/sshd41
-rw-r--r--core/modules/pam/data/etc/pam.d/vmware-authd6
-rw-r--r--core/modules/pam/data/etc/pam.d/xdm6
-rw-r--r--core/modules/pam/data/etc/security/pam_env.conf73
-rw-r--r--core/modules/pam/data/etc/tmpfiles.d/pipefs.conf2
-rwxr-xr-xcore/modules/pam/data/opt/openslx/scripts/pam_script_auth146
-rwxr-xr-xcore/modules/pam/data/opt/openslx/scripts/pam_script_ses_close83
-rwxr-xr-xcore/modules/pam/data/opt/openslx/scripts/pam_script_ses_open25
-rw-r--r--core/modules/pam/module.build40
-rw-r--r--core/modules/pam/module.conf22
-rw-r--r--core/modules/pam/module.conf.centos36
-rw-r--r--core/modules/pam/module.conf.debian57
-rw-r--r--core/modules/pam/module.conf.fedora42
-rw-r--r--core/modules/pam/module.conf.opensuse44
-rw-r--r--core/modules/pam/module.conf.opensuse.13.148
-rw-r--r--core/modules/pam/module.conf.opensuse.13.248
-rw-r--r--core/modules/pam/module.conf.ubuntu47
-rw-r--r--core/modules/pam/module.conf.ubuntu.1441
-rw-r--r--core/modules/pam/module.conf.ubuntu.1642
-rw-r--r--core/modules/pam/sslconnect.c201
-rw-r--r--core/modules/plymouth/data/etc/systemd/system/plymouth-quit.service9
-rw-r--r--core/modules/plymouth/data/etc/tmpfiles.d/plymouth.conf2
-rw-r--r--core/modules/plymouth/module.build20
-rw-r--r--core/modules/plymouth/module.conf15
-rw-r--r--core/modules/plymouth/module.conf.debian7
-rw-r--r--core/modules/plymouth/module.conf.opensuse7
-rw-r--r--core/modules/plymouth/module.conf.ubuntu7
l---------core/modules/polkit/data/etc/systemd/system/basic.target.wants/polkit.service1
-rw-r--r--core/modules/polkit/module.build25
-rw-r--r--core/modules/polkit/module.conf13
-rw-r--r--core/modules/polkit/module.conf.debian19
-rw-r--r--core/modules/polkit/module.conf.fedora12
-rw-r--r--core/modules/polkit/module.conf.opensuse12
-rw-r--r--core/modules/polkit/module.conf.ubuntu19
-rw-r--r--core/modules/polkit/templates/dbus.service6
-rw-r--r--core/modules/polkit/templates/systemd.service8
l---------core/modules/printergui/data/etc/systemd/system/network.target.wants/printergui.service1
-rw-r--r--core/modules/printergui/data/etc/systemd/system/printergui.service8
-rwxr-xr-xcore/modules/printergui/data/opt/openslx/iptables/rules.d/50-lpd-redirect-and-fw8
-rwxr-xr-xcore/modules/printergui/data/opt/openslx/scripts/run-virt_print67
-rwxr-xr-xcore/modules/printergui/data/opt/openslx/scripts/systemd-printergui_preparation20
-rw-r--r--core/modules/printergui/module.build29
-rw-r--r--core/modules/printergui/module.conf7
-rw-r--r--core/modules/printergui/module.conf.debian7
-rw-r--r--core/modules/printergui/module.conf.fedora5
-rw-r--r--core/modules/printergui/module.conf.opensuse5
-rw-r--r--core/modules/printergui/module.conf.ubuntu5
-rwxr-xr-xcore/modules/pvs2/data/opt/openslx/scripts/setup-pvsmgr4
-rwxr-xr-xcore/modules/pvs2/data/opt/openslx/vmchooser/sessionstart.d/50-PVSclient26
-rwxr-xr-xcore/modules/pvs2/data/usr/share/xsessions/pvs2mgr.desktop7
-rw-r--r--core/modules/pvs2/module.build35
-rw-r--r--core/modules/pvs2/module.conf13
-rw-r--r--core/modules/pvs2/module.conf.debian6
-rw-r--r--core/modules/pvs2/module.conf.fedora6
-rw-r--r--core/modules/pvs2/module.conf.opensuse14
-rw-r--r--core/modules/pvs2/module.conf.ubuntu11
-rwxr-xr-xcore/modules/qemukvm/data/addon-init8
l---------core/modules/qemukvm/data/etc/systemd/system/graphical.target.wants/qemukvm.service1
-rw-r--r--core/modules/qemukvm/data/etc/systemd/system/qemukvm.service9
-rw-r--r--core/modules/qemukvm/data/opt/openslx/scripts/systemd-qemukvm_env33
-rw-r--r--core/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include245
-rw-r--r--core/modules/qemukvm/module.build16
-rw-r--r--core/modules/qemukvm/module.conf11
-rw-r--r--core/modules/qemukvm/module.conf.ubuntu37
-rw-r--r--core/modules/redsocks/data/etc/redsocks.conf56
l---------core/modules/redsocks/data/etc/systemd/system/basic.target.wants/setup-proxy.service1
-rw-r--r--core/modules/redsocks/data/etc/systemd/system/redsocks.service12
-rw-r--r--core/modules/redsocks/data/etc/systemd/system/setup-proxy.service9
-rwxr-xr-xcore/modules/redsocks/data/opt/openslx/scripts/systemd-setup_proxy65
-rw-r--r--core/modules/redsocks/module.build24
-rw-r--r--core/modules/redsocks/module.conf6
-rw-r--r--core/modules/redsocks/module.conf.debian3
-rw-r--r--core/modules/redsocks/module.conf.fedora3
-rw-r--r--core/modules/redsocks/module.conf.opensuse3
-rw-r--r--core/modules/redsocks/module.conf.ubuntu3
-rw-r--r--core/modules/rsyslogd/data/etc/rsyslog.conf84
-rw-r--r--core/modules/rsyslogd/module.build34
-rw-r--r--core/modules/rsyslogd/module.conf9
-rw-r--r--core/modules/rsyslogd/module.conf.centos3
-rw-r--r--core/modules/rsyslogd/module.conf.debian3
-rw-r--r--core/modules/rsyslogd/module.conf.fedora3
-rw-r--r--core/modules/rsyslogd/module.conf.opensuse6
-rw-r--r--core/modules/rsyslogd/module.conf.opensuse.13.29
-rw-r--r--core/modules/rsyslogd/module.conf.ubuntu4
-rwxr-xr-xcore/modules/run-virt/compile5
l---------core/modules/run-virt/data/etc/systemd/system/graphical.target.wants/run-virt-env.service1
-rw-r--r--core/modules/run-virt/data/etc/systemd/system/mount-vm-store.service10
l---------core/modules/run-virt/data/etc/systemd/system/network.target.wants/mount-vm-store.service1
-rw-r--r--core/modules/run-virt/data/etc/systemd/system/run-virt-env.service9
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/bin/clc.bash307
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/iptables/rules.d/50-virt-nat1-masquerading3
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc11
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_needed_files.inc53
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_xml_sanity_legacy.inc23
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc33
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc50
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc103
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables_legacy.inc120
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/print_runvirt_console_logo.inc12
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables.inc88
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables_legacy.inc89
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_variables.inc21
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc71
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/setup_printer_lpd.inc33
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc64
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/setup_virtual_floppy.inc21
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/setup_vm_hypervisor.inc19
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/start_pvs.inc11
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/start_windowmanager.inc20
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/usb_detector.inc77
-rw-r--r--core/modules/run-virt/data/opt/openslx/scripts/includes/vmchooser_runvirt_functions.inc48
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store39
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env184
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/scripts/vmchooser-clc475
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt116
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/scripts/vmchooser-xml_filter74
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/config/smb.conf38
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf54
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/config/vmchooser.conf4
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/SHARELWS.BAT40
-rw-r--r--core/modules/run-virt/data/opt/openslx/vmchooser/data/bootpgm.exebin0 -> 8704 bytes
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exebin0 -> 15360 bytes
-rwxr-xr-xcore/modules/run-virt/data/opt/openslx/xsessions/default.desktop10
-rw-r--r--core/modules/run-virt/module.build16
-rw-r--r--core/modules/run-virt/module.conf4
-rw-r--r--core/modules/run-virt/module.conf.ubuntu7
-rw-r--r--core/modules/run-virt/winres.c169
-rw-r--r--core/modules/safe-mode/data/etc/systemd/system/exam.service7
-rwxr-xr-xcore/modules/safe-mode/data/opt/openslx/scripts/systemd-safe_mode24
-rw-r--r--core/modules/safe-mode/module.build12
-rw-r--r--core/modules/safe-mode/module.conf3
-rw-r--r--core/modules/samba/module.build26
-rw-r--r--core/modules/samba/module.conf24
-rw-r--r--core/modules/samba/module.conf.opensuse24
-rw-r--r--core/modules/samba/module.conf.ubuntu20
-rw-r--r--core/modules/smartctl/data/etc/cron.d/openslx-smartctl8
l---------core/modules/smartctl/data/etc/systemd/system/basic.target.wants/smartctl.service1
-rw-r--r--core/modules/smartctl/data/etc/systemd/system/smartctl.service8
-rwxr-xr-xcore/modules/smartctl/data/opt/openslx/scripts/systemd-smartctl33
-rw-r--r--core/modules/smartctl/module.build13
-rw-r--r--core/modules/smartctl/module.conf5
-rw-r--r--core/modules/smartctl/module.conf.centos6
-rw-r--r--core/modules/smartctl/module.conf.debian6
-rw-r--r--core/modules/smartctl/module.conf.fedora6
-rw-r--r--core/modules/smartctl/module.conf.opensuse6
-rw-r--r--core/modules/smartctl/module.conf.ubuntu6
-rw-r--r--core/modules/smbclient/data/etc/tmpfiles.d/ensure-smbconf-exists.conf4
-rw-r--r--core/modules/smbclient/module.build21
-rw-r--r--core/modules/smbclient/module.conf10
-rw-r--r--core/modules/smbclient/module.conf.debian9
-rw-r--r--core/modules/smbclient/module.conf.fedora9
-rw-r--r--core/modules/smbclient/module.conf.opensuse9
-rw-r--r--core/modules/smbclient/module.conf.ubuntu9
-rw-r--r--core/modules/splash-openslx/README6
-rw-r--r--core/modules/splash-openslx/data/etc/splash.ppm.gzbin0 -> 11233 bytes
-rw-r--r--core/modules/splash-openslx/module.build13
-rw-r--r--core/modules/splash-openslx/module.conf1
l---------core/modules/ssh-auth-keys/data/etc/systemd/system/basic.target.wants/ssh-auth-keys.service1
-rw-r--r--core/modules/ssh-auth-keys/data/etc/systemd/system/ssh-auth-keys.service7
-rwxr-xr-xcore/modules/ssh-auth-keys/data/opt/openslx/scripts/systemd-ssh_auth_keys20
-rw-r--r--core/modules/ssh-auth-keys/module.build11
-rw-r--r--core/modules/ssh-auth-keys/module.conf3
-rw-r--r--core/modules/sshd/TODO3
-rw-r--r--core/modules/sshd/data/etc/issue.net6
-rw-r--r--core/modules/sshd/data/etc/ssh/ssh_host_dsa_key12
-rw-r--r--core/modules/sshd/data/etc/ssh/ssh_host_dsa_key.pub1
-rw-r--r--core/modules/sshd/data/etc/ssh/ssh_host_ecdsa_key6
-rw-r--r--core/modules/sshd/data/etc/ssh/ssh_host_ecdsa_key.pub1
-rw-r--r--core/modules/sshd/data/etc/ssh/ssh_host_rsa_key15
-rw-r--r--core/modules/sshd/data/etc/ssh/ssh_host_rsa_key.pub1
-rw-r--r--core/modules/sshd/data/etc/ssh/sshd_config92
-rw-r--r--core/modules/sshd/data/etc/systemd/system/sshd.service8
-rw-r--r--core/modules/sshd/data/etc/tmpfiles.d/sshd.conf3
-rw-r--r--core/modules/sshd/module.build20
-rw-r--r--core/modules/sshd/module.conf3
-rw-r--r--core/modules/sssd/module.build33
-rw-r--r--core/modules/sssd/module.conf18
-rw-r--r--core/modules/sssd/module.conf.opensuse.13.223
-rw-r--r--core/modules/sssd/module.conf.ubuntu14
-rw-r--r--core/modules/sssd/templates/sssd-systemd.service16
-rw-r--r--core/modules/swiss/data/etc/X11/xorg.conf.d/90-keytable.conf5
-rw-r--r--core/modules/swiss/data/etc/default/locale1
-rw-r--r--core/modules/swiss/data/etc/systemd/system/basic.target.wants/load-swiss-keymap.service10
-rw-r--r--core/modules/swiss/data/etc/systemd/system/load-swiss-keymap.service10
-rw-r--r--core/modules/swiss/data/opt/openslx/keymaps/compose.inc8
-rw-r--r--core/modules/swiss/data/opt/openslx/keymaps/german_qwertz_compose_keyboard_translation.map967
-rw-r--r--core/modules/swiss/data/opt/openslx/keymaps/german_qwertz_keyboard_translation.map809
-rw-r--r--core/modules/swiss/data/opt/openslx/keymaps/linux-keys-bare.inc163
-rw-r--r--core/modules/swiss/data/opt/openslx/keymaps/linux-with-alt-and-altgr.inc29
-rw-r--r--core/modules/swiss/data/opt/openslx/keymaps/qwertz-layout.inc31
-rw-r--r--core/modules/swiss/data/opt/openslx/keymaps/qwertz_de_CH-latin1.map16
-rw-r--r--core/modules/swiss/data/opt/openslx/keymaps/qwertz_fr_CH-latin1.map86
-rwxr-xr-xcore/modules/swiss/data/opt/openslx/scripts/systemd-load_swiss_keymaps13
-rw-r--r--core/modules/swiss/module.build55
-rw-r--r--core/modules/swiss/module.conf5
-rw-r--r--core/modules/swiss/module.conf.debian10
-rw-r--r--core/modules/swiss/module.conf.opensuse14
-rw-r--r--core/modules/swiss/module.conf.scientific8
-rw-r--r--core/modules/swiss/module.conf.ubuntu17
-rw-r--r--core/modules/systemd-distro/README12
-rw-r--r--core/modules/systemd-distro/TODO2
-rw-r--r--core/modules/systemd-distro/data/etc/systemd/system.conf49
-rw-r--r--core/modules/systemd-distro/data/etc/systemd/system/network-interface@.service9
-rw-r--r--core/modules/systemd-distro/data/etc/systemd/system/systemd-halt.service18
-rw-r--r--core/modules/systemd-distro/data/etc/systemd/system/systemd-poweroff.service18
-rw-r--r--core/modules/systemd-distro/data/etc/systemd/system/systemd-reboot.service18
-rwxr-xr-xcore/modules/systemd-distro/data/opt/openslx/scripts/systemd-shutdown_prescript50
-rwxr-xr-xcore/modules/systemd-distro/data/sbin/haltbin0 -> 357784 bytes
-rwxr-xr-xcore/modules/systemd-distro/data/sbin/initbin0 -> 1214408 bytes
-rwxr-xr-xcore/modules/systemd-distro/data/sbin/poweroffbin0 -> 357784 bytes
-rwxr-xr-xcore/modules/systemd-distro/data/sbin/rebootbin0 -> 357784 bytes
-rwxr-xr-xcore/modules/systemd-distro/data/sbin/runlevelbin0 -> 357784 bytes
-rwxr-xr-xcore/modules/systemd-distro/data/sbin/shutdownbin0 -> 357784 bytes
-rwxr-xr-xcore/modules/systemd-distro/data/sbin/telinitbin0 -> 357784 bytes
-rw-r--r--core/modules/systemd-distro/data/usr/lib/sysctl.d/50-default.conf39
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/autovt@.service49
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/basic.target14
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/bluetooth.target11
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/console-getty.service32
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/console-shell.service32
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/ctrl-alt-del.target17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/dbus-org.freedesktop.login1.service23
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/debug-shell.service33
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/default.target18
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/dev-hugepages.mount19
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/dev-mqueue.mount19
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/emergency.service31
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/emergency.target13
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/final.target13
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/getty.target11
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/getty@.service49
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/graphical.target18
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/halt-local.service20
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/halt.target17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/hibernate.target13
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/hybrid-sleep.target13
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/kexec.target17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target.wants/getty.target11
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target.wants/systemd-logind.service23
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target.wants/systemd-user-sessions.service17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/network-online.target11
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/network.target14
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/paths.target10
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/poweroff.target17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/printer.target11
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.automount18
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.mount17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/rc-local.service20
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/reboot.target17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/remote-fs.target3
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/serial-getty@.service36
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/shutdown.target12
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sigpwr.target10
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sleep.target13
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/smartcard.target11
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target10
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-journald.socket26
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-shutdownd.socket18
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-control.socket19
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-kernel.socket19
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sound.target11
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/suspend.target13
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/swap.target10
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sys-fs-fuse-connections.mount20
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sys-kernel-config.mount20
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target14
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/dev-hugepages.mount19
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/dev-mqueue.mount19
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/proc-sys-fs-binfmt_misc.automount18
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/sys-fs-fuse-connections.mount20
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/sys-kernel-config.mount20
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-binfmt.service26
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-journald.service26
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-modules-load.service27
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-sysctl.service26
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup-dev.service17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup.service23
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udev-trigger.service20
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udevd.service23
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-vconsole-setup.service20
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/syslog.socket40
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/system-update.target16
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-binfmt.service26
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-halt.service17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-hibernate.service17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-hybrid-sleep.service17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-journald.service26
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-journald.socket26
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-logind.service23
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-modules-load.service27
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-nspawn@.service18
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-poweroff.service17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-reboot.service17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-shutdownd.service15
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-shutdownd.socket18
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-suspend.service17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-sysctl.service26
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-tmpfiles-setup-dev.service17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-tmpfiles-setup.service23
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udev-settle.service31
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udev-trigger.service20
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udevd-control.socket19
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udevd-kernel.socket19
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udevd.service23
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-user-sessions.service17
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-vconsole-setup.service20
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/time-sync.target14
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/timers.target10
-rw-r--r--core/modules/systemd-distro/data/usr/lib/systemd/system/user@.service23
-rw-r--r--core/modules/systemd-distro/data/usr/lib/udev/rules.d/70-uaccess-floppy.rules8
-rw-r--r--core/modules/systemd-distro/data/usr/lib/udev/rules.d/99-systemd.rules56
-rw-r--r--core/modules/systemd-distro/module.build15
-rw-r--r--core/modules/systemd-distro/module.conf8
-rw-r--r--core/modules/systemd-distro/module.conf.centos7
-rw-r--r--core/modules/systemd-distro/module.conf.debian13
-rw-r--r--core/modules/systemd-distro/module.conf.fedora11
-rw-r--r--core/modules/systemd-distro/module.conf.opensuse10
-rw-r--r--core/modules/systemd-distro/module.conf.scientific37
-rw-r--r--core/modules/systemd-distro/module.conf.ubuntu12
-rw-r--r--core/modules/systemd-distro/module.conf.ubuntu.1471
-rw-r--r--core/modules/systemd-distro/module.conf.ubuntu.1671
-rw-r--r--core/modules/systemd/README12
-rw-r--r--core/modules/systemd/TODO2
-rw-r--r--core/modules/systemd/data/etc/systemd/system/network-interface@.service9
-rw-r--r--core/modules/systemd/data/etc/systemd/system/systemd-halt.service18
-rw-r--r--core/modules/systemd/data/etc/systemd/system/systemd-poweroff.service18
-rw-r--r--core/modules/systemd/data/etc/systemd/system/systemd-reboot.service18
-rwxr-xr-xcore/modules/systemd/data/opt/openslx/scripts/systemd-shutdown_prescript50
-rwxr-xr-xcore/modules/systemd/data/opt/openslx/scripts/tty-init23
l---------core/modules/systemd/data/sbin/halt1
l---------core/modules/systemd/data/sbin/init1
l---------core/modules/systemd/data/sbin/poweroff1
l---------core/modules/systemd/data/sbin/reboot1
l---------core/modules/systemd/data/sbin/runlevel1
l---------core/modules/systemd/data/sbin/shutdown1
l---------core/modules/systemd/data/sbin/telinit1
-rw-r--r--core/modules/systemd/data/usr/lib/sysctl.d/50-default.conf39
l---------core/modules/systemd/data/usr/lib/systemd/system/autovt@.service1
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/basic.target14
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/bluetooth.target11
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/console-getty.service32
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/console-shell.service32
l---------core/modules/systemd/data/usr/lib/systemd/system/ctrl-alt-del.target1
l---------core/modules/systemd/data/usr/lib/systemd/system/dbus-org.freedesktop.login1.service1
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/debug-shell.service33
l---------core/modules/systemd/data/usr/lib/systemd/system/default.target1
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/dev-hugepages.mount19
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/dev-mqueue.mount19
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/emergency.service31
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/emergency.target13
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/final.target13
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/getty.target11
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/getty@.service50
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/graphical.target18
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/halt-local.service20
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/halt.target17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/hibernate.target13
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/hybrid-sleep.target13
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/kexec.target17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/multi-user.target17
l---------core/modules/systemd/data/usr/lib/systemd/system/multi-user.target.wants/getty.target1
l---------core/modules/systemd/data/usr/lib/systemd/system/multi-user.target.wants/systemd-logind.service1
l---------core/modules/systemd/data/usr/lib/systemd/system/multi-user.target.wants/systemd-user-sessions.service1
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/network-online.target11
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/network.target14
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/paths.target10
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/poweroff.target17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/printer.target11
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.automount18
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.mount17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/rc-local.service20
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/reboot.target17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/remote-fs.target3
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/serial-getty@.service36
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/shutdown.target12
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/sigpwr.target10
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/sleep.target13
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/smartcard.target11
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/sockets.target10
l---------core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-journald.socket1
l---------core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-shutdownd.socket1
l---------core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-control.socket1
l---------core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-kernel.socket1
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/sound.target11
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/suspend.target13
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/swap.target10
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/sys-fs-fuse-connections.mount20
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/sys-kernel-config.mount20
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/sysinit.target14
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/dev-hugepages.mount1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/dev-mqueue.mount1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/proc-sys-fs-binfmt_misc.automount1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/sys-fs-fuse-connections.mount1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/sys-kernel-config.mount1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-binfmt.service1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-journald.service1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-modules-load.service1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-sysctl.service1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup-dev.service1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup.service1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udev-trigger.service1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udevd.service1
l---------core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-vconsole-setup.service1
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/syslog.socket40
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/system-update.target16
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-binfmt.service26
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-halt.service17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-hibernate.service17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-hybrid-sleep.service17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-journald.service26
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-journald.socket26
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-logind.service23
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-modules-load.service27
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-nspawn@.service18
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-poweroff.service17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-reboot.service17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-shutdownd.service15
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-shutdownd.socket18
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-suspend.service17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-sysctl.service26
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-tmpfiles-setup-dev.service17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-tmpfiles-setup.service23
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-udev-settle.service31
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-udev-trigger.service20
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-udevd-control.socket19
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-udevd-kernel.socket19
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-udevd.service23
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-user-sessions.service17
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/systemd-vconsole-setup.service20
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/time-sync.target14
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/timers.target10
-rw-r--r--core/modules/systemd/data/usr/lib/systemd/system/user@.service23
-rw-r--r--core/modules/systemd/data/usr/lib/tmpfiles.d/etc.conf14
-rw-r--r--core/modules/systemd/data/usr/lib/udev/rules.d/70-uaccess-floppy.rules8
-rw-r--r--core/modules/systemd/data/usr/lib/udev/rules.d/99-systemd.rules56
-rw-r--r--core/modules/systemd/module.build111
-rw-r--r--core/modules/systemd/module.conf66
-rw-r--r--core/modules/systemd/module.conf.centos11
-rw-r--r--core/modules/systemd/module.conf.debian13
-rw-r--r--core/modules/systemd/module.conf.fedora11
-rw-r--r--core/modules/systemd/module.conf.opensuse10
-rw-r--r--core/modules/systemd/module.conf.scientific37
-rw-r--r--core/modules/systemd/module.conf.ubuntu12
-rw-r--r--core/modules/systemd/module.conf.ubuntu.1471
-rw-r--r--core/modules/systemd/module.conf.ubuntu.1695
-rw-r--r--core/modules/systemd/systemd-openslx-229.patch11
-rw-r--r--core/modules/systemd/systemd-openslx.patch26
-rw-r--r--core/modules/udisks/data/usr/share/polkit-1/rules.d/10-drives.rules6
-rw-r--r--core/modules/udisks/module.build50
-rw-r--r--core/modules/udisks/module.conf14
-rw-r--r--core/modules/udisks/module.conf.debian32
-rw-r--r--core/modules/udisks/module.conf.fedora7
-rw-r--r--core/modules/udisks/module.conf.opensuse7
-rw-r--r--core/modules/udisks/module.conf.ubuntu34
-rw-r--r--core/modules/udisks/module.conf.ubuntu.1231
-rw-r--r--core/modules/udisks/module.conf.ubuntu.146
-rw-r--r--core/modules/udisks/module.conf.ubuntu.166
-rw-r--r--core/modules/udisks/templates/udisks.dbus.service6
-rw-r--r--core/modules/udisks/templates/udisks.systemd.service9
-rw-r--r--core/modules/udisks/templates/udisks2.dbus.service6
-rw-r--r--core/modules/udisks/templates/udisks2.systemd.service9
-rw-r--r--core/modules/vbox/README30
-rwxr-xr-xcore/modules/vbox/data/addon-init17
l---------core/modules/vbox/data/etc/systemd/system/graphical.target.wants/vbox.service1
-rw-r--r--core/modules/vbox/data/etc/systemd/system/vbox.service9
-rw-r--r--core/modules/vbox/data/etc/udev/rules.d/60-vboxdrv.rules7
-rwxr-xr-xcore/modules/vbox/data/opt/openslx/scripts/systemd-vbox_env55
-rw-r--r--core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/empty-diff.vdi.gzbin0 -> 285 bytes
-rw-r--r--core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include194
-rwxr-xr-xcore/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include436
-rw-r--r--core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/rwimg.vdi.gzbin0 -> 268 bytes
-rw-r--r--core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.conf2
-rw-r--r--core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include57
-rw-r--r--core/modules/vbox/module.build142
-rw-r--r--core/modules/vbox/module.conf20
-rw-r--r--core/modules/vbox/module.conf.opensuse (renamed from helper/README.helper)0
-rw-r--r--core/modules/vbox/module.conf.opensuse.12.319
-rw-r--r--core/modules/vbox/module.conf.ubuntu13
-rw-r--r--core/modules/vbox/module.conf.ubuntu.13.0418
-rw-r--r--core/modules/vbox/module.conf.ubuntu.13.1019
-rw-r--r--core/modules/vbox/module.conf.ubuntu.1423
-rw-r--r--core/modules/vbox/module.conf.ubuntu.1623
-rw-r--r--core/modules/vmchooser/TODO4
-rwxr-xr-xcore/modules/vmchooser/data/opt/openslx/vmchooser/sessionstart12
-rw-r--r--core/modules/vmchooser/data/opt/openslx/vmchooser/themes/openslx/openslx-left.pngbin0 -> 9187 bytes
-rw-r--r--core/modules/vmchooser/data/opt/openslx/vmchooser/themes/openslx/openslx-right.pngbin0 -> 3390 bytes
-rw-r--r--core/modules/vmchooser/data/opt/openslx/vmchooser/themes/openslx/openslx.ini4
-rw-r--r--core/modules/vmchooser/module.build39
-rw-r--r--core/modules/vmchooser/module.conf3
-rw-r--r--core/modules/vmchooser/module.conf.debian4
-rw-r--r--core/modules/vmchooser/module.conf.fedora3
-rw-r--r--core/modules/vmchooser/module.conf.opensuse4
-rw-r--r--core/modules/vmchooser/module.conf.ubuntu4
-rw-r--r--core/modules/vmchooser2/data/etc/tmpfiles.d/vmchooser-cache.conf2
-rwxr-xr-xcore/modules/vmchooser2/data/opt/openslx/bin/vmchooser36
-rwxr-xr-xcore/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart18
-rwxr-xr-xcore/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart.d/log-selected-session5
-rw-r--r--core/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-left.pngbin0 -> 5361 bytes
-rw-r--r--core/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-right.pngbin0 -> 3390 bytes
-rw-r--r--core/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool.ini4
-rw-r--r--core/modules/vmchooser2/module.build39
-rw-r--r--core/modules/vmchooser2/module.conf3
-rw-r--r--core/modules/vmchooser2/module.conf.debian4
-rw-r--r--core/modules/vmchooser2/module.conf.opensuse4
-rw-r--r--core/modules/vmchooser2/module.conf.ubuntu4
-rwxr-xr-xcore/modules/vmware/data/addon-init6
-rw-r--r--core/modules/vmware/data/etc/X11/Xreset.d/vmware17
l---------core/modules/vmware/data/etc/systemd/system/graphical.target.wants/vmware.service1
-rw-r--r--core/modules/vmware/data/etc/systemd/system/vmware.service9
-rw-r--r--core/modules/vmware/data/etc/vmware-vix/bootstrap2
-rw-r--r--core/modules/vmware/data/etc/vmware/bootstrap12
l---------core/modules/vmware/data/etc/vmware/icu1
-rw-r--r--core/modules/vmware/data/etc/vmware/locations3
-rw-r--r--core/modules/vmware/data/etc/vmware/usbarb.rules4
-rwxr-xr-xcore/modules/vmware/data/opt/openslx/bin/vmplayer17
l---------core/modules/vmware/data/opt/openslx/bin/vmware1
-rwxr-xr-xcore/modules/vmware/data/opt/openslx/scripts/systemd-vmware_env101
-rw-r--r--core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc71
-rw-r--r--core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file.inc186
-rw-r--r--core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file_legacy.inc312
-rw-r--r--core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/logging.inc64
-rw-r--r--core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc130
-rw-r--r--core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_hardware_legacy.inc152
-rw-r--r--core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc30
-rw-r--r--core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files.inc29
-rw-r--r--core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files_legacy.inc29
-rw-r--r--core/modules/vmware/data/opt/openslx/vmchooser/vmware/nvrambin0 -> 8664 bytes
-rw-r--r--core/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include76
l---------core/modules/vmware/data/usr/bin/vmplayer1
l---------core/modules/vmware/data/usr/bin/vmware1
-rw-r--r--core/modules/vmware/data/usr/share/icons/hicolor/index.theme1662
-rw-r--r--core/modules/vmware/module.build158
-rw-r--r--core/modules/vmware/module.conf69
-rw-r--r--core/modules/vmware/module.conf.ubuntu136
-rw-r--r--core/modules/vmware/patches/vmblock__3.0-3.9__1.0-100.0.patch11
-rw-r--r--core/modules/vmware/patches/vmblock__3.10__1.0-100.0.patch34
-rw-r--r--core/modules/vmware/patches/vmblock__3.11-9.9__1.0-11.0.patch123
-rw-r--r--core/modules/vmware/patches/vmci__4.3-4.3__12.0.0.patch26
-rw-r--r--core/modules/vmware/patches/vmmon__4.3-4.3__12.0.0.patch13
-rw-r--r--core/modules/vmware/patches/vmnet__3.13-3.13__1.0-10.0.2.patch27
-rw-r--r--core/modules/x11vnc/module.build19
-rw-r--r--core/modules/x11vnc/module.conf6
-rw-r--r--core/modules/x11vnc/module.conf.fedora6
-rw-r--r--core/modules/x11vnc/module.conf.opensuse6
-rw-r--r--core/modules/x11vnc/module.conf.ubuntu6
-rwxr-xr-xcore/modules/xorg/data/etc/X11/Xreset25
-rwxr-xr-xcore/modules/xorg/data/etc/X11/Xsession112
-rwxr-xr-xcore/modules/xorg/data/etc/X11/Xsetup16
-rwxr-xr-xcore/modules/xorg/data/etc/X11/Xstartup9
-rwxr-xr-xcore/modules/xorg/data/opt/openslx/iptables/rules.d/70-xorg4
-rw-r--r--core/modules/xorg/module.build22
-rw-r--r--core/modules/xorg/module.conf19
-rw-r--r--core/modules/xorg/module.conf.centos67
-rw-r--r--core/modules/xorg/module.conf.debian40
-rw-r--r--core/modules/xorg/module.conf.fedora69
-rw-r--r--core/modules/xorg/module.conf.opensuse59
-rw-r--r--core/modules/xorg/module.conf.opensuse.13.195
-rw-r--r--core/modules/xorg/module.conf.opensuse.13.292
-rw-r--r--core/modules/xorg/module.conf.ubuntu40
-rw-r--r--core/modules/xorg/module.conf.ubuntu.1637
-rw-r--r--core/post-patch/ck-connector/fake-ck-connector.c55
-rw-r--r--core/rootfs/rootfs-stage31/data/etc/modprobe.d/vmwgfx-fbdev.conf5
-rw-r--r--core/rootfs/rootfs-stage31/data/etc/modules68
-rw-r--r--core/rootfs/rootfs-stage31/data/inc/activate_sysconfig98
-rw-r--r--core/rootfs/rootfs-stage31/data/inc/drm.functions80
-rw-r--r--core/rootfs/rootfs-stage31/data/inc/functions84
-rw-r--r--core/rootfs/rootfs-stage31/data/inc/network.functions23
-rwxr-xr-xcore/rootfs/rootfs-stage31/data/inc/ntp_sync26
-rw-r--r--core/rootfs/rootfs-stage31/data/inc/parse_kcl58
-rw-r--r--core/rootfs/rootfs-stage31/data/inc/setup_network84
-rw-r--r--core/rootfs/rootfs-stage31/data/inc/setup_network_retry33
-rw-r--r--core/rootfs/rootfs-stage31/data/inc/setup_stage3268
-rw-r--r--core/rootfs/rootfs-stage31/data/inc/setup_stage469
-rwxr-xr-xcore/rootfs/rootfs-stage31/data/inc/udhcpc-trigger93
-rwxr-xr-xcore/rootfs/rootfs-stage31/data/init166
-rw-r--r--core/rootfs/rootfs-stage31/module.build74
-rw-r--r--core/rootfs/rootfs-stage31/module.conf74
-rw-r--r--core/rootfs/rootfs-stage31/module.conf.centos3
-rw-r--r--core/rootfs/rootfs-stage31/module.conf.debian3
-rw-r--r--core/rootfs/rootfs-stage31/module.conf.fedora3
-rw-r--r--core/rootfs/rootfs-stage31/module.conf.ubuntu3
-rw-r--r--core/rootfs/rootfs-stage31/templates/drm.cfg19
-rw-r--r--core/rootfs/rootfs-stage32/TODO4
l---------core/rootfs/rootfs-stage32/data/bin/ash1
l---------core/rootfs/rootfs-stage32/data/bin/sh1
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/conf.d/nfs-common.conf7
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/hosts8
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/keymaps/de_DEbin0 -> 2823 bytes
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/modprobe.d/50-mltk-blacklist.conf11
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/nsswitch.conf19
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/profile56
l---------core/rootfs/rootfs-stage32/data/etc/resolv.conf1
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service13
l---------core/rootfs/rootfs-stage32/data/etc/systemd/system/graphical.target.wants/killsplash.service1
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/load-gfx-driver.service9
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/mount-stage4.service11
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target4
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target4
l---------core/rootfs/rootfs-stage32/data/etc/systemd/system/nfs-mount.service1
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/rpc-statd.service9
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/rpcbind.service11
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/setup-partitions.service11
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/setup-slx-addon@.service10
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/setup-slx-addons.service11
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/stage4.target5
l---------core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service1
l---------core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/load-gfx-driver.service1
l---------core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/setup-partitions.service1
l---------core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/setup-slx-addons.service1
l---------core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/update-etc_issue.service1
l---------core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/zram-swap.service1
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/tmp.target5
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/update-etc_issue.service9
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/zram-swap.service10
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/terminfo/l/linuxbin0 -> 1790 bytes
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/terminfo/x/xtermbin0 -> 3371 bytes
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/terminfo/x/xterm-256colorbin0 -> 3437 bytes
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/tmpfiles.d/network.conf1
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/tmpfiles.d/openslx-log.conf1
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/tmpfiles.d/run-lock.conf2
-rwxr-xr-xcore/rootfs/rootfs-stage32/data/opt/openslx/bin/penv7
-rwxr-xr-xcore/rootfs/rootfs-stage32/data/opt/openslx/bin/slxlog76
-rwxr-xr-xcore/rootfs/rootfs-stage32/data/opt/openslx/scripts/openslx-create_issue25
-rwxr-xr-xcore/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers29
-rwxr-xr-xcore/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-load_gfx_driver22
-rwxr-xr-xcore/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-mount_stage471
-rwxr-xr-xcore/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_partitions168
-rwxr-xr-xcore/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_slx_addons94
-rwxr-xr-xcore/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-zram_swap60
-rw-r--r--core/rootfs/rootfs-stage32/data/root/.bashrc48
-rw-r--r--core/rootfs/rootfs-stage32/module.build146
-rw-r--r--core/rootfs/rootfs-stage32/module.conf261
-rw-r--r--core/rootfs/rootfs-stage32/module.conf.centos16
-rw-r--r--core/rootfs/rootfs-stage32/module.conf.debian19
-rw-r--r--core/rootfs/rootfs-stage32/module.conf.fedora16
-rw-r--r--core/rootfs/rootfs-stage32/module.conf.opensuse22
-rw-r--r--core/rootfs/rootfs-stage32/module.conf.opensuse.13.120
-rw-r--r--core/rootfs/rootfs-stage32/module.conf.opensuse.13.220
-rw-r--r--core/rootfs/rootfs-stage32/module.conf.ubuntu21
-rw-r--r--core/rootfs/rootfs-stage32/rdns.c28
-rw-r--r--core/rootfs/rootfs-stage32/templates/issue.template9
l---------core/targets/debug/debug1
l---------core/targets/nvidia_libs/nvidia_libs1
l---------core/targets/qemukvm/qemukvm1
l---------core/targets/stage31/busybox1
l---------core/targets/stage31/kernel1
l---------core/targets/stage31/rootfs-stage311
l---------core/targets/stage31/splash-openslx1
l---------core/targets/stage32-headless/cpugovernor1
l---------core/targets/stage32-headless/cron1
l---------core/targets/stage32-headless/dbus1
l---------core/targets/stage32-headless/dhcpc-busybox1
l---------core/targets/stage32-headless/dnbd31
l---------core/targets/stage32-headless/german1
l---------core/targets/stage32-headless/idleaction1
l---------core/targets/stage32-headless/kernel1
l---------core/targets/stage32-headless/nscd1
l---------core/targets/stage32-headless/pam1
l---------core/targets/stage32-headless/rootfs-stage321
l---------core/targets/stage32-headless/rsyslogd1
l---------core/targets/stage32-headless/smartctl1
l---------core/targets/stage32-headless/sshd1
l---------core/targets/stage32-headless/systemd1
l---------core/targets/stage32-headless/xorg1
l---------core/targets/stage32-lightdm/busybox1
l---------core/targets/stage32-lightdm/consolekit1
l---------core/targets/stage32-lightdm/cpugovernor1
l---------core/targets/stage32-lightdm/dbus1
l---------core/targets/stage32-lightdm/debug1
l---------core/targets/stage32-lightdm/ldm1
l---------core/targets/stage32-lightdm/ldm-gtk-greeter1
l---------core/targets/stage32-lightdm/policykit1
l---------core/targets/stage32-lightdm/rootfs-stage321
l---------core/targets/stage32-lightdm/rsyslogd1
l---------core/targets/stage32-lightdm/sshd1
l---------core/targets/stage32-lightdm/systemd1
l---------core/targets/stage32-lightdm/xorg1
l---------core/targets/stage32-opensuse/alsa1
l---------core/targets/stage32-opensuse/beamergui1
l---------core/targets/stage32-opensuse/consolekit1
l---------core/targets/stage32-opensuse/cpugovernor1
l---------core/targets/stage32-opensuse/cron1
l---------core/targets/stage32-opensuse/cups1
l---------core/targets/stage32-opensuse/dbus1
l---------core/targets/stage32-opensuse/debug1
l---------core/targets/stage32-opensuse/dhcpc-busybox1
l---------core/targets/stage32-opensuse/dnbd31
l---------core/targets/stage32-opensuse/german1
l---------core/targets/stage32-opensuse/idleaction1
l---------core/targets/stage32-opensuse/iptables-helper1
l---------core/targets/stage32-opensuse/kdm1
l---------core/targets/stage32-opensuse/kernel1
l---------core/targets/stage32-opensuse/nscd1
l---------core/targets/stage32-opensuse/openbox1
l---------core/targets/stage32-opensuse/pam1
l---------core/targets/stage32-opensuse/polkit1
l---------core/targets/stage32-opensuse/printergui1
l---------core/targets/stage32-opensuse/redsocks1
l---------core/targets/stage32-opensuse/rootfs-stage321
l---------core/targets/stage32-opensuse/rsyslogd1
l---------core/targets/stage32-opensuse/run-virt1
l---------core/targets/stage32-opensuse/smartctl1
l---------core/targets/stage32-opensuse/sshd1
l---------core/targets/stage32-opensuse/systemd1
l---------core/targets/stage32-opensuse/udisks1
l---------core/targets/stage32-opensuse/vmchooser1
l---------core/targets/stage32-opensuse/xorg1
l---------core/targets/stage32-scientific/alsa1
l---------core/targets/stage32-scientific/cpugovernor1
l---------core/targets/stage32-scientific/dbus1
l---------core/targets/stage32-scientific/debug1
l---------core/targets/stage32-scientific/german1
l---------core/targets/stage32-scientific/kdm1
l---------core/targets/stage32-scientific/kernel1
l---------core/targets/stage32-scientific/nscd1
l---------core/targets/stage32-scientific/openbox1
l---------core/targets/stage32-scientific/pam1
l---------core/targets/stage32-scientific/policykit1
l---------core/targets/stage32-scientific/rootfs-stage321
l---------core/targets/stage32-scientific/rsyslogd1
l---------core/targets/stage32-scientific/sshd1
l---------core/targets/stage32-scientific/systemd1
l---------core/targets/stage32-scientific/vmchooser1
l---------core/targets/stage32-scientific/vmplayer1
l---------core/targets/stage32-scientific/xorg1
l---------core/targets/stage32/alsa1
l---------core/targets/stage32/consolekit1
l---------core/targets/stage32/cpugovernor1
l---------core/targets/stage32/cron1
l---------core/targets/stage32/cups1
l---------core/targets/stage32/dbus1
l---------core/targets/stage32/dhcpc-busybox1
l---------core/targets/stage32/dnbd31
l---------core/targets/stage32/german1
l---------core/targets/stage32/kdm1
l---------core/targets/stage32/kernel1
l---------core/targets/stage32/nscd1
l---------core/targets/stage32/openbox1
l---------core/targets/stage32/pam1
l---------core/targets/stage32/polkit1
l---------core/targets/stage32/redsocks1
l---------core/targets/stage32/rootfs-stage321
l---------core/targets/stage32/rsyslogd1
l---------core/targets/stage32/run-virt1
l---------core/targets/stage32/smartctl1
l---------core/targets/stage32/sshd1
l---------core/targets/stage32/systemd1
l---------core/targets/stage32/udisks1
l---------core/targets/stage32/vmchooser1
l---------core/targets/stage32/xorg1
l---------core/targets/vbox/vbox1
l---------core/targets/vmware/kernel1
l---------core/targets/vmware/vmware1
-rw-r--r--data/kernel.wanted.config248
-rwxr-xr-xmltk250
-rw-r--r--tmp/README0
-rw-r--r--var/README0
1212 files changed, 57233 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..007704fd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,18 @@
+*~
+*.swp
+*.so
+src/
+ksrc/
+aufs?-standalone/
+build/
+.built
+.fetched_source
+list*
+test
+logs/
+/config
+openslx.config
+rootupper/
+overlay
+var/log
+var/builds
diff --git a/remote/README.remote b/core/README.remote
index e69de29b..e69de29b 100644
--- a/remote/README.remote
+++ b/core/README.remote
diff --git a/core/bin/setup_target b/core/bin/setup_target
new file mode 100755
index 00000000..865cf22d
--- /dev/null
+++ b/core/bin/setup_target
@@ -0,0 +1,618 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+#
+# Copyright (c) 2011..2016 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+#
+# This file contains the functions needed to setup a target.
+# The main function is 'generate_target' which will go over all
+# activated modules (symlinks found under core/targets/<target> or
+# overlay/targets/<target>) and run the module-specific 'fetch_source',
+# 'build' and 'post_copy' functions of the modules.
+#
+# The functions defined here are module-independent, meaning they
+# can process any module, as long as following requirements are met:
+#
+# - Modules need to have a build-script and a config file,
+# i.e. core/module/kernel/module.build
+# and core/module/kernel/module.conf
+# as these will be read by 'process_module'.
+#
+# - Modules do not change anything inside the module dirs anymore,
+# everything (triggerfiles, source download, build) is done in
+# tmp/work/<MODULE>
+#
+# - Several information have to be set in the config file of
+# a module:
+# * REQUIRED_BINARIES - list of binaries
+# * REQUIRED_FILES - list of regular files
+# * REQUIRED_DIRECTORIES - list of directories
+# * REQUIRED_SYSTEM_FILES - files to be copied directly from the system
+# * REQUIRED_INSTALLED_PACKAGES - list of packages needed at build-time
+# * REQUIRED_CONTENT_PACKAGES - list of packages where the contents are to be copied
+# * (optional variables needed by the module-build-script)
+#
+# NOTE: REQUIRED_BINARIES, REQUIRED_FILES, REQUIRED_FILES will be ONLY looked
+# for in the module's own build directory!
+#
+# Optionally, a module can have a static data directory under
+# core/modules/<module>/data which will be copied as is to the target build directory.
+#
+# Moreover modules do not need to specify the dynamic dependencies of given binaries
+# as these will be determined automaticly by the helper function 'get_dynamic_dependencies'
+# -----------------------------------------------------------------------------
+#
+CORE_DIR="${ROOT_DIR}/core"
+OVERLAY_DIR="${ROOT_DIR}/overlay"
+EXPORT_DIR="/export/build"
+[ -z "$REMOTE_EXPORT_DIR" ] || EXPORT_DIR=$REMOTE_EXPORT_DIR
+# Keep track of processed modules so we don't
+# build a module multiple times when following dependencies
+PROCESSED_MODULES=""
+
+initial_checks () {
+ get_kernel_version
+ detect_distribution
+}
+
+set_target_dir () {
+ if [ -d "${OVERLAY_DIR}/targets/${TARGET}" ]; then
+ TARGET_DIR="${OVERLAY_DIR}/targets/${TARGET}"
+ elif [ -d "${CORE_DIR}/targets/${TARGET}" ]; then
+ TARGET_DIR="${CORE_DIR}/targets/${TARGET}"
+ fi
+}
+
+#
+# generic function to read the config file of the current $MODULE
+#
+read_config () {
+ # unset previous variables from other config files
+ for VARNAME in ${!REQUIRED_*}; do
+ unset $VARNAME
+ done
+
+ local MODULE_CONFIG="${MODULE_DIR}/module.conf"
+
+ # sanity checks
+ [ ! -e "${MODULE_CONFIG}" ] && perror "Config for '$MODULE' not found."
+ validate_config "$MODULE_CONFIG"
+ # source the config file
+ . "${MODULE_CONFIG}" || perror "Sourcing '${MODULE_CONFIG}' failed."
+ # sanity checks - no distribution specific things in the global config
+ local CHECK
+ for CHECK in REQUIRED_CONTENT_PACKAGES REQUIRED_INSTALLED_PACKAGES; do
+ [ -n "${!CHECK}" ] && perror "$CHECK is set in ${MODULE}.conf, but distribution specific config has to go to one of these files:\n$PRINT_SYS_VERSIONS"
+ done
+ local FILE
+ for FILE in $SYS_VERSIONS; do
+ if [ -e "${MODULE_CONFIG}.${FILE}" ]; then
+ # a specific tool.conf seems to exist, use it to override/extend certain vars
+ validate_config "${MODULE_CONFIG}.${FILE}"
+ . "${MODULE_CONFIG}.${FILE}" || perror "Sourcing '${MODULE_CONFIG}.${FILE}' failed."
+ pinfo "Sourced distribution specific config (${MODULE_CONFIG##*/}.${FILE})"
+ return # end function
+ fi
+ done
+ # reaching here means no specific config
+ pinfo "Sourced general module config only (${MODULE_CONFIG##*/})"
+}
+
+validate_config () {
+ local INVALID=$(grep -h -E -o '^\s*\w+=' "$1" | grep -v -E '^\s*REQUIRED_')
+ [ -z "$INVALID" ] && return 0
+ local i
+ for i in $INVALID; do
+ pwarning "Invalid variable $i"
+ done
+ perror "$1 contains invalid variables. All variables must start with REQUIRED_"
+}
+
+#
+# generic function to read the build script of the current $MODULE
+#
+read_build () {
+ local BUILD_SCRIPT="${MODULE_DIR}/module.build"
+
+ [ ! -e "${BUILD_SCRIPT}" ] && perror "Build script for specified tool not found."
+
+ . "${BUILD_SCRIPT}" || perror "Sourcing '${BUILD_SCRIPT}' failed."
+}
+
+export_builds() {
+ [ ! -d "${ROOT_DIR}/var/builds" ] && perror "No ${ROOT_DIR}/var/builds, nothing to export."
+ if mount|grep -q ${ROOT_DIR}/var/builds; then
+ pwarning "${ROOT_DIR}/var/builds already exported! Ignoring..."
+ return 1;
+ fi
+ pinfo "Mounting ${ROOT_DIR}/var/builds to ${EXPORT_DIR}."
+ pinfo "This will make the local var/builds syncable from another machine."
+ [ ! -d "${EXPORT_DIR}" ] && mkdir -p "${EXPORT_DIR}"
+ mount --bind ${ROOT_DIR}/var/builds ${EXPORT_DIR} || perror "Failed to bind mount ${ROOT_DIR}/var/builds to ${EXPORT_DIR}"
+}
+
+#
+# main function which copies all files, directories, binaries and external libraries to TARGET_BUILD_DIR
+# called after building the module
+#
+copy_files_with_deps () {
+
+ [ ! -d "$MODULE_BUILD_DIR" ] && pinfo "No build directory found, skipping dependency copying" && return 0
+ cd "$MODULE_BUILD_DIR"
+
+ local COPYFILES_LIST="${TARGET_BUILD_DIR}/opt/openslx/.mltk/${MODULE}.copy_files_with_deps"
+ rm -f -- "${COPYFILES_LIST}"
+
+ # from REQUIRED_BINARIES - follow symlinks and ldd the file
+ [ ! -z "${REQUIRED_BINARIES}" ] && pinfo "Gathering required binaries from config file..."
+ local OPTIONAL
+ for FILENAME in ${REQUIRED_BINARIES}; do
+ if [[ "$FILENAME" == @* ]]; then
+ OPTIONAL="yes"
+ FILENAME=$(echo "$FILENAME" | cut -c 2- )
+ else
+ OPTIONAL="no"
+ fi
+ local FILE_CANDIDATES=$( find . -name "${FILENAME}" -a \( -type f -o -type l \) )
+ local FINAL_LIST=""
+ # Check result of find
+ if [ "$(echo "$FILE_CANDIDATES" | wc -l)" -gt 1 ]; then
+ # More than one match for binary
+ pdebug "Candidates for $FILENAME are: $(echo $FILE_CANDIDATES)"
+ for FILE in $FILE_CANDIDATES; do
+ local TESTFILE="$(readlink -f "$FILE")"
+ pdebug " $FILE leads to $TESTFILE"
+ [ -f "$TESTFILE" -a -x "$TESTFILE" ] && FINAL_LIST="$FINAL_LIST $FILE"
+ done
+ FINAL_LIST=$(trim "$FINAL_LIST")
+ if [ -z "$FINAL_LIST" ]; then
+ perror "\tNo binary found for ${FILENAME}. None of the candidates ($FILE_CANDIDATES) is executable."
+ fi
+ if [[ "$FINAL_LIST" == *" "* ]]; then
+ pdebug "Found more than one match for required file '$FILENAME': $FINAL_LIST"
+ else
+ pdebug "\tFound ${FILENAME} at ${FILE}"
+ fi
+ elif [ "$OPTIONAL" == "no" -a -z "$FILE_CANDIDATES" ]; then
+ # No candidate
+ perror "Could not find required binary $FILENAME"
+ else
+ # One candidate
+ local TESTFILE=$(readlink -f "$FILE_CANDIDATES")
+ if [ -f "$TESTFILE" -a -x "$TESTFILE" ]; then
+ FINAL_LIST=${FILE_CANDIDATES}
+ elif [ "$OPTIONAL" = "no" ]; then
+ perror "No executable regular file found for '$FILENAME' (potential match was $(echo $FILE_CANDIDATES))"
+ fi
+ fi
+ for FILE in $FINAL_LIST; do
+ pdebug "* $FILE"
+ get_link_chain "${MODULE_BUILD_DIR}/${FILE}" "${MODULE_BUILD_DIR}" >> "${COPYFILES_LIST}"
+ get_dynamic_dependencies -l "${MODULE_BUILD_DIR}" "${FILE}" >> "${COPYFILES_LIST}"
+ done
+ done
+
+ # from REQUIRED_LIBRARIES - like binaries, follow symlinks and ldd, but also expand the lib-name
+ # by looking for files named <libname>.so*
+ [ ! -z "$REQUIRED_LIBRARIES" ] && pinfo "Gathering required libraries from config file..."
+ for LIB in $REQUIRED_LIBRARIES; do
+ FILE_CANDIDATES=$(find . -name "${LIB}.so*")
+ [ -z "$FILE_CANDIDATES" ] && perror "Cannot find required library $LIB"
+ for LOCATION in $FILE_CANDIDATES; do
+ pdebug "* $LOCATION"
+ get_link_chain "${MODULE_BUILD_DIR}/${LOCATION}" "${MODULE_BUILD_DIR}" >> "${COPYFILES_LIST}"
+ get_dynamic_dependencies -l "${MODULE_BUILD_DIR}" "${LOCATION}" >> "${COPYFILES_LIST}"
+ done
+ done
+
+ # from REQUIRED_DIRECTORIES - recursively copy given dirs, look for files that seem to be an elf
+ # binary and do the symlink+ldd trick on them
+ [ ! -z "${REQUIRED_DIRECTORIES}" ] && pinfo "Gathering required directories from config file..."
+ local ENTRY=""
+ for ENTRY in ${REQUIRED_DIRECTORIES}; do
+ [[ "$ENTRY" == /* ]] || perror "All entries in REQUIRED_DIRECTORIES have to start with a slash '/', but $ENTRY does not!"
+ [ -e "$ENTRY" -a ! -d "$ENTRY" ] && perror "$ENTRY is not a directory"
+ pdebug "* $ENTRY"
+ ENTRY=".${ENTRY}"
+ echo "${ENTRY}" >> "${COPYFILES_LIST}"
+ for BIN in $(find "${ENTRY}" -type f -a \( -executable -o -name '*.so*' \) -a -not -name '*.a'); do
+ [ -f "$BIN" ] || continue
+ #pdebug "\tSearching libs for ${BIN}..."
+ get_link_chain "${MODULE_BUILD_DIR}/${BIN}" "${MODULE_BUILD_DIR}" >> "${COPYFILES_LIST}"
+ get_dynamic_dependencies -l "${MODULE_BUILD_DIR}" "${BIN}" >> "${COPYFILES_LIST}"
+ done
+ done
+
+ # from REQUIRED_FILES - these are assumed to be simple files, so only follow symlinks
+ [ ! -z "${REQUIRED_FILES}" ] && pinfo "Gathering required files from config file..."
+ for ENTRY in ${REQUIRED_FILES}; do
+ get_link_chain "${MODULE_BUILD_DIR}/${ENTRY}" "${MODULE_BUILD_DIR}" >> "${COPYFILES_LIST}"
+ done
+
+ #copy to initramfsdir
+ pdebug "File list generated at ${COPYFILES_LIST}."
+ # empty?
+ if [ ! -s "$COPYFILES_LIST" ]; then
+ return
+ fi
+ # unchanged?
+ local OLD="${COPYFILES_LIST}.old"
+ if [ -s "$OLD" ] && diff "$OLD" "$COPYFILES_LIST"; then
+ return
+ fi
+ local CLISTCOUNT=$(cat "$COPYFILES_LIST" | wc -l)
+ pinfo "Copying $CLISTCOUNT files to '${TARGET_BUILD_DIR}'."
+ tarcopy "$(sort -u "$COPYFILES_LIST")" "${TARGET_BUILD_DIR}"
+ mv -f "$COPYFILES_LIST" "$OLD"
+}
+
+#
+#
+# If the system has no usr split, recreate the structure in the given
+# directory, otherwise, do nothing
+#
+#
+prepare_usr_split () {
+ local DIR DEST
+ local BASE=$1
+ [ -z "$BASE" ] && perror "prepare_usr_split called with empty base dir"
+ if [ "$USR_SPLIT" == "no" ]; then # no usr split, /bin /lib etc are symlinks
+ for DIR in lib lib32 lib64 bin sbin; do
+ [ -L "/${DIR}" ] || continue
+ DEST=$(readlink "/${DIR}")
+ if [ ! -L "/${DEST}" ]; then
+ mkdir -p "${BASE}/${DEST}" || perror "Could not create '${BASE}/${DEST}'"
+ fi
+ [ -L "${BASE}/${DIR}" ] || ln -s "${DEST}" "${BASE}/${DIR}" || perror "Could not symlink '${BASE}/${DIR}' to '${DEST}'"
+ done
+ fi
+}
+
+#
+#
+# main public function. Requires the TARGET to be given as argument.
+# this will simply go over all the modules as found in the core/target/<TARGET>
+# and run following functions:
+#
+#
+generate_target() {
+
+ initial_checks
+
+ TARGET=$1 && shift
+ set_target_dir
+ TARGET_BUILD_DIR="${ROOT_DIR}/var/builds/${TARGET}"
+ [ -e "${ROOT_DIR}/var/log/${TARGET}.size" ] && . "${ROOT_DIR}/var/log/${TARGET}.size" || echo "declare -A BUILD_SIZE" >> "${ROOT_DIR}/var/log/${TARGET}.size"
+
+ [ -d "$TARGET_DIR" ] || perror "Given target directory does not exist: $TARGET_DIR"
+
+ [[ "$TARGET" == "builds" || "$TARGET" == "modules" ]] && \
+ perror "Target directory cannot be named 'builds' or 'modules'."
+
+ pdebug "Generating '$TARGET_BUILD_DIR' for '$TARGET'"
+ mkdir -p "$TARGET_BUILD_DIR" || perror "Failed to create $TARGET_BUILD_DIR"
+ prepare_usr_split "${TARGET_BUILD_DIR}"
+
+ # if no arguments assume all.
+ if [ "x$1" = "x" -o "x$1" = "xall" ]; then
+ MODULES=$(ls ${TARGET_DIR})
+ set -- $MODULES
+ else
+ # tools = arguments given
+ MODULES=$@
+ fi
+
+ pinfo "Activated modules in '${TARGET}':"
+ pinfo "\t$(echo ${MODULES})"
+
+ # we need a bit of special logic for kernel specifically
+ # to check if the built version is corresponding to the
+ # current kernel version. If not we had a kernel update
+ # and need to tell the user
+ if [[ -e "${TARGET_DIR}/kernel" ]]; then
+ # if so, check what kernels have been built
+ if [ -e "${ROOT_DIR}/tmp/work/kernel/ksrc/KVERSION" ]; then
+ local BUILT_KERNEL_VERSION=$(cat "${ROOT_DIR}/tmp/work/kernel/ksrc/KVERSION")
+ if [[ "${BUILT_KERNEL_VERSION}" != "${SYSTEM_KERNEL_LONG}" ]]; then
+ pinfo "The built kernel (${BUILT_KERNEL_VERSION}) is older than the running one (${SYSTEM_KERNEL_LONG})!"
+ # cleaning the module is enough as it forces to rebuild.
+ [[ "${AUTO_UPDATE_KERNEL}" == 1 ]] && pinfo "Auto-Udpate Kernel..." && clean_kernel_module --force
+ fi
+ elif [ -e "${ROOT_DIR}/tmp/work/kernel/ksrc" ]; then
+ # check if ksrc is there, since that would be problematic
+ pwarning "${ROOT_DIR}/tmp/work/kernel/ksrc exists, but KVERSION is not found!"
+ pwarning "Kernel was probably built with an older version of mltk."
+ pwarning "If errors arise, either write your KVERSION manually or clean the kernel."
+ fi
+ fi
+
+ # copy basic libs
+ pinfo "Copying libc and ld-linux used by ${SHELL}"
+ tarcopy "$(list_basic_libs)" "${TARGET_BUILD_DIR}"
+
+ # now iterate over given tools and copy them
+ while (( "$#" )); do
+ process_module "$1"
+ shift
+ done
+
+ post_process_target
+
+ pinfo "Target completed. Total size: $(du -bsh "${TARGET_BUILD_DIR}" | awk 'END {print $1}')"
+ TOOL_STR=""
+}
+
+process_module() {
+ # Parse arguments
+ [ "$#" -lt "1" ] && perror "process_module: want >= 1 param."
+ if [ "x$1" = "x--dep-of" ]; then
+ shift
+ local DEPOF=" $1"
+ shift
+ else
+ local DEPOF=""
+ fi
+ local MODULE="$1"
+ [ -z "$MODULE" ] && perror "No module given when calling process_module"
+ [[ "$PROCESSED_MODULES" == *"!${MODULE}!"* ]] && return # Already processed this module
+ # Set up dirs ans variables
+ PROCESSED_MODULES="${PROCESSED_MODULES}!${MODULE}!"
+ local MODULE_DIR="${TARGET_DIR}/${MODULE}"
+ local MODULE_WORK_DIR="${ROOT_DIR}/tmp/work/${MODULE}"
+ local MODULE_BUILD_DIR="${MODULE_WORK_DIR}/build"
+ local TOOL_STR="[${MODULE}]"
+ local SOURCE_FLAG="$MODULE_BUILD_DIR/fetched_source.flag"
+ local BUILD_FLAG="$MODULE_BUILD_DIR/build_complete.flag"
+ local MD5FILE="${TARGET_BUILD_DIR}/opt/openslx/.mltk/${MODULE}.md5"
+ mkdir -p "${TARGET_BUILD_DIR}/opt/openslx/.mltk"
+ if [ ! -d "${MODULE_DIR}" ]; then
+ if [ -z "$DEPOF" ]; then
+ perror "Module directory for '$MODULE' not found in ${TAREGET_DIR}"
+ fi
+ perror "Module directory for '$MODULE' not found in ${TARGET_DIR} (is a dependency of${DEPOF})"
+ return
+ fi
+ mkdir -p "${MODULE_WORK_DIR}"
+ cd "${MODULE_DIR}" || perror "Module work dir '${MODULE_DIR}' seems to exist, but cd to it failed."
+ # Simple check for modified .build / .config, in which case we'll run a module clean first
+ if [ -f "$MD5FILE" ]; then
+ if ! md5sum --check "$MD5FILE"; then
+ # Mismatch
+ if [ "x$MODULE" = "xkernel" ]; then
+ pwarning " ** Kernel .build/.config changed, but won't autoclean."
+ pwarning " ** Check if cleaning should be done and use '-c kernel'"
+ else
+ pwarning "Module's .build/.config has changed, rebuilding!"
+ clean_module "${TARGET}:${MODULE}"
+ fi
+ elif [ ! -e "$SOURCE_FLAG" ] || [ ! -e "$BUILD_FLAG" ]; then
+ # One of the flags is missing, in this case delete the .md5 file
+ # which would prevent dependency copying etc. below
+ rm -f -- "$MD5FILE"
+ fi
+ fi
+ # Process module
+ pdebug "## Reading config of $MODULE"
+ read_config
+ # Prepare build directory
+ mkdir -p "${MODULE_BUILD_DIR}" || perror "Could not create build dir"
+ prepare_usr_split "${MODULE_BUILD_DIR}"
+ # Check if this module has a dependency that wasn't built yet:
+ if [ ! -z "$REQUIRED_MODULES" ]; then
+ pdebug "$MODULE depends on ${REQUIRED_MODULES}...."
+ for DEP in $REQUIRED_MODULES; do
+ process_module --dep-of "${MODULE}${DEPOF}" "$DEP"
+ done
+ # Read old config again, as it got overwritten by the deps
+ cd "${MODULE_WORK_DIR}" || perror "Tool dir '${MODULE_WORK_DIR}' seems to exist, but cd to it failed (after building deps)."
+ read_config
+ fi
+ [ -n "$DEPOF" ] && local DEPOF_STR="(dependency of${DEPOF})"
+ pinfo ">>>>>>>>>>>>>>>>> Processing module [ $MODULE ] $DEPOF_STR"
+ # Update size of target build dir
+ if [ -d "${TARGET_BUILD_DIR}" ]; then
+ TARGET_BUILD_SIZE=$(du -bc "${TARGET_BUILD_DIR}" | awk 'END {print $1}')
+ else
+ TARGET_BUILD_SIZE=0
+ fi
+ # Source .build script of module
+ pdebug "## Reading .build of $MODULE"
+ . "${CORE_DIR}/includes/clean_module_funcs.inc" # Clean all hooks, in case the module doesn't define them all
+ read_build # Read all the hooks from the module
+ # Install module's dependencies
+ pdebug "## Installing dependencies"
+ cd "${MODULE_DIR}" || perror "cd to '${MODULE_DIR}' failed."
+ install_dependencies
+ # update kernel version variables before running a module, as the last one might have been the kernel...
+ get_kernel_version
+ # Execute load-hook before anything else
+ module_load
+ cd "${MODULE_WORK_DIR}" || perror "cd to '${MODULE_WORK_DIR}' failed."
+ # Fetch source code
+ if [ ! -e "$SOURCE_FLAG" ]; then
+ pinfo "## Fetching source"
+ fetch_source
+ touch "$SOURCE_FLAG" || pwarning "Error setting source-flag"
+ fi
+ # Build
+ if [ ! -e "$BUILD_FLAG" ]; then
+ pinfo "## Building"
+ cd "${MODULE_WORK_DIR}" || perror "cd to '${MODULE_WORK_DIR}' failed."
+ build # calls perror if something fails, no need to do that here
+ strip_recursive "$MODULE_BUILD_DIR"
+ touch "$BUILD_FLAG" || pwarning "Error setting built-flag"
+ fi
+ # Remove *.la files as they might confuse libtool/linker of other tool packages
+ [ -d "${MODULE_BUILD_DIR}" ] && find "${MODULE_BUILD_DIR}" -name '*.la' -exec rm -f {} \;
+ # Only copy stuff from system or build dir if md5s didn't change
+ if [ ! -f "$MD5FILE" ]; then
+ pinfo "## Copying files with dependencies"
+ cd "${MODULE_DIR}" || perror "cd to '${MODULE_DIR}' failed."
+ copy_files_with_deps
+ if [ -n "$REQUIRED_SYSTEM_FILES" ]; then
+ pinfo "## Copying required system files" # REQUIRED_SYSTEM_FILES
+ cd "${MODULE_DIR}" || perror "cd to '${MODULE_DIR}' failed."
+ copy_system_files
+ fi
+ fi
+ # Always copy static data
+ if [ -d "${MODULE_DIR}/data" ]; then
+ pinfo "## Copying static module files"
+ copy_static_data
+ fi
+ # TODO: automatic copy of REQUIRED_CONTENT_PACKAGES
+ pinfo "## Post copy"
+ cd "${MODULE_DIR}" || perror "cd to '${MODULE_DIR}' failed."
+ post_copy
+ # Write new md5 file if not existent yet
+ if [ ! -f "$MD5FILE" ]; then
+ md5sum "$MODULE_DIR/module".* > "$MD5FILE" || perror "Could not create $MD5FILE"
+ fi
+ # Sanity checks
+ [ -e "$TARGET_BUILD_DIR/var/run" -a ! -L "$TARGET_BUILD_DIR/var/run" ] && perror "Messup datected: $TARGET_BUILD_DIR/var/run exists and is not a symlink!"
+ [ -e "$TARGET_BUILD_DIR/var/lock" -a ! -L "$TARGET_BUILD_DIR/var/lock" ] && perror "Messup datected: $TARGET_BUILD_DIR/var/lock exists and is not a symlink!"
+ [ -n "$(ls -A "$TARGET_BUILD_DIR/run" 2>> /dev/null)" ] && perror "Messup detected: $TARGET_BUILD_DIR/run is not empty. You cannot place static files there, use /etc/tmpfiles.d instead!"
+ # set MODULE_BUILD_SIZE
+ calc_size
+ pinfo "Module completed. Total size: ${MODULE_BUILD_SIZE}"
+}
+
+post_process_target() {
+ local TOOL_STR="$TOOL_STR post_process_target:"
+
+ # figure out all relevant ld-paths
+ pinfo "Running ldconfig"
+ cp -r -L /etc/ld.so.conf* "${TARGET_BUILD_DIR}/etc/"
+ ldconfig -v -r "${TARGET_BUILD_DIR}"
+}
+
+clean_modules() {
+
+ TARGET=$1
+ shift
+ TARGET_DIR="$(target_path ${TARGET})"
+ TARGET_BUILD_DIR="${ROOT_DIR}/var/builds/${TARGET}"
+ [ -d $TARGET_DIR ] || perror "Given target directory does not exist: $TARGET_DIR"
+
+ if [ "x$1" = "x" -o "x$1" = "xall" ]; then
+ if [ -e "${ROOT_DIR}/var/log/${TARGET}.size" ]; then
+ rm "${ROOT_DIR}/var/log/${TARGET}.size" || perror "Could not delete var/log/${TARGET}.size"
+ fi
+ if [ -d ${TARGET_BUILD_DIR} ]; then
+ pinfo "Cleaning '${TARGET_BUILD_DIR}'" \
+ && rm -rf "${TARGET_BUILD_DIR}"/* \
+ || perror "Error deleting $TARGET_BUILD_DIR"
+ fi
+ # exclude kernel on "all"
+ set -- $(ls ${TARGET_DIR} | grep -vE "^kernel$")
+ fi
+ cd "$TARGET_DIR"
+
+ while (( "$#" )); do
+ clean_module "${TARGET}:$1"
+ shift
+ done
+ cd - &> /dev/null
+
+ # libck-connector cleanup
+ rm -f "$TARGET_DIR/post-patch/ck-connector/libck-connector.so"
+}
+
+clean_module() {
+ [ -z "$1" ] && perror "No module given on clean_module()"
+ pinfo "## clean_module $1"
+
+ local TARGET=${1%:*}
+ local MODULE=${1#*:}
+ local MODULE_WORK_DIR="${ROOT_DIR}/tmp/work/${MODULE}"
+
+ # if kernel is to be cleaned, do it separately and return
+ [ "x$MODULE" == "xkernel" ] && clean_kernel_module "${TARGET}:${MODULE}" && return
+
+ pinfo "Cleaning '$1'..."
+ rm -rf -- "${MODULE_WORK_DIR}/build" || perror "Could not delete build path"
+ rm -rf -- "${MODULE_WORK_DIR}/src" || perror "Could not delete src path"
+ rm -f -- "${MODULE_WORK_DIR}/list_dpkg_output" || perror "Could not delete list_dpkg_output"
+ rm -f -- "${MODULE_WORK_DIR}/list_binaries_and_files" || perror "Could not delete list_binaries_and_files"
+ rm -f -- "${TARGET_BUILD_DIR}/opt/openslx/.mltk/${MODULE}."* # no space here!
+ # These are not in use anymore, but leave the cleanup here for upgraders
+ rm -f -- "${MODULE_WORK_DIR}/.built"
+ rm -f -- "${MODULE_WORK_DIR}/.fetched_source"
+}
+
+clean_kernel_module() {
+
+ local TARGET=${1%:*}
+ local MODULE=${1#*:}
+ local MODULE_WORK_DIR="${ROOT_DIR}/tmp/work/${MODULE}"
+
+ pinfo "Cleaning kernel module (including sources and compiled stuff)."
+ cd "${MODULE_WORK_DIR}" || perror "Could not cd to ${MODULE_WORK_DIR}"
+ if [ -e build ]; then
+ rm -rf build || pwarning "Could not delete ${MODULE_WORK_DIR}/build"
+ fi
+ # clean any git repos in nonstandard dirs
+ find . -maxdepth 1 -type d -name "linux-*" -exec rm -rf -- {} \;
+ # Clean aufs repo
+ find . -maxdepth 1 -type d -name "aufs*-*" -exec rm -rf -- {} \;
+ # clean the config generated and flag files
+ rm -f -- "openslx.config" ".fetched_source" ".built"
+ if [ -L "ksrc" ]; then
+ unlink "ksrc" || perror "Could not unlink ${MODULE_WORK_DIR}/ksrc."
+ elif [ -d "ksrc" ]; then
+ rm -rf -- "ksrc" || perror "Could not delete directory ${MODULE_WORK_DIR}/ksrc."
+ fi
+ pinfo "Done cleaning kernel."
+}
+
+# Recursively strip binaries and libraries in the given directory
+strip_recursive() {
+ local DIR="$1"
+ [ -n "$DIR" -a -d "$DIR" ] || perror "strip_recursive(): No such directory: '$DIR'"
+ # Will try to strip shell scripts too but shouldn't do any harm
+ find "$DIR" -type f -a \( -executable -o -name "*.so*" \) -exec strip {} \; 2> /dev/null
+}
+
+# copies static data files from <MODULE>/data/ to <TARGET_BUILD_DIR>
+copy_static_data() {
+ [ ! -d "${MODULE_DIR}/data" ] && pinfo "${MODULE} has no static 'data' directory." && return
+ cd "${MODULE_DIR}/data/" || perror "could not cd to '${MODULE_DIR}/data/'"
+ pinfo "tarcopy ${MODULE_DIR}/data/"
+ tarcopy "$(find . -type f -o -type l)" "${TARGET_BUILD_DIR}"
+ cd -
+}
+
+# Copies files with their absolute paths in $REQUIRED_SYSTEM_FILES to $TARGET_BUILD_DIR
+copy_system_files() {
+ [ ! -z "$REQUIRED_SYSTEM_FILES" ] && tarcopy "$REQUIRED_SYSTEM_FILES" "$TARGET_BUILD_DIR"
+}
+
+# Tries to calculate the size of modules - doesn't seem to work all the time
+calc_size() {
+
+ local CURRENT_BUILD_SIZE=$(du -bc "${TARGET_BUILD_DIR}" | awk 'END {print $1}')
+
+ [ ! -z "${BUILD_SIZE[$MODULE]}" ] && local OLD_MODULE_SIZE=${BUILD_SIZE[$MODULE]} || local OLD_MODULE_SIZE=0
+ local diff=$((CURRENT_BUILD_SIZE-TARGET_BUILD_SIZE+OLD_MODULE_SIZE))
+
+ if [ -z "${BUILD_SIZE[$MODULE]}" ]; then
+ echo "BUILD_SIZE[$MODULE]=${diff}" >> "${ROOT_DIR}/var/log/${TARGET}.size"
+ else
+ sed -i "s/^BUILD_SIZE\[${MODULE}\]=.*$/BUILD_SIZE\[${MODULE}\]=${diff}/g" "${ROOT_DIR}/var/log/${TARGET}.size"
+ fi
+
+ MODULE_BUILD_SIZE=$(echo $diff | awk '{ sum=$1; hum[1024^3]="GB"; hum[1024^2]="MB"; hum[1024]="KB";
+ for (x=1024^3; x>=1024; x/=1024){
+ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x]; break }
+ }
+ }')
+}
+
diff --git a/core/includes/binutil.inc b/core/includes/binutil.inc
new file mode 100644
index 00000000..b9867a90
--- /dev/null
+++ b/core/includes/binutil.inc
@@ -0,0 +1,222 @@
+#
+# Common functions to copy binaries and their dependancies.
+#
+############################################################
+# This will parse the output of ldd on given binaries
+# and echo the location of these libs to STDOUT
+# The output of this function has to be used in some
+# way, it only echos!
+#
+# About local search:
+# It is required that we can search for the dynamic
+# libraries in a specific directory, namely the one
+# where we (potentially) built the binary. If a
+# corresponding library is found, it should take
+# precedence over ones found on the system.
+# This can be done by using the '-l' switch, see below.
+#
+############################################################
+# We use a blacklist mechanism to exclude common libraries.
+# This improves runtime quite a bit...
+declare -rg BLACKLIST="ld-linux linux-gate linux-vdso libc.so"
+
+
+# replace ' ' by '|' in the blacklist, so grep can use it directly.
+CURRENT_BLACKLIST=$(echo ${BLACKLIST} | sed 's/ /\\|/g')
+
+# Initialise flag and path for local search
+LOCALSEARCH=0
+LOCALSEARCHDIR=""
+
+DONEDONE=$(mktemp)
+echo "-----------------------" > "$DONEDONE"
+
+############################################################
+#
+# Usage:
+# get_dynamic_dependencies [-l <searchdir>] <binary_list>
+# * the list must be seperated by spaces
+# * the search for lib needed by a binary can be done locally,
+# using the -l <searchdir> option
+#
+# Ouput:
+# Will simply echo list of required libraries
+
+get_dynamic_dependencies() {
+ # check if local search is activated by the '-l' switch
+ # if so the following argument is the path.
+ if [ "x$1" == "x-l" ]; then
+ local LOCALSEARCH=1
+ shift
+ [ ! -d "$1" ] && perror "Directory '$1' does not exist, exiting."
+ local LOCALSEARCHDIR="$1"
+ shift
+ fi
+
+ # main loop over the list of binaries
+ while [ $# != 0 ]; do
+ local BINARY="$1"
+ shift
+ [ -f "$BINARY" ] || continue
+
+ # now run ldd on it and save the output in $LDD_OUT
+ local LDD_OUT="ldd_output"
+ if ldd "$BINARY" > "$LDD_OUT"; then
+ # Case 1: file is a dynamic executable
+ for LIB in $(grep -v "${CURRENT_BLACKLIST}${REQUIRED_LDD_BLACKLIST}" "$LDD_OUT" | awk '{print $1 $2 $3}'); do
+ # split the entry into an array, ex:
+ # libm.so.6 => /lib/libm.so.6 would be split into:
+ # LIBLINK[0] LIBLINK[1]
+ local LIBLINK=(${LIB//=>/ })
+ # call helper function to find the correct lib
+ lib_search
+ done
+ #TODO: check if "statically linked" is output
+ else
+ # Case 2: not a dynamic, do nothing
+ pdebug "\t\t\t(Not a dynamic.)"
+ fi
+ rm -f -- "$LDD_OUT"
+ done
+
+}
+
+############################################################
+#
+# Usage:
+# lib_search
+#
+# Output:
+# List of the path including any possible symbolic links
+# of the found libraries.
+#
+# Note: This function takes no argument. It takes the library
+# to look for from the local array LIBLINK.
+# If the local was activated in get_dynamic_dependencies
+# this will search for the library in LOCALSEARCHDIR first.
+# If its not found, then it will look system-wide.
+lib_search() {
+
+ # if activated, start by searching the lib locally
+ if [ "x$LOCALSEARCH" == "x1" ]; then
+ cd "$LOCALSEARCHDIR"
+ local LOCAL_MATCHES=$(find . -name "${LIBLINK[0]}") # | awk -F '.' '{print $1}')".so\*)
+ cd - >/dev/null
+ if [ "x${LOCAL_MATCHES}" != "x" ]; then
+ for LOCALLIB in ${LOCAL_MATCHES}; do
+ grep -q "^${LOCALLIB}\$" "$DONEDONE" && continue
+ echo "${LOCALLIB}" >> "$DONEDONE"
+ get_link_chain "${LOCALSEARCHDIR}/${LOCALLIB}" "${LOCALSEARCHDIR}"
+ get_dynamic_dependencies -l "${LOCALSEARCHDIR}" "${LOCALLIB}"
+ done
+ # found the libs, we are done
+ return
+ fi
+ # mark local search as done
+ fi
+
+ # search the lib on the system since it was not found earlier
+ if [ -n "${LIBLINK[1]}" ] && [ "x${LIBLINK[1]}" != "xnot" ]; then
+ grep -q "^${LIBLINK[1]}\$" "$DONEDONE" && return
+ echo "${LIBLINK[1]}" >> "$DONEDONE"
+ # get chain of symlink for that lib
+ get_link_chain "${LIBLINK[1]}"
+ else
+ pwarning "\t\tLib '${LIBLINK[0]}' from required dir '$ENTRY' neither found in build directory nor on this system."
+ pwarning "\t\tIf this lib is not supplied by another module, this module will probably fail in your final system"
+ fi
+}
+############################################################
+#
+# Usage:
+# get_link_chain <link> [prefix]
+# * <link> must be in absolute form-
+# * [prefix] is the prefix to strip from the ouput.
+#
+# Output:
+# Lists the symlink chain until a hardlink is found.
+#
+get_link_chain() {
+
+ # sanity checks
+ [[ "$1" == /* ]] || perror "get_link_chain() requires absolute paths, given: $1"
+ if [ ! -e $1 -a ! -L $1 ]; then
+ perror "'$1' is a link but its target '$LINK_TARGET' is not in '${LOCALSEARCHDIR}'"
+ fi
+ local PREFIX=
+ if [ $# == 2 ] ; then
+ [ -d "$2" ] || perror "get_link_chain: '$2' is not a directory. Local search can't work..."
+ # got a prefix
+ local PREFIX=$(dirname "$(canonicalize "$2/foo")")
+ [ -d "$PREFIX" ] || perror "Could not canonicalize $2"
+ [[ "$PREFIX" == */ ]] || PREFIX="$PREFIX/"
+ fi
+
+ # canonalize
+ local LINK=$(canonicalize "$1")
+
+ local CHAIN="$LINK"
+
+ # write the first link in the chain
+ if [ "x$PREFIX" != "x" ]; then
+ if [ "x${LINK#$PREFIX}" == "x${LINK}" ]; then
+ # prefix was not in the link
+ echo "$LINK"
+ else
+ # prefix was in the link
+ echo ./"${LINK#$PREFIX}"
+ fi
+ else
+ # no prefix, copy like it is
+ echo "$LINK"
+ fi
+
+ # now we check for symlinks
+ local TRY=0
+ while [ -L "$LINK" ] && [ $TRY -lt 10 ]; do
+ let TRY=TRY+1
+
+ # save the directory prefix
+ CURRENTDIR=$(dirname "${LINK}")
+ # first follow the link
+ local NEWLINK=$(readlink "$LINK")
+ [ -z "$NEWLINK" -o "$NEWLINK" = "$LINK" ] && break
+ LINK=$NEWLINK
+ CHAIN+=" -> $LINK"
+ # $LINK can be absolute or relative, check cases
+ [[ "$LINK" == /* ]] || LINK=$(canonicalize "$CURRENTDIR"/"${LINK}")
+ # write the first link in the chain
+ if [ "x$PREFIX" != "x" ]; then
+ if [ "x${LINK#$PREFIX}" == "x${LINK}" ]; then
+ # prefix was not in the link
+ if [ ! -e "$LINK" ]; then
+ [ -e "$PREFIX/$LINK" ] && echo "./$LINK"
+ else
+ echo "$LINK"
+ fi
+ else
+ # prefix was in the link
+ echo ./"${LINK#$PREFIX}"
+ fi
+ else
+ # no prefix, copy like it is
+ echo "$LINK"
+ fi
+ done
+ pdebug "\t\t$CHAIN"
+}
+############################################################
+#
+# Usage:
+# list_basic_libs
+#
+# Output:
+# list the path of following basic system libraries:
+# - libc.so, ld-linux.so
+#
+list_basic_libs() {
+ for i in $(ldd ${SHELL}); do
+ [ $(echo $i | grep '^/' | grep -c ld) -eq 1 -o $(echo $i | grep '^/' | grep -c libc.so) -eq 1 ] && get_link_chain $i
+ done
+}
+
diff --git a/core/includes/chroot.inc b/core/includes/chroot.inc
new file mode 100644
index 00000000..b7f68f65
--- /dev/null
+++ b/core/includes/chroot.inc
@@ -0,0 +1,248 @@
+# -----------------------------------------------------------------------------
+#
+# Copyright (c) 2014 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+#
+# Common functions for chrooting
+#
+# -----------------------------------------------------------------------------
+
+declare -rg CHROOT_TEMPDIR="${ROOT_DIR}/tmp/chroot"
+declare -rg CHROOT_MOUNTDIR="${CHROOT_TEMPDIR}/rootmount"
+declare -rg CHROOT_BINDDIR="${CHROOT_TEMPDIR}/rootbind"
+declare -rg CHROOT_LOWERDIR="/"
+declare -rg CHROOT_BINDMOUNTS="/dev /proc /sys /run"
+
+
+# Helper function to setup the directory structure
+chroot_prepare_dirs() {
+ # first check if CHROOT_TEMPDIR exists
+ if [ -d "${CHROOT_TEMPDIR}" ]; then
+ # try to umount and rmdir CHROOT_MOUNTDIR
+ umount "${CHROOT_MOUNTDIR}" 2>/dev/null
+ if [ -d "${CHROOT_MOUNTDIR}" ]; then
+ rmdir "${CHROOT_MOUNTDIR}" || perror "Could not remove CHROOT_MOUNTDIR '${CHROOT_MOUNTDIR}', meaning it has stuff in it. Aborting..."
+ fi
+
+ # try to umount and rmdir CHROOT_BINDDIR
+ umount "${CHROOT_BINDDIR}" 2>/dev/null
+ if [ -d "${CHROOT_BINDDIR}" ]; then
+ rmdir "${CHROOT_BINDDIR}" || perror "Could not remove CHROOT_BINDDIR '${CHROOT_BINDDIR}', meaning it has stuff in it. Aborting..."
+ fi
+
+ # try to rmdir CHROOT_TEMPDIR
+ if [ -d "${CHROOT_TEMPDIR}" ]; then
+ rmdir "${CHROOT_TEMPDIR}" || perror "Could not remove CHROOT_TEMPDIR '${CHROOT_TEMPDIR}', meaning it has stuff in it. Aborting..."
+ fi
+ fi
+
+ mkdir -p "${CHROOT_TEMPDIR}" || perror "Could not create base directory for mount directories $CHROOT_TEMPDIR."
+ for DIR in "${CHROOT_BINDDIR}" "${CHROOT_MOUNTDIR}"; do
+ mkdir -p "${DIR}" || perror "Could not create directory for mount directory $DIR."
+ done
+}
+
+# Helper to mount the overlay structure:
+# - bind mount system / to CHROOT_BINDDIR and make it read-only
+# - make an overlay from CHROOT_LOWERDIR CHROOT_UPPERDIR
+# - bind mount additional pseudo-fs (as given in CHROOT_BINDMOUNTS)
+chroot_prepare_mounts() {
+
+ # first mount / on CHROOT_BINDDIR and remount read-only
+ mount -o bind "${CHROOT_LOWERDIR}" "${CHROOT_BINDDIR}" \
+ || perror "Could not bind-mount CHROOT_LOWERDIR '$CHROOT_LOWERDIR' to CHROOT_BINDDIR '$CHROOT_BINDDIR'."
+ mount -o remount,ro,bind "${CHROOT_BINDDIR}" || perror "Could not remount CHROOT_BINDDIR '$CHROOT_BINDDIR' read-only."
+
+ # check that it really is read-only
+ [ "x$(mount | grep -E "^/ on ${CHROOT_BINDDIR}" | grep -v '\(.*ro.*\)')" != "x" ] \
+ && perror "CHROOT_BINDDIR '${CHROOT_BINDDIR}' is not read-only! Aborting..."
+
+ # Note: The overlay fs mount syntax seems to be changed between Ubuntu 14.04.2 and 14.04.3 (Kernel 3.13 and 3.19). Instead of
+ # checking overlay-modinfo (which may fail if overlayfs is not incorporated as module) or kernel versions, we simply try to
+ # mount 'old school' first and then, if that fails, the new way to mount with workdir. See differences in mount syntax below.
+ pinfo "Now mounting overlayfs. Trying old mount syntax (up to Kernel 3.13) ..."
+ mount -t overlayfs overlayfs -o lowerdir="${CHROOT_BINDDIR}",upperdir="${CHROOT_UPPERDIR}" "${CHROOT_MOUNTDIR}" 2>/dev/null
+ if [ $? -ne 0 ]; then
+ pinfo "Old mount syntax failed. Trying new mount syntax (Kernel 3.19+) ..."
+ # We have to use a overlayfs workdir which _must_ be in the same filesystem as CHROOT_UPPERDIR. So
+ # we traverse to the directory below CHROOT_UPPERDIR and mkdir/mktemp a workdir there. In the possible
+ # case that CHROOT_UPPERDIR is the root dir of a filesystem there's nothing we can do but exit.
+ CHROOT_WORKDIR="$(mktemp -d $(dirname ${CHROOT_UPPERDIR})/workdirXXX)" \
+ || perror "Could not mkdir overlayfs workdir $CHROOT_WORKDIR for new overlayfs mount syntax."
+ # Now we try to mount the overlayfs in the new fashion:
+ mount -t overlayfs overlayfs -o lowerdir="$CHROOT_LOWERDIR",upperdir="${CHROOT_UPPERDIR}",workdir="${CHROOT_WORKDIR}" "${CHROOT_MOUNTDIR}" \
+ || perror "Could not mount (overlayfs) $CHROOT_LOWERDIR, $CHROOT_UPPERDIR to $CHROOT_BINDDIR."
+ pinfo "New overlayfs mount syntax has worked, commencing."
+ else
+ pinfo "Old overlayfs mount syntax has worked, commencing."
+ fi
+
+ # mount pseudo-filesystems
+ for DIR in $CHROOT_BINDMOUNTS; do
+ mount -o bind "${DIR}" "${CHROOT_MOUNTDIR}/${DIR}" \
+ || perror "Could not bind mount '$DIR' into CHROOT_MOUNTDIR/DIR '$CHROOT_MOUNTDIR/$DIR'."
+ done
+}
+
+# Helper to generate the mighty autoexec.bat
+chroot_gen_autoexec() {
+ # create the script to be automatically executed.
+ cat >"${CHROOT_MOUNTDIR}/autoexec.bat"<<-EOF
+ #!/bin/bash
+ #######################################################
+ # #
+ # Warning! #
+ # #
+ # This file is only meant to be executed within #
+ # the specially chrooted mltk building environment. #
+ # #
+ # Do NOT execute it if you are not sure what you do, #
+ # it may be very harmful if being run in a normal #
+ # system environment! #
+ # #
+ #######################################################
+ echo "chroot started successfully."
+ EOF
+
+ # dump the piped input to it
+ cat >> "${CHROOT_MOUNTDIR}/autoexec.bat"
+
+ # make it executable
+ chmod +x "${CHROOT_MOUNTDIR}/autoexec.bat" || perror "Failed to make '${CHROOT_MOUNTDIR}/autoexec.bat' exeutable."
+}
+
+chroot_handle_whiteouts() {
+ local WHITEOUT_LIST="${CHROOT_UPPERDIR}/overlay.whiteout.list"
+ rm -f -- "$WHITEOUT_LIST="
+ #mkdir -p "$(dirname "$WHITEOUT_LIST")" || perror "Could not create $(dirname "$WHITEOUT_LIST")"
+ pdebug "Searching for overlayfs-whiteouts ..."
+ for WHITEOUT in $(find "$CHROOT_UPPERDIR" -lname "(overlay-whiteout)"); do
+ pdebug "Whiteout found: $WHITEOUT"
+ echo "/./${WHITEOUT#$CHROOT_UPPERDIR}" >> "$WHITEOUT_LIST"
+ rm -f -- "$WHITEOUT" || perror "Could not delete whiteout $WHITEOUT!"
+ done
+ pinfo "Whiteout list dumped to '${CHROOT_UPPERDIR}/overlay.whiteout.list'"
+}
+
+###############################################################################
+#
+# MAIN FUNCTION
+#
+# Main function to be called from the outside
+# Usage:
+# chroot_run <build_dir> < <code_to_exec_in_chroot>
+#
+# Example:
+# chroot_run /tmp/chroot_build <<-EOF
+# echo "This will be executed inside the chroot"
+# EOF
+#
+# It will run:
+# - chroot_prepare
+# - chroot $CHROOT_TEMPDIR/rootmount
+# - executes $CHROOT_TEMPDIR/rootmount/autoexec.bat
+# - chroot_cleanup
+chroot_run() {
+ # check args
+ [ $# -eq 1 ] || perror "'chroot_run' requires exactly 1 parameter. Given $#. Use 'chroot_run <build_dir>'"
+
+ local CHROOT_UPPERDIR="$1"
+ mkdir -p "$1"
+
+ # first prepare the dir structure
+ chroot_prepare_dirs || perror "'chroot_prepare_dirs' failed with $?."
+ chroot_prepare_mounts || perror "'chroot_prepare_mounts' failed with $?."
+
+ # generate the code to be executed when chroot'ing
+ chroot_gen_autoexec || perror "'chroot_gen_autoexec' failed with $?."
+
+ # do the chroot
+ exec 0>&8 # This redirection is used for debugging within a chroot
+ chroot --userspec root:root "${CHROOT_MOUNTDIR}" /autoexec.bat
+ local RET=$?
+ if [ "$RET" -eq 0 ]; then
+ pinfo "chroot executed '${CHROOT_MOUNTDIR}/autoexec.bat' succeeded."
+ else
+ perror "Failed to run '$CHROOT_MOUNTDIR/autoexec.bat' inside the chroot to '$CHROOT_MOUNTDIR' with error code: $RET"
+ fi
+
+ # handle whiteouts
+ chroot_handle_whiteouts || perror "'chroot_handle_whiteouts' failed with error code: $?"
+
+ # finally cleanup all the mounting stuff we did previously
+ chroot_cleanup_mounts || perror "'chroot_cleanup' failed with $?."
+}
+
+###############################################################################
+#
+# CLEANUP FUNCTIONS
+#
+# Helper to check if the given path is mounted
+chroot_check_mount_point() {
+ [ "$#" -eq 1 ] || perror "'chroot_check_mount_point' called with $# arguements, only 1 accepted."
+ local MOUNT="$1"
+ if [ "x$(mount | grep "$(readlink -f $MOUNT)")" != "x" ]; then
+ # still mounted
+ pdebug "'$MOUNT' is mounted!"
+ return 1
+ else
+ pdebug "'$MOUNT' is not mounted."
+ return 0
+ fi
+}
+
+# Helper to umount the given path
+chroot_umount() {
+ [ "$#" -eq 1 ] || perror "'chroot_umount' called with $# arguments, only 1 accepted."
+ local MOUNT="$1"
+
+ # check if MOUNT is mounted
+ if ! chroot_check_mount_point "${MOUNT}"; then
+ # still mounted
+ if umount -l "${MOUNT}"; then
+ pdebug "Successfully umounted '${MOUNT}'."
+ else
+ pwarning "Could not umount '${MOUNT}'! Trying again..."
+ # now it gets ugly
+ for i in `seq 1 5`; do
+ umount -l "${MOUNT}" && return 0
+ done
+ perror "Could not umount '${MOUNT}' after 5 tries! This shouldn't happen. Check your scripts."
+ fi
+ else
+ pdebug "'${MOUNT}' is not mounted."
+ fi
+
+ # better be safe than sorry
+ chroot_check_mount_point "$MOUNT" || perror "'$MOUNT' is still mounted, exiting before something bad happens..."
+}
+
+# Helper to cleanup the temporary mounts
+chroot_cleanup_mounts() {
+ if [[ "$(mount | grep -c $CHROOT_TEMPDIR)" -gt 0 ]]; then # No point in unmounting then...
+ for DIR in $CHROOT_BINDMOUNTS; do
+ chroot_umount "${CHROOT_MOUNTDIR}/${DIR}"
+ done
+ chroot_umount "${CHROOT_MOUNTDIR}"
+ chroot_umount "${CHROOT_BINDDIR}"
+ else
+ pinfo "Nothing chroot-related is mounted - exiting."
+ fi
+
+ # In case of 'new' overlayfs mount - should perhaps be handled via flag...
+ if [ -d "${CHROOT_WORKDIR}" ]; then
+ # Too much of a coward to rm -rf somewhere. Both directories should be empty so we use rmdir.
+ rmdir "${CHROOT_WORKDIR}/work" && pinfo "rmdir-ed CHROOT_WORKDIR/work ${CHROOT_WORKDIR}/work needed for new overlayfs mount syntax." \
+ || pinfo "Could not rmdir CHROOT_WORKDIR/work ${CHROOT_WORKDIR}/work - clean it by hand."
+ rmdir "${CHROOT_WORKDIR}" && pinfo "rmdir-ed CHROOT_WORKDIR ${CHROOT_WORKDIR} needed for new overlayfs mount syntax." \
+ || pinfo "Could not rmdir CHROOT_WORKDIR ${CHROOT_WORKDIR} needed for new overlayfs mount syntax - clean by hand."
+ fi
+}
diff --git a/core/includes/clean_module_funcs.inc b/core/includes/clean_module_funcs.inc
new file mode 100644
index 00000000..91f13942
--- /dev/null
+++ b/core/includes/clean_module_funcs.inc
@@ -0,0 +1,23 @@
+# Called when the sources for this module need to be fetched.
+# Not called if fetched_source.flag exists
+fetch_source() {
+ :
+}
+
+# Called when the module should be built.
+# Not called if build_complete.flag exists
+build() {
+ :
+}
+
+# Called after the relevant files from the module's build dir
+# have been copied to the target dir.
+post_copy() {
+ :
+}
+
+# Called when this module is about to be handled, before fetching the source.
+module_load() {
+ :
+}
+
diff --git a/core/includes/cleanup.inc b/core/includes/cleanup.inc
new file mode 100644
index 00000000..9716c841
--- /dev/null
+++ b/core/includes/cleanup.inc
@@ -0,0 +1,34 @@
+# -----------------------------------------------------------------------------
+#
+# Copyright (c) 2014 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+#
+# Trapped cleanup functions
+#
+# -----------------------------------------------------------------------------
+
+__init () {
+ # run 'cleanexit' when CTRL-c is pressed, an abrupt program termination or exit happens
+ trap cleanexit SIGINT SIGTERM
+}
+
+# main cleaner function
+cleanexit() {
+ trap '' SIGINT SIGTERM # from now on, ignore INT and TERM
+ unset_quiet # needed to get trap functioning correctly
+ pwarning "SIGINT/SIGTERM triggered - cleaning up ..."
+ # unmount and remove the temporary chroot stuff
+ pinfo "Calling chroot_cleanup_mounts ..."
+ chroot_cleanup_mounts
+ # TODO vmware etc/vmware/config stuff here, if it is still needed
+ exit 1 # perhaps a better exit code?
+}
+
diff --git a/core/includes/distribution.inc b/core/includes/distribution.inc
new file mode 100644
index 00000000..57bafdf2
--- /dev/null
+++ b/core/includes/distribution.inc
@@ -0,0 +1,53 @@
+
+detect_distribution () {
+ # Set up distribution and package management
+ [ -z "$SYS_DISTRIBUTION" ] && perror "SYS_DISTRIBUTION not set (should be done by helper/distribution.inc)"
+ # Then determine packet manager
+ case "$SYS_DISTRIBUTION" in
+ ubuntu)
+ PACKET_MANAGER="apt"
+ PACKET_HANDLER="dpkg"
+ detect_ubuntu_lts
+ ;;
+ debian)
+ PACKET_MANAGER="apt"
+ PACKET_HANDLER="dpkg"
+ ;;
+ opensuse)
+ PACKET_MANAGER="zypper"
+ PACKET_HANDLER="rpm"
+ ;;
+ centos|scientific|fedora)
+ PACKET_MANAGER="yum"
+ PACKET_HANDLER="rpm"
+ ;;
+ *)
+ perror "Unknown Distribution: $SYS_DISTRIBUTION - Please specify its packet manager in core/bin/setup_target"
+ ;;
+ esac
+ # Get version - we mangle this quite a bit. first make sure it has no spaces, then split version at period (.), underscore (_) and dash (-)
+ SYS_VERSION=$(lsb_release -rs | tolower)
+ SYS_CODENAME=$(lsb_release -c|cut -f 2) # Codename: eg. Ubuntu raring, openSuse: Dartmouth etc.
+ local VERSION=$(echo $SYS_VERSION | sed -r 's/\s//g;s/[\._]/ /g;s/-//g')
+ local STRTMP=""
+ PRINT_SYS_VERSIONS="*.conf.$SYS_DISTRIBUTION"
+ SYS_VERSIONS="$SYS_DISTRIBUTION"
+ for PART in $VERSION; do
+ [ -z "$PART" ] && continue
+ STRTMP+=".$PART"
+ SYS_VERSIONS="${SYS_DISTRIBUTION}${STRTMP} $SYS_VERSIONS"
+ PRINT_SYS_VERSIONS="*.conf.${SYS_DISTRIBUTION}${STRTMP} $PRINT_SYS_VERSIONS"
+ done
+ pinfo "Config source order: *.conf first, then the first one of these (if found)"
+ pinfo "$PRINT_SYS_VERSIONS"
+}
+
+detect_ubuntu_lts () {
+ local TMP=$(dpkg -S /usr/bin/Xorg)
+ [[ "$TMP" == xserver-xorg* ]] || perror "Could not detect xserver package version (returned: $TMP)"
+ TMP=${TMP%: *}
+ TMP=${TMP#xserver-xorg-core}
+ pinfo "Ubuntu LTS Xorg suffix: $TMP"
+ UBUNTU_XORG_PKG_SUFFIX="$TMP"
+}
+
diff --git a/core/includes/downloader.inc b/core/includes/downloader.inc
new file mode 100644
index 00000000..7ec8d872
--- /dev/null
+++ b/core/includes/downloader.inc
@@ -0,0 +1,80 @@
+# helper functions for downloading files or packages
+
+# download a file. usage:
+# download FROM [TO]
+# 1. download "http://example.com/something.tar.gz"
+# 2. download "http://example.com/something.tar.gz" "somename.tar.gz"
+download () {
+ [ $# -lt 1 -o $# -gt 2 ] && perror "download called with $# arguments, need 1 or 2"
+ [ -z "$1" ] && perror "download: URL empty."
+ local URL="$1"
+ # If a sourceforge mirror is set in ./config, try to use it
+ if [ -n "$sourceforge_mirror" ] && [[ "$URL" != *use_mirror* ]] && [[ "$URL" == *sourceforge.net* || "$URL" == *.sf.net* ]]; then
+ if [[ "$URL" == *\?* ]]; then
+ URL+="&use_mirror=$sourceforge_mirror"
+ else
+ URL+="?use_mirror=$sourceforge_mirror"
+ fi
+ fi
+ if [ $# -eq 2 ]; then
+ [ -z "$2" ] && perror "download: target file name given but empty"
+ pinfo "Downloading $2 from '$URL'...."
+ wget -O "$2" "$URL"
+ local RET=$?
+ else
+ pinfo "Downloading '$URL'...."
+ wget "$URL"
+ local RET=$?
+ fi
+ [ "x$RET" != "x0" ] && perror "downloading $URL failed, wget returned exit code $RET"
+}
+
+# download a file and untar it. usage:
+# download_untar FROM TO_DIR [TEMPFILE]
+# 1. download_untar "http://example.com/something.tar.gz" "src/"
+# 2. download_untar "http://example.com/something.tar.gz" "src/" "temporary_name.tar.gz"
+download_untar () {
+ [ $# -lt 2 -o $# -gt 3 ] && perror "download_untar called with $# arguments, need 2 or 3"
+ local URL="$1"
+ local DEST="$2"
+ if [ $# -eq 2 ]; then
+ local TMPFILE=dltmp.$(basename "$URL")
+ else
+ local TMPFILE="$3"
+ fi
+ pdebug "$URL ---> $TMPFILE"
+ download "$URL" "$TMPFILE"
+ mkdir -p "$DEST"
+ pinfo "Unpacking to '$DEST'..."
+ tar xf "$TMPFILE" -C "${DEST}/"
+ local RET=$?
+ [ "x$RET" != "x0" ] && perror "could not untar $TMPFILE to $DEST (tar returned $RET)"
+ unlink "$TMPFILE"
+}
+
+# Download first param URL to second param path,
+# iff the local file does not exist or is empty.
+# Return 1 if remote file does not exist, 0 otherwise
+download_if_empty() {
+ [ $# -ne 2 ] && perror "download_if_empty: want 2 args, got $# ($@)"
+ local SRC="$1"
+ local DST="$2"
+ [ -s "$DST" ] && pdebug "Not downloading $DST: already there." && return 0
+ pdebug "Downloading $DST"
+ [ -e "$DST" ] && unlink "$DST"
+ local DSTDIR="$(dirname "$DST")"
+ pdebug "wgetting $SRC"
+ local TMP=$(mktemp)
+ wget -O "$TMP" "$SRC"
+ local RET=$?
+ if [ "x$RET" = "x0" -a -s "$TMP" ]; then
+ mkdir -p "$DSTDIR"
+ mv "$TMP" "$DST" || perror "Could not mv '$TMP' '$DST'"
+ return 0
+ fi
+ pdebug "WGET failed"
+ rmdir "$DSTDIR"
+ unlink "$TMP"
+ return 1
+}
+
diff --git a/core/includes/helper/README.helper b/core/includes/helper/README.helper
new file mode 100644
index 00000000..ebe242a0
--- /dev/null
+++ b/core/includes/helper/README.helper
@@ -0,0 +1,2 @@
+Put your helper units here
+Naming convention is <unitname>.inc
diff --git a/core/includes/helper/distribution.inc b/core/includes/helper/distribution.inc
new file mode 100644
index 00000000..f26ca46c
--- /dev/null
+++ b/core/includes/helper/distribution.inc
@@ -0,0 +1,4 @@
+# Get simple distribution name
+# This is also being used via ./openslx, not only via ./mltk,
+# so it has not been moved to remote/includes.
+SYS_DISTRIBUTION=$(lsb_release -is | tr '[A-Z]' '[a-z]' | sed -r 's/[^a-z0-9]//g;s/project$//g;s/scientificsl$/scientific/g')
diff --git a/core/includes/helper/fileutil.inc b/core/includes/helper/fileutil.inc
new file mode 100644
index 00000000..9dc2c07b
--- /dev/null
+++ b/core/includes/helper/fileutil.inc
@@ -0,0 +1,39 @@
+#
+# copy list of files using tar
+tarcopy () {
+ if [ $# -gt 0 -a "x$1" == "x-i" ]; then
+ shift
+ local IGNORE_ERROR="--ignore-failed-read"
+ else
+ local IGNORE_ERROR=
+ fi
+ if [ "x$IGNORE_TAR_ERROR" != "x" ]; then
+ unset IGNORE_TAR_ERROR
+ IGNORE_ERROR="--ignore-failed-read"
+ fi
+ [ $# -ne 2 ] && perror "Sanity check failed: tarcopy needs exactly two params, but $# were given."
+ local FROM=$(trim "$1")
+ local TO=$(trim "$2")
+ if [ -z "$FROM" ]; then
+ pwarning "tarcopy called with empty input list (dest was '$TO')"
+ return
+ fi
+ local SHORT=$FROM
+ [ ${#SHORT} -gt 30 ] && SHORT=$(echo "$SHORT" | sed ':a;N;$!ba;s/\n/ /g' | cut -c-25)...$(echo "$SHORT" | cut -c$[${#SHORT} - 4]-)
+ [ -z "$TO" ] && perror "tarcopy called with empty destination."
+ [ ! -d "$TO" ] && { mkdir -p "$TO" || perror "could not create destination "$TO" for tar-copy."; }
+ # TODO count files copied? would remove the need to do it everywhere :)
+ tar $IGNORE_ERROR -cpP $FROM | tar -xp -C "$TO" \
+ --transform 's,^/lib/udev/rules.d,/usr/lib/udev/rules.d,' \
+ 2> /dev/null
+ local PS=(${PIPESTATUS[*]})
+ [ "x$IGNORE_ERROR" == "x" -a "x${PS[0]}" != "x0" ] && perror "packing-part of tar-copy from '$SHORT' to '$TO' failed. (${PS[0]})"
+ [ "x${PS[1]}" != "x0" ] && perror "unpacking-part of tar-copy from '$SHORT' to '$TO' failed. (${PS[1]})"
+}
+
+# usage: CANONICALIZED_PATH=$(canonalize <path>)
+# usage with relative path requires you to be in the correct directory.
+canonicalize() {
+ cd -P -- "$(dirname -- "$1")" && printf '%s\n' "$(pwd -P)/$(basename -- "$1")"
+}
+
diff --git a/core/includes/helper/logging.inc b/core/includes/helper/logging.inc
new file mode 100644
index 00000000..1e1f5996
--- /dev/null
+++ b/core/includes/helper/logging.inc
@@ -0,0 +1,53 @@
+[ -n "$MLTK_QUIET" ] && return 0
+
+# This module is an exception, it doesn't use __init but runs commands directly...
+# Otherwise we cannot ensure that other module's init functions won't run first
+# and mess up the fds
+
+set_quiet () {
+ if [ "x$MLTK_QUIET" != "x1" ]; then
+ exec 6>&1 > "$LOG_DIR/stdout.log"
+ exec 7>&2 2> "$LOG_DIR/stderr.log"
+ MLTK_QUIET=1
+ fi
+}
+
+unset_quiet () {
+ if [ "x$MLTK_QUIET" == "x1" ]; then
+ exec 1>&6 6>&-
+ exec 2>&7 7>&-
+ exec 6>&2
+ MLTK_QUIET=0
+ fi
+}
+
+
+pinfo () {
+ echo -e "\033[38;5;10m[info]\033[0m $TOOL_STR $@" >&6
+}
+
+perror () {
+ echo -e "\033[38;5;9m[error]\033[0m $TOOL_STR $@" >&6
+ qnd_exit
+}
+
+pwarning () {
+ echo -e "\033[38;5;11m[warning]\033[0m $TOOL_STR $@" >&6
+}
+
+pdebug () {
+ if [ "x$MLTK_QUIET" = "x1" ]; then
+ echo -e "[DEBUG] $TOOL_STR $@" >&2
+ else
+ echo -e "\033[38;5;6m[debug]\033[0m $TOOL_STR $@" >&6
+ fi
+}
+
+exec 6>&2
+exec 8>&0 # This redirection is used for chroot debugging
+
+MLTK_QUIET=0
+declare -rg LOG_DIR=${ROOT_DIR}/var/log
+mkdir -p "$LOG_DIR" || perror "Could not create '$LOG_DIR'"
+true
+
diff --git a/core/includes/helper/string.inc b/core/includes/helper/string.inc
new file mode 100644
index 00000000..077f1719
--- /dev/null
+++ b/core/includes/helper/string.inc
@@ -0,0 +1,31 @@
+
+# usage: VAR=$(trim " string ")
+trim() {
+ local var=$1
+ var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters
+ var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters
+ echo -n "$var"
+}
+
+# Inline version of trim, use when piping
+itrim () {
+ sed -r 's/^\s+//g;s/\s+$//g'
+}
+
+escape_search() {
+ sed -e 's/[]\/()$*.^|[]/\\&/g'
+
+}
+
+escape_replace() {
+ sed -e 's/[\/&]/\\&/g'
+}
+
+tolower () {
+ tr '[A-Z]' '[a-z]'
+}
+
+toupper () {
+ tr '[a-z]' '[A-Z]'
+}
+
diff --git a/core/includes/kernel.inc b/core/includes/kernel.inc
new file mode 100644
index 00000000..671dca42
--- /dev/null
+++ b/core/includes/kernel.inc
@@ -0,0 +1,218 @@
+#
+# Common functions to copy kernel related files
+#
+############################################################
+#
+#
+# copies kernel modules as given in the module config file
+# * depends on 'depmod'
+# * requires REQUIRED_KERNEL_MODULES to be set.
+# (entries must be a relative path to /lib/modules/<SYSTEM_KERNEL_LONG>)
+#
+# ex: for /lib/modules/3.2.0/kernel/fs/nfs/nfs.ko
+# must be given as kernel/fs/nfs/nfs.ko
+#
+
+# set global KERNEL_BASE_DIR as in the directory containing lib/modules and lib/firmware
+# for system kernel, that is "/" and for an openslx kernel KERNEL_BUILD_DIR
+KERNEL_BASE_DIR=""
+
+get_kernel_version () {
+ pinfo "Running fallback get_kernel_version()"
+ # Running system kernel version
+ if [ -z "$SYSTEM_KERNEL_LONG" ]; then
+ declare -rg SYSTEM_KERNEL_LONG=$(uname -r)
+ declare -rg SYSTEM_KERNEL_SHORT=$(grep -o -E '^[0-9\.]+' <<<$SYSTEM_KERNEL_LONG)
+ fi
+}
+
+check_kernel_base_dir () {
+
+ # check if KERNEL_BASE_DIR was set, if not we don't know
+ # whether kernel-openslx or kernel-system has been built
+ # and therefore not were to look for kernel modules,
+ # firmware and the kernel itself
+
+ if [ -z "${KERNEL_BASE_DIR}" ]; then
+ # this is bad, abort
+ perror "KERNEL_BASE_DIR is not set. The kernel module did not run properly"
+ else
+ pinfo "KERNEL_BASE_DIR is '$KERNEL_BASE_DIR'"
+ fi
+
+}
+
+copy_kernel_modules () {
+ pinfo "Copying kernel modules for kernel ${SYSTEM_KERNEL_LONG}..."
+ [ -z "${REQUIRED_KERNEL_MODULES}" ] && perror "REQUIRED_KERNEL_MODULES is empty. Check your config file."
+ [ -z "${KERNEL_HEADERS_DIR}" ] && perror "KERNEL_HEADERS_DIR is empty. Kernel headers appears to be missing."
+
+
+ check_kernel_base_dir
+
+ local OLD_DIR="$(pwd)"
+
+ #
+ # process modules list
+ #
+ # search for modules in KERNEL_BASE_DIR
+ cd "${KERNEL_BASE_DIR}" || perror "Could not cd to ${KERNEL_BASE_DIR}"
+
+ local KERNEL_MODULES_DIR="lib/modules/${TARGET_KERNEL_LONG}"
+ local KERNEL_MODULES_LIST=""
+ local REQUIRED_KERNEL_MODULES_EXPANDED=""
+ local KERNEL_MODULE=""
+ local KERNEL_MODULE_PATH=""
+ local ELEM=""
+
+ # Do some fancy stuff to allow wildcards etc. in required kernel modules.
+ cd "${KERNEL_MODULES_DIR}"
+ for KERNEL_MODULE in ${REQUIRED_KERNEL_MODULES}; do
+ for ELEM in $KERNEL_MODULE; do
+ echo $ELEM | grep '\*' && pwarning "Could not expand '$ELEM'." && continue
+ REQUIRED_KERNEL_MODULES_EXPANDED+=" $ELEM"
+ done
+ done
+ cd - 2>/dev/null
+ pinfo "Expanded the list of $(echo "$REQUIRED_KERNEL_MODULES" | wc -w) required kernel modules to $(echo "$REQUIRED_KERNEL_MODULES_EXPANDED" | wc -w)"
+
+ #
+ # now loop over given modules and locate them
+ #
+ for KERNEL_MODULE in ${REQUIRED_KERNEL_MODULES_EXPANDED}; do
+ local KERNEL_MODULE_PATH="${KERNEL_MODULES_DIR}/${KERNEL_MODULE}"
+ if grep "^${KERNEL_MODULE}$" "${KERNEL_BASE_DIR}/${KERNEL_MODULES_DIR}/modules.builtin" >/dev/null; then
+ pdebug "Already built-in ${KERNEL_MODULE}."
+ elif [ -e "${KERNEL_MODULE_PATH}" ]; then
+ pdebug "Copying '${KERNEL_MODULE_PATH}'"
+ KERNEL_MODULES_LIST+=" ${KERNEL_MODULE_PATH}"
+ else
+ pwarning "Module ${KERNEL_MODULE} not found. Skipping. (might cause problems on certain clients!)"
+ continue
+ fi
+
+ # check for dependencies
+ local DEPS=$(grep "${KERNEL_MODULE}:" "${KERNEL_BASE_DIR}/${KERNEL_MODULES_DIR}/modules.dep" | cut -d ":" -f2-)
+ if [ ! -z "$DEPS" ]; then
+ for DEP in $DEPS; do
+ pdebug "Adding dep: ${KERNEL_MODULES_DIR}/$DEP"
+ KERNEL_MODULES_LIST+=" ${KERNEL_MODULES_DIR}/$DEP"
+ done
+ else
+ pdebug "${KERNEL_MODULE} has no dependencies."
+ fi
+ done
+
+ if [ ! -z "${KERNEL_MODULES_LIST}" ]; then
+ local COUNT=$(echo "${KERNEL_MODULES_LIST}" | wc -w)
+ pinfo "Copying $COUNT modules to target directory."
+ tarcopy "${KERNEL_MODULES_LIST}" "${TARGET_BUILD_DIR}"
+ fi
+
+ #
+ # generate modules map files
+ #
+ # first strip modules.order of all the modules we don't use
+ cat "${KERNEL_MODULES_DIR}/modules.order" | grep -E "$(echo ${REQUIRED_KERNEL_MODULES} | tr '\ ' '|' | tr '_' '.' | tr '-' '.')" \
+ >> "${TARGET_BUILD_DIR}/${KERNEL_MODULES_DIR}/modules.order"
+ # copy list of builtin kernel modules
+ cp "${KERNEL_MODULES_DIR}/modules.builtin" "${TARGET_BUILD_DIR}/${KERNEL_MODULES_DIR}"
+ # with modules.order and modules.builtin, we can run depmod for the rest of the files
+ depmod -b "${TARGET_BUILD_DIR}" -a "${TARGET_KERNEL_LONG}"
+
+ # go back to wherever we were
+ cd "${OLD_DIR}" || perror "Could not cd back to ${OLD_DIR}."
+}
+
+copy_firmware () {
+
+ pinfo "Copying firmware for kernel ${SYSTEM_KERNEL_LONG}..."
+ [ -z "${REQUIRED_FIRMWARE}" ] && perror "REQUIRED_FIRMWARE is empty. Check your config file."
+
+ check_kernel_base_dir
+
+ local OLD_DIR=$(pwd)
+ #
+ # process firmware list
+ #
+ cd "${KERNEL_BASE_DIR}" || perror "Could not cd to ${KERNEL_BASE_DIR}"
+ local FIRMWARE_DIR="lib/firmware"
+ local FIRMWARE_SYSTEM_LIST=""
+ local FIRMWARE_BUILD_LIST=""
+ for FIRMWARE in ${REQUIRED_FIRMWARE}; do
+ local FOUND=0
+ # check for firmware in the build directory of the kernel
+ for CANDIDATE in "${FIRMWARE_DIR}/${FIRMWARE}" "${FIRMWARE_DIR}/${TARGET_KERNEL_LONG}/${FIRMWARE}"; do
+ if [ -e "${CANDIDATE}" ]; then
+ pdebug "Copying from kernel base dir ('$KERNEL_BASE_DIR'): '${CANDIDATE}'"
+ FIRMWARE_BUILD_LIST+=" ${CANDIDATE}"
+ FOUND=1
+ fi
+ done
+
+ # dont look under / if KERNEL_BASE_DIR is already /
+ #if [ "x${KERNEL_BASE_DIR}" == "x/" ]; then
+ # [ $FOUND -ne 1 ] && pwarning "Neither '${FIRMWARE_DIR}/${FIRMWARE}' nor '${FIRMWARE_DIR}/${TARGET_KERNEL_LONG}/${FIRMWARE}' found on the system"
+ # continue
+ #fi
+
+ # if we didn't found it in the kernel build directory, check for firmware in the system firmware directory
+ #if [ $FOUND -ne 1 ]; then
+ for CANDIDATE in "/${FIRMWARE_DIR}/${FIRMWARE}" "/${FIRMWARE_DIR}/${SYSTEM_KERNEL_LONG}/${FIRMWARE}"; do
+ if [ -e "${CANDIDATE}" ]; then
+ if [ $(echo "${CANDIDATE}" | grep -c "${SYSTEM_KERNEL_LONG}") -eq 0 ]; then
+ pdebug "Copying from system: '${CANDIDATE}'"
+ FIRMWARE_SYSTEM_LIST+=" ${CANDIDATE}"
+ else
+ pdebug "Copying from system: '${CANDIDATE}' to ${FIRMWARE_DIR}/${TARGET_KERNEL_LONG}/${FIRMWARE}"
+ FIRMWARE_SYSTEM_LIST+=" /${FIRMWARE_DIR}/${SYSTEM_KERNEL_LONG}/${FIRMWARE}"
+ fi
+ FOUND=1
+ fi
+ done
+ #fi
+
+ [ $FOUND -ne 1 ] && pwarning "Neither '${FIRMWARE_DIR}/${FIRMWARE}' nor '${FIRMWARE_DIR}/${TARGET_KERNEL_LONG}/${FIRMWARE}' "\
+ " was found on the system. Skipping. (might cause problems on certain clients!)"
+ done
+
+ for LIST in "${FIRMWARE_SYSTEM_LIST}" "${FIRMWARE_BUILD_LIST}"; do
+ [ -z "${LIST}" ] && continue
+ echo "${LIST}" >> "${MODULE_BUILD_DIR}/fwlist"
+ local COUNT=$(echo "${LIST}" | wc -w)
+ pinfo "Copying $COUNT firmware to target directory."
+ tarcopy "${LIST}" "${TARGET_BUILD_DIR}"
+ done
+
+ # only for kernel-openslx
+ # post-process to fix the path of the firmwares found on the system unter /lib/firmware/$(uname -r)
+ # which have to be copied to /lib/firmware/${TARGET_KERNEL_LONG}
+ if [ "x${KERNEL_BASE_DIR}" != "x/" ]; then
+ if [ -d "${TARGET_BUILD_DIR}/lib/firmware/${SYSTEM_KERNEL_LONG}" ]; then
+ mkdir -p "${TARGET_BUILD_DIR}/lib/firmware/${TARGET_KERNEL_LONG}/"
+ cd "${TARGET_BUILD_DIR}/lib/firmware/${SYSTEM_KERNEL_LONG}" || perror "old kernel but no old kernel"
+ tarcopy "$(ls)" "${TARGET_BUILD_DIR}/lib/firmware/${TARGET_KERNEL_LONG}/"
+ cd -
+ rm -r "${TARGET_BUILD_DIR}/lib/firmware/${SYSTEM_KERNEL_LONG}" || perror "something went very wrong..."
+ else
+ pdebug "No ${TARGET_BUILD_DIR}/lib/firmware/${SYSTEM_KERNEL_LONG} directory, skipping the merge."
+ fi
+ fi
+
+ cd "${OLD_DIR}" || perror "Could not cd back to ${OLD_DIR}."
+}
+
+copy_kernel () {
+ check_kernel_base_dir
+
+ local TOOL_STR="$TOOL_STR copy_kernel:"
+ local KERNEL_DIR="${ROOT_DIR}/var/builds/kernel"
+
+ [ -d "${KERNEL_DIR}" ] || mkdir -p "${KERNEL_DIR}"
+
+ cp "${ROOT_DIR}/tmp/work/kernel/build/kernel" "${KERNEL_DIR}" || perror "Could not copy '${ROOT_DIR}/tmp/work/kernel/build/kernel' to '${KERNEL_DIR}'"
+
+ # kernel has 0600 perms since ubuntu 14.04, change that once we copied it
+ chmod +r "${KERNEL_DIR}/kernel"
+}
+
diff --git a/core/includes/keyvalueutil.inc b/core/includes/keyvalueutil.inc
new file mode 100644
index 00000000..a0a89db7
--- /dev/null
+++ b/core/includes/keyvalueutil.inc
@@ -0,0 +1,32 @@
+# Helper file for managing key-value containing files
+# There are some specialized conveinience functions here first
+# that mostly just pass a predefined filename to the genric function
+# at the end
+
+# Add the given environment variable to /etc/environment
+add_env () {
+ [ $# -ne 2 ] && perror "Usage: $0 'key' 'value'"
+ [ -z "$1" ] && perror "$0: Empty key!"
+ add_key_value "/etc/environment" "$1" "$2"
+}
+
+#
+# Adds the given key-value-pair to a given file
+# The file will be relative to the current target build dir,
+# even if it starts with a slash.
+# Will perror if the key already exists with a different value
+add_key_value () {
+ [ $# -ne 3 ] && perror "Usage: $0 'file' 'key' 'value'"
+ [ -z "$TARGET_BUILD_DIR" ] && perror "No TARGET_BUILD_DIR set. Aborting for safety."
+ local FILE="$TARGET_BUILD_DIR/$1"
+ local KEY="$2"
+ local VALUE="$(echo "$3" | sed "s/'/\\\\'/g")" # \\\\\\\\\\\\\\\\\\\\\\ßß
+ if [ -s "$FILE" ]; then
+ local CURRENT="$(grep -E "^\s*$KEY=.*$" "$FILE" | awk -F '=' '{$1=""; printf $0}' | itrim)"
+ [ -n "$CURRENT" -a "'$VALUE'" != "$CURRENT" ] && perror "Cannot set $KEY to '$VALUE' as it is already set to $CURRENT"
+ [ -n "$CURRENT" ] && return 0
+ fi
+ mkdir -p "$(dirname "$FILE")"
+ echo "$KEY='$VALUE'" >> "$FILE"
+}
+
diff --git a/core/includes/packagemanager.inc b/core/includes/packagemanager.inc
new file mode 100644
index 00000000..9fcb4b87
--- /dev/null
+++ b/core/includes/packagemanager.inc
@@ -0,0 +1,187 @@
+#!/bin/bash
+#
+# get all files of required packages by a module
+#
+# Usage:
+# list_content_packages
+# - lists all files/directories in REQUIRED_CONTENT_PACKAGES
+# list_content_packages --files
+# - lists all files in REQUIRED_CONTENT_PACKAGES
+# list_content_packages --dirs
+# - lists all dirs in REQUIRED_CONTENT_PACKAGES
+#
+# NOTE: additional packages needed to be listed can be given
+# through the environment variable EXTRA_PACKAGES
+
+list_content_packages() {
+ [ -z "$REQUIRED_CONTENT_PACKAGES" ] && pinfo "No required packages for $TOOL" && return 1
+ [ $# -gt 2 ] && perror "'list_content_packages' accepts only 1 or no args. $# given."
+ local PACKAGE=""
+ for PACKAGE in $REQUIRED_CONTENT_PACKAGES $EXTRA_PACKAGES; do
+ list_content_package $1 $PACKAGE
+ done
+
+}
+list_content_package(){
+ #[ -z "$EXTRA_PACKAGES" ] || pinfo "Listing additional packages: $EXTRA_PACKAGES"
+ [ $# -gt 2 ] && perror "'list_content_package' accepts max 2 args. $# given."
+ local OP="-e"
+ case "$1" in
+ "--files")
+ OP="-f"
+ ;;
+ "--dirs")
+ OP="-d"
+ ;;
+ "")
+ OP="-e"
+ ;;
+ *)
+ perror "'list_content_packages' invalid argument: $1"
+ ;;
+ esac
+ local PACKAGE="$2"
+ local OPTIONAL="$(echo "$PACKAGE" | cut -c 1)"
+ [ "x$OPTIONAL" = "x@" ] && PACKAGE="$(echo "$PACKAGE" | cut -c 2-)"
+ local FILES=""
+ if [ "$PACKET_HANDLER" = "dpkg" ]; then
+ PACKAGECOMMAND="dpkg -L"
+ elif [ "$PACKET_HANDLER" = "rpm" ]; then
+ PACKAGECOMMAND="rpm -ql"
+ fi
+
+ if [ -n "$REQUIRED_PACKET_FILES_BLACKLIST" ]; then
+ FILES="$($PACKAGECOMMAND "$PACKAGE" | grep "^/" | \
+ grep -v "$REQUIRED_PACKET_FILES_BLACKLIST" | \
+ grep -v -E 'share/(man|doc)|/var/run|/var/log|/etc/init\.d'; \
+ echo ":###:${PIPESTATUS[0]}")"
+ else
+ FILES="$($PACKAGECOMMAND "$PACKAGE" | grep "^/" | grep -v -E 'share/(man|doc)|/var/run|/var/log|/etc/init\.d'; echo ":###:${PIPESTATUS[0]}")"
+ fi
+# FILES="$(rpm -ql "$PACKAGE" | grep "^/" | grep -v -E 'share/(man|doc)|/var/run|/var/log'; echo ":###:${PIPESTATUS[0]}")"
+
+ # ugly hack to get our return value
+ local LPRET=$(echo "$FILES" | awk -F ':###:' '{printf $2}')
+ FILES=$(echo "$FILES" | awk -F ':###:' '{print $1}')
+ if [ "x$LPRET" != "x0" -a "x$OPTIONAL" != "x@" ]; then
+ pdebug "FILES: '$FILES'"
+ perror "dpkg/rpm exited with code '$LPRET' for required package ${PACKAGE}."
+ fi
+ [ "x$LPRET" != "x0" ] && pwarning "dpkg/rpm exited with code '$LPRET' for optional package ${PACKAGE}." && continue
+ [ -z "$FILES" ] && pwarning "list_packet_files empty for packet ${PACKAGE}." && continue
+ pdebug "Packet $PACKAGE has $(echo $FILES | wc -w) files..."
+ for FILE in $FILES; do
+ [ "$OP" "$FILE" ] && echo "$FILE"
+ done
+}
+#
+# Convenience function
+#
+list_packet_files() {
+ list_content_packages --files
+}
+
+#
+# Convenience function
+#
+# install all dependencies of a module
+# goes through all package as given in the variable REQUIRED_INSTALLED_PACKAGES
+install_dependencies() {
+ [ -z "$REQUIRED_INSTALLED_PACKAGES" ] && return
+ install_packages "$REQUIRED_INSTALLED_PACKAGES"
+}
+
+#
+# install given packet through system's packet manager
+# uses PACKET_HANDLER as determined in helper/system.inc
+#
+install_packages() {
+ [ $# -eq 0 ] && perror "Sanity check failed: no argument given to install_package"
+ local PACKAGE_LIST="$@"
+ local INSTALLED_PACKAGES=""
+ local LRET=""
+
+ for PKG in ${PACKAGE_LIST}; do
+ # check if installed:
+ # this is done mainly for performance reasons, even though
+ # reinstalling all packages is a valid possibility too...
+ if [ "x$PACKET_HANDLER" == "xdpkg" ]; then
+ dpkg -l ${PKG} > /dev/null 2>&1
+ LRET=$?
+ elif [ "x$PACKET_HANDLER" == "xrpm" ]; then
+ rpm -ql "${PKG}" > /dev/null 2>&1
+ LRET=$?
+ else
+ perror "No packet manager / handler determined, this should not happen!"
+ fi
+
+ if [ "x$LRET" == "x0" ]; then
+ # check if it is completly installed, not just leftover configuration files
+ if [ "x$PACKET_HANDLER" == "xdpkg" ]; then
+ local INSTALL_STATUS=$(dpkg -l "${PKG}" | grep "${PKG}" | cut -c1-2)
+ if [[ $INSTALL_STATUS != "ii" ]]; then
+ pinfo "$PKG is either missing or a meta-package! Installing it to be sure..."
+ install_package "${PKG}"
+ else
+ # package installed
+ pdebug "${PKG} installed!"
+ fi
+ elif [ "x$PACKET_HANDLER" == "xrpm" ]; then
+ # TODO: blindly install again for now
+ rpm -q "${PKG}" >/dev/null 2>&1 || install_package "${PKG}"
+ fi
+ else
+ # package not installed
+ pdebug "$PKG not installed!"
+ install_package $PKG
+ fi
+ done
+ [ ! -z "$INSTALLED_PACKAGES" ] && pinfo "New packages installed: ${INSTALLED_PACKAGES}"
+}
+
+#
+# install individual package depending on package manager
+#
+install_package() {
+ if [ "$#" -ne 1 ]; then
+ perror "Only call install_package with one argument!"
+ fi
+
+ if [ "x$PACKET_MANAGER" == "xapt" ]; then
+ apt-get install -y ${PKG}
+ local IRET=$?
+ if [ "x$IRET" == "x0" ]; then
+ # $PGK was installed successfully
+ INSTALLED_PACKAGES+="$PKG "
+ else
+ # PKG was not installed
+ # TODO error handling
+ perror "install_packages: apt-get failed with '$IRET' for package '$PKG'"
+ fi
+ elif [ "x$PACKET_MANAGER" == "xzypper" ]; then
+ zypper --no-refresh --non-interactive install --force-resolution ${PKG}
+ local IRET=$?
+ if [ "x$IRET" == "x0" ]; then
+ # $PGK was installed successfully
+ INSTALLED_PACKAGES+="$PKG "
+ else
+ # PKG was not installed
+ # TODO error handling
+ perror "install_packages: zypper failed with '$IRET' for package '$PKG'"
+ fi
+ elif [ "x$PACKET_MANAGER" == "xyum" ]; then
+ yum --assumeyes install ${PKG}
+ local IRET=$?
+ if [ "x$IRET" == "x0" ]; then
+ # $PGK was installed successfully
+ INSTALLED_PACKAGES+="$PKG "
+ else
+ # PKG was not installed
+ # TODO error handling
+ perror "install_packages: yum failed with '$IRET' for package '$PKG'"
+ fi
+ else
+ perror "No packet manager determined, this should not happen!"
+ fi
+}
+
diff --git a/core/includes/paths.inc b/core/includes/paths.inc
new file mode 100644
index 00000000..928ca964
--- /dev/null
+++ b/core/includes/paths.inc
@@ -0,0 +1,31 @@
+#
+# This include tries to determine system paths needed by mltk-modules
+# The idea here is to have a central place to determine paths required
+# by different modules instead of each module determining them on its own.
+#
+
+__init () {
+ # Location of PAM-modules
+ for CANDIDATE in $(strings "$(ldd "$(which login)" | grep libpam.so | head -n 1 | awk '{print $3}')" | grep /lib); do
+ [ -f "$CANDIDATE/pam_unix.so" ] && declare -rg SYS_PAM_MODULES_PATH="$CANDIDATE" && break
+ done
+
+ [ -z "$SYS_PAM_MODULES_PATH" ] && perror "Failed to find pam_unix.so on this system."
+
+ #
+ # Figure out if we have split usr
+ if [ -L "/bin" -a -L "/lib" ]; then
+ declare -rg USR_SPLIT="no"
+ else
+ declare -rg USR_SPLIT="yes"
+ fi
+ pdebug "/bin and /lib are split from /usr/bin and /usr/lib (they are not symlinks): $USR_SPLIT"
+
+ SYS_LIB_PATHS=""
+ for DIR in /lib /lib32 /lib64 /usr/lib /usr/lib32 /usr/lib64; do
+ [ -d "$DIR" -a ! -L "$DIR" ] && SYS_LIB_PATHS+=" $DIR"
+ done
+ declare -rg SYS_LIB_PATHS=$SYS_LIB_PATHS
+ pdebug "System lib paths: $SYS_LIB_PATHS"
+}
+
diff --git a/core/includes/qt.inc b/core/includes/qt.inc
new file mode 100644
index 00000000..2b13c1f3
--- /dev/null
+++ b/core/includes/qt.inc
@@ -0,0 +1,30 @@
+activate_qt() {
+ [ $# -eq 1 ] || perror "activate_qt() requires the version as only argument, $# given."
+ local QT_VERSION="$1"
+ # Handle environment
+ export QT_SELECT="qt${QT_VERSION}"
+ QTDIR="/usr/share/qt${QT_VERSION}"
+ [ -d "$QTDIR" ] && export QTDIR
+ # Handle qt chooser
+ [ -d "/usr/share/qtchooser" ] || return 0 # No qtchooser found, hope for the best...
+ local QT_DEFAULT="$(readlink -f /usr/share/qtchooser/default.conf)"
+ if [ -e "$QT_DEFAULT" ]; then
+ [[ "$(basename "$QT_DEFAULT")" =~ ^qt$QT_VERSION.*\.conf$ ]] || perror "Something with QT4 is bad. Check '/usr/share/qtchooser'"
+ else
+ # no default active, try to set it
+ local QT_CANDIDATES="$(find "/usr/share/qtchooser" -name "qt$QT_VERSION*" | grep -E "$ARCHREGEX")"
+ [ -z "$QT_CANDIDATES" ] && QT_CANDIDATES="$(find "/usr/share/qtchooser" -name "qt$QT_VERSION*")"
+ local QTS="$(echo "$QT_CANDIDATES" | wc -w)"
+ if [ "$QTS" -eq 1 ]; then
+ # we found it, lets activate it and hope for the best
+ ln -sf "/usr/share/qtchooser/$QT_CANDIDATES" "/usr/share/qtchooser/default.conf" \
+ || perror "Could not link 'default.conf' to '/usr/share/qtchooser/$QT_CANDIDATES'"
+ elif [ "$QTS" -eq 0 ]; then
+ perror "No qt ${QT_VERSION} config found in /usr/share/qtchooser"
+ else
+ # here we have the case with different qt4 files or none at all
+ # in both cases, there is a bigger problem we shouldn't try to guess which one is correct
+ perror "More than one qt ${QT_VERSION} version found in '/usr/share/qtchooser'. The configuration is messy. Fix it first."
+ fi
+ fi
+}
diff --git a/core/includes/system.inc b/core/includes/system.inc
new file mode 100644
index 00000000..ea953d69
--- /dev/null
+++ b/core/includes/system.inc
@@ -0,0 +1,37 @@
+# Helper to determine various system information
+
+__init () {
+ # determine architecture triplet from the path of libc needed by the executing shell.
+ # please try not to use this to find/fetch libs in /lib or /usr/lib.
+ # Use ARCH_LIB_DIR, like "$ARCH_LIB_DIR/somefile.so" or "/usr$ARCH_LIB_DIR/somefile.so"
+ ARCH_TRIPLET=$(ldd $SHELL|grep "libc.so" | awk -F "/" '{print $3}')
+ [[ $ARCH_TRIPLET == *\(*\) ]] && ARCH_TRIPLET=""
+
+ ARCH_LIB_DIR=$(ldd $SHELL | grep "libc.so" | sed -r 's#^.*(/lib.*)/libc.so.*$#\1#g')
+ [ -z "$ARCH_LIB_DIR" -o ! -d "$ARCH_LIB_DIR" ] && perror "Could not determine arch dependent lib dir (where libc.so resides)"
+
+ # determine number of CPU cores
+ declare -rg CPU_CORES=$(cat /proc/cpuinfo | grep processor | wc -l)
+ export MAKEFLAGS="-j$CPU_CORES"
+
+ # Determine if we have lib64
+ if [ "$(uname -m)x" = "x86_64x" ]; then
+ # Setting LIB64, as openSuse differentiates but Ubuntu does not:
+ case $SYS_DISTRIBUTION in
+ ubuntu | debian) LIB64="lib" ;;
+ opensuse | fedora | centos) LIB64="lib64" ;;
+ *) perror "Cannot set LIB64, SYS_DISTRIBUTION: $SYS_DISTRIBUTION unknown!" ;;
+ esac
+ AMD64_I386=amd64
+ X86_64_I586=x86_64
+ AMD64_X86=amd64
+ ARCHREGEX="(amd64|x86[_-]64)"
+ else
+ LIB64="lib"
+ AMD64_I386=i386
+ X86_64_I586=i586
+ AMD64_X86=x86
+ ARCHREGEX="(i[3456]86|x86[_-]32)"
+ fi
+}
+
diff --git a/core/includes/useradd.inc b/core/includes/useradd.inc
new file mode 100644
index 00000000..2beaaeae
--- /dev/null
+++ b/core/includes/useradd.inc
@@ -0,0 +1,238 @@
+# This helper is stupid because it reimplements what useradd etc. do.
+# They could do the job just fine by using the -R option - maybe change this
+# dome day.
+#
+
+# Add a user to the system
+#
+# Usage:
+# either do ID_OF_REQUESTED_USER=$(add_user herbert)
+# or ID_OF_USER=$(USER=herbert GROUP=somegroup PASSWORD=secret123 add_user)
+# Valid params are:
+# USER, GROUP, USERID, GROUPID, PASSWORD, USERHOME, USERSHELL
+# defaults are no password, home=/nonexistent, usershell=/bin/false
+# IDs will be generated in the range of 5-999 if not explicitly given
+# TODO: Make it possible to pass a range of IDs if you don't want one <1000 but don't care about the exact ID
+
+declare -rg NAME_REGEX='^[a-z][-a-z0-9]*$'
+
+# Generate a UID for a given USERNAME. Return existing UID if possible, generate new one otherwise
+generate_uid()
+{
+ [ $# -ne 1 ] && perror "generate_uid fail. want 1 argument."
+ [ -z "${_PASSWD}" ] && perror "passwd file not set."
+ local _UID=$(grep -E "^$1:[^:]*:[0-9]+:" "${_PASSWD}" | head -1 | awk -F ':' '{print $3}')
+ if [ "x${_UID}" = "x" ]
+ then
+ local _TRIES=0
+ while [ ${_TRIES} -lt 50 ]
+ do
+ _TRIES=$[ ${_TRIES} + 1 ]
+ _UID=$[ 5 + $RANDOM % 900 ]
+ local _TEST=$(grep -E "^[^:]+:[^:]*:${_UID}:" "${_PASSWD}")
+ [ "x${_TEST}" = "x" ] && break
+ done
+ [ ${_TRIES} -ge 50 ] && perror "Generating a UID failed."
+ fi
+ echo ${_UID}
+}
+
+# Echo gid of given user if existent, nothing otherwise
+get_gid_for_user()
+{
+ [ $# -ne 1 ] && perror "get_gid_for_user fail. want 1 argument."
+ [ -z "${_PASSWD}" ] && perror "passwd file not set."
+ local _GID=$(grep -E "^$1:[^:]*:[^:]*:[0-9]+:" "${_PASSWD}" | head -1 | awk -F ':' '{print $4}')
+ echo ${_GID}
+}
+
+# Echo group name of given gid, nothing if non-existent
+get_group_for_gid()
+{
+ [ $# -ne 1 ] && perror "get_group_for_gid fail. want 1 argument."
+ [ -z "${_GROUP}" ] && perror "group file not set."
+ local _NAME=$(grep -E "^[^:]*:[^:]*:$1:" "${_GROUP}" | head -1 | awk -F ':' '{print $1}')
+ echo ${_NAME}
+}
+
+# Generate a GID for a given GROUPNAME. Return existing GID if possible, generate new one otherwise
+generate_gid()
+{
+ [ $# -ne 2 ] && perror "generate_gid fail. want 2 arguments."
+ [ -z "${_GROUP}" ] && perror "group file not set."
+ local _GID=$(grep -E "^$1:[^:]*:[0-9]+:" "${_GROUP}" | head -1 | awk -F ':' '{print $3}')
+ if [ "x${_GID}" = "x" ]
+ then
+ # group does not exist, try to create
+ local _TRIES=0
+ _GID=$2 # try to use uid as gid if not taken yet
+ while [ ${_TRIES} -lt 50 ]
+ do
+ _TRIES=$[ ${_TRIES} + 1 ]
+ local _TEST=$(grep -E "^[^:]+:[^:]*:${_GID}:" "${_GROUP}")
+ [ "x${_TEST}" = "x" ] && break
+ _GID=$[ 5 + $RANDOM % 900 ] # using uid as gid not possible, generate new one
+ done
+ [ ${_TRIES} -ge 50 ] && perror "Generating a GID failed."
+ fi
+ echo ${_GID}
+}
+
+add_user() {
+ [ -z "${TARGET_BUILD_DIR}" ] && perror "add_user: TARGET_BUILD_DIR not set"
+ if [ -z "${USER}" -a $# -eq 0 ]
+ then
+ pwarning " ** add_user usage **"
+ pwarning "add_user <username>"
+ pwarning "OR"
+ pwarning "USER=<username> [GROUP=<groupname>] [USERID=<userid>] [GROUPID=<groupid>] [USERHOME=<homedir>] [USERSHELL=<shell>] [PASSWORD=<pass>] add_user"
+ perror "Aborting, please fix your script."
+ fi
+ local _PASSWD=${TARGET_BUILD_DIR}/etc/passwd
+ local _GROUP=${TARGET_BUILD_DIR}/etc/group
+ local _SHADOW=${TARGET_BUILD_DIR}/etc/shadow
+ init_users_and_groups
+ [ ! -f "${_PASSWD}" ] && perror "add_user: password file does not exist in target system. (build base first)"
+ [ ! -f "${_GROUP}" ] && perror "add_user: group file does not exist in target system. (build base first)"
+ [ ! -f "${_SHADOW}" ] && perror "add_user: shadow file does not exist in target system. (build base first)"
+ if [ "x$1" != "x" ]
+ then
+ local USER=$1
+ local GROUP=""
+ local USERID=""
+ local GROUPID=""
+ local USERHOME=""
+ local USERSHELL=""
+ local PASSWORD=""
+ fi
+ USER=$(trim "$USER")
+ if ! [[ $USER =~ $NAME_REGEX ]]; then
+ perror "Invalid username: $USER"
+ fi
+ [ -z "$GROUPID" ] && local GROUPID=$(get_gid_for_user "${USER}")
+ [ -z "$GROUP" -a -n "$GROUPID" ] && local GROUP=$(get_group_for_gid "${GROUPID}")
+ [ -z "$GROUP" ] && local GROUP=$USER
+ GROUP=$(trim "$GROUP")
+ if ! [[ $GROUP =~ $NAME_REGEX ]]; then
+ perror "Invalid group: $GROUP"
+ fi
+ [ "x$USERID" = "x" ] && local USERID=$(generate_uid "${USER}")
+ USERID=$(trim "$USERID")
+ [ "$USERID" -lt "0" -o "$USERID" -gt "65535" ] && perror "Invalid userid: $USERID"
+ [ -z "$GROUPID" ] && local GROUPID=$(generate_gid "${GROUP}" "${USERID}")
+ GROUPID=$(trim "$GROUPID")
+ [ "$GROUPID" -lt "0" -o "$GROUPID" -gt "65535" ] && perror "Invalid groupid: $GROUPID"
+ # all required variables have been set
+ # does the desired username already exist? if so, check if UID matches, otherwise bail out
+ local _UID=$(grep -E "^${USER}:[^:]*:[0-9]+:" "${_PASSWD}" | head -1 | awk -F ':' '{print $3}')
+ [ -n "${_UID}" ] && [ "x${_UID}" != "x${USERID}" ] && perror "User ${USER}(${USERID}) already exists with UID ${_UID}"
+ # do the same for the group
+ local _GID=$(grep -E "^${GROUP}:[^:]*:[0-9]+:" "${_GROUP}" | head -1 | awk -F ':' '{print $3}')
+ [ -n "${_GID}" ] && [ "x${_GID}" != "x${GROUPID}" ] && perror "Group ${GROUP}(${GROUPID}) already exists with GID ${_GID}"
+ # if user already exists, check if he is in another group than the one requested. if so, bail out
+ # (TODO: don't bail out and add user to the new group)
+ if [ ! -z "${_UID}" ]
+ then
+ local _EXGID=$(grep -E "^${USER}:[^:]*:[0-9]+:" "${_PASSWD}" | head -1 | awk -F ':' '{print $4}')
+ [ "x${GROUPID}" != "x${_EXGID}" ] && perror "Requested GID $GROUPID differs from existing GID $_EXGID"
+ fi
+ # if user does not exist, try to add it
+ if [ -z "${_UID}" ]
+ then
+ local _TEST=$(grep -E "^[^:]+:[^:]*:${USERID}:" "${_PASSWD}")
+ [ -n "${_TEST}" ] && perror "Cannot add $USER - desired UID $USERID already in use."
+ fi
+ if [ -z "${_GID}" ]
+ then
+ local _TEST=$(grep -E "^[^:]+:[^:]*:${GROUPID}:" "${_GROUP}")
+ [ -n "${_TEST}" ] && perror "Cannot add $GROUP - desired GID $GROUPID already in use."
+ fi
+ [ -z "${USERHOME}" ] && local USERHOME=/nonexistent
+ [ -z "${USERSHELL}" ] && local USERSHELL=/bin/false
+ # create password
+ if [ -z "${PASSWORD}" ]
+ then
+ local PASSWORD='*'
+ else
+ pdebug "Hashing password '$PASSWORD' for '$USER'"
+ local PW=$(mkpasswd -m sha-512 "${PASSWORD}")
+ [ -z "${PW}" ] && PW=$(openssl passwd -1 "${PASSWORD}")
+ [ -z "${PW}" ] && perror "Error generating hashed password for $USER"
+ PASSWORD=$PW
+ fi
+ # add user, or replace password
+ if [ -z "${_UID}" ]; then
+ # create user
+ echo "${USER}:x:${USERID}:${GROUPID}:${USER}:${USERHOME}:${USERSHELL}" >> "${_PASSWD}"
+ echo "${USER}:${PASSWORD}:15555:0:99999:7:::" >> "${_SHADOW}"
+ pinfo "Created user $USER"
+ elif [ "$PASSWORD" != "*" ]; then
+ # update user's password
+ sed -i -r "s#^${USER}:[^:]*:(.*)\$"'#'"${USER}:${PASSWORD}:\1#g" "${_SHADOW}"
+ pinfo "Updated password of $USER"
+ fi
+ [ -z "${_GID}" ] && pinfo "Created group $GROUP" && echo "${GROUP}:x:${GROUPID}:" >> "${_GROUP}"
+ echo "${USERID}"
+}
+
+add_group () {
+ [ $# -lt 1 ] && perror "add_group called without argument."
+ [ -z "${TARGET_BUILD_DIR}" ] && perror "add_group: TARGET_BUILD_DIR not set"
+ local _PASSWD=${TARGET_BUILD_DIR}/etc/passwd
+ local _GROUP=${TARGET_BUILD_DIR}/etc/group
+ local _SHADOW=${TARGET_BUILD_DIR}/etc/shadow
+ init_users_and_groups
+ [ ! -f "${_GROUP}" ] && perror "add_user: group file does not exist in target system. (build base first)"
+ local GROUP=$1
+ local GROUPID="-"
+ if ! [[ $GROUP =~ $NAME_REGEX ]]; then
+ perror "Invalid group: $GROUP"
+ fi
+ [ $# -ge 2 ] && [ ! -z "$2" ] && GROUPID=$2
+ local _GID=$(grep -E "^${GROUP}:[^:]*:[0-9]+:" "${_GROUP}" | head -1 | awk -F ':' '{print $3}')
+ [ "x${_GID}" != "x" ] && [ "x$GROUPID" = "x-" -o "x$GROUPID" = "x${_GID}" ] && echo "${_GID}" && return # nothing to do, already exists
+ [ "x${_GID}" != "x" ] && perror "Group $GROUP already exists with GID ${_GID}, but creation was requested with GID $GROUPID"
+ if [ "x$GROUPID" = "x-" ]; then
+ local _UID=$(grep -E "^${GROUP}:[^:]*:[0-9]+:" "${_PASSWD}" | head -1 | awk -F ':' '{print $3}')
+ [ -z "${_UID}" ] && _UID=100
+ GROUPID=$(generate_gid "$GROUP" "${_UID}")
+ fi
+ if ! [[ $GROUPID =~ [0-9]+ ]]; then
+ perror "add_group: GROUPID not numeric (is '$GROUPID')"
+ fi
+ echo "${GROUP}:x:${GROUPID}:" >> "${_GROUP}"
+ pinfo "Created group $GROUP"
+ echo "${GROUPID}"
+}
+
+init_users_and_groups() {
+ [ -z "$TARGET_BUILD_DIR" -o "$TARGET_BUILD_DIR" == "/" ] && perror "Almost wrecked your local passwd, group and shadow file. phew."
+ local PASSWD="$TARGET_BUILD_DIR/etc/passwd"
+ local GROUP="$TARGET_BUILD_DIR/etc/group"
+ local SHADOW="$TARGET_BUILD_DIR/etc/shadow"
+ [ -s "${PASSWD}" -a -s "${GROUP}" -a -s "${SHADOW}" ] && return
+ pinfo "Creating users and groups based on local system...."
+ cp -a "/etc/passwd" "$PASSWD" || perror "Could not copy /etc/passwd"
+ cp -a "/etc/group" "$GROUP" || perror "Could not copy /etc/group"
+ cp -a "/etc/shadow" "$SHADOW" || perror "Could not copy /etc/shadow"
+ # make sure shadow has group shadow (should be handled by cp -a but hey)
+ chgrp shadow "$SHADOW"
+ # remove local users from group file (TODO: currently assumes users have ids 1000-1999)
+ local LOCALUSERS=$(grep -E '^[^:]+:x?:1[0-9]{3}:' "${PASSWD}" | awk -F ':' '{print $1}')
+ for USER in $LOCALUSERS; do
+ sed -r -i "s/([:,])${USER}/\1/g" "${GROUP}"
+ done
+ # fix syntax: remove trailing ',' in group file
+ sed -r -i 's/,+$//g' "${GROUP}"
+ sed -r -i 's/,+/,/g' "${GROUP}"
+ sed -i 's/:,/:/g' "${GROUP}"
+ # remove all non-system groups (also assumes users have 1000-1999, so nogroup will be kept)
+ grep -v -E '^[^:]+:x?:1[0-9]{3}:' "${GROUP}" > "${GROUP}.tmp"
+ mv "${GROUP}.tmp" "${GROUP}"
+ # same for users...
+ grep -v -E '^[^:]+:x?:1[0-9]{3}:' "${PASSWD}" > "${PASSWD}.tmp"
+ mv "${PASSWD}.tmp" "${PASSWD}"
+ # generate fresh shadow file
+ awk -F ':' '{print $1":*:15555:0:99999:7:::"}' "${PASSWD}" > "${SHADOW}"
+}
+
diff --git a/core/includes/versioncompare.inc b/core/includes/versioncompare.inc
new file mode 100644
index 00000000..f49a404f
--- /dev/null
+++ b/core/includes/versioncompare.inc
@@ -0,0 +1,61 @@
+
+# From http://stackoverflow.com/a/4025065/2043481
+# Returns 0 when equal, 1 when $1 > $2, 2 otherwise
+version_compare () {
+ if [[ "$1" == "$2" ]]; then
+ return 0
+ fi
+ local IFS=".-_"
+ local i ver1=($1) ver2=($2)
+ # fill empty fields in ver1 with zeros
+ for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do
+ ver1[i]=0
+ done
+ for ((i=0; i<${#ver1[@]}; i++)); do
+ if [[ -z "${ver2[i]}" ]]; then
+ # fill empty fields in ver2 with zeros
+ ver2[i]=0
+ fi
+ if ((10#${ver1[i]} > 10#${ver2[i]})); then
+ return 1
+ fi
+ if ((10#${ver1[i]} < 10#${ver2[i]})); then
+ return 2
+ fi
+ done
+ return 0
+}
+
+version_ge () {
+ version_compare "$1" "$2"
+ local RET=$?
+ [ "$RET" == "2" ] && return 1
+ return 0
+}
+
+version_le () {
+ version_compare "$1" "$2"
+ local RET=$?
+ [ "$RET" == "1" ] && return 1
+ return 0
+}
+
+version_gt () {
+ version_compare "$1" "$2"
+ local RET=$?
+ [ "$RET" == "1" ] && return 0
+ return 1
+}
+
+version_lt () {
+ version_compare "$1" "$2"
+ local RET=$?
+ [ "$RET" == "2" ] && return 0
+ return 1
+}
+
+version_eq () {
+ version_compare "$1" "$2"
+ return $?
+}
+
diff --git a/core/modules/alsa/data/etc/systemd/system/alsa-default-card.service b/core/modules/alsa/data/etc/systemd/system/alsa-default-card.service
new file mode 100644
index 00000000..db35eeb7
--- /dev/null
+++ b/core/modules/alsa/data/etc/systemd/system/alsa-default-card.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Set default card ALSA will use
+DefaultDependencies=no
+After=tmp.target
+Wants=tmp.target
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/alsa-default_card
+RemainAfterExit=yes
+
diff --git a/core/modules/alsa/data/etc/systemd/system/multi-user.target.wants/alsa-default-card.service b/core/modules/alsa/data/etc/systemd/system/multi-user.target.wants/alsa-default-card.service
new file mode 120000
index 00000000..55e393fd
--- /dev/null
+++ b/core/modules/alsa/data/etc/systemd/system/multi-user.target.wants/alsa-default-card.service
@@ -0,0 +1 @@
+../alsa-default-card.service \ No newline at end of file
diff --git a/core/modules/alsa/data/opt/openslx/scripts/alsa-default_card b/core/modules/alsa/data/opt/openslx/scripts/alsa-default_card
new file mode 100755
index 00000000..214a4d73
--- /dev/null
+++ b/core/modules/alsa/data/opt/openslx/scripts/alsa-default_card
@@ -0,0 +1,42 @@
+#!/bin/ash
+PATH=$PATH:/opt/openslx/sbin:/opt/openslx/bin
+
+PROC="/proc/asound/cards"
+
+if [ ! -r "$PROC" ]; then
+ echo "'${PROC}' not found or not readable."
+ exit 1
+fi
+
+if [ -w "/etc" ]; then
+ FILE="/etc/asound.conf"
+elif [ -n "$HOME" ]; then
+ FILE="${HOME}/.asoundrc"
+else
+ FILE="$(getent passwd root | awk -F ':' '{print $6}')/.asoundrc"
+fi
+
+if [ -e "${FILE}" -a "x$1" != "x--force" ]; then
+ echo "'${FILE}' already exists, use --force to overwrite."
+ exit 1
+fi
+
+# Try to filter HDMI cards first
+CARD=$(grep -v -i 'HDMI' "${PROC}" | grep -E -o '^[[:space:]]*[0-9]+[[:space:]]+' | head -n 1)
+# If empty, try again with all
+[ -z "${CARD}" ] && CARD=$(cat "${PROC}" | grep -E -o '^[[:space:]]*[0-9]+[[:space:]]+' | head -n 1)
+
+if [ -z "${CARD}" ]; then
+ echo "No sound card found."
+ exit 1
+fi
+
+cat > "${FILE}" <<HEREDOC
+defaults.pcm.!card $CARD
+defaults.ctl.!card $CARD
+
+defaults.pcm.!device 0
+defaults.ctl.!device 0
+
+HEREDOC
+
diff --git a/core/modules/alsa/module.build b/core/modules/alsa/module.build
new file mode 100644
index 00000000..4d3990b1
--- /dev/null
+++ b/core/modules/alsa/module.build
@@ -0,0 +1,19 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+
+ # These shitty greps are 'excludes' for this high quality scientific linux.
+ list_packet_files | grep -v "^/etc/asound.state" \
+ | grep -v "^/etc/modprobe.d/local.conf" >> "$COPYLIST"
+ tarcopy "$(cat "${COPYLIST}" | sort -u)" "${MODULE_BUILD_DIR}"
+
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/alsa/module.conf b/core/modules/alsa/module.conf
new file mode 100644
index 00000000..2a8be7a1
--- /dev/null
+++ b/core/modules/alsa/module.conf
@@ -0,0 +1,8 @@
+REQUIRED_BINARIES="
+ amixer
+ alsamixer
+"
+REQUIRED_DIRECTORIES=" /usr/share/alsa
+ /etc/modprobe.d
+"
+
diff --git a/core/modules/alsa/module.conf.debian b/core/modules/alsa/module.conf.debian
new file mode 100644
index 00000000..5f4d1283
--- /dev/null
+++ b/core/modules/alsa/module.conf.debian
@@ -0,0 +1,10 @@
+REQUIRED_INSTALLED_PACKAGES="
+ alsa-utils
+ alsa-base
+ libasound2
+"
+REQUIRED_CONTENT_PACKAGES="
+ alsa-utils
+ alsa-base
+ libasound2
+"
diff --git a/core/modules/alsa/module.conf.fedora b/core/modules/alsa/module.conf.fedora
new file mode 100644
index 00000000..4ea213db
--- /dev/null
+++ b/core/modules/alsa/module.conf.fedora
@@ -0,0 +1,13 @@
+REQUIRED_INSTALLED_PACKAGES="
+ alsa-utils
+ alsa-lib
+"
+REQUIRED_CONTENT_PACKAGES="
+ alsa-utils
+ alsa-lib
+"
+REQUIRED_DIRECTORIES="
+ /usr/share/alsa
+"
+
+# libasound2
diff --git a/core/modules/alsa/module.conf.opensuse b/core/modules/alsa/module.conf.opensuse
new file mode 100644
index 00000000..a9ba1d50
--- /dev/null
+++ b/core/modules/alsa/module.conf.opensuse
@@ -0,0 +1,10 @@
+REQUIRED_CONTENT_PACKAGES="
+ alsa-utils
+ alsa
+ libasound2
+"
+REQUIRED_INSTALLED_PACKAGES="
+ alsa-utils
+ alsa
+ libasound2
+"
diff --git a/core/modules/alsa/module.conf.scientific b/core/modules/alsa/module.conf.scientific
new file mode 100644
index 00000000..643e52d3
--- /dev/null
+++ b/core/modules/alsa/module.conf.scientific
@@ -0,0 +1,12 @@
+REQUIRED_INSTALLED_PACKAGES="
+ module-init-tools
+ alsa-utils
+ alsa-lib
+"
+REQUIRED_CONTENT_PACKAGES="
+ module-init-tools
+ alsa-utils
+ alsa-lib
+"
+
+# libasound2
diff --git a/core/modules/alsa/module.conf.ubuntu b/core/modules/alsa/module.conf.ubuntu
new file mode 100644
index 00000000..c07957ab
--- /dev/null
+++ b/core/modules/alsa/module.conf.ubuntu
@@ -0,0 +1,7 @@
+REQUIRED_CONTENT_PACKAGES="
+ alsa-utils
+ alsa-base
+ libasound2
+ libasound2-data
+ libasound2-plugins
+"
diff --git a/core/modules/alsa/module.conf.ubuntu.12 b/core/modules/alsa/module.conf.ubuntu.12
new file mode 100644
index 00000000..2eb57b3d
--- /dev/null
+++ b/core/modules/alsa/module.conf.ubuntu.12
@@ -0,0 +1,6 @@
+REQUIRED_CONTENT_PACKAGES="
+ alsa-utils
+ alsa-base
+ libasound2
+ libasound2-plugins
+"
diff --git a/core/modules/beamergui/data/etc/X11/Xsession.d/98-modesetter-wrapper b/core/modules/beamergui/data/etc/X11/Xsession.d/98-modesetter-wrapper
new file mode 100755
index 00000000..59c1c8ed
--- /dev/null
+++ b/core/modules/beamergui/data/etc/X11/Xsession.d/98-modesetter-wrapper
@@ -0,0 +1,5 @@
+# Beamergui detection and setup
+
+# Explicitely call bash for the modesetter
+/bin/bash /opt/openslx/scripts/beamergui-mode_setter >/dev/null 2>&1
+
diff --git a/core/modules/beamergui/data/etc/X11/Xsession.d/99-beamergui-starter_script b/core/modules/beamergui/data/etc/X11/Xsession.d/99-beamergui-starter_script
new file mode 100755
index 00000000..18717dd6
--- /dev/null
+++ b/core/modules/beamergui/data/etc/X11/Xsession.d/99-beamergui-starter_script
@@ -0,0 +1,2 @@
+#!/bin/ash
+/opt/openslx/bin/beamergui &
diff --git a/core/modules/beamergui/data/opt/openslx/scripts/beamergui-mode_setter b/core/modules/beamergui/data/opt/openslx/scripts/beamergui-mode_setter
new file mode 100755
index 00000000..503e44fa
--- /dev/null
+++ b/core/modules/beamergui/data/opt/openslx/scripts/beamergui-mode_setter
@@ -0,0 +1,165 @@
+#! /bin/bash
+# This script needs bash for the arrays
+
+# This script adds the common resolutions to the Xserver if and only if there
+# is a beamer connected. Additionally, if the preferred resolution is known,
+# (i.e. the Xserver received a proper EDID) the latter will be applied.
+
+################################################################################
+# Add or remove additional modes here.
+declare -a MODES
+MODES=("${MODES[@]}" "1280x800 83.50 1280 1352 1480 1680 800 803 809 831 -hsync +vsync")
+MODES=("${MODES[@]}" "1440x1050 106.50 1440 1528 1672 1904 900 903 909 934 -hsync +vsync")
+MODES=("${MODES[@]}" "1680x1200 146.25 1680 1784 1960 2240 1050 1053 1059 1089 -hsync +vsync")
+MODES=("${MODES[@]}" "1920x1200 193.25 1920 2056 2256 2592 1200 1203 1209 1245 -hsync +vsync")
+MODES=("${MODES[@]}" "1280x720 74.50 1280 1344 1472 1664 720 723 728 748 -hsync +vsync")
+MODES=("${MODES[@]}" "1368x768 85.25 1368 1440 1576 1784 768 771 781 798 -hsync +vsync")
+MODES=("${MODES[@]}" "1600x900 118.25 1600 1696 1856 2112 900 903 908 934 -hsync +vsync")
+MODES=("${MODES[@]}" "1920x1080 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync")
+MODES=("${MODES[@]}" "800x600 38.25 800 832 912 1024 600 603 607 624 -hsync +vsync")
+MODES=("${MODES[@]}" "1024x768 63.50 1024 1072 1176 1328 768 771 775 798 -hsync +vsync")
+MODES=("${MODES[@]}" "1152x864 81.75 1152 1216 1336 1520 864 867 871 897 -hsync +vsync")
+MODES=("${MODES[@]}" "1280x960 101.25 1280 1360 1488 1696 960 963 967 996 -hsync +vsync")
+MODES=("${MODES[@]}" "1280x1024 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync")
+################################################################################
+
+CONFIGFILE="/opt/openslx/beamergui/beamer.conf"
+
+################################################################################
+
+#DRIVER=$(lspci -nnk | grep -i vga -A3 | grep 'in use'| awk '{ print $NF }')
+XRANDR=$( xrandr )
+XRANDRV=$( xrandr --verbose )
+
+################################################################################
+
+echo "$XRANDR"
+#echo "$XRANDRV"
+
+# Get the names of the connected outputs
+# This is a rigid approach to determine the connected outputs
+declare -a OUTPUTNAMES
+while read line; do
+ OUTPUTNAMES+=("$(awk '{print $1}' <<<"$line" )")
+done < <( echo "$XRANDR" | grep -E "[[:digit:]]+mm x [[:digit:]]+mm" )
+echo -e "Connected outputs: \e[32m${OUTPUTNAMES[@]}\e[0m"
+
+# The goal is to add more modelines to the X server. While this is done the
+# screen is flickering. Hence this is just necessary if there is a beamer. Do
+# the flickering magic only if there are two outputs and one is a projector.
+
+#Two outputs?
+if [ ${#OUTPUTNAMES[@]} -eq 2 ]; then
+
+ echo "Two outputs detected."
+
+ # Either of them a projector?
+ BEAMER=
+ for i in 0 1; do
+ WIDTH=$(grep -E "^${OUTPUTNAMES[$i]}.*[0-9]+mm x [0-9]+mm" <<<"$XRANDR" | head -n 1 | grep -o -E ' [0-9]+mm x' | grep -o -E '[0-9]+')
+ if [ -z "$WIDTH" ] || [ "$WIDTH" -eq 0 ] || [ "$WIDTH" -gt 900 ]; then
+ echo "Screen $i is beamer, width is '$WIDTH'"
+ BEAMER=$i
+ fi
+ done
+ if [ -n "$BEAMER" ]; then
+ echo "${OUTPUTNAMES[$BEAMER]} is a beamer. "
+
+ # Create all modes, so that X knows them by name "<width>x<height>"
+ # Add the modes to the outputs, this means that, if this action is
+ # successful they can be applied to the screens.
+ for i in "${MODES[@]}"; do
+ if xrandr --current --newmode $i; then # > /dev/null 2>&1
+ echo -e "Created mode ${i%% *}."
+ else
+ echo -e "\e[31mFailed to create mode ${i%% *}!\e[0m"
+ fi
+
+ for j in "${OUTPUTNAMES[@]}"; do
+ if xrandr --current --addmode $j $(echo $i| awk '{print $1;}'); then
+ echo -e "Added mode ${i%% *} to $j."
+ else
+ echo -e "\e[31mFailed to add mode ${i%% *} to $j!\e[0m"
+ break
+ fi
+ done
+ done
+
+ # Finally, if the EDID is present, apply a proper resolution.
+ # Find out whether the beamer transmits reliable EDID data.
+ # The data in xrandr should be reliable if the EDID is present.
+ if echo "$XRANDRV" | grep -Pzo \
+ "^${OUTPUTNAMES[$BEAMER]}\N*\n((\ |\t)+\N*\n)+" \
+ | grep EDID > /dev/null ; then
+ echo "${OUTPUTNAMES[$BEAMER]} [Beamer] provides EDID."
+
+ # If the breamer transmits the EDID there shall be a preferred resolution.
+ OPTIMALRES=$(echo "$XRANDRV" \
+ | grep -Pzo "^${OUTPUTNAMES[$BEAMER]}\N*\n((\ |\t)+\N*\n)+" \
+ | grep preferred | awk '{print $1}')
+
+ # Apply the optimal resolution tho either of the outputs. The beamer has
+ # to be the secondary output.
+ if xrandr \
+ --output ${OUTPUTNAMES[$((1-$BEAMER))]} --mode $OPTIMALRES \
+ --primary \
+ --output ${OUTPUTNAMES[$BEAMER]} --mode $OPTIMALRES \
+ --same-as ${OUTPUTNAMES[$((1-$BEAMER))]}
+ then
+ echo "Applied optimal resolution successfully."
+ fi
+
+ elif [[ -f "$CONFIGFILE" ]]; then
+
+ echo "Config file found."
+
+ # Get local ip
+ . /opt/openslx/config
+
+ # Try to get a probed mode
+ PROBEDMODE=$(cat $CONFIGFILE | grep $SLX_PXE_CLIENT_IP | cut -d '=' -f2)
+
+ # If a probed mode was found, ..
+ if [[ -n "$PROBEDMODE" ]]; then
+ echo "Probed mode found in config file."
+ # Apply the probed mode from the config file
+ if xrandr \
+ --output ${OUTPUTNAMES[$((1-$BEAMER))]} --mode $PROBEDMODE \
+ --primary \
+ --output ${OUTPUTNAMES[$BEAMER]} --mode $PROBEDMODE \
+ --same-as ${OUTPUTNAMES[$((1-$BEAMER))]}
+ then
+ echo "Applied probed mode successfully."
+ fi
+ else
+ echo -e "\e[31mERROR: Beamer provides no EDID and no probed mode given in $CONFIGFILE.\e[0m"
+ fi
+ else
+ # Apply a fallback mode
+ echo -e "\e[31mERROR: Beamer provides no EDID and no config file found in $CONFIGFILE. Falling back to 1024x768.\e[0m"
+ xrandr \
+ --output ${OUTPUTNAMES[$((1-$BEAMER))]} --mode 1024x768 \
+ --primary \
+ --output ${OUTPUTNAMES[$BEAMER]} --mode 1024x768 \
+ --same-as ${OUTPUTNAMES[$((1-$BEAMER))]}
+ fi
+ else
+ # In case of two monitors just sort the outputs lexicographically and apply
+ # the preffered resolution
+ echo "Dualhead setup deteced. Sorting outputs lexicographically."
+ readarray -t OUTPUTNAMES \
+ < <(for a in "${OUTPUTNAMES[@]}"; do echo "$a"; done | sort)
+ echo ${OUTPUTNAMES[@]}
+ if xrandr \
+ --output ${OUTPUTNAMES[0]} --preferred \
+ --primary \
+ --output ${OUTPUTNAMES[1]} --preferred \
+ --right-of ${OUTPUTNAMES[0]}
+ then
+ echo "Successfully applied preferred modes on outputs in sorted order."
+ fi
+ fi
+else
+ echo "\e[32mOther than two outputs.\e[0m"
+fi
+
diff --git a/core/modules/beamergui/data/opt/openslx/vmchooser/sessionstart.d/99-kill_beamergui b/core/modules/beamergui/data/opt/openslx/vmchooser/sessionstart.d/99-kill_beamergui
new file mode 100755
index 00000000..1b4e61c8
--- /dev/null
+++ b/core/modules/beamergui/data/opt/openslx/vmchooser/sessionstart.d/99-kill_beamergui
@@ -0,0 +1,3 @@
+#!/bin/ash
+killall beamergui
+exit 0
diff --git a/core/modules/beamergui/module.build b/core/modules/beamergui/module.build
new file mode 100644
index 00000000..f920bb74
--- /dev/null
+++ b/core/modules/beamergui/module.build
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+fetch_source() {
+ git clone "${REQUIRED_GIT}" src
+}
+
+build() {
+ local SRCDIR="${MODULE_WORK_DIR}/src/"
+ if [[ "$SYS_DISTRIBUTION" == "opensuse" && "$SYS_VERSION" == "13.2" ]]; then
+ QMAKE="/usr/$LIB64/qt4/bin/qmake"
+ else
+ QMAKE="$(which qmake-qt4)"
+ fi
+
+ # first activate qt 4
+ activate_qt 4
+
+ mkdir -p "$MODULE_BUILD_DIR/opt/openslx/bin"
+ cd "${MODULE_BUILD_DIR}/opt/openslx/bin" || perror "Could not cd!"
+ pinfo "Running qmake"
+ "$QMAKE" "$SRCDIR/src/beamergui.pro" -r -spec linux-g++ || perror "'qmake-qt4' failed (e.g. not installed)."
+ pinfo "Running make"
+ make || perror "'make' failed."
+}
+post_copy() {
+ :
+}
diff --git a/core/modules/beamergui/module.conf b/core/modules/beamergui/module.conf
new file mode 100644
index 00000000..da786271
--- /dev/null
+++ b/core/modules/beamergui/module.conf
@@ -0,0 +1,9 @@
+REQUIRED_GIT="git://git.openslx.org/openslx-ng/beamergui.git"
+REQUIRED_BINARIES="
+ beamergui
+"
+REQUIRED_LIBRARIES="
+"
+REQUIRED_SYSTEM_FILES="
+"
+# TODO add libraries
diff --git a/core/modules/beamergui/module.conf.debian b/core/modules/beamergui/module.conf.debian
new file mode 100644
index 00000000..ea4cd194
--- /dev/null
+++ b/core/modules/beamergui/module.conf.debian
@@ -0,0 +1,8 @@
+REQUIRED_INSTALLED_PACKAGES="
+libqt4-dev
+libxrandr-dev
+"
+REQUIRED_CONTENT_PACKAGES="
+libqt4-dev
+libxrandr-dev
+"
diff --git a/core/modules/beamergui/module.conf.fedora b/core/modules/beamergui/module.conf.fedora
new file mode 100644
index 00000000..8b46942d
--- /dev/null
+++ b/core/modules/beamergui/module.conf.fedora
@@ -0,0 +1,8 @@
+REQUIRED_INSTALLED_PACKAGES="
+qt-devel
+libXrandr-devel
+"
+REQUIRED_CONTENT_PACKAGES="
+qt-devel
+libXrandr
+"
diff --git a/core/modules/beamergui/module.conf.opensuse b/core/modules/beamergui/module.conf.opensuse
new file mode 100644
index 00000000..01586fe3
--- /dev/null
+++ b/core/modules/beamergui/module.conf.opensuse
@@ -0,0 +1,8 @@
+REQUIRED_INSTALLED_PACKAGES="
+libqt4-devel
+libxrandr-devel
+"
+REQUIRED_CONTENT_PACKAGES="
+libqt4-devel
+libXrandr-devel
+"
diff --git a/core/modules/beamergui/module.conf.ubuntu b/core/modules/beamergui/module.conf.ubuntu
new file mode 100644
index 00000000..ea4cd194
--- /dev/null
+++ b/core/modules/beamergui/module.conf.ubuntu
@@ -0,0 +1,8 @@
+REQUIRED_INSTALLED_PACKAGES="
+libqt4-dev
+libxrandr-dev
+"
+REQUIRED_CONTENT_PACKAGES="
+libqt4-dev
+libxrandr-dev
+"
diff --git a/core/modules/brazilian/data/etc/X11/xorg.conf.d/90-keytable.conf b/core/modules/brazilian/data/etc/X11/xorg.conf.d/90-keytable.conf
new file mode 100644
index 00000000..ffbb1915
--- /dev/null
+++ b/core/modules/brazilian/data/etc/X11/xorg.conf.d/90-keytable.conf
@@ -0,0 +1,5 @@
+Section "InputClass"
+ Identifier "LocalKeyboard"
+ MatchIsKeyboard "on"
+ Option "XkbLayout" "br"
+EndSection
diff --git a/core/modules/brazilian/data/etc/default/locale b/core/modules/brazilian/data/etc/default/locale
new file mode 100644
index 00000000..9842e25d
--- /dev/null
+++ b/core/modules/brazilian/data/etc/default/locale
@@ -0,0 +1 @@
+LANG="pt_BR.UTF-8"
diff --git a/core/modules/brazilian/data/etc/systemd/system/basic.target.wants/load-brazilian-keymap.service b/core/modules/brazilian/data/etc/systemd/system/basic.target.wants/load-brazilian-keymap.service
new file mode 100644
index 00000000..5047122a
--- /dev/null
+++ b/core/modules/brazilian/data/etc/systemd/system/basic.target.wants/load-brazilian-keymap.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Setup brazilian keyboard layout
+DefaultDependencies=no
+After=sysinit.target
+Before=shutdown.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-load_brazilian_keymaps
diff --git a/core/modules/brazilian/data/etc/systemd/system/load-brazilian-keymap.service b/core/modules/brazilian/data/etc/systemd/system/load-brazilian-keymap.service
new file mode 100644
index 00000000..5047122a
--- /dev/null
+++ b/core/modules/brazilian/data/etc/systemd/system/load-brazilian-keymap.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Setup brazilian keyboard layout
+DefaultDependencies=no
+After=sysinit.target
+Before=shutdown.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-load_brazilian_keymaps
diff --git a/core/modules/brazilian/data/opt/openslx/keymaps/brazilian_qwerty_compose_keyboard_translation.map b/core/modules/brazilian/data/opt/openslx/keymaps/brazilian_qwerty_compose_keyboard_translation.map
new file mode 100644
index 00000000..293449f7
--- /dev/null
+++ b/core/modules/brazilian/data/opt/openslx/keymaps/brazilian_qwerty_compose_keyboard_translation.map
@@ -0,0 +1,8568 @@
+keymaps 0-127
+keycode 1 = Escape
+ alt keycode 1 = Meta_Escape
+ shift alt keycode 1 = Meta_Escape
+ altgr alt keycode 1 = Meta_Escape
+ shift altgr alt keycode 1 = Meta_Escape
+ control alt keycode 1 = Meta_Escape
+ shift control alt keycode 1 = Meta_Escape
+ altgr control alt keycode 1 = Meta_Escape
+ shift altgr control alt keycode 1 = Meta_Escape
+ alt shiftl keycode 1 = Meta_Escape
+ shift alt shiftl keycode 1 = Meta_Escape
+ altgr alt shiftl keycode 1 = Meta_Escape
+ shift altgr alt shiftl keycode 1 = Meta_Escape
+ control alt shiftl keycode 1 = Meta_Escape
+ shift control alt shiftl keycode 1 = Meta_Escape
+ altgr control alt shiftl keycode 1 = Meta_Escape
+ shift altgr control alt shiftl keycode 1 = Meta_Escape
+ alt shiftr keycode 1 = Meta_Escape
+ shift alt shiftr keycode 1 = Meta_Escape
+ altgr alt shiftr keycode 1 = Meta_Escape
+ shift altgr alt shiftr keycode 1 = Meta_Escape
+ control alt shiftr keycode 1 = Meta_Escape
+ shift control alt shiftr keycode 1 = Meta_Escape
+ altgr control alt shiftr keycode 1 = Meta_Escape
+ shift altgr control alt shiftr keycode 1 = Meta_Escape
+ alt shiftl shiftr keycode 1 = Meta_Escape
+ shift alt shiftl shiftr keycode 1 = Meta_Escape
+ altgr alt shiftl shiftr keycode 1 = Meta_Escape
+ shift altgr alt shiftl shiftr keycode 1 = Meta_Escape
+ control alt shiftl shiftr keycode 1 = Meta_Escape
+ shift control alt shiftl shiftr keycode 1 = Meta_Escape
+ altgr control alt shiftl shiftr keycode 1 = Meta_Escape
+ shift altgr control alt shiftl shiftr keycode 1 = Meta_Escape
+ alt ctrll keycode 1 = Meta_Escape
+ shift alt ctrll keycode 1 = Meta_Escape
+ altgr alt ctrll keycode 1 = Meta_Escape
+ shift altgr alt ctrll keycode 1 = Meta_Escape
+ control alt ctrll keycode 1 = Meta_Escape
+ shift control alt ctrll keycode 1 = Meta_Escape
+ altgr control alt ctrll keycode 1 = Meta_Escape
+ shift altgr control alt ctrll keycode 1 = Meta_Escape
+ alt shiftl ctrll keycode 1 = Meta_Escape
+ shift alt shiftl ctrll keycode 1 = Meta_Escape
+ altgr alt shiftl ctrll keycode 1 = Meta_Escape
+ shift altgr alt shiftl ctrll keycode 1 = Meta_Escape
+ control alt shiftl ctrll keycode 1 = Meta_Escape
+ shift control alt shiftl ctrll keycode 1 = Meta_Escape
+ altgr control alt shiftl ctrll keycode 1 = Meta_Escape
+ shift altgr control alt shiftl ctrll keycode 1 = Meta_Escape
+ alt shiftr ctrll keycode 1 = Meta_Escape
+ shift alt shiftr ctrll keycode 1 = Meta_Escape
+ altgr alt shiftr ctrll keycode 1 = Meta_Escape
+ shift altgr alt shiftr ctrll keycode 1 = Meta_Escape
+ control alt shiftr ctrll keycode 1 = Meta_Escape
+ shift control alt shiftr ctrll keycode 1 = Meta_Escape
+ altgr control alt shiftr ctrll keycode 1 = Meta_Escape
+ shift altgr control alt shiftr ctrll keycode 1 = Meta_Escape
+ alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ shift alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ altgr alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ shift altgr alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ control alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ shift control alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ altgr control alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ shift altgr control alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+keycode 2 = one exclam onesuperior exclamdown
+ alt keycode 2 = Meta_one
+ shift alt keycode 2 = Meta_exclam
+ altgr alt keycode 2 = Meta_one
+ shift altgr alt keycode 2 = Meta_exclam
+ shiftl keycode 2 = one
+ shift shiftl keycode 2 = exclam
+ altgr shiftl keycode 2 = onesuperior
+ shift altgr shiftl keycode 2 = exclamdown
+ alt shiftl keycode 2 = Meta_one
+ shift alt shiftl keycode 2 = Meta_exclam
+ altgr alt shiftl keycode 2 = Meta_one
+ shift altgr alt shiftl keycode 2 = Meta_exclam
+ shiftr keycode 2 = one
+ shift shiftr keycode 2 = exclam
+ altgr shiftr keycode 2 = onesuperior
+ shift altgr shiftr keycode 2 = exclamdown
+ alt shiftr keycode 2 = Meta_one
+ shift alt shiftr keycode 2 = Meta_exclam
+ altgr alt shiftr keycode 2 = Meta_one
+ shift altgr alt shiftr keycode 2 = Meta_exclam
+ shiftl shiftr keycode 2 = one
+ shift shiftl shiftr keycode 2 = exclam
+ altgr shiftl shiftr keycode 2 = onesuperior
+ shift altgr shiftl shiftr keycode 2 = exclamdown
+ alt shiftl shiftr keycode 2 = Meta_one
+ shift alt shiftl shiftr keycode 2 = Meta_exclam
+ altgr alt shiftl shiftr keycode 2 = Meta_one
+ shift altgr alt shiftl shiftr keycode 2 = Meta_exclam
+ ctrll keycode 2 = one
+ shift ctrll keycode 2 = exclam
+ altgr ctrll keycode 2 = onesuperior
+ shift altgr ctrll keycode 2 = exclamdown
+ alt ctrll keycode 2 = Meta_one
+ shift alt ctrll keycode 2 = Meta_exclam
+ altgr alt ctrll keycode 2 = Meta_one
+ shift altgr alt ctrll keycode 2 = Meta_exclam
+ shiftl ctrll keycode 2 = one
+ shift shiftl ctrll keycode 2 = exclam
+ altgr shiftl ctrll keycode 2 = onesuperior
+ shift altgr shiftl ctrll keycode 2 = exclamdown
+ alt shiftl ctrll keycode 2 = Meta_one
+ shift alt shiftl ctrll keycode 2 = Meta_exclam
+ altgr alt shiftl ctrll keycode 2 = Meta_one
+ shift altgr alt shiftl ctrll keycode 2 = Meta_exclam
+ shiftr ctrll keycode 2 = one
+ shift shiftr ctrll keycode 2 = exclam
+ altgr shiftr ctrll keycode 2 = onesuperior
+ shift altgr shiftr ctrll keycode 2 = exclamdown
+ alt shiftr ctrll keycode 2 = Meta_one
+ shift alt shiftr ctrll keycode 2 = Meta_exclam
+ altgr alt shiftr ctrll keycode 2 = Meta_one
+ shift altgr alt shiftr ctrll keycode 2 = Meta_exclam
+ shiftl shiftr ctrll keycode 2 = one
+ shift shiftl shiftr ctrll keycode 2 = exclam
+ altgr shiftl shiftr ctrll keycode 2 = onesuperior
+ shift altgr shiftl shiftr ctrll keycode 2 = exclamdown
+ alt shiftl shiftr ctrll keycode 2 = Meta_one
+ shift alt shiftl shiftr ctrll keycode 2 = Meta_exclam
+ altgr alt shiftl shiftr ctrll keycode 2 = Meta_one
+ shift altgr alt shiftl shiftr ctrll keycode 2 = Meta_exclam
+keycode 3 = two
+ shift keycode 3 = at
+ altgr keycode 3 = twosuperior
+ shift altgr keycode 3 = onehalf
+ control keycode 3 = nul
+ shift control keycode 3 = nul
+ altgr control keycode 3 = nul
+ shift altgr control keycode 3 = nul
+ alt keycode 3 = Meta_two
+ shift alt keycode 3 = Meta_at
+ altgr alt keycode 3 = Meta_two
+ shift altgr alt keycode 3 = Meta_at
+ control alt keycode 3 = Meta_nul
+ shift control alt keycode 3 = Meta_nul
+ altgr control alt keycode 3 = Meta_nul
+ shift altgr control alt keycode 3 = Meta_nul
+ shift shiftl keycode 3 = at
+ altgr shiftl keycode 3 = twosuperior
+ shift altgr shiftl keycode 3 = onehalf
+ control shiftl keycode 3 = nul
+ shift control shiftl keycode 3 = nul
+ altgr control shiftl keycode 3 = nul
+ shift altgr control shiftl keycode 3 = nul
+ alt shiftl keycode 3 = Meta_two
+ shift alt shiftl keycode 3 = Meta_at
+ altgr alt shiftl keycode 3 = Meta_two
+ shift altgr alt shiftl keycode 3 = Meta_at
+ control alt shiftl keycode 3 = Meta_nul
+ shift control alt shiftl keycode 3 = Meta_nul
+ altgr control alt shiftl keycode 3 = Meta_nul
+ shift altgr control alt shiftl keycode 3 = Meta_nul
+ shift shiftr keycode 3 = at
+ altgr shiftr keycode 3 = twosuperior
+ shift altgr shiftr keycode 3 = onehalf
+ control shiftr keycode 3 = nul
+ shift control shiftr keycode 3 = nul
+ altgr control shiftr keycode 3 = nul
+ shift altgr control shiftr keycode 3 = nul
+ alt shiftr keycode 3 = Meta_two
+ shift alt shiftr keycode 3 = Meta_at
+ altgr alt shiftr keycode 3 = Meta_two
+ shift altgr alt shiftr keycode 3 = Meta_at
+ control alt shiftr keycode 3 = Meta_nul
+ shift control alt shiftr keycode 3 = Meta_nul
+ altgr control alt shiftr keycode 3 = Meta_nul
+ shift altgr control alt shiftr keycode 3 = Meta_nul
+ shift shiftl shiftr keycode 3 = at
+ altgr shiftl shiftr keycode 3 = twosuperior
+ shift altgr shiftl shiftr keycode 3 = onehalf
+ control shiftl shiftr keycode 3 = nul
+ shift control shiftl shiftr keycode 3 = nul
+ altgr control shiftl shiftr keycode 3 = nul
+ shift altgr control shiftl shiftr keycode 3 = nul
+ alt shiftl shiftr keycode 3 = Meta_two
+ shift alt shiftl shiftr keycode 3 = Meta_at
+ altgr alt shiftl shiftr keycode 3 = Meta_two
+ shift altgr alt shiftl shiftr keycode 3 = Meta_at
+ control alt shiftl shiftr keycode 3 = Meta_nul
+ shift control alt shiftl shiftr keycode 3 = Meta_nul
+ altgr control alt shiftl shiftr keycode 3 = Meta_nul
+ shift altgr control alt shiftl shiftr keycode 3 = Meta_nul
+ shift ctrll keycode 3 = at
+ altgr ctrll keycode 3 = twosuperior
+ shift altgr ctrll keycode 3 = onehalf
+ control ctrll keycode 3 = nul
+ shift control ctrll keycode 3 = nul
+ altgr control ctrll keycode 3 = nul
+ shift altgr control ctrll keycode 3 = nul
+ alt ctrll keycode 3 = Meta_two
+ shift alt ctrll keycode 3 = Meta_at
+ altgr alt ctrll keycode 3 = Meta_two
+ shift altgr alt ctrll keycode 3 = Meta_at
+ control alt ctrll keycode 3 = Meta_nul
+ shift control alt ctrll keycode 3 = Meta_nul
+ altgr control alt ctrll keycode 3 = Meta_nul
+ shift altgr control alt ctrll keycode 3 = Meta_nul
+ shift shiftl ctrll keycode 3 = at
+ altgr shiftl ctrll keycode 3 = twosuperior
+ shift altgr shiftl ctrll keycode 3 = onehalf
+ control shiftl ctrll keycode 3 = nul
+ shift control shiftl ctrll keycode 3 = nul
+ altgr control shiftl ctrll keycode 3 = nul
+ shift altgr control shiftl ctrll keycode 3 = nul
+ alt shiftl ctrll keycode 3 = Meta_two
+ shift alt shiftl ctrll keycode 3 = Meta_at
+ altgr alt shiftl ctrll keycode 3 = Meta_two
+ shift altgr alt shiftl ctrll keycode 3 = Meta_at
+ control alt shiftl ctrll keycode 3 = Meta_nul
+ shift control alt shiftl ctrll keycode 3 = Meta_nul
+ altgr control alt shiftl ctrll keycode 3 = Meta_nul
+ shift altgr control alt shiftl ctrll keycode 3 = Meta_nul
+ shift shiftr ctrll keycode 3 = at
+ altgr shiftr ctrll keycode 3 = twosuperior
+ shift altgr shiftr ctrll keycode 3 = onehalf
+ control shiftr ctrll keycode 3 = nul
+ shift control shiftr ctrll keycode 3 = nul
+ altgr control shiftr ctrll keycode 3 = nul
+ shift altgr control shiftr ctrll keycode 3 = nul
+ alt shiftr ctrll keycode 3 = Meta_two
+ shift alt shiftr ctrll keycode 3 = Meta_at
+ altgr alt shiftr ctrll keycode 3 = Meta_two
+ shift altgr alt shiftr ctrll keycode 3 = Meta_at
+ control alt shiftr ctrll keycode 3 = Meta_nul
+ shift control alt shiftr ctrll keycode 3 = Meta_nul
+ altgr control alt shiftr ctrll keycode 3 = Meta_nul
+ shift altgr control alt shiftr ctrll keycode 3 = Meta_nul
+ shift shiftl shiftr ctrll keycode 3 = at
+ altgr shiftl shiftr ctrll keycode 3 = twosuperior
+ shift altgr shiftl shiftr ctrll keycode 3 = onehalf
+ control shiftl shiftr ctrll keycode 3 = nul
+ shift control shiftl shiftr ctrll keycode 3 = nul
+ altgr control shiftl shiftr ctrll keycode 3 = nul
+ shift altgr control shiftl shiftr ctrll keycode 3 = nul
+ alt shiftl shiftr ctrll keycode 3 = Meta_two
+ shift alt shiftl shiftr ctrll keycode 3 = Meta_at
+ altgr alt shiftl shiftr ctrll keycode 3 = Meta_two
+ shift altgr alt shiftl shiftr ctrll keycode 3 = Meta_at
+ control alt shiftl shiftr ctrll keycode 3 = Meta_nul
+ shift control alt shiftl shiftr ctrll keycode 3 = Meta_nul
+ altgr control alt shiftl shiftr ctrll keycode 3 = Meta_nul
+ shift altgr control alt shiftl shiftr ctrll keycode 3 = Meta_nul
+keycode 4 = three
+ shift keycode 4 = numbersign
+ altgr keycode 4 = threesuperior
+ shift altgr keycode 4 = threequarters
+ control keycode 4 = Escape
+ shift control keycode 4 = Escape
+ altgr control keycode 4 = Escape
+ shift altgr control keycode 4 = Escape
+ alt keycode 4 = Meta_three
+ shift alt keycode 4 = Meta_numbersign
+ altgr alt keycode 4 = Meta_three
+ shift altgr alt keycode 4 = Meta_numbersign
+ control alt keycode 4 = Meta_Escape
+ shift control alt keycode 4 = Meta_Escape
+ altgr control alt keycode 4 = Meta_Escape
+ shift altgr control alt keycode 4 = Meta_Escape
+ shift shiftl keycode 4 = numbersign
+ altgr shiftl keycode 4 = threesuperior
+ shift altgr shiftl keycode 4 = threequarters
+ control shiftl keycode 4 = Escape
+ shift control shiftl keycode 4 = Escape
+ altgr control shiftl keycode 4 = Escape
+ shift altgr control shiftl keycode 4 = Escape
+ alt shiftl keycode 4 = Meta_three
+ shift alt shiftl keycode 4 = Meta_numbersign
+ altgr alt shiftl keycode 4 = Meta_three
+ shift altgr alt shiftl keycode 4 = Meta_numbersign
+ control alt shiftl keycode 4 = Meta_Escape
+ shift control alt shiftl keycode 4 = Meta_Escape
+ altgr control alt shiftl keycode 4 = Meta_Escape
+ shift altgr control alt shiftl keycode 4 = Meta_Escape
+ shift shiftr keycode 4 = numbersign
+ altgr shiftr keycode 4 = threesuperior
+ shift altgr shiftr keycode 4 = threequarters
+ control shiftr keycode 4 = Escape
+ shift control shiftr keycode 4 = Escape
+ altgr control shiftr keycode 4 = Escape
+ shift altgr control shiftr keycode 4 = Escape
+ alt shiftr keycode 4 = Meta_three
+ shift alt shiftr keycode 4 = Meta_numbersign
+ altgr alt shiftr keycode 4 = Meta_three
+ shift altgr alt shiftr keycode 4 = Meta_numbersign
+ control alt shiftr keycode 4 = Meta_Escape
+ shift control alt shiftr keycode 4 = Meta_Escape
+ altgr control alt shiftr keycode 4 = Meta_Escape
+ shift altgr control alt shiftr keycode 4 = Meta_Escape
+ shift shiftl shiftr keycode 4 = numbersign
+ altgr shiftl shiftr keycode 4 = threesuperior
+ shift altgr shiftl shiftr keycode 4 = threequarters
+ control shiftl shiftr keycode 4 = Escape
+ shift control shiftl shiftr keycode 4 = Escape
+ altgr control shiftl shiftr keycode 4 = Escape
+ shift altgr control shiftl shiftr keycode 4 = Escape
+ alt shiftl shiftr keycode 4 = Meta_three
+ shift alt shiftl shiftr keycode 4 = Meta_numbersign
+ altgr alt shiftl shiftr keycode 4 = Meta_three
+ shift altgr alt shiftl shiftr keycode 4 = Meta_numbersign
+ control alt shiftl shiftr keycode 4 = Meta_Escape
+ shift control alt shiftl shiftr keycode 4 = Meta_Escape
+ altgr control alt shiftl shiftr keycode 4 = Meta_Escape
+ shift altgr control alt shiftl shiftr keycode 4 = Meta_Escape
+ shift ctrll keycode 4 = numbersign
+ altgr ctrll keycode 4 = threesuperior
+ shift altgr ctrll keycode 4 = threequarters
+ control ctrll keycode 4 = Escape
+ shift control ctrll keycode 4 = Escape
+ altgr control ctrll keycode 4 = Escape
+ shift altgr control ctrll keycode 4 = Escape
+ alt ctrll keycode 4 = Meta_three
+ shift alt ctrll keycode 4 = Meta_numbersign
+ altgr alt ctrll keycode 4 = Meta_three
+ shift altgr alt ctrll keycode 4 = Meta_numbersign
+ control alt ctrll keycode 4 = Meta_Escape
+ shift control alt ctrll keycode 4 = Meta_Escape
+ altgr control alt ctrll keycode 4 = Meta_Escape
+ shift altgr control alt ctrll keycode 4 = Meta_Escape
+ shift shiftl ctrll keycode 4 = numbersign
+ altgr shiftl ctrll keycode 4 = threesuperior
+ shift altgr shiftl ctrll keycode 4 = threequarters
+ control shiftl ctrll keycode 4 = Escape
+ shift control shiftl ctrll keycode 4 = Escape
+ altgr control shiftl ctrll keycode 4 = Escape
+ shift altgr control shiftl ctrll keycode 4 = Escape
+ alt shiftl ctrll keycode 4 = Meta_three
+ shift alt shiftl ctrll keycode 4 = Meta_numbersign
+ altgr alt shiftl ctrll keycode 4 = Meta_three
+ shift altgr alt shiftl ctrll keycode 4 = Meta_numbersign
+ control alt shiftl ctrll keycode 4 = Meta_Escape
+ shift control alt shiftl ctrll keycode 4 = Meta_Escape
+ altgr control alt shiftl ctrll keycode 4 = Meta_Escape
+ shift altgr control alt shiftl ctrll keycode 4 = Meta_Escape
+ shift shiftr ctrll keycode 4 = numbersign
+ altgr shiftr ctrll keycode 4 = threesuperior
+ shift altgr shiftr ctrll keycode 4 = threequarters
+ control shiftr ctrll keycode 4 = Escape
+ shift control shiftr ctrll keycode 4 = Escape
+ altgr control shiftr ctrll keycode 4 = Escape
+ shift altgr control shiftr ctrll keycode 4 = Escape
+ alt shiftr ctrll keycode 4 = Meta_three
+ shift alt shiftr ctrll keycode 4 = Meta_numbersign
+ altgr alt shiftr ctrll keycode 4 = Meta_three
+ shift altgr alt shiftr ctrll keycode 4 = Meta_numbersign
+ control alt shiftr ctrll keycode 4 = Meta_Escape
+ shift control alt shiftr ctrll keycode 4 = Meta_Escape
+ altgr control alt shiftr ctrll keycode 4 = Meta_Escape
+ shift altgr control alt shiftr ctrll keycode 4 = Meta_Escape
+ shift shiftl shiftr ctrll keycode 4 = numbersign
+ altgr shiftl shiftr ctrll keycode 4 = threesuperior
+ shift altgr shiftl shiftr ctrll keycode 4 = threequarters
+ control shiftl shiftr ctrll keycode 4 = Escape
+ shift control shiftl shiftr ctrll keycode 4 = Escape
+ altgr control shiftl shiftr ctrll keycode 4 = Escape
+ shift altgr control shiftl shiftr ctrll keycode 4 = Escape
+ alt shiftl shiftr ctrll keycode 4 = Meta_three
+ shift alt shiftl shiftr ctrll keycode 4 = Meta_numbersign
+ altgr alt shiftl shiftr ctrll keycode 4 = Meta_three
+ shift altgr alt shiftl shiftr ctrll keycode 4 = Meta_numbersign
+ control alt shiftl shiftr ctrll keycode 4 = Meta_Escape
+ shift control alt shiftl shiftr ctrll keycode 4 = Meta_Escape
+ altgr control alt shiftl shiftr ctrll keycode 4 = Meta_Escape
+ shift altgr control alt shiftl shiftr ctrll keycode 4 = Meta_Escape
+keycode 5 = four
+ shift keycode 5 = dollar
+ altgr keycode 5 = sterling
+ shift altgr keycode 5 = onequarter
+ control keycode 5 = Control_backslash
+ shift control keycode 5 = Control_backslash
+ altgr control keycode 5 = Control_backslash
+ shift altgr control keycode 5 = Control_backslash
+ alt keycode 5 = Meta_four
+ shift alt keycode 5 = Meta_dollar
+ altgr alt keycode 5 = Meta_four
+ shift altgr alt keycode 5 = Meta_dollar
+ control alt keycode 5 = Meta_Control_backslash
+ shift control alt keycode 5 = Meta_Control_backslash
+ altgr control alt keycode 5 = Meta_Control_backslash
+ shift altgr control alt keycode 5 = Meta_Control_backslash
+ shift shiftl keycode 5 = dollar
+ altgr shiftl keycode 5 = sterling
+ shift altgr shiftl keycode 5 = onequarter
+ control shiftl keycode 5 = Control_backslash
+ shift control shiftl keycode 5 = Control_backslash
+ altgr control shiftl keycode 5 = Control_backslash
+ shift altgr control shiftl keycode 5 = Control_backslash
+ alt shiftl keycode 5 = Meta_four
+ shift alt shiftl keycode 5 = Meta_dollar
+ altgr alt shiftl keycode 5 = Meta_four
+ shift altgr alt shiftl keycode 5 = Meta_dollar
+ control alt shiftl keycode 5 = Meta_Control_backslash
+ shift control alt shiftl keycode 5 = Meta_Control_backslash
+ altgr control alt shiftl keycode 5 = Meta_Control_backslash
+ shift altgr control alt shiftl keycode 5 = Meta_Control_backslash
+ shift shiftr keycode 5 = dollar
+ altgr shiftr keycode 5 = sterling
+ shift altgr shiftr keycode 5 = onequarter
+ control shiftr keycode 5 = Control_backslash
+ shift control shiftr keycode 5 = Control_backslash
+ altgr control shiftr keycode 5 = Control_backslash
+ shift altgr control shiftr keycode 5 = Control_backslash
+ alt shiftr keycode 5 = Meta_four
+ shift alt shiftr keycode 5 = Meta_dollar
+ altgr alt shiftr keycode 5 = Meta_four
+ shift altgr alt shiftr keycode 5 = Meta_dollar
+ control alt shiftr keycode 5 = Meta_Control_backslash
+ shift control alt shiftr keycode 5 = Meta_Control_backslash
+ altgr control alt shiftr keycode 5 = Meta_Control_backslash
+ shift altgr control alt shiftr keycode 5 = Meta_Control_backslash
+ shift shiftl shiftr keycode 5 = dollar
+ altgr shiftl shiftr keycode 5 = sterling
+ shift altgr shiftl shiftr keycode 5 = onequarter
+ control shiftl shiftr keycode 5 = Control_backslash
+ shift control shiftl shiftr keycode 5 = Control_backslash
+ altgr control shiftl shiftr keycode 5 = Control_backslash
+ shift altgr control shiftl shiftr keycode 5 = Control_backslash
+ alt shiftl shiftr keycode 5 = Meta_four
+ shift alt shiftl shiftr keycode 5 = Meta_dollar
+ altgr alt shiftl shiftr keycode 5 = Meta_four
+ shift altgr alt shiftl shiftr keycode 5 = Meta_dollar
+ control alt shiftl shiftr keycode 5 = Meta_Control_backslash
+ shift control alt shiftl shiftr keycode 5 = Meta_Control_backslash
+ altgr control alt shiftl shiftr keycode 5 = Meta_Control_backslash
+ shift altgr control alt shiftl shiftr keycode 5 = Meta_Control_backslash
+ shift ctrll keycode 5 = dollar
+ altgr ctrll keycode 5 = sterling
+ shift altgr ctrll keycode 5 = onequarter
+ control ctrll keycode 5 = Control_backslash
+ shift control ctrll keycode 5 = Control_backslash
+ altgr control ctrll keycode 5 = Control_backslash
+ shift altgr control ctrll keycode 5 = Control_backslash
+ alt ctrll keycode 5 = Meta_four
+ shift alt ctrll keycode 5 = Meta_dollar
+ altgr alt ctrll keycode 5 = Meta_four
+ shift altgr alt ctrll keycode 5 = Meta_dollar
+ control alt ctrll keycode 5 = Meta_Control_backslash
+ shift control alt ctrll keycode 5 = Meta_Control_backslash
+ altgr control alt ctrll keycode 5 = Meta_Control_backslash
+ shift altgr control alt ctrll keycode 5 = Meta_Control_backslash
+ shift shiftl ctrll keycode 5 = dollar
+ altgr shiftl ctrll keycode 5 = sterling
+ shift altgr shiftl ctrll keycode 5 = onequarter
+ control shiftl ctrll keycode 5 = Control_backslash
+ shift control shiftl ctrll keycode 5 = Control_backslash
+ altgr control shiftl ctrll keycode 5 = Control_backslash
+ shift altgr control shiftl ctrll keycode 5 = Control_backslash
+ alt shiftl ctrll keycode 5 = Meta_four
+ shift alt shiftl ctrll keycode 5 = Meta_dollar
+ altgr alt shiftl ctrll keycode 5 = Meta_four
+ shift altgr alt shiftl ctrll keycode 5 = Meta_dollar
+ control alt shiftl ctrll keycode 5 = Meta_Control_backslash
+ shift control alt shiftl ctrll keycode 5 = Meta_Control_backslash
+ altgr control alt shiftl ctrll keycode 5 = Meta_Control_backslash
+ shift altgr control alt shiftl ctrll keycode 5 = Meta_Control_backslash
+ shift shiftr ctrll keycode 5 = dollar
+ altgr shiftr ctrll keycode 5 = sterling
+ shift altgr shiftr ctrll keycode 5 = onequarter
+ control shiftr ctrll keycode 5 = Control_backslash
+ shift control shiftr ctrll keycode 5 = Control_backslash
+ altgr control shiftr ctrll keycode 5 = Control_backslash
+ shift altgr control shiftr ctrll keycode 5 = Control_backslash
+ alt shiftr ctrll keycode 5 = Meta_four
+ shift alt shiftr ctrll keycode 5 = Meta_dollar
+ altgr alt shiftr ctrll keycode 5 = Meta_four
+ shift altgr alt shiftr ctrll keycode 5 = Meta_dollar
+ control alt shiftr ctrll keycode 5 = Meta_Control_backslash
+ shift control alt shiftr ctrll keycode 5 = Meta_Control_backslash
+ altgr control alt shiftr ctrll keycode 5 = Meta_Control_backslash
+ shift altgr control alt shiftr ctrll keycode 5 = Meta_Control_backslash
+ shift shiftl shiftr ctrll keycode 5 = dollar
+ altgr shiftl shiftr ctrll keycode 5 = sterling
+ shift altgr shiftl shiftr ctrll keycode 5 = onequarter
+ control shiftl shiftr ctrll keycode 5 = Control_backslash
+ shift control shiftl shiftr ctrll keycode 5 = Control_backslash
+ altgr control shiftl shiftr ctrll keycode 5 = Control_backslash
+ shift altgr control shiftl shiftr ctrll keycode 5 = Control_backslash
+ alt shiftl shiftr ctrll keycode 5 = Meta_four
+ shift alt shiftl shiftr ctrll keycode 5 = Meta_dollar
+ altgr alt shiftl shiftr ctrll keycode 5 = Meta_four
+ shift altgr alt shiftl shiftr ctrll keycode 5 = Meta_dollar
+ control alt shiftl shiftr ctrll keycode 5 = Meta_Control_backslash
+ shift control alt shiftl shiftr ctrll keycode 5 = Meta_Control_backslash
+ altgr control alt shiftl shiftr ctrll keycode 5 = Meta_Control_backslash
+ shift altgr control alt shiftl shiftr ctrll keycode 5 = Meta_Control_backslash
+keycode 6 = five
+ shift keycode 6 = percent
+ altgr keycode 6 = cent
+ shift altgr keycode 6 = U+215c
+ control keycode 6 = Control_bracketright
+ shift control keycode 6 = Control_bracketright
+ altgr control keycode 6 = Control_bracketright
+ shift altgr control keycode 6 = Control_bracketright
+ alt keycode 6 = Meta_five
+ shift alt keycode 6 = Meta_percent
+ altgr alt keycode 6 = Meta_five
+ shift altgr alt keycode 6 = Meta_percent
+ control alt keycode 6 = Meta_Control_bracketright
+ shift control alt keycode 6 = Meta_Control_bracketright
+ altgr control alt keycode 6 = Meta_Control_bracketright
+ shift altgr control alt keycode 6 = Meta_Control_bracketright
+ shift shiftl keycode 6 = percent
+ altgr shiftl keycode 6 = cent
+ shift altgr shiftl keycode 6 = U+215c
+ control shiftl keycode 6 = Control_bracketright
+ shift control shiftl keycode 6 = Control_bracketright
+ altgr control shiftl keycode 6 = Control_bracketright
+ shift altgr control shiftl keycode 6 = Control_bracketright
+ alt shiftl keycode 6 = Meta_five
+ shift alt shiftl keycode 6 = Meta_percent
+ altgr alt shiftl keycode 6 = Meta_five
+ shift altgr alt shiftl keycode 6 = Meta_percent
+ control alt shiftl keycode 6 = Meta_Control_bracketright
+ shift control alt shiftl keycode 6 = Meta_Control_bracketright
+ altgr control alt shiftl keycode 6 = Meta_Control_bracketright
+ shift altgr control alt shiftl keycode 6 = Meta_Control_bracketright
+ shift shiftr keycode 6 = percent
+ altgr shiftr keycode 6 = cent
+ shift altgr shiftr keycode 6 = U+215c
+ control shiftr keycode 6 = Control_bracketright
+ shift control shiftr keycode 6 = Control_bracketright
+ altgr control shiftr keycode 6 = Control_bracketright
+ shift altgr control shiftr keycode 6 = Control_bracketright
+ alt shiftr keycode 6 = Meta_five
+ shift alt shiftr keycode 6 = Meta_percent
+ altgr alt shiftr keycode 6 = Meta_five
+ shift altgr alt shiftr keycode 6 = Meta_percent
+ control alt shiftr keycode 6 = Meta_Control_bracketright
+ shift control alt shiftr keycode 6 = Meta_Control_bracketright
+ altgr control alt shiftr keycode 6 = Meta_Control_bracketright
+ shift altgr control alt shiftr keycode 6 = Meta_Control_bracketright
+ shift shiftl shiftr keycode 6 = percent
+ altgr shiftl shiftr keycode 6 = cent
+ shift altgr shiftl shiftr keycode 6 = U+215c
+ control shiftl shiftr keycode 6 = Control_bracketright
+ shift control shiftl shiftr keycode 6 = Control_bracketright
+ altgr control shiftl shiftr keycode 6 = Control_bracketright
+ shift altgr control shiftl shiftr keycode 6 = Control_bracketright
+ alt shiftl shiftr keycode 6 = Meta_five
+ shift alt shiftl shiftr keycode 6 = Meta_percent
+ altgr alt shiftl shiftr keycode 6 = Meta_five
+ shift altgr alt shiftl shiftr keycode 6 = Meta_percent
+ control alt shiftl shiftr keycode 6 = Meta_Control_bracketright
+ shift control alt shiftl shiftr keycode 6 = Meta_Control_bracketright
+ altgr control alt shiftl shiftr keycode 6 = Meta_Control_bracketright
+ shift altgr control alt shiftl shiftr keycode 6 = Meta_Control_bracketright
+ shift ctrll keycode 6 = percent
+ altgr ctrll keycode 6 = cent
+ shift altgr ctrll keycode 6 = U+215c
+ control ctrll keycode 6 = Control_bracketright
+ shift control ctrll keycode 6 = Control_bracketright
+ altgr control ctrll keycode 6 = Control_bracketright
+ shift altgr control ctrll keycode 6 = Control_bracketright
+ alt ctrll keycode 6 = Meta_five
+ shift alt ctrll keycode 6 = Meta_percent
+ altgr alt ctrll keycode 6 = Meta_five
+ shift altgr alt ctrll keycode 6 = Meta_percent
+ control alt ctrll keycode 6 = Meta_Control_bracketright
+ shift control alt ctrll keycode 6 = Meta_Control_bracketright
+ altgr control alt ctrll keycode 6 = Meta_Control_bracketright
+ shift altgr control alt ctrll keycode 6 = Meta_Control_bracketright
+ shift shiftl ctrll keycode 6 = percent
+ altgr shiftl ctrll keycode 6 = cent
+ shift altgr shiftl ctrll keycode 6 = U+215c
+ control shiftl ctrll keycode 6 = Control_bracketright
+ shift control shiftl ctrll keycode 6 = Control_bracketright
+ altgr control shiftl ctrll keycode 6 = Control_bracketright
+ shift altgr control shiftl ctrll keycode 6 = Control_bracketright
+ alt shiftl ctrll keycode 6 = Meta_five
+ shift alt shiftl ctrll keycode 6 = Meta_percent
+ altgr alt shiftl ctrll keycode 6 = Meta_five
+ shift altgr alt shiftl ctrll keycode 6 = Meta_percent
+ control alt shiftl ctrll keycode 6 = Meta_Control_bracketright
+ shift control alt shiftl ctrll keycode 6 = Meta_Control_bracketright
+ altgr control alt shiftl ctrll keycode 6 = Meta_Control_bracketright
+ shift altgr control alt shiftl ctrll keycode 6 = Meta_Control_bracketright
+ shift shiftr ctrll keycode 6 = percent
+ altgr shiftr ctrll keycode 6 = cent
+ shift altgr shiftr ctrll keycode 6 = U+215c
+ control shiftr ctrll keycode 6 = Control_bracketright
+ shift control shiftr ctrll keycode 6 = Control_bracketright
+ altgr control shiftr ctrll keycode 6 = Control_bracketright
+ shift altgr control shiftr ctrll keycode 6 = Control_bracketright
+ alt shiftr ctrll keycode 6 = Meta_five
+ shift alt shiftr ctrll keycode 6 = Meta_percent
+ altgr alt shiftr ctrll keycode 6 = Meta_five
+ shift altgr alt shiftr ctrll keycode 6 = Meta_percent
+ control alt shiftr ctrll keycode 6 = Meta_Control_bracketright
+ shift control alt shiftr ctrll keycode 6 = Meta_Control_bracketright
+ altgr control alt shiftr ctrll keycode 6 = Meta_Control_bracketright
+ shift altgr control alt shiftr ctrll keycode 6 = Meta_Control_bracketright
+ shift shiftl shiftr ctrll keycode 6 = percent
+ altgr shiftl shiftr ctrll keycode 6 = cent
+ shift altgr shiftl shiftr ctrll keycode 6 = U+215c
+ control shiftl shiftr ctrll keycode 6 = Control_bracketright
+ shift control shiftl shiftr ctrll keycode 6 = Control_bracketright
+ altgr control shiftl shiftr ctrll keycode 6 = Control_bracketright
+ shift altgr control shiftl shiftr ctrll keycode 6 = Control_bracketright
+ alt shiftl shiftr ctrll keycode 6 = Meta_five
+ shift alt shiftl shiftr ctrll keycode 6 = Meta_percent
+ altgr alt shiftl shiftr ctrll keycode 6 = Meta_five
+ shift altgr alt shiftl shiftr ctrll keycode 6 = Meta_percent
+ control alt shiftl shiftr ctrll keycode 6 = Meta_Control_bracketright
+ shift control alt shiftl shiftr ctrll keycode 6 = Meta_Control_bracketright
+ altgr control alt shiftl shiftr ctrll keycode 6 = Meta_Control_bracketright
+ shift altgr control alt shiftl shiftr ctrll keycode 6 = Meta_Control_bracketright
+keycode 7 = six
+ shift keycode 7 = dead_diaeresis
+ altgr keycode 7 = notsign
+ shift altgr keycode 7 = diaeresis
+ control keycode 7 = Control_asciicircum
+ shift control keycode 7 = dead_diaeresis
+ altgr control keycode 7 = Control_asciicircum
+ shift altgr control keycode 7 = dead_diaeresis
+ alt keycode 7 = Meta_six
+ shift alt keycode 7 = dead_diaeresis
+ altgr alt keycode 7 = Meta_six
+ shift altgr alt keycode 7 = dead_diaeresis
+ control alt keycode 7 = Meta_Control_asciicircum
+ shift control alt keycode 7 = dead_diaeresis
+ altgr control alt keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt keycode 7 = dead_diaeresis
+ shift shiftl keycode 7 = dead_diaeresis
+ altgr shiftl keycode 7 = notsign
+ shift altgr shiftl keycode 7 = diaeresis
+ control shiftl keycode 7 = Control_asciicircum
+ shift control shiftl keycode 7 = dead_diaeresis
+ altgr control shiftl keycode 7 = Control_asciicircum
+ shift altgr control shiftl keycode 7 = dead_diaeresis
+ alt shiftl keycode 7 = Meta_six
+ shift alt shiftl keycode 7 = dead_diaeresis
+ altgr alt shiftl keycode 7 = Meta_six
+ shift altgr alt shiftl keycode 7 = dead_diaeresis
+ control alt shiftl keycode 7 = Meta_Control_asciicircum
+ shift control alt shiftl keycode 7 = dead_diaeresis
+ altgr control alt shiftl keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt shiftl keycode 7 = dead_diaeresis
+ shift shiftr keycode 7 = dead_diaeresis
+ altgr shiftr keycode 7 = notsign
+ shift altgr shiftr keycode 7 = diaeresis
+ control shiftr keycode 7 = Control_asciicircum
+ shift control shiftr keycode 7 = dead_diaeresis
+ altgr control shiftr keycode 7 = Control_asciicircum
+ shift altgr control shiftr keycode 7 = dead_diaeresis
+ alt shiftr keycode 7 = Meta_six
+ shift alt shiftr keycode 7 = dead_diaeresis
+ altgr alt shiftr keycode 7 = Meta_six
+ shift altgr alt shiftr keycode 7 = dead_diaeresis
+ control alt shiftr keycode 7 = Meta_Control_asciicircum
+ shift control alt shiftr keycode 7 = dead_diaeresis
+ altgr control alt shiftr keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt shiftr keycode 7 = dead_diaeresis
+ shift shiftl shiftr keycode 7 = dead_diaeresis
+ altgr shiftl shiftr keycode 7 = notsign
+ shift altgr shiftl shiftr keycode 7 = diaeresis
+ control shiftl shiftr keycode 7 = Control_asciicircum
+ shift control shiftl shiftr keycode 7 = dead_diaeresis
+ altgr control shiftl shiftr keycode 7 = Control_asciicircum
+ shift altgr control shiftl shiftr keycode 7 = dead_diaeresis
+ alt shiftl shiftr keycode 7 = Meta_six
+ shift alt shiftl shiftr keycode 7 = dead_diaeresis
+ altgr alt shiftl shiftr keycode 7 = Meta_six
+ shift altgr alt shiftl shiftr keycode 7 = dead_diaeresis
+ control alt shiftl shiftr keycode 7 = Meta_Control_asciicircum
+ shift control alt shiftl shiftr keycode 7 = dead_diaeresis
+ altgr control alt shiftl shiftr keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt shiftl shiftr keycode 7 = dead_diaeresis
+ shift ctrll keycode 7 = dead_diaeresis
+ altgr ctrll keycode 7 = notsign
+ shift altgr ctrll keycode 7 = diaeresis
+ control ctrll keycode 7 = Control_asciicircum
+ shift control ctrll keycode 7 = dead_diaeresis
+ altgr control ctrll keycode 7 = Control_asciicircum
+ shift altgr control ctrll keycode 7 = dead_diaeresis
+ alt ctrll keycode 7 = Meta_six
+ shift alt ctrll keycode 7 = dead_diaeresis
+ altgr alt ctrll keycode 7 = Meta_six
+ shift altgr alt ctrll keycode 7 = dead_diaeresis
+ control alt ctrll keycode 7 = Meta_Control_asciicircum
+ shift control alt ctrll keycode 7 = dead_diaeresis
+ altgr control alt ctrll keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt ctrll keycode 7 = dead_diaeresis
+ shift shiftl ctrll keycode 7 = dead_diaeresis
+ altgr shiftl ctrll keycode 7 = notsign
+ shift altgr shiftl ctrll keycode 7 = diaeresis
+ control shiftl ctrll keycode 7 = Control_asciicircum
+ shift control shiftl ctrll keycode 7 = dead_diaeresis
+ altgr control shiftl ctrll keycode 7 = Control_asciicircum
+ shift altgr control shiftl ctrll keycode 7 = dead_diaeresis
+ alt shiftl ctrll keycode 7 = Meta_six
+ shift alt shiftl ctrll keycode 7 = dead_diaeresis
+ altgr alt shiftl ctrll keycode 7 = Meta_six
+ shift altgr alt shiftl ctrll keycode 7 = dead_diaeresis
+ control alt shiftl ctrll keycode 7 = Meta_Control_asciicircum
+ shift control alt shiftl ctrll keycode 7 = dead_diaeresis
+ altgr control alt shiftl ctrll keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt shiftl ctrll keycode 7 = dead_diaeresis
+ shift shiftr ctrll keycode 7 = dead_diaeresis
+ altgr shiftr ctrll keycode 7 = notsign
+ shift altgr shiftr ctrll keycode 7 = diaeresis
+ control shiftr ctrll keycode 7 = Control_asciicircum
+ shift control shiftr ctrll keycode 7 = dead_diaeresis
+ altgr control shiftr ctrll keycode 7 = Control_asciicircum
+ shift altgr control shiftr ctrll keycode 7 = dead_diaeresis
+ alt shiftr ctrll keycode 7 = Meta_six
+ shift alt shiftr ctrll keycode 7 = dead_diaeresis
+ altgr alt shiftr ctrll keycode 7 = Meta_six
+ shift altgr alt shiftr ctrll keycode 7 = dead_diaeresis
+ control alt shiftr ctrll keycode 7 = Meta_Control_asciicircum
+ shift control alt shiftr ctrll keycode 7 = dead_diaeresis
+ altgr control alt shiftr ctrll keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt shiftr ctrll keycode 7 = dead_diaeresis
+ shift shiftl shiftr ctrll keycode 7 = dead_diaeresis
+ altgr shiftl shiftr ctrll keycode 7 = notsign
+ shift altgr shiftl shiftr ctrll keycode 7 = diaeresis
+ control shiftl shiftr ctrll keycode 7 = Control_asciicircum
+ shift control shiftl shiftr ctrll keycode 7 = dead_diaeresis
+ altgr control shiftl shiftr ctrll keycode 7 = Control_asciicircum
+ shift altgr control shiftl shiftr ctrll keycode 7 = dead_diaeresis
+ alt shiftl shiftr ctrll keycode 7 = Meta_six
+ shift alt shiftl shiftr ctrll keycode 7 = dead_diaeresis
+ altgr alt shiftl shiftr ctrll keycode 7 = Meta_six
+ shift altgr alt shiftl shiftr ctrll keycode 7 = dead_diaeresis
+ control alt shiftl shiftr ctrll keycode 7 = Meta_Control_asciicircum
+ shift control alt shiftl shiftr ctrll keycode 7 = dead_diaeresis
+ altgr control alt shiftl shiftr ctrll keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt shiftl shiftr ctrll keycode 7 = dead_diaeresis
+keycode 8 = seven
+ shift keycode 8 = ampersand
+ altgr keycode 8 = braceleft
+ shift altgr keycode 8 = U+215e
+ control keycode 8 = Control_underscore
+ shift control keycode 8 = Control_underscore
+ altgr control keycode 8 = Control_underscore
+ shift altgr control keycode 8 = Control_underscore
+ alt keycode 8 = Meta_seven
+ shift alt keycode 8 = Meta_ampersand
+ altgr alt keycode 8 = Meta_braceleft
+ shift altgr alt keycode 8 = Meta_braceleft
+ control alt keycode 8 = Meta_Control_underscore
+ shift control alt keycode 8 = Meta_Control_underscore
+ altgr control alt keycode 8 = Meta_Control_underscore
+ shift altgr control alt keycode 8 = Meta_Control_underscore
+ shift shiftl keycode 8 = ampersand
+ altgr shiftl keycode 8 = braceleft
+ shift altgr shiftl keycode 8 = U+215e
+ control shiftl keycode 8 = Control_underscore
+ shift control shiftl keycode 8 = Control_underscore
+ altgr control shiftl keycode 8 = Control_underscore
+ shift altgr control shiftl keycode 8 = Control_underscore
+ alt shiftl keycode 8 = Meta_seven
+ shift alt shiftl keycode 8 = Meta_ampersand
+ altgr alt shiftl keycode 8 = Meta_braceleft
+ shift altgr alt shiftl keycode 8 = Meta_braceleft
+ control alt shiftl keycode 8 = Meta_Control_underscore
+ shift control alt shiftl keycode 8 = Meta_Control_underscore
+ altgr control alt shiftl keycode 8 = Meta_Control_underscore
+ shift altgr control alt shiftl keycode 8 = Meta_Control_underscore
+ shift shiftr keycode 8 = ampersand
+ altgr shiftr keycode 8 = braceleft
+ shift altgr shiftr keycode 8 = U+215e
+ control shiftr keycode 8 = Control_underscore
+ shift control shiftr keycode 8 = Control_underscore
+ altgr control shiftr keycode 8 = Control_underscore
+ shift altgr control shiftr keycode 8 = Control_underscore
+ alt shiftr keycode 8 = Meta_seven
+ shift alt shiftr keycode 8 = Meta_ampersand
+ altgr alt shiftr keycode 8 = Meta_braceleft
+ shift altgr alt shiftr keycode 8 = Meta_braceleft
+ control alt shiftr keycode 8 = Meta_Control_underscore
+ shift control alt shiftr keycode 8 = Meta_Control_underscore
+ altgr control alt shiftr keycode 8 = Meta_Control_underscore
+ shift altgr control alt shiftr keycode 8 = Meta_Control_underscore
+ shift shiftl shiftr keycode 8 = ampersand
+ altgr shiftl shiftr keycode 8 = braceleft
+ shift altgr shiftl shiftr keycode 8 = U+215e
+ control shiftl shiftr keycode 8 = Control_underscore
+ shift control shiftl shiftr keycode 8 = Control_underscore
+ altgr control shiftl shiftr keycode 8 = Control_underscore
+ shift altgr control shiftl shiftr keycode 8 = Control_underscore
+ alt shiftl shiftr keycode 8 = Meta_seven
+ shift alt shiftl shiftr keycode 8 = Meta_ampersand
+ altgr alt shiftl shiftr keycode 8 = Meta_braceleft
+ shift altgr alt shiftl shiftr keycode 8 = Meta_braceleft
+ control alt shiftl shiftr keycode 8 = Meta_Control_underscore
+ shift control alt shiftl shiftr keycode 8 = Meta_Control_underscore
+ altgr control alt shiftl shiftr keycode 8 = Meta_Control_underscore
+ shift altgr control alt shiftl shiftr keycode 8 = Meta_Control_underscore
+ shift ctrll keycode 8 = ampersand
+ altgr ctrll keycode 8 = braceleft
+ shift altgr ctrll keycode 8 = U+215e
+ control ctrll keycode 8 = Control_underscore
+ shift control ctrll keycode 8 = Control_underscore
+ altgr control ctrll keycode 8 = Control_underscore
+ shift altgr control ctrll keycode 8 = Control_underscore
+ alt ctrll keycode 8 = Meta_seven
+ shift alt ctrll keycode 8 = Meta_ampersand
+ altgr alt ctrll keycode 8 = Meta_braceleft
+ shift altgr alt ctrll keycode 8 = Meta_braceleft
+ control alt ctrll keycode 8 = Meta_Control_underscore
+ shift control alt ctrll keycode 8 = Meta_Control_underscore
+ altgr control alt ctrll keycode 8 = Meta_Control_underscore
+ shift altgr control alt ctrll keycode 8 = Meta_Control_underscore
+ shift shiftl ctrll keycode 8 = ampersand
+ altgr shiftl ctrll keycode 8 = braceleft
+ shift altgr shiftl ctrll keycode 8 = U+215e
+ control shiftl ctrll keycode 8 = Control_underscore
+ shift control shiftl ctrll keycode 8 = Control_underscore
+ altgr control shiftl ctrll keycode 8 = Control_underscore
+ shift altgr control shiftl ctrll keycode 8 = Control_underscore
+ alt shiftl ctrll keycode 8 = Meta_seven
+ shift alt shiftl ctrll keycode 8 = Meta_ampersand
+ altgr alt shiftl ctrll keycode 8 = Meta_braceleft
+ shift altgr alt shiftl ctrll keycode 8 = Meta_braceleft
+ control alt shiftl ctrll keycode 8 = Meta_Control_underscore
+ shift control alt shiftl ctrll keycode 8 = Meta_Control_underscore
+ altgr control alt shiftl ctrll keycode 8 = Meta_Control_underscore
+ shift altgr control alt shiftl ctrll keycode 8 = Meta_Control_underscore
+ shift shiftr ctrll keycode 8 = ampersand
+ altgr shiftr ctrll keycode 8 = braceleft
+ shift altgr shiftr ctrll keycode 8 = U+215e
+ control shiftr ctrll keycode 8 = Control_underscore
+ shift control shiftr ctrll keycode 8 = Control_underscore
+ altgr control shiftr ctrll keycode 8 = Control_underscore
+ shift altgr control shiftr ctrll keycode 8 = Control_underscore
+ alt shiftr ctrll keycode 8 = Meta_seven
+ shift alt shiftr ctrll keycode 8 = Meta_ampersand
+ altgr alt shiftr ctrll keycode 8 = Meta_braceleft
+ shift altgr alt shiftr ctrll keycode 8 = Meta_braceleft
+ control alt shiftr ctrll keycode 8 = Meta_Control_underscore
+ shift control alt shiftr ctrll keycode 8 = Meta_Control_underscore
+ altgr control alt shiftr ctrll keycode 8 = Meta_Control_underscore
+ shift altgr control alt shiftr ctrll keycode 8 = Meta_Control_underscore
+ shift shiftl shiftr ctrll keycode 8 = ampersand
+ altgr shiftl shiftr ctrll keycode 8 = braceleft
+ shift altgr shiftl shiftr ctrll keycode 8 = U+215e
+ control shiftl shiftr ctrll keycode 8 = Control_underscore
+ shift control shiftl shiftr ctrll keycode 8 = Control_underscore
+ altgr control shiftl shiftr ctrll keycode 8 = Control_underscore
+ shift altgr control shiftl shiftr ctrll keycode 8 = Control_underscore
+ alt shiftl shiftr ctrll keycode 8 = Meta_seven
+ shift alt shiftl shiftr ctrll keycode 8 = Meta_ampersand
+ altgr alt shiftl shiftr ctrll keycode 8 = Meta_braceleft
+ shift altgr alt shiftl shiftr ctrll keycode 8 = Meta_braceleft
+ control alt shiftl shiftr ctrll keycode 8 = Meta_Control_underscore
+ shift control alt shiftl shiftr ctrll keycode 8 = Meta_Control_underscore
+ altgr control alt shiftl shiftr ctrll keycode 8 = Meta_Control_underscore
+ shift altgr control alt shiftl shiftr ctrll keycode 8 = Meta_Control_underscore
+keycode 9 = eight
+ shift keycode 9 = asterisk
+ altgr keycode 9 = bracketleft
+ shift altgr keycode 9 = trademark
+ control keycode 9 = Delete
+ shift control keycode 9 = Delete
+ altgr control keycode 9 = Escape
+ shift altgr control keycode 9 = Escape
+ alt keycode 9 = Meta_eight
+ shift alt keycode 9 = Meta_asterisk
+ altgr alt keycode 9 = Meta_bracketleft
+ shift altgr alt keycode 9 = Meta_bracketleft
+ control alt keycode 9 = Meta_Delete
+ shift control alt keycode 9 = Meta_Delete
+ altgr control alt keycode 9 = Meta_Escape
+ shift altgr control alt keycode 9 = Meta_Escape
+ shift shiftl keycode 9 = asterisk
+ altgr shiftl keycode 9 = bracketleft
+ shift altgr shiftl keycode 9 = trademark
+ control shiftl keycode 9 = Delete
+ shift control shiftl keycode 9 = Delete
+ altgr control shiftl keycode 9 = Escape
+ shift altgr control shiftl keycode 9 = Escape
+ alt shiftl keycode 9 = Meta_eight
+ shift alt shiftl keycode 9 = Meta_asterisk
+ altgr alt shiftl keycode 9 = Meta_bracketleft
+ shift altgr alt shiftl keycode 9 = Meta_bracketleft
+ control alt shiftl keycode 9 = Meta_Delete
+ shift control alt shiftl keycode 9 = Meta_Delete
+ altgr control alt shiftl keycode 9 = Meta_Escape
+ shift altgr control alt shiftl keycode 9 = Meta_Escape
+ shift shiftr keycode 9 = asterisk
+ altgr shiftr keycode 9 = bracketleft
+ shift altgr shiftr keycode 9 = trademark
+ control shiftr keycode 9 = Delete
+ shift control shiftr keycode 9 = Delete
+ altgr control shiftr keycode 9 = Escape
+ shift altgr control shiftr keycode 9 = Escape
+ alt shiftr keycode 9 = Meta_eight
+ shift alt shiftr keycode 9 = Meta_asterisk
+ altgr alt shiftr keycode 9 = Meta_bracketleft
+ shift altgr alt shiftr keycode 9 = Meta_bracketleft
+ control alt shiftr keycode 9 = Meta_Delete
+ shift control alt shiftr keycode 9 = Meta_Delete
+ altgr control alt shiftr keycode 9 = Meta_Escape
+ shift altgr control alt shiftr keycode 9 = Meta_Escape
+ shift shiftl shiftr keycode 9 = asterisk
+ altgr shiftl shiftr keycode 9 = bracketleft
+ shift altgr shiftl shiftr keycode 9 = trademark
+ control shiftl shiftr keycode 9 = Delete
+ shift control shiftl shiftr keycode 9 = Delete
+ altgr control shiftl shiftr keycode 9 = Escape
+ shift altgr control shiftl shiftr keycode 9 = Escape
+ alt shiftl shiftr keycode 9 = Meta_eight
+ shift alt shiftl shiftr keycode 9 = Meta_asterisk
+ altgr alt shiftl shiftr keycode 9 = Meta_bracketleft
+ shift altgr alt shiftl shiftr keycode 9 = Meta_bracketleft
+ control alt shiftl shiftr keycode 9 = Meta_Delete
+ shift control alt shiftl shiftr keycode 9 = Meta_Delete
+ altgr control alt shiftl shiftr keycode 9 = Meta_Escape
+ shift altgr control alt shiftl shiftr keycode 9 = Meta_Escape
+ shift ctrll keycode 9 = asterisk
+ altgr ctrll keycode 9 = bracketleft
+ shift altgr ctrll keycode 9 = trademark
+ control ctrll keycode 9 = Delete
+ shift control ctrll keycode 9 = Delete
+ altgr control ctrll keycode 9 = Escape
+ shift altgr control ctrll keycode 9 = Escape
+ alt ctrll keycode 9 = Meta_eight
+ shift alt ctrll keycode 9 = Meta_asterisk
+ altgr alt ctrll keycode 9 = Meta_bracketleft
+ shift altgr alt ctrll keycode 9 = Meta_bracketleft
+ control alt ctrll keycode 9 = Meta_Delete
+ shift control alt ctrll keycode 9 = Meta_Delete
+ altgr control alt ctrll keycode 9 = Meta_Escape
+ shift altgr control alt ctrll keycode 9 = Meta_Escape
+ shift shiftl ctrll keycode 9 = asterisk
+ altgr shiftl ctrll keycode 9 = bracketleft
+ shift altgr shiftl ctrll keycode 9 = trademark
+ control shiftl ctrll keycode 9 = Delete
+ shift control shiftl ctrll keycode 9 = Delete
+ altgr control shiftl ctrll keycode 9 = Escape
+ shift altgr control shiftl ctrll keycode 9 = Escape
+ alt shiftl ctrll keycode 9 = Meta_eight
+ shift alt shiftl ctrll keycode 9 = Meta_asterisk
+ altgr alt shiftl ctrll keycode 9 = Meta_bracketleft
+ shift altgr alt shiftl ctrll keycode 9 = Meta_bracketleft
+ control alt shiftl ctrll keycode 9 = Meta_Delete
+ shift control alt shiftl ctrll keycode 9 = Meta_Delete
+ altgr control alt shiftl ctrll keycode 9 = Meta_Escape
+ shift altgr control alt shiftl ctrll keycode 9 = Meta_Escape
+ shift shiftr ctrll keycode 9 = asterisk
+ altgr shiftr ctrll keycode 9 = bracketleft
+ shift altgr shiftr ctrll keycode 9 = trademark
+ control shiftr ctrll keycode 9 = Delete
+ shift control shiftr ctrll keycode 9 = Delete
+ altgr control shiftr ctrll keycode 9 = Escape
+ shift altgr control shiftr ctrll keycode 9 = Escape
+ alt shiftr ctrll keycode 9 = Meta_eight
+ shift alt shiftr ctrll keycode 9 = Meta_asterisk
+ altgr alt shiftr ctrll keycode 9 = Meta_bracketleft
+ shift altgr alt shiftr ctrll keycode 9 = Meta_bracketleft
+ control alt shiftr ctrll keycode 9 = Meta_Delete
+ shift control alt shiftr ctrll keycode 9 = Meta_Delete
+ altgr control alt shiftr ctrll keycode 9 = Meta_Escape
+ shift altgr control alt shiftr ctrll keycode 9 = Meta_Escape
+ shift shiftl shiftr ctrll keycode 9 = asterisk
+ altgr shiftl shiftr ctrll keycode 9 = bracketleft
+ shift altgr shiftl shiftr ctrll keycode 9 = trademark
+ control shiftl shiftr ctrll keycode 9 = Delete
+ shift control shiftl shiftr ctrll keycode 9 = Delete
+ altgr control shiftl shiftr ctrll keycode 9 = Escape
+ shift altgr control shiftl shiftr ctrll keycode 9 = Escape
+ alt shiftl shiftr ctrll keycode 9 = Meta_eight
+ shift alt shiftl shiftr ctrll keycode 9 = Meta_asterisk
+ altgr alt shiftl shiftr ctrll keycode 9 = Meta_bracketleft
+ shift altgr alt shiftl shiftr ctrll keycode 9 = Meta_bracketleft
+ control alt shiftl shiftr ctrll keycode 9 = Meta_Delete
+ shift control alt shiftl shiftr ctrll keycode 9 = Meta_Delete
+ altgr control alt shiftl shiftr ctrll keycode 9 = Meta_Escape
+ shift altgr control alt shiftl shiftr ctrll keycode 9 = Meta_Escape
+keycode 10 = nine
+ shift keycode 10 = parenleft
+ altgr keycode 10 = bracketright
+ shift altgr keycode 10 = plusminus
+ control keycode 10 = Control_bracketright
+ shift control keycode 10 = Control_bracketright
+ altgr control keycode 10 = Control_bracketright
+ shift altgr control keycode 10 = Control_bracketright
+ alt keycode 10 = Meta_nine
+ shift alt keycode 10 = Meta_parenleft
+ altgr alt keycode 10 = Meta_bracketright
+ shift altgr alt keycode 10 = Meta_bracketright
+ control alt keycode 10 = Meta_Control_bracketright
+ shift control alt keycode 10 = Meta_Control_bracketright
+ altgr control alt keycode 10 = Meta_Control_bracketright
+ shift altgr control alt keycode 10 = Meta_Control_bracketright
+ shift shiftl keycode 10 = parenleft
+ altgr shiftl keycode 10 = bracketright
+ shift altgr shiftl keycode 10 = plusminus
+ control shiftl keycode 10 = Control_bracketright
+ shift control shiftl keycode 10 = Control_bracketright
+ altgr control shiftl keycode 10 = Control_bracketright
+ shift altgr control shiftl keycode 10 = Control_bracketright
+ alt shiftl keycode 10 = Meta_nine
+ shift alt shiftl keycode 10 = Meta_parenleft
+ altgr alt shiftl keycode 10 = Meta_bracketright
+ shift altgr alt shiftl keycode 10 = Meta_bracketright
+ control alt shiftl keycode 10 = Meta_Control_bracketright
+ shift control alt shiftl keycode 10 = Meta_Control_bracketright
+ altgr control alt shiftl keycode 10 = Meta_Control_bracketright
+ shift altgr control alt shiftl keycode 10 = Meta_Control_bracketright
+ shift shiftr keycode 10 = parenleft
+ altgr shiftr keycode 10 = bracketright
+ shift altgr shiftr keycode 10 = plusminus
+ control shiftr keycode 10 = Control_bracketright
+ shift control shiftr keycode 10 = Control_bracketright
+ altgr control shiftr keycode 10 = Control_bracketright
+ shift altgr control shiftr keycode 10 = Control_bracketright
+ alt shiftr keycode 10 = Meta_nine
+ shift alt shiftr keycode 10 = Meta_parenleft
+ altgr alt shiftr keycode 10 = Meta_bracketright
+ shift altgr alt shiftr keycode 10 = Meta_bracketright
+ control alt shiftr keycode 10 = Meta_Control_bracketright
+ shift control alt shiftr keycode 10 = Meta_Control_bracketright
+ altgr control alt shiftr keycode 10 = Meta_Control_bracketright
+ shift altgr control alt shiftr keycode 10 = Meta_Control_bracketright
+ shift shiftl shiftr keycode 10 = parenleft
+ altgr shiftl shiftr keycode 10 = bracketright
+ shift altgr shiftl shiftr keycode 10 = plusminus
+ control shiftl shiftr keycode 10 = Control_bracketright
+ shift control shiftl shiftr keycode 10 = Control_bracketright
+ altgr control shiftl shiftr keycode 10 = Control_bracketright
+ shift altgr control shiftl shiftr keycode 10 = Control_bracketright
+ alt shiftl shiftr keycode 10 = Meta_nine
+ shift alt shiftl shiftr keycode 10 = Meta_parenleft
+ altgr alt shiftl shiftr keycode 10 = Meta_bracketright
+ shift altgr alt shiftl shiftr keycode 10 = Meta_bracketright
+ control alt shiftl shiftr keycode 10 = Meta_Control_bracketright
+ shift control alt shiftl shiftr keycode 10 = Meta_Control_bracketright
+ altgr control alt shiftl shiftr keycode 10 = Meta_Control_bracketright
+ shift altgr control alt shiftl shiftr keycode 10 = Meta_Control_bracketright
+ shift ctrll keycode 10 = parenleft
+ altgr ctrll keycode 10 = bracketright
+ shift altgr ctrll keycode 10 = plusminus
+ control ctrll keycode 10 = Control_bracketright
+ shift control ctrll keycode 10 = Control_bracketright
+ altgr control ctrll keycode 10 = Control_bracketright
+ shift altgr control ctrll keycode 10 = Control_bracketright
+ alt ctrll keycode 10 = Meta_nine
+ shift alt ctrll keycode 10 = Meta_parenleft
+ altgr alt ctrll keycode 10 = Meta_bracketright
+ shift altgr alt ctrll keycode 10 = Meta_bracketright
+ control alt ctrll keycode 10 = Meta_Control_bracketright
+ shift control alt ctrll keycode 10 = Meta_Control_bracketright
+ altgr control alt ctrll keycode 10 = Meta_Control_bracketright
+ shift altgr control alt ctrll keycode 10 = Meta_Control_bracketright
+ shift shiftl ctrll keycode 10 = parenleft
+ altgr shiftl ctrll keycode 10 = bracketright
+ shift altgr shiftl ctrll keycode 10 = plusminus
+ control shiftl ctrll keycode 10 = Control_bracketright
+ shift control shiftl ctrll keycode 10 = Control_bracketright
+ altgr control shiftl ctrll keycode 10 = Control_bracketright
+ shift altgr control shiftl ctrll keycode 10 = Control_bracketright
+ alt shiftl ctrll keycode 10 = Meta_nine
+ shift alt shiftl ctrll keycode 10 = Meta_parenleft
+ altgr alt shiftl ctrll keycode 10 = Meta_bracketright
+ shift altgr alt shiftl ctrll keycode 10 = Meta_bracketright
+ control alt shiftl ctrll keycode 10 = Meta_Control_bracketright
+ shift control alt shiftl ctrll keycode 10 = Meta_Control_bracketright
+ altgr control alt shiftl ctrll keycode 10 = Meta_Control_bracketright
+ shift altgr control alt shiftl ctrll keycode 10 = Meta_Control_bracketright
+ shift shiftr ctrll keycode 10 = parenleft
+ altgr shiftr ctrll keycode 10 = bracketright
+ shift altgr shiftr ctrll keycode 10 = plusminus
+ control shiftr ctrll keycode 10 = Control_bracketright
+ shift control shiftr ctrll keycode 10 = Control_bracketright
+ altgr control shiftr ctrll keycode 10 = Control_bracketright
+ shift altgr control shiftr ctrll keycode 10 = Control_bracketright
+ alt shiftr ctrll keycode 10 = Meta_nine
+ shift alt shiftr ctrll keycode 10 = Meta_parenleft
+ altgr alt shiftr ctrll keycode 10 = Meta_bracketright
+ shift altgr alt shiftr ctrll keycode 10 = Meta_bracketright
+ control alt shiftr ctrll keycode 10 = Meta_Control_bracketright
+ shift control alt shiftr ctrll keycode 10 = Meta_Control_bracketright
+ altgr control alt shiftr ctrll keycode 10 = Meta_Control_bracketright
+ shift altgr control alt shiftr ctrll keycode 10 = Meta_Control_bracketright
+ shift shiftl shiftr ctrll keycode 10 = parenleft
+ altgr shiftl shiftr ctrll keycode 10 = bracketright
+ shift altgr shiftl shiftr ctrll keycode 10 = plusminus
+ control shiftl shiftr ctrll keycode 10 = Control_bracketright
+ shift control shiftl shiftr ctrll keycode 10 = Control_bracketright
+ altgr control shiftl shiftr ctrll keycode 10 = Control_bracketright
+ shift altgr control shiftl shiftr ctrll keycode 10 = Control_bracketright
+ alt shiftl shiftr ctrll keycode 10 = Meta_nine
+ shift alt shiftl shiftr ctrll keycode 10 = Meta_parenleft
+ altgr alt shiftl shiftr ctrll keycode 10 = Meta_bracketright
+ shift altgr alt shiftl shiftr ctrll keycode 10 = Meta_bracketright
+ control alt shiftl shiftr ctrll keycode 10 = Meta_Control_bracketright
+ shift control alt shiftl shiftr ctrll keycode 10 = Meta_Control_bracketright
+ altgr control alt shiftl shiftr ctrll keycode 10 = Meta_Control_bracketright
+ shift altgr control alt shiftl shiftr ctrll keycode 10 = Meta_Control_bracketright
+keycode 11 = zero parenright braceright degree
+ alt keycode 11 = Meta_zero
+ shift alt keycode 11 = Meta_parenright
+ altgr alt keycode 11 = Meta_braceright
+ shift altgr alt keycode 11 = Meta_braceright
+ shiftl keycode 11 = zero
+ shift shiftl keycode 11 = parenright
+ altgr shiftl keycode 11 = braceright
+ shift altgr shiftl keycode 11 = degree
+ alt shiftl keycode 11 = Meta_zero
+ shift alt shiftl keycode 11 = Meta_parenright
+ altgr alt shiftl keycode 11 = Meta_braceright
+ shift altgr alt shiftl keycode 11 = Meta_braceright
+ shiftr keycode 11 = zero
+ shift shiftr keycode 11 = parenright
+ altgr shiftr keycode 11 = braceright
+ shift altgr shiftr keycode 11 = degree
+ alt shiftr keycode 11 = Meta_zero
+ shift alt shiftr keycode 11 = Meta_parenright
+ altgr alt shiftr keycode 11 = Meta_braceright
+ shift altgr alt shiftr keycode 11 = Meta_braceright
+ shiftl shiftr keycode 11 = zero
+ shift shiftl shiftr keycode 11 = parenright
+ altgr shiftl shiftr keycode 11 = braceright
+ shift altgr shiftl shiftr keycode 11 = degree
+ alt shiftl shiftr keycode 11 = Meta_zero
+ shift alt shiftl shiftr keycode 11 = Meta_parenright
+ altgr alt shiftl shiftr keycode 11 = Meta_braceright
+ shift altgr alt shiftl shiftr keycode 11 = Meta_braceright
+ ctrll keycode 11 = zero
+ shift ctrll keycode 11 = parenright
+ altgr ctrll keycode 11 = braceright
+ shift altgr ctrll keycode 11 = degree
+ alt ctrll keycode 11 = Meta_zero
+ shift alt ctrll keycode 11 = Meta_parenright
+ altgr alt ctrll keycode 11 = Meta_braceright
+ shift altgr alt ctrll keycode 11 = Meta_braceright
+ shiftl ctrll keycode 11 = zero
+ shift shiftl ctrll keycode 11 = parenright
+ altgr shiftl ctrll keycode 11 = braceright
+ shift altgr shiftl ctrll keycode 11 = degree
+ alt shiftl ctrll keycode 11 = Meta_zero
+ shift alt shiftl ctrll keycode 11 = Meta_parenright
+ altgr alt shiftl ctrll keycode 11 = Meta_braceright
+ shift altgr alt shiftl ctrll keycode 11 = Meta_braceright
+ shiftr ctrll keycode 11 = zero
+ shift shiftr ctrll keycode 11 = parenright
+ altgr shiftr ctrll keycode 11 = braceright
+ shift altgr shiftr ctrll keycode 11 = degree
+ alt shiftr ctrll keycode 11 = Meta_zero
+ shift alt shiftr ctrll keycode 11 = Meta_parenright
+ altgr alt shiftr ctrll keycode 11 = Meta_braceright
+ shift altgr alt shiftr ctrll keycode 11 = Meta_braceright
+ shiftl shiftr ctrll keycode 11 = zero
+ shift shiftl shiftr ctrll keycode 11 = parenright
+ altgr shiftl shiftr ctrll keycode 11 = braceright
+ shift altgr shiftl shiftr ctrll keycode 11 = degree
+ alt shiftl shiftr ctrll keycode 11 = Meta_zero
+ shift alt shiftl shiftr ctrll keycode 11 = Meta_parenright
+ altgr alt shiftl shiftr ctrll keycode 11 = Meta_braceright
+ shift altgr alt shiftl shiftr ctrll keycode 11 = Meta_braceright
+keycode 12 = minus
+ shift keycode 12 = underscore
+ altgr keycode 12 = backslash
+ shift altgr keycode 12 = questiondown
+ control keycode 12 = Control_underscore
+ shift control keycode 12 = Control_underscore
+ altgr control keycode 12 = Control_backslash
+ shift altgr control keycode 12 = Control_backslash
+ alt keycode 12 = Meta_minus
+ shift alt keycode 12 = Meta_underscore
+ altgr alt keycode 12 = Meta_backslash
+ shift altgr alt keycode 12 = Meta_backslash
+ control alt keycode 12 = Meta_Control_underscore
+ shift control alt keycode 12 = Meta_Control_underscore
+ altgr control alt keycode 12 = Meta_Control_backslash
+ shift altgr control alt keycode 12 = Meta_Control_backslash
+ shift shiftl keycode 12 = underscore
+ altgr shiftl keycode 12 = backslash
+ shift altgr shiftl keycode 12 = questiondown
+ control shiftl keycode 12 = Control_underscore
+ shift control shiftl keycode 12 = Control_underscore
+ altgr control shiftl keycode 12 = Control_backslash
+ shift altgr control shiftl keycode 12 = Control_backslash
+ alt shiftl keycode 12 = Meta_minus
+ shift alt shiftl keycode 12 = Meta_underscore
+ altgr alt shiftl keycode 12 = Meta_backslash
+ shift altgr alt shiftl keycode 12 = Meta_backslash
+ control alt shiftl keycode 12 = Meta_Control_underscore
+ shift control alt shiftl keycode 12 = Meta_Control_underscore
+ altgr control alt shiftl keycode 12 = Meta_Control_backslash
+ shift altgr control alt shiftl keycode 12 = Meta_Control_backslash
+ shift shiftr keycode 12 = underscore
+ altgr shiftr keycode 12 = backslash
+ shift altgr shiftr keycode 12 = questiondown
+ control shiftr keycode 12 = Control_underscore
+ shift control shiftr keycode 12 = Control_underscore
+ altgr control shiftr keycode 12 = Control_backslash
+ shift altgr control shiftr keycode 12 = Control_backslash
+ alt shiftr keycode 12 = Meta_minus
+ shift alt shiftr keycode 12 = Meta_underscore
+ altgr alt shiftr keycode 12 = Meta_backslash
+ shift altgr alt shiftr keycode 12 = Meta_backslash
+ control alt shiftr keycode 12 = Meta_Control_underscore
+ shift control alt shiftr keycode 12 = Meta_Control_underscore
+ altgr control alt shiftr keycode 12 = Meta_Control_backslash
+ shift altgr control alt shiftr keycode 12 = Meta_Control_backslash
+ shift shiftl shiftr keycode 12 = underscore
+ altgr shiftl shiftr keycode 12 = backslash
+ shift altgr shiftl shiftr keycode 12 = questiondown
+ control shiftl shiftr keycode 12 = Control_underscore
+ shift control shiftl shiftr keycode 12 = Control_underscore
+ altgr control shiftl shiftr keycode 12 = Control_backslash
+ shift altgr control shiftl shiftr keycode 12 = Control_backslash
+ alt shiftl shiftr keycode 12 = Meta_minus
+ shift alt shiftl shiftr keycode 12 = Meta_underscore
+ altgr alt shiftl shiftr keycode 12 = Meta_backslash
+ shift altgr alt shiftl shiftr keycode 12 = Meta_backslash
+ control alt shiftl shiftr keycode 12 = Meta_Control_underscore
+ shift control alt shiftl shiftr keycode 12 = Meta_Control_underscore
+ altgr control alt shiftl shiftr keycode 12 = Meta_Control_backslash
+ shift altgr control alt shiftl shiftr keycode 12 = Meta_Control_backslash
+ shift ctrll keycode 12 = underscore
+ altgr ctrll keycode 12 = backslash
+ shift altgr ctrll keycode 12 = questiondown
+ control ctrll keycode 12 = Control_underscore
+ shift control ctrll keycode 12 = Control_underscore
+ altgr control ctrll keycode 12 = Control_backslash
+ shift altgr control ctrll keycode 12 = Control_backslash
+ alt ctrll keycode 12 = Meta_minus
+ shift alt ctrll keycode 12 = Meta_underscore
+ altgr alt ctrll keycode 12 = Meta_backslash
+ shift altgr alt ctrll keycode 12 = Meta_backslash
+ control alt ctrll keycode 12 = Meta_Control_underscore
+ shift control alt ctrll keycode 12 = Meta_Control_underscore
+ altgr control alt ctrll keycode 12 = Meta_Control_backslash
+ shift altgr control alt ctrll keycode 12 = Meta_Control_backslash
+ shift shiftl ctrll keycode 12 = underscore
+ altgr shiftl ctrll keycode 12 = backslash
+ shift altgr shiftl ctrll keycode 12 = questiondown
+ control shiftl ctrll keycode 12 = Control_underscore
+ shift control shiftl ctrll keycode 12 = Control_underscore
+ altgr control shiftl ctrll keycode 12 = Control_backslash
+ shift altgr control shiftl ctrll keycode 12 = Control_backslash
+ alt shiftl ctrll keycode 12 = Meta_minus
+ shift alt shiftl ctrll keycode 12 = Meta_underscore
+ altgr alt shiftl ctrll keycode 12 = Meta_backslash
+ shift altgr alt shiftl ctrll keycode 12 = Meta_backslash
+ control alt shiftl ctrll keycode 12 = Meta_Control_underscore
+ shift control alt shiftl ctrll keycode 12 = Meta_Control_underscore
+ altgr control alt shiftl ctrll keycode 12 = Meta_Control_backslash
+ shift altgr control alt shiftl ctrll keycode 12 = Meta_Control_backslash
+ shift shiftr ctrll keycode 12 = underscore
+ altgr shiftr ctrll keycode 12 = backslash
+ shift altgr shiftr ctrll keycode 12 = questiondown
+ control shiftr ctrll keycode 12 = Control_underscore
+ shift control shiftr ctrll keycode 12 = Control_underscore
+ altgr control shiftr ctrll keycode 12 = Control_backslash
+ shift altgr control shiftr ctrll keycode 12 = Control_backslash
+ alt shiftr ctrll keycode 12 = Meta_minus
+ shift alt shiftr ctrll keycode 12 = Meta_underscore
+ altgr alt shiftr ctrll keycode 12 = Meta_backslash
+ shift altgr alt shiftr ctrll keycode 12 = Meta_backslash
+ control alt shiftr ctrll keycode 12 = Meta_Control_underscore
+ shift control alt shiftr ctrll keycode 12 = Meta_Control_underscore
+ altgr control alt shiftr ctrll keycode 12 = Meta_Control_backslash
+ shift altgr control alt shiftr ctrll keycode 12 = Meta_Control_backslash
+ shift shiftl shiftr ctrll keycode 12 = underscore
+ altgr shiftl shiftr ctrll keycode 12 = backslash
+ shift altgr shiftl shiftr ctrll keycode 12 = questiondown
+ control shiftl shiftr ctrll keycode 12 = Control_underscore
+ shift control shiftl shiftr ctrll keycode 12 = Control_underscore
+ altgr control shiftl shiftr ctrll keycode 12 = Control_backslash
+ shift altgr control shiftl shiftr ctrll keycode 12 = Control_backslash
+ alt shiftl shiftr ctrll keycode 12 = Meta_minus
+ shift alt shiftl shiftr ctrll keycode 12 = Meta_underscore
+ altgr alt shiftl shiftr ctrll keycode 12 = Meta_backslash
+ shift altgr alt shiftl shiftr ctrll keycode 12 = Meta_backslash
+ control alt shiftl shiftr ctrll keycode 12 = Meta_Control_underscore
+ shift control alt shiftl shiftr ctrll keycode 12 = Meta_Control_underscore
+ altgr control alt shiftl shiftr ctrll keycode 12 = Meta_Control_backslash
+ shift altgr control alt shiftl shiftr ctrll keycode 12 = Meta_Control_backslash
+keycode 13 = equal
+ shift keycode 13 = plus
+ altgr keycode 13 = section
+ shift altgr keycode 13 = dead_cedilla
+ control keycode 13 = dead_cedilla
+ shift control keycode 13 = dead_cedilla
+ altgr control keycode 13 = dead_cedilla
+ shift altgr control keycode 13 = dead_cedilla
+ alt keycode 13 = Meta_equal
+ shift alt keycode 13 = Meta_plus
+ altgr alt keycode 13 = Meta_equal
+ shift altgr alt keycode 13 = dead_cedilla
+ control alt keycode 13 = dead_cedilla
+ shift control alt keycode 13 = dead_cedilla
+ altgr control alt keycode 13 = dead_cedilla
+ shift altgr control alt keycode 13 = dead_cedilla
+ shift shiftl keycode 13 = plus
+ altgr shiftl keycode 13 = section
+ shift altgr shiftl keycode 13 = dead_cedilla
+ control shiftl keycode 13 = dead_cedilla
+ shift control shiftl keycode 13 = dead_cedilla
+ altgr control shiftl keycode 13 = dead_cedilla
+ shift altgr control shiftl keycode 13 = dead_cedilla
+ alt shiftl keycode 13 = Meta_equal
+ shift alt shiftl keycode 13 = Meta_plus
+ altgr alt shiftl keycode 13 = Meta_equal
+ shift altgr alt shiftl keycode 13 = dead_cedilla
+ control alt shiftl keycode 13 = dead_cedilla
+ shift control alt shiftl keycode 13 = dead_cedilla
+ altgr control alt shiftl keycode 13 = dead_cedilla
+ shift altgr control alt shiftl keycode 13 = dead_cedilla
+ shift shiftr keycode 13 = plus
+ altgr shiftr keycode 13 = section
+ shift altgr shiftr keycode 13 = dead_cedilla
+ control shiftr keycode 13 = dead_cedilla
+ shift control shiftr keycode 13 = dead_cedilla
+ altgr control shiftr keycode 13 = dead_cedilla
+ shift altgr control shiftr keycode 13 = dead_cedilla
+ alt shiftr keycode 13 = Meta_equal
+ shift alt shiftr keycode 13 = Meta_plus
+ altgr alt shiftr keycode 13 = Meta_equal
+ shift altgr alt shiftr keycode 13 = dead_cedilla
+ control alt shiftr keycode 13 = dead_cedilla
+ shift control alt shiftr keycode 13 = dead_cedilla
+ altgr control alt shiftr keycode 13 = dead_cedilla
+ shift altgr control alt shiftr keycode 13 = dead_cedilla
+ shift shiftl shiftr keycode 13 = plus
+ altgr shiftl shiftr keycode 13 = section
+ shift altgr shiftl shiftr keycode 13 = dead_cedilla
+ control shiftl shiftr keycode 13 = dead_cedilla
+ shift control shiftl shiftr keycode 13 = dead_cedilla
+ altgr control shiftl shiftr keycode 13 = dead_cedilla
+ shift altgr control shiftl shiftr keycode 13 = dead_cedilla
+ alt shiftl shiftr keycode 13 = Meta_equal
+ shift alt shiftl shiftr keycode 13 = Meta_plus
+ altgr alt shiftl shiftr keycode 13 = Meta_equal
+ shift altgr alt shiftl shiftr keycode 13 = dead_cedilla
+ control alt shiftl shiftr keycode 13 = dead_cedilla
+ shift control alt shiftl shiftr keycode 13 = dead_cedilla
+ altgr control alt shiftl shiftr keycode 13 = dead_cedilla
+ shift altgr control alt shiftl shiftr keycode 13 = dead_cedilla
+ shift ctrll keycode 13 = plus
+ altgr ctrll keycode 13 = section
+ shift altgr ctrll keycode 13 = dead_cedilla
+ control ctrll keycode 13 = dead_cedilla
+ shift control ctrll keycode 13 = dead_cedilla
+ altgr control ctrll keycode 13 = dead_cedilla
+ shift altgr control ctrll keycode 13 = dead_cedilla
+ alt ctrll keycode 13 = Meta_equal
+ shift alt ctrll keycode 13 = Meta_plus
+ altgr alt ctrll keycode 13 = Meta_equal
+ shift altgr alt ctrll keycode 13 = dead_cedilla
+ control alt ctrll keycode 13 = dead_cedilla
+ shift control alt ctrll keycode 13 = dead_cedilla
+ altgr control alt ctrll keycode 13 = dead_cedilla
+ shift altgr control alt ctrll keycode 13 = dead_cedilla
+ shift shiftl ctrll keycode 13 = plus
+ altgr shiftl ctrll keycode 13 = section
+ shift altgr shiftl ctrll keycode 13 = dead_cedilla
+ control shiftl ctrll keycode 13 = dead_cedilla
+ shift control shiftl ctrll keycode 13 = dead_cedilla
+ altgr control shiftl ctrll keycode 13 = dead_cedilla
+ shift altgr control shiftl ctrll keycode 13 = dead_cedilla
+ alt shiftl ctrll keycode 13 = Meta_equal
+ shift alt shiftl ctrll keycode 13 = Meta_plus
+ altgr alt shiftl ctrll keycode 13 = Meta_equal
+ shift altgr alt shiftl ctrll keycode 13 = dead_cedilla
+ control alt shiftl ctrll keycode 13 = dead_cedilla
+ shift control alt shiftl ctrll keycode 13 = dead_cedilla
+ altgr control alt shiftl ctrll keycode 13 = dead_cedilla
+ shift altgr control alt shiftl ctrll keycode 13 = dead_cedilla
+ shift shiftr ctrll keycode 13 = plus
+ altgr shiftr ctrll keycode 13 = section
+ shift altgr shiftr ctrll keycode 13 = dead_cedilla
+ control shiftr ctrll keycode 13 = dead_cedilla
+ shift control shiftr ctrll keycode 13 = dead_cedilla
+ altgr control shiftr ctrll keycode 13 = dead_cedilla
+ shift altgr control shiftr ctrll keycode 13 = dead_cedilla
+ alt shiftr ctrll keycode 13 = Meta_equal
+ shift alt shiftr ctrll keycode 13 = Meta_plus
+ altgr alt shiftr ctrll keycode 13 = Meta_equal
+ shift altgr alt shiftr ctrll keycode 13 = dead_cedilla
+ control alt shiftr ctrll keycode 13 = dead_cedilla
+ shift control alt shiftr ctrll keycode 13 = dead_cedilla
+ altgr control alt shiftr ctrll keycode 13 = dead_cedilla
+ shift altgr control alt shiftr ctrll keycode 13 = dead_cedilla
+ shift shiftl shiftr ctrll keycode 13 = plus
+ altgr shiftl shiftr ctrll keycode 13 = section
+ shift altgr shiftl shiftr ctrll keycode 13 = dead_cedilla
+ control shiftl shiftr ctrll keycode 13 = dead_cedilla
+ shift control shiftl shiftr ctrll keycode 13 = dead_cedilla
+ altgr control shiftl shiftr ctrll keycode 13 = dead_cedilla
+ shift altgr control shiftl shiftr ctrll keycode 13 = dead_cedilla
+ alt shiftl shiftr ctrll keycode 13 = Meta_equal
+ shift alt shiftl shiftr ctrll keycode 13 = Meta_plus
+ altgr alt shiftl shiftr ctrll keycode 13 = Meta_equal
+ shift altgr alt shiftl shiftr ctrll keycode 13 = dead_cedilla
+ control alt shiftl shiftr ctrll keycode 13 = dead_cedilla
+ shift control alt shiftl shiftr ctrll keycode 13 = dead_cedilla
+ altgr control alt shiftl shiftr ctrll keycode 13 = dead_cedilla
+ shift altgr control alt shiftl shiftr ctrll keycode 13 = dead_cedilla
+keycode 14 = Delete
+ control keycode 14 = BackSpace
+ shift control keycode 14 = BackSpace
+ altgr control keycode 14 = BackSpace
+ shift altgr control keycode 14 = BackSpace
+ alt keycode 14 = Meta_Delete
+ shift alt keycode 14 = Meta_Delete
+ altgr alt keycode 14 = Meta_Delete
+ shift altgr alt keycode 14 = Meta_Delete
+ control alt keycode 14 = Meta_BackSpace
+ shift control alt keycode 14 = Meta_BackSpace
+ altgr control alt keycode 14 = Meta_BackSpace
+ shift altgr control alt keycode 14 = Meta_BackSpace
+ control shiftl keycode 14 = BackSpace
+ shift control shiftl keycode 14 = BackSpace
+ altgr control shiftl keycode 14 = BackSpace
+ shift altgr control shiftl keycode 14 = BackSpace
+ alt shiftl keycode 14 = Meta_Delete
+ shift alt shiftl keycode 14 = Meta_Delete
+ altgr alt shiftl keycode 14 = Meta_Delete
+ shift altgr alt shiftl keycode 14 = Meta_Delete
+ control alt shiftl keycode 14 = Meta_BackSpace
+ shift control alt shiftl keycode 14 = Meta_BackSpace
+ altgr control alt shiftl keycode 14 = Meta_BackSpace
+ shift altgr control alt shiftl keycode 14 = Meta_BackSpace
+ control shiftr keycode 14 = BackSpace
+ shift control shiftr keycode 14 = BackSpace
+ altgr control shiftr keycode 14 = BackSpace
+ shift altgr control shiftr keycode 14 = BackSpace
+ alt shiftr keycode 14 = Meta_Delete
+ shift alt shiftr keycode 14 = Meta_Delete
+ altgr alt shiftr keycode 14 = Meta_Delete
+ shift altgr alt shiftr keycode 14 = Meta_Delete
+ control alt shiftr keycode 14 = Meta_BackSpace
+ shift control alt shiftr keycode 14 = Meta_BackSpace
+ altgr control alt shiftr keycode 14 = Meta_BackSpace
+ shift altgr control alt shiftr keycode 14 = Meta_BackSpace
+ control shiftl shiftr keycode 14 = BackSpace
+ shift control shiftl shiftr keycode 14 = BackSpace
+ altgr control shiftl shiftr keycode 14 = BackSpace
+ shift altgr control shiftl shiftr keycode 14 = BackSpace
+ alt shiftl shiftr keycode 14 = Meta_Delete
+ shift alt shiftl shiftr keycode 14 = Meta_Delete
+ altgr alt shiftl shiftr keycode 14 = Meta_Delete
+ shift altgr alt shiftl shiftr keycode 14 = Meta_Delete
+ control alt shiftl shiftr keycode 14 = Meta_BackSpace
+ shift control alt shiftl shiftr keycode 14 = Meta_BackSpace
+ altgr control alt shiftl shiftr keycode 14 = Meta_BackSpace
+ shift altgr control alt shiftl shiftr keycode 14 = Meta_BackSpace
+ control ctrll keycode 14 = BackSpace
+ shift control ctrll keycode 14 = BackSpace
+ altgr control ctrll keycode 14 = BackSpace
+ shift altgr control ctrll keycode 14 = BackSpace
+ alt ctrll keycode 14 = Meta_Delete
+ shift alt ctrll keycode 14 = Meta_Delete
+ altgr alt ctrll keycode 14 = Meta_Delete
+ shift altgr alt ctrll keycode 14 = Meta_Delete
+ control alt ctrll keycode 14 = Meta_BackSpace
+ shift control alt ctrll keycode 14 = Meta_BackSpace
+ altgr control alt ctrll keycode 14 = Meta_BackSpace
+ shift altgr control alt ctrll keycode 14 = Meta_BackSpace
+ control shiftl ctrll keycode 14 = BackSpace
+ shift control shiftl ctrll keycode 14 = BackSpace
+ altgr control shiftl ctrll keycode 14 = BackSpace
+ shift altgr control shiftl ctrll keycode 14 = BackSpace
+ alt shiftl ctrll keycode 14 = Meta_Delete
+ shift alt shiftl ctrll keycode 14 = Meta_Delete
+ altgr alt shiftl ctrll keycode 14 = Meta_Delete
+ shift altgr alt shiftl ctrll keycode 14 = Meta_Delete
+ control alt shiftl ctrll keycode 14 = Meta_BackSpace
+ shift control alt shiftl ctrll keycode 14 = Meta_BackSpace
+ altgr control alt shiftl ctrll keycode 14 = Meta_BackSpace
+ shift altgr control alt shiftl ctrll keycode 14 = Meta_BackSpace
+ control shiftr ctrll keycode 14 = BackSpace
+ shift control shiftr ctrll keycode 14 = BackSpace
+ altgr control shiftr ctrll keycode 14 = BackSpace
+ shift altgr control shiftr ctrll keycode 14 = BackSpace
+ alt shiftr ctrll keycode 14 = Meta_Delete
+ shift alt shiftr ctrll keycode 14 = Meta_Delete
+ altgr alt shiftr ctrll keycode 14 = Meta_Delete
+ shift altgr alt shiftr ctrll keycode 14 = Meta_Delete
+ control alt shiftr ctrll keycode 14 = Meta_BackSpace
+ shift control alt shiftr ctrll keycode 14 = Meta_BackSpace
+ altgr control alt shiftr ctrll keycode 14 = Meta_BackSpace
+ shift altgr control alt shiftr ctrll keycode 14 = Meta_BackSpace
+ control shiftl shiftr ctrll keycode 14 = BackSpace
+ shift control shiftl shiftr ctrll keycode 14 = BackSpace
+ altgr control shiftl shiftr ctrll keycode 14 = BackSpace
+ shift altgr control shiftl shiftr ctrll keycode 14 = BackSpace
+ alt shiftl shiftr ctrll keycode 14 = Meta_Delete
+ shift alt shiftl shiftr ctrll keycode 14 = Meta_Delete
+ altgr alt shiftl shiftr ctrll keycode 14 = Meta_Delete
+ shift altgr alt shiftl shiftr ctrll keycode 14 = Meta_Delete
+ control alt shiftl shiftr ctrll keycode 14 = Meta_BackSpace
+ shift control alt shiftl shiftr ctrll keycode 14 = Meta_BackSpace
+ altgr control alt shiftl shiftr ctrll keycode 14 = Meta_BackSpace
+ shift altgr control alt shiftl shiftr ctrll keycode 14 = Meta_BackSpace
+keycode 15 = Tab
+ alt keycode 15 = Meta_Tab
+ shift alt keycode 15 = Meta_Tab
+ altgr alt keycode 15 = Meta_Tab
+ shift altgr alt keycode 15 = Meta_Tab
+ control alt keycode 15 = Meta_Tab
+ shift control alt keycode 15 = Meta_Tab
+ altgr control alt keycode 15 = Meta_Tab
+ shift altgr control alt keycode 15 = Meta_Tab
+ alt shiftl keycode 15 = Meta_Tab
+ shift alt shiftl keycode 15 = Meta_Tab
+ altgr alt shiftl keycode 15 = Meta_Tab
+ shift altgr alt shiftl keycode 15 = Meta_Tab
+ control alt shiftl keycode 15 = Meta_Tab
+ shift control alt shiftl keycode 15 = Meta_Tab
+ altgr control alt shiftl keycode 15 = Meta_Tab
+ shift altgr control alt shiftl keycode 15 = Meta_Tab
+ alt shiftr keycode 15 = Meta_Tab
+ shift alt shiftr keycode 15 = Meta_Tab
+ altgr alt shiftr keycode 15 = Meta_Tab
+ shift altgr alt shiftr keycode 15 = Meta_Tab
+ control alt shiftr keycode 15 = Meta_Tab
+ shift control alt shiftr keycode 15 = Meta_Tab
+ altgr control alt shiftr keycode 15 = Meta_Tab
+ shift altgr control alt shiftr keycode 15 = Meta_Tab
+ alt shiftl shiftr keycode 15 = Meta_Tab
+ shift alt shiftl shiftr keycode 15 = Meta_Tab
+ altgr alt shiftl shiftr keycode 15 = Meta_Tab
+ shift altgr alt shiftl shiftr keycode 15 = Meta_Tab
+ control alt shiftl shiftr keycode 15 = Meta_Tab
+ shift control alt shiftl shiftr keycode 15 = Meta_Tab
+ altgr control alt shiftl shiftr keycode 15 = Meta_Tab
+ shift altgr control alt shiftl shiftr keycode 15 = Meta_Tab
+ alt ctrll keycode 15 = Meta_Tab
+ shift alt ctrll keycode 15 = Meta_Tab
+ altgr alt ctrll keycode 15 = Meta_Tab
+ shift altgr alt ctrll keycode 15 = Meta_Tab
+ control alt ctrll keycode 15 = Meta_Tab
+ shift control alt ctrll keycode 15 = Meta_Tab
+ altgr control alt ctrll keycode 15 = Meta_Tab
+ shift altgr control alt ctrll keycode 15 = Meta_Tab
+ alt shiftl ctrll keycode 15 = Meta_Tab
+ shift alt shiftl ctrll keycode 15 = Meta_Tab
+ altgr alt shiftl ctrll keycode 15 = Meta_Tab
+ shift altgr alt shiftl ctrll keycode 15 = Meta_Tab
+ control alt shiftl ctrll keycode 15 = Meta_Tab
+ shift control alt shiftl ctrll keycode 15 = Meta_Tab
+ altgr control alt shiftl ctrll keycode 15 = Meta_Tab
+ shift altgr control alt shiftl ctrll keycode 15 = Meta_Tab
+ alt shiftr ctrll keycode 15 = Meta_Tab
+ shift alt shiftr ctrll keycode 15 = Meta_Tab
+ altgr alt shiftr ctrll keycode 15 = Meta_Tab
+ shift altgr alt shiftr ctrll keycode 15 = Meta_Tab
+ control alt shiftr ctrll keycode 15 = Meta_Tab
+ shift control alt shiftr ctrll keycode 15 = Meta_Tab
+ altgr control alt shiftr ctrll keycode 15 = Meta_Tab
+ shift altgr control alt shiftr ctrll keycode 15 = Meta_Tab
+ alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ shift alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ altgr alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ shift altgr alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ control alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ shift control alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ altgr control alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ shift altgr control alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+keycode 16 = +q
+ shift keycode 16 = +Q
+ altgr keycode 16 = slash
+ shift altgr keycode 16 = slash
+ control keycode 16 = Control_q
+ shift control keycode 16 = Control_q
+ altgr control keycode 16 = Control_q
+ shift altgr control keycode 16 = Control_q
+ alt keycode 16 = Meta_q
+ shift alt keycode 16 = Meta_Q
+ altgr alt keycode 16 = Meta_slash
+ shift altgr alt keycode 16 = Meta_slash
+ control alt keycode 16 = Meta_Control_q
+ shift control alt keycode 16 = Meta_Control_q
+ altgr control alt keycode 16 = Meta_Control_q
+ shift altgr control alt keycode 16 = Meta_Control_q
+ shift shiftl keycode 16 = +Q
+ altgr shiftl keycode 16 = slash
+ shift altgr shiftl keycode 16 = slash
+ control shiftl keycode 16 = Control_q
+ shift control shiftl keycode 16 = Control_q
+ altgr control shiftl keycode 16 = Control_q
+ shift altgr control shiftl keycode 16 = Control_q
+ alt shiftl keycode 16 = Meta_q
+ shift alt shiftl keycode 16 = Meta_Q
+ altgr alt shiftl keycode 16 = Meta_slash
+ shift altgr alt shiftl keycode 16 = Meta_slash
+ control alt shiftl keycode 16 = Meta_Control_q
+ shift control alt shiftl keycode 16 = Meta_Control_q
+ altgr control alt shiftl keycode 16 = Meta_Control_q
+ shift altgr control alt shiftl keycode 16 = Meta_Control_q
+ shift shiftr keycode 16 = +Q
+ altgr shiftr keycode 16 = slash
+ shift altgr shiftr keycode 16 = slash
+ control shiftr keycode 16 = Control_q
+ shift control shiftr keycode 16 = Control_q
+ altgr control shiftr keycode 16 = Control_q
+ shift altgr control shiftr keycode 16 = Control_q
+ alt shiftr keycode 16 = Meta_q
+ shift alt shiftr keycode 16 = Meta_Q
+ altgr alt shiftr keycode 16 = Meta_slash
+ shift altgr alt shiftr keycode 16 = Meta_slash
+ control alt shiftr keycode 16 = Meta_Control_q
+ shift control alt shiftr keycode 16 = Meta_Control_q
+ altgr control alt shiftr keycode 16 = Meta_Control_q
+ shift altgr control alt shiftr keycode 16 = Meta_Control_q
+ shift shiftl shiftr keycode 16 = +Q
+ altgr shiftl shiftr keycode 16 = slash
+ shift altgr shiftl shiftr keycode 16 = slash
+ control shiftl shiftr keycode 16 = Control_q
+ shift control shiftl shiftr keycode 16 = Control_q
+ altgr control shiftl shiftr keycode 16 = Control_q
+ shift altgr control shiftl shiftr keycode 16 = Control_q
+ alt shiftl shiftr keycode 16 = Meta_q
+ shift alt shiftl shiftr keycode 16 = Meta_Q
+ altgr alt shiftl shiftr keycode 16 = Meta_slash
+ shift altgr alt shiftl shiftr keycode 16 = Meta_slash
+ control alt shiftl shiftr keycode 16 = Meta_Control_q
+ shift control alt shiftl shiftr keycode 16 = Meta_Control_q
+ altgr control alt shiftl shiftr keycode 16 = Meta_Control_q
+ shift altgr control alt shiftl shiftr keycode 16 = Meta_Control_q
+ ctrll keycode 16 = +Q
+ altgr ctrll keycode 16 = slash
+ shift altgr ctrll keycode 16 = slash
+ control ctrll keycode 16 = Control_q
+ shift control ctrll keycode 16 = Control_q
+ altgr control ctrll keycode 16 = Control_q
+ shift altgr control ctrll keycode 16 = Control_q
+ alt ctrll keycode 16 = Meta_q
+ shift alt ctrll keycode 16 = Meta_Q
+ altgr alt ctrll keycode 16 = Meta_slash
+ shift altgr alt ctrll keycode 16 = Meta_slash
+ control alt ctrll keycode 16 = Meta_Control_q
+ shift control alt ctrll keycode 16 = Meta_Control_q
+ altgr control alt ctrll keycode 16 = Meta_Control_q
+ shift altgr control alt ctrll keycode 16 = Meta_Control_q
+ shiftl ctrll keycode 16 = +Q
+ altgr shiftl ctrll keycode 16 = slash
+ shift altgr shiftl ctrll keycode 16 = slash
+ control shiftl ctrll keycode 16 = Control_q
+ shift control shiftl ctrll keycode 16 = Control_q
+ altgr control shiftl ctrll keycode 16 = Control_q
+ shift altgr control shiftl ctrll keycode 16 = Control_q
+ alt shiftl ctrll keycode 16 = Meta_q
+ shift alt shiftl ctrll keycode 16 = Meta_Q
+ altgr alt shiftl ctrll keycode 16 = Meta_slash
+ shift altgr alt shiftl ctrll keycode 16 = Meta_slash
+ control alt shiftl ctrll keycode 16 = Meta_Control_q
+ shift control alt shiftl ctrll keycode 16 = Meta_Control_q
+ altgr control alt shiftl ctrll keycode 16 = Meta_Control_q
+ shift altgr control alt shiftl ctrll keycode 16 = Meta_Control_q
+ shiftr ctrll keycode 16 = +Q
+ altgr shiftr ctrll keycode 16 = slash
+ shift altgr shiftr ctrll keycode 16 = slash
+ control shiftr ctrll keycode 16 = Control_q
+ shift control shiftr ctrll keycode 16 = Control_q
+ altgr control shiftr ctrll keycode 16 = Control_q
+ shift altgr control shiftr ctrll keycode 16 = Control_q
+ alt shiftr ctrll keycode 16 = Meta_q
+ shift alt shiftr ctrll keycode 16 = Meta_Q
+ altgr alt shiftr ctrll keycode 16 = Meta_slash
+ shift altgr alt shiftr ctrll keycode 16 = Meta_slash
+ control alt shiftr ctrll keycode 16 = Meta_Control_q
+ shift control alt shiftr ctrll keycode 16 = Meta_Control_q
+ altgr control alt shiftr ctrll keycode 16 = Meta_Control_q
+ shift altgr control alt shiftr ctrll keycode 16 = Meta_Control_q
+ shiftl shiftr ctrll keycode 16 = +Q
+ altgr shiftl shiftr ctrll keycode 16 = slash
+ shift altgr shiftl shiftr ctrll keycode 16 = slash
+ control shiftl shiftr ctrll keycode 16 = Control_q
+ shift control shiftl shiftr ctrll keycode 16 = Control_q
+ altgr control shiftl shiftr ctrll keycode 16 = Control_q
+ shift altgr control shiftl shiftr ctrll keycode 16 = Control_q
+ alt shiftl shiftr ctrll keycode 16 = Meta_q
+ shift alt shiftl shiftr ctrll keycode 16 = Meta_Q
+ altgr alt shiftl shiftr ctrll keycode 16 = Meta_slash
+ shift altgr alt shiftl shiftr ctrll keycode 16 = Meta_slash
+ control alt shiftl shiftr ctrll keycode 16 = Meta_Control_q
+ shift control alt shiftl shiftr ctrll keycode 16 = Meta_Control_q
+ altgr control alt shiftl shiftr ctrll keycode 16 = Meta_Control_q
+ shift altgr control alt shiftl shiftr ctrll keycode 16 = Meta_Control_q
+keycode 17 = +w
+ shift keycode 17 = +W
+ altgr keycode 17 = question
+ shift altgr keycode 17 = question
+ control keycode 17 = Control_w
+ shift control keycode 17 = Control_w
+ altgr control keycode 17 = Delete
+ shift altgr control keycode 17 = Delete
+ alt keycode 17 = Meta_w
+ shift alt keycode 17 = Meta_W
+ altgr alt keycode 17 = Meta_question
+ shift altgr alt keycode 17 = Meta_question
+ control alt keycode 17 = Meta_Control_w
+ shift control alt keycode 17 = Meta_Control_w
+ altgr control alt keycode 17 = Meta_Delete
+ shift altgr control alt keycode 17 = Meta_Delete
+ shift shiftl keycode 17 = +W
+ altgr shiftl keycode 17 = question
+ shift altgr shiftl keycode 17 = question
+ control shiftl keycode 17 = Control_w
+ shift control shiftl keycode 17 = Control_w
+ altgr control shiftl keycode 17 = Delete
+ shift altgr control shiftl keycode 17 = Delete
+ alt shiftl keycode 17 = Meta_w
+ shift alt shiftl keycode 17 = Meta_W
+ altgr alt shiftl keycode 17 = Meta_question
+ shift altgr alt shiftl keycode 17 = Meta_question
+ control alt shiftl keycode 17 = Meta_Control_w
+ shift control alt shiftl keycode 17 = Meta_Control_w
+ altgr control alt shiftl keycode 17 = Meta_Delete
+ shift altgr control alt shiftl keycode 17 = Meta_Delete
+ shift shiftr keycode 17 = +W
+ altgr shiftr keycode 17 = question
+ shift altgr shiftr keycode 17 = question
+ control shiftr keycode 17 = Control_w
+ shift control shiftr keycode 17 = Control_w
+ altgr control shiftr keycode 17 = Delete
+ shift altgr control shiftr keycode 17 = Delete
+ alt shiftr keycode 17 = Meta_w
+ shift alt shiftr keycode 17 = Meta_W
+ altgr alt shiftr keycode 17 = Meta_question
+ shift altgr alt shiftr keycode 17 = Meta_question
+ control alt shiftr keycode 17 = Meta_Control_w
+ shift control alt shiftr keycode 17 = Meta_Control_w
+ altgr control alt shiftr keycode 17 = Meta_Delete
+ shift altgr control alt shiftr keycode 17 = Meta_Delete
+ shift shiftl shiftr keycode 17 = +W
+ altgr shiftl shiftr keycode 17 = question
+ shift altgr shiftl shiftr keycode 17 = question
+ control shiftl shiftr keycode 17 = Control_w
+ shift control shiftl shiftr keycode 17 = Control_w
+ altgr control shiftl shiftr keycode 17 = Delete
+ shift altgr control shiftl shiftr keycode 17 = Delete
+ alt shiftl shiftr keycode 17 = Meta_w
+ shift alt shiftl shiftr keycode 17 = Meta_W
+ altgr alt shiftl shiftr keycode 17 = Meta_question
+ shift altgr alt shiftl shiftr keycode 17 = Meta_question
+ control alt shiftl shiftr keycode 17 = Meta_Control_w
+ shift control alt shiftl shiftr keycode 17 = Meta_Control_w
+ altgr control alt shiftl shiftr keycode 17 = Meta_Delete
+ shift altgr control alt shiftl shiftr keycode 17 = Meta_Delete
+ ctrll keycode 17 = +W
+ altgr ctrll keycode 17 = question
+ shift altgr ctrll keycode 17 = question
+ control ctrll keycode 17 = Control_w
+ shift control ctrll keycode 17 = Control_w
+ altgr control ctrll keycode 17 = Delete
+ shift altgr control ctrll keycode 17 = Delete
+ alt ctrll keycode 17 = Meta_w
+ shift alt ctrll keycode 17 = Meta_W
+ altgr alt ctrll keycode 17 = Meta_question
+ shift altgr alt ctrll keycode 17 = Meta_question
+ control alt ctrll keycode 17 = Meta_Control_w
+ shift control alt ctrll keycode 17 = Meta_Control_w
+ altgr control alt ctrll keycode 17 = Meta_Delete
+ shift altgr control alt ctrll keycode 17 = Meta_Delete
+ shiftl ctrll keycode 17 = +W
+ altgr shiftl ctrll keycode 17 = question
+ shift altgr shiftl ctrll keycode 17 = question
+ control shiftl ctrll keycode 17 = Control_w
+ shift control shiftl ctrll keycode 17 = Control_w
+ altgr control shiftl ctrll keycode 17 = Delete
+ shift altgr control shiftl ctrll keycode 17 = Delete
+ alt shiftl ctrll keycode 17 = Meta_w
+ shift alt shiftl ctrll keycode 17 = Meta_W
+ altgr alt shiftl ctrll keycode 17 = Meta_question
+ shift altgr alt shiftl ctrll keycode 17 = Meta_question
+ control alt shiftl ctrll keycode 17 = Meta_Control_w
+ shift control alt shiftl ctrll keycode 17 = Meta_Control_w
+ altgr control alt shiftl ctrll keycode 17 = Meta_Delete
+ shift altgr control alt shiftl ctrll keycode 17 = Meta_Delete
+ shiftr ctrll keycode 17 = +W
+ altgr shiftr ctrll keycode 17 = question
+ shift altgr shiftr ctrll keycode 17 = question
+ control shiftr ctrll keycode 17 = Control_w
+ shift control shiftr ctrll keycode 17 = Control_w
+ altgr control shiftr ctrll keycode 17 = Delete
+ shift altgr control shiftr ctrll keycode 17 = Delete
+ alt shiftr ctrll keycode 17 = Meta_w
+ shift alt shiftr ctrll keycode 17 = Meta_W
+ altgr alt shiftr ctrll keycode 17 = Meta_question
+ shift altgr alt shiftr ctrll keycode 17 = Meta_question
+ control alt shiftr ctrll keycode 17 = Meta_Control_w
+ shift control alt shiftr ctrll keycode 17 = Meta_Control_w
+ altgr control alt shiftr ctrll keycode 17 = Meta_Delete
+ shift altgr control alt shiftr ctrll keycode 17 = Meta_Delete
+ shiftl shiftr ctrll keycode 17 = +W
+ altgr shiftl shiftr ctrll keycode 17 = question
+ shift altgr shiftl shiftr ctrll keycode 17 = question
+ control shiftl shiftr ctrll keycode 17 = Control_w
+ shift control shiftl shiftr ctrll keycode 17 = Control_w
+ altgr control shiftl shiftr ctrll keycode 17 = Delete
+ shift altgr control shiftl shiftr ctrll keycode 17 = Delete
+ alt shiftl shiftr ctrll keycode 17 = Meta_w
+ shift alt shiftl shiftr ctrll keycode 17 = Meta_W
+ altgr alt shiftl shiftr ctrll keycode 17 = Meta_question
+ shift altgr alt shiftl shiftr ctrll keycode 17 = Meta_question
+ control alt shiftl shiftr ctrll keycode 17 = Meta_Control_w
+ shift control alt shiftl shiftr ctrll keycode 17 = Meta_Control_w
+ altgr control alt shiftl shiftr ctrll keycode 17 = Meta_Delete
+ shift altgr control alt shiftl shiftr ctrll keycode 17 = Meta_Delete
+keycode 18 = +e
+ shift keycode 18 = +E
+ altgr keycode 18 = euro
+ shift altgr keycode 18 = euro
+ control keycode 18 = Control_e
+ shift control keycode 18 = Control_e
+ altgr control keycode 18 = Control_e
+ shift altgr control keycode 18 = Control_e
+ alt keycode 18 = Meta_e
+ shift alt keycode 18 = Meta_E
+ altgr alt keycode 18 = Meta_e
+ shift altgr alt keycode 18 = Meta_E
+ control alt keycode 18 = Meta_Control_e
+ shift control alt keycode 18 = Meta_Control_e
+ altgr control alt keycode 18 = Meta_Control_e
+ shift altgr control alt keycode 18 = Meta_Control_e
+ shift shiftl keycode 18 = +E
+ altgr shiftl keycode 18 = euro
+ shift altgr shiftl keycode 18 = euro
+ control shiftl keycode 18 = Control_e
+ shift control shiftl keycode 18 = Control_e
+ altgr control shiftl keycode 18 = Control_e
+ shift altgr control shiftl keycode 18 = Control_e
+ alt shiftl keycode 18 = Meta_e
+ shift alt shiftl keycode 18 = Meta_E
+ altgr alt shiftl keycode 18 = Meta_e
+ shift altgr alt shiftl keycode 18 = Meta_E
+ control alt shiftl keycode 18 = Meta_Control_e
+ shift control alt shiftl keycode 18 = Meta_Control_e
+ altgr control alt shiftl keycode 18 = Meta_Control_e
+ shift altgr control alt shiftl keycode 18 = Meta_Control_e
+ shift shiftr keycode 18 = +E
+ altgr shiftr keycode 18 = euro
+ shift altgr shiftr keycode 18 = euro
+ control shiftr keycode 18 = Control_e
+ shift control shiftr keycode 18 = Control_e
+ altgr control shiftr keycode 18 = Control_e
+ shift altgr control shiftr keycode 18 = Control_e
+ alt shiftr keycode 18 = Meta_e
+ shift alt shiftr keycode 18 = Meta_E
+ altgr alt shiftr keycode 18 = Meta_e
+ shift altgr alt shiftr keycode 18 = Meta_E
+ control alt shiftr keycode 18 = Meta_Control_e
+ shift control alt shiftr keycode 18 = Meta_Control_e
+ altgr control alt shiftr keycode 18 = Meta_Control_e
+ shift altgr control alt shiftr keycode 18 = Meta_Control_e
+ shift shiftl shiftr keycode 18 = +E
+ altgr shiftl shiftr keycode 18 = euro
+ shift altgr shiftl shiftr keycode 18 = euro
+ control shiftl shiftr keycode 18 = Control_e
+ shift control shiftl shiftr keycode 18 = Control_e
+ altgr control shiftl shiftr keycode 18 = Control_e
+ shift altgr control shiftl shiftr keycode 18 = Control_e
+ alt shiftl shiftr keycode 18 = Meta_e
+ shift alt shiftl shiftr keycode 18 = Meta_E
+ altgr alt shiftl shiftr keycode 18 = Meta_e
+ shift altgr alt shiftl shiftr keycode 18 = Meta_E
+ control alt shiftl shiftr keycode 18 = Meta_Control_e
+ shift control alt shiftl shiftr keycode 18 = Meta_Control_e
+ altgr control alt shiftl shiftr keycode 18 = Meta_Control_e
+ shift altgr control alt shiftl shiftr keycode 18 = Meta_Control_e
+ ctrll keycode 18 = +E
+ altgr ctrll keycode 18 = euro
+ shift altgr ctrll keycode 18 = euro
+ control ctrll keycode 18 = Control_e
+ shift control ctrll keycode 18 = Control_e
+ altgr control ctrll keycode 18 = Control_e
+ shift altgr control ctrll keycode 18 = Control_e
+ alt ctrll keycode 18 = Meta_e
+ shift alt ctrll keycode 18 = Meta_E
+ altgr alt ctrll keycode 18 = Meta_e
+ shift altgr alt ctrll keycode 18 = Meta_E
+ control alt ctrll keycode 18 = Meta_Control_e
+ shift control alt ctrll keycode 18 = Meta_Control_e
+ altgr control alt ctrll keycode 18 = Meta_Control_e
+ shift altgr control alt ctrll keycode 18 = Meta_Control_e
+ shiftl ctrll keycode 18 = +E
+ altgr shiftl ctrll keycode 18 = euro
+ shift altgr shiftl ctrll keycode 18 = euro
+ control shiftl ctrll keycode 18 = Control_e
+ shift control shiftl ctrll keycode 18 = Control_e
+ altgr control shiftl ctrll keycode 18 = Control_e
+ shift altgr control shiftl ctrll keycode 18 = Control_e
+ alt shiftl ctrll keycode 18 = Meta_e
+ shift alt shiftl ctrll keycode 18 = Meta_E
+ altgr alt shiftl ctrll keycode 18 = Meta_e
+ shift altgr alt shiftl ctrll keycode 18 = Meta_E
+ control alt shiftl ctrll keycode 18 = Meta_Control_e
+ shift control alt shiftl ctrll keycode 18 = Meta_Control_e
+ altgr control alt shiftl ctrll keycode 18 = Meta_Control_e
+ shift altgr control alt shiftl ctrll keycode 18 = Meta_Control_e
+ shiftr ctrll keycode 18 = +E
+ altgr shiftr ctrll keycode 18 = euro
+ shift altgr shiftr ctrll keycode 18 = euro
+ control shiftr ctrll keycode 18 = Control_e
+ shift control shiftr ctrll keycode 18 = Control_e
+ altgr control shiftr ctrll keycode 18 = Control_e
+ shift altgr control shiftr ctrll keycode 18 = Control_e
+ alt shiftr ctrll keycode 18 = Meta_e
+ shift alt shiftr ctrll keycode 18 = Meta_E
+ altgr alt shiftr ctrll keycode 18 = Meta_e
+ shift altgr alt shiftr ctrll keycode 18 = Meta_E
+ control alt shiftr ctrll keycode 18 = Meta_Control_e
+ shift control alt shiftr ctrll keycode 18 = Meta_Control_e
+ altgr control alt shiftr ctrll keycode 18 = Meta_Control_e
+ shift altgr control alt shiftr ctrll keycode 18 = Meta_Control_e
+ shiftl shiftr ctrll keycode 18 = +E
+ altgr shiftl shiftr ctrll keycode 18 = euro
+ shift altgr shiftl shiftr ctrll keycode 18 = euro
+ control shiftl shiftr ctrll keycode 18 = Control_e
+ shift control shiftl shiftr ctrll keycode 18 = Control_e
+ altgr control shiftl shiftr ctrll keycode 18 = Control_e
+ shift altgr control shiftl shiftr ctrll keycode 18 = Control_e
+ alt shiftl shiftr ctrll keycode 18 = Meta_e
+ shift alt shiftl shiftr ctrll keycode 18 = Meta_E
+ altgr alt shiftl shiftr ctrll keycode 18 = Meta_e
+ shift altgr alt shiftl shiftr ctrll keycode 18 = Meta_E
+ control alt shiftl shiftr ctrll keycode 18 = Meta_Control_e
+ shift control alt shiftl shiftr ctrll keycode 18 = Meta_Control_e
+ altgr control alt shiftl shiftr ctrll keycode 18 = Meta_Control_e
+ shift altgr control alt shiftl shiftr ctrll keycode 18 = Meta_Control_e
+keycode 19 = +r
+ shift keycode 19 = +R
+ altgr keycode 19 = registered
+ shift altgr keycode 19 = registered
+ control keycode 19 = Control_r
+ shift control keycode 19 = Control_r
+ altgr control keycode 19 = Control_r
+ shift altgr control keycode 19 = Control_r
+ alt keycode 19 = Meta_r
+ shift alt keycode 19 = Meta_R
+ altgr alt keycode 19 = Meta_r
+ shift altgr alt keycode 19 = Meta_R
+ control alt keycode 19 = Meta_Control_r
+ shift control alt keycode 19 = Meta_Control_r
+ altgr control alt keycode 19 = Meta_Control_r
+ shift altgr control alt keycode 19 = Meta_Control_r
+ shift shiftl keycode 19 = +R
+ altgr shiftl keycode 19 = registered
+ shift altgr shiftl keycode 19 = registered
+ control shiftl keycode 19 = Control_r
+ shift control shiftl keycode 19 = Control_r
+ altgr control shiftl keycode 19 = Control_r
+ shift altgr control shiftl keycode 19 = Control_r
+ alt shiftl keycode 19 = Meta_r
+ shift alt shiftl keycode 19 = Meta_R
+ altgr alt shiftl keycode 19 = Meta_r
+ shift altgr alt shiftl keycode 19 = Meta_R
+ control alt shiftl keycode 19 = Meta_Control_r
+ shift control alt shiftl keycode 19 = Meta_Control_r
+ altgr control alt shiftl keycode 19 = Meta_Control_r
+ shift altgr control alt shiftl keycode 19 = Meta_Control_r
+ shift shiftr keycode 19 = +R
+ altgr shiftr keycode 19 = registered
+ shift altgr shiftr keycode 19 = registered
+ control shiftr keycode 19 = Control_r
+ shift control shiftr keycode 19 = Control_r
+ altgr control shiftr keycode 19 = Control_r
+ shift altgr control shiftr keycode 19 = Control_r
+ alt shiftr keycode 19 = Meta_r
+ shift alt shiftr keycode 19 = Meta_R
+ altgr alt shiftr keycode 19 = Meta_r
+ shift altgr alt shiftr keycode 19 = Meta_R
+ control alt shiftr keycode 19 = Meta_Control_r
+ shift control alt shiftr keycode 19 = Meta_Control_r
+ altgr control alt shiftr keycode 19 = Meta_Control_r
+ shift altgr control alt shiftr keycode 19 = Meta_Control_r
+ shift shiftl shiftr keycode 19 = +R
+ altgr shiftl shiftr keycode 19 = registered
+ shift altgr shiftl shiftr keycode 19 = registered
+ control shiftl shiftr keycode 19 = Control_r
+ shift control shiftl shiftr keycode 19 = Control_r
+ altgr control shiftl shiftr keycode 19 = Control_r
+ shift altgr control shiftl shiftr keycode 19 = Control_r
+ alt shiftl shiftr keycode 19 = Meta_r
+ shift alt shiftl shiftr keycode 19 = Meta_R
+ altgr alt shiftl shiftr keycode 19 = Meta_r
+ shift altgr alt shiftl shiftr keycode 19 = Meta_R
+ control alt shiftl shiftr keycode 19 = Meta_Control_r
+ shift control alt shiftl shiftr keycode 19 = Meta_Control_r
+ altgr control alt shiftl shiftr keycode 19 = Meta_Control_r
+ shift altgr control alt shiftl shiftr keycode 19 = Meta_Control_r
+ ctrll keycode 19 = +R
+ altgr ctrll keycode 19 = registered
+ shift altgr ctrll keycode 19 = registered
+ control ctrll keycode 19 = Control_r
+ shift control ctrll keycode 19 = Control_r
+ altgr control ctrll keycode 19 = Control_r
+ shift altgr control ctrll keycode 19 = Control_r
+ alt ctrll keycode 19 = Meta_r
+ shift alt ctrll keycode 19 = Meta_R
+ altgr alt ctrll keycode 19 = Meta_r
+ shift altgr alt ctrll keycode 19 = Meta_R
+ control alt ctrll keycode 19 = Meta_Control_r
+ shift control alt ctrll keycode 19 = Meta_Control_r
+ altgr control alt ctrll keycode 19 = Meta_Control_r
+ shift altgr control alt ctrll keycode 19 = Meta_Control_r
+ shiftl ctrll keycode 19 = +R
+ altgr shiftl ctrll keycode 19 = registered
+ shift altgr shiftl ctrll keycode 19 = registered
+ control shiftl ctrll keycode 19 = Control_r
+ shift control shiftl ctrll keycode 19 = Control_r
+ altgr control shiftl ctrll keycode 19 = Control_r
+ shift altgr control shiftl ctrll keycode 19 = Control_r
+ alt shiftl ctrll keycode 19 = Meta_r
+ shift alt shiftl ctrll keycode 19 = Meta_R
+ altgr alt shiftl ctrll keycode 19 = Meta_r
+ shift altgr alt shiftl ctrll keycode 19 = Meta_R
+ control alt shiftl ctrll keycode 19 = Meta_Control_r
+ shift control alt shiftl ctrll keycode 19 = Meta_Control_r
+ altgr control alt shiftl ctrll keycode 19 = Meta_Control_r
+ shift altgr control alt shiftl ctrll keycode 19 = Meta_Control_r
+ shiftr ctrll keycode 19 = +R
+ altgr shiftr ctrll keycode 19 = registered
+ shift altgr shiftr ctrll keycode 19 = registered
+ control shiftr ctrll keycode 19 = Control_r
+ shift control shiftr ctrll keycode 19 = Control_r
+ altgr control shiftr ctrll keycode 19 = Control_r
+ shift altgr control shiftr ctrll keycode 19 = Control_r
+ alt shiftr ctrll keycode 19 = Meta_r
+ shift alt shiftr ctrll keycode 19 = Meta_R
+ altgr alt shiftr ctrll keycode 19 = Meta_r
+ shift altgr alt shiftr ctrll keycode 19 = Meta_R
+ control alt shiftr ctrll keycode 19 = Meta_Control_r
+ shift control alt shiftr ctrll keycode 19 = Meta_Control_r
+ altgr control alt shiftr ctrll keycode 19 = Meta_Control_r
+ shift altgr control alt shiftr ctrll keycode 19 = Meta_Control_r
+ shiftl shiftr ctrll keycode 19 = +R
+ altgr shiftl shiftr ctrll keycode 19 = registered
+ shift altgr shiftl shiftr ctrll keycode 19 = registered
+ control shiftl shiftr ctrll keycode 19 = Control_r
+ shift control shiftl shiftr ctrll keycode 19 = Control_r
+ altgr control shiftl shiftr ctrll keycode 19 = Control_r
+ shift altgr control shiftl shiftr ctrll keycode 19 = Control_r
+ alt shiftl shiftr ctrll keycode 19 = Meta_r
+ shift alt shiftl shiftr ctrll keycode 19 = Meta_R
+ altgr alt shiftl shiftr ctrll keycode 19 = Meta_r
+ shift altgr alt shiftl shiftr ctrll keycode 19 = Meta_R
+ control alt shiftl shiftr ctrll keycode 19 = Meta_Control_r
+ shift control alt shiftl shiftr ctrll keycode 19 = Meta_Control_r
+ altgr control alt shiftl shiftr ctrll keycode 19 = Meta_Control_r
+ shift altgr control alt shiftl shiftr ctrll keycode 19 = Meta_Control_r
+keycode 20 = +t
+ shift keycode 20 = +T
+ altgr keycode 20 = tslash
+ shift altgr keycode 20 = Tslash
+ control keycode 20 = Control_t
+ shift control keycode 20 = Control_t
+ altgr control keycode 20 = Control_t
+ shift altgr control keycode 20 = Control_t
+ alt keycode 20 = Meta_t
+ shift alt keycode 20 = Meta_T
+ altgr alt keycode 20 = Meta_t
+ shift altgr alt keycode 20 = Meta_T
+ control alt keycode 20 = Meta_Control_t
+ shift control alt keycode 20 = Meta_Control_t
+ altgr control alt keycode 20 = Meta_Control_t
+ shift altgr control alt keycode 20 = Meta_Control_t
+ shift shiftl keycode 20 = +T
+ altgr shiftl keycode 20 = tslash
+ shift altgr shiftl keycode 20 = Tslash
+ control shiftl keycode 20 = Control_t
+ shift control shiftl keycode 20 = Control_t
+ altgr control shiftl keycode 20 = Control_t
+ shift altgr control shiftl keycode 20 = Control_t
+ alt shiftl keycode 20 = Meta_t
+ shift alt shiftl keycode 20 = Meta_T
+ altgr alt shiftl keycode 20 = Meta_t
+ shift altgr alt shiftl keycode 20 = Meta_T
+ control alt shiftl keycode 20 = Meta_Control_t
+ shift control alt shiftl keycode 20 = Meta_Control_t
+ altgr control alt shiftl keycode 20 = Meta_Control_t
+ shift altgr control alt shiftl keycode 20 = Meta_Control_t
+ shift shiftr keycode 20 = +T
+ altgr shiftr keycode 20 = tslash
+ shift altgr shiftr keycode 20 = Tslash
+ control shiftr keycode 20 = Control_t
+ shift control shiftr keycode 20 = Control_t
+ altgr control shiftr keycode 20 = Control_t
+ shift altgr control shiftr keycode 20 = Control_t
+ alt shiftr keycode 20 = Meta_t
+ shift alt shiftr keycode 20 = Meta_T
+ altgr alt shiftr keycode 20 = Meta_t
+ shift altgr alt shiftr keycode 20 = Meta_T
+ control alt shiftr keycode 20 = Meta_Control_t
+ shift control alt shiftr keycode 20 = Meta_Control_t
+ altgr control alt shiftr keycode 20 = Meta_Control_t
+ shift altgr control alt shiftr keycode 20 = Meta_Control_t
+ shift shiftl shiftr keycode 20 = +T
+ altgr shiftl shiftr keycode 20 = tslash
+ shift altgr shiftl shiftr keycode 20 = Tslash
+ control shiftl shiftr keycode 20 = Control_t
+ shift control shiftl shiftr keycode 20 = Control_t
+ altgr control shiftl shiftr keycode 20 = Control_t
+ shift altgr control shiftl shiftr keycode 20 = Control_t
+ alt shiftl shiftr keycode 20 = Meta_t
+ shift alt shiftl shiftr keycode 20 = Meta_T
+ altgr alt shiftl shiftr keycode 20 = Meta_t
+ shift altgr alt shiftl shiftr keycode 20 = Meta_T
+ control alt shiftl shiftr keycode 20 = Meta_Control_t
+ shift control alt shiftl shiftr keycode 20 = Meta_Control_t
+ altgr control alt shiftl shiftr keycode 20 = Meta_Control_t
+ shift altgr control alt shiftl shiftr keycode 20 = Meta_Control_t
+ ctrll keycode 20 = +T
+ altgr ctrll keycode 20 = Tslash
+ shift altgr ctrll keycode 20 = tslash
+ control ctrll keycode 20 = Control_t
+ shift control ctrll keycode 20 = Control_t
+ altgr control ctrll keycode 20 = Control_t
+ shift altgr control ctrll keycode 20 = Control_t
+ alt ctrll keycode 20 = Meta_t
+ shift alt ctrll keycode 20 = Meta_T
+ altgr alt ctrll keycode 20 = Meta_t
+ shift altgr alt ctrll keycode 20 = Meta_T
+ control alt ctrll keycode 20 = Meta_Control_t
+ shift control alt ctrll keycode 20 = Meta_Control_t
+ altgr control alt ctrll keycode 20 = Meta_Control_t
+ shift altgr control alt ctrll keycode 20 = Meta_Control_t
+ shiftl ctrll keycode 20 = +T
+ altgr shiftl ctrll keycode 20 = Tslash
+ shift altgr shiftl ctrll keycode 20 = tslash
+ control shiftl ctrll keycode 20 = Control_t
+ shift control shiftl ctrll keycode 20 = Control_t
+ altgr control shiftl ctrll keycode 20 = Control_t
+ shift altgr control shiftl ctrll keycode 20 = Control_t
+ alt shiftl ctrll keycode 20 = Meta_t
+ shift alt shiftl ctrll keycode 20 = Meta_T
+ altgr alt shiftl ctrll keycode 20 = Meta_t
+ shift altgr alt shiftl ctrll keycode 20 = Meta_T
+ control alt shiftl ctrll keycode 20 = Meta_Control_t
+ shift control alt shiftl ctrll keycode 20 = Meta_Control_t
+ altgr control alt shiftl ctrll keycode 20 = Meta_Control_t
+ shift altgr control alt shiftl ctrll keycode 20 = Meta_Control_t
+ shiftr ctrll keycode 20 = +T
+ altgr shiftr ctrll keycode 20 = Tslash
+ shift altgr shiftr ctrll keycode 20 = tslash
+ control shiftr ctrll keycode 20 = Control_t
+ shift control shiftr ctrll keycode 20 = Control_t
+ altgr control shiftr ctrll keycode 20 = Control_t
+ shift altgr control shiftr ctrll keycode 20 = Control_t
+ alt shiftr ctrll keycode 20 = Meta_t
+ shift alt shiftr ctrll keycode 20 = Meta_T
+ altgr alt shiftr ctrll keycode 20 = Meta_t
+ shift altgr alt shiftr ctrll keycode 20 = Meta_T
+ control alt shiftr ctrll keycode 20 = Meta_Control_t
+ shift control alt shiftr ctrll keycode 20 = Meta_Control_t
+ altgr control alt shiftr ctrll keycode 20 = Meta_Control_t
+ shift altgr control alt shiftr ctrll keycode 20 = Meta_Control_t
+ shiftl shiftr ctrll keycode 20 = +T
+ altgr shiftl shiftr ctrll keycode 20 = Tslash
+ shift altgr shiftl shiftr ctrll keycode 20 = tslash
+ control shiftl shiftr ctrll keycode 20 = Control_t
+ shift control shiftl shiftr ctrll keycode 20 = Control_t
+ altgr control shiftl shiftr ctrll keycode 20 = Control_t
+ shift altgr control shiftl shiftr ctrll keycode 20 = Control_t
+ alt shiftl shiftr ctrll keycode 20 = Meta_t
+ shift alt shiftl shiftr ctrll keycode 20 = Meta_T
+ altgr alt shiftl shiftr ctrll keycode 20 = Meta_t
+ shift altgr alt shiftl shiftr ctrll keycode 20 = Meta_T
+ control alt shiftl shiftr ctrll keycode 20 = Meta_Control_t
+ shift control alt shiftl shiftr ctrll keycode 20 = Meta_Control_t
+ altgr control alt shiftl shiftr ctrll keycode 20 = Meta_Control_t
+ shift altgr control alt shiftl shiftr ctrll keycode 20 = Meta_Control_t
+keycode 21 = +y
+ shift keycode 21 = +Y
+ altgr keycode 21 = U+2190
+ shift altgr keycode 21 = yen
+ control keycode 21 = Control_y
+ shift control keycode 21 = Control_y
+ altgr control keycode 21 = Control_y
+ shift altgr control keycode 21 = Control_y
+ alt keycode 21 = Meta_y
+ shift alt keycode 21 = Meta_Y
+ altgr alt keycode 21 = Meta_y
+ shift altgr alt keycode 21 = Meta_Y
+ control alt keycode 21 = Meta_Control_y
+ shift control alt keycode 21 = Meta_Control_y
+ altgr control alt keycode 21 = Meta_Control_y
+ shift altgr control alt keycode 21 = Meta_Control_y
+ shift shiftl keycode 21 = +Y
+ altgr shiftl keycode 21 = U+2190
+ shift altgr shiftl keycode 21 = yen
+ control shiftl keycode 21 = Control_y
+ shift control shiftl keycode 21 = Control_y
+ altgr control shiftl keycode 21 = Control_y
+ shift altgr control shiftl keycode 21 = Control_y
+ alt shiftl keycode 21 = Meta_y
+ shift alt shiftl keycode 21 = Meta_Y
+ altgr alt shiftl keycode 21 = Meta_y
+ shift altgr alt shiftl keycode 21 = Meta_Y
+ control alt shiftl keycode 21 = Meta_Control_y
+ shift control alt shiftl keycode 21 = Meta_Control_y
+ altgr control alt shiftl keycode 21 = Meta_Control_y
+ shift altgr control alt shiftl keycode 21 = Meta_Control_y
+ shift shiftr keycode 21 = +Y
+ altgr shiftr keycode 21 = U+2190
+ shift altgr shiftr keycode 21 = yen
+ control shiftr keycode 21 = Control_y
+ shift control shiftr keycode 21 = Control_y
+ altgr control shiftr keycode 21 = Control_y
+ shift altgr control shiftr keycode 21 = Control_y
+ alt shiftr keycode 21 = Meta_y
+ shift alt shiftr keycode 21 = Meta_Y
+ altgr alt shiftr keycode 21 = Meta_y
+ shift altgr alt shiftr keycode 21 = Meta_Y
+ control alt shiftr keycode 21 = Meta_Control_y
+ shift control alt shiftr keycode 21 = Meta_Control_y
+ altgr control alt shiftr keycode 21 = Meta_Control_y
+ shift altgr control alt shiftr keycode 21 = Meta_Control_y
+ shift shiftl shiftr keycode 21 = +Y
+ altgr shiftl shiftr keycode 21 = U+2190
+ shift altgr shiftl shiftr keycode 21 = yen
+ control shiftl shiftr keycode 21 = Control_y
+ shift control shiftl shiftr keycode 21 = Control_y
+ altgr control shiftl shiftr keycode 21 = Control_y
+ shift altgr control shiftl shiftr keycode 21 = Control_y
+ alt shiftl shiftr keycode 21 = Meta_y
+ shift alt shiftl shiftr keycode 21 = Meta_Y
+ altgr alt shiftl shiftr keycode 21 = Meta_y
+ shift altgr alt shiftl shiftr keycode 21 = Meta_Y
+ control alt shiftl shiftr keycode 21 = Meta_Control_y
+ shift control alt shiftl shiftr keycode 21 = Meta_Control_y
+ altgr control alt shiftl shiftr keycode 21 = Meta_Control_y
+ shift altgr control alt shiftl shiftr keycode 21 = Meta_Control_y
+ ctrll keycode 21 = +Y
+ altgr ctrll keycode 21 = U+2190
+ shift altgr ctrll keycode 21 = yen
+ control ctrll keycode 21 = Control_y
+ shift control ctrll keycode 21 = Control_y
+ altgr control ctrll keycode 21 = Control_y
+ shift altgr control ctrll keycode 21 = Control_y
+ alt ctrll keycode 21 = Meta_y
+ shift alt ctrll keycode 21 = Meta_Y
+ altgr alt ctrll keycode 21 = Meta_y
+ shift altgr alt ctrll keycode 21 = Meta_Y
+ control alt ctrll keycode 21 = Meta_Control_y
+ shift control alt ctrll keycode 21 = Meta_Control_y
+ altgr control alt ctrll keycode 21 = Meta_Control_y
+ shift altgr control alt ctrll keycode 21 = Meta_Control_y
+ shiftl ctrll keycode 21 = +Y
+ altgr shiftl ctrll keycode 21 = U+2190
+ shift altgr shiftl ctrll keycode 21 = yen
+ control shiftl ctrll keycode 21 = Control_y
+ shift control shiftl ctrll keycode 21 = Control_y
+ altgr control shiftl ctrll keycode 21 = Control_y
+ shift altgr control shiftl ctrll keycode 21 = Control_y
+ alt shiftl ctrll keycode 21 = Meta_y
+ shift alt shiftl ctrll keycode 21 = Meta_Y
+ altgr alt shiftl ctrll keycode 21 = Meta_y
+ shift altgr alt shiftl ctrll keycode 21 = Meta_Y
+ control alt shiftl ctrll keycode 21 = Meta_Control_y
+ shift control alt shiftl ctrll keycode 21 = Meta_Control_y
+ altgr control alt shiftl ctrll keycode 21 = Meta_Control_y
+ shift altgr control alt shiftl ctrll keycode 21 = Meta_Control_y
+ shiftr ctrll keycode 21 = +Y
+ altgr shiftr ctrll keycode 21 = U+2190
+ shift altgr shiftr ctrll keycode 21 = yen
+ control shiftr ctrll keycode 21 = Control_y
+ shift control shiftr ctrll keycode 21 = Control_y
+ altgr control shiftr ctrll keycode 21 = Control_y
+ shift altgr control shiftr ctrll keycode 21 = Control_y
+ alt shiftr ctrll keycode 21 = Meta_y
+ shift alt shiftr ctrll keycode 21 = Meta_Y
+ altgr alt shiftr ctrll keycode 21 = Meta_y
+ shift altgr alt shiftr ctrll keycode 21 = Meta_Y
+ control alt shiftr ctrll keycode 21 = Meta_Control_y
+ shift control alt shiftr ctrll keycode 21 = Meta_Control_y
+ altgr control alt shiftr ctrll keycode 21 = Meta_Control_y
+ shift altgr control alt shiftr ctrll keycode 21 = Meta_Control_y
+ shiftl shiftr ctrll keycode 21 = +Y
+ altgr shiftl shiftr ctrll keycode 21 = U+2190
+ shift altgr shiftl shiftr ctrll keycode 21 = yen
+ control shiftl shiftr ctrll keycode 21 = Control_y
+ shift control shiftl shiftr ctrll keycode 21 = Control_y
+ altgr control shiftl shiftr ctrll keycode 21 = Control_y
+ shift altgr control shiftl shiftr ctrll keycode 21 = Control_y
+ alt shiftl shiftr ctrll keycode 21 = Meta_y
+ shift alt shiftl shiftr ctrll keycode 21 = Meta_Y
+ altgr alt shiftl shiftr ctrll keycode 21 = Meta_y
+ shift altgr alt shiftl shiftr ctrll keycode 21 = Meta_Y
+ control alt shiftl shiftr ctrll keycode 21 = Meta_Control_y
+ shift control alt shiftl shiftr ctrll keycode 21 = Meta_Control_y
+ altgr control alt shiftl shiftr ctrll keycode 21 = Meta_Control_y
+ shift altgr control alt shiftl shiftr ctrll keycode 21 = Meta_Control_y
+keycode 22 = +u
+ shift keycode 22 = +U
+ altgr keycode 22 = U+2193
+ shift altgr keycode 22 = U+2191
+ control keycode 22 = Control_u
+ shift control keycode 22 = Control_u
+ altgr control keycode 22 = Control_u
+ shift altgr control keycode 22 = Control_u
+ alt keycode 22 = Meta_u
+ shift alt keycode 22 = Meta_U
+ altgr alt keycode 22 = Meta_u
+ shift altgr alt keycode 22 = Meta_U
+ control alt keycode 22 = Meta_Control_u
+ shift control alt keycode 22 = Meta_Control_u
+ altgr control alt keycode 22 = Meta_Control_u
+ shift altgr control alt keycode 22 = Meta_Control_u
+ shift shiftl keycode 22 = +U
+ altgr shiftl keycode 22 = U+2193
+ shift altgr shiftl keycode 22 = U+2191
+ control shiftl keycode 22 = Control_u
+ shift control shiftl keycode 22 = Control_u
+ altgr control shiftl keycode 22 = Control_u
+ shift altgr control shiftl keycode 22 = Control_u
+ alt shiftl keycode 22 = Meta_u
+ shift alt shiftl keycode 22 = Meta_U
+ altgr alt shiftl keycode 22 = Meta_u
+ shift altgr alt shiftl keycode 22 = Meta_U
+ control alt shiftl keycode 22 = Meta_Control_u
+ shift control alt shiftl keycode 22 = Meta_Control_u
+ altgr control alt shiftl keycode 22 = Meta_Control_u
+ shift altgr control alt shiftl keycode 22 = Meta_Control_u
+ shift shiftr keycode 22 = +U
+ altgr shiftr keycode 22 = U+2193
+ shift altgr shiftr keycode 22 = U+2191
+ control shiftr keycode 22 = Control_u
+ shift control shiftr keycode 22 = Control_u
+ altgr control shiftr keycode 22 = Control_u
+ shift altgr control shiftr keycode 22 = Control_u
+ alt shiftr keycode 22 = Meta_u
+ shift alt shiftr keycode 22 = Meta_U
+ altgr alt shiftr keycode 22 = Meta_u
+ shift altgr alt shiftr keycode 22 = Meta_U
+ control alt shiftr keycode 22 = Meta_Control_u
+ shift control alt shiftr keycode 22 = Meta_Control_u
+ altgr control alt shiftr keycode 22 = Meta_Control_u
+ shift altgr control alt shiftr keycode 22 = Meta_Control_u
+ shift shiftl shiftr keycode 22 = +U
+ altgr shiftl shiftr keycode 22 = U+2193
+ shift altgr shiftl shiftr keycode 22 = U+2191
+ control shiftl shiftr keycode 22 = Control_u
+ shift control shiftl shiftr keycode 22 = Control_u
+ altgr control shiftl shiftr keycode 22 = Control_u
+ shift altgr control shiftl shiftr keycode 22 = Control_u
+ alt shiftl shiftr keycode 22 = Meta_u
+ shift alt shiftl shiftr keycode 22 = Meta_U
+ altgr alt shiftl shiftr keycode 22 = Meta_u
+ shift altgr alt shiftl shiftr keycode 22 = Meta_U
+ control alt shiftl shiftr keycode 22 = Meta_Control_u
+ shift control alt shiftl shiftr keycode 22 = Meta_Control_u
+ altgr control alt shiftl shiftr keycode 22 = Meta_Control_u
+ shift altgr control alt shiftl shiftr keycode 22 = Meta_Control_u
+ ctrll keycode 22 = +U
+ altgr ctrll keycode 22 = U+2193
+ shift altgr ctrll keycode 22 = U+2191
+ control ctrll keycode 22 = Control_u
+ shift control ctrll keycode 22 = Control_u
+ altgr control ctrll keycode 22 = Control_u
+ shift altgr control ctrll keycode 22 = Control_u
+ alt ctrll keycode 22 = Meta_u
+ shift alt ctrll keycode 22 = Meta_U
+ altgr alt ctrll keycode 22 = Meta_u
+ shift altgr alt ctrll keycode 22 = Meta_U
+ control alt ctrll keycode 22 = Meta_Control_u
+ shift control alt ctrll keycode 22 = Meta_Control_u
+ altgr control alt ctrll keycode 22 = Meta_Control_u
+ shift altgr control alt ctrll keycode 22 = Meta_Control_u
+ shiftl ctrll keycode 22 = +U
+ altgr shiftl ctrll keycode 22 = U+2193
+ shift altgr shiftl ctrll keycode 22 = U+2191
+ control shiftl ctrll keycode 22 = Control_u
+ shift control shiftl ctrll keycode 22 = Control_u
+ altgr control shiftl ctrll keycode 22 = Control_u
+ shift altgr control shiftl ctrll keycode 22 = Control_u
+ alt shiftl ctrll keycode 22 = Meta_u
+ shift alt shiftl ctrll keycode 22 = Meta_U
+ altgr alt shiftl ctrll keycode 22 = Meta_u
+ shift altgr alt shiftl ctrll keycode 22 = Meta_U
+ control alt shiftl ctrll keycode 22 = Meta_Control_u
+ shift control alt shiftl ctrll keycode 22 = Meta_Control_u
+ altgr control alt shiftl ctrll keycode 22 = Meta_Control_u
+ shift altgr control alt shiftl ctrll keycode 22 = Meta_Control_u
+ shiftr ctrll keycode 22 = +U
+ altgr shiftr ctrll keycode 22 = U+2193
+ shift altgr shiftr ctrll keycode 22 = U+2191
+ control shiftr ctrll keycode 22 = Control_u
+ shift control shiftr ctrll keycode 22 = Control_u
+ altgr control shiftr ctrll keycode 22 = Control_u
+ shift altgr control shiftr ctrll keycode 22 = Control_u
+ alt shiftr ctrll keycode 22 = Meta_u
+ shift alt shiftr ctrll keycode 22 = Meta_U
+ altgr alt shiftr ctrll keycode 22 = Meta_u
+ shift altgr alt shiftr ctrll keycode 22 = Meta_U
+ control alt shiftr ctrll keycode 22 = Meta_Control_u
+ shift control alt shiftr ctrll keycode 22 = Meta_Control_u
+ altgr control alt shiftr ctrll keycode 22 = Meta_Control_u
+ shift altgr control alt shiftr ctrll keycode 22 = Meta_Control_u
+ shiftl shiftr ctrll keycode 22 = +U
+ altgr shiftl shiftr ctrll keycode 22 = U+2193
+ shift altgr shiftl shiftr ctrll keycode 22 = U+2191
+ control shiftl shiftr ctrll keycode 22 = Control_u
+ shift control shiftl shiftr ctrll keycode 22 = Control_u
+ altgr control shiftl shiftr ctrll keycode 22 = Control_u
+ shift altgr control shiftl shiftr ctrll keycode 22 = Control_u
+ alt shiftl shiftr ctrll keycode 22 = Meta_u
+ shift alt shiftl shiftr ctrll keycode 22 = Meta_U
+ altgr alt shiftl shiftr ctrll keycode 22 = Meta_u
+ shift altgr alt shiftl shiftr ctrll keycode 22 = Meta_U
+ control alt shiftl shiftr ctrll keycode 22 = Meta_Control_u
+ shift control alt shiftl shiftr ctrll keycode 22 = Meta_Control_u
+ altgr control alt shiftl shiftr ctrll keycode 22 = Meta_Control_u
+ shift altgr control alt shiftl shiftr ctrll keycode 22 = Meta_Control_u
+keycode 23 = +i
+ shift keycode 23 = +I
+ altgr keycode 23 = U+2192
+ shift altgr keycode 23 = idotless
+ control keycode 23 = Tab
+ shift control keycode 23 = Tab
+ altgr control keycode 23 = Tab
+ shift altgr control keycode 23 = Tab
+ alt keycode 23 = Meta_i
+ shift alt keycode 23 = Meta_I
+ altgr alt keycode 23 = Meta_i
+ shift altgr alt keycode 23 = Meta_I
+ control alt keycode 23 = Meta_Tab
+ shift control alt keycode 23 = Meta_Tab
+ altgr control alt keycode 23 = Meta_Tab
+ shift altgr control alt keycode 23 = Meta_Tab
+ shift shiftl keycode 23 = +I
+ altgr shiftl keycode 23 = U+2192
+ shift altgr shiftl keycode 23 = idotless
+ control shiftl keycode 23 = Tab
+ shift control shiftl keycode 23 = Tab
+ altgr control shiftl keycode 23 = Tab
+ shift altgr control shiftl keycode 23 = Tab
+ alt shiftl keycode 23 = Meta_i
+ shift alt shiftl keycode 23 = Meta_I
+ altgr alt shiftl keycode 23 = Meta_i
+ shift altgr alt shiftl keycode 23 = Meta_I
+ control alt shiftl keycode 23 = Meta_Tab
+ shift control alt shiftl keycode 23 = Meta_Tab
+ altgr control alt shiftl keycode 23 = Meta_Tab
+ shift altgr control alt shiftl keycode 23 = Meta_Tab
+ shift shiftr keycode 23 = +I
+ altgr shiftr keycode 23 = U+2192
+ shift altgr shiftr keycode 23 = idotless
+ control shiftr keycode 23 = Tab
+ shift control shiftr keycode 23 = Tab
+ altgr control shiftr keycode 23 = Tab
+ shift altgr control shiftr keycode 23 = Tab
+ alt shiftr keycode 23 = Meta_i
+ shift alt shiftr keycode 23 = Meta_I
+ altgr alt shiftr keycode 23 = Meta_i
+ shift altgr alt shiftr keycode 23 = Meta_I
+ control alt shiftr keycode 23 = Meta_Tab
+ shift control alt shiftr keycode 23 = Meta_Tab
+ altgr control alt shiftr keycode 23 = Meta_Tab
+ shift altgr control alt shiftr keycode 23 = Meta_Tab
+ shift shiftl shiftr keycode 23 = +I
+ altgr shiftl shiftr keycode 23 = U+2192
+ shift altgr shiftl shiftr keycode 23 = idotless
+ control shiftl shiftr keycode 23 = Tab
+ shift control shiftl shiftr keycode 23 = Tab
+ altgr control shiftl shiftr keycode 23 = Tab
+ shift altgr control shiftl shiftr keycode 23 = Tab
+ alt shiftl shiftr keycode 23 = Meta_i
+ shift alt shiftl shiftr keycode 23 = Meta_I
+ altgr alt shiftl shiftr keycode 23 = Meta_i
+ shift altgr alt shiftl shiftr keycode 23 = Meta_I
+ control alt shiftl shiftr keycode 23 = Meta_Tab
+ shift control alt shiftl shiftr keycode 23 = Meta_Tab
+ altgr control alt shiftl shiftr keycode 23 = Meta_Tab
+ shift altgr control alt shiftl shiftr keycode 23 = Meta_Tab
+ ctrll keycode 23 = +I
+ altgr ctrll keycode 23 = U+2192
+ shift altgr ctrll keycode 23 = +I
+ control ctrll keycode 23 = Tab
+ shift control ctrll keycode 23 = Tab
+ altgr control ctrll keycode 23 = Tab
+ shift altgr control ctrll keycode 23 = Tab
+ alt ctrll keycode 23 = Meta_i
+ shift alt ctrll keycode 23 = Meta_I
+ altgr alt ctrll keycode 23 = Meta_i
+ shift altgr alt ctrll keycode 23 = Meta_I
+ control alt ctrll keycode 23 = Meta_Tab
+ shift control alt ctrll keycode 23 = Meta_Tab
+ altgr control alt ctrll keycode 23 = Meta_Tab
+ shift altgr control alt ctrll keycode 23 = Meta_Tab
+ shiftl ctrll keycode 23 = +I
+ altgr shiftl ctrll keycode 23 = U+2192
+ shift altgr shiftl ctrll keycode 23 = +I
+ control shiftl ctrll keycode 23 = Tab
+ shift control shiftl ctrll keycode 23 = Tab
+ altgr control shiftl ctrll keycode 23 = Tab
+ shift altgr control shiftl ctrll keycode 23 = Tab
+ alt shiftl ctrll keycode 23 = Meta_i
+ shift alt shiftl ctrll keycode 23 = Meta_I
+ altgr alt shiftl ctrll keycode 23 = Meta_i
+ shift altgr alt shiftl ctrll keycode 23 = Meta_I
+ control alt shiftl ctrll keycode 23 = Meta_Tab
+ shift control alt shiftl ctrll keycode 23 = Meta_Tab
+ altgr control alt shiftl ctrll keycode 23 = Meta_Tab
+ shift altgr control alt shiftl ctrll keycode 23 = Meta_Tab
+ shiftr ctrll keycode 23 = +I
+ altgr shiftr ctrll keycode 23 = U+2192
+ shift altgr shiftr ctrll keycode 23 = +I
+ control shiftr ctrll keycode 23 = Tab
+ shift control shiftr ctrll keycode 23 = Tab
+ altgr control shiftr ctrll keycode 23 = Tab
+ shift altgr control shiftr ctrll keycode 23 = Tab
+ alt shiftr ctrll keycode 23 = Meta_i
+ shift alt shiftr ctrll keycode 23 = Meta_I
+ altgr alt shiftr ctrll keycode 23 = Meta_i
+ shift altgr alt shiftr ctrll keycode 23 = Meta_I
+ control alt shiftr ctrll keycode 23 = Meta_Tab
+ shift control alt shiftr ctrll keycode 23 = Meta_Tab
+ altgr control alt shiftr ctrll keycode 23 = Meta_Tab
+ shift altgr control alt shiftr ctrll keycode 23 = Meta_Tab
+ shiftl shiftr ctrll keycode 23 = +I
+ altgr shiftl shiftr ctrll keycode 23 = U+2192
+ shift altgr shiftl shiftr ctrll keycode 23 = +I
+ control shiftl shiftr ctrll keycode 23 = Tab
+ shift control shiftl shiftr ctrll keycode 23 = Tab
+ altgr control shiftl shiftr ctrll keycode 23 = Tab
+ shift altgr control shiftl shiftr ctrll keycode 23 = Tab
+ alt shiftl shiftr ctrll keycode 23 = Meta_i
+ shift alt shiftl shiftr ctrll keycode 23 = Meta_I
+ altgr alt shiftl shiftr ctrll keycode 23 = Meta_i
+ shift altgr alt shiftl shiftr ctrll keycode 23 = Meta_I
+ control alt shiftl shiftr ctrll keycode 23 = Meta_Tab
+ shift control alt shiftl shiftr ctrll keycode 23 = Meta_Tab
+ altgr control alt shiftl shiftr ctrll keycode 23 = Meta_Tab
+ shift altgr control alt shiftl shiftr ctrll keycode 23 = Meta_Tab
+keycode 24 = +o
+ shift keycode 24 = +O
+ altgr keycode 24 = +oslash
+ shift altgr keycode 24 = +Ooblique
+ control keycode 24 = Control_o
+ shift control keycode 24 = Control_o
+ altgr control keycode 24 = Control_o
+ shift altgr control keycode 24 = Control_o
+ alt keycode 24 = Meta_o
+ shift alt keycode 24 = Meta_O
+ altgr alt keycode 24 = Meta_o
+ shift altgr alt keycode 24 = Meta_O
+ control alt keycode 24 = Meta_Control_o
+ shift control alt keycode 24 = Meta_Control_o
+ altgr control alt keycode 24 = Meta_Control_o
+ shift altgr control alt keycode 24 = Meta_Control_o
+ shift shiftl keycode 24 = +O
+ altgr shiftl keycode 24 = +oslash
+ shift altgr shiftl keycode 24 = +Ooblique
+ control shiftl keycode 24 = Control_o
+ shift control shiftl keycode 24 = Control_o
+ altgr control shiftl keycode 24 = Control_o
+ shift altgr control shiftl keycode 24 = Control_o
+ alt shiftl keycode 24 = Meta_o
+ shift alt shiftl keycode 24 = Meta_O
+ altgr alt shiftl keycode 24 = Meta_o
+ shift altgr alt shiftl keycode 24 = Meta_O
+ control alt shiftl keycode 24 = Meta_Control_o
+ shift control alt shiftl keycode 24 = Meta_Control_o
+ altgr control alt shiftl keycode 24 = Meta_Control_o
+ shift altgr control alt shiftl keycode 24 = Meta_Control_o
+ shift shiftr keycode 24 = +O
+ altgr shiftr keycode 24 = +oslash
+ shift altgr shiftr keycode 24 = +Ooblique
+ control shiftr keycode 24 = Control_o
+ shift control shiftr keycode 24 = Control_o
+ altgr control shiftr keycode 24 = Control_o
+ shift altgr control shiftr keycode 24 = Control_o
+ alt shiftr keycode 24 = Meta_o
+ shift alt shiftr keycode 24 = Meta_O
+ altgr alt shiftr keycode 24 = Meta_o
+ shift altgr alt shiftr keycode 24 = Meta_O
+ control alt shiftr keycode 24 = Meta_Control_o
+ shift control alt shiftr keycode 24 = Meta_Control_o
+ altgr control alt shiftr keycode 24 = Meta_Control_o
+ shift altgr control alt shiftr keycode 24 = Meta_Control_o
+ shift shiftl shiftr keycode 24 = +O
+ altgr shiftl shiftr keycode 24 = +oslash
+ shift altgr shiftl shiftr keycode 24 = +Ooblique
+ control shiftl shiftr keycode 24 = Control_o
+ shift control shiftl shiftr keycode 24 = Control_o
+ altgr control shiftl shiftr keycode 24 = Control_o
+ shift altgr control shiftl shiftr keycode 24 = Control_o
+ alt shiftl shiftr keycode 24 = Meta_o
+ shift alt shiftl shiftr keycode 24 = Meta_O
+ altgr alt shiftl shiftr keycode 24 = Meta_o
+ shift altgr alt shiftl shiftr keycode 24 = Meta_O
+ control alt shiftl shiftr keycode 24 = Meta_Control_o
+ shift control alt shiftl shiftr keycode 24 = Meta_Control_o
+ altgr control alt shiftl shiftr keycode 24 = Meta_Control_o
+ shift altgr control alt shiftl shiftr keycode 24 = Meta_Control_o
+ ctrll keycode 24 = +O
+ altgr ctrll keycode 24 = +Ooblique
+ shift altgr ctrll keycode 24 = +oslash
+ control ctrll keycode 24 = Control_o
+ shift control ctrll keycode 24 = Control_o
+ altgr control ctrll keycode 24 = Control_o
+ shift altgr control ctrll keycode 24 = Control_o
+ alt ctrll keycode 24 = Meta_o
+ shift alt ctrll keycode 24 = Meta_O
+ altgr alt ctrll keycode 24 = Meta_o
+ shift altgr alt ctrll keycode 24 = Meta_O
+ control alt ctrll keycode 24 = Meta_Control_o
+ shift control alt ctrll keycode 24 = Meta_Control_o
+ altgr control alt ctrll keycode 24 = Meta_Control_o
+ shift altgr control alt ctrll keycode 24 = Meta_Control_o
+ shiftl ctrll keycode 24 = +O
+ altgr shiftl ctrll keycode 24 = +Ooblique
+ shift altgr shiftl ctrll keycode 24 = +oslash
+ control shiftl ctrll keycode 24 = Control_o
+ shift control shiftl ctrll keycode 24 = Control_o
+ altgr control shiftl ctrll keycode 24 = Control_o
+ shift altgr control shiftl ctrll keycode 24 = Control_o
+ alt shiftl ctrll keycode 24 = Meta_o
+ shift alt shiftl ctrll keycode 24 = Meta_O
+ altgr alt shiftl ctrll keycode 24 = Meta_o
+ shift altgr alt shiftl ctrll keycode 24 = Meta_O
+ control alt shiftl ctrll keycode 24 = Meta_Control_o
+ shift control alt shiftl ctrll keycode 24 = Meta_Control_o
+ altgr control alt shiftl ctrll keycode 24 = Meta_Control_o
+ shift altgr control alt shiftl ctrll keycode 24 = Meta_Control_o
+ shiftr ctrll keycode 24 = +O
+ altgr shiftr ctrll keycode 24 = +Ooblique
+ shift altgr shiftr ctrll keycode 24 = +oslash
+ control shiftr ctrll keycode 24 = Control_o
+ shift control shiftr ctrll keycode 24 = Control_o
+ altgr control shiftr ctrll keycode 24 = Control_o
+ shift altgr control shiftr ctrll keycode 24 = Control_o
+ alt shiftr ctrll keycode 24 = Meta_o
+ shift alt shiftr ctrll keycode 24 = Meta_O
+ altgr alt shiftr ctrll keycode 24 = Meta_o
+ shift altgr alt shiftr ctrll keycode 24 = Meta_O
+ control alt shiftr ctrll keycode 24 = Meta_Control_o
+ shift control alt shiftr ctrll keycode 24 = Meta_Control_o
+ altgr control alt shiftr ctrll keycode 24 = Meta_Control_o
+ shift altgr control alt shiftr ctrll keycode 24 = Meta_Control_o
+ shiftl shiftr ctrll keycode 24 = +O
+ altgr shiftl shiftr ctrll keycode 24 = +Ooblique
+ shift altgr shiftl shiftr ctrll keycode 24 = +oslash
+ control shiftl shiftr ctrll keycode 24 = Control_o
+ shift control shiftl shiftr ctrll keycode 24 = Control_o
+ altgr control shiftl shiftr ctrll keycode 24 = Control_o
+ shift altgr control shiftl shiftr ctrll keycode 24 = Control_o
+ alt shiftl shiftr ctrll keycode 24 = Meta_o
+ shift alt shiftl shiftr ctrll keycode 24 = Meta_O
+ altgr alt shiftl shiftr ctrll keycode 24 = Meta_o
+ shift altgr alt shiftl shiftr ctrll keycode 24 = Meta_O
+ control alt shiftl shiftr ctrll keycode 24 = Meta_Control_o
+ shift control alt shiftl shiftr ctrll keycode 24 = Meta_Control_o
+ altgr control alt shiftl shiftr ctrll keycode 24 = Meta_Control_o
+ shift altgr control alt shiftl shiftr ctrll keycode 24 = Meta_Control_o
+keycode 25 = +p
+ shift keycode 25 = +P
+ altgr keycode 25 = +thorn
+ shift altgr keycode 25 = +THORN
+ control keycode 25 = Control_p
+ shift control keycode 25 = Control_p
+ altgr control keycode 25 = Control_p
+ shift altgr control keycode 25 = Control_p
+ alt keycode 25 = Meta_p
+ shift alt keycode 25 = Meta_P
+ altgr alt keycode 25 = Meta_p
+ shift altgr alt keycode 25 = Meta_P
+ control alt keycode 25 = Meta_Control_p
+ shift control alt keycode 25 = Meta_Control_p
+ altgr control alt keycode 25 = Meta_Control_p
+ shift altgr control alt keycode 25 = Meta_Control_p
+ shift shiftl keycode 25 = +P
+ altgr shiftl keycode 25 = +thorn
+ shift altgr shiftl keycode 25 = +THORN
+ control shiftl keycode 25 = Control_p
+ shift control shiftl keycode 25 = Control_p
+ altgr control shiftl keycode 25 = Control_p
+ shift altgr control shiftl keycode 25 = Control_p
+ alt shiftl keycode 25 = Meta_p
+ shift alt shiftl keycode 25 = Meta_P
+ altgr alt shiftl keycode 25 = Meta_p
+ shift altgr alt shiftl keycode 25 = Meta_P
+ control alt shiftl keycode 25 = Meta_Control_p
+ shift control alt shiftl keycode 25 = Meta_Control_p
+ altgr control alt shiftl keycode 25 = Meta_Control_p
+ shift altgr control alt shiftl keycode 25 = Meta_Control_p
+ shift shiftr keycode 25 = +P
+ altgr shiftr keycode 25 = +thorn
+ shift altgr shiftr keycode 25 = +THORN
+ control shiftr keycode 25 = Control_p
+ shift control shiftr keycode 25 = Control_p
+ altgr control shiftr keycode 25 = Control_p
+ shift altgr control shiftr keycode 25 = Control_p
+ alt shiftr keycode 25 = Meta_p
+ shift alt shiftr keycode 25 = Meta_P
+ altgr alt shiftr keycode 25 = Meta_p
+ shift altgr alt shiftr keycode 25 = Meta_P
+ control alt shiftr keycode 25 = Meta_Control_p
+ shift control alt shiftr keycode 25 = Meta_Control_p
+ altgr control alt shiftr keycode 25 = Meta_Control_p
+ shift altgr control alt shiftr keycode 25 = Meta_Control_p
+ shift shiftl shiftr keycode 25 = +P
+ altgr shiftl shiftr keycode 25 = +thorn
+ shift altgr shiftl shiftr keycode 25 = +THORN
+ control shiftl shiftr keycode 25 = Control_p
+ shift control shiftl shiftr keycode 25 = Control_p
+ altgr control shiftl shiftr keycode 25 = Control_p
+ shift altgr control shiftl shiftr keycode 25 = Control_p
+ alt shiftl shiftr keycode 25 = Meta_p
+ shift alt shiftl shiftr keycode 25 = Meta_P
+ altgr alt shiftl shiftr keycode 25 = Meta_p
+ shift altgr alt shiftl shiftr keycode 25 = Meta_P
+ control alt shiftl shiftr keycode 25 = Meta_Control_p
+ shift control alt shiftl shiftr keycode 25 = Meta_Control_p
+ altgr control alt shiftl shiftr keycode 25 = Meta_Control_p
+ shift altgr control alt shiftl shiftr keycode 25 = Meta_Control_p
+ ctrll keycode 25 = +P
+ altgr ctrll keycode 25 = +THORN
+ shift altgr ctrll keycode 25 = +thorn
+ control ctrll keycode 25 = Control_p
+ shift control ctrll keycode 25 = Control_p
+ altgr control ctrll keycode 25 = Control_p
+ shift altgr control ctrll keycode 25 = Control_p
+ alt ctrll keycode 25 = Meta_p
+ shift alt ctrll keycode 25 = Meta_P
+ altgr alt ctrll keycode 25 = Meta_p
+ shift altgr alt ctrll keycode 25 = Meta_P
+ control alt ctrll keycode 25 = Meta_Control_p
+ shift control alt ctrll keycode 25 = Meta_Control_p
+ altgr control alt ctrll keycode 25 = Meta_Control_p
+ shift altgr control alt ctrll keycode 25 = Meta_Control_p
+ shiftl ctrll keycode 25 = +P
+ altgr shiftl ctrll keycode 25 = +THORN
+ shift altgr shiftl ctrll keycode 25 = +thorn
+ control shiftl ctrll keycode 25 = Control_p
+ shift control shiftl ctrll keycode 25 = Control_p
+ altgr control shiftl ctrll keycode 25 = Control_p
+ shift altgr control shiftl ctrll keycode 25 = Control_p
+ alt shiftl ctrll keycode 25 = Meta_p
+ shift alt shiftl ctrll keycode 25 = Meta_P
+ altgr alt shiftl ctrll keycode 25 = Meta_p
+ shift altgr alt shiftl ctrll keycode 25 = Meta_P
+ control alt shiftl ctrll keycode 25 = Meta_Control_p
+ shift control alt shiftl ctrll keycode 25 = Meta_Control_p
+ altgr control alt shiftl ctrll keycode 25 = Meta_Control_p
+ shift altgr control alt shiftl ctrll keycode 25 = Meta_Control_p
+ shiftr ctrll keycode 25 = +P
+ altgr shiftr ctrll keycode 25 = +THORN
+ shift altgr shiftr ctrll keycode 25 = +thorn
+ control shiftr ctrll keycode 25 = Control_p
+ shift control shiftr ctrll keycode 25 = Control_p
+ altgr control shiftr ctrll keycode 25 = Control_p
+ shift altgr control shiftr ctrll keycode 25 = Control_p
+ alt shiftr ctrll keycode 25 = Meta_p
+ shift alt shiftr ctrll keycode 25 = Meta_P
+ altgr alt shiftr ctrll keycode 25 = Meta_p
+ shift altgr alt shiftr ctrll keycode 25 = Meta_P
+ control alt shiftr ctrll keycode 25 = Meta_Control_p
+ shift control alt shiftr ctrll keycode 25 = Meta_Control_p
+ altgr control alt shiftr ctrll keycode 25 = Meta_Control_p
+ shift altgr control alt shiftr ctrll keycode 25 = Meta_Control_p
+ shiftl shiftr ctrll keycode 25 = +P
+ altgr shiftl shiftr ctrll keycode 25 = +THORN
+ shift altgr shiftl shiftr ctrll keycode 25 = +thorn
+ control shiftl shiftr ctrll keycode 25 = Control_p
+ shift control shiftl shiftr ctrll keycode 25 = Control_p
+ altgr control shiftl shiftr ctrll keycode 25 = Control_p
+ shift altgr control shiftl shiftr ctrll keycode 25 = Control_p
+ alt shiftl shiftr ctrll keycode 25 = Meta_p
+ shift alt shiftl shiftr ctrll keycode 25 = Meta_P
+ altgr alt shiftl shiftr ctrll keycode 25 = Meta_p
+ shift altgr alt shiftl shiftr ctrll keycode 25 = Meta_P
+ control alt shiftl shiftr ctrll keycode 25 = Meta_Control_p
+ shift control alt shiftl shiftr ctrll keycode 25 = Meta_Control_p
+ altgr control alt shiftl shiftr ctrll keycode 25 = Meta_Control_p
+ shift altgr control alt shiftl shiftr ctrll keycode 25 = Meta_Control_p
+keycode 26 = dead_acute
+ shift keycode 26 = dead_grave
+ altgr keycode 26 = apostrophe
+ shift altgr keycode 26 = grave
+ shift control keycode 26 = dead_grave
+ altgr control keycode 26 = Control_g
+ shift altgr control keycode 26 = nul
+ shift alt keycode 26 = dead_grave
+ altgr alt keycode 26 = Meta_apostrophe
+ shift altgr alt keycode 26 = Meta_grave
+ shift control alt keycode 26 = dead_grave
+ altgr control alt keycode 26 = Meta_Control_g
+ shift altgr control alt keycode 26 = Meta_nul
+ shift shiftl keycode 26 = dead_grave
+ altgr shiftl keycode 26 = apostrophe
+ shift altgr shiftl keycode 26 = grave
+ shift control shiftl keycode 26 = dead_grave
+ altgr control shiftl keycode 26 = Control_g
+ shift altgr control shiftl keycode 26 = nul
+ shift alt shiftl keycode 26 = dead_grave
+ altgr alt shiftl keycode 26 = Meta_apostrophe
+ shift altgr alt shiftl keycode 26 = Meta_grave
+ shift control alt shiftl keycode 26 = dead_grave
+ altgr control alt shiftl keycode 26 = Meta_Control_g
+ shift altgr control alt shiftl keycode 26 = Meta_nul
+ shift shiftr keycode 26 = dead_grave
+ altgr shiftr keycode 26 = apostrophe
+ shift altgr shiftr keycode 26 = grave
+ shift control shiftr keycode 26 = dead_grave
+ altgr control shiftr keycode 26 = Control_g
+ shift altgr control shiftr keycode 26 = nul
+ shift alt shiftr keycode 26 = dead_grave
+ altgr alt shiftr keycode 26 = Meta_apostrophe
+ shift altgr alt shiftr keycode 26 = Meta_grave
+ shift control alt shiftr keycode 26 = dead_grave
+ altgr control alt shiftr keycode 26 = Meta_Control_g
+ shift altgr control alt shiftr keycode 26 = Meta_nul
+ shift shiftl shiftr keycode 26 = dead_grave
+ altgr shiftl shiftr keycode 26 = apostrophe
+ shift altgr shiftl shiftr keycode 26 = grave
+ shift control shiftl shiftr keycode 26 = dead_grave
+ altgr control shiftl shiftr keycode 26 = Control_g
+ shift altgr control shiftl shiftr keycode 26 = nul
+ shift alt shiftl shiftr keycode 26 = dead_grave
+ altgr alt shiftl shiftr keycode 26 = Meta_apostrophe
+ shift altgr alt shiftl shiftr keycode 26 = Meta_grave
+ shift control alt shiftl shiftr keycode 26 = dead_grave
+ altgr control alt shiftl shiftr keycode 26 = Meta_Control_g
+ shift altgr control alt shiftl shiftr keycode 26 = Meta_nul
+ shift ctrll keycode 26 = dead_grave
+ altgr ctrll keycode 26 = apostrophe
+ shift altgr ctrll keycode 26 = grave
+ shift control ctrll keycode 26 = dead_grave
+ altgr control ctrll keycode 26 = Control_g
+ shift altgr control ctrll keycode 26 = nul
+ shift alt ctrll keycode 26 = dead_grave
+ altgr alt ctrll keycode 26 = Meta_apostrophe
+ shift altgr alt ctrll keycode 26 = Meta_grave
+ shift control alt ctrll keycode 26 = dead_grave
+ altgr control alt ctrll keycode 26 = Meta_Control_g
+ shift altgr control alt ctrll keycode 26 = Meta_nul
+ shift shiftl ctrll keycode 26 = dead_grave
+ altgr shiftl ctrll keycode 26 = apostrophe
+ shift altgr shiftl ctrll keycode 26 = grave
+ shift control shiftl ctrll keycode 26 = dead_grave
+ altgr control shiftl ctrll keycode 26 = Control_g
+ shift altgr control shiftl ctrll keycode 26 = nul
+ shift alt shiftl ctrll keycode 26 = dead_grave
+ altgr alt shiftl ctrll keycode 26 = Meta_apostrophe
+ shift altgr alt shiftl ctrll keycode 26 = Meta_grave
+ shift control alt shiftl ctrll keycode 26 = dead_grave
+ altgr control alt shiftl ctrll keycode 26 = Meta_Control_g
+ shift altgr control alt shiftl ctrll keycode 26 = Meta_nul
+ shift shiftr ctrll keycode 26 = dead_grave
+ altgr shiftr ctrll keycode 26 = apostrophe
+ shift altgr shiftr ctrll keycode 26 = grave
+ shift control shiftr ctrll keycode 26 = dead_grave
+ altgr control shiftr ctrll keycode 26 = Control_g
+ shift altgr control shiftr ctrll keycode 26 = nul
+ shift alt shiftr ctrll keycode 26 = dead_grave
+ altgr alt shiftr ctrll keycode 26 = Meta_apostrophe
+ shift altgr alt shiftr ctrll keycode 26 = Meta_grave
+ shift control alt shiftr ctrll keycode 26 = dead_grave
+ altgr control alt shiftr ctrll keycode 26 = Meta_Control_g
+ shift altgr control alt shiftr ctrll keycode 26 = Meta_nul
+ shift shiftl shiftr ctrll keycode 26 = dead_grave
+ altgr shiftl shiftr ctrll keycode 26 = apostrophe
+ shift altgr shiftl shiftr ctrll keycode 26 = grave
+ shift control shiftl shiftr ctrll keycode 26 = dead_grave
+ altgr control shiftl shiftr ctrll keycode 26 = Control_g
+ shift altgr control shiftl shiftr ctrll keycode 26 = nul
+ shift alt shiftl shiftr ctrll keycode 26 = dead_grave
+ altgr alt shiftl shiftr ctrll keycode 26 = Meta_apostrophe
+ shift altgr alt shiftl shiftr ctrll keycode 26 = Meta_grave
+ shift control alt shiftl shiftr ctrll keycode 26 = dead_grave
+ altgr control alt shiftl shiftr ctrll keycode 26 = Meta_Control_g
+ shift altgr control alt shiftl shiftr ctrll keycode 26 = Meta_nul
+keycode 27 = bracketleft
+ shift keycode 27 = braceleft
+ altgr keycode 27 = +ordfeminine
+ shift altgr keycode 27 = underscore
+ control keycode 27 = Escape
+ shift control keycode 27 = Escape
+ altgr control keycode 27 = Escape
+ shift altgr control keycode 27 = Control_underscore
+ alt keycode 27 = Meta_bracketleft
+ shift alt keycode 27 = Meta_braceleft
+ altgr alt keycode 27 = Meta_bracketleft
+ shift altgr alt keycode 27 = Meta_underscore
+ control alt keycode 27 = Meta_Escape
+ shift control alt keycode 27 = Meta_Escape
+ altgr control alt keycode 27 = Meta_Escape
+ shift altgr control alt keycode 27 = Meta_Control_underscore
+ shift shiftl keycode 27 = braceleft
+ altgr shiftl keycode 27 = +ordfeminine
+ shift altgr shiftl keycode 27 = underscore
+ control shiftl keycode 27 = Escape
+ shift control shiftl keycode 27 = Escape
+ altgr control shiftl keycode 27 = Escape
+ shift altgr control shiftl keycode 27 = Control_underscore
+ alt shiftl keycode 27 = Meta_bracketleft
+ shift alt shiftl keycode 27 = Meta_braceleft
+ altgr alt shiftl keycode 27 = Meta_bracketleft
+ shift altgr alt shiftl keycode 27 = Meta_underscore
+ control alt shiftl keycode 27 = Meta_Escape
+ shift control alt shiftl keycode 27 = Meta_Escape
+ altgr control alt shiftl keycode 27 = Meta_Escape
+ shift altgr control alt shiftl keycode 27 = Meta_Control_underscore
+ shift shiftr keycode 27 = braceleft
+ altgr shiftr keycode 27 = +ordfeminine
+ shift altgr shiftr keycode 27 = underscore
+ control shiftr keycode 27 = Escape
+ shift control shiftr keycode 27 = Escape
+ altgr control shiftr keycode 27 = Escape
+ shift altgr control shiftr keycode 27 = Control_underscore
+ alt shiftr keycode 27 = Meta_bracketleft
+ shift alt shiftr keycode 27 = Meta_braceleft
+ altgr alt shiftr keycode 27 = Meta_bracketleft
+ shift altgr alt shiftr keycode 27 = Meta_underscore
+ control alt shiftr keycode 27 = Meta_Escape
+ shift control alt shiftr keycode 27 = Meta_Escape
+ altgr control alt shiftr keycode 27 = Meta_Escape
+ shift altgr control alt shiftr keycode 27 = Meta_Control_underscore
+ shift shiftl shiftr keycode 27 = braceleft
+ altgr shiftl shiftr keycode 27 = +ordfeminine
+ shift altgr shiftl shiftr keycode 27 = underscore
+ control shiftl shiftr keycode 27 = Escape
+ shift control shiftl shiftr keycode 27 = Escape
+ altgr control shiftl shiftr keycode 27 = Escape
+ shift altgr control shiftl shiftr keycode 27 = Control_underscore
+ alt shiftl shiftr keycode 27 = Meta_bracketleft
+ shift alt shiftl shiftr keycode 27 = Meta_braceleft
+ altgr alt shiftl shiftr keycode 27 = Meta_bracketleft
+ shift altgr alt shiftl shiftr keycode 27 = Meta_underscore
+ control alt shiftl shiftr keycode 27 = Meta_Escape
+ shift control alt shiftl shiftr keycode 27 = Meta_Escape
+ altgr control alt shiftl shiftr keycode 27 = Meta_Escape
+ shift altgr control alt shiftl shiftr keycode 27 = Meta_Control_underscore
+ shift ctrll keycode 27 = braceleft
+ altgr ctrll keycode 27 = +ordfeminine
+ shift altgr ctrll keycode 27 = underscore
+ control ctrll keycode 27 = Escape
+ shift control ctrll keycode 27 = Escape
+ altgr control ctrll keycode 27 = Escape
+ shift altgr control ctrll keycode 27 = Control_underscore
+ alt ctrll keycode 27 = Meta_bracketleft
+ shift alt ctrll keycode 27 = Meta_braceleft
+ altgr alt ctrll keycode 27 = Meta_bracketleft
+ shift altgr alt ctrll keycode 27 = Meta_underscore
+ control alt ctrll keycode 27 = Meta_Escape
+ shift control alt ctrll keycode 27 = Meta_Escape
+ altgr control alt ctrll keycode 27 = Meta_Escape
+ shift altgr control alt ctrll keycode 27 = Meta_Control_underscore
+ shift shiftl ctrll keycode 27 = braceleft
+ altgr shiftl ctrll keycode 27 = +ordfeminine
+ shift altgr shiftl ctrll keycode 27 = underscore
+ control shiftl ctrll keycode 27 = Escape
+ shift control shiftl ctrll keycode 27 = Escape
+ altgr control shiftl ctrll keycode 27 = Escape
+ shift altgr control shiftl ctrll keycode 27 = Control_underscore
+ alt shiftl ctrll keycode 27 = Meta_bracketleft
+ shift alt shiftl ctrll keycode 27 = Meta_braceleft
+ altgr alt shiftl ctrll keycode 27 = Meta_bracketleft
+ shift altgr alt shiftl ctrll keycode 27 = Meta_underscore
+ control alt shiftl ctrll keycode 27 = Meta_Escape
+ shift control alt shiftl ctrll keycode 27 = Meta_Escape
+ altgr control alt shiftl ctrll keycode 27 = Meta_Escape
+ shift altgr control alt shiftl ctrll keycode 27 = Meta_Control_underscore
+ shift shiftr ctrll keycode 27 = braceleft
+ altgr shiftr ctrll keycode 27 = +ordfeminine
+ shift altgr shiftr ctrll keycode 27 = underscore
+ control shiftr ctrll keycode 27 = Escape
+ shift control shiftr ctrll keycode 27 = Escape
+ altgr control shiftr ctrll keycode 27 = Escape
+ shift altgr control shiftr ctrll keycode 27 = Control_underscore
+ alt shiftr ctrll keycode 27 = Meta_bracketleft
+ shift alt shiftr ctrll keycode 27 = Meta_braceleft
+ altgr alt shiftr ctrll keycode 27 = Meta_bracketleft
+ shift altgr alt shiftr ctrll keycode 27 = Meta_underscore
+ control alt shiftr ctrll keycode 27 = Meta_Escape
+ shift control alt shiftr ctrll keycode 27 = Meta_Escape
+ altgr control alt shiftr ctrll keycode 27 = Meta_Escape
+ shift altgr control alt shiftr ctrll keycode 27 = Meta_Control_underscore
+ shift shiftl shiftr ctrll keycode 27 = braceleft
+ altgr shiftl shiftr ctrll keycode 27 = +ordfeminine
+ shift altgr shiftl shiftr ctrll keycode 27 = underscore
+ control shiftl shiftr ctrll keycode 27 = Escape
+ shift control shiftl shiftr ctrll keycode 27 = Escape
+ altgr control shiftl shiftr ctrll keycode 27 = Escape
+ shift altgr control shiftl shiftr ctrll keycode 27 = Control_underscore
+ alt shiftl shiftr ctrll keycode 27 = Meta_bracketleft
+ shift alt shiftl shiftr ctrll keycode 27 = Meta_braceleft
+ altgr alt shiftl shiftr ctrll keycode 27 = Meta_bracketleft
+ shift altgr alt shiftl shiftr ctrll keycode 27 = Meta_underscore
+ control alt shiftl shiftr ctrll keycode 27 = Meta_Escape
+ shift control alt shiftl shiftr ctrll keycode 27 = Meta_Escape
+ altgr control alt shiftl shiftr ctrll keycode 27 = Meta_Escape
+ shift altgr control alt shiftl shiftr ctrll keycode 27 = Meta_Control_underscore
+keycode 28 = Return
+ control keycode 28 = Control_m
+ shift control keycode 28 = Control_m
+ altgr control keycode 28 = Control_m
+ shift altgr control keycode 28 = Control_m
+ alt keycode 28 = Meta_Control_m
+ shift alt keycode 28 = Meta_Control_m
+ altgr alt keycode 28 = Meta_Control_m
+ shift altgr alt keycode 28 = Meta_Control_m
+ control alt keycode 28 = Meta_Control_m
+ shift control alt keycode 28 = Meta_Control_m
+ altgr control alt keycode 28 = Meta_Control_m
+ shift altgr control alt keycode 28 = Meta_Control_m
+ control shiftl keycode 28 = Control_m
+ shift control shiftl keycode 28 = Control_m
+ altgr control shiftl keycode 28 = Control_m
+ shift altgr control shiftl keycode 28 = Control_m
+ alt shiftl keycode 28 = Meta_Control_m
+ shift alt shiftl keycode 28 = Meta_Control_m
+ altgr alt shiftl keycode 28 = Meta_Control_m
+ shift altgr alt shiftl keycode 28 = Meta_Control_m
+ control alt shiftl keycode 28 = Meta_Control_m
+ shift control alt shiftl keycode 28 = Meta_Control_m
+ altgr control alt shiftl keycode 28 = Meta_Control_m
+ shift altgr control alt shiftl keycode 28 = Meta_Control_m
+ control shiftr keycode 28 = Control_m
+ shift control shiftr keycode 28 = Control_m
+ altgr control shiftr keycode 28 = Control_m
+ shift altgr control shiftr keycode 28 = Control_m
+ alt shiftr keycode 28 = Meta_Control_m
+ shift alt shiftr keycode 28 = Meta_Control_m
+ altgr alt shiftr keycode 28 = Meta_Control_m
+ shift altgr alt shiftr keycode 28 = Meta_Control_m
+ control alt shiftr keycode 28 = Meta_Control_m
+ shift control alt shiftr keycode 28 = Meta_Control_m
+ altgr control alt shiftr keycode 28 = Meta_Control_m
+ shift altgr control alt shiftr keycode 28 = Meta_Control_m
+ control shiftl shiftr keycode 28 = Control_m
+ shift control shiftl shiftr keycode 28 = Control_m
+ altgr control shiftl shiftr keycode 28 = Control_m
+ shift altgr control shiftl shiftr keycode 28 = Control_m
+ alt shiftl shiftr keycode 28 = Meta_Control_m
+ shift alt shiftl shiftr keycode 28 = Meta_Control_m
+ altgr alt shiftl shiftr keycode 28 = Meta_Control_m
+ shift altgr alt shiftl shiftr keycode 28 = Meta_Control_m
+ control alt shiftl shiftr keycode 28 = Meta_Control_m
+ shift control alt shiftl shiftr keycode 28 = Meta_Control_m
+ altgr control alt shiftl shiftr keycode 28 = Meta_Control_m
+ shift altgr control alt shiftl shiftr keycode 28 = Meta_Control_m
+ control ctrll keycode 28 = Control_m
+ shift control ctrll keycode 28 = Control_m
+ altgr control ctrll keycode 28 = Control_m
+ shift altgr control ctrll keycode 28 = Control_m
+ alt ctrll keycode 28 = Meta_Control_m
+ shift alt ctrll keycode 28 = Meta_Control_m
+ altgr alt ctrll keycode 28 = Meta_Control_m
+ shift altgr alt ctrll keycode 28 = Meta_Control_m
+ control alt ctrll keycode 28 = Meta_Control_m
+ shift control alt ctrll keycode 28 = Meta_Control_m
+ altgr control alt ctrll keycode 28 = Meta_Control_m
+ shift altgr control alt ctrll keycode 28 = Meta_Control_m
+ control shiftl ctrll keycode 28 = Control_m
+ shift control shiftl ctrll keycode 28 = Control_m
+ altgr control shiftl ctrll keycode 28 = Control_m
+ shift altgr control shiftl ctrll keycode 28 = Control_m
+ alt shiftl ctrll keycode 28 = Meta_Control_m
+ shift alt shiftl ctrll keycode 28 = Meta_Control_m
+ altgr alt shiftl ctrll keycode 28 = Meta_Control_m
+ shift altgr alt shiftl ctrll keycode 28 = Meta_Control_m
+ control alt shiftl ctrll keycode 28 = Meta_Control_m
+ shift control alt shiftl ctrll keycode 28 = Meta_Control_m
+ altgr control alt shiftl ctrll keycode 28 = Meta_Control_m
+ shift altgr control alt shiftl ctrll keycode 28 = Meta_Control_m
+ control shiftr ctrll keycode 28 = Control_m
+ shift control shiftr ctrll keycode 28 = Control_m
+ altgr control shiftr ctrll keycode 28 = Control_m
+ shift altgr control shiftr ctrll keycode 28 = Control_m
+ alt shiftr ctrll keycode 28 = Meta_Control_m
+ shift alt shiftr ctrll keycode 28 = Meta_Control_m
+ altgr alt shiftr ctrll keycode 28 = Meta_Control_m
+ shift altgr alt shiftr ctrll keycode 28 = Meta_Control_m
+ control alt shiftr ctrll keycode 28 = Meta_Control_m
+ shift control alt shiftr ctrll keycode 28 = Meta_Control_m
+ altgr control alt shiftr ctrll keycode 28 = Meta_Control_m
+ shift altgr control alt shiftr ctrll keycode 28 = Meta_Control_m
+ control shiftl shiftr ctrll keycode 28 = Control_m
+ shift control shiftl shiftr ctrll keycode 28 = Control_m
+ altgr control shiftl shiftr ctrll keycode 28 = Control_m
+ shift altgr control shiftl shiftr ctrll keycode 28 = Control_m
+ alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ shift alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ altgr alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ shift altgr alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ control alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ shift control alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ altgr control alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ shift altgr control alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+keycode 29 = Control
+keycode 30 = +a
+ shift keycode 30 = +A
+ altgr keycode 30 = +ae
+ shift altgr keycode 30 = +AE
+ control keycode 30 = Control_a
+ shift control keycode 30 = Control_a
+ altgr control keycode 30 = Control_a
+ shift altgr control keycode 30 = Control_a
+ alt keycode 30 = Meta_a
+ shift alt keycode 30 = Meta_A
+ altgr alt keycode 30 = Meta_a
+ shift altgr alt keycode 30 = Meta_A
+ control alt keycode 30 = Meta_Control_a
+ shift control alt keycode 30 = Meta_Control_a
+ altgr control alt keycode 30 = Meta_Control_a
+ shift altgr control alt keycode 30 = Meta_Control_a
+ shift shiftl keycode 30 = +A
+ altgr shiftl keycode 30 = +ae
+ shift altgr shiftl keycode 30 = +AE
+ control shiftl keycode 30 = Control_a
+ shift control shiftl keycode 30 = Control_a
+ altgr control shiftl keycode 30 = Control_a
+ shift altgr control shiftl keycode 30 = Control_a
+ alt shiftl keycode 30 = Meta_a
+ shift alt shiftl keycode 30 = Meta_A
+ altgr alt shiftl keycode 30 = Meta_a
+ shift altgr alt shiftl keycode 30 = Meta_A
+ control alt shiftl keycode 30 = Meta_Control_a
+ shift control alt shiftl keycode 30 = Meta_Control_a
+ altgr control alt shiftl keycode 30 = Meta_Control_a
+ shift altgr control alt shiftl keycode 30 = Meta_Control_a
+ shift shiftr keycode 30 = +A
+ altgr shiftr keycode 30 = +ae
+ shift altgr shiftr keycode 30 = +AE
+ control shiftr keycode 30 = Control_a
+ shift control shiftr keycode 30 = Control_a
+ altgr control shiftr keycode 30 = Control_a
+ shift altgr control shiftr keycode 30 = Control_a
+ alt shiftr keycode 30 = Meta_a
+ shift alt shiftr keycode 30 = Meta_A
+ altgr alt shiftr keycode 30 = Meta_a
+ shift altgr alt shiftr keycode 30 = Meta_A
+ control alt shiftr keycode 30 = Meta_Control_a
+ shift control alt shiftr keycode 30 = Meta_Control_a
+ altgr control alt shiftr keycode 30 = Meta_Control_a
+ shift altgr control alt shiftr keycode 30 = Meta_Control_a
+ shift shiftl shiftr keycode 30 = +A
+ altgr shiftl shiftr keycode 30 = +ae
+ shift altgr shiftl shiftr keycode 30 = +AE
+ control shiftl shiftr keycode 30 = Control_a
+ shift control shiftl shiftr keycode 30 = Control_a
+ altgr control shiftl shiftr keycode 30 = Control_a
+ shift altgr control shiftl shiftr keycode 30 = Control_a
+ alt shiftl shiftr keycode 30 = Meta_a
+ shift alt shiftl shiftr keycode 30 = Meta_A
+ altgr alt shiftl shiftr keycode 30 = Meta_a
+ shift altgr alt shiftl shiftr keycode 30 = Meta_A
+ control alt shiftl shiftr keycode 30 = Meta_Control_a
+ shift control alt shiftl shiftr keycode 30 = Meta_Control_a
+ altgr control alt shiftl shiftr keycode 30 = Meta_Control_a
+ shift altgr control alt shiftl shiftr keycode 30 = Meta_Control_a
+ ctrll keycode 30 = +A
+ altgr ctrll keycode 30 = +AE
+ shift altgr ctrll keycode 30 = +ae
+ control ctrll keycode 30 = Control_a
+ shift control ctrll keycode 30 = Control_a
+ altgr control ctrll keycode 30 = Control_a
+ shift altgr control ctrll keycode 30 = Control_a
+ alt ctrll keycode 30 = Meta_a
+ shift alt ctrll keycode 30 = Meta_A
+ altgr alt ctrll keycode 30 = Meta_a
+ shift altgr alt ctrll keycode 30 = Meta_A
+ control alt ctrll keycode 30 = Meta_Control_a
+ shift control alt ctrll keycode 30 = Meta_Control_a
+ altgr control alt ctrll keycode 30 = Meta_Control_a
+ shift altgr control alt ctrll keycode 30 = Meta_Control_a
+ shiftl ctrll keycode 30 = +A
+ altgr shiftl ctrll keycode 30 = +AE
+ shift altgr shiftl ctrll keycode 30 = +ae
+ control shiftl ctrll keycode 30 = Control_a
+ shift control shiftl ctrll keycode 30 = Control_a
+ altgr control shiftl ctrll keycode 30 = Control_a
+ shift altgr control shiftl ctrll keycode 30 = Control_a
+ alt shiftl ctrll keycode 30 = Meta_a
+ shift alt shiftl ctrll keycode 30 = Meta_A
+ altgr alt shiftl ctrll keycode 30 = Meta_a
+ shift altgr alt shiftl ctrll keycode 30 = Meta_A
+ control alt shiftl ctrll keycode 30 = Meta_Control_a
+ shift control alt shiftl ctrll keycode 30 = Meta_Control_a
+ altgr control alt shiftl ctrll keycode 30 = Meta_Control_a
+ shift altgr control alt shiftl ctrll keycode 30 = Meta_Control_a
+ shiftr ctrll keycode 30 = +A
+ altgr shiftr ctrll keycode 30 = +AE
+ shift altgr shiftr ctrll keycode 30 = +ae
+ control shiftr ctrll keycode 30 = Control_a
+ shift control shiftr ctrll keycode 30 = Control_a
+ altgr control shiftr ctrll keycode 30 = Control_a
+ shift altgr control shiftr ctrll keycode 30 = Control_a
+ alt shiftr ctrll keycode 30 = Meta_a
+ shift alt shiftr ctrll keycode 30 = Meta_A
+ altgr alt shiftr ctrll keycode 30 = Meta_a
+ shift altgr alt shiftr ctrll keycode 30 = Meta_A
+ control alt shiftr ctrll keycode 30 = Meta_Control_a
+ shift control alt shiftr ctrll keycode 30 = Meta_Control_a
+ altgr control alt shiftr ctrll keycode 30 = Meta_Control_a
+ shift altgr control alt shiftr ctrll keycode 30 = Meta_Control_a
+ shiftl shiftr ctrll keycode 30 = +A
+ altgr shiftl shiftr ctrll keycode 30 = +AE
+ shift altgr shiftl shiftr ctrll keycode 30 = +ae
+ control shiftl shiftr ctrll keycode 30 = Control_a
+ shift control shiftl shiftr ctrll keycode 30 = Control_a
+ altgr control shiftl shiftr ctrll keycode 30 = Control_a
+ shift altgr control shiftl shiftr ctrll keycode 30 = Control_a
+ alt shiftl shiftr ctrll keycode 30 = Meta_a
+ shift alt shiftl shiftr ctrll keycode 30 = Meta_A
+ altgr alt shiftl shiftr ctrll keycode 30 = Meta_a
+ shift altgr alt shiftl shiftr ctrll keycode 30 = Meta_A
+ control alt shiftl shiftr ctrll keycode 30 = Meta_Control_a
+ shift control alt shiftl shiftr ctrll keycode 30 = Meta_Control_a
+ altgr control alt shiftl shiftr ctrll keycode 30 = Meta_Control_a
+ shift altgr control alt shiftl shiftr ctrll keycode 30 = Meta_Control_a
+keycode 31 = +s
+ shift keycode 31 = +S
+ altgr keycode 31 = +ssharp
+ shift altgr keycode 31 = section
+ control keycode 31 = Control_s
+ shift control keycode 31 = Control_s
+ altgr control keycode 31 = Control_s
+ shift altgr control keycode 31 = Control_s
+ alt keycode 31 = Meta_s
+ shift alt keycode 31 = Meta_S
+ altgr alt keycode 31 = Meta_s
+ shift altgr alt keycode 31 = Meta_S
+ control alt keycode 31 = Meta_Control_s
+ shift control alt keycode 31 = Meta_Control_s
+ altgr control alt keycode 31 = Meta_Control_s
+ shift altgr control alt keycode 31 = Meta_Control_s
+ shift shiftl keycode 31 = +S
+ altgr shiftl keycode 31 = +ssharp
+ shift altgr shiftl keycode 31 = section
+ control shiftl keycode 31 = Control_s
+ shift control shiftl keycode 31 = Control_s
+ altgr control shiftl keycode 31 = Control_s
+ shift altgr control shiftl keycode 31 = Control_s
+ alt shiftl keycode 31 = Meta_s
+ shift alt shiftl keycode 31 = Meta_S
+ altgr alt shiftl keycode 31 = Meta_s
+ shift altgr alt shiftl keycode 31 = Meta_S
+ control alt shiftl keycode 31 = Meta_Control_s
+ shift control alt shiftl keycode 31 = Meta_Control_s
+ altgr control alt shiftl keycode 31 = Meta_Control_s
+ shift altgr control alt shiftl keycode 31 = Meta_Control_s
+ shift shiftr keycode 31 = +S
+ altgr shiftr keycode 31 = +ssharp
+ shift altgr shiftr keycode 31 = section
+ control shiftr keycode 31 = Control_s
+ shift control shiftr keycode 31 = Control_s
+ altgr control shiftr keycode 31 = Control_s
+ shift altgr control shiftr keycode 31 = Control_s
+ alt shiftr keycode 31 = Meta_s
+ shift alt shiftr keycode 31 = Meta_S
+ altgr alt shiftr keycode 31 = Meta_s
+ shift altgr alt shiftr keycode 31 = Meta_S
+ control alt shiftr keycode 31 = Meta_Control_s
+ shift control alt shiftr keycode 31 = Meta_Control_s
+ altgr control alt shiftr keycode 31 = Meta_Control_s
+ shift altgr control alt shiftr keycode 31 = Meta_Control_s
+ shift shiftl shiftr keycode 31 = +S
+ altgr shiftl shiftr keycode 31 = +ssharp
+ shift altgr shiftl shiftr keycode 31 = section
+ control shiftl shiftr keycode 31 = Control_s
+ shift control shiftl shiftr keycode 31 = Control_s
+ altgr control shiftl shiftr keycode 31 = Control_s
+ shift altgr control shiftl shiftr keycode 31 = Control_s
+ alt shiftl shiftr keycode 31 = Meta_s
+ shift alt shiftl shiftr keycode 31 = Meta_S
+ altgr alt shiftl shiftr keycode 31 = Meta_s
+ shift altgr alt shiftl shiftr keycode 31 = Meta_S
+ control alt shiftl shiftr keycode 31 = Meta_Control_s
+ shift control alt shiftl shiftr keycode 31 = Meta_Control_s
+ altgr control alt shiftl shiftr keycode 31 = Meta_Control_s
+ shift altgr control alt shiftl shiftr keycode 31 = Meta_Control_s
+ ctrll keycode 31 = +S
+ altgr ctrll keycode 31 = +S
+ shift altgr ctrll keycode 31 = section
+ control ctrll keycode 31 = Control_s
+ shift control ctrll keycode 31 = Control_s
+ altgr control ctrll keycode 31 = Control_s
+ shift altgr control ctrll keycode 31 = Control_s
+ alt ctrll keycode 31 = Meta_s
+ shift alt ctrll keycode 31 = Meta_S
+ altgr alt ctrll keycode 31 = Meta_s
+ shift altgr alt ctrll keycode 31 = Meta_S
+ control alt ctrll keycode 31 = Meta_Control_s
+ shift control alt ctrll keycode 31 = Meta_Control_s
+ altgr control alt ctrll keycode 31 = Meta_Control_s
+ shift altgr control alt ctrll keycode 31 = Meta_Control_s
+ shiftl ctrll keycode 31 = +S
+ altgr shiftl ctrll keycode 31 = +S
+ shift altgr shiftl ctrll keycode 31 = section
+ control shiftl ctrll keycode 31 = Control_s
+ shift control shiftl ctrll keycode 31 = Control_s
+ altgr control shiftl ctrll keycode 31 = Control_s
+ shift altgr control shiftl ctrll keycode 31 = Control_s
+ alt shiftl ctrll keycode 31 = Meta_s
+ shift alt shiftl ctrll keycode 31 = Meta_S
+ altgr alt shiftl ctrll keycode 31 = Meta_s
+ shift altgr alt shiftl ctrll keycode 31 = Meta_S
+ control alt shiftl ctrll keycode 31 = Meta_Control_s
+ shift control alt shiftl ctrll keycode 31 = Meta_Control_s
+ altgr control alt shiftl ctrll keycode 31 = Meta_Control_s
+ shift altgr control alt shiftl ctrll keycode 31 = Meta_Control_s
+ shiftr ctrll keycode 31 = +S
+ altgr shiftr ctrll keycode 31 = +S
+ shift altgr shiftr ctrll keycode 31 = section
+ control shiftr ctrll keycode 31 = Control_s
+ shift control shiftr ctrll keycode 31 = Control_s
+ altgr control shiftr ctrll keycode 31 = Control_s
+ shift altgr control shiftr ctrll keycode 31 = Control_s
+ alt shiftr ctrll keycode 31 = Meta_s
+ shift alt shiftr ctrll keycode 31 = Meta_S
+ altgr alt shiftr ctrll keycode 31 = Meta_s
+ shift altgr alt shiftr ctrll keycode 31 = Meta_S
+ control alt shiftr ctrll keycode 31 = Meta_Control_s
+ shift control alt shiftr ctrll keycode 31 = Meta_Control_s
+ altgr control alt shiftr ctrll keycode 31 = Meta_Control_s
+ shift altgr control alt shiftr ctrll keycode 31 = Meta_Control_s
+ shiftl shiftr ctrll keycode 31 = +S
+ altgr shiftl shiftr ctrll keycode 31 = +S
+ shift altgr shiftl shiftr ctrll keycode 31 = section
+ control shiftl shiftr ctrll keycode 31 = Control_s
+ shift control shiftl shiftr ctrll keycode 31 = Control_s
+ altgr control shiftl shiftr ctrll keycode 31 = Control_s
+ shift altgr control shiftl shiftr ctrll keycode 31 = Control_s
+ alt shiftl shiftr ctrll keycode 31 = Meta_s
+ shift alt shiftl shiftr ctrll keycode 31 = Meta_S
+ altgr alt shiftl shiftr ctrll keycode 31 = Meta_s
+ shift altgr alt shiftl shiftr ctrll keycode 31 = Meta_S
+ control alt shiftl shiftr ctrll keycode 31 = Meta_Control_s
+ shift control alt shiftl shiftr ctrll keycode 31 = Meta_Control_s
+ altgr control alt shiftl shiftr ctrll keycode 31 = Meta_Control_s
+ shift altgr control alt shiftl shiftr ctrll keycode 31 = Meta_Control_s
+keycode 32 = +d
+ shift keycode 32 = +D
+ altgr keycode 32 = +eth
+ shift altgr keycode 32 = +ETH
+ control keycode 32 = Control_d
+ shift control keycode 32 = Control_d
+ altgr control keycode 32 = Control_d
+ shift altgr control keycode 32 = Control_d
+ alt keycode 32 = Meta_d
+ shift alt keycode 32 = Meta_D
+ altgr alt keycode 32 = Meta_d
+ shift altgr alt keycode 32 = Meta_D
+ control alt keycode 32 = Meta_Control_d
+ shift control alt keycode 32 = Meta_Control_d
+ altgr control alt keycode 32 = Meta_Control_d
+ shift altgr control alt keycode 32 = Meta_Control_d
+ shift shiftl keycode 32 = +D
+ altgr shiftl keycode 32 = +eth
+ shift altgr shiftl keycode 32 = +ETH
+ control shiftl keycode 32 = Control_d
+ shift control shiftl keycode 32 = Control_d
+ altgr control shiftl keycode 32 = Control_d
+ shift altgr control shiftl keycode 32 = Control_d
+ alt shiftl keycode 32 = Meta_d
+ shift alt shiftl keycode 32 = Meta_D
+ altgr alt shiftl keycode 32 = Meta_d
+ shift altgr alt shiftl keycode 32 = Meta_D
+ control alt shiftl keycode 32 = Meta_Control_d
+ shift control alt shiftl keycode 32 = Meta_Control_d
+ altgr control alt shiftl keycode 32 = Meta_Control_d
+ shift altgr control alt shiftl keycode 32 = Meta_Control_d
+ shift shiftr keycode 32 = +D
+ altgr shiftr keycode 32 = +eth
+ shift altgr shiftr keycode 32 = +ETH
+ control shiftr keycode 32 = Control_d
+ shift control shiftr keycode 32 = Control_d
+ altgr control shiftr keycode 32 = Control_d
+ shift altgr control shiftr keycode 32 = Control_d
+ alt shiftr keycode 32 = Meta_d
+ shift alt shiftr keycode 32 = Meta_D
+ altgr alt shiftr keycode 32 = Meta_d
+ shift altgr alt shiftr keycode 32 = Meta_D
+ control alt shiftr keycode 32 = Meta_Control_d
+ shift control alt shiftr keycode 32 = Meta_Control_d
+ altgr control alt shiftr keycode 32 = Meta_Control_d
+ shift altgr control alt shiftr keycode 32 = Meta_Control_d
+ shift shiftl shiftr keycode 32 = +D
+ altgr shiftl shiftr keycode 32 = +eth
+ shift altgr shiftl shiftr keycode 32 = +ETH
+ control shiftl shiftr keycode 32 = Control_d
+ shift control shiftl shiftr keycode 32 = Control_d
+ altgr control shiftl shiftr keycode 32 = Control_d
+ shift altgr control shiftl shiftr keycode 32 = Control_d
+ alt shiftl shiftr keycode 32 = Meta_d
+ shift alt shiftl shiftr keycode 32 = Meta_D
+ altgr alt shiftl shiftr keycode 32 = Meta_d
+ shift altgr alt shiftl shiftr keycode 32 = Meta_D
+ control alt shiftl shiftr keycode 32 = Meta_Control_d
+ shift control alt shiftl shiftr keycode 32 = Meta_Control_d
+ altgr control alt shiftl shiftr keycode 32 = Meta_Control_d
+ shift altgr control alt shiftl shiftr keycode 32 = Meta_Control_d
+ ctrll keycode 32 = +D
+ altgr ctrll keycode 32 = +ETH
+ shift altgr ctrll keycode 32 = +eth
+ control ctrll keycode 32 = Control_d
+ shift control ctrll keycode 32 = Control_d
+ altgr control ctrll keycode 32 = Control_d
+ shift altgr control ctrll keycode 32 = Control_d
+ alt ctrll keycode 32 = Meta_d
+ shift alt ctrll keycode 32 = Meta_D
+ altgr alt ctrll keycode 32 = Meta_d
+ shift altgr alt ctrll keycode 32 = Meta_D
+ control alt ctrll keycode 32 = Meta_Control_d
+ shift control alt ctrll keycode 32 = Meta_Control_d
+ altgr control alt ctrll keycode 32 = Meta_Control_d
+ shift altgr control alt ctrll keycode 32 = Meta_Control_d
+ shiftl ctrll keycode 32 = +D
+ altgr shiftl ctrll keycode 32 = +ETH
+ shift altgr shiftl ctrll keycode 32 = +eth
+ control shiftl ctrll keycode 32 = Control_d
+ shift control shiftl ctrll keycode 32 = Control_d
+ altgr control shiftl ctrll keycode 32 = Control_d
+ shift altgr control shiftl ctrll keycode 32 = Control_d
+ alt shiftl ctrll keycode 32 = Meta_d
+ shift alt shiftl ctrll keycode 32 = Meta_D
+ altgr alt shiftl ctrll keycode 32 = Meta_d
+ shift altgr alt shiftl ctrll keycode 32 = Meta_D
+ control alt shiftl ctrll keycode 32 = Meta_Control_d
+ shift control alt shiftl ctrll keycode 32 = Meta_Control_d
+ altgr control alt shiftl ctrll keycode 32 = Meta_Control_d
+ shift altgr control alt shiftl ctrll keycode 32 = Meta_Control_d
+ shiftr ctrll keycode 32 = +D
+ altgr shiftr ctrll keycode 32 = +ETH
+ shift altgr shiftr ctrll keycode 32 = +eth
+ control shiftr ctrll keycode 32 = Control_d
+ shift control shiftr ctrll keycode 32 = Control_d
+ altgr control shiftr ctrll keycode 32 = Control_d
+ shift altgr control shiftr ctrll keycode 32 = Control_d
+ alt shiftr ctrll keycode 32 = Meta_d
+ shift alt shiftr ctrll keycode 32 = Meta_D
+ altgr alt shiftr ctrll keycode 32 = Meta_d
+ shift altgr alt shiftr ctrll keycode 32 = Meta_D
+ control alt shiftr ctrll keycode 32 = Meta_Control_d
+ shift control alt shiftr ctrll keycode 32 = Meta_Control_d
+ altgr control alt shiftr ctrll keycode 32 = Meta_Control_d
+ shift altgr control alt shiftr ctrll keycode 32 = Meta_Control_d
+ shiftl shiftr ctrll keycode 32 = +D
+ altgr shiftl shiftr ctrll keycode 32 = +ETH
+ shift altgr shiftl shiftr ctrll keycode 32 = +eth
+ control shiftl shiftr ctrll keycode 32 = Control_d
+ shift control shiftl shiftr ctrll keycode 32 = Control_d
+ altgr control shiftl shiftr ctrll keycode 32 = Control_d
+ shift altgr control shiftl shiftr ctrll keycode 32 = Control_d
+ alt shiftl shiftr ctrll keycode 32 = Meta_d
+ shift alt shiftl shiftr ctrll keycode 32 = Meta_D
+ altgr alt shiftl shiftr ctrll keycode 32 = Meta_d
+ shift altgr alt shiftl shiftr ctrll keycode 32 = Meta_D
+ control alt shiftl shiftr ctrll keycode 32 = Meta_Control_d
+ shift control alt shiftl shiftr ctrll keycode 32 = Meta_Control_d
+ altgr control alt shiftl shiftr ctrll keycode 32 = Meta_Control_d
+ shift altgr control alt shiftl shiftr ctrll keycode 32 = Meta_Control_d
+keycode 33 = +f
+ shift keycode 33 = +F
+ altgr keycode 33 = dstroke
+ shift altgr keycode 33 = +ordfeminine
+ control keycode 33 = Control_f
+ shift control keycode 33 = Control_f
+ altgr control keycode 33 = Control_f
+ shift altgr control keycode 33 = Control_f
+ alt keycode 33 = Meta_f
+ shift alt keycode 33 = Meta_F
+ altgr alt keycode 33 = Meta_f
+ shift altgr alt keycode 33 = Meta_F
+ control alt keycode 33 = Meta_Control_f
+ shift control alt keycode 33 = Meta_Control_f
+ altgr control alt keycode 33 = Meta_Control_f
+ shift altgr control alt keycode 33 = Meta_Control_f
+ shift shiftl keycode 33 = +F
+ altgr shiftl keycode 33 = dstroke
+ shift altgr shiftl keycode 33 = +ordfeminine
+ control shiftl keycode 33 = Control_f
+ shift control shiftl keycode 33 = Control_f
+ altgr control shiftl keycode 33 = Control_f
+ shift altgr control shiftl keycode 33 = Control_f
+ alt shiftl keycode 33 = Meta_f
+ shift alt shiftl keycode 33 = Meta_F
+ altgr alt shiftl keycode 33 = Meta_f
+ shift altgr alt shiftl keycode 33 = Meta_F
+ control alt shiftl keycode 33 = Meta_Control_f
+ shift control alt shiftl keycode 33 = Meta_Control_f
+ altgr control alt shiftl keycode 33 = Meta_Control_f
+ shift altgr control alt shiftl keycode 33 = Meta_Control_f
+ shift shiftr keycode 33 = +F
+ altgr shiftr keycode 33 = dstroke
+ shift altgr shiftr keycode 33 = +ordfeminine
+ control shiftr keycode 33 = Control_f
+ shift control shiftr keycode 33 = Control_f
+ altgr control shiftr keycode 33 = Control_f
+ shift altgr control shiftr keycode 33 = Control_f
+ alt shiftr keycode 33 = Meta_f
+ shift alt shiftr keycode 33 = Meta_F
+ altgr alt shiftr keycode 33 = Meta_f
+ shift altgr alt shiftr keycode 33 = Meta_F
+ control alt shiftr keycode 33 = Meta_Control_f
+ shift control alt shiftr keycode 33 = Meta_Control_f
+ altgr control alt shiftr keycode 33 = Meta_Control_f
+ shift altgr control alt shiftr keycode 33 = Meta_Control_f
+ shift shiftl shiftr keycode 33 = +F
+ altgr shiftl shiftr keycode 33 = dstroke
+ shift altgr shiftl shiftr keycode 33 = +ordfeminine
+ control shiftl shiftr keycode 33 = Control_f
+ shift control shiftl shiftr keycode 33 = Control_f
+ altgr control shiftl shiftr keycode 33 = Control_f
+ shift altgr control shiftl shiftr keycode 33 = Control_f
+ alt shiftl shiftr keycode 33 = Meta_f
+ shift alt shiftl shiftr keycode 33 = Meta_F
+ altgr alt shiftl shiftr keycode 33 = Meta_f
+ shift altgr alt shiftl shiftr keycode 33 = Meta_F
+ control alt shiftl shiftr keycode 33 = Meta_Control_f
+ shift control alt shiftl shiftr keycode 33 = Meta_Control_f
+ altgr control alt shiftl shiftr keycode 33 = Meta_Control_f
+ shift altgr control alt shiftl shiftr keycode 33 = Meta_Control_f
+ ctrll keycode 33 = +F
+ altgr ctrll keycode 33 = Dstroke
+ shift altgr ctrll keycode 33 = +ordfeminine
+ control ctrll keycode 33 = Control_f
+ shift control ctrll keycode 33 = Control_f
+ altgr control ctrll keycode 33 = Control_f
+ shift altgr control ctrll keycode 33 = Control_f
+ alt ctrll keycode 33 = Meta_f
+ shift alt ctrll keycode 33 = Meta_F
+ altgr alt ctrll keycode 33 = Meta_f
+ shift altgr alt ctrll keycode 33 = Meta_F
+ control alt ctrll keycode 33 = Meta_Control_f
+ shift control alt ctrll keycode 33 = Meta_Control_f
+ altgr control alt ctrll keycode 33 = Meta_Control_f
+ shift altgr control alt ctrll keycode 33 = Meta_Control_f
+ shiftl ctrll keycode 33 = +F
+ altgr shiftl ctrll keycode 33 = Dstroke
+ shift altgr shiftl ctrll keycode 33 = +ordfeminine
+ control shiftl ctrll keycode 33 = Control_f
+ shift control shiftl ctrll keycode 33 = Control_f
+ altgr control shiftl ctrll keycode 33 = Control_f
+ shift altgr control shiftl ctrll keycode 33 = Control_f
+ alt shiftl ctrll keycode 33 = Meta_f
+ shift alt shiftl ctrll keycode 33 = Meta_F
+ altgr alt shiftl ctrll keycode 33 = Meta_f
+ shift altgr alt shiftl ctrll keycode 33 = Meta_F
+ control alt shiftl ctrll keycode 33 = Meta_Control_f
+ shift control alt shiftl ctrll keycode 33 = Meta_Control_f
+ altgr control alt shiftl ctrll keycode 33 = Meta_Control_f
+ shift altgr control alt shiftl ctrll keycode 33 = Meta_Control_f
+ shiftr ctrll keycode 33 = +F
+ altgr shiftr ctrll keycode 33 = Dstroke
+ shift altgr shiftr ctrll keycode 33 = +ordfeminine
+ control shiftr ctrll keycode 33 = Control_f
+ shift control shiftr ctrll keycode 33 = Control_f
+ altgr control shiftr ctrll keycode 33 = Control_f
+ shift altgr control shiftr ctrll keycode 33 = Control_f
+ alt shiftr ctrll keycode 33 = Meta_f
+ shift alt shiftr ctrll keycode 33 = Meta_F
+ altgr alt shiftr ctrll keycode 33 = Meta_f
+ shift altgr alt shiftr ctrll keycode 33 = Meta_F
+ control alt shiftr ctrll keycode 33 = Meta_Control_f
+ shift control alt shiftr ctrll keycode 33 = Meta_Control_f
+ altgr control alt shiftr ctrll keycode 33 = Meta_Control_f
+ shift altgr control alt shiftr ctrll keycode 33 = Meta_Control_f
+ shiftl shiftr ctrll keycode 33 = +F
+ altgr shiftl shiftr ctrll keycode 33 = Dstroke
+ shift altgr shiftl shiftr ctrll keycode 33 = +ordfeminine
+ control shiftl shiftr ctrll keycode 33 = Control_f
+ shift control shiftl shiftr ctrll keycode 33 = Control_f
+ altgr control shiftl shiftr ctrll keycode 33 = Control_f
+ shift altgr control shiftl shiftr ctrll keycode 33 = Control_f
+ alt shiftl shiftr ctrll keycode 33 = Meta_f
+ shift alt shiftl shiftr ctrll keycode 33 = Meta_F
+ altgr alt shiftl shiftr ctrll keycode 33 = Meta_f
+ shift altgr alt shiftl shiftr ctrll keycode 33 = Meta_F
+ control alt shiftl shiftr ctrll keycode 33 = Meta_Control_f
+ shift control alt shiftl shiftr ctrll keycode 33 = Meta_Control_f
+ altgr control alt shiftl shiftr ctrll keycode 33 = Meta_Control_f
+ shift altgr control alt shiftl shiftr ctrll keycode 33 = Meta_Control_f
+keycode 34 = +g
+ shift keycode 34 = +G
+ altgr keycode 34 = eng
+ shift altgr keycode 34 = ENG
+ control keycode 34 = Control_g
+ shift control keycode 34 = Control_g
+ altgr control keycode 34 = Control_g
+ shift altgr control keycode 34 = Control_g
+ alt keycode 34 = Meta_g
+ shift alt keycode 34 = Meta_G
+ altgr alt keycode 34 = Meta_g
+ shift altgr alt keycode 34 = Meta_G
+ control alt keycode 34 = Meta_Control_g
+ shift control alt keycode 34 = Meta_Control_g
+ altgr control alt keycode 34 = Meta_Control_g
+ shift altgr control alt keycode 34 = Meta_Control_g
+ shift shiftl keycode 34 = +G
+ altgr shiftl keycode 34 = eng
+ shift altgr shiftl keycode 34 = ENG
+ control shiftl keycode 34 = Control_g
+ shift control shiftl keycode 34 = Control_g
+ altgr control shiftl keycode 34 = Control_g
+ shift altgr control shiftl keycode 34 = Control_g
+ alt shiftl keycode 34 = Meta_g
+ shift alt shiftl keycode 34 = Meta_G
+ altgr alt shiftl keycode 34 = Meta_g
+ shift altgr alt shiftl keycode 34 = Meta_G
+ control alt shiftl keycode 34 = Meta_Control_g
+ shift control alt shiftl keycode 34 = Meta_Control_g
+ altgr control alt shiftl keycode 34 = Meta_Control_g
+ shift altgr control alt shiftl keycode 34 = Meta_Control_g
+ shift shiftr keycode 34 = +G
+ altgr shiftr keycode 34 = eng
+ shift altgr shiftr keycode 34 = ENG
+ control shiftr keycode 34 = Control_g
+ shift control shiftr keycode 34 = Control_g
+ altgr control shiftr keycode 34 = Control_g
+ shift altgr control shiftr keycode 34 = Control_g
+ alt shiftr keycode 34 = Meta_g
+ shift alt shiftr keycode 34 = Meta_G
+ altgr alt shiftr keycode 34 = Meta_g
+ shift altgr alt shiftr keycode 34 = Meta_G
+ control alt shiftr keycode 34 = Meta_Control_g
+ shift control alt shiftr keycode 34 = Meta_Control_g
+ altgr control alt shiftr keycode 34 = Meta_Control_g
+ shift altgr control alt shiftr keycode 34 = Meta_Control_g
+ shift shiftl shiftr keycode 34 = +G
+ altgr shiftl shiftr keycode 34 = eng
+ shift altgr shiftl shiftr keycode 34 = ENG
+ control shiftl shiftr keycode 34 = Control_g
+ shift control shiftl shiftr keycode 34 = Control_g
+ altgr control shiftl shiftr keycode 34 = Control_g
+ shift altgr control shiftl shiftr keycode 34 = Control_g
+ alt shiftl shiftr keycode 34 = Meta_g
+ shift alt shiftl shiftr keycode 34 = Meta_G
+ altgr alt shiftl shiftr keycode 34 = Meta_g
+ shift altgr alt shiftl shiftr keycode 34 = Meta_G
+ control alt shiftl shiftr keycode 34 = Meta_Control_g
+ shift control alt shiftl shiftr keycode 34 = Meta_Control_g
+ altgr control alt shiftl shiftr keycode 34 = Meta_Control_g
+ shift altgr control alt shiftl shiftr keycode 34 = Meta_Control_g
+ ctrll keycode 34 = +G
+ altgr ctrll keycode 34 = ENG
+ shift altgr ctrll keycode 34 = eng
+ control ctrll keycode 34 = Control_g
+ shift control ctrll keycode 34 = Control_g
+ altgr control ctrll keycode 34 = Control_g
+ shift altgr control ctrll keycode 34 = Control_g
+ alt ctrll keycode 34 = Meta_g
+ shift alt ctrll keycode 34 = Meta_G
+ altgr alt ctrll keycode 34 = Meta_g
+ shift altgr alt ctrll keycode 34 = Meta_G
+ control alt ctrll keycode 34 = Meta_Control_g
+ shift control alt ctrll keycode 34 = Meta_Control_g
+ altgr control alt ctrll keycode 34 = Meta_Control_g
+ shift altgr control alt ctrll keycode 34 = Meta_Control_g
+ shiftl ctrll keycode 34 = +G
+ altgr shiftl ctrll keycode 34 = ENG
+ shift altgr shiftl ctrll keycode 34 = eng
+ control shiftl ctrll keycode 34 = Control_g
+ shift control shiftl ctrll keycode 34 = Control_g
+ altgr control shiftl ctrll keycode 34 = Control_g
+ shift altgr control shiftl ctrll keycode 34 = Control_g
+ alt shiftl ctrll keycode 34 = Meta_g
+ shift alt shiftl ctrll keycode 34 = Meta_G
+ altgr alt shiftl ctrll keycode 34 = Meta_g
+ shift altgr alt shiftl ctrll keycode 34 = Meta_G
+ control alt shiftl ctrll keycode 34 = Meta_Control_g
+ shift control alt shiftl ctrll keycode 34 = Meta_Control_g
+ altgr control alt shiftl ctrll keycode 34 = Meta_Control_g
+ shift altgr control alt shiftl ctrll keycode 34 = Meta_Control_g
+ shiftr ctrll keycode 34 = +G
+ altgr shiftr ctrll keycode 34 = ENG
+ shift altgr shiftr ctrll keycode 34 = eng
+ control shiftr ctrll keycode 34 = Control_g
+ shift control shiftr ctrll keycode 34 = Control_g
+ altgr control shiftr ctrll keycode 34 = Control_g
+ shift altgr control shiftr ctrll keycode 34 = Control_g
+ alt shiftr ctrll keycode 34 = Meta_g
+ shift alt shiftr ctrll keycode 34 = Meta_G
+ altgr alt shiftr ctrll keycode 34 = Meta_g
+ shift altgr alt shiftr ctrll keycode 34 = Meta_G
+ control alt shiftr ctrll keycode 34 = Meta_Control_g
+ shift control alt shiftr ctrll keycode 34 = Meta_Control_g
+ altgr control alt shiftr ctrll keycode 34 = Meta_Control_g
+ shift altgr control alt shiftr ctrll keycode 34 = Meta_Control_g
+ shiftl shiftr ctrll keycode 34 = +G
+ altgr shiftl shiftr ctrll keycode 34 = ENG
+ shift altgr shiftl shiftr ctrll keycode 34 = eng
+ control shiftl shiftr ctrll keycode 34 = Control_g
+ shift control shiftl shiftr ctrll keycode 34 = Control_g
+ altgr control shiftl shiftr ctrll keycode 34 = Control_g
+ shift altgr control shiftl shiftr ctrll keycode 34 = Control_g
+ alt shiftl shiftr ctrll keycode 34 = Meta_g
+ shift alt shiftl shiftr ctrll keycode 34 = Meta_G
+ altgr alt shiftl shiftr ctrll keycode 34 = Meta_g
+ shift altgr alt shiftl shiftr ctrll keycode 34 = Meta_G
+ control alt shiftl shiftr ctrll keycode 34 = Meta_Control_g
+ shift control alt shiftl shiftr ctrll keycode 34 = Meta_Control_g
+ altgr control alt shiftl shiftr ctrll keycode 34 = Meta_Control_g
+ shift altgr control alt shiftl shiftr ctrll keycode 34 = Meta_Control_g
+keycode 35 = +h
+ shift keycode 35 = +H
+ altgr keycode 35 = hstroke
+ shift altgr keycode 35 = Hstroke
+ control keycode 35 = BackSpace
+ shift control keycode 35 = BackSpace
+ altgr control keycode 35 = BackSpace
+ shift altgr control keycode 35 = BackSpace
+ alt keycode 35 = Meta_h
+ shift alt keycode 35 = Meta_H
+ altgr alt keycode 35 = Meta_h
+ shift altgr alt keycode 35 = Meta_H
+ control alt keycode 35 = Meta_BackSpace
+ shift control alt keycode 35 = Meta_BackSpace
+ altgr control alt keycode 35 = Meta_BackSpace
+ shift altgr control alt keycode 35 = Meta_BackSpace
+ shift shiftl keycode 35 = +H
+ altgr shiftl keycode 35 = hstroke
+ shift altgr shiftl keycode 35 = Hstroke
+ control shiftl keycode 35 = BackSpace
+ shift control shiftl keycode 35 = BackSpace
+ altgr control shiftl keycode 35 = BackSpace
+ shift altgr control shiftl keycode 35 = BackSpace
+ alt shiftl keycode 35 = Meta_h
+ shift alt shiftl keycode 35 = Meta_H
+ altgr alt shiftl keycode 35 = Meta_h
+ shift altgr alt shiftl keycode 35 = Meta_H
+ control alt shiftl keycode 35 = Meta_BackSpace
+ shift control alt shiftl keycode 35 = Meta_BackSpace
+ altgr control alt shiftl keycode 35 = Meta_BackSpace
+ shift altgr control alt shiftl keycode 35 = Meta_BackSpace
+ shift shiftr keycode 35 = +H
+ altgr shiftr keycode 35 = hstroke
+ shift altgr shiftr keycode 35 = Hstroke
+ control shiftr keycode 35 = BackSpace
+ shift control shiftr keycode 35 = BackSpace
+ altgr control shiftr keycode 35 = BackSpace
+ shift altgr control shiftr keycode 35 = BackSpace
+ alt shiftr keycode 35 = Meta_h
+ shift alt shiftr keycode 35 = Meta_H
+ altgr alt shiftr keycode 35 = Meta_h
+ shift altgr alt shiftr keycode 35 = Meta_H
+ control alt shiftr keycode 35 = Meta_BackSpace
+ shift control alt shiftr keycode 35 = Meta_BackSpace
+ altgr control alt shiftr keycode 35 = Meta_BackSpace
+ shift altgr control alt shiftr keycode 35 = Meta_BackSpace
+ shift shiftl shiftr keycode 35 = +H
+ altgr shiftl shiftr keycode 35 = hstroke
+ shift altgr shiftl shiftr keycode 35 = Hstroke
+ control shiftl shiftr keycode 35 = BackSpace
+ shift control shiftl shiftr keycode 35 = BackSpace
+ altgr control shiftl shiftr keycode 35 = BackSpace
+ shift altgr control shiftl shiftr keycode 35 = BackSpace
+ alt shiftl shiftr keycode 35 = Meta_h
+ shift alt shiftl shiftr keycode 35 = Meta_H
+ altgr alt shiftl shiftr keycode 35 = Meta_h
+ shift altgr alt shiftl shiftr keycode 35 = Meta_H
+ control alt shiftl shiftr keycode 35 = Meta_BackSpace
+ shift control alt shiftl shiftr keycode 35 = Meta_BackSpace
+ altgr control alt shiftl shiftr keycode 35 = Meta_BackSpace
+ shift altgr control alt shiftl shiftr keycode 35 = Meta_BackSpace
+ ctrll keycode 35 = +H
+ altgr ctrll keycode 35 = Hstroke
+ shift altgr ctrll keycode 35 = hstroke
+ control ctrll keycode 35 = BackSpace
+ shift control ctrll keycode 35 = BackSpace
+ altgr control ctrll keycode 35 = BackSpace
+ shift altgr control ctrll keycode 35 = BackSpace
+ alt ctrll keycode 35 = Meta_h
+ shift alt ctrll keycode 35 = Meta_H
+ altgr alt ctrll keycode 35 = Meta_h
+ shift altgr alt ctrll keycode 35 = Meta_H
+ control alt ctrll keycode 35 = Meta_BackSpace
+ shift control alt ctrll keycode 35 = Meta_BackSpace
+ altgr control alt ctrll keycode 35 = Meta_BackSpace
+ shift altgr control alt ctrll keycode 35 = Meta_BackSpace
+ shiftl ctrll keycode 35 = +H
+ altgr shiftl ctrll keycode 35 = Hstroke
+ shift altgr shiftl ctrll keycode 35 = hstroke
+ control shiftl ctrll keycode 35 = BackSpace
+ shift control shiftl ctrll keycode 35 = BackSpace
+ altgr control shiftl ctrll keycode 35 = BackSpace
+ shift altgr control shiftl ctrll keycode 35 = BackSpace
+ alt shiftl ctrll keycode 35 = Meta_h
+ shift alt shiftl ctrll keycode 35 = Meta_H
+ altgr alt shiftl ctrll keycode 35 = Meta_h
+ shift altgr alt shiftl ctrll keycode 35 = Meta_H
+ control alt shiftl ctrll keycode 35 = Meta_BackSpace
+ shift control alt shiftl ctrll keycode 35 = Meta_BackSpace
+ altgr control alt shiftl ctrll keycode 35 = Meta_BackSpace
+ shift altgr control alt shiftl ctrll keycode 35 = Meta_BackSpace
+ shiftr ctrll keycode 35 = +H
+ altgr shiftr ctrll keycode 35 = Hstroke
+ shift altgr shiftr ctrll keycode 35 = hstroke
+ control shiftr ctrll keycode 35 = BackSpace
+ shift control shiftr ctrll keycode 35 = BackSpace
+ altgr control shiftr ctrll keycode 35 = BackSpace
+ shift altgr control shiftr ctrll keycode 35 = BackSpace
+ alt shiftr ctrll keycode 35 = Meta_h
+ shift alt shiftr ctrll keycode 35 = Meta_H
+ altgr alt shiftr ctrll keycode 35 = Meta_h
+ shift altgr alt shiftr ctrll keycode 35 = Meta_H
+ control alt shiftr ctrll keycode 35 = Meta_BackSpace
+ shift control alt shiftr ctrll keycode 35 = Meta_BackSpace
+ altgr control alt shiftr ctrll keycode 35 = Meta_BackSpace
+ shift altgr control alt shiftr ctrll keycode 35 = Meta_BackSpace
+ shiftl shiftr ctrll keycode 35 = +H
+ altgr shiftl shiftr ctrll keycode 35 = Hstroke
+ shift altgr shiftl shiftr ctrll keycode 35 = hstroke
+ control shiftl shiftr ctrll keycode 35 = BackSpace
+ shift control shiftl shiftr ctrll keycode 35 = BackSpace
+ altgr control shiftl shiftr ctrll keycode 35 = BackSpace
+ shift altgr control shiftl shiftr ctrll keycode 35 = BackSpace
+ alt shiftl shiftr ctrll keycode 35 = Meta_h
+ shift alt shiftl shiftr ctrll keycode 35 = Meta_H
+ altgr alt shiftl shiftr ctrll keycode 35 = Meta_h
+ shift altgr alt shiftl shiftr ctrll keycode 35 = Meta_H
+ control alt shiftl shiftr ctrll keycode 35 = Meta_BackSpace
+ shift control alt shiftl shiftr ctrll keycode 35 = Meta_BackSpace
+ altgr control alt shiftl shiftr ctrll keycode 35 = Meta_BackSpace
+ shift altgr control alt shiftl shiftr ctrll keycode 35 = Meta_BackSpace
+keycode 36 = +j
+ shift keycode 36 = +J
+ altgr keycode 36 = U+0309
+ shift altgr keycode 36 = U+031b
+ control keycode 36 = Linefeed
+ shift control keycode 36 = Linefeed
+ altgr control keycode 36 = Linefeed
+ shift altgr control keycode 36 = Linefeed
+ alt keycode 36 = Meta_j
+ shift alt keycode 36 = Meta_J
+ altgr alt keycode 36 = Meta_j
+ shift altgr alt keycode 36 = Meta_J
+ control alt keycode 36 = Meta_Linefeed
+ shift control alt keycode 36 = Meta_Linefeed
+ altgr control alt keycode 36 = Meta_Linefeed
+ shift altgr control alt keycode 36 = Meta_Linefeed
+ shift shiftl keycode 36 = +J
+ altgr shiftl keycode 36 = U+0309
+ shift altgr shiftl keycode 36 = U+031b
+ control shiftl keycode 36 = Linefeed
+ shift control shiftl keycode 36 = Linefeed
+ altgr control shiftl keycode 36 = Linefeed
+ shift altgr control shiftl keycode 36 = Linefeed
+ alt shiftl keycode 36 = Meta_j
+ shift alt shiftl keycode 36 = Meta_J
+ altgr alt shiftl keycode 36 = Meta_j
+ shift altgr alt shiftl keycode 36 = Meta_J
+ control alt shiftl keycode 36 = Meta_Linefeed
+ shift control alt shiftl keycode 36 = Meta_Linefeed
+ altgr control alt shiftl keycode 36 = Meta_Linefeed
+ shift altgr control alt shiftl keycode 36 = Meta_Linefeed
+ shift shiftr keycode 36 = +J
+ altgr shiftr keycode 36 = U+0309
+ shift altgr shiftr keycode 36 = U+031b
+ control shiftr keycode 36 = Linefeed
+ shift control shiftr keycode 36 = Linefeed
+ altgr control shiftr keycode 36 = Linefeed
+ shift altgr control shiftr keycode 36 = Linefeed
+ alt shiftr keycode 36 = Meta_j
+ shift alt shiftr keycode 36 = Meta_J
+ altgr alt shiftr keycode 36 = Meta_j
+ shift altgr alt shiftr keycode 36 = Meta_J
+ control alt shiftr keycode 36 = Meta_Linefeed
+ shift control alt shiftr keycode 36 = Meta_Linefeed
+ altgr control alt shiftr keycode 36 = Meta_Linefeed
+ shift altgr control alt shiftr keycode 36 = Meta_Linefeed
+ shift shiftl shiftr keycode 36 = +J
+ altgr shiftl shiftr keycode 36 = U+0309
+ shift altgr shiftl shiftr keycode 36 = U+031b
+ control shiftl shiftr keycode 36 = Linefeed
+ shift control shiftl shiftr keycode 36 = Linefeed
+ altgr control shiftl shiftr keycode 36 = Linefeed
+ shift altgr control shiftl shiftr keycode 36 = Linefeed
+ alt shiftl shiftr keycode 36 = Meta_j
+ shift alt shiftl shiftr keycode 36 = Meta_J
+ altgr alt shiftl shiftr keycode 36 = Meta_j
+ shift altgr alt shiftl shiftr keycode 36 = Meta_J
+ control alt shiftl shiftr keycode 36 = Meta_Linefeed
+ shift control alt shiftl shiftr keycode 36 = Meta_Linefeed
+ altgr control alt shiftl shiftr keycode 36 = Meta_Linefeed
+ shift altgr control alt shiftl shiftr keycode 36 = Meta_Linefeed
+ ctrll keycode 36 = +J
+ altgr ctrll keycode 36 = U+0309
+ shift altgr ctrll keycode 36 = U+031b
+ control ctrll keycode 36 = Linefeed
+ shift control ctrll keycode 36 = Linefeed
+ altgr control ctrll keycode 36 = Linefeed
+ shift altgr control ctrll keycode 36 = Linefeed
+ alt ctrll keycode 36 = Meta_j
+ shift alt ctrll keycode 36 = Meta_J
+ altgr alt ctrll keycode 36 = Meta_j
+ shift altgr alt ctrll keycode 36 = Meta_J
+ control alt ctrll keycode 36 = Meta_Linefeed
+ shift control alt ctrll keycode 36 = Meta_Linefeed
+ altgr control alt ctrll keycode 36 = Meta_Linefeed
+ shift altgr control alt ctrll keycode 36 = Meta_Linefeed
+ shiftl ctrll keycode 36 = +J
+ altgr shiftl ctrll keycode 36 = U+0309
+ shift altgr shiftl ctrll keycode 36 = U+031b
+ control shiftl ctrll keycode 36 = Linefeed
+ shift control shiftl ctrll keycode 36 = Linefeed
+ altgr control shiftl ctrll keycode 36 = Linefeed
+ shift altgr control shiftl ctrll keycode 36 = Linefeed
+ alt shiftl ctrll keycode 36 = Meta_j
+ shift alt shiftl ctrll keycode 36 = Meta_J
+ altgr alt shiftl ctrll keycode 36 = Meta_j
+ shift altgr alt shiftl ctrll keycode 36 = Meta_J
+ control alt shiftl ctrll keycode 36 = Meta_Linefeed
+ shift control alt shiftl ctrll keycode 36 = Meta_Linefeed
+ altgr control alt shiftl ctrll keycode 36 = Meta_Linefeed
+ shift altgr control alt shiftl ctrll keycode 36 = Meta_Linefeed
+ shiftr ctrll keycode 36 = +J
+ altgr shiftr ctrll keycode 36 = U+0309
+ shift altgr shiftr ctrll keycode 36 = U+031b
+ control shiftr ctrll keycode 36 = Linefeed
+ shift control shiftr ctrll keycode 36 = Linefeed
+ altgr control shiftr ctrll keycode 36 = Linefeed
+ shift altgr control shiftr ctrll keycode 36 = Linefeed
+ alt shiftr ctrll keycode 36 = Meta_j
+ shift alt shiftr ctrll keycode 36 = Meta_J
+ altgr alt shiftr ctrll keycode 36 = Meta_j
+ shift altgr alt shiftr ctrll keycode 36 = Meta_J
+ control alt shiftr ctrll keycode 36 = Meta_Linefeed
+ shift control alt shiftr ctrll keycode 36 = Meta_Linefeed
+ altgr control alt shiftr ctrll keycode 36 = Meta_Linefeed
+ shift altgr control alt shiftr ctrll keycode 36 = Meta_Linefeed
+ shiftl shiftr ctrll keycode 36 = +J
+ altgr shiftl shiftr ctrll keycode 36 = U+0309
+ shift altgr shiftl shiftr ctrll keycode 36 = U+031b
+ control shiftl shiftr ctrll keycode 36 = Linefeed
+ shift control shiftl shiftr ctrll keycode 36 = Linefeed
+ altgr control shiftl shiftr ctrll keycode 36 = Linefeed
+ shift altgr control shiftl shiftr ctrll keycode 36 = Linefeed
+ alt shiftl shiftr ctrll keycode 36 = Meta_j
+ shift alt shiftl shiftr ctrll keycode 36 = Meta_J
+ altgr alt shiftl shiftr ctrll keycode 36 = Meta_j
+ shift altgr alt shiftl shiftr ctrll keycode 36 = Meta_J
+ control alt shiftl shiftr ctrll keycode 36 = Meta_Linefeed
+ shift control alt shiftl shiftr ctrll keycode 36 = Meta_Linefeed
+ altgr control alt shiftl shiftr ctrll keycode 36 = Meta_Linefeed
+ shift altgr control alt shiftl shiftr ctrll keycode 36 = Meta_Linefeed
+keycode 37 = +k
+ shift keycode 37 = +K
+ altgr keycode 37 = kra
+ shift altgr keycode 37 = ampersand
+ control keycode 37 = Control_k
+ shift control keycode 37 = Control_k
+ altgr control keycode 37 = Control_k
+ shift altgr control keycode 37 = Control_k
+ alt keycode 37 = Meta_k
+ shift alt keycode 37 = Meta_K
+ altgr alt keycode 37 = Meta_k
+ shift altgr alt keycode 37 = Meta_ampersand
+ control alt keycode 37 = Meta_Control_k
+ shift control alt keycode 37 = Meta_Control_k
+ altgr control alt keycode 37 = Meta_Control_k
+ shift altgr control alt keycode 37 = Meta_Control_k
+ shift shiftl keycode 37 = +K
+ altgr shiftl keycode 37 = kra
+ shift altgr shiftl keycode 37 = ampersand
+ control shiftl keycode 37 = Control_k
+ shift control shiftl keycode 37 = Control_k
+ altgr control shiftl keycode 37 = Control_k
+ shift altgr control shiftl keycode 37 = Control_k
+ alt shiftl keycode 37 = Meta_k
+ shift alt shiftl keycode 37 = Meta_K
+ altgr alt shiftl keycode 37 = Meta_k
+ shift altgr alt shiftl keycode 37 = Meta_ampersand
+ control alt shiftl keycode 37 = Meta_Control_k
+ shift control alt shiftl keycode 37 = Meta_Control_k
+ altgr control alt shiftl keycode 37 = Meta_Control_k
+ shift altgr control alt shiftl keycode 37 = Meta_Control_k
+ shift shiftr keycode 37 = +K
+ altgr shiftr keycode 37 = kra
+ shift altgr shiftr keycode 37 = ampersand
+ control shiftr keycode 37 = Control_k
+ shift control shiftr keycode 37 = Control_k
+ altgr control shiftr keycode 37 = Control_k
+ shift altgr control shiftr keycode 37 = Control_k
+ alt shiftr keycode 37 = Meta_k
+ shift alt shiftr keycode 37 = Meta_K
+ altgr alt shiftr keycode 37 = Meta_k
+ shift altgr alt shiftr keycode 37 = Meta_ampersand
+ control alt shiftr keycode 37 = Meta_Control_k
+ shift control alt shiftr keycode 37 = Meta_Control_k
+ altgr control alt shiftr keycode 37 = Meta_Control_k
+ shift altgr control alt shiftr keycode 37 = Meta_Control_k
+ shift shiftl shiftr keycode 37 = +K
+ altgr shiftl shiftr keycode 37 = kra
+ shift altgr shiftl shiftr keycode 37 = ampersand
+ control shiftl shiftr keycode 37 = Control_k
+ shift control shiftl shiftr keycode 37 = Control_k
+ altgr control shiftl shiftr keycode 37 = Control_k
+ shift altgr control shiftl shiftr keycode 37 = Control_k
+ alt shiftl shiftr keycode 37 = Meta_k
+ shift alt shiftl shiftr keycode 37 = Meta_K
+ altgr alt shiftl shiftr keycode 37 = Meta_k
+ shift altgr alt shiftl shiftr keycode 37 = Meta_ampersand
+ control alt shiftl shiftr keycode 37 = Meta_Control_k
+ shift control alt shiftl shiftr keycode 37 = Meta_Control_k
+ altgr control alt shiftl shiftr keycode 37 = Meta_Control_k
+ shift altgr control alt shiftl shiftr keycode 37 = Meta_Control_k
+ ctrll keycode 37 = +K
+ altgr ctrll keycode 37 = kra
+ shift altgr ctrll keycode 37 = ampersand
+ control ctrll keycode 37 = Control_k
+ shift control ctrll keycode 37 = Control_k
+ altgr control ctrll keycode 37 = Control_k
+ shift altgr control ctrll keycode 37 = Control_k
+ alt ctrll keycode 37 = Meta_k
+ shift alt ctrll keycode 37 = Meta_K
+ altgr alt ctrll keycode 37 = Meta_k
+ shift altgr alt ctrll keycode 37 = Meta_ampersand
+ control alt ctrll keycode 37 = Meta_Control_k
+ shift control alt ctrll keycode 37 = Meta_Control_k
+ altgr control alt ctrll keycode 37 = Meta_Control_k
+ shift altgr control alt ctrll keycode 37 = Meta_Control_k
+ shiftl ctrll keycode 37 = +K
+ altgr shiftl ctrll keycode 37 = kra
+ shift altgr shiftl ctrll keycode 37 = ampersand
+ control shiftl ctrll keycode 37 = Control_k
+ shift control shiftl ctrll keycode 37 = Control_k
+ altgr control shiftl ctrll keycode 37 = Control_k
+ shift altgr control shiftl ctrll keycode 37 = Control_k
+ alt shiftl ctrll keycode 37 = Meta_k
+ shift alt shiftl ctrll keycode 37 = Meta_K
+ altgr alt shiftl ctrll keycode 37 = Meta_k
+ shift altgr alt shiftl ctrll keycode 37 = Meta_ampersand
+ control alt shiftl ctrll keycode 37 = Meta_Control_k
+ shift control alt shiftl ctrll keycode 37 = Meta_Control_k
+ altgr control alt shiftl ctrll keycode 37 = Meta_Control_k
+ shift altgr control alt shiftl ctrll keycode 37 = Meta_Control_k
+ shiftr ctrll keycode 37 = +K
+ altgr shiftr ctrll keycode 37 = kra
+ shift altgr shiftr ctrll keycode 37 = ampersand
+ control shiftr ctrll keycode 37 = Control_k
+ shift control shiftr ctrll keycode 37 = Control_k
+ altgr control shiftr ctrll keycode 37 = Control_k
+ shift altgr control shiftr ctrll keycode 37 = Control_k
+ alt shiftr ctrll keycode 37 = Meta_k
+ shift alt shiftr ctrll keycode 37 = Meta_K
+ altgr alt shiftr ctrll keycode 37 = Meta_k
+ shift altgr alt shiftr ctrll keycode 37 = Meta_ampersand
+ control alt shiftr ctrll keycode 37 = Meta_Control_k
+ shift control alt shiftr ctrll keycode 37 = Meta_Control_k
+ altgr control alt shiftr ctrll keycode 37 = Meta_Control_k
+ shift altgr control alt shiftr ctrll keycode 37 = Meta_Control_k
+ shiftl shiftr ctrll keycode 37 = +K
+ altgr shiftl shiftr ctrll keycode 37 = kra
+ shift altgr shiftl shiftr ctrll keycode 37 = ampersand
+ control shiftl shiftr ctrll keycode 37 = Control_k
+ shift control shiftl shiftr ctrll keycode 37 = Control_k
+ altgr control shiftl shiftr ctrll keycode 37 = Control_k
+ shift altgr control shiftl shiftr ctrll keycode 37 = Control_k
+ alt shiftl shiftr ctrll keycode 37 = Meta_k
+ shift alt shiftl shiftr ctrll keycode 37 = Meta_K
+ altgr alt shiftl shiftr ctrll keycode 37 = Meta_k
+ shift altgr alt shiftl shiftr ctrll keycode 37 = Meta_ampersand
+ control alt shiftl shiftr ctrll keycode 37 = Meta_Control_k
+ shift control alt shiftl shiftr ctrll keycode 37 = Meta_Control_k
+ altgr control alt shiftl shiftr ctrll keycode 37 = Meta_Control_k
+ shift altgr control alt shiftl shiftr ctrll keycode 37 = Meta_Control_k
+keycode 38 = +l
+ shift keycode 38 = +L
+ altgr keycode 38 = lstroke
+ shift altgr keycode 38 = Lstroke
+ control keycode 38 = Control_l
+ shift control keycode 38 = Control_l
+ altgr control keycode 38 = Control_l
+ shift altgr control keycode 38 = Control_l
+ alt keycode 38 = Meta_l
+ shift alt keycode 38 = Meta_L
+ altgr alt keycode 38 = Meta_l
+ shift altgr alt keycode 38 = Meta_L
+ control alt keycode 38 = Meta_Control_l
+ shift control alt keycode 38 = Meta_Control_l
+ altgr control alt keycode 38 = Meta_Control_l
+ shift altgr control alt keycode 38 = Meta_Control_l
+ shift shiftl keycode 38 = +L
+ altgr shiftl keycode 38 = lstroke
+ shift altgr shiftl keycode 38 = Lstroke
+ control shiftl keycode 38 = Control_l
+ shift control shiftl keycode 38 = Control_l
+ altgr control shiftl keycode 38 = Control_l
+ shift altgr control shiftl keycode 38 = Control_l
+ alt shiftl keycode 38 = Meta_l
+ shift alt shiftl keycode 38 = Meta_L
+ altgr alt shiftl keycode 38 = Meta_l
+ shift altgr alt shiftl keycode 38 = Meta_L
+ control alt shiftl keycode 38 = Meta_Control_l
+ shift control alt shiftl keycode 38 = Meta_Control_l
+ altgr control alt shiftl keycode 38 = Meta_Control_l
+ shift altgr control alt shiftl keycode 38 = Meta_Control_l
+ shift shiftr keycode 38 = +L
+ altgr shiftr keycode 38 = lstroke
+ shift altgr shiftr keycode 38 = Lstroke
+ control shiftr keycode 38 = Control_l
+ shift control shiftr keycode 38 = Control_l
+ altgr control shiftr keycode 38 = Control_l
+ shift altgr control shiftr keycode 38 = Control_l
+ alt shiftr keycode 38 = Meta_l
+ shift alt shiftr keycode 38 = Meta_L
+ altgr alt shiftr keycode 38 = Meta_l
+ shift altgr alt shiftr keycode 38 = Meta_L
+ control alt shiftr keycode 38 = Meta_Control_l
+ shift control alt shiftr keycode 38 = Meta_Control_l
+ altgr control alt shiftr keycode 38 = Meta_Control_l
+ shift altgr control alt shiftr keycode 38 = Meta_Control_l
+ shift shiftl shiftr keycode 38 = +L
+ altgr shiftl shiftr keycode 38 = lstroke
+ shift altgr shiftl shiftr keycode 38 = Lstroke
+ control shiftl shiftr keycode 38 = Control_l
+ shift control shiftl shiftr keycode 38 = Control_l
+ altgr control shiftl shiftr keycode 38 = Control_l
+ shift altgr control shiftl shiftr keycode 38 = Control_l
+ alt shiftl shiftr keycode 38 = Meta_l
+ shift alt shiftl shiftr keycode 38 = Meta_L
+ altgr alt shiftl shiftr keycode 38 = Meta_l
+ shift altgr alt shiftl shiftr keycode 38 = Meta_L
+ control alt shiftl shiftr keycode 38 = Meta_Control_l
+ shift control alt shiftl shiftr keycode 38 = Meta_Control_l
+ altgr control alt shiftl shiftr keycode 38 = Meta_Control_l
+ shift altgr control alt shiftl shiftr keycode 38 = Meta_Control_l
+ ctrll keycode 38 = +L
+ altgr ctrll keycode 38 = Lstroke
+ shift altgr ctrll keycode 38 = lstroke
+ control ctrll keycode 38 = Control_l
+ shift control ctrll keycode 38 = Control_l
+ altgr control ctrll keycode 38 = Control_l
+ shift altgr control ctrll keycode 38 = Control_l
+ alt ctrll keycode 38 = Meta_l
+ shift alt ctrll keycode 38 = Meta_L
+ altgr alt ctrll keycode 38 = Meta_l
+ shift altgr alt ctrll keycode 38 = Meta_L
+ control alt ctrll keycode 38 = Meta_Control_l
+ shift control alt ctrll keycode 38 = Meta_Control_l
+ altgr control alt ctrll keycode 38 = Meta_Control_l
+ shift altgr control alt ctrll keycode 38 = Meta_Control_l
+ shiftl ctrll keycode 38 = +L
+ altgr shiftl ctrll keycode 38 = Lstroke
+ shift altgr shiftl ctrll keycode 38 = lstroke
+ control shiftl ctrll keycode 38 = Control_l
+ shift control shiftl ctrll keycode 38 = Control_l
+ altgr control shiftl ctrll keycode 38 = Control_l
+ shift altgr control shiftl ctrll keycode 38 = Control_l
+ alt shiftl ctrll keycode 38 = Meta_l
+ shift alt shiftl ctrll keycode 38 = Meta_L
+ altgr alt shiftl ctrll keycode 38 = Meta_l
+ shift altgr alt shiftl ctrll keycode 38 = Meta_L
+ control alt shiftl ctrll keycode 38 = Meta_Control_l
+ shift control alt shiftl ctrll keycode 38 = Meta_Control_l
+ altgr control alt shiftl ctrll keycode 38 = Meta_Control_l
+ shift altgr control alt shiftl ctrll keycode 38 = Meta_Control_l
+ shiftr ctrll keycode 38 = +L
+ altgr shiftr ctrll keycode 38 = Lstroke
+ shift altgr shiftr ctrll keycode 38 = lstroke
+ control shiftr ctrll keycode 38 = Control_l
+ shift control shiftr ctrll keycode 38 = Control_l
+ altgr control shiftr ctrll keycode 38 = Control_l
+ shift altgr control shiftr ctrll keycode 38 = Control_l
+ alt shiftr ctrll keycode 38 = Meta_l
+ shift alt shiftr ctrll keycode 38 = Meta_L
+ altgr alt shiftr ctrll keycode 38 = Meta_l
+ shift altgr alt shiftr ctrll keycode 38 = Meta_L
+ control alt shiftr ctrll keycode 38 = Meta_Control_l
+ shift control alt shiftr ctrll keycode 38 = Meta_Control_l
+ altgr control alt shiftr ctrll keycode 38 = Meta_Control_l
+ shift altgr control alt shiftr ctrll keycode 38 = Meta_Control_l
+ shiftl shiftr ctrll keycode 38 = +L
+ altgr shiftl shiftr ctrll keycode 38 = Lstroke
+ shift altgr shiftl shiftr ctrll keycode 38 = lstroke
+ control shiftl shiftr ctrll keycode 38 = Control_l
+ shift control shiftl shiftr ctrll keycode 38 = Control_l
+ altgr control shiftl shiftr ctrll keycode 38 = Control_l
+ shift altgr control shiftl shiftr ctrll keycode 38 = Control_l
+ alt shiftl shiftr ctrll keycode 38 = Meta_l
+ shift alt shiftl shiftr ctrll keycode 38 = Meta_L
+ altgr alt shiftl shiftr ctrll keycode 38 = Meta_l
+ shift altgr alt shiftl shiftr ctrll keycode 38 = Meta_L
+ control alt shiftl shiftr ctrll keycode 38 = Meta_Control_l
+ shift control alt shiftl shiftr ctrll keycode 38 = Meta_Control_l
+ altgr control alt shiftl shiftr ctrll keycode 38 = Meta_Control_l
+ shift altgr control alt shiftl shiftr ctrll keycode 38 = Meta_Control_l
+keycode 39 = +ccedilla
+ shift keycode 39 = +Ccedilla
+ altgr keycode 39 = dead_acute
+ shift altgr keycode 39 = dead_tilde
+ control keycode 39 = dead_acute
+ shift control keycode 39 = dead_tilde
+ altgr control keycode 39 = dead_acute
+ shift altgr control keycode 39 = dead_tilde
+ alt keycode 39 = dead_acute
+ shift alt keycode 39 = dead_tilde
+ altgr alt keycode 39 = dead_acute
+ shift altgr alt keycode 39 = dead_tilde
+ control alt keycode 39 = dead_acute
+ shift control alt keycode 39 = dead_tilde
+ altgr control alt keycode 39 = dead_acute
+ shift altgr control alt keycode 39 = dead_tilde
+ shift shiftl keycode 39 = +Ccedilla
+ altgr shiftl keycode 39 = dead_acute
+ shift altgr shiftl keycode 39 = dead_tilde
+ control shiftl keycode 39 = dead_acute
+ shift control shiftl keycode 39 = dead_tilde
+ altgr control shiftl keycode 39 = dead_acute
+ shift altgr control shiftl keycode 39 = dead_tilde
+ alt shiftl keycode 39 = dead_acute
+ shift alt shiftl keycode 39 = dead_tilde
+ altgr alt shiftl keycode 39 = dead_acute
+ shift altgr alt shiftl keycode 39 = dead_tilde
+ control alt shiftl keycode 39 = dead_acute
+ shift control alt shiftl keycode 39 = dead_tilde
+ altgr control alt shiftl keycode 39 = dead_acute
+ shift altgr control alt shiftl keycode 39 = dead_tilde
+ shift shiftr keycode 39 = +Ccedilla
+ altgr shiftr keycode 39 = dead_acute
+ shift altgr shiftr keycode 39 = dead_tilde
+ control shiftr keycode 39 = dead_acute
+ shift control shiftr keycode 39 = dead_tilde
+ altgr control shiftr keycode 39 = dead_acute
+ shift altgr control shiftr keycode 39 = dead_tilde
+ alt shiftr keycode 39 = dead_acute
+ shift alt shiftr keycode 39 = dead_tilde
+ altgr alt shiftr keycode 39 = dead_acute
+ shift altgr alt shiftr keycode 39 = dead_tilde
+ control alt shiftr keycode 39 = dead_acute
+ shift control alt shiftr keycode 39 = dead_tilde
+ altgr control alt shiftr keycode 39 = dead_acute
+ shift altgr control alt shiftr keycode 39 = dead_tilde
+ shift shiftl shiftr keycode 39 = +Ccedilla
+ altgr shiftl shiftr keycode 39 = dead_acute
+ shift altgr shiftl shiftr keycode 39 = dead_tilde
+ control shiftl shiftr keycode 39 = dead_acute
+ shift control shiftl shiftr keycode 39 = dead_tilde
+ altgr control shiftl shiftr keycode 39 = dead_acute
+ shift altgr control shiftl shiftr keycode 39 = dead_tilde
+ alt shiftl shiftr keycode 39 = dead_acute
+ shift alt shiftl shiftr keycode 39 = dead_tilde
+ altgr alt shiftl shiftr keycode 39 = dead_acute
+ shift altgr alt shiftl shiftr keycode 39 = dead_tilde
+ control alt shiftl shiftr keycode 39 = dead_acute
+ shift control alt shiftl shiftr keycode 39 = dead_tilde
+ altgr control alt shiftl shiftr keycode 39 = dead_acute
+ shift altgr control alt shiftl shiftr keycode 39 = dead_tilde
+ ctrll keycode 39 = +Ccedilla
+ altgr ctrll keycode 39 = dead_acute
+ shift altgr ctrll keycode 39 = dead_tilde
+ control ctrll keycode 39 = dead_acute
+ shift control ctrll keycode 39 = dead_tilde
+ altgr control ctrll keycode 39 = dead_acute
+ shift altgr control ctrll keycode 39 = dead_tilde
+ alt ctrll keycode 39 = dead_acute
+ shift alt ctrll keycode 39 = dead_tilde
+ altgr alt ctrll keycode 39 = dead_acute
+ shift altgr alt ctrll keycode 39 = dead_tilde
+ control alt ctrll keycode 39 = dead_acute
+ shift control alt ctrll keycode 39 = dead_tilde
+ altgr control alt ctrll keycode 39 = dead_acute
+ shift altgr control alt ctrll keycode 39 = dead_tilde
+ shiftl ctrll keycode 39 = +Ccedilla
+ altgr shiftl ctrll keycode 39 = dead_acute
+ shift altgr shiftl ctrll keycode 39 = dead_tilde
+ control shiftl ctrll keycode 39 = dead_acute
+ shift control shiftl ctrll keycode 39 = dead_tilde
+ altgr control shiftl ctrll keycode 39 = dead_acute
+ shift altgr control shiftl ctrll keycode 39 = dead_tilde
+ alt shiftl ctrll keycode 39 = dead_acute
+ shift alt shiftl ctrll keycode 39 = dead_tilde
+ altgr alt shiftl ctrll keycode 39 = dead_acute
+ shift altgr alt shiftl ctrll keycode 39 = dead_tilde
+ control alt shiftl ctrll keycode 39 = dead_acute
+ shift control alt shiftl ctrll keycode 39 = dead_tilde
+ altgr control alt shiftl ctrll keycode 39 = dead_acute
+ shift altgr control alt shiftl ctrll keycode 39 = dead_tilde
+ shiftr ctrll keycode 39 = +Ccedilla
+ altgr shiftr ctrll keycode 39 = dead_acute
+ shift altgr shiftr ctrll keycode 39 = dead_tilde
+ control shiftr ctrll keycode 39 = dead_acute
+ shift control shiftr ctrll keycode 39 = dead_tilde
+ altgr control shiftr ctrll keycode 39 = dead_acute
+ shift altgr control shiftr ctrll keycode 39 = dead_tilde
+ alt shiftr ctrll keycode 39 = dead_acute
+ shift alt shiftr ctrll keycode 39 = dead_tilde
+ altgr alt shiftr ctrll keycode 39 = dead_acute
+ shift altgr alt shiftr ctrll keycode 39 = dead_tilde
+ control alt shiftr ctrll keycode 39 = dead_acute
+ shift control alt shiftr ctrll keycode 39 = dead_tilde
+ altgr control alt shiftr ctrll keycode 39 = dead_acute
+ shift altgr control alt shiftr ctrll keycode 39 = dead_tilde
+ shiftl shiftr ctrll keycode 39 = +Ccedilla
+ altgr shiftl shiftr ctrll keycode 39 = dead_acute
+ shift altgr shiftl shiftr ctrll keycode 39 = dead_tilde
+ control shiftl shiftr ctrll keycode 39 = dead_acute
+ shift control shiftl shiftr ctrll keycode 39 = dead_tilde
+ altgr control shiftl shiftr ctrll keycode 39 = dead_acute
+ shift altgr control shiftl shiftr ctrll keycode 39 = dead_tilde
+ alt shiftl shiftr ctrll keycode 39 = dead_acute
+ shift alt shiftl shiftr ctrll keycode 39 = dead_tilde
+ altgr alt shiftl shiftr ctrll keycode 39 = dead_acute
+ shift altgr alt shiftl shiftr ctrll keycode 39 = dead_tilde
+ control alt shiftl shiftr ctrll keycode 39 = dead_acute
+ shift control alt shiftl shiftr ctrll keycode 39 = dead_tilde
+ altgr control alt shiftl shiftr ctrll keycode 39 = dead_acute
+ shift altgr control alt shiftl shiftr ctrll keycode 39 = dead_tilde
+keycode 40 = dead_tilde
+ shift keycode 40 = dead_circumflex
+ altgr keycode 40 = asciitilde
+ shift altgr keycode 40 = asciicircum
+ shift control keycode 40 = dead_circumflex
+ shift altgr control keycode 40 = Control_asciicircum
+ shift alt keycode 40 = dead_circumflex
+ altgr alt keycode 40 = Meta_asciitilde
+ shift altgr alt keycode 40 = Meta_asciicircum
+ shift control alt keycode 40 = dead_circumflex
+ shift altgr control alt keycode 40 = Meta_Control_asciicircum
+ shift shiftl keycode 40 = dead_circumflex
+ altgr shiftl keycode 40 = asciitilde
+ shift altgr shiftl keycode 40 = asciicircum
+ shift control shiftl keycode 40 = dead_circumflex
+ shift altgr control shiftl keycode 40 = Control_asciicircum
+ shift alt shiftl keycode 40 = dead_circumflex
+ altgr alt shiftl keycode 40 = Meta_asciitilde
+ shift altgr alt shiftl keycode 40 = Meta_asciicircum
+ shift control alt shiftl keycode 40 = dead_circumflex
+ shift altgr control alt shiftl keycode 40 = Meta_Control_asciicircum
+ shift shiftr keycode 40 = dead_circumflex
+ altgr shiftr keycode 40 = asciitilde
+ shift altgr shiftr keycode 40 = asciicircum
+ shift control shiftr keycode 40 = dead_circumflex
+ shift altgr control shiftr keycode 40 = Control_asciicircum
+ shift alt shiftr keycode 40 = dead_circumflex
+ altgr alt shiftr keycode 40 = Meta_asciitilde
+ shift altgr alt shiftr keycode 40 = Meta_asciicircum
+ shift control alt shiftr keycode 40 = dead_circumflex
+ shift altgr control alt shiftr keycode 40 = Meta_Control_asciicircum
+ shift shiftl shiftr keycode 40 = dead_circumflex
+ altgr shiftl shiftr keycode 40 = asciitilde
+ shift altgr shiftl shiftr keycode 40 = asciicircum
+ shift control shiftl shiftr keycode 40 = dead_circumflex
+ shift altgr control shiftl shiftr keycode 40 = Control_asciicircum
+ shift alt shiftl shiftr keycode 40 = dead_circumflex
+ altgr alt shiftl shiftr keycode 40 = Meta_asciitilde
+ shift altgr alt shiftl shiftr keycode 40 = Meta_asciicircum
+ shift control alt shiftl shiftr keycode 40 = dead_circumflex
+ shift altgr control alt shiftl shiftr keycode 40 = Meta_Control_asciicircum
+ shift ctrll keycode 40 = dead_circumflex
+ altgr ctrll keycode 40 = asciitilde
+ shift altgr ctrll keycode 40 = asciicircum
+ shift control ctrll keycode 40 = dead_circumflex
+ shift altgr control ctrll keycode 40 = Control_asciicircum
+ shift alt ctrll keycode 40 = dead_circumflex
+ altgr alt ctrll keycode 40 = Meta_asciitilde
+ shift altgr alt ctrll keycode 40 = Meta_asciicircum
+ shift control alt ctrll keycode 40 = dead_circumflex
+ shift altgr control alt ctrll keycode 40 = Meta_Control_asciicircum
+ shift shiftl ctrll keycode 40 = dead_circumflex
+ altgr shiftl ctrll keycode 40 = asciitilde
+ shift altgr shiftl ctrll keycode 40 = asciicircum
+ shift control shiftl ctrll keycode 40 = dead_circumflex
+ shift altgr control shiftl ctrll keycode 40 = Control_asciicircum
+ shift alt shiftl ctrll keycode 40 = dead_circumflex
+ altgr alt shiftl ctrll keycode 40 = Meta_asciitilde
+ shift altgr alt shiftl ctrll keycode 40 = Meta_asciicircum
+ shift control alt shiftl ctrll keycode 40 = dead_circumflex
+ shift altgr control alt shiftl ctrll keycode 40 = Meta_Control_asciicircum
+ shift shiftr ctrll keycode 40 = dead_circumflex
+ altgr shiftr ctrll keycode 40 = asciitilde
+ shift altgr shiftr ctrll keycode 40 = asciicircum
+ shift control shiftr ctrll keycode 40 = dead_circumflex
+ shift altgr control shiftr ctrll keycode 40 = Control_asciicircum
+ shift alt shiftr ctrll keycode 40 = dead_circumflex
+ altgr alt shiftr ctrll keycode 40 = Meta_asciitilde
+ shift altgr alt shiftr ctrll keycode 40 = Meta_asciicircum
+ shift control alt shiftr ctrll keycode 40 = dead_circumflex
+ shift altgr control alt shiftr ctrll keycode 40 = Meta_Control_asciicircum
+ shift shiftl shiftr ctrll keycode 40 = dead_circumflex
+ altgr shiftl shiftr ctrll keycode 40 = asciitilde
+ shift altgr shiftl shiftr ctrll keycode 40 = asciicircum
+ shift control shiftl shiftr ctrll keycode 40 = dead_circumflex
+ shift altgr control shiftl shiftr ctrll keycode 40 = Control_asciicircum
+ shift alt shiftl shiftr ctrll keycode 40 = dead_circumflex
+ altgr alt shiftl shiftr ctrll keycode 40 = Meta_asciitilde
+ shift altgr alt shiftl shiftr ctrll keycode 40 = Meta_asciicircum
+ shift control alt shiftl shiftr ctrll keycode 40 = dead_circumflex
+ shift altgr control alt shiftl shiftr ctrll keycode 40 = Meta_Control_asciicircum
+keycode 41 = apostrophe
+ shift keycode 41 = quotedbl
+ altgr keycode 41 = notsign
+ shift altgr keycode 41 = notsign
+ control keycode 41 = Control_g
+ shift control keycode 41 = Control_g
+ altgr control keycode 41 = Control_g
+ shift altgr control keycode 41 = Control_g
+ alt keycode 41 = Meta_apostrophe
+ shift alt keycode 41 = Meta_quotedbl
+ altgr alt keycode 41 = Meta_apostrophe
+ shift altgr alt keycode 41 = Meta_quotedbl
+ control alt keycode 41 = Meta_Control_g
+ shift control alt keycode 41 = Meta_Control_g
+ altgr control alt keycode 41 = Meta_Control_g
+ shift altgr control alt keycode 41 = Meta_Control_g
+ shift shiftl keycode 41 = quotedbl
+ altgr shiftl keycode 41 = notsign
+ shift altgr shiftl keycode 41 = notsign
+ control shiftl keycode 41 = Control_g
+ shift control shiftl keycode 41 = Control_g
+ altgr control shiftl keycode 41 = Control_g
+ shift altgr control shiftl keycode 41 = Control_g
+ alt shiftl keycode 41 = Meta_apostrophe
+ shift alt shiftl keycode 41 = Meta_quotedbl
+ altgr alt shiftl keycode 41 = Meta_apostrophe
+ shift altgr alt shiftl keycode 41 = Meta_quotedbl
+ control alt shiftl keycode 41 = Meta_Control_g
+ shift control alt shiftl keycode 41 = Meta_Control_g
+ altgr control alt shiftl keycode 41 = Meta_Control_g
+ shift altgr control alt shiftl keycode 41 = Meta_Control_g
+ shift shiftr keycode 41 = quotedbl
+ altgr shiftr keycode 41 = notsign
+ shift altgr shiftr keycode 41 = notsign
+ control shiftr keycode 41 = Control_g
+ shift control shiftr keycode 41 = Control_g
+ altgr control shiftr keycode 41 = Control_g
+ shift altgr control shiftr keycode 41 = Control_g
+ alt shiftr keycode 41 = Meta_apostrophe
+ shift alt shiftr keycode 41 = Meta_quotedbl
+ altgr alt shiftr keycode 41 = Meta_apostrophe
+ shift altgr alt shiftr keycode 41 = Meta_quotedbl
+ control alt shiftr keycode 41 = Meta_Control_g
+ shift control alt shiftr keycode 41 = Meta_Control_g
+ altgr control alt shiftr keycode 41 = Meta_Control_g
+ shift altgr control alt shiftr keycode 41 = Meta_Control_g
+ shift shiftl shiftr keycode 41 = quotedbl
+ altgr shiftl shiftr keycode 41 = notsign
+ shift altgr shiftl shiftr keycode 41 = notsign
+ control shiftl shiftr keycode 41 = Control_g
+ shift control shiftl shiftr keycode 41 = Control_g
+ altgr control shiftl shiftr keycode 41 = Control_g
+ shift altgr control shiftl shiftr keycode 41 = Control_g
+ alt shiftl shiftr keycode 41 = Meta_apostrophe
+ shift alt shiftl shiftr keycode 41 = Meta_quotedbl
+ altgr alt shiftl shiftr keycode 41 = Meta_apostrophe
+ shift altgr alt shiftl shiftr keycode 41 = Meta_quotedbl
+ control alt shiftl shiftr keycode 41 = Meta_Control_g
+ shift control alt shiftl shiftr keycode 41 = Meta_Control_g
+ altgr control alt shiftl shiftr keycode 41 = Meta_Control_g
+ shift altgr control alt shiftl shiftr keycode 41 = Meta_Control_g
+ shift ctrll keycode 41 = quotedbl
+ altgr ctrll keycode 41 = notsign
+ shift altgr ctrll keycode 41 = notsign
+ control ctrll keycode 41 = Control_g
+ shift control ctrll keycode 41 = Control_g
+ altgr control ctrll keycode 41 = Control_g
+ shift altgr control ctrll keycode 41 = Control_g
+ alt ctrll keycode 41 = Meta_apostrophe
+ shift alt ctrll keycode 41 = Meta_quotedbl
+ altgr alt ctrll keycode 41 = Meta_apostrophe
+ shift altgr alt ctrll keycode 41 = Meta_quotedbl
+ control alt ctrll keycode 41 = Meta_Control_g
+ shift control alt ctrll keycode 41 = Meta_Control_g
+ altgr control alt ctrll keycode 41 = Meta_Control_g
+ shift altgr control alt ctrll keycode 41 = Meta_Control_g
+ shift shiftl ctrll keycode 41 = quotedbl
+ altgr shiftl ctrll keycode 41 = notsign
+ shift altgr shiftl ctrll keycode 41 = notsign
+ control shiftl ctrll keycode 41 = Control_g
+ shift control shiftl ctrll keycode 41 = Control_g
+ altgr control shiftl ctrll keycode 41 = Control_g
+ shift altgr control shiftl ctrll keycode 41 = Control_g
+ alt shiftl ctrll keycode 41 = Meta_apostrophe
+ shift alt shiftl ctrll keycode 41 = Meta_quotedbl
+ altgr alt shiftl ctrll keycode 41 = Meta_apostrophe
+ shift altgr alt shiftl ctrll keycode 41 = Meta_quotedbl
+ control alt shiftl ctrll keycode 41 = Meta_Control_g
+ shift control alt shiftl ctrll keycode 41 = Meta_Control_g
+ altgr control alt shiftl ctrll keycode 41 = Meta_Control_g
+ shift altgr control alt shiftl ctrll keycode 41 = Meta_Control_g
+ shift shiftr ctrll keycode 41 = quotedbl
+ altgr shiftr ctrll keycode 41 = notsign
+ shift altgr shiftr ctrll keycode 41 = notsign
+ control shiftr ctrll keycode 41 = Control_g
+ shift control shiftr ctrll keycode 41 = Control_g
+ altgr control shiftr ctrll keycode 41 = Control_g
+ shift altgr control shiftr ctrll keycode 41 = Control_g
+ alt shiftr ctrll keycode 41 = Meta_apostrophe
+ shift alt shiftr ctrll keycode 41 = Meta_quotedbl
+ altgr alt shiftr ctrll keycode 41 = Meta_apostrophe
+ shift altgr alt shiftr ctrll keycode 41 = Meta_quotedbl
+ control alt shiftr ctrll keycode 41 = Meta_Control_g
+ shift control alt shiftr ctrll keycode 41 = Meta_Control_g
+ altgr control alt shiftr ctrll keycode 41 = Meta_Control_g
+ shift altgr control alt shiftr ctrll keycode 41 = Meta_Control_g
+ shift shiftl shiftr ctrll keycode 41 = quotedbl
+ altgr shiftl shiftr ctrll keycode 41 = notsign
+ shift altgr shiftl shiftr ctrll keycode 41 = notsign
+ control shiftl shiftr ctrll keycode 41 = Control_g
+ shift control shiftl shiftr ctrll keycode 41 = Control_g
+ altgr control shiftl shiftr ctrll keycode 41 = Control_g
+ shift altgr control shiftl shiftr ctrll keycode 41 = Control_g
+ alt shiftl shiftr ctrll keycode 41 = Meta_apostrophe
+ shift alt shiftl shiftr ctrll keycode 41 = Meta_quotedbl
+ altgr alt shiftl shiftr ctrll keycode 41 = Meta_apostrophe
+ shift altgr alt shiftl shiftr ctrll keycode 41 = Meta_quotedbl
+ control alt shiftl shiftr ctrll keycode 41 = Meta_Control_g
+ shift control alt shiftl shiftr ctrll keycode 41 = Meta_Control_g
+ altgr control alt shiftl shiftr ctrll keycode 41 = Meta_Control_g
+ shift altgr control alt shiftl shiftr ctrll keycode 41 = Meta_Control_g
+keycode 42 = Shift
+keycode 43 = bracketright
+ shift keycode 43 = braceright
+ altgr keycode 43 = +masculine
+ shift altgr keycode 43 = +masculine
+ control keycode 43 = Control_bracketright
+ shift control keycode 43 = Control_bracketright
+ altgr control keycode 43 = Control_bracketright
+ shift altgr control keycode 43 = Control_bracketright
+ alt keycode 43 = Meta_bracketright
+ shift alt keycode 43 = Meta_braceright
+ altgr alt keycode 43 = Meta_bracketright
+ shift altgr alt keycode 43 = Meta_braceright
+ control alt keycode 43 = Meta_Control_bracketright
+ shift control alt keycode 43 = Meta_Control_bracketright
+ altgr control alt keycode 43 = Meta_Control_bracketright
+ shift altgr control alt keycode 43 = Meta_Control_bracketright
+ shift shiftl keycode 43 = braceright
+ altgr shiftl keycode 43 = +masculine
+ shift altgr shiftl keycode 43 = +masculine
+ control shiftl keycode 43 = Control_bracketright
+ shift control shiftl keycode 43 = Control_bracketright
+ altgr control shiftl keycode 43 = Control_bracketright
+ shift altgr control shiftl keycode 43 = Control_bracketright
+ alt shiftl keycode 43 = Meta_bracketright
+ shift alt shiftl keycode 43 = Meta_braceright
+ altgr alt shiftl keycode 43 = Meta_bracketright
+ shift altgr alt shiftl keycode 43 = Meta_braceright
+ control alt shiftl keycode 43 = Meta_Control_bracketright
+ shift control alt shiftl keycode 43 = Meta_Control_bracketright
+ altgr control alt shiftl keycode 43 = Meta_Control_bracketright
+ shift altgr control alt shiftl keycode 43 = Meta_Control_bracketright
+ shift shiftr keycode 43 = braceright
+ altgr shiftr keycode 43 = +masculine
+ shift altgr shiftr keycode 43 = +masculine
+ control shiftr keycode 43 = Control_bracketright
+ shift control shiftr keycode 43 = Control_bracketright
+ altgr control shiftr keycode 43 = Control_bracketright
+ shift altgr control shiftr keycode 43 = Control_bracketright
+ alt shiftr keycode 43 = Meta_bracketright
+ shift alt shiftr keycode 43 = Meta_braceright
+ altgr alt shiftr keycode 43 = Meta_bracketright
+ shift altgr alt shiftr keycode 43 = Meta_braceright
+ control alt shiftr keycode 43 = Meta_Control_bracketright
+ shift control alt shiftr keycode 43 = Meta_Control_bracketright
+ altgr control alt shiftr keycode 43 = Meta_Control_bracketright
+ shift altgr control alt shiftr keycode 43 = Meta_Control_bracketright
+ shift shiftl shiftr keycode 43 = braceright
+ altgr shiftl shiftr keycode 43 = +masculine
+ shift altgr shiftl shiftr keycode 43 = +masculine
+ control shiftl shiftr keycode 43 = Control_bracketright
+ shift control shiftl shiftr keycode 43 = Control_bracketright
+ altgr control shiftl shiftr keycode 43 = Control_bracketright
+ shift altgr control shiftl shiftr keycode 43 = Control_bracketright
+ alt shiftl shiftr keycode 43 = Meta_bracketright
+ shift alt shiftl shiftr keycode 43 = Meta_braceright
+ altgr alt shiftl shiftr keycode 43 = Meta_bracketright
+ shift altgr alt shiftl shiftr keycode 43 = Meta_braceright
+ control alt shiftl shiftr keycode 43 = Meta_Control_bracketright
+ shift control alt shiftl shiftr keycode 43 = Meta_Control_bracketright
+ altgr control alt shiftl shiftr keycode 43 = Meta_Control_bracketright
+ shift altgr control alt shiftl shiftr keycode 43 = Meta_Control_bracketright
+ shift ctrll keycode 43 = braceright
+ altgr ctrll keycode 43 = +masculine
+ shift altgr ctrll keycode 43 = +masculine
+ control ctrll keycode 43 = Control_bracketright
+ shift control ctrll keycode 43 = Control_bracketright
+ altgr control ctrll keycode 43 = Control_bracketright
+ shift altgr control ctrll keycode 43 = Control_bracketright
+ alt ctrll keycode 43 = Meta_bracketright
+ shift alt ctrll keycode 43 = Meta_braceright
+ altgr alt ctrll keycode 43 = Meta_bracketright
+ shift altgr alt ctrll keycode 43 = Meta_braceright
+ control alt ctrll keycode 43 = Meta_Control_bracketright
+ shift control alt ctrll keycode 43 = Meta_Control_bracketright
+ altgr control alt ctrll keycode 43 = Meta_Control_bracketright
+ shift altgr control alt ctrll keycode 43 = Meta_Control_bracketright
+ shift shiftl ctrll keycode 43 = braceright
+ altgr shiftl ctrll keycode 43 = +masculine
+ shift altgr shiftl ctrll keycode 43 = +masculine
+ control shiftl ctrll keycode 43 = Control_bracketright
+ shift control shiftl ctrll keycode 43 = Control_bracketright
+ altgr control shiftl ctrll keycode 43 = Control_bracketright
+ shift altgr control shiftl ctrll keycode 43 = Control_bracketright
+ alt shiftl ctrll keycode 43 = Meta_bracketright
+ shift alt shiftl ctrll keycode 43 = Meta_braceright
+ altgr alt shiftl ctrll keycode 43 = Meta_bracketright
+ shift altgr alt shiftl ctrll keycode 43 = Meta_braceright
+ control alt shiftl ctrll keycode 43 = Meta_Control_bracketright
+ shift control alt shiftl ctrll keycode 43 = Meta_Control_bracketright
+ altgr control alt shiftl ctrll keycode 43 = Meta_Control_bracketright
+ shift altgr control alt shiftl ctrll keycode 43 = Meta_Control_bracketright
+ shift shiftr ctrll keycode 43 = braceright
+ altgr shiftr ctrll keycode 43 = +masculine
+ shift altgr shiftr ctrll keycode 43 = +masculine
+ control shiftr ctrll keycode 43 = Control_bracketright
+ shift control shiftr ctrll keycode 43 = Control_bracketright
+ altgr control shiftr ctrll keycode 43 = Control_bracketright
+ shift altgr control shiftr ctrll keycode 43 = Control_bracketright
+ alt shiftr ctrll keycode 43 = Meta_bracketright
+ shift alt shiftr ctrll keycode 43 = Meta_braceright
+ altgr alt shiftr ctrll keycode 43 = Meta_bracketright
+ shift altgr alt shiftr ctrll keycode 43 = Meta_braceright
+ control alt shiftr ctrll keycode 43 = Meta_Control_bracketright
+ shift control alt shiftr ctrll keycode 43 = Meta_Control_bracketright
+ altgr control alt shiftr ctrll keycode 43 = Meta_Control_bracketright
+ shift altgr control alt shiftr ctrll keycode 43 = Meta_Control_bracketright
+ shift shiftl shiftr ctrll keycode 43 = braceright
+ altgr shiftl shiftr ctrll keycode 43 = +masculine
+ shift altgr shiftl shiftr ctrll keycode 43 = +masculine
+ control shiftl shiftr ctrll keycode 43 = Control_bracketright
+ shift control shiftl shiftr ctrll keycode 43 = Control_bracketright
+ altgr control shiftl shiftr ctrll keycode 43 = Control_bracketright
+ shift altgr control shiftl shiftr ctrll keycode 43 = Control_bracketright
+ alt shiftl shiftr ctrll keycode 43 = Meta_bracketright
+ shift alt shiftl shiftr ctrll keycode 43 = Meta_braceright
+ altgr alt shiftl shiftr ctrll keycode 43 = Meta_bracketright
+ shift altgr alt shiftl shiftr ctrll keycode 43 = Meta_braceright
+ control alt shiftl shiftr ctrll keycode 43 = Meta_Control_bracketright
+ shift control alt shiftl shiftr ctrll keycode 43 = Meta_Control_bracketright
+ altgr control alt shiftl shiftr ctrll keycode 43 = Meta_Control_bracketright
+ shift altgr control alt shiftl shiftr ctrll keycode 43 = Meta_Control_bracketright
+keycode 44 = +z
+ shift keycode 44 = +Z
+ altgr keycode 44 = guillemotleft
+ shift altgr keycode 44 = less
+ control keycode 44 = Control_z
+ shift control keycode 44 = Control_z
+ altgr control keycode 44 = Control_z
+ shift altgr control keycode 44 = Control_z
+ alt keycode 44 = Meta_z
+ shift alt keycode 44 = Meta_Z
+ altgr alt keycode 44 = Meta_z
+ shift altgr alt keycode 44 = Meta_less
+ control alt keycode 44 = Meta_Control_z
+ shift control alt keycode 44 = Meta_Control_z
+ altgr control alt keycode 44 = Meta_Control_z
+ shift altgr control alt keycode 44 = Meta_Control_z
+ shift shiftl keycode 44 = +Z
+ altgr shiftl keycode 44 = guillemotleft
+ shift altgr shiftl keycode 44 = less
+ control shiftl keycode 44 = Control_z
+ shift control shiftl keycode 44 = Control_z
+ altgr control shiftl keycode 44 = Control_z
+ shift altgr control shiftl keycode 44 = Control_z
+ alt shiftl keycode 44 = Meta_z
+ shift alt shiftl keycode 44 = Meta_Z
+ altgr alt shiftl keycode 44 = Meta_z
+ shift altgr alt shiftl keycode 44 = Meta_less
+ control alt shiftl keycode 44 = Meta_Control_z
+ shift control alt shiftl keycode 44 = Meta_Control_z
+ altgr control alt shiftl keycode 44 = Meta_Control_z
+ shift altgr control alt shiftl keycode 44 = Meta_Control_z
+ shift shiftr keycode 44 = +Z
+ altgr shiftr keycode 44 = guillemotleft
+ shift altgr shiftr keycode 44 = less
+ control shiftr keycode 44 = Control_z
+ shift control shiftr keycode 44 = Control_z
+ altgr control shiftr keycode 44 = Control_z
+ shift altgr control shiftr keycode 44 = Control_z
+ alt shiftr keycode 44 = Meta_z
+ shift alt shiftr keycode 44 = Meta_Z
+ altgr alt shiftr keycode 44 = Meta_z
+ shift altgr alt shiftr keycode 44 = Meta_less
+ control alt shiftr keycode 44 = Meta_Control_z
+ shift control alt shiftr keycode 44 = Meta_Control_z
+ altgr control alt shiftr keycode 44 = Meta_Control_z
+ shift altgr control alt shiftr keycode 44 = Meta_Control_z
+ shift shiftl shiftr keycode 44 = +Z
+ altgr shiftl shiftr keycode 44 = guillemotleft
+ shift altgr shiftl shiftr keycode 44 = less
+ control shiftl shiftr keycode 44 = Control_z
+ shift control shiftl shiftr keycode 44 = Control_z
+ altgr control shiftl shiftr keycode 44 = Control_z
+ shift altgr control shiftl shiftr keycode 44 = Control_z
+ alt shiftl shiftr keycode 44 = Meta_z
+ shift alt shiftl shiftr keycode 44 = Meta_Z
+ altgr alt shiftl shiftr keycode 44 = Meta_z
+ shift altgr alt shiftl shiftr keycode 44 = Meta_less
+ control alt shiftl shiftr keycode 44 = Meta_Control_z
+ shift control alt shiftl shiftr keycode 44 = Meta_Control_z
+ altgr control alt shiftl shiftr keycode 44 = Meta_Control_z
+ shift altgr control alt shiftl shiftr keycode 44 = Meta_Control_z
+ ctrll keycode 44 = +Z
+ altgr ctrll keycode 44 = guillemotleft
+ shift altgr ctrll keycode 44 = less
+ control ctrll keycode 44 = Control_z
+ shift control ctrll keycode 44 = Control_z
+ altgr control ctrll keycode 44 = Control_z
+ shift altgr control ctrll keycode 44 = Control_z
+ alt ctrll keycode 44 = Meta_z
+ shift alt ctrll keycode 44 = Meta_Z
+ altgr alt ctrll keycode 44 = Meta_z
+ shift altgr alt ctrll keycode 44 = Meta_less
+ control alt ctrll keycode 44 = Meta_Control_z
+ shift control alt ctrll keycode 44 = Meta_Control_z
+ altgr control alt ctrll keycode 44 = Meta_Control_z
+ shift altgr control alt ctrll keycode 44 = Meta_Control_z
+ shiftl ctrll keycode 44 = +Z
+ altgr shiftl ctrll keycode 44 = guillemotleft
+ shift altgr shiftl ctrll keycode 44 = less
+ control shiftl ctrll keycode 44 = Control_z
+ shift control shiftl ctrll keycode 44 = Control_z
+ altgr control shiftl ctrll keycode 44 = Control_z
+ shift altgr control shiftl ctrll keycode 44 = Control_z
+ alt shiftl ctrll keycode 44 = Meta_z
+ shift alt shiftl ctrll keycode 44 = Meta_Z
+ altgr alt shiftl ctrll keycode 44 = Meta_z
+ shift altgr alt shiftl ctrll keycode 44 = Meta_less
+ control alt shiftl ctrll keycode 44 = Meta_Control_z
+ shift control alt shiftl ctrll keycode 44 = Meta_Control_z
+ altgr control alt shiftl ctrll keycode 44 = Meta_Control_z
+ shift altgr control alt shiftl ctrll keycode 44 = Meta_Control_z
+ shiftr ctrll keycode 44 = +Z
+ altgr shiftr ctrll keycode 44 = guillemotleft
+ shift altgr shiftr ctrll keycode 44 = less
+ control shiftr ctrll keycode 44 = Control_z
+ shift control shiftr ctrll keycode 44 = Control_z
+ altgr control shiftr ctrll keycode 44 = Control_z
+ shift altgr control shiftr ctrll keycode 44 = Control_z
+ alt shiftr ctrll keycode 44 = Meta_z
+ shift alt shiftr ctrll keycode 44 = Meta_Z
+ altgr alt shiftr ctrll keycode 44 = Meta_z
+ shift altgr alt shiftr ctrll keycode 44 = Meta_less
+ control alt shiftr ctrll keycode 44 = Meta_Control_z
+ shift control alt shiftr ctrll keycode 44 = Meta_Control_z
+ altgr control alt shiftr ctrll keycode 44 = Meta_Control_z
+ shift altgr control alt shiftr ctrll keycode 44 = Meta_Control_z
+ shiftl shiftr ctrll keycode 44 = +Z
+ altgr shiftl shiftr ctrll keycode 44 = guillemotleft
+ shift altgr shiftl shiftr ctrll keycode 44 = less
+ control shiftl shiftr ctrll keycode 44 = Control_z
+ shift control shiftl shiftr ctrll keycode 44 = Control_z
+ altgr control shiftl shiftr ctrll keycode 44 = Control_z
+ shift altgr control shiftl shiftr ctrll keycode 44 = Control_z
+ alt shiftl shiftr ctrll keycode 44 = Meta_z
+ shift alt shiftl shiftr ctrll keycode 44 = Meta_Z
+ altgr alt shiftl shiftr ctrll keycode 44 = Meta_z
+ shift altgr alt shiftl shiftr ctrll keycode 44 = Meta_less
+ control alt shiftl shiftr ctrll keycode 44 = Meta_Control_z
+ shift control alt shiftl shiftr ctrll keycode 44 = Meta_Control_z
+ altgr control alt shiftl shiftr ctrll keycode 44 = Meta_Control_z
+ shift altgr control alt shiftl shiftr ctrll keycode 44 = Meta_Control_z
+keycode 45 = +x
+ shift keycode 45 = +X
+ altgr keycode 45 = guillemotright
+ shift altgr keycode 45 = greater
+ control keycode 45 = Control_x
+ shift control keycode 45 = Control_x
+ altgr control keycode 45 = Control_x
+ shift altgr control keycode 45 = Control_x
+ alt keycode 45 = Meta_x
+ shift alt keycode 45 = Meta_X
+ altgr alt keycode 45 = Meta_x
+ shift altgr alt keycode 45 = Meta_greater
+ control alt keycode 45 = Meta_Control_x
+ shift control alt keycode 45 = Meta_Control_x
+ altgr control alt keycode 45 = Meta_Control_x
+ shift altgr control alt keycode 45 = Meta_Control_x
+ shift shiftl keycode 45 = +X
+ altgr shiftl keycode 45 = guillemotright
+ shift altgr shiftl keycode 45 = greater
+ control shiftl keycode 45 = Control_x
+ shift control shiftl keycode 45 = Control_x
+ altgr control shiftl keycode 45 = Control_x
+ shift altgr control shiftl keycode 45 = Control_x
+ alt shiftl keycode 45 = Meta_x
+ shift alt shiftl keycode 45 = Meta_X
+ altgr alt shiftl keycode 45 = Meta_x
+ shift altgr alt shiftl keycode 45 = Meta_greater
+ control alt shiftl keycode 45 = Meta_Control_x
+ shift control alt shiftl keycode 45 = Meta_Control_x
+ altgr control alt shiftl keycode 45 = Meta_Control_x
+ shift altgr control alt shiftl keycode 45 = Meta_Control_x
+ shift shiftr keycode 45 = +X
+ altgr shiftr keycode 45 = guillemotright
+ shift altgr shiftr keycode 45 = greater
+ control shiftr keycode 45 = Control_x
+ shift control shiftr keycode 45 = Control_x
+ altgr control shiftr keycode 45 = Control_x
+ shift altgr control shiftr keycode 45 = Control_x
+ alt shiftr keycode 45 = Meta_x
+ shift alt shiftr keycode 45 = Meta_X
+ altgr alt shiftr keycode 45 = Meta_x
+ shift altgr alt shiftr keycode 45 = Meta_greater
+ control alt shiftr keycode 45 = Meta_Control_x
+ shift control alt shiftr keycode 45 = Meta_Control_x
+ altgr control alt shiftr keycode 45 = Meta_Control_x
+ shift altgr control alt shiftr keycode 45 = Meta_Control_x
+ shift shiftl shiftr keycode 45 = +X
+ altgr shiftl shiftr keycode 45 = guillemotright
+ shift altgr shiftl shiftr keycode 45 = greater
+ control shiftl shiftr keycode 45 = Control_x
+ shift control shiftl shiftr keycode 45 = Control_x
+ altgr control shiftl shiftr keycode 45 = Control_x
+ shift altgr control shiftl shiftr keycode 45 = Control_x
+ alt shiftl shiftr keycode 45 = Meta_x
+ shift alt shiftl shiftr keycode 45 = Meta_X
+ altgr alt shiftl shiftr keycode 45 = Meta_x
+ shift altgr alt shiftl shiftr keycode 45 = Meta_greater
+ control alt shiftl shiftr keycode 45 = Meta_Control_x
+ shift control alt shiftl shiftr keycode 45 = Meta_Control_x
+ altgr control alt shiftl shiftr keycode 45 = Meta_Control_x
+ shift altgr control alt shiftl shiftr keycode 45 = Meta_Control_x
+ ctrll keycode 45 = +X
+ altgr ctrll keycode 45 = guillemotright
+ shift altgr ctrll keycode 45 = greater
+ control ctrll keycode 45 = Control_x
+ shift control ctrll keycode 45 = Control_x
+ altgr control ctrll keycode 45 = Control_x
+ shift altgr control ctrll keycode 45 = Control_x
+ alt ctrll keycode 45 = Meta_x
+ shift alt ctrll keycode 45 = Meta_X
+ altgr alt ctrll keycode 45 = Meta_x
+ shift altgr alt ctrll keycode 45 = Meta_greater
+ control alt ctrll keycode 45 = Meta_Control_x
+ shift control alt ctrll keycode 45 = Meta_Control_x
+ altgr control alt ctrll keycode 45 = Meta_Control_x
+ shift altgr control alt ctrll keycode 45 = Meta_Control_x
+ shiftl ctrll keycode 45 = +X
+ altgr shiftl ctrll keycode 45 = guillemotright
+ shift altgr shiftl ctrll keycode 45 = greater
+ control shiftl ctrll keycode 45 = Control_x
+ shift control shiftl ctrll keycode 45 = Control_x
+ altgr control shiftl ctrll keycode 45 = Control_x
+ shift altgr control shiftl ctrll keycode 45 = Control_x
+ alt shiftl ctrll keycode 45 = Meta_x
+ shift alt shiftl ctrll keycode 45 = Meta_X
+ altgr alt shiftl ctrll keycode 45 = Meta_x
+ shift altgr alt shiftl ctrll keycode 45 = Meta_greater
+ control alt shiftl ctrll keycode 45 = Meta_Control_x
+ shift control alt shiftl ctrll keycode 45 = Meta_Control_x
+ altgr control alt shiftl ctrll keycode 45 = Meta_Control_x
+ shift altgr control alt shiftl ctrll keycode 45 = Meta_Control_x
+ shiftr ctrll keycode 45 = +X
+ altgr shiftr ctrll keycode 45 = guillemotright
+ shift altgr shiftr ctrll keycode 45 = greater
+ control shiftr ctrll keycode 45 = Control_x
+ shift control shiftr ctrll keycode 45 = Control_x
+ altgr control shiftr ctrll keycode 45 = Control_x
+ shift altgr control shiftr ctrll keycode 45 = Control_x
+ alt shiftr ctrll keycode 45 = Meta_x
+ shift alt shiftr ctrll keycode 45 = Meta_X
+ altgr alt shiftr ctrll keycode 45 = Meta_x
+ shift altgr alt shiftr ctrll keycode 45 = Meta_greater
+ control alt shiftr ctrll keycode 45 = Meta_Control_x
+ shift control alt shiftr ctrll keycode 45 = Meta_Control_x
+ altgr control alt shiftr ctrll keycode 45 = Meta_Control_x
+ shift altgr control alt shiftr ctrll keycode 45 = Meta_Control_x
+ shiftl shiftr ctrll keycode 45 = +X
+ altgr shiftl shiftr ctrll keycode 45 = guillemotright
+ shift altgr shiftl shiftr ctrll keycode 45 = greater
+ control shiftl shiftr ctrll keycode 45 = Control_x
+ shift control shiftl shiftr ctrll keycode 45 = Control_x
+ altgr control shiftl shiftr ctrll keycode 45 = Control_x
+ shift altgr control shiftl shiftr ctrll keycode 45 = Control_x
+ alt shiftl shiftr ctrll keycode 45 = Meta_x
+ shift alt shiftl shiftr ctrll keycode 45 = Meta_X
+ altgr alt shiftl shiftr ctrll keycode 45 = Meta_x
+ shift altgr alt shiftl shiftr ctrll keycode 45 = Meta_greater
+ control alt shiftl shiftr ctrll keycode 45 = Meta_Control_x
+ shift control alt shiftl shiftr ctrll keycode 45 = Meta_Control_x
+ altgr control alt shiftl shiftr ctrll keycode 45 = Meta_Control_x
+ shift altgr control alt shiftl shiftr ctrll keycode 45 = Meta_Control_x
+keycode 46 = +c
+ shift keycode 46 = +C
+ altgr keycode 46 = copyright
+ shift altgr keycode 46 = copyright
+ control keycode 46 = Control_c
+ shift control keycode 46 = Control_c
+ altgr control keycode 46 = Control_c
+ shift altgr control keycode 46 = Control_c
+ alt keycode 46 = Meta_c
+ shift alt keycode 46 = Meta_C
+ altgr alt keycode 46 = Meta_c
+ shift altgr alt keycode 46 = Meta_C
+ control alt keycode 46 = Meta_Control_c
+ shift control alt keycode 46 = Meta_Control_c
+ altgr control alt keycode 46 = Meta_Control_c
+ shift altgr control alt keycode 46 = Meta_Control_c
+ shift shiftl keycode 46 = +C
+ altgr shiftl keycode 46 = copyright
+ shift altgr shiftl keycode 46 = copyright
+ control shiftl keycode 46 = Control_c
+ shift control shiftl keycode 46 = Control_c
+ altgr control shiftl keycode 46 = Control_c
+ shift altgr control shiftl keycode 46 = Control_c
+ alt shiftl keycode 46 = Meta_c
+ shift alt shiftl keycode 46 = Meta_C
+ altgr alt shiftl keycode 46 = Meta_c
+ shift altgr alt shiftl keycode 46 = Meta_C
+ control alt shiftl keycode 46 = Meta_Control_c
+ shift control alt shiftl keycode 46 = Meta_Control_c
+ altgr control alt shiftl keycode 46 = Meta_Control_c
+ shift altgr control alt shiftl keycode 46 = Meta_Control_c
+ shift shiftr keycode 46 = +C
+ altgr shiftr keycode 46 = copyright
+ shift altgr shiftr keycode 46 = copyright
+ control shiftr keycode 46 = Control_c
+ shift control shiftr keycode 46 = Control_c
+ altgr control shiftr keycode 46 = Control_c
+ shift altgr control shiftr keycode 46 = Control_c
+ alt shiftr keycode 46 = Meta_c
+ shift alt shiftr keycode 46 = Meta_C
+ altgr alt shiftr keycode 46 = Meta_c
+ shift altgr alt shiftr keycode 46 = Meta_C
+ control alt shiftr keycode 46 = Meta_Control_c
+ shift control alt shiftr keycode 46 = Meta_Control_c
+ altgr control alt shiftr keycode 46 = Meta_Control_c
+ shift altgr control alt shiftr keycode 46 = Meta_Control_c
+ shift shiftl shiftr keycode 46 = +C
+ altgr shiftl shiftr keycode 46 = copyright
+ shift altgr shiftl shiftr keycode 46 = copyright
+ control shiftl shiftr keycode 46 = Control_c
+ shift control shiftl shiftr keycode 46 = Control_c
+ altgr control shiftl shiftr keycode 46 = Control_c
+ shift altgr control shiftl shiftr keycode 46 = Control_c
+ alt shiftl shiftr keycode 46 = Meta_c
+ shift alt shiftl shiftr keycode 46 = Meta_C
+ altgr alt shiftl shiftr keycode 46 = Meta_c
+ shift altgr alt shiftl shiftr keycode 46 = Meta_C
+ control alt shiftl shiftr keycode 46 = Meta_Control_c
+ shift control alt shiftl shiftr keycode 46 = Meta_Control_c
+ altgr control alt shiftl shiftr keycode 46 = Meta_Control_c
+ shift altgr control alt shiftl shiftr keycode 46 = Meta_Control_c
+ ctrll keycode 46 = +C
+ altgr ctrll keycode 46 = copyright
+ shift altgr ctrll keycode 46 = copyright
+ control ctrll keycode 46 = Control_c
+ shift control ctrll keycode 46 = Control_c
+ altgr control ctrll keycode 46 = Control_c
+ shift altgr control ctrll keycode 46 = Control_c
+ alt ctrll keycode 46 = Meta_c
+ shift alt ctrll keycode 46 = Meta_C
+ altgr alt ctrll keycode 46 = Meta_c
+ shift altgr alt ctrll keycode 46 = Meta_C
+ control alt ctrll keycode 46 = Meta_Control_c
+ shift control alt ctrll keycode 46 = Meta_Control_c
+ altgr control alt ctrll keycode 46 = Meta_Control_c
+ shift altgr control alt ctrll keycode 46 = Meta_Control_c
+ shiftl ctrll keycode 46 = +C
+ altgr shiftl ctrll keycode 46 = copyright
+ shift altgr shiftl ctrll keycode 46 = copyright
+ control shiftl ctrll keycode 46 = Control_c
+ shift control shiftl ctrll keycode 46 = Control_c
+ altgr control shiftl ctrll keycode 46 = Control_c
+ shift altgr control shiftl ctrll keycode 46 = Control_c
+ alt shiftl ctrll keycode 46 = Meta_c
+ shift alt shiftl ctrll keycode 46 = Meta_C
+ altgr alt shiftl ctrll keycode 46 = Meta_c
+ shift altgr alt shiftl ctrll keycode 46 = Meta_C
+ control alt shiftl ctrll keycode 46 = Meta_Control_c
+ shift control alt shiftl ctrll keycode 46 = Meta_Control_c
+ altgr control alt shiftl ctrll keycode 46 = Meta_Control_c
+ shift altgr control alt shiftl ctrll keycode 46 = Meta_Control_c
+ shiftr ctrll keycode 46 = +C
+ altgr shiftr ctrll keycode 46 = copyright
+ shift altgr shiftr ctrll keycode 46 = copyright
+ control shiftr ctrll keycode 46 = Control_c
+ shift control shiftr ctrll keycode 46 = Control_c
+ altgr control shiftr ctrll keycode 46 = Control_c
+ shift altgr control shiftr ctrll keycode 46 = Control_c
+ alt shiftr ctrll keycode 46 = Meta_c
+ shift alt shiftr ctrll keycode 46 = Meta_C
+ altgr alt shiftr ctrll keycode 46 = Meta_c
+ shift altgr alt shiftr ctrll keycode 46 = Meta_C
+ control alt shiftr ctrll keycode 46 = Meta_Control_c
+ shift control alt shiftr ctrll keycode 46 = Meta_Control_c
+ altgr control alt shiftr ctrll keycode 46 = Meta_Control_c
+ shift altgr control alt shiftr ctrll keycode 46 = Meta_Control_c
+ shiftl shiftr ctrll keycode 46 = +C
+ altgr shiftl shiftr ctrll keycode 46 = copyright
+ shift altgr shiftl shiftr ctrll keycode 46 = copyright
+ control shiftl shiftr ctrll keycode 46 = Control_c
+ shift control shiftl shiftr ctrll keycode 46 = Control_c
+ altgr control shiftl shiftr ctrll keycode 46 = Control_c
+ shift altgr control shiftl shiftr ctrll keycode 46 = Control_c
+ alt shiftl shiftr ctrll keycode 46 = Meta_c
+ shift alt shiftl shiftr ctrll keycode 46 = Meta_C
+ altgr alt shiftl shiftr ctrll keycode 46 = Meta_c
+ shift altgr alt shiftl shiftr ctrll keycode 46 = Meta_C
+ control alt shiftl shiftr ctrll keycode 46 = Meta_Control_c
+ shift control alt shiftl shiftr ctrll keycode 46 = Meta_Control_c
+ altgr control alt shiftl shiftr ctrll keycode 46 = Meta_Control_c
+ shift altgr control alt shiftl shiftr ctrll keycode 46 = Meta_Control_c
+keycode 47 = +v
+ shift keycode 47 = +V
+ altgr keycode 47 = U+201c
+ shift altgr keycode 47 = U+2018
+ control keycode 47 = Control_v
+ shift control keycode 47 = Control_v
+ altgr control keycode 47 = Control_v
+ shift altgr control keycode 47 = Control_v
+ alt keycode 47 = Meta_v
+ shift alt keycode 47 = Meta_V
+ altgr alt keycode 47 = Meta_v
+ shift altgr alt keycode 47 = Meta_V
+ control alt keycode 47 = Meta_Control_v
+ shift control alt keycode 47 = Meta_Control_v
+ altgr control alt keycode 47 = Meta_Control_v
+ shift altgr control alt keycode 47 = Meta_Control_v
+ shift shiftl keycode 47 = +V
+ altgr shiftl keycode 47 = U+201c
+ shift altgr shiftl keycode 47 = U+2018
+ control shiftl keycode 47 = Control_v
+ shift control shiftl keycode 47 = Control_v
+ altgr control shiftl keycode 47 = Control_v
+ shift altgr control shiftl keycode 47 = Control_v
+ alt shiftl keycode 47 = Meta_v
+ shift alt shiftl keycode 47 = Meta_V
+ altgr alt shiftl keycode 47 = Meta_v
+ shift altgr alt shiftl keycode 47 = Meta_V
+ control alt shiftl keycode 47 = Meta_Control_v
+ shift control alt shiftl keycode 47 = Meta_Control_v
+ altgr control alt shiftl keycode 47 = Meta_Control_v
+ shift altgr control alt shiftl keycode 47 = Meta_Control_v
+ shift shiftr keycode 47 = +V
+ altgr shiftr keycode 47 = U+201c
+ shift altgr shiftr keycode 47 = U+2018
+ control shiftr keycode 47 = Control_v
+ shift control shiftr keycode 47 = Control_v
+ altgr control shiftr keycode 47 = Control_v
+ shift altgr control shiftr keycode 47 = Control_v
+ alt shiftr keycode 47 = Meta_v
+ shift alt shiftr keycode 47 = Meta_V
+ altgr alt shiftr keycode 47 = Meta_v
+ shift altgr alt shiftr keycode 47 = Meta_V
+ control alt shiftr keycode 47 = Meta_Control_v
+ shift control alt shiftr keycode 47 = Meta_Control_v
+ altgr control alt shiftr keycode 47 = Meta_Control_v
+ shift altgr control alt shiftr keycode 47 = Meta_Control_v
+ shift shiftl shiftr keycode 47 = +V
+ altgr shiftl shiftr keycode 47 = U+201c
+ shift altgr shiftl shiftr keycode 47 = U+2018
+ control shiftl shiftr keycode 47 = Control_v
+ shift control shiftl shiftr keycode 47 = Control_v
+ altgr control shiftl shiftr keycode 47 = Control_v
+ shift altgr control shiftl shiftr keycode 47 = Control_v
+ alt shiftl shiftr keycode 47 = Meta_v
+ shift alt shiftl shiftr keycode 47 = Meta_V
+ altgr alt shiftl shiftr keycode 47 = Meta_v
+ shift altgr alt shiftl shiftr keycode 47 = Meta_V
+ control alt shiftl shiftr keycode 47 = Meta_Control_v
+ shift control alt shiftl shiftr keycode 47 = Meta_Control_v
+ altgr control alt shiftl shiftr keycode 47 = Meta_Control_v
+ shift altgr control alt shiftl shiftr keycode 47 = Meta_Control_v
+ ctrll keycode 47 = +V
+ altgr ctrll keycode 47 = U+201c
+ shift altgr ctrll keycode 47 = U+2018
+ control ctrll keycode 47 = Control_v
+ shift control ctrll keycode 47 = Control_v
+ altgr control ctrll keycode 47 = Control_v
+ shift altgr control ctrll keycode 47 = Control_v
+ alt ctrll keycode 47 = Meta_v
+ shift alt ctrll keycode 47 = Meta_V
+ altgr alt ctrll keycode 47 = Meta_v
+ shift altgr alt ctrll keycode 47 = Meta_V
+ control alt ctrll keycode 47 = Meta_Control_v
+ shift control alt ctrll keycode 47 = Meta_Control_v
+ altgr control alt ctrll keycode 47 = Meta_Control_v
+ shift altgr control alt ctrll keycode 47 = Meta_Control_v
+ shiftl ctrll keycode 47 = +V
+ altgr shiftl ctrll keycode 47 = U+201c
+ shift altgr shiftl ctrll keycode 47 = U+2018
+ control shiftl ctrll keycode 47 = Control_v
+ shift control shiftl ctrll keycode 47 = Control_v
+ altgr control shiftl ctrll keycode 47 = Control_v
+ shift altgr control shiftl ctrll keycode 47 = Control_v
+ alt shiftl ctrll keycode 47 = Meta_v
+ shift alt shiftl ctrll keycode 47 = Meta_V
+ altgr alt shiftl ctrll keycode 47 = Meta_v
+ shift altgr alt shiftl ctrll keycode 47 = Meta_V
+ control alt shiftl ctrll keycode 47 = Meta_Control_v
+ shift control alt shiftl ctrll keycode 47 = Meta_Control_v
+ altgr control alt shiftl ctrll keycode 47 = Meta_Control_v
+ shift altgr control alt shiftl ctrll keycode 47 = Meta_Control_v
+ shiftr ctrll keycode 47 = +V
+ altgr shiftr ctrll keycode 47 = U+201c
+ shift altgr shiftr ctrll keycode 47 = U+2018
+ control shiftr ctrll keycode 47 = Control_v
+ shift control shiftr ctrll keycode 47 = Control_v
+ altgr control shiftr ctrll keycode 47 = Control_v
+ shift altgr control shiftr ctrll keycode 47 = Control_v
+ alt shiftr ctrll keycode 47 = Meta_v
+ shift alt shiftr ctrll keycode 47 = Meta_V
+ altgr alt shiftr ctrll keycode 47 = Meta_v
+ shift altgr alt shiftr ctrll keycode 47 = Meta_V
+ control alt shiftr ctrll keycode 47 = Meta_Control_v
+ shift control alt shiftr ctrll keycode 47 = Meta_Control_v
+ altgr control alt shiftr ctrll keycode 47 = Meta_Control_v
+ shift altgr control alt shiftr ctrll keycode 47 = Meta_Control_v
+ shiftl shiftr ctrll keycode 47 = +V
+ altgr shiftl shiftr ctrll keycode 47 = U+201c
+ shift altgr shiftl shiftr ctrll keycode 47 = U+2018
+ control shiftl shiftr ctrll keycode 47 = Control_v
+ shift control shiftl shiftr ctrll keycode 47 = Control_v
+ altgr control shiftl shiftr ctrll keycode 47 = Control_v
+ shift altgr control shiftl shiftr ctrll keycode 47 = Control_v
+ alt shiftl shiftr ctrll keycode 47 = Meta_v
+ shift alt shiftl shiftr ctrll keycode 47 = Meta_V
+ altgr alt shiftl shiftr ctrll keycode 47 = Meta_v
+ shift altgr alt shiftl shiftr ctrll keycode 47 = Meta_V
+ control alt shiftl shiftr ctrll keycode 47 = Meta_Control_v
+ shift control alt shiftl shiftr ctrll keycode 47 = Meta_Control_v
+ altgr control alt shiftl shiftr ctrll keycode 47 = Meta_Control_v
+ shift altgr control alt shiftl shiftr ctrll keycode 47 = Meta_Control_v
+keycode 48 = +b
+ shift keycode 48 = +B
+ altgr keycode 48 = U+201d
+ shift altgr keycode 48 = U+2019
+ control keycode 48 = Control_b
+ shift control keycode 48 = Control_b
+ altgr control keycode 48 = Control_b
+ shift altgr control keycode 48 = Control_b
+ alt keycode 48 = Meta_b
+ shift alt keycode 48 = Meta_B
+ altgr alt keycode 48 = Meta_b
+ shift altgr alt keycode 48 = Meta_B
+ control alt keycode 48 = Meta_Control_b
+ shift control alt keycode 48 = Meta_Control_b
+ altgr control alt keycode 48 = Meta_Control_b
+ shift altgr control alt keycode 48 = Meta_Control_b
+ shift shiftl keycode 48 = +B
+ altgr shiftl keycode 48 = U+201d
+ shift altgr shiftl keycode 48 = U+2019
+ control shiftl keycode 48 = Control_b
+ shift control shiftl keycode 48 = Control_b
+ altgr control shiftl keycode 48 = Control_b
+ shift altgr control shiftl keycode 48 = Control_b
+ alt shiftl keycode 48 = Meta_b
+ shift alt shiftl keycode 48 = Meta_B
+ altgr alt shiftl keycode 48 = Meta_b
+ shift altgr alt shiftl keycode 48 = Meta_B
+ control alt shiftl keycode 48 = Meta_Control_b
+ shift control alt shiftl keycode 48 = Meta_Control_b
+ altgr control alt shiftl keycode 48 = Meta_Control_b
+ shift altgr control alt shiftl keycode 48 = Meta_Control_b
+ shift shiftr keycode 48 = +B
+ altgr shiftr keycode 48 = U+201d
+ shift altgr shiftr keycode 48 = U+2019
+ control shiftr keycode 48 = Control_b
+ shift control shiftr keycode 48 = Control_b
+ altgr control shiftr keycode 48 = Control_b
+ shift altgr control shiftr keycode 48 = Control_b
+ alt shiftr keycode 48 = Meta_b
+ shift alt shiftr keycode 48 = Meta_B
+ altgr alt shiftr keycode 48 = Meta_b
+ shift altgr alt shiftr keycode 48 = Meta_B
+ control alt shiftr keycode 48 = Meta_Control_b
+ shift control alt shiftr keycode 48 = Meta_Control_b
+ altgr control alt shiftr keycode 48 = Meta_Control_b
+ shift altgr control alt shiftr keycode 48 = Meta_Control_b
+ shift shiftl shiftr keycode 48 = +B
+ altgr shiftl shiftr keycode 48 = U+201d
+ shift altgr shiftl shiftr keycode 48 = U+2019
+ control shiftl shiftr keycode 48 = Control_b
+ shift control shiftl shiftr keycode 48 = Control_b
+ altgr control shiftl shiftr keycode 48 = Control_b
+ shift altgr control shiftl shiftr keycode 48 = Control_b
+ alt shiftl shiftr keycode 48 = Meta_b
+ shift alt shiftl shiftr keycode 48 = Meta_B
+ altgr alt shiftl shiftr keycode 48 = Meta_b
+ shift altgr alt shiftl shiftr keycode 48 = Meta_B
+ control alt shiftl shiftr keycode 48 = Meta_Control_b
+ shift control alt shiftl shiftr keycode 48 = Meta_Control_b
+ altgr control alt shiftl shiftr keycode 48 = Meta_Control_b
+ shift altgr control alt shiftl shiftr keycode 48 = Meta_Control_b
+ ctrll keycode 48 = +B
+ altgr ctrll keycode 48 = U+201d
+ shift altgr ctrll keycode 48 = U+2019
+ control ctrll keycode 48 = Control_b
+ shift control ctrll keycode 48 = Control_b
+ altgr control ctrll keycode 48 = Control_b
+ shift altgr control ctrll keycode 48 = Control_b
+ alt ctrll keycode 48 = Meta_b
+ shift alt ctrll keycode 48 = Meta_B
+ altgr alt ctrll keycode 48 = Meta_b
+ shift altgr alt ctrll keycode 48 = Meta_B
+ control alt ctrll keycode 48 = Meta_Control_b
+ shift control alt ctrll keycode 48 = Meta_Control_b
+ altgr control alt ctrll keycode 48 = Meta_Control_b
+ shift altgr control alt ctrll keycode 48 = Meta_Control_b
+ shiftl ctrll keycode 48 = +B
+ altgr shiftl ctrll keycode 48 = U+201d
+ shift altgr shiftl ctrll keycode 48 = U+2019
+ control shiftl ctrll keycode 48 = Control_b
+ shift control shiftl ctrll keycode 48 = Control_b
+ altgr control shiftl ctrll keycode 48 = Control_b
+ shift altgr control shiftl ctrll keycode 48 = Control_b
+ alt shiftl ctrll keycode 48 = Meta_b
+ shift alt shiftl ctrll keycode 48 = Meta_B
+ altgr alt shiftl ctrll keycode 48 = Meta_b
+ shift altgr alt shiftl ctrll keycode 48 = Meta_B
+ control alt shiftl ctrll keycode 48 = Meta_Control_b
+ shift control alt shiftl ctrll keycode 48 = Meta_Control_b
+ altgr control alt shiftl ctrll keycode 48 = Meta_Control_b
+ shift altgr control alt shiftl ctrll keycode 48 = Meta_Control_b
+ shiftr ctrll keycode 48 = +B
+ altgr shiftr ctrll keycode 48 = U+201d
+ shift altgr shiftr ctrll keycode 48 = U+2019
+ control shiftr ctrll keycode 48 = Control_b
+ shift control shiftr ctrll keycode 48 = Control_b
+ altgr control shiftr ctrll keycode 48 = Control_b
+ shift altgr control shiftr ctrll keycode 48 = Control_b
+ alt shiftr ctrll keycode 48 = Meta_b
+ shift alt shiftr ctrll keycode 48 = Meta_B
+ altgr alt shiftr ctrll keycode 48 = Meta_b
+ shift altgr alt shiftr ctrll keycode 48 = Meta_B
+ control alt shiftr ctrll keycode 48 = Meta_Control_b
+ shift control alt shiftr ctrll keycode 48 = Meta_Control_b
+ altgr control alt shiftr ctrll keycode 48 = Meta_Control_b
+ shift altgr control alt shiftr ctrll keycode 48 = Meta_Control_b
+ shiftl shiftr ctrll keycode 48 = +B
+ altgr shiftl shiftr ctrll keycode 48 = U+201d
+ shift altgr shiftl shiftr ctrll keycode 48 = U+2019
+ control shiftl shiftr ctrll keycode 48 = Control_b
+ shift control shiftl shiftr ctrll keycode 48 = Control_b
+ altgr control shiftl shiftr ctrll keycode 48 = Control_b
+ shift altgr control shiftl shiftr ctrll keycode 48 = Control_b
+ alt shiftl shiftr ctrll keycode 48 = Meta_b
+ shift alt shiftl shiftr ctrll keycode 48 = Meta_B
+ altgr alt shiftl shiftr ctrll keycode 48 = Meta_b
+ shift altgr alt shiftl shiftr ctrll keycode 48 = Meta_B
+ control alt shiftl shiftr ctrll keycode 48 = Meta_Control_b
+ shift control alt shiftl shiftr ctrll keycode 48 = Meta_Control_b
+ altgr control alt shiftl shiftr ctrll keycode 48 = Meta_Control_b
+ shift altgr control alt shiftl shiftr ctrll keycode 48 = Meta_Control_b
+keycode 49 = +n
+ shift keycode 49 = +N
+ shift altgr keycode 49 = +N
+ control keycode 49 = Control_n
+ shift control keycode 49 = Control_n
+ altgr control keycode 49 = Control_n
+ shift altgr control keycode 49 = Control_n
+ alt keycode 49 = Meta_n
+ shift alt keycode 49 = Meta_N
+ altgr alt keycode 49 = Meta_n
+ shift altgr alt keycode 49 = Meta_N
+ control alt keycode 49 = Meta_Control_n
+ shift control alt keycode 49 = Meta_Control_n
+ altgr control alt keycode 49 = Meta_Control_n
+ shift altgr control alt keycode 49 = Meta_Control_n
+ shift shiftl keycode 49 = +N
+ shift altgr shiftl keycode 49 = +N
+ control shiftl keycode 49 = Control_n
+ shift control shiftl keycode 49 = Control_n
+ altgr control shiftl keycode 49 = Control_n
+ shift altgr control shiftl keycode 49 = Control_n
+ alt shiftl keycode 49 = Meta_n
+ shift alt shiftl keycode 49 = Meta_N
+ altgr alt shiftl keycode 49 = Meta_n
+ shift altgr alt shiftl keycode 49 = Meta_N
+ control alt shiftl keycode 49 = Meta_Control_n
+ shift control alt shiftl keycode 49 = Meta_Control_n
+ altgr control alt shiftl keycode 49 = Meta_Control_n
+ shift altgr control alt shiftl keycode 49 = Meta_Control_n
+ shift shiftr keycode 49 = +N
+ shift altgr shiftr keycode 49 = +N
+ control shiftr keycode 49 = Control_n
+ shift control shiftr keycode 49 = Control_n
+ altgr control shiftr keycode 49 = Control_n
+ shift altgr control shiftr keycode 49 = Control_n
+ alt shiftr keycode 49 = Meta_n
+ shift alt shiftr keycode 49 = Meta_N
+ altgr alt shiftr keycode 49 = Meta_n
+ shift altgr alt shiftr keycode 49 = Meta_N
+ control alt shiftr keycode 49 = Meta_Control_n
+ shift control alt shiftr keycode 49 = Meta_Control_n
+ altgr control alt shiftr keycode 49 = Meta_Control_n
+ shift altgr control alt shiftr keycode 49 = Meta_Control_n
+ shift shiftl shiftr keycode 49 = +N
+ shift altgr shiftl shiftr keycode 49 = +N
+ control shiftl shiftr keycode 49 = Control_n
+ shift control shiftl shiftr keycode 49 = Control_n
+ altgr control shiftl shiftr keycode 49 = Control_n
+ shift altgr control shiftl shiftr keycode 49 = Control_n
+ alt shiftl shiftr keycode 49 = Meta_n
+ shift alt shiftl shiftr keycode 49 = Meta_N
+ altgr alt shiftl shiftr keycode 49 = Meta_n
+ shift altgr alt shiftl shiftr keycode 49 = Meta_N
+ control alt shiftl shiftr keycode 49 = Meta_Control_n
+ shift control alt shiftl shiftr keycode 49 = Meta_Control_n
+ altgr control alt shiftl shiftr keycode 49 = Meta_Control_n
+ shift altgr control alt shiftl shiftr keycode 49 = Meta_Control_n
+ ctrll keycode 49 = +N
+ altgr ctrll keycode 49 = +N
+ control ctrll keycode 49 = Control_n
+ shift control ctrll keycode 49 = Control_n
+ altgr control ctrll keycode 49 = Control_n
+ shift altgr control ctrll keycode 49 = Control_n
+ alt ctrll keycode 49 = Meta_n
+ shift alt ctrll keycode 49 = Meta_N
+ altgr alt ctrll keycode 49 = Meta_n
+ shift altgr alt ctrll keycode 49 = Meta_N
+ control alt ctrll keycode 49 = Meta_Control_n
+ shift control alt ctrll keycode 49 = Meta_Control_n
+ altgr control alt ctrll keycode 49 = Meta_Control_n
+ shift altgr control alt ctrll keycode 49 = Meta_Control_n
+ shiftl ctrll keycode 49 = +N
+ altgr shiftl ctrll keycode 49 = +N
+ control shiftl ctrll keycode 49 = Control_n
+ shift control shiftl ctrll keycode 49 = Control_n
+ altgr control shiftl ctrll keycode 49 = Control_n
+ shift altgr control shiftl ctrll keycode 49 = Control_n
+ alt shiftl ctrll keycode 49 = Meta_n
+ shift alt shiftl ctrll keycode 49 = Meta_N
+ altgr alt shiftl ctrll keycode 49 = Meta_n
+ shift altgr alt shiftl ctrll keycode 49 = Meta_N
+ control alt shiftl ctrll keycode 49 = Meta_Control_n
+ shift control alt shiftl ctrll keycode 49 = Meta_Control_n
+ altgr control alt shiftl ctrll keycode 49 = Meta_Control_n
+ shift altgr control alt shiftl ctrll keycode 49 = Meta_Control_n
+ shiftr ctrll keycode 49 = +N
+ altgr shiftr ctrll keycode 49 = +N
+ control shiftr ctrll keycode 49 = Control_n
+ shift control shiftr ctrll keycode 49 = Control_n
+ altgr control shiftr ctrll keycode 49 = Control_n
+ shift altgr control shiftr ctrll keycode 49 = Control_n
+ alt shiftr ctrll keycode 49 = Meta_n
+ shift alt shiftr ctrll keycode 49 = Meta_N
+ altgr alt shiftr ctrll keycode 49 = Meta_n
+ shift altgr alt shiftr ctrll keycode 49 = Meta_N
+ control alt shiftr ctrll keycode 49 = Meta_Control_n
+ shift control alt shiftr ctrll keycode 49 = Meta_Control_n
+ altgr control alt shiftr ctrll keycode 49 = Meta_Control_n
+ shift altgr control alt shiftr ctrll keycode 49 = Meta_Control_n
+ shiftl shiftr ctrll keycode 49 = +N
+ altgr shiftl shiftr ctrll keycode 49 = +N
+ control shiftl shiftr ctrll keycode 49 = Control_n
+ shift control shiftl shiftr ctrll keycode 49 = Control_n
+ altgr control shiftl shiftr ctrll keycode 49 = Control_n
+ shift altgr control shiftl shiftr ctrll keycode 49 = Control_n
+ alt shiftl shiftr ctrll keycode 49 = Meta_n
+ shift alt shiftl shiftr ctrll keycode 49 = Meta_N
+ altgr alt shiftl shiftr ctrll keycode 49 = Meta_n
+ shift altgr alt shiftl shiftr ctrll keycode 49 = Meta_N
+ control alt shiftl shiftr ctrll keycode 49 = Meta_Control_n
+ shift control alt shiftl shiftr ctrll keycode 49 = Meta_Control_n
+ altgr control alt shiftl shiftr ctrll keycode 49 = Meta_Control_n
+ shift altgr control alt shiftl shiftr ctrll keycode 49 = Meta_Control_n
+keycode 50 = +m
+ shift keycode 50 = +M
+ altgr keycode 50 = +mu
+ shift altgr keycode 50 = +mu
+ control keycode 50 = Control_m
+ shift control keycode 50 = Control_m
+ altgr control keycode 50 = Control_m
+ shift altgr control keycode 50 = Control_m
+ alt keycode 50 = Meta_m
+ shift alt keycode 50 = Meta_M
+ altgr alt keycode 50 = Meta_m
+ shift altgr alt keycode 50 = Meta_M
+ control alt keycode 50 = Meta_Control_m
+ shift control alt keycode 50 = Meta_Control_m
+ altgr control alt keycode 50 = Meta_Control_m
+ shift altgr control alt keycode 50 = Meta_Control_m
+ shift shiftl keycode 50 = +M
+ altgr shiftl keycode 50 = +mu
+ shift altgr shiftl keycode 50 = +mu
+ control shiftl keycode 50 = Control_m
+ shift control shiftl keycode 50 = Control_m
+ altgr control shiftl keycode 50 = Control_m
+ shift altgr control shiftl keycode 50 = Control_m
+ alt shiftl keycode 50 = Meta_m
+ shift alt shiftl keycode 50 = Meta_M
+ altgr alt shiftl keycode 50 = Meta_m
+ shift altgr alt shiftl keycode 50 = Meta_M
+ control alt shiftl keycode 50 = Meta_Control_m
+ shift control alt shiftl keycode 50 = Meta_Control_m
+ altgr control alt shiftl keycode 50 = Meta_Control_m
+ shift altgr control alt shiftl keycode 50 = Meta_Control_m
+ shift shiftr keycode 50 = +M
+ altgr shiftr keycode 50 = +mu
+ shift altgr shiftr keycode 50 = +mu
+ control shiftr keycode 50 = Control_m
+ shift control shiftr keycode 50 = Control_m
+ altgr control shiftr keycode 50 = Control_m
+ shift altgr control shiftr keycode 50 = Control_m
+ alt shiftr keycode 50 = Meta_m
+ shift alt shiftr keycode 50 = Meta_M
+ altgr alt shiftr keycode 50 = Meta_m
+ shift altgr alt shiftr keycode 50 = Meta_M
+ control alt shiftr keycode 50 = Meta_Control_m
+ shift control alt shiftr keycode 50 = Meta_Control_m
+ altgr control alt shiftr keycode 50 = Meta_Control_m
+ shift altgr control alt shiftr keycode 50 = Meta_Control_m
+ shift shiftl shiftr keycode 50 = +M
+ altgr shiftl shiftr keycode 50 = +mu
+ shift altgr shiftl shiftr keycode 50 = +mu
+ control shiftl shiftr keycode 50 = Control_m
+ shift control shiftl shiftr keycode 50 = Control_m
+ altgr control shiftl shiftr keycode 50 = Control_m
+ shift altgr control shiftl shiftr keycode 50 = Control_m
+ alt shiftl shiftr keycode 50 = Meta_m
+ shift alt shiftl shiftr keycode 50 = Meta_M
+ altgr alt shiftl shiftr keycode 50 = Meta_m
+ shift altgr alt shiftl shiftr keycode 50 = Meta_M
+ control alt shiftl shiftr keycode 50 = Meta_Control_m
+ shift control alt shiftl shiftr keycode 50 = Meta_Control_m
+ altgr control alt shiftl shiftr keycode 50 = Meta_Control_m
+ shift altgr control alt shiftl shiftr keycode 50 = Meta_Control_m
+ ctrll keycode 50 = +M
+ altgr ctrll keycode 50 = Mu
+ shift altgr ctrll keycode 50 = Mu
+ control ctrll keycode 50 = Control_m
+ shift control ctrll keycode 50 = Control_m
+ altgr control ctrll keycode 50 = Control_m
+ shift altgr control ctrll keycode 50 = Control_m
+ alt ctrll keycode 50 = Meta_m
+ shift alt ctrll keycode 50 = Meta_M
+ altgr alt ctrll keycode 50 = Meta_m
+ shift altgr alt ctrll keycode 50 = Meta_M
+ control alt ctrll keycode 50 = Meta_Control_m
+ shift control alt ctrll keycode 50 = Meta_Control_m
+ altgr control alt ctrll keycode 50 = Meta_Control_m
+ shift altgr control alt ctrll keycode 50 = Meta_Control_m
+ shiftl ctrll keycode 50 = +M
+ altgr shiftl ctrll keycode 50 = Mu
+ shift altgr shiftl ctrll keycode 50 = Mu
+ control shiftl ctrll keycode 50 = Control_m
+ shift control shiftl ctrll keycode 50 = Control_m
+ altgr control shiftl ctrll keycode 50 = Control_m
+ shift altgr control shiftl ctrll keycode 50 = Control_m
+ alt shiftl ctrll keycode 50 = Meta_m
+ shift alt shiftl ctrll keycode 50 = Meta_M
+ altgr alt shiftl ctrll keycode 50 = Meta_m
+ shift altgr alt shiftl ctrll keycode 50 = Meta_M
+ control alt shiftl ctrll keycode 50 = Meta_Control_m
+ shift control alt shiftl ctrll keycode 50 = Meta_Control_m
+ altgr control alt shiftl ctrll keycode 50 = Meta_Control_m
+ shift altgr control alt shiftl ctrll keycode 50 = Meta_Control_m
+ shiftr ctrll keycode 50 = +M
+ altgr shiftr ctrll keycode 50 = Mu
+ shift altgr shiftr ctrll keycode 50 = Mu
+ control shiftr ctrll keycode 50 = Control_m
+ shift control shiftr ctrll keycode 50 = Control_m
+ altgr control shiftr ctrll keycode 50 = Control_m
+ shift altgr control shiftr ctrll keycode 50 = Control_m
+ alt shiftr ctrll keycode 50 = Meta_m
+ shift alt shiftr ctrll keycode 50 = Meta_M
+ altgr alt shiftr ctrll keycode 50 = Meta_m
+ shift altgr alt shiftr ctrll keycode 50 = Meta_M
+ control alt shiftr ctrll keycode 50 = Meta_Control_m
+ shift control alt shiftr ctrll keycode 50 = Meta_Control_m
+ altgr control alt shiftr ctrll keycode 50 = Meta_Control_m
+ shift altgr control alt shiftr ctrll keycode 50 = Meta_Control_m
+ shiftl shiftr ctrll keycode 50 = +M
+ altgr shiftl shiftr ctrll keycode 50 = Mu
+ shift altgr shiftl shiftr ctrll keycode 50 = Mu
+ control shiftl shiftr ctrll keycode 50 = Control_m
+ shift control shiftl shiftr ctrll keycode 50 = Control_m
+ altgr control shiftl shiftr ctrll keycode 50 = Control_m
+ shift altgr control shiftl shiftr ctrll keycode 50 = Control_m
+ alt shiftl shiftr ctrll keycode 50 = Meta_m
+ shift alt shiftl shiftr ctrll keycode 50 = Meta_M
+ altgr alt shiftl shiftr ctrll keycode 50 = Meta_m
+ shift altgr alt shiftl shiftr ctrll keycode 50 = Meta_M
+ control alt shiftl shiftr ctrll keycode 50 = Meta_Control_m
+ shift control alt shiftl shiftr ctrll keycode 50 = Meta_Control_m
+ altgr control alt shiftl shiftr ctrll keycode 50 = Meta_Control_m
+ shift altgr control alt shiftl shiftr ctrll keycode 50 = Meta_Control_m
+keycode 51 = comma less U+2500 multiply
+ alt keycode 51 = Meta_comma
+ shift alt keycode 51 = Meta_less
+ altgr alt keycode 51 = Meta_comma
+ shift altgr alt keycode 51 = Meta_less
+ shiftl keycode 51 = comma
+ shift shiftl keycode 51 = less
+ altgr shiftl keycode 51 = U+2500
+ shift altgr shiftl keycode 51 = multiply
+ alt shiftl keycode 51 = Meta_comma
+ shift alt shiftl keycode 51 = Meta_less
+ altgr alt shiftl keycode 51 = Meta_comma
+ shift altgr alt shiftl keycode 51 = Meta_less
+ shiftr keycode 51 = comma
+ shift shiftr keycode 51 = less
+ altgr shiftr keycode 51 = U+2500
+ shift altgr shiftr keycode 51 = multiply
+ alt shiftr keycode 51 = Meta_comma
+ shift alt shiftr keycode 51 = Meta_less
+ altgr alt shiftr keycode 51 = Meta_comma
+ shift altgr alt shiftr keycode 51 = Meta_less
+ shiftl shiftr keycode 51 = comma
+ shift shiftl shiftr keycode 51 = less
+ altgr shiftl shiftr keycode 51 = U+2500
+ shift altgr shiftl shiftr keycode 51 = multiply
+ alt shiftl shiftr keycode 51 = Meta_comma
+ shift alt shiftl shiftr keycode 51 = Meta_less
+ altgr alt shiftl shiftr keycode 51 = Meta_comma
+ shift altgr alt shiftl shiftr keycode 51 = Meta_less
+ ctrll keycode 51 = comma
+ shift ctrll keycode 51 = less
+ altgr ctrll keycode 51 = U+2500
+ shift altgr ctrll keycode 51 = multiply
+ alt ctrll keycode 51 = Meta_comma
+ shift alt ctrll keycode 51 = Meta_less
+ altgr alt ctrll keycode 51 = Meta_comma
+ shift altgr alt ctrll keycode 51 = Meta_less
+ shiftl ctrll keycode 51 = comma
+ shift shiftl ctrll keycode 51 = less
+ altgr shiftl ctrll keycode 51 = U+2500
+ shift altgr shiftl ctrll keycode 51 = multiply
+ alt shiftl ctrll keycode 51 = Meta_comma
+ shift alt shiftl ctrll keycode 51 = Meta_less
+ altgr alt shiftl ctrll keycode 51 = Meta_comma
+ shift altgr alt shiftl ctrll keycode 51 = Meta_less
+ shiftr ctrll keycode 51 = comma
+ shift shiftr ctrll keycode 51 = less
+ altgr shiftr ctrll keycode 51 = U+2500
+ shift altgr shiftr ctrll keycode 51 = multiply
+ alt shiftr ctrll keycode 51 = Meta_comma
+ shift alt shiftr ctrll keycode 51 = Meta_less
+ altgr alt shiftr ctrll keycode 51 = Meta_comma
+ shift altgr alt shiftr ctrll keycode 51 = Meta_less
+ shiftl shiftr ctrll keycode 51 = comma
+ shift shiftl shiftr ctrll keycode 51 = less
+ altgr shiftl shiftr ctrll keycode 51 = U+2500
+ shift altgr shiftl shiftr ctrll keycode 51 = multiply
+ alt shiftl shiftr ctrll keycode 51 = Meta_comma
+ shift alt shiftl shiftr ctrll keycode 51 = Meta_less
+ altgr alt shiftl shiftr ctrll keycode 51 = Meta_comma
+ shift altgr alt shiftl shiftr ctrll keycode 51 = Meta_less
+keycode 52 = period
+ shift keycode 52 = greater
+ altgr keycode 52 = periodcentered
+ shift altgr keycode 52 = division
+ control keycode 52 = Compose
+ shift control keycode 52 = Compose
+ altgr control keycode 52 = Compose
+ shift altgr control keycode 52 = Compose
+ alt keycode 52 = Meta_period
+ shift alt keycode 52 = Meta_greater
+ altgr alt keycode 52 = Meta_period
+ shift altgr alt keycode 52 = Meta_greater
+ control alt keycode 52 = Compose
+ shift control alt keycode 52 = Compose
+ altgr control alt keycode 52 = Compose
+ shift altgr control alt keycode 52 = Compose
+ shift shiftl keycode 52 = greater
+ altgr shiftl keycode 52 = periodcentered
+ shift altgr shiftl keycode 52 = division
+ control shiftl keycode 52 = Compose
+ shift control shiftl keycode 52 = Compose
+ altgr control shiftl keycode 52 = Compose
+ shift altgr control shiftl keycode 52 = Compose
+ alt shiftl keycode 52 = Meta_period
+ shift alt shiftl keycode 52 = Meta_greater
+ altgr alt shiftl keycode 52 = Meta_period
+ shift altgr alt shiftl keycode 52 = Meta_greater
+ control alt shiftl keycode 52 = Compose
+ shift control alt shiftl keycode 52 = Compose
+ altgr control alt shiftl keycode 52 = Compose
+ shift altgr control alt shiftl keycode 52 = Compose
+ shift shiftr keycode 52 = greater
+ altgr shiftr keycode 52 = periodcentered
+ shift altgr shiftr keycode 52 = division
+ control shiftr keycode 52 = Compose
+ shift control shiftr keycode 52 = Compose
+ altgr control shiftr keycode 52 = Compose
+ shift altgr control shiftr keycode 52 = Compose
+ alt shiftr keycode 52 = Meta_period
+ shift alt shiftr keycode 52 = Meta_greater
+ altgr alt shiftr keycode 52 = Meta_period
+ shift altgr alt shiftr keycode 52 = Meta_greater
+ control alt shiftr keycode 52 = Compose
+ shift control alt shiftr keycode 52 = Compose
+ altgr control alt shiftr keycode 52 = Compose
+ shift altgr control alt shiftr keycode 52 = Compose
+ shift shiftl shiftr keycode 52 = greater
+ altgr shiftl shiftr keycode 52 = periodcentered
+ shift altgr shiftl shiftr keycode 52 = division
+ control shiftl shiftr keycode 52 = Compose
+ shift control shiftl shiftr keycode 52 = Compose
+ altgr control shiftl shiftr keycode 52 = Compose
+ shift altgr control shiftl shiftr keycode 52 = Compose
+ alt shiftl shiftr keycode 52 = Meta_period
+ shift alt shiftl shiftr keycode 52 = Meta_greater
+ altgr alt shiftl shiftr keycode 52 = Meta_period
+ shift altgr alt shiftl shiftr keycode 52 = Meta_greater
+ control alt shiftl shiftr keycode 52 = Compose
+ shift control alt shiftl shiftr keycode 52 = Compose
+ altgr control alt shiftl shiftr keycode 52 = Compose
+ shift altgr control alt shiftl shiftr keycode 52 = Compose
+ shift ctrll keycode 52 = greater
+ altgr ctrll keycode 52 = periodcentered
+ shift altgr ctrll keycode 52 = division
+ control ctrll keycode 52 = Compose
+ shift control ctrll keycode 52 = Compose
+ altgr control ctrll keycode 52 = Compose
+ shift altgr control ctrll keycode 52 = Compose
+ alt ctrll keycode 52 = Meta_period
+ shift alt ctrll keycode 52 = Meta_greater
+ altgr alt ctrll keycode 52 = Meta_period
+ shift altgr alt ctrll keycode 52 = Meta_greater
+ control alt ctrll keycode 52 = Compose
+ shift control alt ctrll keycode 52 = Compose
+ altgr control alt ctrll keycode 52 = Compose
+ shift altgr control alt ctrll keycode 52 = Compose
+ shift shiftl ctrll keycode 52 = greater
+ altgr shiftl ctrll keycode 52 = periodcentered
+ shift altgr shiftl ctrll keycode 52 = division
+ control shiftl ctrll keycode 52 = Compose
+ shift control shiftl ctrll keycode 52 = Compose
+ altgr control shiftl ctrll keycode 52 = Compose
+ shift altgr control shiftl ctrll keycode 52 = Compose
+ alt shiftl ctrll keycode 52 = Meta_period
+ shift alt shiftl ctrll keycode 52 = Meta_greater
+ altgr alt shiftl ctrll keycode 52 = Meta_period
+ shift altgr alt shiftl ctrll keycode 52 = Meta_greater
+ control alt shiftl ctrll keycode 52 = Compose
+ shift control alt shiftl ctrll keycode 52 = Compose
+ altgr control alt shiftl ctrll keycode 52 = Compose
+ shift altgr control alt shiftl ctrll keycode 52 = Compose
+ shift shiftr ctrll keycode 52 = greater
+ altgr shiftr ctrll keycode 52 = periodcentered
+ shift altgr shiftr ctrll keycode 52 = division
+ control shiftr ctrll keycode 52 = Compose
+ shift control shiftr ctrll keycode 52 = Compose
+ altgr control shiftr ctrll keycode 52 = Compose
+ shift altgr control shiftr ctrll keycode 52 = Compose
+ alt shiftr ctrll keycode 52 = Meta_period
+ shift alt shiftr ctrll keycode 52 = Meta_greater
+ altgr alt shiftr ctrll keycode 52 = Meta_period
+ shift altgr alt shiftr ctrll keycode 52 = Meta_greater
+ control alt shiftr ctrll keycode 52 = Compose
+ shift control alt shiftr ctrll keycode 52 = Compose
+ altgr control alt shiftr ctrll keycode 52 = Compose
+ shift altgr control alt shiftr ctrll keycode 52 = Compose
+ shift shiftl shiftr ctrll keycode 52 = greater
+ altgr shiftl shiftr ctrll keycode 52 = periodcentered
+ shift altgr shiftl shiftr ctrll keycode 52 = division
+ control shiftl shiftr ctrll keycode 52 = Compose
+ shift control shiftl shiftr ctrll keycode 52 = Compose
+ altgr control shiftl shiftr ctrll keycode 52 = Compose
+ shift altgr control shiftl shiftr ctrll keycode 52 = Compose
+ alt shiftl shiftr ctrll keycode 52 = Meta_period
+ shift alt shiftl shiftr ctrll keycode 52 = Meta_greater
+ altgr alt shiftl shiftr ctrll keycode 52 = Meta_period
+ shift altgr alt shiftl shiftr ctrll keycode 52 = Meta_greater
+ control alt shiftl shiftr ctrll keycode 52 = Compose
+ shift control alt shiftl shiftr ctrll keycode 52 = Compose
+ altgr control alt shiftl shiftr ctrll keycode 52 = Compose
+ shift altgr control alt shiftl shiftr ctrll keycode 52 = Compose
+keycode 53 = semicolon
+ shift keycode 53 = colon
+ altgr keycode 53 = U+0323
+ shift altgr keycode 53 = period
+ control keycode 53 = Compose
+ shift control keycode 53 = Compose
+ altgr control keycode 53 = Compose
+ shift altgr control keycode 53 = Compose
+ alt keycode 53 = Meta_semicolon
+ shift alt keycode 53 = Meta_colon
+ altgr alt keycode 53 = Meta_semicolon
+ shift altgr alt keycode 53 = Meta_period
+ control alt keycode 53 = Compose
+ shift control alt keycode 53 = Compose
+ altgr control alt keycode 53 = Compose
+ shift altgr control alt keycode 53 = Compose
+ shift shiftl keycode 53 = colon
+ altgr shiftl keycode 53 = U+0323
+ shift altgr shiftl keycode 53 = period
+ control shiftl keycode 53 = Compose
+ shift control shiftl keycode 53 = Compose
+ altgr control shiftl keycode 53 = Compose
+ shift altgr control shiftl keycode 53 = Compose
+ alt shiftl keycode 53 = Meta_semicolon
+ shift alt shiftl keycode 53 = Meta_colon
+ altgr alt shiftl keycode 53 = Meta_semicolon
+ shift altgr alt shiftl keycode 53 = Meta_period
+ control alt shiftl keycode 53 = Compose
+ shift control alt shiftl keycode 53 = Compose
+ altgr control alt shiftl keycode 53 = Compose
+ shift altgr control alt shiftl keycode 53 = Compose
+ shift shiftr keycode 53 = colon
+ altgr shiftr keycode 53 = U+0323
+ shift altgr shiftr keycode 53 = period
+ control shiftr keycode 53 = Compose
+ shift control shiftr keycode 53 = Compose
+ altgr control shiftr keycode 53 = Compose
+ shift altgr control shiftr keycode 53 = Compose
+ alt shiftr keycode 53 = Meta_semicolon
+ shift alt shiftr keycode 53 = Meta_colon
+ altgr alt shiftr keycode 53 = Meta_semicolon
+ shift altgr alt shiftr keycode 53 = Meta_period
+ control alt shiftr keycode 53 = Compose
+ shift control alt shiftr keycode 53 = Compose
+ altgr control alt shiftr keycode 53 = Compose
+ shift altgr control alt shiftr keycode 53 = Compose
+ shift shiftl shiftr keycode 53 = colon
+ altgr shiftl shiftr keycode 53 = U+0323
+ shift altgr shiftl shiftr keycode 53 = period
+ control shiftl shiftr keycode 53 = Compose
+ shift control shiftl shiftr keycode 53 = Compose
+ altgr control shiftl shiftr keycode 53 = Compose
+ shift altgr control shiftl shiftr keycode 53 = Compose
+ alt shiftl shiftr keycode 53 = Meta_semicolon
+ shift alt shiftl shiftr keycode 53 = Meta_colon
+ altgr alt shiftl shiftr keycode 53 = Meta_semicolon
+ shift altgr alt shiftl shiftr keycode 53 = Meta_period
+ control alt shiftl shiftr keycode 53 = Compose
+ shift control alt shiftl shiftr keycode 53 = Compose
+ altgr control alt shiftl shiftr keycode 53 = Compose
+ shift altgr control alt shiftl shiftr keycode 53 = Compose
+ shift ctrll keycode 53 = colon
+ altgr ctrll keycode 53 = U+0323
+ shift altgr ctrll keycode 53 = period
+ control ctrll keycode 53 = Compose
+ shift control ctrll keycode 53 = Compose
+ altgr control ctrll keycode 53 = Compose
+ shift altgr control ctrll keycode 53 = Compose
+ alt ctrll keycode 53 = Meta_semicolon
+ shift alt ctrll keycode 53 = Meta_colon
+ altgr alt ctrll keycode 53 = Meta_semicolon
+ shift altgr alt ctrll keycode 53 = Meta_period
+ control alt ctrll keycode 53 = Compose
+ shift control alt ctrll keycode 53 = Compose
+ altgr control alt ctrll keycode 53 = Compose
+ shift altgr control alt ctrll keycode 53 = Compose
+ shift shiftl ctrll keycode 53 = colon
+ altgr shiftl ctrll keycode 53 = U+0323
+ shift altgr shiftl ctrll keycode 53 = period
+ control shiftl ctrll keycode 53 = Compose
+ shift control shiftl ctrll keycode 53 = Compose
+ altgr control shiftl ctrll keycode 53 = Compose
+ shift altgr control shiftl ctrll keycode 53 = Compose
+ alt shiftl ctrll keycode 53 = Meta_semicolon
+ shift alt shiftl ctrll keycode 53 = Meta_colon
+ altgr alt shiftl ctrll keycode 53 = Meta_semicolon
+ shift altgr alt shiftl ctrll keycode 53 = Meta_period
+ control alt shiftl ctrll keycode 53 = Compose
+ shift control alt shiftl ctrll keycode 53 = Compose
+ altgr control alt shiftl ctrll keycode 53 = Compose
+ shift altgr control alt shiftl ctrll keycode 53 = Compose
+ shift shiftr ctrll keycode 53 = colon
+ altgr shiftr ctrll keycode 53 = U+0323
+ shift altgr shiftr ctrll keycode 53 = period
+ control shiftr ctrll keycode 53 = Compose
+ shift control shiftr ctrll keycode 53 = Compose
+ altgr control shiftr ctrll keycode 53 = Compose
+ shift altgr control shiftr ctrll keycode 53 = Compose
+ alt shiftr ctrll keycode 53 = Meta_semicolon
+ shift alt shiftr ctrll keycode 53 = Meta_colon
+ altgr alt shiftr ctrll keycode 53 = Meta_semicolon
+ shift altgr alt shiftr ctrll keycode 53 = Meta_period
+ control alt shiftr ctrll keycode 53 = Compose
+ shift control alt shiftr ctrll keycode 53 = Compose
+ altgr control alt shiftr ctrll keycode 53 = Compose
+ shift altgr control alt shiftr ctrll keycode 53 = Compose
+ shift shiftl shiftr ctrll keycode 53 = colon
+ altgr shiftl shiftr ctrll keycode 53 = U+0323
+ shift altgr shiftl shiftr ctrll keycode 53 = period
+ control shiftl shiftr ctrll keycode 53 = Compose
+ shift control shiftl shiftr ctrll keycode 53 = Compose
+ altgr control shiftl shiftr ctrll keycode 53 = Compose
+ shift altgr control shiftl shiftr ctrll keycode 53 = Compose
+ alt shiftl shiftr ctrll keycode 53 = Meta_semicolon
+ shift alt shiftl shiftr ctrll keycode 53 = Meta_colon
+ altgr alt shiftl shiftr ctrll keycode 53 = Meta_semicolon
+ shift altgr alt shiftl shiftr ctrll keycode 53 = Meta_period
+ control alt shiftl shiftr ctrll keycode 53 = Compose
+ shift control alt shiftl shiftr ctrll keycode 53 = Compose
+ altgr control alt shiftl shiftr ctrll keycode 53 = Compose
+ shift altgr control alt shiftl shiftr ctrll keycode 53 = Compose
+keycode 54 = Shift
+keycode 55 = KP_Multiply
+ altgr keycode 55 = Hex_C
+ shift alt keycode 55 = Hex_C
+ altgr shiftl keycode 55 = Hex_C
+ shift alt shiftl keycode 55 = Hex_C
+ altgr shiftr keycode 55 = Hex_C
+ shift alt shiftr keycode 55 = Hex_C
+ altgr shiftl shiftr keycode 55 = Hex_C
+ shift alt shiftl shiftr keycode 55 = Hex_C
+ altgr ctrll keycode 55 = Hex_C
+ shift alt ctrll keycode 55 = Hex_C
+ altgr shiftl ctrll keycode 55 = Hex_C
+ shift alt shiftl ctrll keycode 55 = Hex_C
+ altgr shiftr ctrll keycode 55 = Hex_C
+ shift alt shiftr ctrll keycode 55 = Hex_C
+ altgr shiftl shiftr ctrll keycode 55 = Hex_C
+ shift alt shiftl shiftr ctrll keycode 55 = Hex_C
+keycode 56 = Alt
+keycode 57 = space
+ control keycode 57 = nul
+ shift control keycode 57 = nul
+ altgr control keycode 57 = nul
+ shift altgr control keycode 57 = nul
+ alt keycode 57 = Meta_space
+ shift alt keycode 57 = Meta_space
+ altgr alt keycode 57 = Meta_space
+ shift altgr alt keycode 57 = Meta_space
+ control alt keycode 57 = Meta_nul
+ shift control alt keycode 57 = Meta_nul
+ altgr control alt keycode 57 = Meta_nul
+ shift altgr control alt keycode 57 = Meta_nul
+ control shiftl keycode 57 = nul
+ shift control shiftl keycode 57 = nul
+ altgr control shiftl keycode 57 = nul
+ shift altgr control shiftl keycode 57 = nul
+ alt shiftl keycode 57 = Meta_space
+ shift alt shiftl keycode 57 = Meta_space
+ altgr alt shiftl keycode 57 = Meta_space
+ shift altgr alt shiftl keycode 57 = Meta_space
+ control alt shiftl keycode 57 = Meta_nul
+ shift control alt shiftl keycode 57 = Meta_nul
+ altgr control alt shiftl keycode 57 = Meta_nul
+ shift altgr control alt shiftl keycode 57 = Meta_nul
+ control shiftr keycode 57 = nul
+ shift control shiftr keycode 57 = nul
+ altgr control shiftr keycode 57 = nul
+ shift altgr control shiftr keycode 57 = nul
+ alt shiftr keycode 57 = Meta_space
+ shift alt shiftr keycode 57 = Meta_space
+ altgr alt shiftr keycode 57 = Meta_space
+ shift altgr alt shiftr keycode 57 = Meta_space
+ control alt shiftr keycode 57 = Meta_nul
+ shift control alt shiftr keycode 57 = Meta_nul
+ altgr control alt shiftr keycode 57 = Meta_nul
+ shift altgr control alt shiftr keycode 57 = Meta_nul
+ control shiftl shiftr keycode 57 = nul
+ shift control shiftl shiftr keycode 57 = nul
+ altgr control shiftl shiftr keycode 57 = nul
+ shift altgr control shiftl shiftr keycode 57 = nul
+ alt shiftl shiftr keycode 57 = Meta_space
+ shift alt shiftl shiftr keycode 57 = Meta_space
+ altgr alt shiftl shiftr keycode 57 = Meta_space
+ shift altgr alt shiftl shiftr keycode 57 = Meta_space
+ control alt shiftl shiftr keycode 57 = Meta_nul
+ shift control alt shiftl shiftr keycode 57 = Meta_nul
+ altgr control alt shiftl shiftr keycode 57 = Meta_nul
+ shift altgr control alt shiftl shiftr keycode 57 = Meta_nul
+ control ctrll keycode 57 = nul
+ shift control ctrll keycode 57 = nul
+ altgr control ctrll keycode 57 = nul
+ shift altgr control ctrll keycode 57 = nul
+ alt ctrll keycode 57 = Meta_space
+ shift alt ctrll keycode 57 = Meta_space
+ altgr alt ctrll keycode 57 = Meta_space
+ shift altgr alt ctrll keycode 57 = Meta_space
+ control alt ctrll keycode 57 = Meta_nul
+ shift control alt ctrll keycode 57 = Meta_nul
+ altgr control alt ctrll keycode 57 = Meta_nul
+ shift altgr control alt ctrll keycode 57 = Meta_nul
+ control shiftl ctrll keycode 57 = nul
+ shift control shiftl ctrll keycode 57 = nul
+ altgr control shiftl ctrll keycode 57 = nul
+ shift altgr control shiftl ctrll keycode 57 = nul
+ alt shiftl ctrll keycode 57 = Meta_space
+ shift alt shiftl ctrll keycode 57 = Meta_space
+ altgr alt shiftl ctrll keycode 57 = Meta_space
+ shift altgr alt shiftl ctrll keycode 57 = Meta_space
+ control alt shiftl ctrll keycode 57 = Meta_nul
+ shift control alt shiftl ctrll keycode 57 = Meta_nul
+ altgr control alt shiftl ctrll keycode 57 = Meta_nul
+ shift altgr control alt shiftl ctrll keycode 57 = Meta_nul
+ control shiftr ctrll keycode 57 = nul
+ shift control shiftr ctrll keycode 57 = nul
+ altgr control shiftr ctrll keycode 57 = nul
+ shift altgr control shiftr ctrll keycode 57 = nul
+ alt shiftr ctrll keycode 57 = Meta_space
+ shift alt shiftr ctrll keycode 57 = Meta_space
+ altgr alt shiftr ctrll keycode 57 = Meta_space
+ shift altgr alt shiftr ctrll keycode 57 = Meta_space
+ control alt shiftr ctrll keycode 57 = Meta_nul
+ shift control alt shiftr ctrll keycode 57 = Meta_nul
+ altgr control alt shiftr ctrll keycode 57 = Meta_nul
+ shift altgr control alt shiftr ctrll keycode 57 = Meta_nul
+ control shiftl shiftr ctrll keycode 57 = nul
+ shift control shiftl shiftr ctrll keycode 57 = nul
+ altgr control shiftl shiftr ctrll keycode 57 = nul
+ shift altgr control shiftl shiftr ctrll keycode 57 = nul
+ alt shiftl shiftr ctrll keycode 57 = Meta_space
+ shift alt shiftl shiftr ctrll keycode 57 = Meta_space
+ altgr alt shiftl shiftr ctrll keycode 57 = Meta_space
+ shift altgr alt shiftl shiftr ctrll keycode 57 = Meta_space
+ control alt shiftl shiftr ctrll keycode 57 = Meta_nul
+ shift control alt shiftl shiftr ctrll keycode 57 = Meta_nul
+ altgr control alt shiftl shiftr ctrll keycode 57 = Meta_nul
+ shift altgr control alt shiftl shiftr ctrll keycode 57 = Meta_nul
+keycode 58 = CtrlL_Lock
+keycode 59 = F1
+ shift keycode 59 = F13
+ altgr keycode 59 = Console_13
+ shift altgr keycode 59 = Console_25
+ control keycode 59 = F25
+ shift control keycode 59 = F37
+ altgr control keycode 59 = Console_13
+ shift altgr control keycode 59 = Console_25
+ alt keycode 59 = Console_1
+ shift alt keycode 59 = Console_13
+ control alt keycode 59 = Console_1
+ shift control alt keycode 59 = Console_13
+ shift shiftl keycode 59 = F13
+ altgr shiftl keycode 59 = Console_13
+ shift altgr shiftl keycode 59 = Console_25
+ control shiftl keycode 59 = F25
+ shift control shiftl keycode 59 = F37
+ altgr control shiftl keycode 59 = Console_13
+ shift altgr control shiftl keycode 59 = Console_25
+ alt shiftl keycode 59 = Console_1
+ shift alt shiftl keycode 59 = Console_13
+ control alt shiftl keycode 59 = Console_1
+ shift control alt shiftl keycode 59 = Console_13
+ shift shiftr keycode 59 = F13
+ altgr shiftr keycode 59 = Console_13
+ shift altgr shiftr keycode 59 = Console_25
+ control shiftr keycode 59 = F25
+ shift control shiftr keycode 59 = F37
+ altgr control shiftr keycode 59 = Console_13
+ shift altgr control shiftr keycode 59 = Console_25
+ alt shiftr keycode 59 = Console_1
+ shift alt shiftr keycode 59 = Console_13
+ control alt shiftr keycode 59 = Console_1
+ shift control alt shiftr keycode 59 = Console_13
+ shift shiftl shiftr keycode 59 = F13
+ altgr shiftl shiftr keycode 59 = Console_13
+ shift altgr shiftl shiftr keycode 59 = Console_25
+ control shiftl shiftr keycode 59 = F25
+ shift control shiftl shiftr keycode 59 = F37
+ altgr control shiftl shiftr keycode 59 = Console_13
+ shift altgr control shiftl shiftr keycode 59 = Console_25
+ alt shiftl shiftr keycode 59 = Console_1
+ shift alt shiftl shiftr keycode 59 = Console_13
+ control alt shiftl shiftr keycode 59 = Console_1
+ shift control alt shiftl shiftr keycode 59 = Console_13
+ shift ctrll keycode 59 = F13
+ altgr ctrll keycode 59 = Console_13
+ shift altgr ctrll keycode 59 = Console_25
+ control ctrll keycode 59 = F25
+ shift control ctrll keycode 59 = F37
+ altgr control ctrll keycode 59 = Console_13
+ shift altgr control ctrll keycode 59 = Console_25
+ alt ctrll keycode 59 = Console_1
+ shift alt ctrll keycode 59 = Console_13
+ control alt ctrll keycode 59 = Console_1
+ shift control alt ctrll keycode 59 = Console_13
+ shift shiftl ctrll keycode 59 = F13
+ altgr shiftl ctrll keycode 59 = Console_13
+ shift altgr shiftl ctrll keycode 59 = Console_25
+ control shiftl ctrll keycode 59 = F25
+ shift control shiftl ctrll keycode 59 = F37
+ altgr control shiftl ctrll keycode 59 = Console_13
+ shift altgr control shiftl ctrll keycode 59 = Console_25
+ alt shiftl ctrll keycode 59 = Console_1
+ shift alt shiftl ctrll keycode 59 = Console_13
+ control alt shiftl ctrll keycode 59 = Console_1
+ shift control alt shiftl ctrll keycode 59 = Console_13
+ shift shiftr ctrll keycode 59 = F13
+ altgr shiftr ctrll keycode 59 = Console_13
+ shift altgr shiftr ctrll keycode 59 = Console_25
+ control shiftr ctrll keycode 59 = F25
+ shift control shiftr ctrll keycode 59 = F37
+ altgr control shiftr ctrll keycode 59 = Console_13
+ shift altgr control shiftr ctrll keycode 59 = Console_25
+ alt shiftr ctrll keycode 59 = Console_1
+ shift alt shiftr ctrll keycode 59 = Console_13
+ control alt shiftr ctrll keycode 59 = Console_1
+ shift control alt shiftr ctrll keycode 59 = Console_13
+ shift shiftl shiftr ctrll keycode 59 = F13
+ altgr shiftl shiftr ctrll keycode 59 = Console_13
+ shift altgr shiftl shiftr ctrll keycode 59 = Console_25
+ control shiftl shiftr ctrll keycode 59 = F25
+ shift control shiftl shiftr ctrll keycode 59 = F37
+ altgr control shiftl shiftr ctrll keycode 59 = Console_13
+ shift altgr control shiftl shiftr ctrll keycode 59 = Console_25
+ alt shiftl shiftr ctrll keycode 59 = Console_1
+ shift alt shiftl shiftr ctrll keycode 59 = Console_13
+ control alt shiftl shiftr ctrll keycode 59 = Console_1
+ shift control alt shiftl shiftr ctrll keycode 59 = Console_13
+keycode 60 = F2
+ shift keycode 60 = F14
+ altgr keycode 60 = Console_14
+ shift altgr keycode 60 = Console_26
+ control keycode 60 = F26
+ shift control keycode 60 = F38
+ altgr control keycode 60 = Console_14
+ shift altgr control keycode 60 = Console_26
+ alt keycode 60 = Console_2
+ shift alt keycode 60 = Console_14
+ control alt keycode 60 = Console_2
+ shift control alt keycode 60 = Console_14
+ shift shiftl keycode 60 = F14
+ altgr shiftl keycode 60 = Console_14
+ shift altgr shiftl keycode 60 = Console_26
+ control shiftl keycode 60 = F26
+ shift control shiftl keycode 60 = F38
+ altgr control shiftl keycode 60 = Console_14
+ shift altgr control shiftl keycode 60 = Console_26
+ alt shiftl keycode 60 = Console_2
+ shift alt shiftl keycode 60 = Console_14
+ control alt shiftl keycode 60 = Console_2
+ shift control alt shiftl keycode 60 = Console_14
+ shift shiftr keycode 60 = F14
+ altgr shiftr keycode 60 = Console_14
+ shift altgr shiftr keycode 60 = Console_26
+ control shiftr keycode 60 = F26
+ shift control shiftr keycode 60 = F38
+ altgr control shiftr keycode 60 = Console_14
+ shift altgr control shiftr keycode 60 = Console_26
+ alt shiftr keycode 60 = Console_2
+ shift alt shiftr keycode 60 = Console_14
+ control alt shiftr keycode 60 = Console_2
+ shift control alt shiftr keycode 60 = Console_14
+ shift shiftl shiftr keycode 60 = F14
+ altgr shiftl shiftr keycode 60 = Console_14
+ shift altgr shiftl shiftr keycode 60 = Console_26
+ control shiftl shiftr keycode 60 = F26
+ shift control shiftl shiftr keycode 60 = F38
+ altgr control shiftl shiftr keycode 60 = Console_14
+ shift altgr control shiftl shiftr keycode 60 = Console_26
+ alt shiftl shiftr keycode 60 = Console_2
+ shift alt shiftl shiftr keycode 60 = Console_14
+ control alt shiftl shiftr keycode 60 = Console_2
+ shift control alt shiftl shiftr keycode 60 = Console_14
+ shift ctrll keycode 60 = F14
+ altgr ctrll keycode 60 = Console_14
+ shift altgr ctrll keycode 60 = Console_26
+ control ctrll keycode 60 = F26
+ shift control ctrll keycode 60 = F38
+ altgr control ctrll keycode 60 = Console_14
+ shift altgr control ctrll keycode 60 = Console_26
+ alt ctrll keycode 60 = Console_2
+ shift alt ctrll keycode 60 = Console_14
+ control alt ctrll keycode 60 = Console_2
+ shift control alt ctrll keycode 60 = Console_14
+ shift shiftl ctrll keycode 60 = F14
+ altgr shiftl ctrll keycode 60 = Console_14
+ shift altgr shiftl ctrll keycode 60 = Console_26
+ control shiftl ctrll keycode 60 = F26
+ shift control shiftl ctrll keycode 60 = F38
+ altgr control shiftl ctrll keycode 60 = Console_14
+ shift altgr control shiftl ctrll keycode 60 = Console_26
+ alt shiftl ctrll keycode 60 = Console_2
+ shift alt shiftl ctrll keycode 60 = Console_14
+ control alt shiftl ctrll keycode 60 = Console_2
+ shift control alt shiftl ctrll keycode 60 = Console_14
+ shift shiftr ctrll keycode 60 = F14
+ altgr shiftr ctrll keycode 60 = Console_14
+ shift altgr shiftr ctrll keycode 60 = Console_26
+ control shiftr ctrll keycode 60 = F26
+ shift control shiftr ctrll keycode 60 = F38
+ altgr control shiftr ctrll keycode 60 = Console_14
+ shift altgr control shiftr ctrll keycode 60 = Console_26
+ alt shiftr ctrll keycode 60 = Console_2
+ shift alt shiftr ctrll keycode 60 = Console_14
+ control alt shiftr ctrll keycode 60 = Console_2
+ shift control alt shiftr ctrll keycode 60 = Console_14
+ shift shiftl shiftr ctrll keycode 60 = F14
+ altgr shiftl shiftr ctrll keycode 60 = Console_14
+ shift altgr shiftl shiftr ctrll keycode 60 = Console_26
+ control shiftl shiftr ctrll keycode 60 = F26
+ shift control shiftl shiftr ctrll keycode 60 = F38
+ altgr control shiftl shiftr ctrll keycode 60 = Console_14
+ shift altgr control shiftl shiftr ctrll keycode 60 = Console_26
+ alt shiftl shiftr ctrll keycode 60 = Console_2
+ shift alt shiftl shiftr ctrll keycode 60 = Console_14
+ control alt shiftl shiftr ctrll keycode 60 = Console_2
+ shift control alt shiftl shiftr ctrll keycode 60 = Console_14
+keycode 61 = F3
+ shift keycode 61 = F15
+ altgr keycode 61 = Console_15
+ shift altgr keycode 61 = Console_27
+ control keycode 61 = F27
+ shift control keycode 61 = F39
+ altgr control keycode 61 = Console_15
+ shift altgr control keycode 61 = Console_27
+ alt keycode 61 = Console_3
+ shift alt keycode 61 = Console_15
+ control alt keycode 61 = Console_3
+ shift control alt keycode 61 = Console_15
+ shift shiftl keycode 61 = F15
+ altgr shiftl keycode 61 = Console_15
+ shift altgr shiftl keycode 61 = Console_27
+ control shiftl keycode 61 = F27
+ shift control shiftl keycode 61 = F39
+ altgr control shiftl keycode 61 = Console_15
+ shift altgr control shiftl keycode 61 = Console_27
+ alt shiftl keycode 61 = Console_3
+ shift alt shiftl keycode 61 = Console_15
+ control alt shiftl keycode 61 = Console_3
+ shift control alt shiftl keycode 61 = Console_15
+ shift shiftr keycode 61 = F15
+ altgr shiftr keycode 61 = Console_15
+ shift altgr shiftr keycode 61 = Console_27
+ control shiftr keycode 61 = F27
+ shift control shiftr keycode 61 = F39
+ altgr control shiftr keycode 61 = Console_15
+ shift altgr control shiftr keycode 61 = Console_27
+ alt shiftr keycode 61 = Console_3
+ shift alt shiftr keycode 61 = Console_15
+ control alt shiftr keycode 61 = Console_3
+ shift control alt shiftr keycode 61 = Console_15
+ shift shiftl shiftr keycode 61 = F15
+ altgr shiftl shiftr keycode 61 = Console_15
+ shift altgr shiftl shiftr keycode 61 = Console_27
+ control shiftl shiftr keycode 61 = F27
+ shift control shiftl shiftr keycode 61 = F39
+ altgr control shiftl shiftr keycode 61 = Console_15
+ shift altgr control shiftl shiftr keycode 61 = Console_27
+ alt shiftl shiftr keycode 61 = Console_3
+ shift alt shiftl shiftr keycode 61 = Console_15
+ control alt shiftl shiftr keycode 61 = Console_3
+ shift control alt shiftl shiftr keycode 61 = Console_15
+ shift ctrll keycode 61 = F15
+ altgr ctrll keycode 61 = Console_15
+ shift altgr ctrll keycode 61 = Console_27
+ control ctrll keycode 61 = F27
+ shift control ctrll keycode 61 = F39
+ altgr control ctrll keycode 61 = Console_15
+ shift altgr control ctrll keycode 61 = Console_27
+ alt ctrll keycode 61 = Console_3
+ shift alt ctrll keycode 61 = Console_15
+ control alt ctrll keycode 61 = Console_3
+ shift control alt ctrll keycode 61 = Console_15
+ shift shiftl ctrll keycode 61 = F15
+ altgr shiftl ctrll keycode 61 = Console_15
+ shift altgr shiftl ctrll keycode 61 = Console_27
+ control shiftl ctrll keycode 61 = F27
+ shift control shiftl ctrll keycode 61 = F39
+ altgr control shiftl ctrll keycode 61 = Console_15
+ shift altgr control shiftl ctrll keycode 61 = Console_27
+ alt shiftl ctrll keycode 61 = Console_3
+ shift alt shiftl ctrll keycode 61 = Console_15
+ control alt shiftl ctrll keycode 61 = Console_3
+ shift control alt shiftl ctrll keycode 61 = Console_15
+ shift shiftr ctrll keycode 61 = F15
+ altgr shiftr ctrll keycode 61 = Console_15
+ shift altgr shiftr ctrll keycode 61 = Console_27
+ control shiftr ctrll keycode 61 = F27
+ shift control shiftr ctrll keycode 61 = F39
+ altgr control shiftr ctrll keycode 61 = Console_15
+ shift altgr control shiftr ctrll keycode 61 = Console_27
+ alt shiftr ctrll keycode 61 = Console_3
+ shift alt shiftr ctrll keycode 61 = Console_15
+ control alt shiftr ctrll keycode 61 = Console_3
+ shift control alt shiftr ctrll keycode 61 = Console_15
+ shift shiftl shiftr ctrll keycode 61 = F15
+ altgr shiftl shiftr ctrll keycode 61 = Console_15
+ shift altgr shiftl shiftr ctrll keycode 61 = Console_27
+ control shiftl shiftr ctrll keycode 61 = F27
+ shift control shiftl shiftr ctrll keycode 61 = F39
+ altgr control shiftl shiftr ctrll keycode 61 = Console_15
+ shift altgr control shiftl shiftr ctrll keycode 61 = Console_27
+ alt shiftl shiftr ctrll keycode 61 = Console_3
+ shift alt shiftl shiftr ctrll keycode 61 = Console_15
+ control alt shiftl shiftr ctrll keycode 61 = Console_3
+ shift control alt shiftl shiftr ctrll keycode 61 = Console_15
+keycode 62 = F4
+ shift keycode 62 = F16
+ altgr keycode 62 = Console_16
+ shift altgr keycode 62 = Console_28
+ control keycode 62 = F28
+ shift control keycode 62 = F40
+ altgr control keycode 62 = Console_16
+ shift altgr control keycode 62 = Console_28
+ alt keycode 62 = Console_4
+ shift alt keycode 62 = Console_16
+ control alt keycode 62 = Console_4
+ shift control alt keycode 62 = Console_16
+ shift shiftl keycode 62 = F16
+ altgr shiftl keycode 62 = Console_16
+ shift altgr shiftl keycode 62 = Console_28
+ control shiftl keycode 62 = F28
+ shift control shiftl keycode 62 = F40
+ altgr control shiftl keycode 62 = Console_16
+ shift altgr control shiftl keycode 62 = Console_28
+ alt shiftl keycode 62 = Console_4
+ shift alt shiftl keycode 62 = Console_16
+ control alt shiftl keycode 62 = Console_4
+ shift control alt shiftl keycode 62 = Console_16
+ shift shiftr keycode 62 = F16
+ altgr shiftr keycode 62 = Console_16
+ shift altgr shiftr keycode 62 = Console_28
+ control shiftr keycode 62 = F28
+ shift control shiftr keycode 62 = F40
+ altgr control shiftr keycode 62 = Console_16
+ shift altgr control shiftr keycode 62 = Console_28
+ alt shiftr keycode 62 = Console_4
+ shift alt shiftr keycode 62 = Console_16
+ control alt shiftr keycode 62 = Console_4
+ shift control alt shiftr keycode 62 = Console_16
+ shift shiftl shiftr keycode 62 = F16
+ altgr shiftl shiftr keycode 62 = Console_16
+ shift altgr shiftl shiftr keycode 62 = Console_28
+ control shiftl shiftr keycode 62 = F28
+ shift control shiftl shiftr keycode 62 = F40
+ altgr control shiftl shiftr keycode 62 = Console_16
+ shift altgr control shiftl shiftr keycode 62 = Console_28
+ alt shiftl shiftr keycode 62 = Console_4
+ shift alt shiftl shiftr keycode 62 = Console_16
+ control alt shiftl shiftr keycode 62 = Console_4
+ shift control alt shiftl shiftr keycode 62 = Console_16
+ shift ctrll keycode 62 = F16
+ altgr ctrll keycode 62 = Console_16
+ shift altgr ctrll keycode 62 = Console_28
+ control ctrll keycode 62 = F28
+ shift control ctrll keycode 62 = F40
+ altgr control ctrll keycode 62 = Console_16
+ shift altgr control ctrll keycode 62 = Console_28
+ alt ctrll keycode 62 = Console_4
+ shift alt ctrll keycode 62 = Console_16
+ control alt ctrll keycode 62 = Console_4
+ shift control alt ctrll keycode 62 = Console_16
+ shift shiftl ctrll keycode 62 = F16
+ altgr shiftl ctrll keycode 62 = Console_16
+ shift altgr shiftl ctrll keycode 62 = Console_28
+ control shiftl ctrll keycode 62 = F28
+ shift control shiftl ctrll keycode 62 = F40
+ altgr control shiftl ctrll keycode 62 = Console_16
+ shift altgr control shiftl ctrll keycode 62 = Console_28
+ alt shiftl ctrll keycode 62 = Console_4
+ shift alt shiftl ctrll keycode 62 = Console_16
+ control alt shiftl ctrll keycode 62 = Console_4
+ shift control alt shiftl ctrll keycode 62 = Console_16
+ shift shiftr ctrll keycode 62 = F16
+ altgr shiftr ctrll keycode 62 = Console_16
+ shift altgr shiftr ctrll keycode 62 = Console_28
+ control shiftr ctrll keycode 62 = F28
+ shift control shiftr ctrll keycode 62 = F40
+ altgr control shiftr ctrll keycode 62 = Console_16
+ shift altgr control shiftr ctrll keycode 62 = Console_28
+ alt shiftr ctrll keycode 62 = Console_4
+ shift alt shiftr ctrll keycode 62 = Console_16
+ control alt shiftr ctrll keycode 62 = Console_4
+ shift control alt shiftr ctrll keycode 62 = Console_16
+ shift shiftl shiftr ctrll keycode 62 = F16
+ altgr shiftl shiftr ctrll keycode 62 = Console_16
+ shift altgr shiftl shiftr ctrll keycode 62 = Console_28
+ control shiftl shiftr ctrll keycode 62 = F28
+ shift control shiftl shiftr ctrll keycode 62 = F40
+ altgr control shiftl shiftr ctrll keycode 62 = Console_16
+ shift altgr control shiftl shiftr ctrll keycode 62 = Console_28
+ alt shiftl shiftr ctrll keycode 62 = Console_4
+ shift alt shiftl shiftr ctrll keycode 62 = Console_16
+ control alt shiftl shiftr ctrll keycode 62 = Console_4
+ shift control alt shiftl shiftr ctrll keycode 62 = Console_16
+keycode 63 = F5
+ shift keycode 63 = F17
+ altgr keycode 63 = Console_17
+ shift altgr keycode 63 = Console_29
+ control keycode 63 = F29
+ shift control keycode 63 = F41
+ altgr control keycode 63 = Console_17
+ shift altgr control keycode 63 = Console_29
+ alt keycode 63 = Console_5
+ shift alt keycode 63 = Console_17
+ control alt keycode 63 = Console_5
+ shift control alt keycode 63 = Console_17
+ shift shiftl keycode 63 = F17
+ altgr shiftl keycode 63 = Console_17
+ shift altgr shiftl keycode 63 = Console_29
+ control shiftl keycode 63 = F29
+ shift control shiftl keycode 63 = F41
+ altgr control shiftl keycode 63 = Console_17
+ shift altgr control shiftl keycode 63 = Console_29
+ alt shiftl keycode 63 = Console_5
+ shift alt shiftl keycode 63 = Console_17
+ control alt shiftl keycode 63 = Console_5
+ shift control alt shiftl keycode 63 = Console_17
+ shift shiftr keycode 63 = F17
+ altgr shiftr keycode 63 = Console_17
+ shift altgr shiftr keycode 63 = Console_29
+ control shiftr keycode 63 = F29
+ shift control shiftr keycode 63 = F41
+ altgr control shiftr keycode 63 = Console_17
+ shift altgr control shiftr keycode 63 = Console_29
+ alt shiftr keycode 63 = Console_5
+ shift alt shiftr keycode 63 = Console_17
+ control alt shiftr keycode 63 = Console_5
+ shift control alt shiftr keycode 63 = Console_17
+ shift shiftl shiftr keycode 63 = F17
+ altgr shiftl shiftr keycode 63 = Console_17
+ shift altgr shiftl shiftr keycode 63 = Console_29
+ control shiftl shiftr keycode 63 = F29
+ shift control shiftl shiftr keycode 63 = F41
+ altgr control shiftl shiftr keycode 63 = Console_17
+ shift altgr control shiftl shiftr keycode 63 = Console_29
+ alt shiftl shiftr keycode 63 = Console_5
+ shift alt shiftl shiftr keycode 63 = Console_17
+ control alt shiftl shiftr keycode 63 = Console_5
+ shift control alt shiftl shiftr keycode 63 = Console_17
+ shift ctrll keycode 63 = F17
+ altgr ctrll keycode 63 = Console_17
+ shift altgr ctrll keycode 63 = Console_29
+ control ctrll keycode 63 = F29
+ shift control ctrll keycode 63 = F41
+ altgr control ctrll keycode 63 = Console_17
+ shift altgr control ctrll keycode 63 = Console_29
+ alt ctrll keycode 63 = Console_5
+ shift alt ctrll keycode 63 = Console_17
+ control alt ctrll keycode 63 = Console_5
+ shift control alt ctrll keycode 63 = Console_17
+ shift shiftl ctrll keycode 63 = F17
+ altgr shiftl ctrll keycode 63 = Console_17
+ shift altgr shiftl ctrll keycode 63 = Console_29
+ control shiftl ctrll keycode 63 = F29
+ shift control shiftl ctrll keycode 63 = F41
+ altgr control shiftl ctrll keycode 63 = Console_17
+ shift altgr control shiftl ctrll keycode 63 = Console_29
+ alt shiftl ctrll keycode 63 = Console_5
+ shift alt shiftl ctrll keycode 63 = Console_17
+ control alt shiftl ctrll keycode 63 = Console_5
+ shift control alt shiftl ctrll keycode 63 = Console_17
+ shift shiftr ctrll keycode 63 = F17
+ altgr shiftr ctrll keycode 63 = Console_17
+ shift altgr shiftr ctrll keycode 63 = Console_29
+ control shiftr ctrll keycode 63 = F29
+ shift control shiftr ctrll keycode 63 = F41
+ altgr control shiftr ctrll keycode 63 = Console_17
+ shift altgr control shiftr ctrll keycode 63 = Console_29
+ alt shiftr ctrll keycode 63 = Console_5
+ shift alt shiftr ctrll keycode 63 = Console_17
+ control alt shiftr ctrll keycode 63 = Console_5
+ shift control alt shiftr ctrll keycode 63 = Console_17
+ shift shiftl shiftr ctrll keycode 63 = F17
+ altgr shiftl shiftr ctrll keycode 63 = Console_17
+ shift altgr shiftl shiftr ctrll keycode 63 = Console_29
+ control shiftl shiftr ctrll keycode 63 = F29
+ shift control shiftl shiftr ctrll keycode 63 = F41
+ altgr control shiftl shiftr ctrll keycode 63 = Console_17
+ shift altgr control shiftl shiftr ctrll keycode 63 = Console_29
+ alt shiftl shiftr ctrll keycode 63 = Console_5
+ shift alt shiftl shiftr ctrll keycode 63 = Console_17
+ control alt shiftl shiftr ctrll keycode 63 = Console_5
+ shift control alt shiftl shiftr ctrll keycode 63 = Console_17
+keycode 64 = F6
+ shift keycode 64 = F18
+ altgr keycode 64 = Console_18
+ shift altgr keycode 64 = Console_30
+ control keycode 64 = F30
+ shift control keycode 64 = F42
+ altgr control keycode 64 = Console_18
+ shift altgr control keycode 64 = Console_30
+ alt keycode 64 = Console_6
+ shift alt keycode 64 = Console_18
+ control alt keycode 64 = Console_6
+ shift control alt keycode 64 = Console_18
+ shift shiftl keycode 64 = F18
+ altgr shiftl keycode 64 = Console_18
+ shift altgr shiftl keycode 64 = Console_30
+ control shiftl keycode 64 = F30
+ shift control shiftl keycode 64 = F42
+ altgr control shiftl keycode 64 = Console_18
+ shift altgr control shiftl keycode 64 = Console_30
+ alt shiftl keycode 64 = Console_6
+ shift alt shiftl keycode 64 = Console_18
+ control alt shiftl keycode 64 = Console_6
+ shift control alt shiftl keycode 64 = Console_18
+ shift shiftr keycode 64 = F18
+ altgr shiftr keycode 64 = Console_18
+ shift altgr shiftr keycode 64 = Console_30
+ control shiftr keycode 64 = F30
+ shift control shiftr keycode 64 = F42
+ altgr control shiftr keycode 64 = Console_18
+ shift altgr control shiftr keycode 64 = Console_30
+ alt shiftr keycode 64 = Console_6
+ shift alt shiftr keycode 64 = Console_18
+ control alt shiftr keycode 64 = Console_6
+ shift control alt shiftr keycode 64 = Console_18
+ shift shiftl shiftr keycode 64 = F18
+ altgr shiftl shiftr keycode 64 = Console_18
+ shift altgr shiftl shiftr keycode 64 = Console_30
+ control shiftl shiftr keycode 64 = F30
+ shift control shiftl shiftr keycode 64 = F42
+ altgr control shiftl shiftr keycode 64 = Console_18
+ shift altgr control shiftl shiftr keycode 64 = Console_30
+ alt shiftl shiftr keycode 64 = Console_6
+ shift alt shiftl shiftr keycode 64 = Console_18
+ control alt shiftl shiftr keycode 64 = Console_6
+ shift control alt shiftl shiftr keycode 64 = Console_18
+ shift ctrll keycode 64 = F18
+ altgr ctrll keycode 64 = Console_18
+ shift altgr ctrll keycode 64 = Console_30
+ control ctrll keycode 64 = F30
+ shift control ctrll keycode 64 = F42
+ altgr control ctrll keycode 64 = Console_18
+ shift altgr control ctrll keycode 64 = Console_30
+ alt ctrll keycode 64 = Console_6
+ shift alt ctrll keycode 64 = Console_18
+ control alt ctrll keycode 64 = Console_6
+ shift control alt ctrll keycode 64 = Console_18
+ shift shiftl ctrll keycode 64 = F18
+ altgr shiftl ctrll keycode 64 = Console_18
+ shift altgr shiftl ctrll keycode 64 = Console_30
+ control shiftl ctrll keycode 64 = F30
+ shift control shiftl ctrll keycode 64 = F42
+ altgr control shiftl ctrll keycode 64 = Console_18
+ shift altgr control shiftl ctrll keycode 64 = Console_30
+ alt shiftl ctrll keycode 64 = Console_6
+ shift alt shiftl ctrll keycode 64 = Console_18
+ control alt shiftl ctrll keycode 64 = Console_6
+ shift control alt shiftl ctrll keycode 64 = Console_18
+ shift shiftr ctrll keycode 64 = F18
+ altgr shiftr ctrll keycode 64 = Console_18
+ shift altgr shiftr ctrll keycode 64 = Console_30
+ control shiftr ctrll keycode 64 = F30
+ shift control shiftr ctrll keycode 64 = F42
+ altgr control shiftr ctrll keycode 64 = Console_18
+ shift altgr control shiftr ctrll keycode 64 = Console_30
+ alt shiftr ctrll keycode 64 = Console_6
+ shift alt shiftr ctrll keycode 64 = Console_18
+ control alt shiftr ctrll keycode 64 = Console_6
+ shift control alt shiftr ctrll keycode 64 = Console_18
+ shift shiftl shiftr ctrll keycode 64 = F18
+ altgr shiftl shiftr ctrll keycode 64 = Console_18
+ shift altgr shiftl shiftr ctrll keycode 64 = Console_30
+ control shiftl shiftr ctrll keycode 64 = F30
+ shift control shiftl shiftr ctrll keycode 64 = F42
+ altgr control shiftl shiftr ctrll keycode 64 = Console_18
+ shift altgr control shiftl shiftr ctrll keycode 64 = Console_30
+ alt shiftl shiftr ctrll keycode 64 = Console_6
+ shift alt shiftl shiftr ctrll keycode 64 = Console_18
+ control alt shiftl shiftr ctrll keycode 64 = Console_6
+ shift control alt shiftl shiftr ctrll keycode 64 = Console_18
+keycode 65 = F7
+ shift keycode 65 = F19
+ altgr keycode 65 = Console_19
+ shift altgr keycode 65 = Console_31
+ control keycode 65 = F31
+ shift control keycode 65 = F43
+ altgr control keycode 65 = Console_19
+ shift altgr control keycode 65 = Console_31
+ alt keycode 65 = Console_7
+ shift alt keycode 65 = Console_19
+ control alt keycode 65 = Console_7
+ shift control alt keycode 65 = Console_19
+ shift shiftl keycode 65 = F19
+ altgr shiftl keycode 65 = Console_19
+ shift altgr shiftl keycode 65 = Console_31
+ control shiftl keycode 65 = F31
+ shift control shiftl keycode 65 = F43
+ altgr control shiftl keycode 65 = Console_19
+ shift altgr control shiftl keycode 65 = Console_31
+ alt shiftl keycode 65 = Console_7
+ shift alt shiftl keycode 65 = Console_19
+ control alt shiftl keycode 65 = Console_7
+ shift control alt shiftl keycode 65 = Console_19
+ shift shiftr keycode 65 = F19
+ altgr shiftr keycode 65 = Console_19
+ shift altgr shiftr keycode 65 = Console_31
+ control shiftr keycode 65 = F31
+ shift control shiftr keycode 65 = F43
+ altgr control shiftr keycode 65 = Console_19
+ shift altgr control shiftr keycode 65 = Console_31
+ alt shiftr keycode 65 = Console_7
+ shift alt shiftr keycode 65 = Console_19
+ control alt shiftr keycode 65 = Console_7
+ shift control alt shiftr keycode 65 = Console_19
+ shift shiftl shiftr keycode 65 = F19
+ altgr shiftl shiftr keycode 65 = Console_19
+ shift altgr shiftl shiftr keycode 65 = Console_31
+ control shiftl shiftr keycode 65 = F31
+ shift control shiftl shiftr keycode 65 = F43
+ altgr control shiftl shiftr keycode 65 = Console_19
+ shift altgr control shiftl shiftr keycode 65 = Console_31
+ alt shiftl shiftr keycode 65 = Console_7
+ shift alt shiftl shiftr keycode 65 = Console_19
+ control alt shiftl shiftr keycode 65 = Console_7
+ shift control alt shiftl shiftr keycode 65 = Console_19
+ shift ctrll keycode 65 = F19
+ altgr ctrll keycode 65 = Console_19
+ shift altgr ctrll keycode 65 = Console_31
+ control ctrll keycode 65 = F31
+ shift control ctrll keycode 65 = F43
+ altgr control ctrll keycode 65 = Console_19
+ shift altgr control ctrll keycode 65 = Console_31
+ alt ctrll keycode 65 = Console_7
+ shift alt ctrll keycode 65 = Console_19
+ control alt ctrll keycode 65 = Console_7
+ shift control alt ctrll keycode 65 = Console_19
+ shift shiftl ctrll keycode 65 = F19
+ altgr shiftl ctrll keycode 65 = Console_19
+ shift altgr shiftl ctrll keycode 65 = Console_31
+ control shiftl ctrll keycode 65 = F31
+ shift control shiftl ctrll keycode 65 = F43
+ altgr control shiftl ctrll keycode 65 = Console_19
+ shift altgr control shiftl ctrll keycode 65 = Console_31
+ alt shiftl ctrll keycode 65 = Console_7
+ shift alt shiftl ctrll keycode 65 = Console_19
+ control alt shiftl ctrll keycode 65 = Console_7
+ shift control alt shiftl ctrll keycode 65 = Console_19
+ shift shiftr ctrll keycode 65 = F19
+ altgr shiftr ctrll keycode 65 = Console_19
+ shift altgr shiftr ctrll keycode 65 = Console_31
+ control shiftr ctrll keycode 65 = F31
+ shift control shiftr ctrll keycode 65 = F43
+ altgr control shiftr ctrll keycode 65 = Console_19
+ shift altgr control shiftr ctrll keycode 65 = Console_31
+ alt shiftr ctrll keycode 65 = Console_7
+ shift alt shiftr ctrll keycode 65 = Console_19
+ control alt shiftr ctrll keycode 65 = Console_7
+ shift control alt shiftr ctrll keycode 65 = Console_19
+ shift shiftl shiftr ctrll keycode 65 = F19
+ altgr shiftl shiftr ctrll keycode 65 = Console_19
+ shift altgr shiftl shiftr ctrll keycode 65 = Console_31
+ control shiftl shiftr ctrll keycode 65 = F31
+ shift control shiftl shiftr ctrll keycode 65 = F43
+ altgr control shiftl shiftr ctrll keycode 65 = Console_19
+ shift altgr control shiftl shiftr ctrll keycode 65 = Console_31
+ alt shiftl shiftr ctrll keycode 65 = Console_7
+ shift alt shiftl shiftr ctrll keycode 65 = Console_19
+ control alt shiftl shiftr ctrll keycode 65 = Console_7
+ shift control alt shiftl shiftr ctrll keycode 65 = Console_19
+keycode 66 = F8
+ shift keycode 66 = F20
+ altgr keycode 66 = Console_20
+ shift altgr keycode 66 = Console_32
+ control keycode 66 = F32
+ shift control keycode 66 = F44
+ altgr control keycode 66 = Console_20
+ shift altgr control keycode 66 = Console_32
+ alt keycode 66 = Console_8
+ shift alt keycode 66 = Console_20
+ control alt keycode 66 = Console_8
+ shift control alt keycode 66 = Console_20
+ shift shiftl keycode 66 = F20
+ altgr shiftl keycode 66 = Console_20
+ shift altgr shiftl keycode 66 = Console_32
+ control shiftl keycode 66 = F32
+ shift control shiftl keycode 66 = F44
+ altgr control shiftl keycode 66 = Console_20
+ shift altgr control shiftl keycode 66 = Console_32
+ alt shiftl keycode 66 = Console_8
+ shift alt shiftl keycode 66 = Console_20
+ control alt shiftl keycode 66 = Console_8
+ shift control alt shiftl keycode 66 = Console_20
+ shift shiftr keycode 66 = F20
+ altgr shiftr keycode 66 = Console_20
+ shift altgr shiftr keycode 66 = Console_32
+ control shiftr keycode 66 = F32
+ shift control shiftr keycode 66 = F44
+ altgr control shiftr keycode 66 = Console_20
+ shift altgr control shiftr keycode 66 = Console_32
+ alt shiftr keycode 66 = Console_8
+ shift alt shiftr keycode 66 = Console_20
+ control alt shiftr keycode 66 = Console_8
+ shift control alt shiftr keycode 66 = Console_20
+ shift shiftl shiftr keycode 66 = F20
+ altgr shiftl shiftr keycode 66 = Console_20
+ shift altgr shiftl shiftr keycode 66 = Console_32
+ control shiftl shiftr keycode 66 = F32
+ shift control shiftl shiftr keycode 66 = F44
+ altgr control shiftl shiftr keycode 66 = Console_20
+ shift altgr control shiftl shiftr keycode 66 = Console_32
+ alt shiftl shiftr keycode 66 = Console_8
+ shift alt shiftl shiftr keycode 66 = Console_20
+ control alt shiftl shiftr keycode 66 = Console_8
+ shift control alt shiftl shiftr keycode 66 = Console_20
+ shift ctrll keycode 66 = F20
+ altgr ctrll keycode 66 = Console_20
+ shift altgr ctrll keycode 66 = Console_32
+ control ctrll keycode 66 = F32
+ shift control ctrll keycode 66 = F44
+ altgr control ctrll keycode 66 = Console_20
+ shift altgr control ctrll keycode 66 = Console_32
+ alt ctrll keycode 66 = Console_8
+ shift alt ctrll keycode 66 = Console_20
+ control alt ctrll keycode 66 = Console_8
+ shift control alt ctrll keycode 66 = Console_20
+ shift shiftl ctrll keycode 66 = F20
+ altgr shiftl ctrll keycode 66 = Console_20
+ shift altgr shiftl ctrll keycode 66 = Console_32
+ control shiftl ctrll keycode 66 = F32
+ shift control shiftl ctrll keycode 66 = F44
+ altgr control shiftl ctrll keycode 66 = Console_20
+ shift altgr control shiftl ctrll keycode 66 = Console_32
+ alt shiftl ctrll keycode 66 = Console_8
+ shift alt shiftl ctrll keycode 66 = Console_20
+ control alt shiftl ctrll keycode 66 = Console_8
+ shift control alt shiftl ctrll keycode 66 = Console_20
+ shift shiftr ctrll keycode 66 = F20
+ altgr shiftr ctrll keycode 66 = Console_20
+ shift altgr shiftr ctrll keycode 66 = Console_32
+ control shiftr ctrll keycode 66 = F32
+ shift control shiftr ctrll keycode 66 = F44
+ altgr control shiftr ctrll keycode 66 = Console_20
+ shift altgr control shiftr ctrll keycode 66 = Console_32
+ alt shiftr ctrll keycode 66 = Console_8
+ shift alt shiftr ctrll keycode 66 = Console_20
+ control alt shiftr ctrll keycode 66 = Console_8
+ shift control alt shiftr ctrll keycode 66 = Console_20
+ shift shiftl shiftr ctrll keycode 66 = F20
+ altgr shiftl shiftr ctrll keycode 66 = Console_20
+ shift altgr shiftl shiftr ctrll keycode 66 = Console_32
+ control shiftl shiftr ctrll keycode 66 = F32
+ shift control shiftl shiftr ctrll keycode 66 = F44
+ altgr control shiftl shiftr ctrll keycode 66 = Console_20
+ shift altgr control shiftl shiftr ctrll keycode 66 = Console_32
+ alt shiftl shiftr ctrll keycode 66 = Console_8
+ shift alt shiftl shiftr ctrll keycode 66 = Console_20
+ control alt shiftl shiftr ctrll keycode 66 = Console_8
+ shift control alt shiftl shiftr ctrll keycode 66 = Console_20
+keycode 67 = F9
+ shift keycode 67 = F21
+ altgr keycode 67 = Console_21
+ shift altgr keycode 67 = Console_33
+ control keycode 67 = F33
+ shift control keycode 67 = F45
+ altgr control keycode 67 = Console_21
+ shift altgr control keycode 67 = Console_33
+ alt keycode 67 = Console_9
+ shift alt keycode 67 = Console_21
+ control alt keycode 67 = Console_9
+ shift control alt keycode 67 = Console_21
+ shift shiftl keycode 67 = F21
+ altgr shiftl keycode 67 = Console_21
+ shift altgr shiftl keycode 67 = Console_33
+ control shiftl keycode 67 = F33
+ shift control shiftl keycode 67 = F45
+ altgr control shiftl keycode 67 = Console_21
+ shift altgr control shiftl keycode 67 = Console_33
+ alt shiftl keycode 67 = Console_9
+ shift alt shiftl keycode 67 = Console_21
+ control alt shiftl keycode 67 = Console_9
+ shift control alt shiftl keycode 67 = Console_21
+ shift shiftr keycode 67 = F21
+ altgr shiftr keycode 67 = Console_21
+ shift altgr shiftr keycode 67 = Console_33
+ control shiftr keycode 67 = F33
+ shift control shiftr keycode 67 = F45
+ altgr control shiftr keycode 67 = Console_21
+ shift altgr control shiftr keycode 67 = Console_33
+ alt shiftr keycode 67 = Console_9
+ shift alt shiftr keycode 67 = Console_21
+ control alt shiftr keycode 67 = Console_9
+ shift control alt shiftr keycode 67 = Console_21
+ shift shiftl shiftr keycode 67 = F21
+ altgr shiftl shiftr keycode 67 = Console_21
+ shift altgr shiftl shiftr keycode 67 = Console_33
+ control shiftl shiftr keycode 67 = F33
+ shift control shiftl shiftr keycode 67 = F45
+ altgr control shiftl shiftr keycode 67 = Console_21
+ shift altgr control shiftl shiftr keycode 67 = Console_33
+ alt shiftl shiftr keycode 67 = Console_9
+ shift alt shiftl shiftr keycode 67 = Console_21
+ control alt shiftl shiftr keycode 67 = Console_9
+ shift control alt shiftl shiftr keycode 67 = Console_21
+ shift ctrll keycode 67 = F21
+ altgr ctrll keycode 67 = Console_21
+ shift altgr ctrll keycode 67 = Console_33
+ control ctrll keycode 67 = F33
+ shift control ctrll keycode 67 = F45
+ altgr control ctrll keycode 67 = Console_21
+ shift altgr control ctrll keycode 67 = Console_33
+ alt ctrll keycode 67 = Console_9
+ shift alt ctrll keycode 67 = Console_21
+ control alt ctrll keycode 67 = Console_9
+ shift control alt ctrll keycode 67 = Console_21
+ shift shiftl ctrll keycode 67 = F21
+ altgr shiftl ctrll keycode 67 = Console_21
+ shift altgr shiftl ctrll keycode 67 = Console_33
+ control shiftl ctrll keycode 67 = F33
+ shift control shiftl ctrll keycode 67 = F45
+ altgr control shiftl ctrll keycode 67 = Console_21
+ shift altgr control shiftl ctrll keycode 67 = Console_33
+ alt shiftl ctrll keycode 67 = Console_9
+ shift alt shiftl ctrll keycode 67 = Console_21
+ control alt shiftl ctrll keycode 67 = Console_9
+ shift control alt shiftl ctrll keycode 67 = Console_21
+ shift shiftr ctrll keycode 67 = F21
+ altgr shiftr ctrll keycode 67 = Console_21
+ shift altgr shiftr ctrll keycode 67 = Console_33
+ control shiftr ctrll keycode 67 = F33
+ shift control shiftr ctrll keycode 67 = F45
+ altgr control shiftr ctrll keycode 67 = Console_21
+ shift altgr control shiftr ctrll keycode 67 = Console_33
+ alt shiftr ctrll keycode 67 = Console_9
+ shift alt shiftr ctrll keycode 67 = Console_21
+ control alt shiftr ctrll keycode 67 = Console_9
+ shift control alt shiftr ctrll keycode 67 = Console_21
+ shift shiftl shiftr ctrll keycode 67 = F21
+ altgr shiftl shiftr ctrll keycode 67 = Console_21
+ shift altgr shiftl shiftr ctrll keycode 67 = Console_33
+ control shiftl shiftr ctrll keycode 67 = F33
+ shift control shiftl shiftr ctrll keycode 67 = F45
+ altgr control shiftl shiftr ctrll keycode 67 = Console_21
+ shift altgr control shiftl shiftr ctrll keycode 67 = Console_33
+ alt shiftl shiftr ctrll keycode 67 = Console_9
+ shift alt shiftl shiftr ctrll keycode 67 = Console_21
+ control alt shiftl shiftr ctrll keycode 67 = Console_9
+ shift control alt shiftl shiftr ctrll keycode 67 = Console_21
+keycode 68 = F10
+ shift keycode 68 = F22
+ altgr keycode 68 = Console_22
+ shift altgr keycode 68 = Console_34
+ control keycode 68 = F34
+ shift control keycode 68 = F46
+ altgr control keycode 68 = Console_22
+ shift altgr control keycode 68 = Console_34
+ alt keycode 68 = Console_10
+ shift alt keycode 68 = Console_22
+ control alt keycode 68 = Console_10
+ shift control alt keycode 68 = Console_22
+ shift shiftl keycode 68 = F22
+ altgr shiftl keycode 68 = Console_22
+ shift altgr shiftl keycode 68 = Console_34
+ control shiftl keycode 68 = F34
+ shift control shiftl keycode 68 = F46
+ altgr control shiftl keycode 68 = Console_22
+ shift altgr control shiftl keycode 68 = Console_34
+ alt shiftl keycode 68 = Console_10
+ shift alt shiftl keycode 68 = Console_22
+ control alt shiftl keycode 68 = Console_10
+ shift control alt shiftl keycode 68 = Console_22
+ shift shiftr keycode 68 = F22
+ altgr shiftr keycode 68 = Console_22
+ shift altgr shiftr keycode 68 = Console_34
+ control shiftr keycode 68 = F34
+ shift control shiftr keycode 68 = F46
+ altgr control shiftr keycode 68 = Console_22
+ shift altgr control shiftr keycode 68 = Console_34
+ alt shiftr keycode 68 = Console_10
+ shift alt shiftr keycode 68 = Console_22
+ control alt shiftr keycode 68 = Console_10
+ shift control alt shiftr keycode 68 = Console_22
+ shift shiftl shiftr keycode 68 = F22
+ altgr shiftl shiftr keycode 68 = Console_22
+ shift altgr shiftl shiftr keycode 68 = Console_34
+ control shiftl shiftr keycode 68 = F34
+ shift control shiftl shiftr keycode 68 = F46
+ altgr control shiftl shiftr keycode 68 = Console_22
+ shift altgr control shiftl shiftr keycode 68 = Console_34
+ alt shiftl shiftr keycode 68 = Console_10
+ shift alt shiftl shiftr keycode 68 = Console_22
+ control alt shiftl shiftr keycode 68 = Console_10
+ shift control alt shiftl shiftr keycode 68 = Console_22
+ shift ctrll keycode 68 = F22
+ altgr ctrll keycode 68 = Console_22
+ shift altgr ctrll keycode 68 = Console_34
+ control ctrll keycode 68 = F34
+ shift control ctrll keycode 68 = F46
+ altgr control ctrll keycode 68 = Console_22
+ shift altgr control ctrll keycode 68 = Console_34
+ alt ctrll keycode 68 = Console_10
+ shift alt ctrll keycode 68 = Console_22
+ control alt ctrll keycode 68 = Console_10
+ shift control alt ctrll keycode 68 = Console_22
+ shift shiftl ctrll keycode 68 = F22
+ altgr shiftl ctrll keycode 68 = Console_22
+ shift altgr shiftl ctrll keycode 68 = Console_34
+ control shiftl ctrll keycode 68 = F34
+ shift control shiftl ctrll keycode 68 = F46
+ altgr control shiftl ctrll keycode 68 = Console_22
+ shift altgr control shiftl ctrll keycode 68 = Console_34
+ alt shiftl ctrll keycode 68 = Console_10
+ shift alt shiftl ctrll keycode 68 = Console_22
+ control alt shiftl ctrll keycode 68 = Console_10
+ shift control alt shiftl ctrll keycode 68 = Console_22
+ shift shiftr ctrll keycode 68 = F22
+ altgr shiftr ctrll keycode 68 = Console_22
+ shift altgr shiftr ctrll keycode 68 = Console_34
+ control shiftr ctrll keycode 68 = F34
+ shift control shiftr ctrll keycode 68 = F46
+ altgr control shiftr ctrll keycode 68 = Console_22
+ shift altgr control shiftr ctrll keycode 68 = Console_34
+ alt shiftr ctrll keycode 68 = Console_10
+ shift alt shiftr ctrll keycode 68 = Console_22
+ control alt shiftr ctrll keycode 68 = Console_10
+ shift control alt shiftr ctrll keycode 68 = Console_22
+ shift shiftl shiftr ctrll keycode 68 = F22
+ altgr shiftl shiftr ctrll keycode 68 = Console_22
+ shift altgr shiftl shiftr ctrll keycode 68 = Console_34
+ control shiftl shiftr ctrll keycode 68 = F34
+ shift control shiftl shiftr ctrll keycode 68 = F46
+ altgr control shiftl shiftr ctrll keycode 68 = Console_22
+ shift altgr control shiftl shiftr ctrll keycode 68 = Console_34
+ alt shiftl shiftr ctrll keycode 68 = Console_10
+ shift alt shiftl shiftr ctrll keycode 68 = Console_22
+ control alt shiftl shiftr ctrll keycode 68 = Console_10
+ shift control alt shiftl shiftr ctrll keycode 68 = Console_22
+keycode 69 = Num_Lock
+ altgr keycode 69 = Hex_A
+ shift alt keycode 69 = Hex_A
+ altgr shiftl keycode 69 = Hex_A
+ shift alt shiftl keycode 69 = Hex_A
+ altgr shiftr keycode 69 = Hex_A
+ shift alt shiftr keycode 69 = Hex_A
+ altgr shiftl shiftr keycode 69 = Hex_A
+ shift alt shiftl shiftr keycode 69 = Hex_A
+ altgr ctrll keycode 69 = Hex_A
+ shift alt ctrll keycode 69 = Hex_A
+ altgr shiftl ctrll keycode 69 = Hex_A
+ shift alt shiftl ctrll keycode 69 = Hex_A
+ altgr shiftr ctrll keycode 69 = Hex_A
+ shift alt shiftr ctrll keycode 69 = Hex_A
+ altgr shiftl shiftr ctrll keycode 69 = Hex_A
+ shift alt shiftl shiftr ctrll keycode 69 = Hex_A
+keycode 70 = Scroll_Lock
+ shift keycode 70 = Show_Memory
+ altgr keycode 70 = Show_Registers
+ control keycode 70 = Show_State
+ alt keycode 70 = Show_Registers
+ shift shiftl keycode 70 = Show_Memory
+ altgr shiftl keycode 70 = Show_Registers
+ control shiftl keycode 70 = Show_State
+ alt shiftl keycode 70 = Show_Registers
+ shift shiftr keycode 70 = Show_Memory
+ altgr shiftr keycode 70 = Show_Registers
+ control shiftr keycode 70 = Show_State
+ alt shiftr keycode 70 = Show_Registers
+ shift shiftl shiftr keycode 70 = Show_Memory
+ altgr shiftl shiftr keycode 70 = Show_Registers
+ control shiftl shiftr keycode 70 = Show_State
+ alt shiftl shiftr keycode 70 = Show_Registers
+ shift ctrll keycode 70 = Show_Memory
+ altgr ctrll keycode 70 = Show_Registers
+ control ctrll keycode 70 = Show_State
+ alt ctrll keycode 70 = Show_Registers
+ shift shiftl ctrll keycode 70 = Show_Memory
+ altgr shiftl ctrll keycode 70 = Show_Registers
+ control shiftl ctrll keycode 70 = Show_State
+ alt shiftl ctrll keycode 70 = Show_Registers
+ shift shiftr ctrll keycode 70 = Show_Memory
+ altgr shiftr ctrll keycode 70 = Show_Registers
+ control shiftr ctrll keycode 70 = Show_State
+ alt shiftr ctrll keycode 70 = Show_Registers
+ shift shiftl shiftr ctrll keycode 70 = Show_Memory
+ altgr shiftl shiftr ctrll keycode 70 = Show_Registers
+ control shiftl shiftr ctrll keycode 70 = Show_State
+ alt shiftl shiftr ctrll keycode 70 = Show_Registers
+keycode 71 = KP_7
+ altgr keycode 71 = Hex_7
+ alt keycode 71 = Ascii_7
+ shift alt keycode 71 = Hex_7
+ altgr shiftl keycode 71 = Hex_7
+ alt shiftl keycode 71 = Ascii_7
+ shift alt shiftl keycode 71 = Hex_7
+ altgr shiftr keycode 71 = Hex_7
+ alt shiftr keycode 71 = Ascii_7
+ shift alt shiftr keycode 71 = Hex_7
+ altgr shiftl shiftr keycode 71 = Hex_7
+ alt shiftl shiftr keycode 71 = Ascii_7
+ shift alt shiftl shiftr keycode 71 = Hex_7
+ altgr ctrll keycode 71 = Hex_7
+ alt ctrll keycode 71 = Ascii_7
+ shift alt ctrll keycode 71 = Hex_7
+ altgr shiftl ctrll keycode 71 = Hex_7
+ alt shiftl ctrll keycode 71 = Ascii_7
+ shift alt shiftl ctrll keycode 71 = Hex_7
+ altgr shiftr ctrll keycode 71 = Hex_7
+ alt shiftr ctrll keycode 71 = Ascii_7
+ shift alt shiftr ctrll keycode 71 = Hex_7
+ altgr shiftl shiftr ctrll keycode 71 = Hex_7
+ alt shiftl shiftr ctrll keycode 71 = Ascii_7
+ shift alt shiftl shiftr ctrll keycode 71 = Hex_7
+keycode 72 = KP_8
+ altgr keycode 72 = Hex_8
+ alt keycode 72 = Ascii_8
+ shift alt keycode 72 = Hex_8
+ altgr shiftl keycode 72 = Hex_8
+ alt shiftl keycode 72 = Ascii_8
+ shift alt shiftl keycode 72 = Hex_8
+ altgr shiftr keycode 72 = Hex_8
+ alt shiftr keycode 72 = Ascii_8
+ shift alt shiftr keycode 72 = Hex_8
+ altgr shiftl shiftr keycode 72 = Hex_8
+ alt shiftl shiftr keycode 72 = Ascii_8
+ shift alt shiftl shiftr keycode 72 = Hex_8
+ altgr ctrll keycode 72 = Hex_8
+ alt ctrll keycode 72 = Ascii_8
+ shift alt ctrll keycode 72 = Hex_8
+ altgr shiftl ctrll keycode 72 = Hex_8
+ alt shiftl ctrll keycode 72 = Ascii_8
+ shift alt shiftl ctrll keycode 72 = Hex_8
+ altgr shiftr ctrll keycode 72 = Hex_8
+ alt shiftr ctrll keycode 72 = Ascii_8
+ shift alt shiftr ctrll keycode 72 = Hex_8
+ altgr shiftl shiftr ctrll keycode 72 = Hex_8
+ alt shiftl shiftr ctrll keycode 72 = Ascii_8
+ shift alt shiftl shiftr ctrll keycode 72 = Hex_8
+keycode 73 = KP_9
+ altgr keycode 73 = Hex_9
+ alt keycode 73 = Ascii_9
+ shift alt keycode 73 = Hex_9
+ altgr shiftl keycode 73 = Hex_9
+ alt shiftl keycode 73 = Ascii_9
+ shift alt shiftl keycode 73 = Hex_9
+ altgr shiftr keycode 73 = Hex_9
+ alt shiftr keycode 73 = Ascii_9
+ shift alt shiftr keycode 73 = Hex_9
+ altgr shiftl shiftr keycode 73 = Hex_9
+ alt shiftl shiftr keycode 73 = Ascii_9
+ shift alt shiftl shiftr keycode 73 = Hex_9
+ altgr ctrll keycode 73 = Hex_9
+ alt ctrll keycode 73 = Ascii_9
+ shift alt ctrll keycode 73 = Hex_9
+ altgr shiftl ctrll keycode 73 = Hex_9
+ alt shiftl ctrll keycode 73 = Ascii_9
+ shift alt shiftl ctrll keycode 73 = Hex_9
+ altgr shiftr ctrll keycode 73 = Hex_9
+ alt shiftr ctrll keycode 73 = Ascii_9
+ shift alt shiftr ctrll keycode 73 = Hex_9
+ altgr shiftl shiftr ctrll keycode 73 = Hex_9
+ alt shiftl shiftr ctrll keycode 73 = Ascii_9
+ shift alt shiftl shiftr ctrll keycode 73 = Hex_9
+keycode 74 = KP_Subtract
+ altgr keycode 74 = Hex_D
+ shift alt keycode 74 = Hex_D
+ altgr shiftl keycode 74 = Hex_D
+ shift alt shiftl keycode 74 = Hex_D
+ altgr shiftr keycode 74 = Hex_D
+ shift alt shiftr keycode 74 = Hex_D
+ altgr shiftl shiftr keycode 74 = Hex_D
+ shift alt shiftl shiftr keycode 74 = Hex_D
+ altgr ctrll keycode 74 = Hex_D
+ shift alt ctrll keycode 74 = Hex_D
+ altgr shiftl ctrll keycode 74 = Hex_D
+ shift alt shiftl ctrll keycode 74 = Hex_D
+ altgr shiftr ctrll keycode 74 = Hex_D
+ shift alt shiftr ctrll keycode 74 = Hex_D
+ altgr shiftl shiftr ctrll keycode 74 = Hex_D
+ shift alt shiftl shiftr ctrll keycode 74 = Hex_D
+keycode 75 = KP_4
+ altgr keycode 75 = Hex_4
+ alt keycode 75 = Ascii_4
+ shift alt keycode 75 = Hex_4
+ altgr shiftl keycode 75 = Hex_4
+ alt shiftl keycode 75 = Ascii_4
+ shift alt shiftl keycode 75 = Hex_4
+ altgr shiftr keycode 75 = Hex_4
+ alt shiftr keycode 75 = Ascii_4
+ shift alt shiftr keycode 75 = Hex_4
+ altgr shiftl shiftr keycode 75 = Hex_4
+ alt shiftl shiftr keycode 75 = Ascii_4
+ shift alt shiftl shiftr keycode 75 = Hex_4
+ altgr ctrll keycode 75 = Hex_4
+ alt ctrll keycode 75 = Ascii_4
+ shift alt ctrll keycode 75 = Hex_4
+ altgr shiftl ctrll keycode 75 = Hex_4
+ alt shiftl ctrll keycode 75 = Ascii_4
+ shift alt shiftl ctrll keycode 75 = Hex_4
+ altgr shiftr ctrll keycode 75 = Hex_4
+ alt shiftr ctrll keycode 75 = Ascii_4
+ shift alt shiftr ctrll keycode 75 = Hex_4
+ altgr shiftl shiftr ctrll keycode 75 = Hex_4
+ alt shiftl shiftr ctrll keycode 75 = Ascii_4
+ shift alt shiftl shiftr ctrll keycode 75 = Hex_4
+keycode 76 = KP_5
+ altgr keycode 76 = Hex_5
+ alt keycode 76 = Ascii_5
+ shift alt keycode 76 = Hex_5
+ altgr shiftl keycode 76 = Hex_5
+ alt shiftl keycode 76 = Ascii_5
+ shift alt shiftl keycode 76 = Hex_5
+ altgr shiftr keycode 76 = Hex_5
+ alt shiftr keycode 76 = Ascii_5
+ shift alt shiftr keycode 76 = Hex_5
+ altgr shiftl shiftr keycode 76 = Hex_5
+ alt shiftl shiftr keycode 76 = Ascii_5
+ shift alt shiftl shiftr keycode 76 = Hex_5
+ altgr ctrll keycode 76 = Hex_5
+ alt ctrll keycode 76 = Ascii_5
+ shift alt ctrll keycode 76 = Hex_5
+ altgr shiftl ctrll keycode 76 = Hex_5
+ alt shiftl ctrll keycode 76 = Ascii_5
+ shift alt shiftl ctrll keycode 76 = Hex_5
+ altgr shiftr ctrll keycode 76 = Hex_5
+ alt shiftr ctrll keycode 76 = Ascii_5
+ shift alt shiftr ctrll keycode 76 = Hex_5
+ altgr shiftl shiftr ctrll keycode 76 = Hex_5
+ alt shiftl shiftr ctrll keycode 76 = Ascii_5
+ shift alt shiftl shiftr ctrll keycode 76 = Hex_5
+keycode 77 = KP_6
+ altgr keycode 77 = Hex_6
+ alt keycode 77 = Ascii_6
+ shift alt keycode 77 = Hex_6
+ altgr shiftl keycode 77 = Hex_6
+ alt shiftl keycode 77 = Ascii_6
+ shift alt shiftl keycode 77 = Hex_6
+ altgr shiftr keycode 77 = Hex_6
+ alt shiftr keycode 77 = Ascii_6
+ shift alt shiftr keycode 77 = Hex_6
+ altgr shiftl shiftr keycode 77 = Hex_6
+ alt shiftl shiftr keycode 77 = Ascii_6
+ shift alt shiftl shiftr keycode 77 = Hex_6
+ altgr ctrll keycode 77 = Hex_6
+ alt ctrll keycode 77 = Ascii_6
+ shift alt ctrll keycode 77 = Hex_6
+ altgr shiftl ctrll keycode 77 = Hex_6
+ alt shiftl ctrll keycode 77 = Ascii_6
+ shift alt shiftl ctrll keycode 77 = Hex_6
+ altgr shiftr ctrll keycode 77 = Hex_6
+ alt shiftr ctrll keycode 77 = Ascii_6
+ shift alt shiftr ctrll keycode 77 = Hex_6
+ altgr shiftl shiftr ctrll keycode 77 = Hex_6
+ alt shiftl shiftr ctrll keycode 77 = Ascii_6
+ shift alt shiftl shiftr ctrll keycode 77 = Hex_6
+keycode 78 = KP_Add
+ altgr keycode 78 = Hex_E
+ shift alt keycode 78 = Hex_E
+ altgr shiftl keycode 78 = Hex_E
+ shift alt shiftl keycode 78 = Hex_E
+ altgr shiftr keycode 78 = Hex_E
+ shift alt shiftr keycode 78 = Hex_E
+ altgr shiftl shiftr keycode 78 = Hex_E
+ shift alt shiftl shiftr keycode 78 = Hex_E
+ altgr ctrll keycode 78 = Hex_E
+ shift alt ctrll keycode 78 = Hex_E
+ altgr shiftl ctrll keycode 78 = Hex_E
+ shift alt shiftl ctrll keycode 78 = Hex_E
+ altgr shiftr ctrll keycode 78 = Hex_E
+ shift alt shiftr ctrll keycode 78 = Hex_E
+ altgr shiftl shiftr ctrll keycode 78 = Hex_E
+ shift alt shiftl shiftr ctrll keycode 78 = Hex_E
+keycode 79 = KP_1
+ altgr keycode 79 = Hex_1
+ alt keycode 79 = Ascii_1
+ shift alt keycode 79 = Hex_1
+ altgr shiftl keycode 79 = Hex_1
+ alt shiftl keycode 79 = Ascii_1
+ shift alt shiftl keycode 79 = Hex_1
+ altgr shiftr keycode 79 = Hex_1
+ alt shiftr keycode 79 = Ascii_1
+ shift alt shiftr keycode 79 = Hex_1
+ altgr shiftl shiftr keycode 79 = Hex_1
+ alt shiftl shiftr keycode 79 = Ascii_1
+ shift alt shiftl shiftr keycode 79 = Hex_1
+ altgr ctrll keycode 79 = Hex_1
+ alt ctrll keycode 79 = Ascii_1
+ shift alt ctrll keycode 79 = Hex_1
+ altgr shiftl ctrll keycode 79 = Hex_1
+ alt shiftl ctrll keycode 79 = Ascii_1
+ shift alt shiftl ctrll keycode 79 = Hex_1
+ altgr shiftr ctrll keycode 79 = Hex_1
+ alt shiftr ctrll keycode 79 = Ascii_1
+ shift alt shiftr ctrll keycode 79 = Hex_1
+ altgr shiftl shiftr ctrll keycode 79 = Hex_1
+ alt shiftl shiftr ctrll keycode 79 = Ascii_1
+ shift alt shiftl shiftr ctrll keycode 79 = Hex_1
+keycode 80 = KP_2
+ altgr keycode 80 = Hex_2
+ alt keycode 80 = Ascii_2
+ shift alt keycode 80 = Hex_2
+ altgr shiftl keycode 80 = Hex_2
+ alt shiftl keycode 80 = Ascii_2
+ shift alt shiftl keycode 80 = Hex_2
+ altgr shiftr keycode 80 = Hex_2
+ alt shiftr keycode 80 = Ascii_2
+ shift alt shiftr keycode 80 = Hex_2
+ altgr shiftl shiftr keycode 80 = Hex_2
+ alt shiftl shiftr keycode 80 = Ascii_2
+ shift alt shiftl shiftr keycode 80 = Hex_2
+ altgr ctrll keycode 80 = Hex_2
+ alt ctrll keycode 80 = Ascii_2
+ shift alt ctrll keycode 80 = Hex_2
+ altgr shiftl ctrll keycode 80 = Hex_2
+ alt shiftl ctrll keycode 80 = Ascii_2
+ shift alt shiftl ctrll keycode 80 = Hex_2
+ altgr shiftr ctrll keycode 80 = Hex_2
+ alt shiftr ctrll keycode 80 = Ascii_2
+ shift alt shiftr ctrll keycode 80 = Hex_2
+ altgr shiftl shiftr ctrll keycode 80 = Hex_2
+ alt shiftl shiftr ctrll keycode 80 = Ascii_2
+ shift alt shiftl shiftr ctrll keycode 80 = Hex_2
+keycode 81 = KP_3
+ altgr keycode 81 = Hex_3
+ alt keycode 81 = Ascii_3
+ shift alt keycode 81 = Hex_3
+ altgr shiftl keycode 81 = Hex_3
+ alt shiftl keycode 81 = Ascii_3
+ shift alt shiftl keycode 81 = Hex_3
+ altgr shiftr keycode 81 = Hex_3
+ alt shiftr keycode 81 = Ascii_3
+ shift alt shiftr keycode 81 = Hex_3
+ altgr shiftl shiftr keycode 81 = Hex_3
+ alt shiftl shiftr keycode 81 = Ascii_3
+ shift alt shiftl shiftr keycode 81 = Hex_3
+ altgr ctrll keycode 81 = Hex_3
+ alt ctrll keycode 81 = Ascii_3
+ shift alt ctrll keycode 81 = Hex_3
+ altgr shiftl ctrll keycode 81 = Hex_3
+ alt shiftl ctrll keycode 81 = Ascii_3
+ shift alt shiftl ctrll keycode 81 = Hex_3
+ altgr shiftr ctrll keycode 81 = Hex_3
+ alt shiftr ctrll keycode 81 = Ascii_3
+ shift alt shiftr ctrll keycode 81 = Hex_3
+ altgr shiftl shiftr ctrll keycode 81 = Hex_3
+ alt shiftl shiftr ctrll keycode 81 = Ascii_3
+ shift alt shiftl shiftr ctrll keycode 81 = Hex_3
+keycode 82 = KP_0
+ altgr keycode 82 = Hex_0
+ alt keycode 82 = Ascii_0
+ shift alt keycode 82 = Hex_0
+ altgr shiftl keycode 82 = Hex_0
+ alt shiftl keycode 82 = Ascii_0
+ shift alt shiftl keycode 82 = Hex_0
+ altgr shiftr keycode 82 = Hex_0
+ alt shiftr keycode 82 = Ascii_0
+ shift alt shiftr keycode 82 = Hex_0
+ altgr shiftl shiftr keycode 82 = Hex_0
+ alt shiftl shiftr keycode 82 = Ascii_0
+ shift alt shiftl shiftr keycode 82 = Hex_0
+ altgr ctrll keycode 82 = Hex_0
+ alt ctrll keycode 82 = Ascii_0
+ shift alt ctrll keycode 82 = Hex_0
+ altgr shiftl ctrll keycode 82 = Hex_0
+ alt shiftl ctrll keycode 82 = Ascii_0
+ shift alt shiftl ctrll keycode 82 = Hex_0
+ altgr shiftr ctrll keycode 82 = Hex_0
+ alt shiftr ctrll keycode 82 = Ascii_0
+ shift alt shiftr ctrll keycode 82 = Hex_0
+ altgr shiftl shiftr ctrll keycode 82 = Hex_0
+ alt shiftl shiftr ctrll keycode 82 = Ascii_0
+ shift alt shiftl shiftr ctrll keycode 82 = Hex_0
+keycode 83 = KP_Comma
+ altgr control keycode 83 = Boot
+ control alt keycode 83 = Boot
+ altgr control alt keycode 83 = Boot
+ altgr control shiftl keycode 83 = Boot
+ control alt shiftl keycode 83 = Boot
+ altgr control alt shiftl keycode 83 = Boot
+ altgr control shiftr keycode 83 = Boot
+ control alt shiftr keycode 83 = Boot
+ altgr control alt shiftr keycode 83 = Boot
+ altgr control shiftl shiftr keycode 83 = Boot
+ control alt shiftl shiftr keycode 83 = Boot
+ altgr control alt shiftl shiftr keycode 83 = Boot
+ altgr control ctrll keycode 83 = Boot
+ control alt ctrll keycode 83 = Boot
+ altgr control alt ctrll keycode 83 = Boot
+ altgr control shiftl ctrll keycode 83 = Boot
+ control alt shiftl ctrll keycode 83 = Boot
+ altgr control alt shiftl ctrll keycode 83 = Boot
+ altgr control shiftr ctrll keycode 83 = Boot
+ control alt shiftr ctrll keycode 83 = Boot
+ altgr control alt shiftr ctrll keycode 83 = Boot
+ altgr control shiftl shiftr ctrll keycode 83 = Boot
+ control alt shiftl shiftr ctrll keycode 83 = Boot
+ altgr control alt shiftl shiftr ctrll keycode 83 = Boot
+keycode 84 = Last_Console Last_Console Last_Console
+ control keycode 84 = Last_Console
+ shift control keycode 84 = Last_Console
+ alt keycode 84 = Last_Console
+ control alt keycode 84 = Last_Console
+keycode 85 =
+keycode 86 = backslash
+ shift keycode 86 = bar
+ altgr keycode 86 = +masculine
+ shift altgr keycode 86 = dead_tilde
+ control keycode 86 = Control_backslash
+ shift control keycode 86 = Control_backslash
+ altgr control keycode 86 = Control_backslash
+ shift altgr control keycode 86 = dead_tilde
+ alt keycode 86 = Meta_backslash
+ shift alt keycode 86 = Meta_bar
+ altgr alt keycode 86 = Meta_backslash
+ shift altgr alt keycode 86 = dead_tilde
+ control alt keycode 86 = Meta_Control_backslash
+ shift control alt keycode 86 = Meta_Control_backslash
+ altgr control alt keycode 86 = Meta_Control_backslash
+ shift altgr control alt keycode 86 = dead_tilde
+ shift shiftl keycode 86 = bar
+ altgr shiftl keycode 86 = +masculine
+ shift altgr shiftl keycode 86 = dead_tilde
+ control shiftl keycode 86 = Control_backslash
+ shift control shiftl keycode 86 = Control_backslash
+ altgr control shiftl keycode 86 = Control_backslash
+ shift altgr control shiftl keycode 86 = dead_tilde
+ alt shiftl keycode 86 = Meta_backslash
+ shift alt shiftl keycode 86 = Meta_bar
+ altgr alt shiftl keycode 86 = Meta_backslash
+ shift altgr alt shiftl keycode 86 = dead_tilde
+ control alt shiftl keycode 86 = Meta_Control_backslash
+ shift control alt shiftl keycode 86 = Meta_Control_backslash
+ altgr control alt shiftl keycode 86 = Meta_Control_backslash
+ shift altgr control alt shiftl keycode 86 = dead_tilde
+ shift shiftr keycode 86 = bar
+ altgr shiftr keycode 86 = +masculine
+ shift altgr shiftr keycode 86 = dead_tilde
+ control shiftr keycode 86 = Control_backslash
+ shift control shiftr keycode 86 = Control_backslash
+ altgr control shiftr keycode 86 = Control_backslash
+ shift altgr control shiftr keycode 86 = dead_tilde
+ alt shiftr keycode 86 = Meta_backslash
+ shift alt shiftr keycode 86 = Meta_bar
+ altgr alt shiftr keycode 86 = Meta_backslash
+ shift altgr alt shiftr keycode 86 = dead_tilde
+ control alt shiftr keycode 86 = Meta_Control_backslash
+ shift control alt shiftr keycode 86 = Meta_Control_backslash
+ altgr control alt shiftr keycode 86 = Meta_Control_backslash
+ shift altgr control alt shiftr keycode 86 = dead_tilde
+ shift shiftl shiftr keycode 86 = bar
+ altgr shiftl shiftr keycode 86 = +masculine
+ shift altgr shiftl shiftr keycode 86 = dead_tilde
+ control shiftl shiftr keycode 86 = Control_backslash
+ shift control shiftl shiftr keycode 86 = Control_backslash
+ altgr control shiftl shiftr keycode 86 = Control_backslash
+ shift altgr control shiftl shiftr keycode 86 = dead_tilde
+ alt shiftl shiftr keycode 86 = Meta_backslash
+ shift alt shiftl shiftr keycode 86 = Meta_bar
+ altgr alt shiftl shiftr keycode 86 = Meta_backslash
+ shift altgr alt shiftl shiftr keycode 86 = dead_tilde
+ control alt shiftl shiftr keycode 86 = Meta_Control_backslash
+ shift control alt shiftl shiftr keycode 86 = Meta_Control_backslash
+ altgr control alt shiftl shiftr keycode 86 = Meta_Control_backslash
+ shift altgr control alt shiftl shiftr keycode 86 = dead_tilde
+ shift ctrll keycode 86 = bar
+ altgr ctrll keycode 86 = +masculine
+ shift altgr ctrll keycode 86 = dead_tilde
+ control ctrll keycode 86 = Control_backslash
+ shift control ctrll keycode 86 = Control_backslash
+ altgr control ctrll keycode 86 = Control_backslash
+ shift altgr control ctrll keycode 86 = dead_tilde
+ alt ctrll keycode 86 = Meta_backslash
+ shift alt ctrll keycode 86 = Meta_bar
+ altgr alt ctrll keycode 86 = Meta_backslash
+ shift altgr alt ctrll keycode 86 = dead_tilde
+ control alt ctrll keycode 86 = Meta_Control_backslash
+ shift control alt ctrll keycode 86 = Meta_Control_backslash
+ altgr control alt ctrll keycode 86 = Meta_Control_backslash
+ shift altgr control alt ctrll keycode 86 = dead_tilde
+ shift shiftl ctrll keycode 86 = bar
+ altgr shiftl ctrll keycode 86 = +masculine
+ shift altgr shiftl ctrll keycode 86 = dead_tilde
+ control shiftl ctrll keycode 86 = Control_backslash
+ shift control shiftl ctrll keycode 86 = Control_backslash
+ altgr control shiftl ctrll keycode 86 = Control_backslash
+ shift altgr control shiftl ctrll keycode 86 = dead_tilde
+ alt shiftl ctrll keycode 86 = Meta_backslash
+ shift alt shiftl ctrll keycode 86 = Meta_bar
+ altgr alt shiftl ctrll keycode 86 = Meta_backslash
+ shift altgr alt shiftl ctrll keycode 86 = dead_tilde
+ control alt shiftl ctrll keycode 86 = Meta_Control_backslash
+ shift control alt shiftl ctrll keycode 86 = Meta_Control_backslash
+ altgr control alt shiftl ctrll keycode 86 = Meta_Control_backslash
+ shift altgr control alt shiftl ctrll keycode 86 = dead_tilde
+ shift shiftr ctrll keycode 86 = bar
+ altgr shiftr ctrll keycode 86 = +masculine
+ shift altgr shiftr ctrll keycode 86 = dead_tilde
+ control shiftr ctrll keycode 86 = Control_backslash
+ shift control shiftr ctrll keycode 86 = Control_backslash
+ altgr control shiftr ctrll keycode 86 = Control_backslash
+ shift altgr control shiftr ctrll keycode 86 = dead_tilde
+ alt shiftr ctrll keycode 86 = Meta_backslash
+ shift alt shiftr ctrll keycode 86 = Meta_bar
+ altgr alt shiftr ctrll keycode 86 = Meta_backslash
+ shift altgr alt shiftr ctrll keycode 86 = dead_tilde
+ control alt shiftr ctrll keycode 86 = Meta_Control_backslash
+ shift control alt shiftr ctrll keycode 86 = Meta_Control_backslash
+ altgr control alt shiftr ctrll keycode 86 = Meta_Control_backslash
+ shift altgr control alt shiftr ctrll keycode 86 = dead_tilde
+ shift shiftl shiftr ctrll keycode 86 = bar
+ altgr shiftl shiftr ctrll keycode 86 = +masculine
+ shift altgr shiftl shiftr ctrll keycode 86 = dead_tilde
+ control shiftl shiftr ctrll keycode 86 = Control_backslash
+ shift control shiftl shiftr ctrll keycode 86 = Control_backslash
+ altgr control shiftl shiftr ctrll keycode 86 = Control_backslash
+ shift altgr control shiftl shiftr ctrll keycode 86 = dead_tilde
+ alt shiftl shiftr ctrll keycode 86 = Meta_backslash
+ shift alt shiftl shiftr ctrll keycode 86 = Meta_bar
+ altgr alt shiftl shiftr ctrll keycode 86 = Meta_backslash
+ shift altgr alt shiftl shiftr ctrll keycode 86 = dead_tilde
+ control alt shiftl shiftr ctrll keycode 86 = Meta_Control_backslash
+ shift control alt shiftl shiftr ctrll keycode 86 = Meta_Control_backslash
+ altgr control alt shiftl shiftr ctrll keycode 86 = Meta_Control_backslash
+ shift altgr control alt shiftl shiftr ctrll keycode 86 = dead_tilde
+keycode 87 = F11
+ shift keycode 87 = F23
+ altgr keycode 87 = Console_23
+ shift altgr keycode 87 = Console_35
+ control keycode 87 = F35
+ shift control keycode 87 = F47
+ altgr control keycode 87 = Console_23
+ shift altgr control keycode 87 = Console_35
+ alt keycode 87 = Console_11
+ shift alt keycode 87 = Console_23
+ control alt keycode 87 = Console_11
+ shift control alt keycode 87 = Console_23
+ shift shiftl keycode 87 = F23
+ altgr shiftl keycode 87 = Console_23
+ shift altgr shiftl keycode 87 = Console_35
+ control shiftl keycode 87 = F35
+ shift control shiftl keycode 87 = F47
+ altgr control shiftl keycode 87 = Console_23
+ shift altgr control shiftl keycode 87 = Console_35
+ alt shiftl keycode 87 = Console_11
+ shift alt shiftl keycode 87 = Console_23
+ control alt shiftl keycode 87 = Console_11
+ shift control alt shiftl keycode 87 = Console_23
+ shift shiftr keycode 87 = F23
+ altgr shiftr keycode 87 = Console_23
+ shift altgr shiftr keycode 87 = Console_35
+ control shiftr keycode 87 = F35
+ shift control shiftr keycode 87 = F47
+ altgr control shiftr keycode 87 = Console_23
+ shift altgr control shiftr keycode 87 = Console_35
+ alt shiftr keycode 87 = Console_11
+ shift alt shiftr keycode 87 = Console_23
+ control alt shiftr keycode 87 = Console_11
+ shift control alt shiftr keycode 87 = Console_23
+ shift shiftl shiftr keycode 87 = F23
+ altgr shiftl shiftr keycode 87 = Console_23
+ shift altgr shiftl shiftr keycode 87 = Console_35
+ control shiftl shiftr keycode 87 = F35
+ shift control shiftl shiftr keycode 87 = F47
+ altgr control shiftl shiftr keycode 87 = Console_23
+ shift altgr control shiftl shiftr keycode 87 = Console_35
+ alt shiftl shiftr keycode 87 = Console_11
+ shift alt shiftl shiftr keycode 87 = Console_23
+ control alt shiftl shiftr keycode 87 = Console_11
+ shift control alt shiftl shiftr keycode 87 = Console_23
+ shift ctrll keycode 87 = F23
+ altgr ctrll keycode 87 = Console_23
+ shift altgr ctrll keycode 87 = Console_35
+ control ctrll keycode 87 = F35
+ shift control ctrll keycode 87 = F47
+ altgr control ctrll keycode 87 = Console_23
+ shift altgr control ctrll keycode 87 = Console_35
+ alt ctrll keycode 87 = Console_11
+ shift alt ctrll keycode 87 = Console_23
+ control alt ctrll keycode 87 = Console_11
+ shift control alt ctrll keycode 87 = Console_23
+ shift shiftl ctrll keycode 87 = F23
+ altgr shiftl ctrll keycode 87 = Console_23
+ shift altgr shiftl ctrll keycode 87 = Console_35
+ control shiftl ctrll keycode 87 = F35
+ shift control shiftl ctrll keycode 87 = F47
+ altgr control shiftl ctrll keycode 87 = Console_23
+ shift altgr control shiftl ctrll keycode 87 = Console_35
+ alt shiftl ctrll keycode 87 = Console_11
+ shift alt shiftl ctrll keycode 87 = Console_23
+ control alt shiftl ctrll keycode 87 = Console_11
+ shift control alt shiftl ctrll keycode 87 = Console_23
+ shift shiftr ctrll keycode 87 = F23
+ altgr shiftr ctrll keycode 87 = Console_23
+ shift altgr shiftr ctrll keycode 87 = Console_35
+ control shiftr ctrll keycode 87 = F35
+ shift control shiftr ctrll keycode 87 = F47
+ altgr control shiftr ctrll keycode 87 = Console_23
+ shift altgr control shiftr ctrll keycode 87 = Console_35
+ alt shiftr ctrll keycode 87 = Console_11
+ shift alt shiftr ctrll keycode 87 = Console_23
+ control alt shiftr ctrll keycode 87 = Console_11
+ shift control alt shiftr ctrll keycode 87 = Console_23
+ shift shiftl shiftr ctrll keycode 87 = F23
+ altgr shiftl shiftr ctrll keycode 87 = Console_23
+ shift altgr shiftl shiftr ctrll keycode 87 = Console_35
+ control shiftl shiftr ctrll keycode 87 = F35
+ shift control shiftl shiftr ctrll keycode 87 = F47
+ altgr control shiftl shiftr ctrll keycode 87 = Console_23
+ shift altgr control shiftl shiftr ctrll keycode 87 = Console_35
+ alt shiftl shiftr ctrll keycode 87 = Console_11
+ shift alt shiftl shiftr ctrll keycode 87 = Console_23
+ control alt shiftl shiftr ctrll keycode 87 = Console_11
+ shift control alt shiftl shiftr ctrll keycode 87 = Console_23
+keycode 88 = F12
+ shift keycode 88 = F24
+ altgr keycode 88 = Console_24
+ shift altgr keycode 88 = Console_36
+ control keycode 88 = F36
+ shift control keycode 88 = F48
+ altgr control keycode 88 = Console_24
+ shift altgr control keycode 88 = Console_36
+ alt keycode 88 = Console_12
+ shift alt keycode 88 = Console_24
+ control alt keycode 88 = Console_12
+ shift control alt keycode 88 = Console_24
+ shift shiftl keycode 88 = F24
+ altgr shiftl keycode 88 = Console_24
+ shift altgr shiftl keycode 88 = Console_36
+ control shiftl keycode 88 = F36
+ shift control shiftl keycode 88 = F48
+ altgr control shiftl keycode 88 = Console_24
+ shift altgr control shiftl keycode 88 = Console_36
+ alt shiftl keycode 88 = Console_12
+ shift alt shiftl keycode 88 = Console_24
+ control alt shiftl keycode 88 = Console_12
+ shift control alt shiftl keycode 88 = Console_24
+ shift shiftr keycode 88 = F24
+ altgr shiftr keycode 88 = Console_24
+ shift altgr shiftr keycode 88 = Console_36
+ control shiftr keycode 88 = F36
+ shift control shiftr keycode 88 = F48
+ altgr control shiftr keycode 88 = Console_24
+ shift altgr control shiftr keycode 88 = Console_36
+ alt shiftr keycode 88 = Console_12
+ shift alt shiftr keycode 88 = Console_24
+ control alt shiftr keycode 88 = Console_12
+ shift control alt shiftr keycode 88 = Console_24
+ shift shiftl shiftr keycode 88 = F24
+ altgr shiftl shiftr keycode 88 = Console_24
+ shift altgr shiftl shiftr keycode 88 = Console_36
+ control shiftl shiftr keycode 88 = F36
+ shift control shiftl shiftr keycode 88 = F48
+ altgr control shiftl shiftr keycode 88 = Console_24
+ shift altgr control shiftl shiftr keycode 88 = Console_36
+ alt shiftl shiftr keycode 88 = Console_12
+ shift alt shiftl shiftr keycode 88 = Console_24
+ control alt shiftl shiftr keycode 88 = Console_12
+ shift control alt shiftl shiftr keycode 88 = Console_24
+ shift ctrll keycode 88 = F24
+ altgr ctrll keycode 88 = Console_24
+ shift altgr ctrll keycode 88 = Console_36
+ control ctrll keycode 88 = F36
+ shift control ctrll keycode 88 = F48
+ altgr control ctrll keycode 88 = Console_24
+ shift altgr control ctrll keycode 88 = Console_36
+ alt ctrll keycode 88 = Console_12
+ shift alt ctrll keycode 88 = Console_24
+ control alt ctrll keycode 88 = Console_12
+ shift control alt ctrll keycode 88 = Console_24
+ shift shiftl ctrll keycode 88 = F24
+ altgr shiftl ctrll keycode 88 = Console_24
+ shift altgr shiftl ctrll keycode 88 = Console_36
+ control shiftl ctrll keycode 88 = F36
+ shift control shiftl ctrll keycode 88 = F48
+ altgr control shiftl ctrll keycode 88 = Console_24
+ shift altgr control shiftl ctrll keycode 88 = Console_36
+ alt shiftl ctrll keycode 88 = Console_12
+ shift alt shiftl ctrll keycode 88 = Console_24
+ control alt shiftl ctrll keycode 88 = Console_12
+ shift control alt shiftl ctrll keycode 88 = Console_24
+ shift shiftr ctrll keycode 88 = F24
+ altgr shiftr ctrll keycode 88 = Console_24
+ shift altgr shiftr ctrll keycode 88 = Console_36
+ control shiftr ctrll keycode 88 = F36
+ shift control shiftr ctrll keycode 88 = F48
+ altgr control shiftr ctrll keycode 88 = Console_24
+ shift altgr control shiftr ctrll keycode 88 = Console_36
+ alt shiftr ctrll keycode 88 = Console_12
+ shift alt shiftr ctrll keycode 88 = Console_24
+ control alt shiftr ctrll keycode 88 = Console_12
+ shift control alt shiftr ctrll keycode 88 = Console_24
+ shift shiftl shiftr ctrll keycode 88 = F24
+ altgr shiftl shiftr ctrll keycode 88 = Console_24
+ shift altgr shiftl shiftr ctrll keycode 88 = Console_36
+ control shiftl shiftr ctrll keycode 88 = F36
+ shift control shiftl shiftr ctrll keycode 88 = F48
+ altgr control shiftl shiftr ctrll keycode 88 = Console_24
+ shift altgr control shiftl shiftr ctrll keycode 88 = Console_36
+ alt shiftl shiftr ctrll keycode 88 = Console_12
+ shift alt shiftl shiftr ctrll keycode 88 = Console_24
+ control alt shiftl shiftr ctrll keycode 88 = Console_12
+ shift control alt shiftl shiftr ctrll keycode 88 = Console_24
+keycode 89 = slash
+ shift keycode 89 = question
+ altgr keycode 89 = degree
+ shift altgr keycode 89 = questiondown
+ control keycode 89 = Delete
+ shift control keycode 89 = Delete
+ altgr control keycode 89 = Delete
+ shift altgr control keycode 89 = Delete
+ alt keycode 89 = Meta_slash
+ shift alt keycode 89 = Meta_question
+ altgr alt keycode 89 = Meta_slash
+ shift altgr alt keycode 89 = Meta_question
+ control alt keycode 89 = Meta_Delete
+ shift control alt keycode 89 = Meta_Delete
+ altgr control alt keycode 89 = Meta_Delete
+ shift altgr control alt keycode 89 = Meta_Delete
+ shift shiftl keycode 89 = question
+ altgr shiftl keycode 89 = degree
+ shift altgr shiftl keycode 89 = questiondown
+ control shiftl keycode 89 = Delete
+ shift control shiftl keycode 89 = Delete
+ altgr control shiftl keycode 89 = Delete
+ shift altgr control shiftl keycode 89 = Delete
+ alt shiftl keycode 89 = Meta_slash
+ shift alt shiftl keycode 89 = Meta_question
+ altgr alt shiftl keycode 89 = Meta_slash
+ shift altgr alt shiftl keycode 89 = Meta_question
+ control alt shiftl keycode 89 = Meta_Delete
+ shift control alt shiftl keycode 89 = Meta_Delete
+ altgr control alt shiftl keycode 89 = Meta_Delete
+ shift altgr control alt shiftl keycode 89 = Meta_Delete
+ shift shiftr keycode 89 = question
+ altgr shiftr keycode 89 = degree
+ shift altgr shiftr keycode 89 = questiondown
+ control shiftr keycode 89 = Delete
+ shift control shiftr keycode 89 = Delete
+ altgr control shiftr keycode 89 = Delete
+ shift altgr control shiftr keycode 89 = Delete
+ alt shiftr keycode 89 = Meta_slash
+ shift alt shiftr keycode 89 = Meta_question
+ altgr alt shiftr keycode 89 = Meta_slash
+ shift altgr alt shiftr keycode 89 = Meta_question
+ control alt shiftr keycode 89 = Meta_Delete
+ shift control alt shiftr keycode 89 = Meta_Delete
+ altgr control alt shiftr keycode 89 = Meta_Delete
+ shift altgr control alt shiftr keycode 89 = Meta_Delete
+ shift shiftl shiftr keycode 89 = question
+ altgr shiftl shiftr keycode 89 = degree
+ shift altgr shiftl shiftr keycode 89 = questiondown
+ control shiftl shiftr keycode 89 = Delete
+ shift control shiftl shiftr keycode 89 = Delete
+ altgr control shiftl shiftr keycode 89 = Delete
+ shift altgr control shiftl shiftr keycode 89 = Delete
+ alt shiftl shiftr keycode 89 = Meta_slash
+ shift alt shiftl shiftr keycode 89 = Meta_question
+ altgr alt shiftl shiftr keycode 89 = Meta_slash
+ shift altgr alt shiftl shiftr keycode 89 = Meta_question
+ control alt shiftl shiftr keycode 89 = Meta_Delete
+ shift control alt shiftl shiftr keycode 89 = Meta_Delete
+ altgr control alt shiftl shiftr keycode 89 = Meta_Delete
+ shift altgr control alt shiftl shiftr keycode 89 = Meta_Delete
+ shift ctrll keycode 89 = question
+ altgr ctrll keycode 89 = degree
+ shift altgr ctrll keycode 89 = questiondown
+ control ctrll keycode 89 = Delete
+ shift control ctrll keycode 89 = Delete
+ altgr control ctrll keycode 89 = Delete
+ shift altgr control ctrll keycode 89 = Delete
+ alt ctrll keycode 89 = Meta_slash
+ shift alt ctrll keycode 89 = Meta_question
+ altgr alt ctrll keycode 89 = Meta_slash
+ shift altgr alt ctrll keycode 89 = Meta_question
+ control alt ctrll keycode 89 = Meta_Delete
+ shift control alt ctrll keycode 89 = Meta_Delete
+ altgr control alt ctrll keycode 89 = Meta_Delete
+ shift altgr control alt ctrll keycode 89 = Meta_Delete
+ shift shiftl ctrll keycode 89 = question
+ altgr shiftl ctrll keycode 89 = degree
+ shift altgr shiftl ctrll keycode 89 = questiondown
+ control shiftl ctrll keycode 89 = Delete
+ shift control shiftl ctrll keycode 89 = Delete
+ altgr control shiftl ctrll keycode 89 = Delete
+ shift altgr control shiftl ctrll keycode 89 = Delete
+ alt shiftl ctrll keycode 89 = Meta_slash
+ shift alt shiftl ctrll keycode 89 = Meta_question
+ altgr alt shiftl ctrll keycode 89 = Meta_slash
+ shift altgr alt shiftl ctrll keycode 89 = Meta_question
+ control alt shiftl ctrll keycode 89 = Meta_Delete
+ shift control alt shiftl ctrll keycode 89 = Meta_Delete
+ altgr control alt shiftl ctrll keycode 89 = Meta_Delete
+ shift altgr control alt shiftl ctrll keycode 89 = Meta_Delete
+ shift shiftr ctrll keycode 89 = question
+ altgr shiftr ctrll keycode 89 = degree
+ shift altgr shiftr ctrll keycode 89 = questiondown
+ control shiftr ctrll keycode 89 = Delete
+ shift control shiftr ctrll keycode 89 = Delete
+ altgr control shiftr ctrll keycode 89 = Delete
+ shift altgr control shiftr ctrll keycode 89 = Delete
+ alt shiftr ctrll keycode 89 = Meta_slash
+ shift alt shiftr ctrll keycode 89 = Meta_question
+ altgr alt shiftr ctrll keycode 89 = Meta_slash
+ shift altgr alt shiftr ctrll keycode 89 = Meta_question
+ control alt shiftr ctrll keycode 89 = Meta_Delete
+ shift control alt shiftr ctrll keycode 89 = Meta_Delete
+ altgr control alt shiftr ctrll keycode 89 = Meta_Delete
+ shift altgr control alt shiftr ctrll keycode 89 = Meta_Delete
+ shift shiftl shiftr ctrll keycode 89 = question
+ altgr shiftl shiftr ctrll keycode 89 = degree
+ shift altgr shiftl shiftr ctrll keycode 89 = questiondown
+ control shiftl shiftr ctrll keycode 89 = Delete
+ shift control shiftl shiftr ctrll keycode 89 = Delete
+ altgr control shiftl shiftr ctrll keycode 89 = Delete
+ shift altgr control shiftl shiftr ctrll keycode 89 = Delete
+ alt shiftl shiftr ctrll keycode 89 = Meta_slash
+ shift alt shiftl shiftr ctrll keycode 89 = Meta_question
+ altgr alt shiftl shiftr ctrll keycode 89 = Meta_slash
+ shift altgr alt shiftl shiftr ctrll keycode 89 = Meta_question
+ control alt shiftl shiftr ctrll keycode 89 = Meta_Delete
+ shift control alt shiftl shiftr ctrll keycode 89 = Meta_Delete
+ altgr control alt shiftl shiftr ctrll keycode 89 = Meta_Delete
+ shift altgr control alt shiftl shiftr ctrll keycode 89 = Meta_Delete
+keycode 90 =
+keycode 91 =
+keycode 92 =
+keycode 93 =
+keycode 94 =
+keycode 95 =
+keycode 96 = KP_Enter
+ altgr keycode 96 = Hex_F
+ shift alt keycode 96 = Hex_F
+ altgr shiftl keycode 96 = Hex_F
+ shift alt shiftl keycode 96 = Hex_F
+ altgr shiftr keycode 96 = Hex_F
+ shift alt shiftr keycode 96 = Hex_F
+ altgr shiftl shiftr keycode 96 = Hex_F
+ shift alt shiftl shiftr keycode 96 = Hex_F
+ altgr ctrll keycode 96 = Hex_F
+ shift alt ctrll keycode 96 = Hex_F
+ altgr shiftl ctrll keycode 96 = Hex_F
+ shift alt shiftl ctrll keycode 96 = Hex_F
+ altgr shiftr ctrll keycode 96 = Hex_F
+ shift alt shiftr ctrll keycode 96 = Hex_F
+ altgr shiftl shiftr ctrll keycode 96 = Hex_F
+ shift alt shiftl shiftr ctrll keycode 96 = Hex_F
+keycode 97 = Control
+keycode 98 = KP_Divide
+ altgr keycode 98 = Hex_B
+ shift alt keycode 98 = Hex_B
+ altgr shiftl keycode 98 = Hex_B
+ shift alt shiftl keycode 98 = Hex_B
+ altgr shiftr keycode 98 = Hex_B
+ shift alt shiftr keycode 98 = Hex_B
+ altgr shiftl shiftr keycode 98 = Hex_B
+ shift alt shiftl shiftr keycode 98 = Hex_B
+ altgr ctrll keycode 98 = Hex_B
+ shift alt ctrll keycode 98 = Hex_B
+ altgr shiftl ctrll keycode 98 = Hex_B
+ shift alt shiftl ctrll keycode 98 = Hex_B
+ altgr shiftr ctrll keycode 98 = Hex_B
+ shift alt shiftr ctrll keycode 98 = Hex_B
+ altgr shiftl shiftr ctrll keycode 98 = Hex_B
+ shift alt shiftl shiftr ctrll keycode 98 = Hex_B
+keycode 99 =
+ altgr keycode 99 = Control_backslash
+ shift altgr keycode 99 = Control_backslash
+ control keycode 99 = Control_backslash
+ shift control keycode 99 = Control_backslash
+ altgr control keycode 99 = Control_backslash
+ shift altgr control keycode 99 = Control_backslash
+ alt keycode 99 = Control_backslash
+ shift alt keycode 99 = Control_backslash
+ altgr alt keycode 99 = Control_backslash
+ shift altgr alt keycode 99 = Control_backslash
+ control alt keycode 99 = Control_backslash
+ shift control alt keycode 99 = Control_backslash
+ altgr control alt keycode 99 = Control_backslash
+ shift altgr control alt keycode 99 = Control_backslash
+ altgr shiftl keycode 99 = Control_backslash
+ shift altgr shiftl keycode 99 = Control_backslash
+ control shiftl keycode 99 = Control_backslash
+ shift control shiftl keycode 99 = Control_backslash
+ altgr control shiftl keycode 99 = Control_backslash
+ shift altgr control shiftl keycode 99 = Control_backslash
+ alt shiftl keycode 99 = Control_backslash
+ shift alt shiftl keycode 99 = Control_backslash
+ altgr alt shiftl keycode 99 = Control_backslash
+ shift altgr alt shiftl keycode 99 = Control_backslash
+ control alt shiftl keycode 99 = Control_backslash
+ shift control alt shiftl keycode 99 = Control_backslash
+ altgr control alt shiftl keycode 99 = Control_backslash
+ shift altgr control alt shiftl keycode 99 = Control_backslash
+ altgr shiftr keycode 99 = Control_backslash
+ shift altgr shiftr keycode 99 = Control_backslash
+ control shiftr keycode 99 = Control_backslash
+ shift control shiftr keycode 99 = Control_backslash
+ altgr control shiftr keycode 99 = Control_backslash
+ shift altgr control shiftr keycode 99 = Control_backslash
+ alt shiftr keycode 99 = Control_backslash
+ shift alt shiftr keycode 99 = Control_backslash
+ altgr alt shiftr keycode 99 = Control_backslash
+ shift altgr alt shiftr keycode 99 = Control_backslash
+ control alt shiftr keycode 99 = Control_backslash
+ shift control alt shiftr keycode 99 = Control_backslash
+ altgr control alt shiftr keycode 99 = Control_backslash
+ shift altgr control alt shiftr keycode 99 = Control_backslash
+ altgr shiftl shiftr keycode 99 = Control_backslash
+ shift altgr shiftl shiftr keycode 99 = Control_backslash
+ control shiftl shiftr keycode 99 = Control_backslash
+ shift control shiftl shiftr keycode 99 = Control_backslash
+ altgr control shiftl shiftr keycode 99 = Control_backslash
+ shift altgr control shiftl shiftr keycode 99 = Control_backslash
+ alt shiftl shiftr keycode 99 = Control_backslash
+ shift alt shiftl shiftr keycode 99 = Control_backslash
+ altgr alt shiftl shiftr keycode 99 = Control_backslash
+ shift altgr alt shiftl shiftr keycode 99 = Control_backslash
+ control alt shiftl shiftr keycode 99 = Control_backslash
+ shift control alt shiftl shiftr keycode 99 = Control_backslash
+ altgr control alt shiftl shiftr keycode 99 = Control_backslash
+ shift altgr control alt shiftl shiftr keycode 99 = Control_backslash
+ altgr ctrll keycode 99 = Control_backslash
+ shift altgr ctrll keycode 99 = Control_backslash
+ control ctrll keycode 99 = Control_backslash
+ shift control ctrll keycode 99 = Control_backslash
+ altgr control ctrll keycode 99 = Control_backslash
+ shift altgr control ctrll keycode 99 = Control_backslash
+ alt ctrll keycode 99 = Control_backslash
+ shift alt ctrll keycode 99 = Control_backslash
+ altgr alt ctrll keycode 99 = Control_backslash
+ shift altgr alt ctrll keycode 99 = Control_backslash
+ control alt ctrll keycode 99 = Control_backslash
+ shift control alt ctrll keycode 99 = Control_backslash
+ altgr control alt ctrll keycode 99 = Control_backslash
+ shift altgr control alt ctrll keycode 99 = Control_backslash
+ altgr shiftl ctrll keycode 99 = Control_backslash
+ shift altgr shiftl ctrll keycode 99 = Control_backslash
+ control shiftl ctrll keycode 99 = Control_backslash
+ shift control shiftl ctrll keycode 99 = Control_backslash
+ altgr control shiftl ctrll keycode 99 = Control_backslash
+ shift altgr control shiftl ctrll keycode 99 = Control_backslash
+ alt shiftl ctrll keycode 99 = Control_backslash
+ shift alt shiftl ctrll keycode 99 = Control_backslash
+ altgr alt shiftl ctrll keycode 99 = Control_backslash
+ shift altgr alt shiftl ctrll keycode 99 = Control_backslash
+ control alt shiftl ctrll keycode 99 = Control_backslash
+ shift control alt shiftl ctrll keycode 99 = Control_backslash
+ altgr control alt shiftl ctrll keycode 99 = Control_backslash
+ shift altgr control alt shiftl ctrll keycode 99 = Control_backslash
+ altgr shiftr ctrll keycode 99 = Control_backslash
+ shift altgr shiftr ctrll keycode 99 = Control_backslash
+ control shiftr ctrll keycode 99 = Control_backslash
+ shift control shiftr ctrll keycode 99 = Control_backslash
+ altgr control shiftr ctrll keycode 99 = Control_backslash
+ shift altgr control shiftr ctrll keycode 99 = Control_backslash
+ alt shiftr ctrll keycode 99 = Control_backslash
+ shift alt shiftr ctrll keycode 99 = Control_backslash
+ altgr alt shiftr ctrll keycode 99 = Control_backslash
+ shift altgr alt shiftr ctrll keycode 99 = Control_backslash
+ control alt shiftr ctrll keycode 99 = Control_backslash
+ shift control alt shiftr ctrll keycode 99 = Control_backslash
+ altgr control alt shiftr ctrll keycode 99 = Control_backslash
+ shift altgr control alt shiftr ctrll keycode 99 = Control_backslash
+ altgr shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift altgr shiftl shiftr ctrll keycode 99 = Control_backslash
+ control shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift control shiftl shiftr ctrll keycode 99 = Control_backslash
+ altgr control shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift altgr control shiftl shiftr ctrll keycode 99 = Control_backslash
+ alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ altgr alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift altgr alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ control alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift control alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ altgr control alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift altgr control alt shiftl shiftr ctrll keycode 99 = Control_backslash
+keycode 100 = AltGr
+keycode 101 = Break Break Break
+ control keycode 101 = Break
+ shift control keycode 101 = Break
+ alt keycode 101 = Break
+ control alt keycode 101 = Break
+keycode 102 = Find
+keycode 103 = Up
+ alt keycode 103 = KeyboardSignal
+ alt shiftl keycode 103 = KeyboardSignal
+ alt shiftr keycode 103 = KeyboardSignal
+ alt shiftl shiftr keycode 103 = KeyboardSignal
+ alt ctrll keycode 103 = KeyboardSignal
+ alt shiftl ctrll keycode 103 = KeyboardSignal
+ alt shiftr ctrll keycode 103 = KeyboardSignal
+ alt shiftl shiftr ctrll keycode 103 = KeyboardSignal
+keycode 104 = Prior
+ shift keycode 104 = Scroll_Backward
+ shift shiftl keycode 104 = Scroll_Backward
+ shift shiftr keycode 104 = Scroll_Backward
+ shift shiftl shiftr keycode 104 = Scroll_Backward
+ shift ctrll keycode 104 = Scroll_Backward
+ shift shiftl ctrll keycode 104 = Scroll_Backward
+ shift shiftr ctrll keycode 104 = Scroll_Backward
+ shift shiftl shiftr ctrll keycode 104 = Scroll_Backward
+keycode 105 = Left
+ alt keycode 105 = Decr_Console
+ alt shiftl keycode 105 = Decr_Console
+ alt shiftr keycode 105 = Decr_Console
+ alt shiftl shiftr keycode 105 = Decr_Console
+ alt ctrll keycode 105 = Decr_Console
+ alt shiftl ctrll keycode 105 = Decr_Console
+ alt shiftr ctrll keycode 105 = Decr_Console
+ alt shiftl shiftr ctrll keycode 105 = Decr_Console
+keycode 106 = Right
+ alt keycode 106 = Incr_Console
+ alt shiftl keycode 106 = Incr_Console
+ alt shiftr keycode 106 = Incr_Console
+ alt shiftl shiftr keycode 106 = Incr_Console
+ alt ctrll keycode 106 = Incr_Console
+ alt shiftl ctrll keycode 106 = Incr_Console
+ alt shiftr ctrll keycode 106 = Incr_Console
+ alt shiftl shiftr ctrll keycode 106 = Incr_Console
+keycode 107 = Select
+keycode 108 = Down
+keycode 109 = Next
+ shift keycode 109 = Scroll_Forward
+ shift shiftl keycode 109 = Scroll_Forward
+ shift shiftr keycode 109 = Scroll_Forward
+ shift shiftl shiftr keycode 109 = Scroll_Forward
+ shift ctrll keycode 109 = Scroll_Forward
+ shift shiftl ctrll keycode 109 = Scroll_Forward
+ shift shiftr ctrll keycode 109 = Scroll_Forward
+ shift shiftl shiftr ctrll keycode 109 = Scroll_Forward
+keycode 110 = Insert
+keycode 111 = Remove
+ altgr control keycode 111 = Boot
+ control alt keycode 111 = Boot
+ altgr control alt keycode 111 = Boot
+ altgr control shiftl keycode 111 = Boot
+ control alt shiftl keycode 111 = Boot
+ altgr control alt shiftl keycode 111 = Boot
+ altgr control shiftr keycode 111 = Boot
+ control alt shiftr keycode 111 = Boot
+ altgr control alt shiftr keycode 111 = Boot
+ altgr control shiftl shiftr keycode 111 = Boot
+ control alt shiftl shiftr keycode 111 = Boot
+ altgr control alt shiftl shiftr keycode 111 = Boot
+ altgr control ctrll keycode 111 = Boot
+ control alt ctrll keycode 111 = Boot
+ altgr control alt ctrll keycode 111 = Boot
+ altgr control shiftl ctrll keycode 111 = Boot
+ control alt shiftl ctrll keycode 111 = Boot
+ altgr control alt shiftl ctrll keycode 111 = Boot
+ altgr control shiftr ctrll keycode 111 = Boot
+ control alt shiftr ctrll keycode 111 = Boot
+ altgr control alt shiftr ctrll keycode 111 = Boot
+ altgr control shiftl shiftr ctrll keycode 111 = Boot
+ control alt shiftl shiftr ctrll keycode 111 = Boot
+ altgr control alt shiftl shiftr ctrll keycode 111 = Boot
+keycode 112 = Macro Macro Macro
+ control keycode 112 = Macro
+ shift control keycode 112 = Macro
+ alt keycode 112 = Macro
+ control alt keycode 112 = Macro
+keycode 113 = F13 F13 F13
+ control keycode 113 = F13
+ shift control keycode 113 = F13
+ alt keycode 113 = F13
+ control alt keycode 113 = F13
+keycode 114 = F14 F14 F14
+ control keycode 114 = F14
+ shift control keycode 114 = F14
+ alt keycode 114 = F14
+ control alt keycode 114 = F14
+keycode 115 = Help Help Help
+ control keycode 115 = Help
+ shift control keycode 115 = Help
+ alt keycode 115 = Help
+ control alt keycode 115 = Help
+keycode 116 = Do Do Do
+ control keycode 116 = Do
+ shift control keycode 116 = Do
+ alt keycode 116 = Do
+ control alt keycode 116 = Do
+keycode 117 = F17 F17 F17
+ control keycode 117 = F17
+ shift control keycode 117 = F17
+ alt keycode 117 = F17
+ control alt keycode 117 = F17
+keycode 118 = KP_MinPlus KP_MinPlus KP_MinPlus
+ control keycode 118 = KP_MinPlus
+ shift control keycode 118 = KP_MinPlus
+ alt keycode 118 = KP_MinPlus
+ control alt keycode 118 = KP_MinPlus
+keycode 119 = Pause
+keycode 120 =
+keycode 121 = KP_Period
+keycode 122 =
+keycode 123 =
+keycode 124 =
+keycode 125 = Alt
+keycode 126 = Alt
+keycode 127 =
+keycode 128 = nul nul nul
+ control keycode 128 = nul
+ shift control keycode 128 = nul
+ alt keycode 128 = nul
+ control alt keycode 128 = nul
+keycode 129 = nul nul nul
+ control keycode 129 = nul
+ shift control keycode 129 = nul
+ alt keycode 129 = nul
+ control alt keycode 129 = nul
+keycode 130 = nul nul nul
+ control keycode 130 = nul
+ shift control keycode 130 = nul
+ alt keycode 130 = nul
+ control alt keycode 130 = nul
+keycode 131 = nul nul nul
+ control keycode 131 = nul
+ shift control keycode 131 = nul
+ alt keycode 131 = nul
+ control alt keycode 131 = nul
+keycode 132 = nul nul nul
+ control keycode 132 = nul
+ shift control keycode 132 = nul
+ alt keycode 132 = nul
+ control alt keycode 132 = nul
+keycode 133 = nul nul nul
+ control keycode 133 = nul
+ shift control keycode 133 = nul
+ alt keycode 133 = nul
+ control alt keycode 133 = nul
+keycode 134 = nul nul nul
+ control keycode 134 = nul
+ shift control keycode 134 = nul
+ alt keycode 134 = nul
+ control alt keycode 134 = nul
+keycode 135 = nul nul nul
+ control keycode 135 = nul
+ shift control keycode 135 = nul
+ alt keycode 135 = nul
+ control alt keycode 135 = nul
+keycode 136 = nul nul nul
+ control keycode 136 = nul
+ shift control keycode 136 = nul
+ alt keycode 136 = nul
+ control alt keycode 136 = nul
+keycode 137 = nul nul nul
+ control keycode 137 = nul
+ shift control keycode 137 = nul
+ alt keycode 137 = nul
+ control alt keycode 137 = nul
+keycode 138 = nul nul nul
+ control keycode 138 = nul
+ shift control keycode 138 = nul
+ alt keycode 138 = nul
+ control alt keycode 138 = nul
+keycode 139 = nul nul nul
+ control keycode 139 = nul
+ shift control keycode 139 = nul
+ alt keycode 139 = nul
+ control alt keycode 139 = nul
+keycode 140 = nul nul nul
+ control keycode 140 = nul
+ shift control keycode 140 = nul
+ alt keycode 140 = nul
+ control alt keycode 140 = nul
+keycode 141 = nul nul nul
+ control keycode 141 = nul
+ shift control keycode 141 = nul
+ alt keycode 141 = nul
+ control alt keycode 141 = nul
+keycode 142 = nul nul nul
+ control keycode 142 = nul
+ shift control keycode 142 = nul
+ alt keycode 142 = nul
+ control alt keycode 142 = nul
+keycode 143 = nul nul nul
+ control keycode 143 = nul
+ shift control keycode 143 = nul
+ alt keycode 143 = nul
+ control alt keycode 143 = nul
+keycode 144 = nul nul nul
+ control keycode 144 = nul
+ shift control keycode 144 = nul
+ alt keycode 144 = nul
+ control alt keycode 144 = nul
+keycode 145 = nul nul nul
+ control keycode 145 = nul
+ shift control keycode 145 = nul
+ alt keycode 145 = nul
+ control alt keycode 145 = nul
+keycode 146 = nul nul nul
+ control keycode 146 = nul
+ shift control keycode 146 = nul
+ alt keycode 146 = nul
+ control alt keycode 146 = nul
+keycode 147 = nul nul nul
+ control keycode 147 = nul
+ shift control keycode 147 = nul
+ alt keycode 147 = nul
+ control alt keycode 147 = nul
+keycode 148 = nul nul nul
+ control keycode 148 = nul
+ shift control keycode 148 = nul
+ alt keycode 148 = nul
+ control alt keycode 148 = nul
+keycode 149 = nul nul nul
+ control keycode 149 = nul
+ shift control keycode 149 = nul
+ alt keycode 149 = nul
+ control alt keycode 149 = nul
+keycode 150 = nul nul nul
+ control keycode 150 = nul
+ shift control keycode 150 = nul
+ alt keycode 150 = nul
+ control alt keycode 150 = nul
+keycode 151 = nul nul nul
+ control keycode 151 = nul
+ shift control keycode 151 = nul
+ alt keycode 151 = nul
+ control alt keycode 151 = nul
+keycode 152 = nul nul nul
+ control keycode 152 = nul
+ shift control keycode 152 = nul
+ alt keycode 152 = nul
+ control alt keycode 152 = nul
+keycode 153 = nul nul nul
+ control keycode 153 = nul
+ shift control keycode 153 = nul
+ alt keycode 153 = nul
+ control alt keycode 153 = nul
+keycode 154 = nul nul nul
+ control keycode 154 = nul
+ shift control keycode 154 = nul
+ alt keycode 154 = nul
+ control alt keycode 154 = nul
+keycode 155 = nul nul nul
+ control keycode 155 = nul
+ shift control keycode 155 = nul
+ alt keycode 155 = nul
+ control alt keycode 155 = nul
+keycode 156 = nul nul nul
+ control keycode 156 = nul
+ shift control keycode 156 = nul
+ alt keycode 156 = nul
+ control alt keycode 156 = nul
+keycode 157 = nul nul nul
+ control keycode 157 = nul
+ shift control keycode 157 = nul
+ alt keycode 157 = nul
+ control alt keycode 157 = nul
+keycode 158 = nul nul nul
+ control keycode 158 = nul
+ shift control keycode 158 = nul
+ alt keycode 158 = nul
+ control alt keycode 158 = nul
+keycode 159 = nul nul nul
+ control keycode 159 = nul
+ shift control keycode 159 = nul
+ alt keycode 159 = nul
+ control alt keycode 159 = nul
+keycode 160 = nul nul nul
+ control keycode 160 = nul
+ shift control keycode 160 = nul
+ alt keycode 160 = nul
+ control alt keycode 160 = nul
+keycode 161 = nul nul nul
+ control keycode 161 = nul
+ shift control keycode 161 = nul
+ alt keycode 161 = nul
+ control alt keycode 161 = nul
+keycode 162 = nul nul nul
+ control keycode 162 = nul
+ shift control keycode 162 = nul
+ alt keycode 162 = nul
+ control alt keycode 162 = nul
+keycode 163 = nul nul nul
+ control keycode 163 = nul
+ shift control keycode 163 = nul
+ alt keycode 163 = nul
+ control alt keycode 163 = nul
+keycode 164 = nul nul nul
+ control keycode 164 = nul
+ shift control keycode 164 = nul
+ alt keycode 164 = nul
+ control alt keycode 164 = nul
+keycode 165 = nul nul nul
+ control keycode 165 = nul
+ shift control keycode 165 = nul
+ alt keycode 165 = nul
+ control alt keycode 165 = nul
+keycode 166 = nul nul nul
+ control keycode 166 = nul
+ shift control keycode 166 = nul
+ alt keycode 166 = nul
+ control alt keycode 166 = nul
+keycode 167 = nul nul nul
+ control keycode 167 = nul
+ shift control keycode 167 = nul
+ alt keycode 167 = nul
+ control alt keycode 167 = nul
+keycode 168 = nul nul nul
+ control keycode 168 = nul
+ shift control keycode 168 = nul
+ alt keycode 168 = nul
+ control alt keycode 168 = nul
+keycode 169 = nul nul nul
+ control keycode 169 = nul
+ shift control keycode 169 = nul
+ alt keycode 169 = nul
+ control alt keycode 169 = nul
+keycode 170 = nul nul nul
+ control keycode 170 = nul
+ shift control keycode 170 = nul
+ alt keycode 170 = nul
+ control alt keycode 170 = nul
+keycode 171 = nul nul nul
+ control keycode 171 = nul
+ shift control keycode 171 = nul
+ alt keycode 171 = nul
+ control alt keycode 171 = nul
+keycode 172 = nul nul nul
+ control keycode 172 = nul
+ shift control keycode 172 = nul
+ alt keycode 172 = nul
+ control alt keycode 172 = nul
+keycode 173 = nul nul nul
+ control keycode 173 = nul
+ shift control keycode 173 = nul
+ alt keycode 173 = nul
+ control alt keycode 173 = nul
+keycode 174 = nul nul nul
+ control keycode 174 = nul
+ shift control keycode 174 = nul
+ alt keycode 174 = nul
+ control alt keycode 174 = nul
+keycode 175 = nul nul nul
+ control keycode 175 = nul
+ shift control keycode 175 = nul
+ alt keycode 175 = nul
+ control alt keycode 175 = nul
+keycode 176 = nul nul nul
+ control keycode 176 = nul
+ shift control keycode 176 = nul
+ alt keycode 176 = nul
+ control alt keycode 176 = nul
+keycode 177 = nul nul nul
+ control keycode 177 = nul
+ shift control keycode 177 = nul
+ alt keycode 177 = nul
+ control alt keycode 177 = nul
+keycode 178 = nul nul nul
+ control keycode 178 = nul
+ shift control keycode 178 = nul
+ alt keycode 178 = nul
+ control alt keycode 178 = nul
+keycode 179 = nul nul nul
+ control keycode 179 = nul
+ shift control keycode 179 = nul
+ alt keycode 179 = nul
+ control alt keycode 179 = nul
+keycode 180 = nul nul nul
+ control keycode 180 = nul
+ shift control keycode 180 = nul
+ alt keycode 180 = nul
+ control alt keycode 180 = nul
+keycode 181 = nul nul nul
+ control keycode 181 = nul
+ shift control keycode 181 = nul
+ alt keycode 181 = nul
+ control alt keycode 181 = nul
+keycode 182 = nul nul nul
+ control keycode 182 = nul
+ shift control keycode 182 = nul
+ alt keycode 182 = nul
+ control alt keycode 182 = nul
+keycode 183 = nul nul nul
+ control keycode 183 = nul
+ shift control keycode 183 = nul
+ alt keycode 183 = nul
+ control alt keycode 183 = nul
+keycode 184 = nul nul nul
+ control keycode 184 = nul
+ shift control keycode 184 = nul
+ alt keycode 184 = nul
+ control alt keycode 184 = nul
+keycode 185 = nul nul nul
+ control keycode 185 = nul
+ shift control keycode 185 = nul
+ alt keycode 185 = nul
+ control alt keycode 185 = nul
+keycode 186 = nul nul nul
+ control keycode 186 = nul
+ shift control keycode 186 = nul
+ alt keycode 186 = nul
+ control alt keycode 186 = nul
+keycode 187 = nul nul nul
+ control keycode 187 = nul
+ shift control keycode 187 = nul
+ alt keycode 187 = nul
+ control alt keycode 187 = nul
+keycode 188 = nul nul nul
+ control keycode 188 = nul
+ shift control keycode 188 = nul
+ alt keycode 188 = nul
+ control alt keycode 188 = nul
+keycode 189 = nul nul nul
+ control keycode 189 = nul
+ shift control keycode 189 = nul
+ alt keycode 189 = nul
+ control alt keycode 189 = nul
+keycode 190 = nul nul nul
+ control keycode 190 = nul
+ shift control keycode 190 = nul
+ alt keycode 190 = nul
+ control alt keycode 190 = nul
+keycode 191 = nul nul nul
+ control keycode 191 = nul
+ shift control keycode 191 = nul
+ alt keycode 191 = nul
+ control alt keycode 191 = nul
+keycode 192 = nul nul nul
+ control keycode 192 = nul
+ shift control keycode 192 = nul
+ alt keycode 192 = nul
+ control alt keycode 192 = nul
+keycode 193 = nul nul nul
+ control keycode 193 = nul
+ shift control keycode 193 = nul
+ alt keycode 193 = nul
+ control alt keycode 193 = nul
+keycode 194 = nul nul nul
+ control keycode 194 = nul
+ shift control keycode 194 = nul
+ alt keycode 194 = nul
+ control alt keycode 194 = nul
+keycode 195 = nul nul nul
+ control keycode 195 = nul
+ shift control keycode 195 = nul
+ alt keycode 195 = nul
+ control alt keycode 195 = nul
+keycode 196 = nul nul nul
+ control keycode 196 = nul
+ shift control keycode 196 = nul
+ alt keycode 196 = nul
+ control alt keycode 196 = nul
+keycode 197 = nul nul nul
+ control keycode 197 = nul
+ shift control keycode 197 = nul
+ alt keycode 197 = nul
+ control alt keycode 197 = nul
+keycode 198 = nul nul nul
+ control keycode 198 = nul
+ shift control keycode 198 = nul
+ alt keycode 198 = nul
+ control alt keycode 198 = nul
+keycode 199 = nul nul nul
+ control keycode 199 = nul
+ shift control keycode 199 = nul
+ alt keycode 199 = nul
+ control alt keycode 199 = nul
+keycode 200 = nul nul nul
+ control keycode 200 = nul
+ shift control keycode 200 = nul
+ alt keycode 200 = nul
+ control alt keycode 200 = nul
+keycode 201 = nul nul nul
+ control keycode 201 = nul
+ shift control keycode 201 = nul
+ alt keycode 201 = nul
+ control alt keycode 201 = nul
+keycode 202 = nul nul nul
+ control keycode 202 = nul
+ shift control keycode 202 = nul
+ alt keycode 202 = nul
+ control alt keycode 202 = nul
+keycode 203 = nul nul nul
+ control keycode 203 = nul
+ shift control keycode 203 = nul
+ alt keycode 203 = nul
+ control alt keycode 203 = nul
+keycode 204 = nul nul nul
+ control keycode 204 = nul
+ shift control keycode 204 = nul
+ alt keycode 204 = nul
+ control alt keycode 204 = nul
+keycode 205 = nul nul nul
+ control keycode 205 = nul
+ shift control keycode 205 = nul
+ alt keycode 205 = nul
+ control alt keycode 205 = nul
+keycode 206 = nul nul nul
+ control keycode 206 = nul
+ shift control keycode 206 = nul
+ alt keycode 206 = nul
+ control alt keycode 206 = nul
+keycode 207 = nul nul nul
+ control keycode 207 = nul
+ shift control keycode 207 = nul
+ alt keycode 207 = nul
+ control alt keycode 207 = nul
+keycode 208 = nul nul nul
+ control keycode 208 = nul
+ shift control keycode 208 = nul
+ alt keycode 208 = nul
+ control alt keycode 208 = nul
+keycode 209 = nul nul nul
+ control keycode 209 = nul
+ shift control keycode 209 = nul
+ alt keycode 209 = nul
+ control alt keycode 209 = nul
+keycode 210 = nul nul nul
+ control keycode 210 = nul
+ shift control keycode 210 = nul
+ alt keycode 210 = nul
+ control alt keycode 210 = nul
+keycode 211 = nul nul nul
+ control keycode 211 = nul
+ shift control keycode 211 = nul
+ alt keycode 211 = nul
+ control alt keycode 211 = nul
+keycode 212 = nul nul nul
+ control keycode 212 = nul
+ shift control keycode 212 = nul
+ alt keycode 212 = nul
+ control alt keycode 212 = nul
+keycode 213 = nul nul nul
+ control keycode 213 = nul
+ shift control keycode 213 = nul
+ alt keycode 213 = nul
+ control alt keycode 213 = nul
+keycode 214 = nul nul nul
+ control keycode 214 = nul
+ shift control keycode 214 = nul
+ alt keycode 214 = nul
+ control alt keycode 214 = nul
+keycode 215 = nul nul nul
+ control keycode 215 = nul
+ shift control keycode 215 = nul
+ alt keycode 215 = nul
+ control alt keycode 215 = nul
+keycode 216 = nul nul nul
+ control keycode 216 = nul
+ shift control keycode 216 = nul
+ alt keycode 216 = nul
+ control alt keycode 216 = nul
+keycode 217 = nul nul nul
+ control keycode 217 = nul
+ shift control keycode 217 = nul
+ alt keycode 217 = nul
+ control alt keycode 217 = nul
+keycode 218 = nul nul nul
+ control keycode 218 = nul
+ shift control keycode 218 = nul
+ alt keycode 218 = nul
+ control alt keycode 218 = nul
+keycode 219 = nul nul nul
+ control keycode 219 = nul
+ shift control keycode 219 = nul
+ alt keycode 219 = nul
+ control alt keycode 219 = nul
+keycode 220 = nul nul nul
+ control keycode 220 = nul
+ shift control keycode 220 = nul
+ alt keycode 220 = nul
+ control alt keycode 220 = nul
+keycode 221 = nul nul nul
+ control keycode 221 = nul
+ shift control keycode 221 = nul
+ alt keycode 221 = nul
+ control alt keycode 221 = nul
+keycode 222 = nul nul nul
+ control keycode 222 = nul
+ shift control keycode 222 = nul
+ alt keycode 222 = nul
+ control alt keycode 222 = nul
+keycode 223 = nul nul nul
+ control keycode 223 = nul
+ shift control keycode 223 = nul
+ alt keycode 223 = nul
+ control alt keycode 223 = nul
+keycode 224 = nul nul nul
+ control keycode 224 = nul
+ shift control keycode 224 = nul
+ alt keycode 224 = nul
+ control alt keycode 224 = nul
+keycode 225 = nul nul nul
+ control keycode 225 = nul
+ shift control keycode 225 = nul
+ alt keycode 225 = nul
+ control alt keycode 225 = nul
+keycode 226 = nul nul nul
+ control keycode 226 = nul
+ shift control keycode 226 = nul
+ alt keycode 226 = nul
+ control alt keycode 226 = nul
+keycode 227 = nul nul nul
+ control keycode 227 = nul
+ shift control keycode 227 = nul
+ alt keycode 227 = nul
+ control alt keycode 227 = nul
+keycode 228 = nul nul nul
+ control keycode 228 = nul
+ shift control keycode 228 = nul
+ alt keycode 228 = nul
+ control alt keycode 228 = nul
+keycode 229 = nul nul nul
+ control keycode 229 = nul
+ shift control keycode 229 = nul
+ alt keycode 229 = nul
+ control alt keycode 229 = nul
+keycode 230 = nul nul nul
+ control keycode 230 = nul
+ shift control keycode 230 = nul
+ alt keycode 230 = nul
+ control alt keycode 230 = nul
+keycode 231 = nul nul nul
+ control keycode 231 = nul
+ shift control keycode 231 = nul
+ alt keycode 231 = nul
+ control alt keycode 231 = nul
+keycode 232 = nul nul nul
+ control keycode 232 = nul
+ shift control keycode 232 = nul
+ alt keycode 232 = nul
+ control alt keycode 232 = nul
+keycode 233 = nul nul nul
+ control keycode 233 = nul
+ shift control keycode 233 = nul
+ alt keycode 233 = nul
+ control alt keycode 233 = nul
+keycode 234 = nul nul nul
+ control keycode 234 = nul
+ shift control keycode 234 = nul
+ alt keycode 234 = nul
+ control alt keycode 234 = nul
+keycode 235 = nul nul nul
+ control keycode 235 = nul
+ shift control keycode 235 = nul
+ alt keycode 235 = nul
+ control alt keycode 235 = nul
+keycode 236 = nul nul nul
+ control keycode 236 = nul
+ shift control keycode 236 = nul
+ alt keycode 236 = nul
+ control alt keycode 236 = nul
+keycode 237 = nul nul nul
+ control keycode 237 = nul
+ shift control keycode 237 = nul
+ alt keycode 237 = nul
+ control alt keycode 237 = nul
+keycode 238 = nul nul nul
+ control keycode 238 = nul
+ shift control keycode 238 = nul
+ alt keycode 238 = nul
+ control alt keycode 238 = nul
+keycode 239 = nul nul nul
+ control keycode 239 = nul
+ shift control keycode 239 = nul
+ alt keycode 239 = nul
+ control alt keycode 239 = nul
+keycode 240 = nul nul nul
+ control keycode 240 = nul
+ shift control keycode 240 = nul
+ alt keycode 240 = nul
+ control alt keycode 240 = nul
+keycode 241 = nul nul nul
+ control keycode 241 = nul
+ shift control keycode 241 = nul
+ alt keycode 241 = nul
+ control alt keycode 241 = nul
+keycode 242 = nul nul nul
+ control keycode 242 = nul
+ shift control keycode 242 = nul
+ alt keycode 242 = nul
+ control alt keycode 242 = nul
+keycode 243 = nul nul nul
+ control keycode 243 = nul
+ shift control keycode 243 = nul
+ alt keycode 243 = nul
+ control alt keycode 243 = nul
+keycode 244 = nul nul nul
+ control keycode 244 = nul
+ shift control keycode 244 = nul
+ alt keycode 244 = nul
+ control alt keycode 244 = nul
+keycode 245 = nul nul nul
+ control keycode 245 = nul
+ shift control keycode 245 = nul
+ alt keycode 245 = nul
+ control alt keycode 245 = nul
+keycode 246 = nul nul nul
+ control keycode 246 = nul
+ shift control keycode 246 = nul
+ alt keycode 246 = nul
+ control alt keycode 246 = nul
+keycode 247 = nul nul nul
+ control keycode 247 = nul
+ shift control keycode 247 = nul
+ alt keycode 247 = nul
+ control alt keycode 247 = nul
+keycode 248 = nul nul nul
+ control keycode 248 = nul
+ shift control keycode 248 = nul
+ alt keycode 248 = nul
+ control alt keycode 248 = nul
+keycode 249 = nul nul nul
+ control keycode 249 = nul
+ shift control keycode 249 = nul
+ alt keycode 249 = nul
+ control alt keycode 249 = nul
+keycode 250 = nul nul nul
+ control keycode 250 = nul
+ shift control keycode 250 = nul
+ alt keycode 250 = nul
+ control alt keycode 250 = nul
+keycode 251 = nul nul nul
+ control keycode 251 = nul
+ shift control keycode 251 = nul
+ alt keycode 251 = nul
+ control alt keycode 251 = nul
+keycode 252 = nul nul nul
+ control keycode 252 = nul
+ shift control keycode 252 = nul
+ alt keycode 252 = nul
+ control alt keycode 252 = nul
+keycode 253 = nul nul nul
+ control keycode 253 = nul
+ shift control keycode 253 = nul
+ alt keycode 253 = nul
+ control alt keycode 253 = nul
+keycode 254 = nul nul nul
+ control keycode 254 = nul
+ shift control keycode 254 = nul
+ alt keycode 254 = nul
+ control alt keycode 254 = nul
+keycode 255 = nul nul nul
+ control keycode 255 = nul
+ shift control keycode 255 = nul
+ alt keycode 255 = nul
+ control alt keycode 255 = nul
+string F1 = "\033[[A"
+string F2 = "\033[[B"
+string F3 = "\033[[C"
+string F4 = "\033[[D"
+string F5 = "\033[[E"
+string F6 = "\033[17~"
+string F7 = "\033[18~"
+string F8 = "\033[19~"
+string F9 = "\033[20~"
+string F10 = "\033[21~"
+string F11 = "\033[23~"
+string F12 = "\033[24~"
+string F13 = "\033[25~"
+string F14 = "\033[26~"
+string F15 = "\033[28~"
+string F16 = "\033[29~"
+string F17 = "\033[31~"
+string F18 = "\033[32~"
+string F19 = "\033[33~"
+string F20 = "\033[34~"
+string Find = "\033[1~"
+string Insert = "\033[2~"
+string Remove = "\033[3~"
+string Select = "\033[4~"
+string Prior = "\033[5~"
+string Next = "\033[6~"
+string Macro = "\033[M"
+string Pause = "\033[P"
+compose '`' 'A' to U+00c0
+compose '`' 'a' to U+00e0
+compose '\'' 'A' to U+00c1
+compose '\'' 'a' to U+00e1
+compose '^' 'A' to U+00c2
+compose '^' 'a' to U+00e2
+compose '~' 'A' to U+00c3
+compose '~' 'a' to U+00e3
+compose '"' 'A' to U+00c4
+compose '"' 'a' to U+00e4
+compose 'O' 'A' to U+00c5
+compose 'o' 'a' to U+00e5
+compose '0' 'A' to U+00c5
+compose '0' 'a' to U+00e5
+compose 'A' 'A' to U+00c5
+compose 'a' 'a' to U+00e5
+compose 'A' 'E' to U+00c6
+compose 'a' 'e' to U+00e6
+compose ',' 'C' to U+00c7
+compose ',' 'c' to U+00e7
+compose '`' 'E' to U+00c8
+compose '`' 'e' to U+00e8
+compose '\'' 'E' to U+00c9
+compose '\'' 'e' to U+00e9
+compose '^' 'E' to U+00ca
+compose '^' 'e' to U+00ea
+compose '"' 'E' to U+00cb
+compose '"' 'e' to U+00eb
+compose '`' 'I' to U+00cc
+compose '`' 'i' to U+00ec
+compose '\'' 'I' to U+00cd
+compose '\'' 'i' to U+00ed
+compose '^' 'I' to U+00ce
+compose '^' 'i' to U+00ee
+compose '"' 'I' to U+00cf
+compose '"' 'i' to U+00ef
+compose '-' 'D' to U+00d0
+compose '-' 'd' to U+00f0
+compose '~' 'N' to U+00d1
+compose '~' 'n' to U+00f1
+compose '`' 'O' to U+00d2
+compose '`' 'o' to U+00f2
+compose '\'' 'O' to U+00d3
+compose '\'' 'o' to U+00f3
+compose '^' 'O' to U+00d4
+compose '^' 'o' to U+00f4
+compose '~' 'O' to U+00d5
+compose '~' 'o' to U+00f5
+compose '"' 'O' to U+00d6
+compose '"' 'o' to U+00f6
+compose '/' 'O' to U+00d8
+compose '/' 'o' to U+00f8
+compose '`' 'U' to U+00d9
+compose '`' 'u' to U+00f9
+compose '\'' 'U' to U+00da
+compose '\'' 'u' to U+00fa
+compose '^' 'U' to U+00db
+compose '^' 'u' to U+00fb
+compose '"' 'U' to U+00dc
+compose '"' 'u' to U+00fc
+compose '\'' 'Y' to U+00dd
+compose '\'' 'y' to U+00fd
+compose 'T' 'H' to U+00de
+compose 't' 'h' to U+00fe
+compose 's' 's' to U+00df
+compose '"' 'y' to U+00ff
+compose 's' 'z' to U+00df
+compose 'i' 'j' to U+00ff
diff --git a/core/modules/brazilian/data/opt/openslx/keymaps/brazilian_qwerty_keyboard_translation.map b/core/modules/brazilian/data/opt/openslx/keymaps/brazilian_qwerty_keyboard_translation.map
new file mode 100644
index 00000000..abf384bd
--- /dev/null
+++ b/core/modules/brazilian/data/opt/openslx/keymaps/brazilian_qwerty_keyboard_translation.map
@@ -0,0 +1,8500 @@
+keymaps 0-127
+keycode 1 = Escape
+ alt keycode 1 = Meta_Escape
+ shift alt keycode 1 = Meta_Escape
+ altgr alt keycode 1 = Meta_Escape
+ shift altgr alt keycode 1 = Meta_Escape
+ control alt keycode 1 = Meta_Escape
+ shift control alt keycode 1 = Meta_Escape
+ altgr control alt keycode 1 = Meta_Escape
+ shift altgr control alt keycode 1 = Meta_Escape
+ alt shiftl keycode 1 = Meta_Escape
+ shift alt shiftl keycode 1 = Meta_Escape
+ altgr alt shiftl keycode 1 = Meta_Escape
+ shift altgr alt shiftl keycode 1 = Meta_Escape
+ control alt shiftl keycode 1 = Meta_Escape
+ shift control alt shiftl keycode 1 = Meta_Escape
+ altgr control alt shiftl keycode 1 = Meta_Escape
+ shift altgr control alt shiftl keycode 1 = Meta_Escape
+ alt shiftr keycode 1 = Meta_Escape
+ shift alt shiftr keycode 1 = Meta_Escape
+ altgr alt shiftr keycode 1 = Meta_Escape
+ shift altgr alt shiftr keycode 1 = Meta_Escape
+ control alt shiftr keycode 1 = Meta_Escape
+ shift control alt shiftr keycode 1 = Meta_Escape
+ altgr control alt shiftr keycode 1 = Meta_Escape
+ shift altgr control alt shiftr keycode 1 = Meta_Escape
+ alt shiftl shiftr keycode 1 = Meta_Escape
+ shift alt shiftl shiftr keycode 1 = Meta_Escape
+ altgr alt shiftl shiftr keycode 1 = Meta_Escape
+ shift altgr alt shiftl shiftr keycode 1 = Meta_Escape
+ control alt shiftl shiftr keycode 1 = Meta_Escape
+ shift control alt shiftl shiftr keycode 1 = Meta_Escape
+ altgr control alt shiftl shiftr keycode 1 = Meta_Escape
+ shift altgr control alt shiftl shiftr keycode 1 = Meta_Escape
+ alt ctrll keycode 1 = Meta_Escape
+ shift alt ctrll keycode 1 = Meta_Escape
+ altgr alt ctrll keycode 1 = Meta_Escape
+ shift altgr alt ctrll keycode 1 = Meta_Escape
+ control alt ctrll keycode 1 = Meta_Escape
+ shift control alt ctrll keycode 1 = Meta_Escape
+ altgr control alt ctrll keycode 1 = Meta_Escape
+ shift altgr control alt ctrll keycode 1 = Meta_Escape
+ alt shiftl ctrll keycode 1 = Meta_Escape
+ shift alt shiftl ctrll keycode 1 = Meta_Escape
+ altgr alt shiftl ctrll keycode 1 = Meta_Escape
+ shift altgr alt shiftl ctrll keycode 1 = Meta_Escape
+ control alt shiftl ctrll keycode 1 = Meta_Escape
+ shift control alt shiftl ctrll keycode 1 = Meta_Escape
+ altgr control alt shiftl ctrll keycode 1 = Meta_Escape
+ shift altgr control alt shiftl ctrll keycode 1 = Meta_Escape
+ alt shiftr ctrll keycode 1 = Meta_Escape
+ shift alt shiftr ctrll keycode 1 = Meta_Escape
+ altgr alt shiftr ctrll keycode 1 = Meta_Escape
+ shift altgr alt shiftr ctrll keycode 1 = Meta_Escape
+ control alt shiftr ctrll keycode 1 = Meta_Escape
+ shift control alt shiftr ctrll keycode 1 = Meta_Escape
+ altgr control alt shiftr ctrll keycode 1 = Meta_Escape
+ shift altgr control alt shiftr ctrll keycode 1 = Meta_Escape
+ alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ shift alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ altgr alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ shift altgr alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ control alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ shift control alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ altgr control alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+ shift altgr control alt shiftl shiftr ctrll keycode 1 = Meta_Escape
+keycode 2 = one exclam onesuperior exclamdown
+ alt keycode 2 = Meta_one
+ shift alt keycode 2 = Meta_exclam
+ altgr alt keycode 2 = Meta_one
+ shift altgr alt keycode 2 = Meta_exclam
+ shiftl keycode 2 = one
+ shift shiftl keycode 2 = exclam
+ altgr shiftl keycode 2 = onesuperior
+ shift altgr shiftl keycode 2 = exclamdown
+ alt shiftl keycode 2 = Meta_one
+ shift alt shiftl keycode 2 = Meta_exclam
+ altgr alt shiftl keycode 2 = Meta_one
+ shift altgr alt shiftl keycode 2 = Meta_exclam
+ shiftr keycode 2 = one
+ shift shiftr keycode 2 = exclam
+ altgr shiftr keycode 2 = onesuperior
+ shift altgr shiftr keycode 2 = exclamdown
+ alt shiftr keycode 2 = Meta_one
+ shift alt shiftr keycode 2 = Meta_exclam
+ altgr alt shiftr keycode 2 = Meta_one
+ shift altgr alt shiftr keycode 2 = Meta_exclam
+ shiftl shiftr keycode 2 = one
+ shift shiftl shiftr keycode 2 = exclam
+ altgr shiftl shiftr keycode 2 = onesuperior
+ shift altgr shiftl shiftr keycode 2 = exclamdown
+ alt shiftl shiftr keycode 2 = Meta_one
+ shift alt shiftl shiftr keycode 2 = Meta_exclam
+ altgr alt shiftl shiftr keycode 2 = Meta_one
+ shift altgr alt shiftl shiftr keycode 2 = Meta_exclam
+ ctrll keycode 2 = one
+ shift ctrll keycode 2 = exclam
+ altgr ctrll keycode 2 = onesuperior
+ shift altgr ctrll keycode 2 = exclamdown
+ alt ctrll keycode 2 = Meta_one
+ shift alt ctrll keycode 2 = Meta_exclam
+ altgr alt ctrll keycode 2 = Meta_one
+ shift altgr alt ctrll keycode 2 = Meta_exclam
+ shiftl ctrll keycode 2 = one
+ shift shiftl ctrll keycode 2 = exclam
+ altgr shiftl ctrll keycode 2 = onesuperior
+ shift altgr shiftl ctrll keycode 2 = exclamdown
+ alt shiftl ctrll keycode 2 = Meta_one
+ shift alt shiftl ctrll keycode 2 = Meta_exclam
+ altgr alt shiftl ctrll keycode 2 = Meta_one
+ shift altgr alt shiftl ctrll keycode 2 = Meta_exclam
+ shiftr ctrll keycode 2 = one
+ shift shiftr ctrll keycode 2 = exclam
+ altgr shiftr ctrll keycode 2 = onesuperior
+ shift altgr shiftr ctrll keycode 2 = exclamdown
+ alt shiftr ctrll keycode 2 = Meta_one
+ shift alt shiftr ctrll keycode 2 = Meta_exclam
+ altgr alt shiftr ctrll keycode 2 = Meta_one
+ shift altgr alt shiftr ctrll keycode 2 = Meta_exclam
+ shiftl shiftr ctrll keycode 2 = one
+ shift shiftl shiftr ctrll keycode 2 = exclam
+ altgr shiftl shiftr ctrll keycode 2 = onesuperior
+ shift altgr shiftl shiftr ctrll keycode 2 = exclamdown
+ alt shiftl shiftr ctrll keycode 2 = Meta_one
+ shift alt shiftl shiftr ctrll keycode 2 = Meta_exclam
+ altgr alt shiftl shiftr ctrll keycode 2 = Meta_one
+ shift altgr alt shiftl shiftr ctrll keycode 2 = Meta_exclam
+keycode 3 = two
+ shift keycode 3 = at
+ altgr keycode 3 = twosuperior
+ shift altgr keycode 3 = onehalf
+ control keycode 3 = nul
+ shift control keycode 3 = nul
+ altgr control keycode 3 = nul
+ shift altgr control keycode 3 = nul
+ alt keycode 3 = Meta_two
+ shift alt keycode 3 = Meta_at
+ altgr alt keycode 3 = Meta_two
+ shift altgr alt keycode 3 = Meta_at
+ control alt keycode 3 = Meta_nul
+ shift control alt keycode 3 = Meta_nul
+ altgr control alt keycode 3 = Meta_nul
+ shift altgr control alt keycode 3 = Meta_nul
+ shift shiftl keycode 3 = at
+ altgr shiftl keycode 3 = twosuperior
+ shift altgr shiftl keycode 3 = onehalf
+ control shiftl keycode 3 = nul
+ shift control shiftl keycode 3 = nul
+ altgr control shiftl keycode 3 = nul
+ shift altgr control shiftl keycode 3 = nul
+ alt shiftl keycode 3 = Meta_two
+ shift alt shiftl keycode 3 = Meta_at
+ altgr alt shiftl keycode 3 = Meta_two
+ shift altgr alt shiftl keycode 3 = Meta_at
+ control alt shiftl keycode 3 = Meta_nul
+ shift control alt shiftl keycode 3 = Meta_nul
+ altgr control alt shiftl keycode 3 = Meta_nul
+ shift altgr control alt shiftl keycode 3 = Meta_nul
+ shift shiftr keycode 3 = at
+ altgr shiftr keycode 3 = twosuperior
+ shift altgr shiftr keycode 3 = onehalf
+ control shiftr keycode 3 = nul
+ shift control shiftr keycode 3 = nul
+ altgr control shiftr keycode 3 = nul
+ shift altgr control shiftr keycode 3 = nul
+ alt shiftr keycode 3 = Meta_two
+ shift alt shiftr keycode 3 = Meta_at
+ altgr alt shiftr keycode 3 = Meta_two
+ shift altgr alt shiftr keycode 3 = Meta_at
+ control alt shiftr keycode 3 = Meta_nul
+ shift control alt shiftr keycode 3 = Meta_nul
+ altgr control alt shiftr keycode 3 = Meta_nul
+ shift altgr control alt shiftr keycode 3 = Meta_nul
+ shift shiftl shiftr keycode 3 = at
+ altgr shiftl shiftr keycode 3 = twosuperior
+ shift altgr shiftl shiftr keycode 3 = onehalf
+ control shiftl shiftr keycode 3 = nul
+ shift control shiftl shiftr keycode 3 = nul
+ altgr control shiftl shiftr keycode 3 = nul
+ shift altgr control shiftl shiftr keycode 3 = nul
+ alt shiftl shiftr keycode 3 = Meta_two
+ shift alt shiftl shiftr keycode 3 = Meta_at
+ altgr alt shiftl shiftr keycode 3 = Meta_two
+ shift altgr alt shiftl shiftr keycode 3 = Meta_at
+ control alt shiftl shiftr keycode 3 = Meta_nul
+ shift control alt shiftl shiftr keycode 3 = Meta_nul
+ altgr control alt shiftl shiftr keycode 3 = Meta_nul
+ shift altgr control alt shiftl shiftr keycode 3 = Meta_nul
+ shift ctrll keycode 3 = at
+ altgr ctrll keycode 3 = twosuperior
+ shift altgr ctrll keycode 3 = onehalf
+ control ctrll keycode 3 = nul
+ shift control ctrll keycode 3 = nul
+ altgr control ctrll keycode 3 = nul
+ shift altgr control ctrll keycode 3 = nul
+ alt ctrll keycode 3 = Meta_two
+ shift alt ctrll keycode 3 = Meta_at
+ altgr alt ctrll keycode 3 = Meta_two
+ shift altgr alt ctrll keycode 3 = Meta_at
+ control alt ctrll keycode 3 = Meta_nul
+ shift control alt ctrll keycode 3 = Meta_nul
+ altgr control alt ctrll keycode 3 = Meta_nul
+ shift altgr control alt ctrll keycode 3 = Meta_nul
+ shift shiftl ctrll keycode 3 = at
+ altgr shiftl ctrll keycode 3 = twosuperior
+ shift altgr shiftl ctrll keycode 3 = onehalf
+ control shiftl ctrll keycode 3 = nul
+ shift control shiftl ctrll keycode 3 = nul
+ altgr control shiftl ctrll keycode 3 = nul
+ shift altgr control shiftl ctrll keycode 3 = nul
+ alt shiftl ctrll keycode 3 = Meta_two
+ shift alt shiftl ctrll keycode 3 = Meta_at
+ altgr alt shiftl ctrll keycode 3 = Meta_two
+ shift altgr alt shiftl ctrll keycode 3 = Meta_at
+ control alt shiftl ctrll keycode 3 = Meta_nul
+ shift control alt shiftl ctrll keycode 3 = Meta_nul
+ altgr control alt shiftl ctrll keycode 3 = Meta_nul
+ shift altgr control alt shiftl ctrll keycode 3 = Meta_nul
+ shift shiftr ctrll keycode 3 = at
+ altgr shiftr ctrll keycode 3 = twosuperior
+ shift altgr shiftr ctrll keycode 3 = onehalf
+ control shiftr ctrll keycode 3 = nul
+ shift control shiftr ctrll keycode 3 = nul
+ altgr control shiftr ctrll keycode 3 = nul
+ shift altgr control shiftr ctrll keycode 3 = nul
+ alt shiftr ctrll keycode 3 = Meta_two
+ shift alt shiftr ctrll keycode 3 = Meta_at
+ altgr alt shiftr ctrll keycode 3 = Meta_two
+ shift altgr alt shiftr ctrll keycode 3 = Meta_at
+ control alt shiftr ctrll keycode 3 = Meta_nul
+ shift control alt shiftr ctrll keycode 3 = Meta_nul
+ altgr control alt shiftr ctrll keycode 3 = Meta_nul
+ shift altgr control alt shiftr ctrll keycode 3 = Meta_nul
+ shift shiftl shiftr ctrll keycode 3 = at
+ altgr shiftl shiftr ctrll keycode 3 = twosuperior
+ shift altgr shiftl shiftr ctrll keycode 3 = onehalf
+ control shiftl shiftr ctrll keycode 3 = nul
+ shift control shiftl shiftr ctrll keycode 3 = nul
+ altgr control shiftl shiftr ctrll keycode 3 = nul
+ shift altgr control shiftl shiftr ctrll keycode 3 = nul
+ alt shiftl shiftr ctrll keycode 3 = Meta_two
+ shift alt shiftl shiftr ctrll keycode 3 = Meta_at
+ altgr alt shiftl shiftr ctrll keycode 3 = Meta_two
+ shift altgr alt shiftl shiftr ctrll keycode 3 = Meta_at
+ control alt shiftl shiftr ctrll keycode 3 = Meta_nul
+ shift control alt shiftl shiftr ctrll keycode 3 = Meta_nul
+ altgr control alt shiftl shiftr ctrll keycode 3 = Meta_nul
+ shift altgr control alt shiftl shiftr ctrll keycode 3 = Meta_nul
+keycode 4 = three
+ shift keycode 4 = numbersign
+ altgr keycode 4 = threesuperior
+ shift altgr keycode 4 = threequarters
+ control keycode 4 = Escape
+ shift control keycode 4 = Escape
+ altgr control keycode 4 = Escape
+ shift altgr control keycode 4 = Escape
+ alt keycode 4 = Meta_three
+ shift alt keycode 4 = Meta_numbersign
+ altgr alt keycode 4 = Meta_three
+ shift altgr alt keycode 4 = Meta_numbersign
+ control alt keycode 4 = Meta_Escape
+ shift control alt keycode 4 = Meta_Escape
+ altgr control alt keycode 4 = Meta_Escape
+ shift altgr control alt keycode 4 = Meta_Escape
+ shift shiftl keycode 4 = numbersign
+ altgr shiftl keycode 4 = threesuperior
+ shift altgr shiftl keycode 4 = threequarters
+ control shiftl keycode 4 = Escape
+ shift control shiftl keycode 4 = Escape
+ altgr control shiftl keycode 4 = Escape
+ shift altgr control shiftl keycode 4 = Escape
+ alt shiftl keycode 4 = Meta_three
+ shift alt shiftl keycode 4 = Meta_numbersign
+ altgr alt shiftl keycode 4 = Meta_three
+ shift altgr alt shiftl keycode 4 = Meta_numbersign
+ control alt shiftl keycode 4 = Meta_Escape
+ shift control alt shiftl keycode 4 = Meta_Escape
+ altgr control alt shiftl keycode 4 = Meta_Escape
+ shift altgr control alt shiftl keycode 4 = Meta_Escape
+ shift shiftr keycode 4 = numbersign
+ altgr shiftr keycode 4 = threesuperior
+ shift altgr shiftr keycode 4 = threequarters
+ control shiftr keycode 4 = Escape
+ shift control shiftr keycode 4 = Escape
+ altgr control shiftr keycode 4 = Escape
+ shift altgr control shiftr keycode 4 = Escape
+ alt shiftr keycode 4 = Meta_three
+ shift alt shiftr keycode 4 = Meta_numbersign
+ altgr alt shiftr keycode 4 = Meta_three
+ shift altgr alt shiftr keycode 4 = Meta_numbersign
+ control alt shiftr keycode 4 = Meta_Escape
+ shift control alt shiftr keycode 4 = Meta_Escape
+ altgr control alt shiftr keycode 4 = Meta_Escape
+ shift altgr control alt shiftr keycode 4 = Meta_Escape
+ shift shiftl shiftr keycode 4 = numbersign
+ altgr shiftl shiftr keycode 4 = threesuperior
+ shift altgr shiftl shiftr keycode 4 = threequarters
+ control shiftl shiftr keycode 4 = Escape
+ shift control shiftl shiftr keycode 4 = Escape
+ altgr control shiftl shiftr keycode 4 = Escape
+ shift altgr control shiftl shiftr keycode 4 = Escape
+ alt shiftl shiftr keycode 4 = Meta_three
+ shift alt shiftl shiftr keycode 4 = Meta_numbersign
+ altgr alt shiftl shiftr keycode 4 = Meta_three
+ shift altgr alt shiftl shiftr keycode 4 = Meta_numbersign
+ control alt shiftl shiftr keycode 4 = Meta_Escape
+ shift control alt shiftl shiftr keycode 4 = Meta_Escape
+ altgr control alt shiftl shiftr keycode 4 = Meta_Escape
+ shift altgr control alt shiftl shiftr keycode 4 = Meta_Escape
+ shift ctrll keycode 4 = numbersign
+ altgr ctrll keycode 4 = threesuperior
+ shift altgr ctrll keycode 4 = threequarters
+ control ctrll keycode 4 = Escape
+ shift control ctrll keycode 4 = Escape
+ altgr control ctrll keycode 4 = Escape
+ shift altgr control ctrll keycode 4 = Escape
+ alt ctrll keycode 4 = Meta_three
+ shift alt ctrll keycode 4 = Meta_numbersign
+ altgr alt ctrll keycode 4 = Meta_three
+ shift altgr alt ctrll keycode 4 = Meta_numbersign
+ control alt ctrll keycode 4 = Meta_Escape
+ shift control alt ctrll keycode 4 = Meta_Escape
+ altgr control alt ctrll keycode 4 = Meta_Escape
+ shift altgr control alt ctrll keycode 4 = Meta_Escape
+ shift shiftl ctrll keycode 4 = numbersign
+ altgr shiftl ctrll keycode 4 = threesuperior
+ shift altgr shiftl ctrll keycode 4 = threequarters
+ control shiftl ctrll keycode 4 = Escape
+ shift control shiftl ctrll keycode 4 = Escape
+ altgr control shiftl ctrll keycode 4 = Escape
+ shift altgr control shiftl ctrll keycode 4 = Escape
+ alt shiftl ctrll keycode 4 = Meta_three
+ shift alt shiftl ctrll keycode 4 = Meta_numbersign
+ altgr alt shiftl ctrll keycode 4 = Meta_three
+ shift altgr alt shiftl ctrll keycode 4 = Meta_numbersign
+ control alt shiftl ctrll keycode 4 = Meta_Escape
+ shift control alt shiftl ctrll keycode 4 = Meta_Escape
+ altgr control alt shiftl ctrll keycode 4 = Meta_Escape
+ shift altgr control alt shiftl ctrll keycode 4 = Meta_Escape
+ shift shiftr ctrll keycode 4 = numbersign
+ altgr shiftr ctrll keycode 4 = threesuperior
+ shift altgr shiftr ctrll keycode 4 = threequarters
+ control shiftr ctrll keycode 4 = Escape
+ shift control shiftr ctrll keycode 4 = Escape
+ altgr control shiftr ctrll keycode 4 = Escape
+ shift altgr control shiftr ctrll keycode 4 = Escape
+ alt shiftr ctrll keycode 4 = Meta_three
+ shift alt shiftr ctrll keycode 4 = Meta_numbersign
+ altgr alt shiftr ctrll keycode 4 = Meta_three
+ shift altgr alt shiftr ctrll keycode 4 = Meta_numbersign
+ control alt shiftr ctrll keycode 4 = Meta_Escape
+ shift control alt shiftr ctrll keycode 4 = Meta_Escape
+ altgr control alt shiftr ctrll keycode 4 = Meta_Escape
+ shift altgr control alt shiftr ctrll keycode 4 = Meta_Escape
+ shift shiftl shiftr ctrll keycode 4 = numbersign
+ altgr shiftl shiftr ctrll keycode 4 = threesuperior
+ shift altgr shiftl shiftr ctrll keycode 4 = threequarters
+ control shiftl shiftr ctrll keycode 4 = Escape
+ shift control shiftl shiftr ctrll keycode 4 = Escape
+ altgr control shiftl shiftr ctrll keycode 4 = Escape
+ shift altgr control shiftl shiftr ctrll keycode 4 = Escape
+ alt shiftl shiftr ctrll keycode 4 = Meta_three
+ shift alt shiftl shiftr ctrll keycode 4 = Meta_numbersign
+ altgr alt shiftl shiftr ctrll keycode 4 = Meta_three
+ shift altgr alt shiftl shiftr ctrll keycode 4 = Meta_numbersign
+ control alt shiftl shiftr ctrll keycode 4 = Meta_Escape
+ shift control alt shiftl shiftr ctrll keycode 4 = Meta_Escape
+ altgr control alt shiftl shiftr ctrll keycode 4 = Meta_Escape
+ shift altgr control alt shiftl shiftr ctrll keycode 4 = Meta_Escape
+keycode 5 = four
+ shift keycode 5 = dollar
+ altgr keycode 5 = sterling
+ shift altgr keycode 5 = onequarter
+ control keycode 5 = Control_backslash
+ shift control keycode 5 = Control_backslash
+ altgr control keycode 5 = Control_backslash
+ shift altgr control keycode 5 = Control_backslash
+ alt keycode 5 = Meta_four
+ shift alt keycode 5 = Meta_dollar
+ altgr alt keycode 5 = Meta_four
+ shift altgr alt keycode 5 = Meta_dollar
+ control alt keycode 5 = Meta_Control_backslash
+ shift control alt keycode 5 = Meta_Control_backslash
+ altgr control alt keycode 5 = Meta_Control_backslash
+ shift altgr control alt keycode 5 = Meta_Control_backslash
+ shift shiftl keycode 5 = dollar
+ altgr shiftl keycode 5 = sterling
+ shift altgr shiftl keycode 5 = onequarter
+ control shiftl keycode 5 = Control_backslash
+ shift control shiftl keycode 5 = Control_backslash
+ altgr control shiftl keycode 5 = Control_backslash
+ shift altgr control shiftl keycode 5 = Control_backslash
+ alt shiftl keycode 5 = Meta_four
+ shift alt shiftl keycode 5 = Meta_dollar
+ altgr alt shiftl keycode 5 = Meta_four
+ shift altgr alt shiftl keycode 5 = Meta_dollar
+ control alt shiftl keycode 5 = Meta_Control_backslash
+ shift control alt shiftl keycode 5 = Meta_Control_backslash
+ altgr control alt shiftl keycode 5 = Meta_Control_backslash
+ shift altgr control alt shiftl keycode 5 = Meta_Control_backslash
+ shift shiftr keycode 5 = dollar
+ altgr shiftr keycode 5 = sterling
+ shift altgr shiftr keycode 5 = onequarter
+ control shiftr keycode 5 = Control_backslash
+ shift control shiftr keycode 5 = Control_backslash
+ altgr control shiftr keycode 5 = Control_backslash
+ shift altgr control shiftr keycode 5 = Control_backslash
+ alt shiftr keycode 5 = Meta_four
+ shift alt shiftr keycode 5 = Meta_dollar
+ altgr alt shiftr keycode 5 = Meta_four
+ shift altgr alt shiftr keycode 5 = Meta_dollar
+ control alt shiftr keycode 5 = Meta_Control_backslash
+ shift control alt shiftr keycode 5 = Meta_Control_backslash
+ altgr control alt shiftr keycode 5 = Meta_Control_backslash
+ shift altgr control alt shiftr keycode 5 = Meta_Control_backslash
+ shift shiftl shiftr keycode 5 = dollar
+ altgr shiftl shiftr keycode 5 = sterling
+ shift altgr shiftl shiftr keycode 5 = onequarter
+ control shiftl shiftr keycode 5 = Control_backslash
+ shift control shiftl shiftr keycode 5 = Control_backslash
+ altgr control shiftl shiftr keycode 5 = Control_backslash
+ shift altgr control shiftl shiftr keycode 5 = Control_backslash
+ alt shiftl shiftr keycode 5 = Meta_four
+ shift alt shiftl shiftr keycode 5 = Meta_dollar
+ altgr alt shiftl shiftr keycode 5 = Meta_four
+ shift altgr alt shiftl shiftr keycode 5 = Meta_dollar
+ control alt shiftl shiftr keycode 5 = Meta_Control_backslash
+ shift control alt shiftl shiftr keycode 5 = Meta_Control_backslash
+ altgr control alt shiftl shiftr keycode 5 = Meta_Control_backslash
+ shift altgr control alt shiftl shiftr keycode 5 = Meta_Control_backslash
+ shift ctrll keycode 5 = dollar
+ altgr ctrll keycode 5 = sterling
+ shift altgr ctrll keycode 5 = onequarter
+ control ctrll keycode 5 = Control_backslash
+ shift control ctrll keycode 5 = Control_backslash
+ altgr control ctrll keycode 5 = Control_backslash
+ shift altgr control ctrll keycode 5 = Control_backslash
+ alt ctrll keycode 5 = Meta_four
+ shift alt ctrll keycode 5 = Meta_dollar
+ altgr alt ctrll keycode 5 = Meta_four
+ shift altgr alt ctrll keycode 5 = Meta_dollar
+ control alt ctrll keycode 5 = Meta_Control_backslash
+ shift control alt ctrll keycode 5 = Meta_Control_backslash
+ altgr control alt ctrll keycode 5 = Meta_Control_backslash
+ shift altgr control alt ctrll keycode 5 = Meta_Control_backslash
+ shift shiftl ctrll keycode 5 = dollar
+ altgr shiftl ctrll keycode 5 = sterling
+ shift altgr shiftl ctrll keycode 5 = onequarter
+ control shiftl ctrll keycode 5 = Control_backslash
+ shift control shiftl ctrll keycode 5 = Control_backslash
+ altgr control shiftl ctrll keycode 5 = Control_backslash
+ shift altgr control shiftl ctrll keycode 5 = Control_backslash
+ alt shiftl ctrll keycode 5 = Meta_four
+ shift alt shiftl ctrll keycode 5 = Meta_dollar
+ altgr alt shiftl ctrll keycode 5 = Meta_four
+ shift altgr alt shiftl ctrll keycode 5 = Meta_dollar
+ control alt shiftl ctrll keycode 5 = Meta_Control_backslash
+ shift control alt shiftl ctrll keycode 5 = Meta_Control_backslash
+ altgr control alt shiftl ctrll keycode 5 = Meta_Control_backslash
+ shift altgr control alt shiftl ctrll keycode 5 = Meta_Control_backslash
+ shift shiftr ctrll keycode 5 = dollar
+ altgr shiftr ctrll keycode 5 = sterling
+ shift altgr shiftr ctrll keycode 5 = onequarter
+ control shiftr ctrll keycode 5 = Control_backslash
+ shift control shiftr ctrll keycode 5 = Control_backslash
+ altgr control shiftr ctrll keycode 5 = Control_backslash
+ shift altgr control shiftr ctrll keycode 5 = Control_backslash
+ alt shiftr ctrll keycode 5 = Meta_four
+ shift alt shiftr ctrll keycode 5 = Meta_dollar
+ altgr alt shiftr ctrll keycode 5 = Meta_four
+ shift altgr alt shiftr ctrll keycode 5 = Meta_dollar
+ control alt shiftr ctrll keycode 5 = Meta_Control_backslash
+ shift control alt shiftr ctrll keycode 5 = Meta_Control_backslash
+ altgr control alt shiftr ctrll keycode 5 = Meta_Control_backslash
+ shift altgr control alt shiftr ctrll keycode 5 = Meta_Control_backslash
+ shift shiftl shiftr ctrll keycode 5 = dollar
+ altgr shiftl shiftr ctrll keycode 5 = sterling
+ shift altgr shiftl shiftr ctrll keycode 5 = onequarter
+ control shiftl shiftr ctrll keycode 5 = Control_backslash
+ shift control shiftl shiftr ctrll keycode 5 = Control_backslash
+ altgr control shiftl shiftr ctrll keycode 5 = Control_backslash
+ shift altgr control shiftl shiftr ctrll keycode 5 = Control_backslash
+ alt shiftl shiftr ctrll keycode 5 = Meta_four
+ shift alt shiftl shiftr ctrll keycode 5 = Meta_dollar
+ altgr alt shiftl shiftr ctrll keycode 5 = Meta_four
+ shift altgr alt shiftl shiftr ctrll keycode 5 = Meta_dollar
+ control alt shiftl shiftr ctrll keycode 5 = Meta_Control_backslash
+ shift control alt shiftl shiftr ctrll keycode 5 = Meta_Control_backslash
+ altgr control alt shiftl shiftr ctrll keycode 5 = Meta_Control_backslash
+ shift altgr control alt shiftl shiftr ctrll keycode 5 = Meta_Control_backslash
+keycode 6 = five
+ shift keycode 6 = percent
+ altgr keycode 6 = cent
+ shift altgr keycode 6 = U+215c
+ control keycode 6 = Control_bracketright
+ shift control keycode 6 = Control_bracketright
+ altgr control keycode 6 = Control_bracketright
+ shift altgr control keycode 6 = Control_bracketright
+ alt keycode 6 = Meta_five
+ shift alt keycode 6 = Meta_percent
+ altgr alt keycode 6 = Meta_five
+ shift altgr alt keycode 6 = Meta_percent
+ control alt keycode 6 = Meta_Control_bracketright
+ shift control alt keycode 6 = Meta_Control_bracketright
+ altgr control alt keycode 6 = Meta_Control_bracketright
+ shift altgr control alt keycode 6 = Meta_Control_bracketright
+ shift shiftl keycode 6 = percent
+ altgr shiftl keycode 6 = cent
+ shift altgr shiftl keycode 6 = U+215c
+ control shiftl keycode 6 = Control_bracketright
+ shift control shiftl keycode 6 = Control_bracketright
+ altgr control shiftl keycode 6 = Control_bracketright
+ shift altgr control shiftl keycode 6 = Control_bracketright
+ alt shiftl keycode 6 = Meta_five
+ shift alt shiftl keycode 6 = Meta_percent
+ altgr alt shiftl keycode 6 = Meta_five
+ shift altgr alt shiftl keycode 6 = Meta_percent
+ control alt shiftl keycode 6 = Meta_Control_bracketright
+ shift control alt shiftl keycode 6 = Meta_Control_bracketright
+ altgr control alt shiftl keycode 6 = Meta_Control_bracketright
+ shift altgr control alt shiftl keycode 6 = Meta_Control_bracketright
+ shift shiftr keycode 6 = percent
+ altgr shiftr keycode 6 = cent
+ shift altgr shiftr keycode 6 = U+215c
+ control shiftr keycode 6 = Control_bracketright
+ shift control shiftr keycode 6 = Control_bracketright
+ altgr control shiftr keycode 6 = Control_bracketright
+ shift altgr control shiftr keycode 6 = Control_bracketright
+ alt shiftr keycode 6 = Meta_five
+ shift alt shiftr keycode 6 = Meta_percent
+ altgr alt shiftr keycode 6 = Meta_five
+ shift altgr alt shiftr keycode 6 = Meta_percent
+ control alt shiftr keycode 6 = Meta_Control_bracketright
+ shift control alt shiftr keycode 6 = Meta_Control_bracketright
+ altgr control alt shiftr keycode 6 = Meta_Control_bracketright
+ shift altgr control alt shiftr keycode 6 = Meta_Control_bracketright
+ shift shiftl shiftr keycode 6 = percent
+ altgr shiftl shiftr keycode 6 = cent
+ shift altgr shiftl shiftr keycode 6 = U+215c
+ control shiftl shiftr keycode 6 = Control_bracketright
+ shift control shiftl shiftr keycode 6 = Control_bracketright
+ altgr control shiftl shiftr keycode 6 = Control_bracketright
+ shift altgr control shiftl shiftr keycode 6 = Control_bracketright
+ alt shiftl shiftr keycode 6 = Meta_five
+ shift alt shiftl shiftr keycode 6 = Meta_percent
+ altgr alt shiftl shiftr keycode 6 = Meta_five
+ shift altgr alt shiftl shiftr keycode 6 = Meta_percent
+ control alt shiftl shiftr keycode 6 = Meta_Control_bracketright
+ shift control alt shiftl shiftr keycode 6 = Meta_Control_bracketright
+ altgr control alt shiftl shiftr keycode 6 = Meta_Control_bracketright
+ shift altgr control alt shiftl shiftr keycode 6 = Meta_Control_bracketright
+ shift ctrll keycode 6 = percent
+ altgr ctrll keycode 6 = cent
+ shift altgr ctrll keycode 6 = U+215c
+ control ctrll keycode 6 = Control_bracketright
+ shift control ctrll keycode 6 = Control_bracketright
+ altgr control ctrll keycode 6 = Control_bracketright
+ shift altgr control ctrll keycode 6 = Control_bracketright
+ alt ctrll keycode 6 = Meta_five
+ shift alt ctrll keycode 6 = Meta_percent
+ altgr alt ctrll keycode 6 = Meta_five
+ shift altgr alt ctrll keycode 6 = Meta_percent
+ control alt ctrll keycode 6 = Meta_Control_bracketright
+ shift control alt ctrll keycode 6 = Meta_Control_bracketright
+ altgr control alt ctrll keycode 6 = Meta_Control_bracketright
+ shift altgr control alt ctrll keycode 6 = Meta_Control_bracketright
+ shift shiftl ctrll keycode 6 = percent
+ altgr shiftl ctrll keycode 6 = cent
+ shift altgr shiftl ctrll keycode 6 = U+215c
+ control shiftl ctrll keycode 6 = Control_bracketright
+ shift control shiftl ctrll keycode 6 = Control_bracketright
+ altgr control shiftl ctrll keycode 6 = Control_bracketright
+ shift altgr control shiftl ctrll keycode 6 = Control_bracketright
+ alt shiftl ctrll keycode 6 = Meta_five
+ shift alt shiftl ctrll keycode 6 = Meta_percent
+ altgr alt shiftl ctrll keycode 6 = Meta_five
+ shift altgr alt shiftl ctrll keycode 6 = Meta_percent
+ control alt shiftl ctrll keycode 6 = Meta_Control_bracketright
+ shift control alt shiftl ctrll keycode 6 = Meta_Control_bracketright
+ altgr control alt shiftl ctrll keycode 6 = Meta_Control_bracketright
+ shift altgr control alt shiftl ctrll keycode 6 = Meta_Control_bracketright
+ shift shiftr ctrll keycode 6 = percent
+ altgr shiftr ctrll keycode 6 = cent
+ shift altgr shiftr ctrll keycode 6 = U+215c
+ control shiftr ctrll keycode 6 = Control_bracketright
+ shift control shiftr ctrll keycode 6 = Control_bracketright
+ altgr control shiftr ctrll keycode 6 = Control_bracketright
+ shift altgr control shiftr ctrll keycode 6 = Control_bracketright
+ alt shiftr ctrll keycode 6 = Meta_five
+ shift alt shiftr ctrll keycode 6 = Meta_percent
+ altgr alt shiftr ctrll keycode 6 = Meta_five
+ shift altgr alt shiftr ctrll keycode 6 = Meta_percent
+ control alt shiftr ctrll keycode 6 = Meta_Control_bracketright
+ shift control alt shiftr ctrll keycode 6 = Meta_Control_bracketright
+ altgr control alt shiftr ctrll keycode 6 = Meta_Control_bracketright
+ shift altgr control alt shiftr ctrll keycode 6 = Meta_Control_bracketright
+ shift shiftl shiftr ctrll keycode 6 = percent
+ altgr shiftl shiftr ctrll keycode 6 = cent
+ shift altgr shiftl shiftr ctrll keycode 6 = U+215c
+ control shiftl shiftr ctrll keycode 6 = Control_bracketright
+ shift control shiftl shiftr ctrll keycode 6 = Control_bracketright
+ altgr control shiftl shiftr ctrll keycode 6 = Control_bracketright
+ shift altgr control shiftl shiftr ctrll keycode 6 = Control_bracketright
+ alt shiftl shiftr ctrll keycode 6 = Meta_five
+ shift alt shiftl shiftr ctrll keycode 6 = Meta_percent
+ altgr alt shiftl shiftr ctrll keycode 6 = Meta_five
+ shift altgr alt shiftl shiftr ctrll keycode 6 = Meta_percent
+ control alt shiftl shiftr ctrll keycode 6 = Meta_Control_bracketright
+ shift control alt shiftl shiftr ctrll keycode 6 = Meta_Control_bracketright
+ altgr control alt shiftl shiftr ctrll keycode 6 = Meta_Control_bracketright
+ shift altgr control alt shiftl shiftr ctrll keycode 6 = Meta_Control_bracketright
+keycode 7 = six
+ shift keycode 7 = dead_diaeresis
+ altgr keycode 7 = notsign
+ shift altgr keycode 7 = diaeresis
+ control keycode 7 = Control_asciicircum
+ shift control keycode 7 = dead_diaeresis
+ altgr control keycode 7 = Control_asciicircum
+ shift altgr control keycode 7 = dead_diaeresis
+ alt keycode 7 = Meta_six
+ shift alt keycode 7 = dead_diaeresis
+ altgr alt keycode 7 = Meta_six
+ shift altgr alt keycode 7 = dead_diaeresis
+ control alt keycode 7 = Meta_Control_asciicircum
+ shift control alt keycode 7 = dead_diaeresis
+ altgr control alt keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt keycode 7 = dead_diaeresis
+ shift shiftl keycode 7 = dead_diaeresis
+ altgr shiftl keycode 7 = notsign
+ shift altgr shiftl keycode 7 = diaeresis
+ control shiftl keycode 7 = Control_asciicircum
+ shift control shiftl keycode 7 = dead_diaeresis
+ altgr control shiftl keycode 7 = Control_asciicircum
+ shift altgr control shiftl keycode 7 = dead_diaeresis
+ alt shiftl keycode 7 = Meta_six
+ shift alt shiftl keycode 7 = dead_diaeresis
+ altgr alt shiftl keycode 7 = Meta_six
+ shift altgr alt shiftl keycode 7 = dead_diaeresis
+ control alt shiftl keycode 7 = Meta_Control_asciicircum
+ shift control alt shiftl keycode 7 = dead_diaeresis
+ altgr control alt shiftl keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt shiftl keycode 7 = dead_diaeresis
+ shift shiftr keycode 7 = dead_diaeresis
+ altgr shiftr keycode 7 = notsign
+ shift altgr shiftr keycode 7 = diaeresis
+ control shiftr keycode 7 = Control_asciicircum
+ shift control shiftr keycode 7 = dead_diaeresis
+ altgr control shiftr keycode 7 = Control_asciicircum
+ shift altgr control shiftr keycode 7 = dead_diaeresis
+ alt shiftr keycode 7 = Meta_six
+ shift alt shiftr keycode 7 = dead_diaeresis
+ altgr alt shiftr keycode 7 = Meta_six
+ shift altgr alt shiftr keycode 7 = dead_diaeresis
+ control alt shiftr keycode 7 = Meta_Control_asciicircum
+ shift control alt shiftr keycode 7 = dead_diaeresis
+ altgr control alt shiftr keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt shiftr keycode 7 = dead_diaeresis
+ shift shiftl shiftr keycode 7 = dead_diaeresis
+ altgr shiftl shiftr keycode 7 = notsign
+ shift altgr shiftl shiftr keycode 7 = diaeresis
+ control shiftl shiftr keycode 7 = Control_asciicircum
+ shift control shiftl shiftr keycode 7 = dead_diaeresis
+ altgr control shiftl shiftr keycode 7 = Control_asciicircum
+ shift altgr control shiftl shiftr keycode 7 = dead_diaeresis
+ alt shiftl shiftr keycode 7 = Meta_six
+ shift alt shiftl shiftr keycode 7 = dead_diaeresis
+ altgr alt shiftl shiftr keycode 7 = Meta_six
+ shift altgr alt shiftl shiftr keycode 7 = dead_diaeresis
+ control alt shiftl shiftr keycode 7 = Meta_Control_asciicircum
+ shift control alt shiftl shiftr keycode 7 = dead_diaeresis
+ altgr control alt shiftl shiftr keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt shiftl shiftr keycode 7 = dead_diaeresis
+ shift ctrll keycode 7 = dead_diaeresis
+ altgr ctrll keycode 7 = notsign
+ shift altgr ctrll keycode 7 = diaeresis
+ control ctrll keycode 7 = Control_asciicircum
+ shift control ctrll keycode 7 = dead_diaeresis
+ altgr control ctrll keycode 7 = Control_asciicircum
+ shift altgr control ctrll keycode 7 = dead_diaeresis
+ alt ctrll keycode 7 = Meta_six
+ shift alt ctrll keycode 7 = dead_diaeresis
+ altgr alt ctrll keycode 7 = Meta_six
+ shift altgr alt ctrll keycode 7 = dead_diaeresis
+ control alt ctrll keycode 7 = Meta_Control_asciicircum
+ shift control alt ctrll keycode 7 = dead_diaeresis
+ altgr control alt ctrll keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt ctrll keycode 7 = dead_diaeresis
+ shift shiftl ctrll keycode 7 = dead_diaeresis
+ altgr shiftl ctrll keycode 7 = notsign
+ shift altgr shiftl ctrll keycode 7 = diaeresis
+ control shiftl ctrll keycode 7 = Control_asciicircum
+ shift control shiftl ctrll keycode 7 = dead_diaeresis
+ altgr control shiftl ctrll keycode 7 = Control_asciicircum
+ shift altgr control shiftl ctrll keycode 7 = dead_diaeresis
+ alt shiftl ctrll keycode 7 = Meta_six
+ shift alt shiftl ctrll keycode 7 = dead_diaeresis
+ altgr alt shiftl ctrll keycode 7 = Meta_six
+ shift altgr alt shiftl ctrll keycode 7 = dead_diaeresis
+ control alt shiftl ctrll keycode 7 = Meta_Control_asciicircum
+ shift control alt shiftl ctrll keycode 7 = dead_diaeresis
+ altgr control alt shiftl ctrll keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt shiftl ctrll keycode 7 = dead_diaeresis
+ shift shiftr ctrll keycode 7 = dead_diaeresis
+ altgr shiftr ctrll keycode 7 = notsign
+ shift altgr shiftr ctrll keycode 7 = diaeresis
+ control shiftr ctrll keycode 7 = Control_asciicircum
+ shift control shiftr ctrll keycode 7 = dead_diaeresis
+ altgr control shiftr ctrll keycode 7 = Control_asciicircum
+ shift altgr control shiftr ctrll keycode 7 = dead_diaeresis
+ alt shiftr ctrll keycode 7 = Meta_six
+ shift alt shiftr ctrll keycode 7 = dead_diaeresis
+ altgr alt shiftr ctrll keycode 7 = Meta_six
+ shift altgr alt shiftr ctrll keycode 7 = dead_diaeresis
+ control alt shiftr ctrll keycode 7 = Meta_Control_asciicircum
+ shift control alt shiftr ctrll keycode 7 = dead_diaeresis
+ altgr control alt shiftr ctrll keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt shiftr ctrll keycode 7 = dead_diaeresis
+ shift shiftl shiftr ctrll keycode 7 = dead_diaeresis
+ altgr shiftl shiftr ctrll keycode 7 = notsign
+ shift altgr shiftl shiftr ctrll keycode 7 = diaeresis
+ control shiftl shiftr ctrll keycode 7 = Control_asciicircum
+ shift control shiftl shiftr ctrll keycode 7 = dead_diaeresis
+ altgr control shiftl shiftr ctrll keycode 7 = Control_asciicircum
+ shift altgr control shiftl shiftr ctrll keycode 7 = dead_diaeresis
+ alt shiftl shiftr ctrll keycode 7 = Meta_six
+ shift alt shiftl shiftr ctrll keycode 7 = dead_diaeresis
+ altgr alt shiftl shiftr ctrll keycode 7 = Meta_six
+ shift altgr alt shiftl shiftr ctrll keycode 7 = dead_diaeresis
+ control alt shiftl shiftr ctrll keycode 7 = Meta_Control_asciicircum
+ shift control alt shiftl shiftr ctrll keycode 7 = dead_diaeresis
+ altgr control alt shiftl shiftr ctrll keycode 7 = Meta_Control_asciicircum
+ shift altgr control alt shiftl shiftr ctrll keycode 7 = dead_diaeresis
+keycode 8 = seven
+ shift keycode 8 = ampersand
+ altgr keycode 8 = braceleft
+ shift altgr keycode 8 = U+215e
+ control keycode 8 = Control_underscore
+ shift control keycode 8 = Control_underscore
+ altgr control keycode 8 = Control_underscore
+ shift altgr control keycode 8 = Control_underscore
+ alt keycode 8 = Meta_seven
+ shift alt keycode 8 = Meta_ampersand
+ altgr alt keycode 8 = Meta_braceleft
+ shift altgr alt keycode 8 = Meta_braceleft
+ control alt keycode 8 = Meta_Control_underscore
+ shift control alt keycode 8 = Meta_Control_underscore
+ altgr control alt keycode 8 = Meta_Control_underscore
+ shift altgr control alt keycode 8 = Meta_Control_underscore
+ shift shiftl keycode 8 = ampersand
+ altgr shiftl keycode 8 = braceleft
+ shift altgr shiftl keycode 8 = U+215e
+ control shiftl keycode 8 = Control_underscore
+ shift control shiftl keycode 8 = Control_underscore
+ altgr control shiftl keycode 8 = Control_underscore
+ shift altgr control shiftl keycode 8 = Control_underscore
+ alt shiftl keycode 8 = Meta_seven
+ shift alt shiftl keycode 8 = Meta_ampersand
+ altgr alt shiftl keycode 8 = Meta_braceleft
+ shift altgr alt shiftl keycode 8 = Meta_braceleft
+ control alt shiftl keycode 8 = Meta_Control_underscore
+ shift control alt shiftl keycode 8 = Meta_Control_underscore
+ altgr control alt shiftl keycode 8 = Meta_Control_underscore
+ shift altgr control alt shiftl keycode 8 = Meta_Control_underscore
+ shift shiftr keycode 8 = ampersand
+ altgr shiftr keycode 8 = braceleft
+ shift altgr shiftr keycode 8 = U+215e
+ control shiftr keycode 8 = Control_underscore
+ shift control shiftr keycode 8 = Control_underscore
+ altgr control shiftr keycode 8 = Control_underscore
+ shift altgr control shiftr keycode 8 = Control_underscore
+ alt shiftr keycode 8 = Meta_seven
+ shift alt shiftr keycode 8 = Meta_ampersand
+ altgr alt shiftr keycode 8 = Meta_braceleft
+ shift altgr alt shiftr keycode 8 = Meta_braceleft
+ control alt shiftr keycode 8 = Meta_Control_underscore
+ shift control alt shiftr keycode 8 = Meta_Control_underscore
+ altgr control alt shiftr keycode 8 = Meta_Control_underscore
+ shift altgr control alt shiftr keycode 8 = Meta_Control_underscore
+ shift shiftl shiftr keycode 8 = ampersand
+ altgr shiftl shiftr keycode 8 = braceleft
+ shift altgr shiftl shiftr keycode 8 = U+215e
+ control shiftl shiftr keycode 8 = Control_underscore
+ shift control shiftl shiftr keycode 8 = Control_underscore
+ altgr control shiftl shiftr keycode 8 = Control_underscore
+ shift altgr control shiftl shiftr keycode 8 = Control_underscore
+ alt shiftl shiftr keycode 8 = Meta_seven
+ shift alt shiftl shiftr keycode 8 = Meta_ampersand
+ altgr alt shiftl shiftr keycode 8 = Meta_braceleft
+ shift altgr alt shiftl shiftr keycode 8 = Meta_braceleft
+ control alt shiftl shiftr keycode 8 = Meta_Control_underscore
+ shift control alt shiftl shiftr keycode 8 = Meta_Control_underscore
+ altgr control alt shiftl shiftr keycode 8 = Meta_Control_underscore
+ shift altgr control alt shiftl shiftr keycode 8 = Meta_Control_underscore
+ shift ctrll keycode 8 = ampersand
+ altgr ctrll keycode 8 = braceleft
+ shift altgr ctrll keycode 8 = U+215e
+ control ctrll keycode 8 = Control_underscore
+ shift control ctrll keycode 8 = Control_underscore
+ altgr control ctrll keycode 8 = Control_underscore
+ shift altgr control ctrll keycode 8 = Control_underscore
+ alt ctrll keycode 8 = Meta_seven
+ shift alt ctrll keycode 8 = Meta_ampersand
+ altgr alt ctrll keycode 8 = Meta_braceleft
+ shift altgr alt ctrll keycode 8 = Meta_braceleft
+ control alt ctrll keycode 8 = Meta_Control_underscore
+ shift control alt ctrll keycode 8 = Meta_Control_underscore
+ altgr control alt ctrll keycode 8 = Meta_Control_underscore
+ shift altgr control alt ctrll keycode 8 = Meta_Control_underscore
+ shift shiftl ctrll keycode 8 = ampersand
+ altgr shiftl ctrll keycode 8 = braceleft
+ shift altgr shiftl ctrll keycode 8 = U+215e
+ control shiftl ctrll keycode 8 = Control_underscore
+ shift control shiftl ctrll keycode 8 = Control_underscore
+ altgr control shiftl ctrll keycode 8 = Control_underscore
+ shift altgr control shiftl ctrll keycode 8 = Control_underscore
+ alt shiftl ctrll keycode 8 = Meta_seven
+ shift alt shiftl ctrll keycode 8 = Meta_ampersand
+ altgr alt shiftl ctrll keycode 8 = Meta_braceleft
+ shift altgr alt shiftl ctrll keycode 8 = Meta_braceleft
+ control alt shiftl ctrll keycode 8 = Meta_Control_underscore
+ shift control alt shiftl ctrll keycode 8 = Meta_Control_underscore
+ altgr control alt shiftl ctrll keycode 8 = Meta_Control_underscore
+ shift altgr control alt shiftl ctrll keycode 8 = Meta_Control_underscore
+ shift shiftr ctrll keycode 8 = ampersand
+ altgr shiftr ctrll keycode 8 = braceleft
+ shift altgr shiftr ctrll keycode 8 = U+215e
+ control shiftr ctrll keycode 8 = Control_underscore
+ shift control shiftr ctrll keycode 8 = Control_underscore
+ altgr control shiftr ctrll keycode 8 = Control_underscore
+ shift altgr control shiftr ctrll keycode 8 = Control_underscore
+ alt shiftr ctrll keycode 8 = Meta_seven
+ shift alt shiftr ctrll keycode 8 = Meta_ampersand
+ altgr alt shiftr ctrll keycode 8 = Meta_braceleft
+ shift altgr alt shiftr ctrll keycode 8 = Meta_braceleft
+ control alt shiftr ctrll keycode 8 = Meta_Control_underscore
+ shift control alt shiftr ctrll keycode 8 = Meta_Control_underscore
+ altgr control alt shiftr ctrll keycode 8 = Meta_Control_underscore
+ shift altgr control alt shiftr ctrll keycode 8 = Meta_Control_underscore
+ shift shiftl shiftr ctrll keycode 8 = ampersand
+ altgr shiftl shiftr ctrll keycode 8 = braceleft
+ shift altgr shiftl shiftr ctrll keycode 8 = U+215e
+ control shiftl shiftr ctrll keycode 8 = Control_underscore
+ shift control shiftl shiftr ctrll keycode 8 = Control_underscore
+ altgr control shiftl shiftr ctrll keycode 8 = Control_underscore
+ shift altgr control shiftl shiftr ctrll keycode 8 = Control_underscore
+ alt shiftl shiftr ctrll keycode 8 = Meta_seven
+ shift alt shiftl shiftr ctrll keycode 8 = Meta_ampersand
+ altgr alt shiftl shiftr ctrll keycode 8 = Meta_braceleft
+ shift altgr alt shiftl shiftr ctrll keycode 8 = Meta_braceleft
+ control alt shiftl shiftr ctrll keycode 8 = Meta_Control_underscore
+ shift control alt shiftl shiftr ctrll keycode 8 = Meta_Control_underscore
+ altgr control alt shiftl shiftr ctrll keycode 8 = Meta_Control_underscore
+ shift altgr control alt shiftl shiftr ctrll keycode 8 = Meta_Control_underscore
+keycode 9 = eight
+ shift keycode 9 = asterisk
+ altgr keycode 9 = bracketleft
+ shift altgr keycode 9 = trademark
+ control keycode 9 = Delete
+ shift control keycode 9 = Delete
+ altgr control keycode 9 = Escape
+ shift altgr control keycode 9 = Escape
+ alt keycode 9 = Meta_eight
+ shift alt keycode 9 = Meta_asterisk
+ altgr alt keycode 9 = Meta_bracketleft
+ shift altgr alt keycode 9 = Meta_bracketleft
+ control alt keycode 9 = Meta_Delete
+ shift control alt keycode 9 = Meta_Delete
+ altgr control alt keycode 9 = Meta_Escape
+ shift altgr control alt keycode 9 = Meta_Escape
+ shift shiftl keycode 9 = asterisk
+ altgr shiftl keycode 9 = bracketleft
+ shift altgr shiftl keycode 9 = trademark
+ control shiftl keycode 9 = Delete
+ shift control shiftl keycode 9 = Delete
+ altgr control shiftl keycode 9 = Escape
+ shift altgr control shiftl keycode 9 = Escape
+ alt shiftl keycode 9 = Meta_eight
+ shift alt shiftl keycode 9 = Meta_asterisk
+ altgr alt shiftl keycode 9 = Meta_bracketleft
+ shift altgr alt shiftl keycode 9 = Meta_bracketleft
+ control alt shiftl keycode 9 = Meta_Delete
+ shift control alt shiftl keycode 9 = Meta_Delete
+ altgr control alt shiftl keycode 9 = Meta_Escape
+ shift altgr control alt shiftl keycode 9 = Meta_Escape
+ shift shiftr keycode 9 = asterisk
+ altgr shiftr keycode 9 = bracketleft
+ shift altgr shiftr keycode 9 = trademark
+ control shiftr keycode 9 = Delete
+ shift control shiftr keycode 9 = Delete
+ altgr control shiftr keycode 9 = Escape
+ shift altgr control shiftr keycode 9 = Escape
+ alt shiftr keycode 9 = Meta_eight
+ shift alt shiftr keycode 9 = Meta_asterisk
+ altgr alt shiftr keycode 9 = Meta_bracketleft
+ shift altgr alt shiftr keycode 9 = Meta_bracketleft
+ control alt shiftr keycode 9 = Meta_Delete
+ shift control alt shiftr keycode 9 = Meta_Delete
+ altgr control alt shiftr keycode 9 = Meta_Escape
+ shift altgr control alt shiftr keycode 9 = Meta_Escape
+ shift shiftl shiftr keycode 9 = asterisk
+ altgr shiftl shiftr keycode 9 = bracketleft
+ shift altgr shiftl shiftr keycode 9 = trademark
+ control shiftl shiftr keycode 9 = Delete
+ shift control shiftl shiftr keycode 9 = Delete
+ altgr control shiftl shiftr keycode 9 = Escape
+ shift altgr control shiftl shiftr keycode 9 = Escape
+ alt shiftl shiftr keycode 9 = Meta_eight
+ shift alt shiftl shiftr keycode 9 = Meta_asterisk
+ altgr alt shiftl shiftr keycode 9 = Meta_bracketleft
+ shift altgr alt shiftl shiftr keycode 9 = Meta_bracketleft
+ control alt shiftl shiftr keycode 9 = Meta_Delete
+ shift control alt shiftl shiftr keycode 9 = Meta_Delete
+ altgr control alt shiftl shiftr keycode 9 = Meta_Escape
+ shift altgr control alt shiftl shiftr keycode 9 = Meta_Escape
+ shift ctrll keycode 9 = asterisk
+ altgr ctrll keycode 9 = bracketleft
+ shift altgr ctrll keycode 9 = trademark
+ control ctrll keycode 9 = Delete
+ shift control ctrll keycode 9 = Delete
+ altgr control ctrll keycode 9 = Escape
+ shift altgr control ctrll keycode 9 = Escape
+ alt ctrll keycode 9 = Meta_eight
+ shift alt ctrll keycode 9 = Meta_asterisk
+ altgr alt ctrll keycode 9 = Meta_bracketleft
+ shift altgr alt ctrll keycode 9 = Meta_bracketleft
+ control alt ctrll keycode 9 = Meta_Delete
+ shift control alt ctrll keycode 9 = Meta_Delete
+ altgr control alt ctrll keycode 9 = Meta_Escape
+ shift altgr control alt ctrll keycode 9 = Meta_Escape
+ shift shiftl ctrll keycode 9 = asterisk
+ altgr shiftl ctrll keycode 9 = bracketleft
+ shift altgr shiftl ctrll keycode 9 = trademark
+ control shiftl ctrll keycode 9 = Delete
+ shift control shiftl ctrll keycode 9 = Delete
+ altgr control shiftl ctrll keycode 9 = Escape
+ shift altgr control shiftl ctrll keycode 9 = Escape
+ alt shiftl ctrll keycode 9 = Meta_eight
+ shift alt shiftl ctrll keycode 9 = Meta_asterisk
+ altgr alt shiftl ctrll keycode 9 = Meta_bracketleft
+ shift altgr alt shiftl ctrll keycode 9 = Meta_bracketleft
+ control alt shiftl ctrll keycode 9 = Meta_Delete
+ shift control alt shiftl ctrll keycode 9 = Meta_Delete
+ altgr control alt shiftl ctrll keycode 9 = Meta_Escape
+ shift altgr control alt shiftl ctrll keycode 9 = Meta_Escape
+ shift shiftr ctrll keycode 9 = asterisk
+ altgr shiftr ctrll keycode 9 = bracketleft
+ shift altgr shiftr ctrll keycode 9 = trademark
+ control shiftr ctrll keycode 9 = Delete
+ shift control shiftr ctrll keycode 9 = Delete
+ altgr control shiftr ctrll keycode 9 = Escape
+ shift altgr control shiftr ctrll keycode 9 = Escape
+ alt shiftr ctrll keycode 9 = Meta_eight
+ shift alt shiftr ctrll keycode 9 = Meta_asterisk
+ altgr alt shiftr ctrll keycode 9 = Meta_bracketleft
+ shift altgr alt shiftr ctrll keycode 9 = Meta_bracketleft
+ control alt shiftr ctrll keycode 9 = Meta_Delete
+ shift control alt shiftr ctrll keycode 9 = Meta_Delete
+ altgr control alt shiftr ctrll keycode 9 = Meta_Escape
+ shift altgr control alt shiftr ctrll keycode 9 = Meta_Escape
+ shift shiftl shiftr ctrll keycode 9 = asterisk
+ altgr shiftl shiftr ctrll keycode 9 = bracketleft
+ shift altgr shiftl shiftr ctrll keycode 9 = trademark
+ control shiftl shiftr ctrll keycode 9 = Delete
+ shift control shiftl shiftr ctrll keycode 9 = Delete
+ altgr control shiftl shiftr ctrll keycode 9 = Escape
+ shift altgr control shiftl shiftr ctrll keycode 9 = Escape
+ alt shiftl shiftr ctrll keycode 9 = Meta_eight
+ shift alt shiftl shiftr ctrll keycode 9 = Meta_asterisk
+ altgr alt shiftl shiftr ctrll keycode 9 = Meta_bracketleft
+ shift altgr alt shiftl shiftr ctrll keycode 9 = Meta_bracketleft
+ control alt shiftl shiftr ctrll keycode 9 = Meta_Delete
+ shift control alt shiftl shiftr ctrll keycode 9 = Meta_Delete
+ altgr control alt shiftl shiftr ctrll keycode 9 = Meta_Escape
+ shift altgr control alt shiftl shiftr ctrll keycode 9 = Meta_Escape
+keycode 10 = nine
+ shift keycode 10 = parenleft
+ altgr keycode 10 = bracketright
+ shift altgr keycode 10 = plusminus
+ control keycode 10 = Control_bracketright
+ shift control keycode 10 = Control_bracketright
+ altgr control keycode 10 = Control_bracketright
+ shift altgr control keycode 10 = Control_bracketright
+ alt keycode 10 = Meta_nine
+ shift alt keycode 10 = Meta_parenleft
+ altgr alt keycode 10 = Meta_bracketright
+ shift altgr alt keycode 10 = Meta_bracketright
+ control alt keycode 10 = Meta_Control_bracketright
+ shift control alt keycode 10 = Meta_Control_bracketright
+ altgr control alt keycode 10 = Meta_Control_bracketright
+ shift altgr control alt keycode 10 = Meta_Control_bracketright
+ shift shiftl keycode 10 = parenleft
+ altgr shiftl keycode 10 = bracketright
+ shift altgr shiftl keycode 10 = plusminus
+ control shiftl keycode 10 = Control_bracketright
+ shift control shiftl keycode 10 = Control_bracketright
+ altgr control shiftl keycode 10 = Control_bracketright
+ shift altgr control shiftl keycode 10 = Control_bracketright
+ alt shiftl keycode 10 = Meta_nine
+ shift alt shiftl keycode 10 = Meta_parenleft
+ altgr alt shiftl keycode 10 = Meta_bracketright
+ shift altgr alt shiftl keycode 10 = Meta_bracketright
+ control alt shiftl keycode 10 = Meta_Control_bracketright
+ shift control alt shiftl keycode 10 = Meta_Control_bracketright
+ altgr control alt shiftl keycode 10 = Meta_Control_bracketright
+ shift altgr control alt shiftl keycode 10 = Meta_Control_bracketright
+ shift shiftr keycode 10 = parenleft
+ altgr shiftr keycode 10 = bracketright
+ shift altgr shiftr keycode 10 = plusminus
+ control shiftr keycode 10 = Control_bracketright
+ shift control shiftr keycode 10 = Control_bracketright
+ altgr control shiftr keycode 10 = Control_bracketright
+ shift altgr control shiftr keycode 10 = Control_bracketright
+ alt shiftr keycode 10 = Meta_nine
+ shift alt shiftr keycode 10 = Meta_parenleft
+ altgr alt shiftr keycode 10 = Meta_bracketright
+ shift altgr alt shiftr keycode 10 = Meta_bracketright
+ control alt shiftr keycode 10 = Meta_Control_bracketright
+ shift control alt shiftr keycode 10 = Meta_Control_bracketright
+ altgr control alt shiftr keycode 10 = Meta_Control_bracketright
+ shift altgr control alt shiftr keycode 10 = Meta_Control_bracketright
+ shift shiftl shiftr keycode 10 = parenleft
+ altgr shiftl shiftr keycode 10 = bracketright
+ shift altgr shiftl shiftr keycode 10 = plusminus
+ control shiftl shiftr keycode 10 = Control_bracketright
+ shift control shiftl shiftr keycode 10 = Control_bracketright
+ altgr control shiftl shiftr keycode 10 = Control_bracketright
+ shift altgr control shiftl shiftr keycode 10 = Control_bracketright
+ alt shiftl shiftr keycode 10 = Meta_nine
+ shift alt shiftl shiftr keycode 10 = Meta_parenleft
+ altgr alt shiftl shiftr keycode 10 = Meta_bracketright
+ shift altgr alt shiftl shiftr keycode 10 = Meta_bracketright
+ control alt shiftl shiftr keycode 10 = Meta_Control_bracketright
+ shift control alt shiftl shiftr keycode 10 = Meta_Control_bracketright
+ altgr control alt shiftl shiftr keycode 10 = Meta_Control_bracketright
+ shift altgr control alt shiftl shiftr keycode 10 = Meta_Control_bracketright
+ shift ctrll keycode 10 = parenleft
+ altgr ctrll keycode 10 = bracketright
+ shift altgr ctrll keycode 10 = plusminus
+ control ctrll keycode 10 = Control_bracketright
+ shift control ctrll keycode 10 = Control_bracketright
+ altgr control ctrll keycode 10 = Control_bracketright
+ shift altgr control ctrll keycode 10 = Control_bracketright
+ alt ctrll keycode 10 = Meta_nine
+ shift alt ctrll keycode 10 = Meta_parenleft
+ altgr alt ctrll keycode 10 = Meta_bracketright
+ shift altgr alt ctrll keycode 10 = Meta_bracketright
+ control alt ctrll keycode 10 = Meta_Control_bracketright
+ shift control alt ctrll keycode 10 = Meta_Control_bracketright
+ altgr control alt ctrll keycode 10 = Meta_Control_bracketright
+ shift altgr control alt ctrll keycode 10 = Meta_Control_bracketright
+ shift shiftl ctrll keycode 10 = parenleft
+ altgr shiftl ctrll keycode 10 = bracketright
+ shift altgr shiftl ctrll keycode 10 = plusminus
+ control shiftl ctrll keycode 10 = Control_bracketright
+ shift control shiftl ctrll keycode 10 = Control_bracketright
+ altgr control shiftl ctrll keycode 10 = Control_bracketright
+ shift altgr control shiftl ctrll keycode 10 = Control_bracketright
+ alt shiftl ctrll keycode 10 = Meta_nine
+ shift alt shiftl ctrll keycode 10 = Meta_parenleft
+ altgr alt shiftl ctrll keycode 10 = Meta_bracketright
+ shift altgr alt shiftl ctrll keycode 10 = Meta_bracketright
+ control alt shiftl ctrll keycode 10 = Meta_Control_bracketright
+ shift control alt shiftl ctrll keycode 10 = Meta_Control_bracketright
+ altgr control alt shiftl ctrll keycode 10 = Meta_Control_bracketright
+ shift altgr control alt shiftl ctrll keycode 10 = Meta_Control_bracketright
+ shift shiftr ctrll keycode 10 = parenleft
+ altgr shiftr ctrll keycode 10 = bracketright
+ shift altgr shiftr ctrll keycode 10 = plusminus
+ control shiftr ctrll keycode 10 = Control_bracketright
+ shift control shiftr ctrll keycode 10 = Control_bracketright
+ altgr control shiftr ctrll keycode 10 = Control_bracketright
+ shift altgr control shiftr ctrll keycode 10 = Control_bracketright
+ alt shiftr ctrll keycode 10 = Meta_nine
+ shift alt shiftr ctrll keycode 10 = Meta_parenleft
+ altgr alt shiftr ctrll keycode 10 = Meta_bracketright
+ shift altgr alt shiftr ctrll keycode 10 = Meta_bracketright
+ control alt shiftr ctrll keycode 10 = Meta_Control_bracketright
+ shift control alt shiftr ctrll keycode 10 = Meta_Control_bracketright
+ altgr control alt shiftr ctrll keycode 10 = Meta_Control_bracketright
+ shift altgr control alt shiftr ctrll keycode 10 = Meta_Control_bracketright
+ shift shiftl shiftr ctrll keycode 10 = parenleft
+ altgr shiftl shiftr ctrll keycode 10 = bracketright
+ shift altgr shiftl shiftr ctrll keycode 10 = plusminus
+ control shiftl shiftr ctrll keycode 10 = Control_bracketright
+ shift control shiftl shiftr ctrll keycode 10 = Control_bracketright
+ altgr control shiftl shiftr ctrll keycode 10 = Control_bracketright
+ shift altgr control shiftl shiftr ctrll keycode 10 = Control_bracketright
+ alt shiftl shiftr ctrll keycode 10 = Meta_nine
+ shift alt shiftl shiftr ctrll keycode 10 = Meta_parenleft
+ altgr alt shiftl shiftr ctrll keycode 10 = Meta_bracketright
+ shift altgr alt shiftl shiftr ctrll keycode 10 = Meta_bracketright
+ control alt shiftl shiftr ctrll keycode 10 = Meta_Control_bracketright
+ shift control alt shiftl shiftr ctrll keycode 10 = Meta_Control_bracketright
+ altgr control alt shiftl shiftr ctrll keycode 10 = Meta_Control_bracketright
+ shift altgr control alt shiftl shiftr ctrll keycode 10 = Meta_Control_bracketright
+keycode 11 = zero parenright braceright degree
+ alt keycode 11 = Meta_zero
+ shift alt keycode 11 = Meta_parenright
+ altgr alt keycode 11 = Meta_braceright
+ shift altgr alt keycode 11 = Meta_braceright
+ shiftl keycode 11 = zero
+ shift shiftl keycode 11 = parenright
+ altgr shiftl keycode 11 = braceright
+ shift altgr shiftl keycode 11 = degree
+ alt shiftl keycode 11 = Meta_zero
+ shift alt shiftl keycode 11 = Meta_parenright
+ altgr alt shiftl keycode 11 = Meta_braceright
+ shift altgr alt shiftl keycode 11 = Meta_braceright
+ shiftr keycode 11 = zero
+ shift shiftr keycode 11 = parenright
+ altgr shiftr keycode 11 = braceright
+ shift altgr shiftr keycode 11 = degree
+ alt shiftr keycode 11 = Meta_zero
+ shift alt shiftr keycode 11 = Meta_parenright
+ altgr alt shiftr keycode 11 = Meta_braceright
+ shift altgr alt shiftr keycode 11 = Meta_braceright
+ shiftl shiftr keycode 11 = zero
+ shift shiftl shiftr keycode 11 = parenright
+ altgr shiftl shiftr keycode 11 = braceright
+ shift altgr shiftl shiftr keycode 11 = degree
+ alt shiftl shiftr keycode 11 = Meta_zero
+ shift alt shiftl shiftr keycode 11 = Meta_parenright
+ altgr alt shiftl shiftr keycode 11 = Meta_braceright
+ shift altgr alt shiftl shiftr keycode 11 = Meta_braceright
+ ctrll keycode 11 = zero
+ shift ctrll keycode 11 = parenright
+ altgr ctrll keycode 11 = braceright
+ shift altgr ctrll keycode 11 = degree
+ alt ctrll keycode 11 = Meta_zero
+ shift alt ctrll keycode 11 = Meta_parenright
+ altgr alt ctrll keycode 11 = Meta_braceright
+ shift altgr alt ctrll keycode 11 = Meta_braceright
+ shiftl ctrll keycode 11 = zero
+ shift shiftl ctrll keycode 11 = parenright
+ altgr shiftl ctrll keycode 11 = braceright
+ shift altgr shiftl ctrll keycode 11 = degree
+ alt shiftl ctrll keycode 11 = Meta_zero
+ shift alt shiftl ctrll keycode 11 = Meta_parenright
+ altgr alt shiftl ctrll keycode 11 = Meta_braceright
+ shift altgr alt shiftl ctrll keycode 11 = Meta_braceright
+ shiftr ctrll keycode 11 = zero
+ shift shiftr ctrll keycode 11 = parenright
+ altgr shiftr ctrll keycode 11 = braceright
+ shift altgr shiftr ctrll keycode 11 = degree
+ alt shiftr ctrll keycode 11 = Meta_zero
+ shift alt shiftr ctrll keycode 11 = Meta_parenright
+ altgr alt shiftr ctrll keycode 11 = Meta_braceright
+ shift altgr alt shiftr ctrll keycode 11 = Meta_braceright
+ shiftl shiftr ctrll keycode 11 = zero
+ shift shiftl shiftr ctrll keycode 11 = parenright
+ altgr shiftl shiftr ctrll keycode 11 = braceright
+ shift altgr shiftl shiftr ctrll keycode 11 = degree
+ alt shiftl shiftr ctrll keycode 11 = Meta_zero
+ shift alt shiftl shiftr ctrll keycode 11 = Meta_parenright
+ altgr alt shiftl shiftr ctrll keycode 11 = Meta_braceright
+ shift altgr alt shiftl shiftr ctrll keycode 11 = Meta_braceright
+keycode 12 = minus
+ shift keycode 12 = underscore
+ altgr keycode 12 = backslash
+ shift altgr keycode 12 = questiondown
+ control keycode 12 = Control_underscore
+ shift control keycode 12 = Control_underscore
+ altgr control keycode 12 = Control_backslash
+ shift altgr control keycode 12 = Control_backslash
+ alt keycode 12 = Meta_minus
+ shift alt keycode 12 = Meta_underscore
+ altgr alt keycode 12 = Meta_backslash
+ shift altgr alt keycode 12 = Meta_backslash
+ control alt keycode 12 = Meta_Control_underscore
+ shift control alt keycode 12 = Meta_Control_underscore
+ altgr control alt keycode 12 = Meta_Control_backslash
+ shift altgr control alt keycode 12 = Meta_Control_backslash
+ shift shiftl keycode 12 = underscore
+ altgr shiftl keycode 12 = backslash
+ shift altgr shiftl keycode 12 = questiondown
+ control shiftl keycode 12 = Control_underscore
+ shift control shiftl keycode 12 = Control_underscore
+ altgr control shiftl keycode 12 = Control_backslash
+ shift altgr control shiftl keycode 12 = Control_backslash
+ alt shiftl keycode 12 = Meta_minus
+ shift alt shiftl keycode 12 = Meta_underscore
+ altgr alt shiftl keycode 12 = Meta_backslash
+ shift altgr alt shiftl keycode 12 = Meta_backslash
+ control alt shiftl keycode 12 = Meta_Control_underscore
+ shift control alt shiftl keycode 12 = Meta_Control_underscore
+ altgr control alt shiftl keycode 12 = Meta_Control_backslash
+ shift altgr control alt shiftl keycode 12 = Meta_Control_backslash
+ shift shiftr keycode 12 = underscore
+ altgr shiftr keycode 12 = backslash
+ shift altgr shiftr keycode 12 = questiondown
+ control shiftr keycode 12 = Control_underscore
+ shift control shiftr keycode 12 = Control_underscore
+ altgr control shiftr keycode 12 = Control_backslash
+ shift altgr control shiftr keycode 12 = Control_backslash
+ alt shiftr keycode 12 = Meta_minus
+ shift alt shiftr keycode 12 = Meta_underscore
+ altgr alt shiftr keycode 12 = Meta_backslash
+ shift altgr alt shiftr keycode 12 = Meta_backslash
+ control alt shiftr keycode 12 = Meta_Control_underscore
+ shift control alt shiftr keycode 12 = Meta_Control_underscore
+ altgr control alt shiftr keycode 12 = Meta_Control_backslash
+ shift altgr control alt shiftr keycode 12 = Meta_Control_backslash
+ shift shiftl shiftr keycode 12 = underscore
+ altgr shiftl shiftr keycode 12 = backslash
+ shift altgr shiftl shiftr keycode 12 = questiondown
+ control shiftl shiftr keycode 12 = Control_underscore
+ shift control shiftl shiftr keycode 12 = Control_underscore
+ altgr control shiftl shiftr keycode 12 = Control_backslash
+ shift altgr control shiftl shiftr keycode 12 = Control_backslash
+ alt shiftl shiftr keycode 12 = Meta_minus
+ shift alt shiftl shiftr keycode 12 = Meta_underscore
+ altgr alt shiftl shiftr keycode 12 = Meta_backslash
+ shift altgr alt shiftl shiftr keycode 12 = Meta_backslash
+ control alt shiftl shiftr keycode 12 = Meta_Control_underscore
+ shift control alt shiftl shiftr keycode 12 = Meta_Control_underscore
+ altgr control alt shiftl shiftr keycode 12 = Meta_Control_backslash
+ shift altgr control alt shiftl shiftr keycode 12 = Meta_Control_backslash
+ shift ctrll keycode 12 = underscore
+ altgr ctrll keycode 12 = backslash
+ shift altgr ctrll keycode 12 = questiondown
+ control ctrll keycode 12 = Control_underscore
+ shift control ctrll keycode 12 = Control_underscore
+ altgr control ctrll keycode 12 = Control_backslash
+ shift altgr control ctrll keycode 12 = Control_backslash
+ alt ctrll keycode 12 = Meta_minus
+ shift alt ctrll keycode 12 = Meta_underscore
+ altgr alt ctrll keycode 12 = Meta_backslash
+ shift altgr alt ctrll keycode 12 = Meta_backslash
+ control alt ctrll keycode 12 = Meta_Control_underscore
+ shift control alt ctrll keycode 12 = Meta_Control_underscore
+ altgr control alt ctrll keycode 12 = Meta_Control_backslash
+ shift altgr control alt ctrll keycode 12 = Meta_Control_backslash
+ shift shiftl ctrll keycode 12 = underscore
+ altgr shiftl ctrll keycode 12 = backslash
+ shift altgr shiftl ctrll keycode 12 = questiondown
+ control shiftl ctrll keycode 12 = Control_underscore
+ shift control shiftl ctrll keycode 12 = Control_underscore
+ altgr control shiftl ctrll keycode 12 = Control_backslash
+ shift altgr control shiftl ctrll keycode 12 = Control_backslash
+ alt shiftl ctrll keycode 12 = Meta_minus
+ shift alt shiftl ctrll keycode 12 = Meta_underscore
+ altgr alt shiftl ctrll keycode 12 = Meta_backslash
+ shift altgr alt shiftl ctrll keycode 12 = Meta_backslash
+ control alt shiftl ctrll keycode 12 = Meta_Control_underscore
+ shift control alt shiftl ctrll keycode 12 = Meta_Control_underscore
+ altgr control alt shiftl ctrll keycode 12 = Meta_Control_backslash
+ shift altgr control alt shiftl ctrll keycode 12 = Meta_Control_backslash
+ shift shiftr ctrll keycode 12 = underscore
+ altgr shiftr ctrll keycode 12 = backslash
+ shift altgr shiftr ctrll keycode 12 = questiondown
+ control shiftr ctrll keycode 12 = Control_underscore
+ shift control shiftr ctrll keycode 12 = Control_underscore
+ altgr control shiftr ctrll keycode 12 = Control_backslash
+ shift altgr control shiftr ctrll keycode 12 = Control_backslash
+ alt shiftr ctrll keycode 12 = Meta_minus
+ shift alt shiftr ctrll keycode 12 = Meta_underscore
+ altgr alt shiftr ctrll keycode 12 = Meta_backslash
+ shift altgr alt shiftr ctrll keycode 12 = Meta_backslash
+ control alt shiftr ctrll keycode 12 = Meta_Control_underscore
+ shift control alt shiftr ctrll keycode 12 = Meta_Control_underscore
+ altgr control alt shiftr ctrll keycode 12 = Meta_Control_backslash
+ shift altgr control alt shiftr ctrll keycode 12 = Meta_Control_backslash
+ shift shiftl shiftr ctrll keycode 12 = underscore
+ altgr shiftl shiftr ctrll keycode 12 = backslash
+ shift altgr shiftl shiftr ctrll keycode 12 = questiondown
+ control shiftl shiftr ctrll keycode 12 = Control_underscore
+ shift control shiftl shiftr ctrll keycode 12 = Control_underscore
+ altgr control shiftl shiftr ctrll keycode 12 = Control_backslash
+ shift altgr control shiftl shiftr ctrll keycode 12 = Control_backslash
+ alt shiftl shiftr ctrll keycode 12 = Meta_minus
+ shift alt shiftl shiftr ctrll keycode 12 = Meta_underscore
+ altgr alt shiftl shiftr ctrll keycode 12 = Meta_backslash
+ shift altgr alt shiftl shiftr ctrll keycode 12 = Meta_backslash
+ control alt shiftl shiftr ctrll keycode 12 = Meta_Control_underscore
+ shift control alt shiftl shiftr ctrll keycode 12 = Meta_Control_underscore
+ altgr control alt shiftl shiftr ctrll keycode 12 = Meta_Control_backslash
+ shift altgr control alt shiftl shiftr ctrll keycode 12 = Meta_Control_backslash
+keycode 13 = equal
+ shift keycode 13 = plus
+ altgr keycode 13 = section
+ shift altgr keycode 13 = dead_cedilla
+ control keycode 13 = dead_cedilla
+ shift control keycode 13 = dead_cedilla
+ altgr control keycode 13 = dead_cedilla
+ shift altgr control keycode 13 = dead_cedilla
+ alt keycode 13 = Meta_equal
+ shift alt keycode 13 = Meta_plus
+ altgr alt keycode 13 = Meta_equal
+ shift altgr alt keycode 13 = dead_cedilla
+ control alt keycode 13 = dead_cedilla
+ shift control alt keycode 13 = dead_cedilla
+ altgr control alt keycode 13 = dead_cedilla
+ shift altgr control alt keycode 13 = dead_cedilla
+ shift shiftl keycode 13 = plus
+ altgr shiftl keycode 13 = section
+ shift altgr shiftl keycode 13 = dead_cedilla
+ control shiftl keycode 13 = dead_cedilla
+ shift control shiftl keycode 13 = dead_cedilla
+ altgr control shiftl keycode 13 = dead_cedilla
+ shift altgr control shiftl keycode 13 = dead_cedilla
+ alt shiftl keycode 13 = Meta_equal
+ shift alt shiftl keycode 13 = Meta_plus
+ altgr alt shiftl keycode 13 = Meta_equal
+ shift altgr alt shiftl keycode 13 = dead_cedilla
+ control alt shiftl keycode 13 = dead_cedilla
+ shift control alt shiftl keycode 13 = dead_cedilla
+ altgr control alt shiftl keycode 13 = dead_cedilla
+ shift altgr control alt shiftl keycode 13 = dead_cedilla
+ shift shiftr keycode 13 = plus
+ altgr shiftr keycode 13 = section
+ shift altgr shiftr keycode 13 = dead_cedilla
+ control shiftr keycode 13 = dead_cedilla
+ shift control shiftr keycode 13 = dead_cedilla
+ altgr control shiftr keycode 13 = dead_cedilla
+ shift altgr control shiftr keycode 13 = dead_cedilla
+ alt shiftr keycode 13 = Meta_equal
+ shift alt shiftr keycode 13 = Meta_plus
+ altgr alt shiftr keycode 13 = Meta_equal
+ shift altgr alt shiftr keycode 13 = dead_cedilla
+ control alt shiftr keycode 13 = dead_cedilla
+ shift control alt shiftr keycode 13 = dead_cedilla
+ altgr control alt shiftr keycode 13 = dead_cedilla
+ shift altgr control alt shiftr keycode 13 = dead_cedilla
+ shift shiftl shiftr keycode 13 = plus
+ altgr shiftl shiftr keycode 13 = section
+ shift altgr shiftl shiftr keycode 13 = dead_cedilla
+ control shiftl shiftr keycode 13 = dead_cedilla
+ shift control shiftl shiftr keycode 13 = dead_cedilla
+ altgr control shiftl shiftr keycode 13 = dead_cedilla
+ shift altgr control shiftl shiftr keycode 13 = dead_cedilla
+ alt shiftl shiftr keycode 13 = Meta_equal
+ shift alt shiftl shiftr keycode 13 = Meta_plus
+ altgr alt shiftl shiftr keycode 13 = Meta_equal
+ shift altgr alt shiftl shiftr keycode 13 = dead_cedilla
+ control alt shiftl shiftr keycode 13 = dead_cedilla
+ shift control alt shiftl shiftr keycode 13 = dead_cedilla
+ altgr control alt shiftl shiftr keycode 13 = dead_cedilla
+ shift altgr control alt shiftl shiftr keycode 13 = dead_cedilla
+ shift ctrll keycode 13 = plus
+ altgr ctrll keycode 13 = section
+ shift altgr ctrll keycode 13 = dead_cedilla
+ control ctrll keycode 13 = dead_cedilla
+ shift control ctrll keycode 13 = dead_cedilla
+ altgr control ctrll keycode 13 = dead_cedilla
+ shift altgr control ctrll keycode 13 = dead_cedilla
+ alt ctrll keycode 13 = Meta_equal
+ shift alt ctrll keycode 13 = Meta_plus
+ altgr alt ctrll keycode 13 = Meta_equal
+ shift altgr alt ctrll keycode 13 = dead_cedilla
+ control alt ctrll keycode 13 = dead_cedilla
+ shift control alt ctrll keycode 13 = dead_cedilla
+ altgr control alt ctrll keycode 13 = dead_cedilla
+ shift altgr control alt ctrll keycode 13 = dead_cedilla
+ shift shiftl ctrll keycode 13 = plus
+ altgr shiftl ctrll keycode 13 = section
+ shift altgr shiftl ctrll keycode 13 = dead_cedilla
+ control shiftl ctrll keycode 13 = dead_cedilla
+ shift control shiftl ctrll keycode 13 = dead_cedilla
+ altgr control shiftl ctrll keycode 13 = dead_cedilla
+ shift altgr control shiftl ctrll keycode 13 = dead_cedilla
+ alt shiftl ctrll keycode 13 = Meta_equal
+ shift alt shiftl ctrll keycode 13 = Meta_plus
+ altgr alt shiftl ctrll keycode 13 = Meta_equal
+ shift altgr alt shiftl ctrll keycode 13 = dead_cedilla
+ control alt shiftl ctrll keycode 13 = dead_cedilla
+ shift control alt shiftl ctrll keycode 13 = dead_cedilla
+ altgr control alt shiftl ctrll keycode 13 = dead_cedilla
+ shift altgr control alt shiftl ctrll keycode 13 = dead_cedilla
+ shift shiftr ctrll keycode 13 = plus
+ altgr shiftr ctrll keycode 13 = section
+ shift altgr shiftr ctrll keycode 13 = dead_cedilla
+ control shiftr ctrll keycode 13 = dead_cedilla
+ shift control shiftr ctrll keycode 13 = dead_cedilla
+ altgr control shiftr ctrll keycode 13 = dead_cedilla
+ shift altgr control shiftr ctrll keycode 13 = dead_cedilla
+ alt shiftr ctrll keycode 13 = Meta_equal
+ shift alt shiftr ctrll keycode 13 = Meta_plus
+ altgr alt shiftr ctrll keycode 13 = Meta_equal
+ shift altgr alt shiftr ctrll keycode 13 = dead_cedilla
+ control alt shiftr ctrll keycode 13 = dead_cedilla
+ shift control alt shiftr ctrll keycode 13 = dead_cedilla
+ altgr control alt shiftr ctrll keycode 13 = dead_cedilla
+ shift altgr control alt shiftr ctrll keycode 13 = dead_cedilla
+ shift shiftl shiftr ctrll keycode 13 = plus
+ altgr shiftl shiftr ctrll keycode 13 = section
+ shift altgr shiftl shiftr ctrll keycode 13 = dead_cedilla
+ control shiftl shiftr ctrll keycode 13 = dead_cedilla
+ shift control shiftl shiftr ctrll keycode 13 = dead_cedilla
+ altgr control shiftl shiftr ctrll keycode 13 = dead_cedilla
+ shift altgr control shiftl shiftr ctrll keycode 13 = dead_cedilla
+ alt shiftl shiftr ctrll keycode 13 = Meta_equal
+ shift alt shiftl shiftr ctrll keycode 13 = Meta_plus
+ altgr alt shiftl shiftr ctrll keycode 13 = Meta_equal
+ shift altgr alt shiftl shiftr ctrll keycode 13 = dead_cedilla
+ control alt shiftl shiftr ctrll keycode 13 = dead_cedilla
+ shift control alt shiftl shiftr ctrll keycode 13 = dead_cedilla
+ altgr control alt shiftl shiftr ctrll keycode 13 = dead_cedilla
+ shift altgr control alt shiftl shiftr ctrll keycode 13 = dead_cedilla
+keycode 14 = Delete
+ control keycode 14 = BackSpace
+ shift control keycode 14 = BackSpace
+ altgr control keycode 14 = BackSpace
+ shift altgr control keycode 14 = BackSpace
+ alt keycode 14 = Meta_Delete
+ shift alt keycode 14 = Meta_Delete
+ altgr alt keycode 14 = Meta_Delete
+ shift altgr alt keycode 14 = Meta_Delete
+ control alt keycode 14 = Meta_BackSpace
+ shift control alt keycode 14 = Meta_BackSpace
+ altgr control alt keycode 14 = Meta_BackSpace
+ shift altgr control alt keycode 14 = Meta_BackSpace
+ control shiftl keycode 14 = BackSpace
+ shift control shiftl keycode 14 = BackSpace
+ altgr control shiftl keycode 14 = BackSpace
+ shift altgr control shiftl keycode 14 = BackSpace
+ alt shiftl keycode 14 = Meta_Delete
+ shift alt shiftl keycode 14 = Meta_Delete
+ altgr alt shiftl keycode 14 = Meta_Delete
+ shift altgr alt shiftl keycode 14 = Meta_Delete
+ control alt shiftl keycode 14 = Meta_BackSpace
+ shift control alt shiftl keycode 14 = Meta_BackSpace
+ altgr control alt shiftl keycode 14 = Meta_BackSpace
+ shift altgr control alt shiftl keycode 14 = Meta_BackSpace
+ control shiftr keycode 14 = BackSpace
+ shift control shiftr keycode 14 = BackSpace
+ altgr control shiftr keycode 14 = BackSpace
+ shift altgr control shiftr keycode 14 = BackSpace
+ alt shiftr keycode 14 = Meta_Delete
+ shift alt shiftr keycode 14 = Meta_Delete
+ altgr alt shiftr keycode 14 = Meta_Delete
+ shift altgr alt shiftr keycode 14 = Meta_Delete
+ control alt shiftr keycode 14 = Meta_BackSpace
+ shift control alt shiftr keycode 14 = Meta_BackSpace
+ altgr control alt shiftr keycode 14 = Meta_BackSpace
+ shift altgr control alt shiftr keycode 14 = Meta_BackSpace
+ control shiftl shiftr keycode 14 = BackSpace
+ shift control shiftl shiftr keycode 14 = BackSpace
+ altgr control shiftl shiftr keycode 14 = BackSpace
+ shift altgr control shiftl shiftr keycode 14 = BackSpace
+ alt shiftl shiftr keycode 14 = Meta_Delete
+ shift alt shiftl shiftr keycode 14 = Meta_Delete
+ altgr alt shiftl shiftr keycode 14 = Meta_Delete
+ shift altgr alt shiftl shiftr keycode 14 = Meta_Delete
+ control alt shiftl shiftr keycode 14 = Meta_BackSpace
+ shift control alt shiftl shiftr keycode 14 = Meta_BackSpace
+ altgr control alt shiftl shiftr keycode 14 = Meta_BackSpace
+ shift altgr control alt shiftl shiftr keycode 14 = Meta_BackSpace
+ control ctrll keycode 14 = BackSpace
+ shift control ctrll keycode 14 = BackSpace
+ altgr control ctrll keycode 14 = BackSpace
+ shift altgr control ctrll keycode 14 = BackSpace
+ alt ctrll keycode 14 = Meta_Delete
+ shift alt ctrll keycode 14 = Meta_Delete
+ altgr alt ctrll keycode 14 = Meta_Delete
+ shift altgr alt ctrll keycode 14 = Meta_Delete
+ control alt ctrll keycode 14 = Meta_BackSpace
+ shift control alt ctrll keycode 14 = Meta_BackSpace
+ altgr control alt ctrll keycode 14 = Meta_BackSpace
+ shift altgr control alt ctrll keycode 14 = Meta_BackSpace
+ control shiftl ctrll keycode 14 = BackSpace
+ shift control shiftl ctrll keycode 14 = BackSpace
+ altgr control shiftl ctrll keycode 14 = BackSpace
+ shift altgr control shiftl ctrll keycode 14 = BackSpace
+ alt shiftl ctrll keycode 14 = Meta_Delete
+ shift alt shiftl ctrll keycode 14 = Meta_Delete
+ altgr alt shiftl ctrll keycode 14 = Meta_Delete
+ shift altgr alt shiftl ctrll keycode 14 = Meta_Delete
+ control alt shiftl ctrll keycode 14 = Meta_BackSpace
+ shift control alt shiftl ctrll keycode 14 = Meta_BackSpace
+ altgr control alt shiftl ctrll keycode 14 = Meta_BackSpace
+ shift altgr control alt shiftl ctrll keycode 14 = Meta_BackSpace
+ control shiftr ctrll keycode 14 = BackSpace
+ shift control shiftr ctrll keycode 14 = BackSpace
+ altgr control shiftr ctrll keycode 14 = BackSpace
+ shift altgr control shiftr ctrll keycode 14 = BackSpace
+ alt shiftr ctrll keycode 14 = Meta_Delete
+ shift alt shiftr ctrll keycode 14 = Meta_Delete
+ altgr alt shiftr ctrll keycode 14 = Meta_Delete
+ shift altgr alt shiftr ctrll keycode 14 = Meta_Delete
+ control alt shiftr ctrll keycode 14 = Meta_BackSpace
+ shift control alt shiftr ctrll keycode 14 = Meta_BackSpace
+ altgr control alt shiftr ctrll keycode 14 = Meta_BackSpace
+ shift altgr control alt shiftr ctrll keycode 14 = Meta_BackSpace
+ control shiftl shiftr ctrll keycode 14 = BackSpace
+ shift control shiftl shiftr ctrll keycode 14 = BackSpace
+ altgr control shiftl shiftr ctrll keycode 14 = BackSpace
+ shift altgr control shiftl shiftr ctrll keycode 14 = BackSpace
+ alt shiftl shiftr ctrll keycode 14 = Meta_Delete
+ shift alt shiftl shiftr ctrll keycode 14 = Meta_Delete
+ altgr alt shiftl shiftr ctrll keycode 14 = Meta_Delete
+ shift altgr alt shiftl shiftr ctrll keycode 14 = Meta_Delete
+ control alt shiftl shiftr ctrll keycode 14 = Meta_BackSpace
+ shift control alt shiftl shiftr ctrll keycode 14 = Meta_BackSpace
+ altgr control alt shiftl shiftr ctrll keycode 14 = Meta_BackSpace
+ shift altgr control alt shiftl shiftr ctrll keycode 14 = Meta_BackSpace
+keycode 15 = Tab
+ alt keycode 15 = Meta_Tab
+ shift alt keycode 15 = Meta_Tab
+ altgr alt keycode 15 = Meta_Tab
+ shift altgr alt keycode 15 = Meta_Tab
+ control alt keycode 15 = Meta_Tab
+ shift control alt keycode 15 = Meta_Tab
+ altgr control alt keycode 15 = Meta_Tab
+ shift altgr control alt keycode 15 = Meta_Tab
+ alt shiftl keycode 15 = Meta_Tab
+ shift alt shiftl keycode 15 = Meta_Tab
+ altgr alt shiftl keycode 15 = Meta_Tab
+ shift altgr alt shiftl keycode 15 = Meta_Tab
+ control alt shiftl keycode 15 = Meta_Tab
+ shift control alt shiftl keycode 15 = Meta_Tab
+ altgr control alt shiftl keycode 15 = Meta_Tab
+ shift altgr control alt shiftl keycode 15 = Meta_Tab
+ alt shiftr keycode 15 = Meta_Tab
+ shift alt shiftr keycode 15 = Meta_Tab
+ altgr alt shiftr keycode 15 = Meta_Tab
+ shift altgr alt shiftr keycode 15 = Meta_Tab
+ control alt shiftr keycode 15 = Meta_Tab
+ shift control alt shiftr keycode 15 = Meta_Tab
+ altgr control alt shiftr keycode 15 = Meta_Tab
+ shift altgr control alt shiftr keycode 15 = Meta_Tab
+ alt shiftl shiftr keycode 15 = Meta_Tab
+ shift alt shiftl shiftr keycode 15 = Meta_Tab
+ altgr alt shiftl shiftr keycode 15 = Meta_Tab
+ shift altgr alt shiftl shiftr keycode 15 = Meta_Tab
+ control alt shiftl shiftr keycode 15 = Meta_Tab
+ shift control alt shiftl shiftr keycode 15 = Meta_Tab
+ altgr control alt shiftl shiftr keycode 15 = Meta_Tab
+ shift altgr control alt shiftl shiftr keycode 15 = Meta_Tab
+ alt ctrll keycode 15 = Meta_Tab
+ shift alt ctrll keycode 15 = Meta_Tab
+ altgr alt ctrll keycode 15 = Meta_Tab
+ shift altgr alt ctrll keycode 15 = Meta_Tab
+ control alt ctrll keycode 15 = Meta_Tab
+ shift control alt ctrll keycode 15 = Meta_Tab
+ altgr control alt ctrll keycode 15 = Meta_Tab
+ shift altgr control alt ctrll keycode 15 = Meta_Tab
+ alt shiftl ctrll keycode 15 = Meta_Tab
+ shift alt shiftl ctrll keycode 15 = Meta_Tab
+ altgr alt shiftl ctrll keycode 15 = Meta_Tab
+ shift altgr alt shiftl ctrll keycode 15 = Meta_Tab
+ control alt shiftl ctrll keycode 15 = Meta_Tab
+ shift control alt shiftl ctrll keycode 15 = Meta_Tab
+ altgr control alt shiftl ctrll keycode 15 = Meta_Tab
+ shift altgr control alt shiftl ctrll keycode 15 = Meta_Tab
+ alt shiftr ctrll keycode 15 = Meta_Tab
+ shift alt shiftr ctrll keycode 15 = Meta_Tab
+ altgr alt shiftr ctrll keycode 15 = Meta_Tab
+ shift altgr alt shiftr ctrll keycode 15 = Meta_Tab
+ control alt shiftr ctrll keycode 15 = Meta_Tab
+ shift control alt shiftr ctrll keycode 15 = Meta_Tab
+ altgr control alt shiftr ctrll keycode 15 = Meta_Tab
+ shift altgr control alt shiftr ctrll keycode 15 = Meta_Tab
+ alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ shift alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ altgr alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ shift altgr alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ control alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ shift control alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ altgr control alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+ shift altgr control alt shiftl shiftr ctrll keycode 15 = Meta_Tab
+keycode 16 = +q
+ shift keycode 16 = +Q
+ altgr keycode 16 = slash
+ shift altgr keycode 16 = slash
+ control keycode 16 = Control_q
+ shift control keycode 16 = Control_q
+ altgr control keycode 16 = Control_q
+ shift altgr control keycode 16 = Control_q
+ alt keycode 16 = Meta_q
+ shift alt keycode 16 = Meta_Q
+ altgr alt keycode 16 = Meta_slash
+ shift altgr alt keycode 16 = Meta_slash
+ control alt keycode 16 = Meta_Control_q
+ shift control alt keycode 16 = Meta_Control_q
+ altgr control alt keycode 16 = Meta_Control_q
+ shift altgr control alt keycode 16 = Meta_Control_q
+ shift shiftl keycode 16 = +Q
+ altgr shiftl keycode 16 = slash
+ shift altgr shiftl keycode 16 = slash
+ control shiftl keycode 16 = Control_q
+ shift control shiftl keycode 16 = Control_q
+ altgr control shiftl keycode 16 = Control_q
+ shift altgr control shiftl keycode 16 = Control_q
+ alt shiftl keycode 16 = Meta_q
+ shift alt shiftl keycode 16 = Meta_Q
+ altgr alt shiftl keycode 16 = Meta_slash
+ shift altgr alt shiftl keycode 16 = Meta_slash
+ control alt shiftl keycode 16 = Meta_Control_q
+ shift control alt shiftl keycode 16 = Meta_Control_q
+ altgr control alt shiftl keycode 16 = Meta_Control_q
+ shift altgr control alt shiftl keycode 16 = Meta_Control_q
+ shift shiftr keycode 16 = +Q
+ altgr shiftr keycode 16 = slash
+ shift altgr shiftr keycode 16 = slash
+ control shiftr keycode 16 = Control_q
+ shift control shiftr keycode 16 = Control_q
+ altgr control shiftr keycode 16 = Control_q
+ shift altgr control shiftr keycode 16 = Control_q
+ alt shiftr keycode 16 = Meta_q
+ shift alt shiftr keycode 16 = Meta_Q
+ altgr alt shiftr keycode 16 = Meta_slash
+ shift altgr alt shiftr keycode 16 = Meta_slash
+ control alt shiftr keycode 16 = Meta_Control_q
+ shift control alt shiftr keycode 16 = Meta_Control_q
+ altgr control alt shiftr keycode 16 = Meta_Control_q
+ shift altgr control alt shiftr keycode 16 = Meta_Control_q
+ shift shiftl shiftr keycode 16 = +Q
+ altgr shiftl shiftr keycode 16 = slash
+ shift altgr shiftl shiftr keycode 16 = slash
+ control shiftl shiftr keycode 16 = Control_q
+ shift control shiftl shiftr keycode 16 = Control_q
+ altgr control shiftl shiftr keycode 16 = Control_q
+ shift altgr control shiftl shiftr keycode 16 = Control_q
+ alt shiftl shiftr keycode 16 = Meta_q
+ shift alt shiftl shiftr keycode 16 = Meta_Q
+ altgr alt shiftl shiftr keycode 16 = Meta_slash
+ shift altgr alt shiftl shiftr keycode 16 = Meta_slash
+ control alt shiftl shiftr keycode 16 = Meta_Control_q
+ shift control alt shiftl shiftr keycode 16 = Meta_Control_q
+ altgr control alt shiftl shiftr keycode 16 = Meta_Control_q
+ shift altgr control alt shiftl shiftr keycode 16 = Meta_Control_q
+ ctrll keycode 16 = +Q
+ altgr ctrll keycode 16 = slash
+ shift altgr ctrll keycode 16 = slash
+ control ctrll keycode 16 = Control_q
+ shift control ctrll keycode 16 = Control_q
+ altgr control ctrll keycode 16 = Control_q
+ shift altgr control ctrll keycode 16 = Control_q
+ alt ctrll keycode 16 = Meta_q
+ shift alt ctrll keycode 16 = Meta_Q
+ altgr alt ctrll keycode 16 = Meta_slash
+ shift altgr alt ctrll keycode 16 = Meta_slash
+ control alt ctrll keycode 16 = Meta_Control_q
+ shift control alt ctrll keycode 16 = Meta_Control_q
+ altgr control alt ctrll keycode 16 = Meta_Control_q
+ shift altgr control alt ctrll keycode 16 = Meta_Control_q
+ shiftl ctrll keycode 16 = +Q
+ altgr shiftl ctrll keycode 16 = slash
+ shift altgr shiftl ctrll keycode 16 = slash
+ control shiftl ctrll keycode 16 = Control_q
+ shift control shiftl ctrll keycode 16 = Control_q
+ altgr control shiftl ctrll keycode 16 = Control_q
+ shift altgr control shiftl ctrll keycode 16 = Control_q
+ alt shiftl ctrll keycode 16 = Meta_q
+ shift alt shiftl ctrll keycode 16 = Meta_Q
+ altgr alt shiftl ctrll keycode 16 = Meta_slash
+ shift altgr alt shiftl ctrll keycode 16 = Meta_slash
+ control alt shiftl ctrll keycode 16 = Meta_Control_q
+ shift control alt shiftl ctrll keycode 16 = Meta_Control_q
+ altgr control alt shiftl ctrll keycode 16 = Meta_Control_q
+ shift altgr control alt shiftl ctrll keycode 16 = Meta_Control_q
+ shiftr ctrll keycode 16 = +Q
+ altgr shiftr ctrll keycode 16 = slash
+ shift altgr shiftr ctrll keycode 16 = slash
+ control shiftr ctrll keycode 16 = Control_q
+ shift control shiftr ctrll keycode 16 = Control_q
+ altgr control shiftr ctrll keycode 16 = Control_q
+ shift altgr control shiftr ctrll keycode 16 = Control_q
+ alt shiftr ctrll keycode 16 = Meta_q
+ shift alt shiftr ctrll keycode 16 = Meta_Q
+ altgr alt shiftr ctrll keycode 16 = Meta_slash
+ shift altgr alt shiftr ctrll keycode 16 = Meta_slash
+ control alt shiftr ctrll keycode 16 = Meta_Control_q
+ shift control alt shiftr ctrll keycode 16 = Meta_Control_q
+ altgr control alt shiftr ctrll keycode 16 = Meta_Control_q
+ shift altgr control alt shiftr ctrll keycode 16 = Meta_Control_q
+ shiftl shiftr ctrll keycode 16 = +Q
+ altgr shiftl shiftr ctrll keycode 16 = slash
+ shift altgr shiftl shiftr ctrll keycode 16 = slash
+ control shiftl shiftr ctrll keycode 16 = Control_q
+ shift control shiftl shiftr ctrll keycode 16 = Control_q
+ altgr control shiftl shiftr ctrll keycode 16 = Control_q
+ shift altgr control shiftl shiftr ctrll keycode 16 = Control_q
+ alt shiftl shiftr ctrll keycode 16 = Meta_q
+ shift alt shiftl shiftr ctrll keycode 16 = Meta_Q
+ altgr alt shiftl shiftr ctrll keycode 16 = Meta_slash
+ shift altgr alt shiftl shiftr ctrll keycode 16 = Meta_slash
+ control alt shiftl shiftr ctrll keycode 16 = Meta_Control_q
+ shift control alt shiftl shiftr ctrll keycode 16 = Meta_Control_q
+ altgr control alt shiftl shiftr ctrll keycode 16 = Meta_Control_q
+ shift altgr control alt shiftl shiftr ctrll keycode 16 = Meta_Control_q
+keycode 17 = +w
+ shift keycode 17 = +W
+ altgr keycode 17 = question
+ shift altgr keycode 17 = question
+ control keycode 17 = Control_w
+ shift control keycode 17 = Control_w
+ altgr control keycode 17 = Delete
+ shift altgr control keycode 17 = Delete
+ alt keycode 17 = Meta_w
+ shift alt keycode 17 = Meta_W
+ altgr alt keycode 17 = Meta_question
+ shift altgr alt keycode 17 = Meta_question
+ control alt keycode 17 = Meta_Control_w
+ shift control alt keycode 17 = Meta_Control_w
+ altgr control alt keycode 17 = Meta_Delete
+ shift altgr control alt keycode 17 = Meta_Delete
+ shift shiftl keycode 17 = +W
+ altgr shiftl keycode 17 = question
+ shift altgr shiftl keycode 17 = question
+ control shiftl keycode 17 = Control_w
+ shift control shiftl keycode 17 = Control_w
+ altgr control shiftl keycode 17 = Delete
+ shift altgr control shiftl keycode 17 = Delete
+ alt shiftl keycode 17 = Meta_w
+ shift alt shiftl keycode 17 = Meta_W
+ altgr alt shiftl keycode 17 = Meta_question
+ shift altgr alt shiftl keycode 17 = Meta_question
+ control alt shiftl keycode 17 = Meta_Control_w
+ shift control alt shiftl keycode 17 = Meta_Control_w
+ altgr control alt shiftl keycode 17 = Meta_Delete
+ shift altgr control alt shiftl keycode 17 = Meta_Delete
+ shift shiftr keycode 17 = +W
+ altgr shiftr keycode 17 = question
+ shift altgr shiftr keycode 17 = question
+ control shiftr keycode 17 = Control_w
+ shift control shiftr keycode 17 = Control_w
+ altgr control shiftr keycode 17 = Delete
+ shift altgr control shiftr keycode 17 = Delete
+ alt shiftr keycode 17 = Meta_w
+ shift alt shiftr keycode 17 = Meta_W
+ altgr alt shiftr keycode 17 = Meta_question
+ shift altgr alt shiftr keycode 17 = Meta_question
+ control alt shiftr keycode 17 = Meta_Control_w
+ shift control alt shiftr keycode 17 = Meta_Control_w
+ altgr control alt shiftr keycode 17 = Meta_Delete
+ shift altgr control alt shiftr keycode 17 = Meta_Delete
+ shift shiftl shiftr keycode 17 = +W
+ altgr shiftl shiftr keycode 17 = question
+ shift altgr shiftl shiftr keycode 17 = question
+ control shiftl shiftr keycode 17 = Control_w
+ shift control shiftl shiftr keycode 17 = Control_w
+ altgr control shiftl shiftr keycode 17 = Delete
+ shift altgr control shiftl shiftr keycode 17 = Delete
+ alt shiftl shiftr keycode 17 = Meta_w
+ shift alt shiftl shiftr keycode 17 = Meta_W
+ altgr alt shiftl shiftr keycode 17 = Meta_question
+ shift altgr alt shiftl shiftr keycode 17 = Meta_question
+ control alt shiftl shiftr keycode 17 = Meta_Control_w
+ shift control alt shiftl shiftr keycode 17 = Meta_Control_w
+ altgr control alt shiftl shiftr keycode 17 = Meta_Delete
+ shift altgr control alt shiftl shiftr keycode 17 = Meta_Delete
+ ctrll keycode 17 = +W
+ altgr ctrll keycode 17 = question
+ shift altgr ctrll keycode 17 = question
+ control ctrll keycode 17 = Control_w
+ shift control ctrll keycode 17 = Control_w
+ altgr control ctrll keycode 17 = Delete
+ shift altgr control ctrll keycode 17 = Delete
+ alt ctrll keycode 17 = Meta_w
+ shift alt ctrll keycode 17 = Meta_W
+ altgr alt ctrll keycode 17 = Meta_question
+ shift altgr alt ctrll keycode 17 = Meta_question
+ control alt ctrll keycode 17 = Meta_Control_w
+ shift control alt ctrll keycode 17 = Meta_Control_w
+ altgr control alt ctrll keycode 17 = Meta_Delete
+ shift altgr control alt ctrll keycode 17 = Meta_Delete
+ shiftl ctrll keycode 17 = +W
+ altgr shiftl ctrll keycode 17 = question
+ shift altgr shiftl ctrll keycode 17 = question
+ control shiftl ctrll keycode 17 = Control_w
+ shift control shiftl ctrll keycode 17 = Control_w
+ altgr control shiftl ctrll keycode 17 = Delete
+ shift altgr control shiftl ctrll keycode 17 = Delete
+ alt shiftl ctrll keycode 17 = Meta_w
+ shift alt shiftl ctrll keycode 17 = Meta_W
+ altgr alt shiftl ctrll keycode 17 = Meta_question
+ shift altgr alt shiftl ctrll keycode 17 = Meta_question
+ control alt shiftl ctrll keycode 17 = Meta_Control_w
+ shift control alt shiftl ctrll keycode 17 = Meta_Control_w
+ altgr control alt shiftl ctrll keycode 17 = Meta_Delete
+ shift altgr control alt shiftl ctrll keycode 17 = Meta_Delete
+ shiftr ctrll keycode 17 = +W
+ altgr shiftr ctrll keycode 17 = question
+ shift altgr shiftr ctrll keycode 17 = question
+ control shiftr ctrll keycode 17 = Control_w
+ shift control shiftr ctrll keycode 17 = Control_w
+ altgr control shiftr ctrll keycode 17 = Delete
+ shift altgr control shiftr ctrll keycode 17 = Delete
+ alt shiftr ctrll keycode 17 = Meta_w
+ shift alt shiftr ctrll keycode 17 = Meta_W
+ altgr alt shiftr ctrll keycode 17 = Meta_question
+ shift altgr alt shiftr ctrll keycode 17 = Meta_question
+ control alt shiftr ctrll keycode 17 = Meta_Control_w
+ shift control alt shiftr ctrll keycode 17 = Meta_Control_w
+ altgr control alt shiftr ctrll keycode 17 = Meta_Delete
+ shift altgr control alt shiftr ctrll keycode 17 = Meta_Delete
+ shiftl shiftr ctrll keycode 17 = +W
+ altgr shiftl shiftr ctrll keycode 17 = question
+ shift altgr shiftl shiftr ctrll keycode 17 = question
+ control shiftl shiftr ctrll keycode 17 = Control_w
+ shift control shiftl shiftr ctrll keycode 17 = Control_w
+ altgr control shiftl shiftr ctrll keycode 17 = Delete
+ shift altgr control shiftl shiftr ctrll keycode 17 = Delete
+ alt shiftl shiftr ctrll keycode 17 = Meta_w
+ shift alt shiftl shiftr ctrll keycode 17 = Meta_W
+ altgr alt shiftl shiftr ctrll keycode 17 = Meta_question
+ shift altgr alt shiftl shiftr ctrll keycode 17 = Meta_question
+ control alt shiftl shiftr ctrll keycode 17 = Meta_Control_w
+ shift control alt shiftl shiftr ctrll keycode 17 = Meta_Control_w
+ altgr control alt shiftl shiftr ctrll keycode 17 = Meta_Delete
+ shift altgr control alt shiftl shiftr ctrll keycode 17 = Meta_Delete
+keycode 18 = +e
+ shift keycode 18 = +E
+ altgr keycode 18 = euro
+ shift altgr keycode 18 = euro
+ control keycode 18 = Control_e
+ shift control keycode 18 = Control_e
+ altgr control keycode 18 = Control_e
+ shift altgr control keycode 18 = Control_e
+ alt keycode 18 = Meta_e
+ shift alt keycode 18 = Meta_E
+ altgr alt keycode 18 = Meta_e
+ shift altgr alt keycode 18 = Meta_E
+ control alt keycode 18 = Meta_Control_e
+ shift control alt keycode 18 = Meta_Control_e
+ altgr control alt keycode 18 = Meta_Control_e
+ shift altgr control alt keycode 18 = Meta_Control_e
+ shift shiftl keycode 18 = +E
+ altgr shiftl keycode 18 = euro
+ shift altgr shiftl keycode 18 = euro
+ control shiftl keycode 18 = Control_e
+ shift control shiftl keycode 18 = Control_e
+ altgr control shiftl keycode 18 = Control_e
+ shift altgr control shiftl keycode 18 = Control_e
+ alt shiftl keycode 18 = Meta_e
+ shift alt shiftl keycode 18 = Meta_E
+ altgr alt shiftl keycode 18 = Meta_e
+ shift altgr alt shiftl keycode 18 = Meta_E
+ control alt shiftl keycode 18 = Meta_Control_e
+ shift control alt shiftl keycode 18 = Meta_Control_e
+ altgr control alt shiftl keycode 18 = Meta_Control_e
+ shift altgr control alt shiftl keycode 18 = Meta_Control_e
+ shift shiftr keycode 18 = +E
+ altgr shiftr keycode 18 = euro
+ shift altgr shiftr keycode 18 = euro
+ control shiftr keycode 18 = Control_e
+ shift control shiftr keycode 18 = Control_e
+ altgr control shiftr keycode 18 = Control_e
+ shift altgr control shiftr keycode 18 = Control_e
+ alt shiftr keycode 18 = Meta_e
+ shift alt shiftr keycode 18 = Meta_E
+ altgr alt shiftr keycode 18 = Meta_e
+ shift altgr alt shiftr keycode 18 = Meta_E
+ control alt shiftr keycode 18 = Meta_Control_e
+ shift control alt shiftr keycode 18 = Meta_Control_e
+ altgr control alt shiftr keycode 18 = Meta_Control_e
+ shift altgr control alt shiftr keycode 18 = Meta_Control_e
+ shift shiftl shiftr keycode 18 = +E
+ altgr shiftl shiftr keycode 18 = euro
+ shift altgr shiftl shiftr keycode 18 = euro
+ control shiftl shiftr keycode 18 = Control_e
+ shift control shiftl shiftr keycode 18 = Control_e
+ altgr control shiftl shiftr keycode 18 = Control_e
+ shift altgr control shiftl shiftr keycode 18 = Control_e
+ alt shiftl shiftr keycode 18 = Meta_e
+ shift alt shiftl shiftr keycode 18 = Meta_E
+ altgr alt shiftl shiftr keycode 18 = Meta_e
+ shift altgr alt shiftl shiftr keycode 18 = Meta_E
+ control alt shiftl shiftr keycode 18 = Meta_Control_e
+ shift control alt shiftl shiftr keycode 18 = Meta_Control_e
+ altgr control alt shiftl shiftr keycode 18 = Meta_Control_e
+ shift altgr control alt shiftl shiftr keycode 18 = Meta_Control_e
+ ctrll keycode 18 = +E
+ altgr ctrll keycode 18 = euro
+ shift altgr ctrll keycode 18 = euro
+ control ctrll keycode 18 = Control_e
+ shift control ctrll keycode 18 = Control_e
+ altgr control ctrll keycode 18 = Control_e
+ shift altgr control ctrll keycode 18 = Control_e
+ alt ctrll keycode 18 = Meta_e
+ shift alt ctrll keycode 18 = Meta_E
+ altgr alt ctrll keycode 18 = Meta_e
+ shift altgr alt ctrll keycode 18 = Meta_E
+ control alt ctrll keycode 18 = Meta_Control_e
+ shift control alt ctrll keycode 18 = Meta_Control_e
+ altgr control alt ctrll keycode 18 = Meta_Control_e
+ shift altgr control alt ctrll keycode 18 = Meta_Control_e
+ shiftl ctrll keycode 18 = +E
+ altgr shiftl ctrll keycode 18 = euro
+ shift altgr shiftl ctrll keycode 18 = euro
+ control shiftl ctrll keycode 18 = Control_e
+ shift control shiftl ctrll keycode 18 = Control_e
+ altgr control shiftl ctrll keycode 18 = Control_e
+ shift altgr control shiftl ctrll keycode 18 = Control_e
+ alt shiftl ctrll keycode 18 = Meta_e
+ shift alt shiftl ctrll keycode 18 = Meta_E
+ altgr alt shiftl ctrll keycode 18 = Meta_e
+ shift altgr alt shiftl ctrll keycode 18 = Meta_E
+ control alt shiftl ctrll keycode 18 = Meta_Control_e
+ shift control alt shiftl ctrll keycode 18 = Meta_Control_e
+ altgr control alt shiftl ctrll keycode 18 = Meta_Control_e
+ shift altgr control alt shiftl ctrll keycode 18 = Meta_Control_e
+ shiftr ctrll keycode 18 = +E
+ altgr shiftr ctrll keycode 18 = euro
+ shift altgr shiftr ctrll keycode 18 = euro
+ control shiftr ctrll keycode 18 = Control_e
+ shift control shiftr ctrll keycode 18 = Control_e
+ altgr control shiftr ctrll keycode 18 = Control_e
+ shift altgr control shiftr ctrll keycode 18 = Control_e
+ alt shiftr ctrll keycode 18 = Meta_e
+ shift alt shiftr ctrll keycode 18 = Meta_E
+ altgr alt shiftr ctrll keycode 18 = Meta_e
+ shift altgr alt shiftr ctrll keycode 18 = Meta_E
+ control alt shiftr ctrll keycode 18 = Meta_Control_e
+ shift control alt shiftr ctrll keycode 18 = Meta_Control_e
+ altgr control alt shiftr ctrll keycode 18 = Meta_Control_e
+ shift altgr control alt shiftr ctrll keycode 18 = Meta_Control_e
+ shiftl shiftr ctrll keycode 18 = +E
+ altgr shiftl shiftr ctrll keycode 18 = euro
+ shift altgr shiftl shiftr ctrll keycode 18 = euro
+ control shiftl shiftr ctrll keycode 18 = Control_e
+ shift control shiftl shiftr ctrll keycode 18 = Control_e
+ altgr control shiftl shiftr ctrll keycode 18 = Control_e
+ shift altgr control shiftl shiftr ctrll keycode 18 = Control_e
+ alt shiftl shiftr ctrll keycode 18 = Meta_e
+ shift alt shiftl shiftr ctrll keycode 18 = Meta_E
+ altgr alt shiftl shiftr ctrll keycode 18 = Meta_e
+ shift altgr alt shiftl shiftr ctrll keycode 18 = Meta_E
+ control alt shiftl shiftr ctrll keycode 18 = Meta_Control_e
+ shift control alt shiftl shiftr ctrll keycode 18 = Meta_Control_e
+ altgr control alt shiftl shiftr ctrll keycode 18 = Meta_Control_e
+ shift altgr control alt shiftl shiftr ctrll keycode 18 = Meta_Control_e
+keycode 19 = +r
+ shift keycode 19 = +R
+ altgr keycode 19 = registered
+ shift altgr keycode 19 = registered
+ control keycode 19 = Control_r
+ shift control keycode 19 = Control_r
+ altgr control keycode 19 = Control_r
+ shift altgr control keycode 19 = Control_r
+ alt keycode 19 = Meta_r
+ shift alt keycode 19 = Meta_R
+ altgr alt keycode 19 = Meta_r
+ shift altgr alt keycode 19 = Meta_R
+ control alt keycode 19 = Meta_Control_r
+ shift control alt keycode 19 = Meta_Control_r
+ altgr control alt keycode 19 = Meta_Control_r
+ shift altgr control alt keycode 19 = Meta_Control_r
+ shift shiftl keycode 19 = +R
+ altgr shiftl keycode 19 = registered
+ shift altgr shiftl keycode 19 = registered
+ control shiftl keycode 19 = Control_r
+ shift control shiftl keycode 19 = Control_r
+ altgr control shiftl keycode 19 = Control_r
+ shift altgr control shiftl keycode 19 = Control_r
+ alt shiftl keycode 19 = Meta_r
+ shift alt shiftl keycode 19 = Meta_R
+ altgr alt shiftl keycode 19 = Meta_r
+ shift altgr alt shiftl keycode 19 = Meta_R
+ control alt shiftl keycode 19 = Meta_Control_r
+ shift control alt shiftl keycode 19 = Meta_Control_r
+ altgr control alt shiftl keycode 19 = Meta_Control_r
+ shift altgr control alt shiftl keycode 19 = Meta_Control_r
+ shift shiftr keycode 19 = +R
+ altgr shiftr keycode 19 = registered
+ shift altgr shiftr keycode 19 = registered
+ control shiftr keycode 19 = Control_r
+ shift control shiftr keycode 19 = Control_r
+ altgr control shiftr keycode 19 = Control_r
+ shift altgr control shiftr keycode 19 = Control_r
+ alt shiftr keycode 19 = Meta_r
+ shift alt shiftr keycode 19 = Meta_R
+ altgr alt shiftr keycode 19 = Meta_r
+ shift altgr alt shiftr keycode 19 = Meta_R
+ control alt shiftr keycode 19 = Meta_Control_r
+ shift control alt shiftr keycode 19 = Meta_Control_r
+ altgr control alt shiftr keycode 19 = Meta_Control_r
+ shift altgr control alt shiftr keycode 19 = Meta_Control_r
+ shift shiftl shiftr keycode 19 = +R
+ altgr shiftl shiftr keycode 19 = registered
+ shift altgr shiftl shiftr keycode 19 = registered
+ control shiftl shiftr keycode 19 = Control_r
+ shift control shiftl shiftr keycode 19 = Control_r
+ altgr control shiftl shiftr keycode 19 = Control_r
+ shift altgr control shiftl shiftr keycode 19 = Control_r
+ alt shiftl shiftr keycode 19 = Meta_r
+ shift alt shiftl shiftr keycode 19 = Meta_R
+ altgr alt shiftl shiftr keycode 19 = Meta_r
+ shift altgr alt shiftl shiftr keycode 19 = Meta_R
+ control alt shiftl shiftr keycode 19 = Meta_Control_r
+ shift control alt shiftl shiftr keycode 19 = Meta_Control_r
+ altgr control alt shiftl shiftr keycode 19 = Meta_Control_r
+ shift altgr control alt shiftl shiftr keycode 19 = Meta_Control_r
+ ctrll keycode 19 = +R
+ altgr ctrll keycode 19 = registered
+ shift altgr ctrll keycode 19 = registered
+ control ctrll keycode 19 = Control_r
+ shift control ctrll keycode 19 = Control_r
+ altgr control ctrll keycode 19 = Control_r
+ shift altgr control ctrll keycode 19 = Control_r
+ alt ctrll keycode 19 = Meta_r
+ shift alt ctrll keycode 19 = Meta_R
+ altgr alt ctrll keycode 19 = Meta_r
+ shift altgr alt ctrll keycode 19 = Meta_R
+ control alt ctrll keycode 19 = Meta_Control_r
+ shift control alt ctrll keycode 19 = Meta_Control_r
+ altgr control alt ctrll keycode 19 = Meta_Control_r
+ shift altgr control alt ctrll keycode 19 = Meta_Control_r
+ shiftl ctrll keycode 19 = +R
+ altgr shiftl ctrll keycode 19 = registered
+ shift altgr shiftl ctrll keycode 19 = registered
+ control shiftl ctrll keycode 19 = Control_r
+ shift control shiftl ctrll keycode 19 = Control_r
+ altgr control shiftl ctrll keycode 19 = Control_r
+ shift altgr control shiftl ctrll keycode 19 = Control_r
+ alt shiftl ctrll keycode 19 = Meta_r
+ shift alt shiftl ctrll keycode 19 = Meta_R
+ altgr alt shiftl ctrll keycode 19 = Meta_r
+ shift altgr alt shiftl ctrll keycode 19 = Meta_R
+ control alt shiftl ctrll keycode 19 = Meta_Control_r
+ shift control alt shiftl ctrll keycode 19 = Meta_Control_r
+ altgr control alt shiftl ctrll keycode 19 = Meta_Control_r
+ shift altgr control alt shiftl ctrll keycode 19 = Meta_Control_r
+ shiftr ctrll keycode 19 = +R
+ altgr shiftr ctrll keycode 19 = registered
+ shift altgr shiftr ctrll keycode 19 = registered
+ control shiftr ctrll keycode 19 = Control_r
+ shift control shiftr ctrll keycode 19 = Control_r
+ altgr control shiftr ctrll keycode 19 = Control_r
+ shift altgr control shiftr ctrll keycode 19 = Control_r
+ alt shiftr ctrll keycode 19 = Meta_r
+ shift alt shiftr ctrll keycode 19 = Meta_R
+ altgr alt shiftr ctrll keycode 19 = Meta_r
+ shift altgr alt shiftr ctrll keycode 19 = Meta_R
+ control alt shiftr ctrll keycode 19 = Meta_Control_r
+ shift control alt shiftr ctrll keycode 19 = Meta_Control_r
+ altgr control alt shiftr ctrll keycode 19 = Meta_Control_r
+ shift altgr control alt shiftr ctrll keycode 19 = Meta_Control_r
+ shiftl shiftr ctrll keycode 19 = +R
+ altgr shiftl shiftr ctrll keycode 19 = registered
+ shift altgr shiftl shiftr ctrll keycode 19 = registered
+ control shiftl shiftr ctrll keycode 19 = Control_r
+ shift control shiftl shiftr ctrll keycode 19 = Control_r
+ altgr control shiftl shiftr ctrll keycode 19 = Control_r
+ shift altgr control shiftl shiftr ctrll keycode 19 = Control_r
+ alt shiftl shiftr ctrll keycode 19 = Meta_r
+ shift alt shiftl shiftr ctrll keycode 19 = Meta_R
+ altgr alt shiftl shiftr ctrll keycode 19 = Meta_r
+ shift altgr alt shiftl shiftr ctrll keycode 19 = Meta_R
+ control alt shiftl shiftr ctrll keycode 19 = Meta_Control_r
+ shift control alt shiftl shiftr ctrll keycode 19 = Meta_Control_r
+ altgr control alt shiftl shiftr ctrll keycode 19 = Meta_Control_r
+ shift altgr control alt shiftl shiftr ctrll keycode 19 = Meta_Control_r
+keycode 20 = +t
+ shift keycode 20 = +T
+ altgr keycode 20 = tslash
+ shift altgr keycode 20 = Tslash
+ control keycode 20 = Control_t
+ shift control keycode 20 = Control_t
+ altgr control keycode 20 = Control_t
+ shift altgr control keycode 20 = Control_t
+ alt keycode 20 = Meta_t
+ shift alt keycode 20 = Meta_T
+ altgr alt keycode 20 = Meta_t
+ shift altgr alt keycode 20 = Meta_T
+ control alt keycode 20 = Meta_Control_t
+ shift control alt keycode 20 = Meta_Control_t
+ altgr control alt keycode 20 = Meta_Control_t
+ shift altgr control alt keycode 20 = Meta_Control_t
+ shift shiftl keycode 20 = +T
+ altgr shiftl keycode 20 = tslash
+ shift altgr shiftl keycode 20 = Tslash
+ control shiftl keycode 20 = Control_t
+ shift control shiftl keycode 20 = Control_t
+ altgr control shiftl keycode 20 = Control_t
+ shift altgr control shiftl keycode 20 = Control_t
+ alt shiftl keycode 20 = Meta_t
+ shift alt shiftl keycode 20 = Meta_T
+ altgr alt shiftl keycode 20 = Meta_t
+ shift altgr alt shiftl keycode 20 = Meta_T
+ control alt shiftl keycode 20 = Meta_Control_t
+ shift control alt shiftl keycode 20 = Meta_Control_t
+ altgr control alt shiftl keycode 20 = Meta_Control_t
+ shift altgr control alt shiftl keycode 20 = Meta_Control_t
+ shift shiftr keycode 20 = +T
+ altgr shiftr keycode 20 = tslash
+ shift altgr shiftr keycode 20 = Tslash
+ control shiftr keycode 20 = Control_t
+ shift control shiftr keycode 20 = Control_t
+ altgr control shiftr keycode 20 = Control_t
+ shift altgr control shiftr keycode 20 = Control_t
+ alt shiftr keycode 20 = Meta_t
+ shift alt shiftr keycode 20 = Meta_T
+ altgr alt shiftr keycode 20 = Meta_t
+ shift altgr alt shiftr keycode 20 = Meta_T
+ control alt shiftr keycode 20 = Meta_Control_t
+ shift control alt shiftr keycode 20 = Meta_Control_t
+ altgr control alt shiftr keycode 20 = Meta_Control_t
+ shift altgr control alt shiftr keycode 20 = Meta_Control_t
+ shift shiftl shiftr keycode 20 = +T
+ altgr shiftl shiftr keycode 20 = tslash
+ shift altgr shiftl shiftr keycode 20 = Tslash
+ control shiftl shiftr keycode 20 = Control_t
+ shift control shiftl shiftr keycode 20 = Control_t
+ altgr control shiftl shiftr keycode 20 = Control_t
+ shift altgr control shiftl shiftr keycode 20 = Control_t
+ alt shiftl shiftr keycode 20 = Meta_t
+ shift alt shiftl shiftr keycode 20 = Meta_T
+ altgr alt shiftl shiftr keycode 20 = Meta_t
+ shift altgr alt shiftl shiftr keycode 20 = Meta_T
+ control alt shiftl shiftr keycode 20 = Meta_Control_t
+ shift control alt shiftl shiftr keycode 20 = Meta_Control_t
+ altgr control alt shiftl shiftr keycode 20 = Meta_Control_t
+ shift altgr control alt shiftl shiftr keycode 20 = Meta_Control_t
+ ctrll keycode 20 = +T
+ altgr ctrll keycode 20 = Tslash
+ shift altgr ctrll keycode 20 = tslash
+ control ctrll keycode 20 = Control_t
+ shift control ctrll keycode 20 = Control_t
+ altgr control ctrll keycode 20 = Control_t
+ shift altgr control ctrll keycode 20 = Control_t
+ alt ctrll keycode 20 = Meta_t
+ shift alt ctrll keycode 20 = Meta_T
+ altgr alt ctrll keycode 20 = Meta_t
+ shift altgr alt ctrll keycode 20 = Meta_T
+ control alt ctrll keycode 20 = Meta_Control_t
+ shift control alt ctrll keycode 20 = Meta_Control_t
+ altgr control alt ctrll keycode 20 = Meta_Control_t
+ shift altgr control alt ctrll keycode 20 = Meta_Control_t
+ shiftl ctrll keycode 20 = +T
+ altgr shiftl ctrll keycode 20 = Tslash
+ shift altgr shiftl ctrll keycode 20 = tslash
+ control shiftl ctrll keycode 20 = Control_t
+ shift control shiftl ctrll keycode 20 = Control_t
+ altgr control shiftl ctrll keycode 20 = Control_t
+ shift altgr control shiftl ctrll keycode 20 = Control_t
+ alt shiftl ctrll keycode 20 = Meta_t
+ shift alt shiftl ctrll keycode 20 = Meta_T
+ altgr alt shiftl ctrll keycode 20 = Meta_t
+ shift altgr alt shiftl ctrll keycode 20 = Meta_T
+ control alt shiftl ctrll keycode 20 = Meta_Control_t
+ shift control alt shiftl ctrll keycode 20 = Meta_Control_t
+ altgr control alt shiftl ctrll keycode 20 = Meta_Control_t
+ shift altgr control alt shiftl ctrll keycode 20 = Meta_Control_t
+ shiftr ctrll keycode 20 = +T
+ altgr shiftr ctrll keycode 20 = Tslash
+ shift altgr shiftr ctrll keycode 20 = tslash
+ control shiftr ctrll keycode 20 = Control_t
+ shift control shiftr ctrll keycode 20 = Control_t
+ altgr control shiftr ctrll keycode 20 = Control_t
+ shift altgr control shiftr ctrll keycode 20 = Control_t
+ alt shiftr ctrll keycode 20 = Meta_t
+ shift alt shiftr ctrll keycode 20 = Meta_T
+ altgr alt shiftr ctrll keycode 20 = Meta_t
+ shift altgr alt shiftr ctrll keycode 20 = Meta_T
+ control alt shiftr ctrll keycode 20 = Meta_Control_t
+ shift control alt shiftr ctrll keycode 20 = Meta_Control_t
+ altgr control alt shiftr ctrll keycode 20 = Meta_Control_t
+ shift altgr control alt shiftr ctrll keycode 20 = Meta_Control_t
+ shiftl shiftr ctrll keycode 20 = +T
+ altgr shiftl shiftr ctrll keycode 20 = Tslash
+ shift altgr shiftl shiftr ctrll keycode 20 = tslash
+ control shiftl shiftr ctrll keycode 20 = Control_t
+ shift control shiftl shiftr ctrll keycode 20 = Control_t
+ altgr control shiftl shiftr ctrll keycode 20 = Control_t
+ shift altgr control shiftl shiftr ctrll keycode 20 = Control_t
+ alt shiftl shiftr ctrll keycode 20 = Meta_t
+ shift alt shiftl shiftr ctrll keycode 20 = Meta_T
+ altgr alt shiftl shiftr ctrll keycode 20 = Meta_t
+ shift altgr alt shiftl shiftr ctrll keycode 20 = Meta_T
+ control alt shiftl shiftr ctrll keycode 20 = Meta_Control_t
+ shift control alt shiftl shiftr ctrll keycode 20 = Meta_Control_t
+ altgr control alt shiftl shiftr ctrll keycode 20 = Meta_Control_t
+ shift altgr control alt shiftl shiftr ctrll keycode 20 = Meta_Control_t
+keycode 21 = +y
+ shift keycode 21 = +Y
+ altgr keycode 21 = U+2190
+ shift altgr keycode 21 = yen
+ control keycode 21 = Control_y
+ shift control keycode 21 = Control_y
+ altgr control keycode 21 = Control_y
+ shift altgr control keycode 21 = Control_y
+ alt keycode 21 = Meta_y
+ shift alt keycode 21 = Meta_Y
+ altgr alt keycode 21 = Meta_y
+ shift altgr alt keycode 21 = Meta_Y
+ control alt keycode 21 = Meta_Control_y
+ shift control alt keycode 21 = Meta_Control_y
+ altgr control alt keycode 21 = Meta_Control_y
+ shift altgr control alt keycode 21 = Meta_Control_y
+ shift shiftl keycode 21 = +Y
+ altgr shiftl keycode 21 = U+2190
+ shift altgr shiftl keycode 21 = yen
+ control shiftl keycode 21 = Control_y
+ shift control shiftl keycode 21 = Control_y
+ altgr control shiftl keycode 21 = Control_y
+ shift altgr control shiftl keycode 21 = Control_y
+ alt shiftl keycode 21 = Meta_y
+ shift alt shiftl keycode 21 = Meta_Y
+ altgr alt shiftl keycode 21 = Meta_y
+ shift altgr alt shiftl keycode 21 = Meta_Y
+ control alt shiftl keycode 21 = Meta_Control_y
+ shift control alt shiftl keycode 21 = Meta_Control_y
+ altgr control alt shiftl keycode 21 = Meta_Control_y
+ shift altgr control alt shiftl keycode 21 = Meta_Control_y
+ shift shiftr keycode 21 = +Y
+ altgr shiftr keycode 21 = U+2190
+ shift altgr shiftr keycode 21 = yen
+ control shiftr keycode 21 = Control_y
+ shift control shiftr keycode 21 = Control_y
+ altgr control shiftr keycode 21 = Control_y
+ shift altgr control shiftr keycode 21 = Control_y
+ alt shiftr keycode 21 = Meta_y
+ shift alt shiftr keycode 21 = Meta_Y
+ altgr alt shiftr keycode 21 = Meta_y
+ shift altgr alt shiftr keycode 21 = Meta_Y
+ control alt shiftr keycode 21 = Meta_Control_y
+ shift control alt shiftr keycode 21 = Meta_Control_y
+ altgr control alt shiftr keycode 21 = Meta_Control_y
+ shift altgr control alt shiftr keycode 21 = Meta_Control_y
+ shift shiftl shiftr keycode 21 = +Y
+ altgr shiftl shiftr keycode 21 = U+2190
+ shift altgr shiftl shiftr keycode 21 = yen
+ control shiftl shiftr keycode 21 = Control_y
+ shift control shiftl shiftr keycode 21 = Control_y
+ altgr control shiftl shiftr keycode 21 = Control_y
+ shift altgr control shiftl shiftr keycode 21 = Control_y
+ alt shiftl shiftr keycode 21 = Meta_y
+ shift alt shiftl shiftr keycode 21 = Meta_Y
+ altgr alt shiftl shiftr keycode 21 = Meta_y
+ shift altgr alt shiftl shiftr keycode 21 = Meta_Y
+ control alt shiftl shiftr keycode 21 = Meta_Control_y
+ shift control alt shiftl shiftr keycode 21 = Meta_Control_y
+ altgr control alt shiftl shiftr keycode 21 = Meta_Control_y
+ shift altgr control alt shiftl shiftr keycode 21 = Meta_Control_y
+ ctrll keycode 21 = +Y
+ altgr ctrll keycode 21 = U+2190
+ shift altgr ctrll keycode 21 = yen
+ control ctrll keycode 21 = Control_y
+ shift control ctrll keycode 21 = Control_y
+ altgr control ctrll keycode 21 = Control_y
+ shift altgr control ctrll keycode 21 = Control_y
+ alt ctrll keycode 21 = Meta_y
+ shift alt ctrll keycode 21 = Meta_Y
+ altgr alt ctrll keycode 21 = Meta_y
+ shift altgr alt ctrll keycode 21 = Meta_Y
+ control alt ctrll keycode 21 = Meta_Control_y
+ shift control alt ctrll keycode 21 = Meta_Control_y
+ altgr control alt ctrll keycode 21 = Meta_Control_y
+ shift altgr control alt ctrll keycode 21 = Meta_Control_y
+ shiftl ctrll keycode 21 = +Y
+ altgr shiftl ctrll keycode 21 = U+2190
+ shift altgr shiftl ctrll keycode 21 = yen
+ control shiftl ctrll keycode 21 = Control_y
+ shift control shiftl ctrll keycode 21 = Control_y
+ altgr control shiftl ctrll keycode 21 = Control_y
+ shift altgr control shiftl ctrll keycode 21 = Control_y
+ alt shiftl ctrll keycode 21 = Meta_y
+ shift alt shiftl ctrll keycode 21 = Meta_Y
+ altgr alt shiftl ctrll keycode 21 = Meta_y
+ shift altgr alt shiftl ctrll keycode 21 = Meta_Y
+ control alt shiftl ctrll keycode 21 = Meta_Control_y
+ shift control alt shiftl ctrll keycode 21 = Meta_Control_y
+ altgr control alt shiftl ctrll keycode 21 = Meta_Control_y
+ shift altgr control alt shiftl ctrll keycode 21 = Meta_Control_y
+ shiftr ctrll keycode 21 = +Y
+ altgr shiftr ctrll keycode 21 = U+2190
+ shift altgr shiftr ctrll keycode 21 = yen
+ control shiftr ctrll keycode 21 = Control_y
+ shift control shiftr ctrll keycode 21 = Control_y
+ altgr control shiftr ctrll keycode 21 = Control_y
+ shift altgr control shiftr ctrll keycode 21 = Control_y
+ alt shiftr ctrll keycode 21 = Meta_y
+ shift alt shiftr ctrll keycode 21 = Meta_Y
+ altgr alt shiftr ctrll keycode 21 = Meta_y
+ shift altgr alt shiftr ctrll keycode 21 = Meta_Y
+ control alt shiftr ctrll keycode 21 = Meta_Control_y
+ shift control alt shiftr ctrll keycode 21 = Meta_Control_y
+ altgr control alt shiftr ctrll keycode 21 = Meta_Control_y
+ shift altgr control alt shiftr ctrll keycode 21 = Meta_Control_y
+ shiftl shiftr ctrll keycode 21 = +Y
+ altgr shiftl shiftr ctrll keycode 21 = U+2190
+ shift altgr shiftl shiftr ctrll keycode 21 = yen
+ control shiftl shiftr ctrll keycode 21 = Control_y
+ shift control shiftl shiftr ctrll keycode 21 = Control_y
+ altgr control shiftl shiftr ctrll keycode 21 = Control_y
+ shift altgr control shiftl shiftr ctrll keycode 21 = Control_y
+ alt shiftl shiftr ctrll keycode 21 = Meta_y
+ shift alt shiftl shiftr ctrll keycode 21 = Meta_Y
+ altgr alt shiftl shiftr ctrll keycode 21 = Meta_y
+ shift altgr alt shiftl shiftr ctrll keycode 21 = Meta_Y
+ control alt shiftl shiftr ctrll keycode 21 = Meta_Control_y
+ shift control alt shiftl shiftr ctrll keycode 21 = Meta_Control_y
+ altgr control alt shiftl shiftr ctrll keycode 21 = Meta_Control_y
+ shift altgr control alt shiftl shiftr ctrll keycode 21 = Meta_Control_y
+keycode 22 = +u
+ shift keycode 22 = +U
+ altgr keycode 22 = U+2193
+ shift altgr keycode 22 = U+2191
+ control keycode 22 = Control_u
+ shift control keycode 22 = Control_u
+ altgr control keycode 22 = Control_u
+ shift altgr control keycode 22 = Control_u
+ alt keycode 22 = Meta_u
+ shift alt keycode 22 = Meta_U
+ altgr alt keycode 22 = Meta_u
+ shift altgr alt keycode 22 = Meta_U
+ control alt keycode 22 = Meta_Control_u
+ shift control alt keycode 22 = Meta_Control_u
+ altgr control alt keycode 22 = Meta_Control_u
+ shift altgr control alt keycode 22 = Meta_Control_u
+ shift shiftl keycode 22 = +U
+ altgr shiftl keycode 22 = U+2193
+ shift altgr shiftl keycode 22 = U+2191
+ control shiftl keycode 22 = Control_u
+ shift control shiftl keycode 22 = Control_u
+ altgr control shiftl keycode 22 = Control_u
+ shift altgr control shiftl keycode 22 = Control_u
+ alt shiftl keycode 22 = Meta_u
+ shift alt shiftl keycode 22 = Meta_U
+ altgr alt shiftl keycode 22 = Meta_u
+ shift altgr alt shiftl keycode 22 = Meta_U
+ control alt shiftl keycode 22 = Meta_Control_u
+ shift control alt shiftl keycode 22 = Meta_Control_u
+ altgr control alt shiftl keycode 22 = Meta_Control_u
+ shift altgr control alt shiftl keycode 22 = Meta_Control_u
+ shift shiftr keycode 22 = +U
+ altgr shiftr keycode 22 = U+2193
+ shift altgr shiftr keycode 22 = U+2191
+ control shiftr keycode 22 = Control_u
+ shift control shiftr keycode 22 = Control_u
+ altgr control shiftr keycode 22 = Control_u
+ shift altgr control shiftr keycode 22 = Control_u
+ alt shiftr keycode 22 = Meta_u
+ shift alt shiftr keycode 22 = Meta_U
+ altgr alt shiftr keycode 22 = Meta_u
+ shift altgr alt shiftr keycode 22 = Meta_U
+ control alt shiftr keycode 22 = Meta_Control_u
+ shift control alt shiftr keycode 22 = Meta_Control_u
+ altgr control alt shiftr keycode 22 = Meta_Control_u
+ shift altgr control alt shiftr keycode 22 = Meta_Control_u
+ shift shiftl shiftr keycode 22 = +U
+ altgr shiftl shiftr keycode 22 = U+2193
+ shift altgr shiftl shiftr keycode 22 = U+2191
+ control shiftl shiftr keycode 22 = Control_u
+ shift control shiftl shiftr keycode 22 = Control_u
+ altgr control shiftl shiftr keycode 22 = Control_u
+ shift altgr control shiftl shiftr keycode 22 = Control_u
+ alt shiftl shiftr keycode 22 = Meta_u
+ shift alt shiftl shiftr keycode 22 = Meta_U
+ altgr alt shiftl shiftr keycode 22 = Meta_u
+ shift altgr alt shiftl shiftr keycode 22 = Meta_U
+ control alt shiftl shiftr keycode 22 = Meta_Control_u
+ shift control alt shiftl shiftr keycode 22 = Meta_Control_u
+ altgr control alt shiftl shiftr keycode 22 = Meta_Control_u
+ shift altgr control alt shiftl shiftr keycode 22 = Meta_Control_u
+ ctrll keycode 22 = +U
+ altgr ctrll keycode 22 = U+2193
+ shift altgr ctrll keycode 22 = U+2191
+ control ctrll keycode 22 = Control_u
+ shift control ctrll keycode 22 = Control_u
+ altgr control ctrll keycode 22 = Control_u
+ shift altgr control ctrll keycode 22 = Control_u
+ alt ctrll keycode 22 = Meta_u
+ shift alt ctrll keycode 22 = Meta_U
+ altgr alt ctrll keycode 22 = Meta_u
+ shift altgr alt ctrll keycode 22 = Meta_U
+ control alt ctrll keycode 22 = Meta_Control_u
+ shift control alt ctrll keycode 22 = Meta_Control_u
+ altgr control alt ctrll keycode 22 = Meta_Control_u
+ shift altgr control alt ctrll keycode 22 = Meta_Control_u
+ shiftl ctrll keycode 22 = +U
+ altgr shiftl ctrll keycode 22 = U+2193
+ shift altgr shiftl ctrll keycode 22 = U+2191
+ control shiftl ctrll keycode 22 = Control_u
+ shift control shiftl ctrll keycode 22 = Control_u
+ altgr control shiftl ctrll keycode 22 = Control_u
+ shift altgr control shiftl ctrll keycode 22 = Control_u
+ alt shiftl ctrll keycode 22 = Meta_u
+ shift alt shiftl ctrll keycode 22 = Meta_U
+ altgr alt shiftl ctrll keycode 22 = Meta_u
+ shift altgr alt shiftl ctrll keycode 22 = Meta_U
+ control alt shiftl ctrll keycode 22 = Meta_Control_u
+ shift control alt shiftl ctrll keycode 22 = Meta_Control_u
+ altgr control alt shiftl ctrll keycode 22 = Meta_Control_u
+ shift altgr control alt shiftl ctrll keycode 22 = Meta_Control_u
+ shiftr ctrll keycode 22 = +U
+ altgr shiftr ctrll keycode 22 = U+2193
+ shift altgr shiftr ctrll keycode 22 = U+2191
+ control shiftr ctrll keycode 22 = Control_u
+ shift control shiftr ctrll keycode 22 = Control_u
+ altgr control shiftr ctrll keycode 22 = Control_u
+ shift altgr control shiftr ctrll keycode 22 = Control_u
+ alt shiftr ctrll keycode 22 = Meta_u
+ shift alt shiftr ctrll keycode 22 = Meta_U
+ altgr alt shiftr ctrll keycode 22 = Meta_u
+ shift altgr alt shiftr ctrll keycode 22 = Meta_U
+ control alt shiftr ctrll keycode 22 = Meta_Control_u
+ shift control alt shiftr ctrll keycode 22 = Meta_Control_u
+ altgr control alt shiftr ctrll keycode 22 = Meta_Control_u
+ shift altgr control alt shiftr ctrll keycode 22 = Meta_Control_u
+ shiftl shiftr ctrll keycode 22 = +U
+ altgr shiftl shiftr ctrll keycode 22 = U+2193
+ shift altgr shiftl shiftr ctrll keycode 22 = U+2191
+ control shiftl shiftr ctrll keycode 22 = Control_u
+ shift control shiftl shiftr ctrll keycode 22 = Control_u
+ altgr control shiftl shiftr ctrll keycode 22 = Control_u
+ shift altgr control shiftl shiftr ctrll keycode 22 = Control_u
+ alt shiftl shiftr ctrll keycode 22 = Meta_u
+ shift alt shiftl shiftr ctrll keycode 22 = Meta_U
+ altgr alt shiftl shiftr ctrll keycode 22 = Meta_u
+ shift altgr alt shiftl shiftr ctrll keycode 22 = Meta_U
+ control alt shiftl shiftr ctrll keycode 22 = Meta_Control_u
+ shift control alt shiftl shiftr ctrll keycode 22 = Meta_Control_u
+ altgr control alt shiftl shiftr ctrll keycode 22 = Meta_Control_u
+ shift altgr control alt shiftl shiftr ctrll keycode 22 = Meta_Control_u
+keycode 23 = +i
+ shift keycode 23 = +I
+ altgr keycode 23 = U+2192
+ shift altgr keycode 23 = idotless
+ control keycode 23 = Tab
+ shift control keycode 23 = Tab
+ altgr control keycode 23 = Tab
+ shift altgr control keycode 23 = Tab
+ alt keycode 23 = Meta_i
+ shift alt keycode 23 = Meta_I
+ altgr alt keycode 23 = Meta_i
+ shift altgr alt keycode 23 = Meta_I
+ control alt keycode 23 = Meta_Tab
+ shift control alt keycode 23 = Meta_Tab
+ altgr control alt keycode 23 = Meta_Tab
+ shift altgr control alt keycode 23 = Meta_Tab
+ shift shiftl keycode 23 = +I
+ altgr shiftl keycode 23 = U+2192
+ shift altgr shiftl keycode 23 = idotless
+ control shiftl keycode 23 = Tab
+ shift control shiftl keycode 23 = Tab
+ altgr control shiftl keycode 23 = Tab
+ shift altgr control shiftl keycode 23 = Tab
+ alt shiftl keycode 23 = Meta_i
+ shift alt shiftl keycode 23 = Meta_I
+ altgr alt shiftl keycode 23 = Meta_i
+ shift altgr alt shiftl keycode 23 = Meta_I
+ control alt shiftl keycode 23 = Meta_Tab
+ shift control alt shiftl keycode 23 = Meta_Tab
+ altgr control alt shiftl keycode 23 = Meta_Tab
+ shift altgr control alt shiftl keycode 23 = Meta_Tab
+ shift shiftr keycode 23 = +I
+ altgr shiftr keycode 23 = U+2192
+ shift altgr shiftr keycode 23 = idotless
+ control shiftr keycode 23 = Tab
+ shift control shiftr keycode 23 = Tab
+ altgr control shiftr keycode 23 = Tab
+ shift altgr control shiftr keycode 23 = Tab
+ alt shiftr keycode 23 = Meta_i
+ shift alt shiftr keycode 23 = Meta_I
+ altgr alt shiftr keycode 23 = Meta_i
+ shift altgr alt shiftr keycode 23 = Meta_I
+ control alt shiftr keycode 23 = Meta_Tab
+ shift control alt shiftr keycode 23 = Meta_Tab
+ altgr control alt shiftr keycode 23 = Meta_Tab
+ shift altgr control alt shiftr keycode 23 = Meta_Tab
+ shift shiftl shiftr keycode 23 = +I
+ altgr shiftl shiftr keycode 23 = U+2192
+ shift altgr shiftl shiftr keycode 23 = idotless
+ control shiftl shiftr keycode 23 = Tab
+ shift control shiftl shiftr keycode 23 = Tab
+ altgr control shiftl shiftr keycode 23 = Tab
+ shift altgr control shiftl shiftr keycode 23 = Tab
+ alt shiftl shiftr keycode 23 = Meta_i
+ shift alt shiftl shiftr keycode 23 = Meta_I
+ altgr alt shiftl shiftr keycode 23 = Meta_i
+ shift altgr alt shiftl shiftr keycode 23 = Meta_I
+ control alt shiftl shiftr keycode 23 = Meta_Tab
+ shift control alt shiftl shiftr keycode 23 = Meta_Tab
+ altgr control alt shiftl shiftr keycode 23 = Meta_Tab
+ shift altgr control alt shiftl shiftr keycode 23 = Meta_Tab
+ ctrll keycode 23 = +I
+ altgr ctrll keycode 23 = U+2192
+ shift altgr ctrll keycode 23 = +I
+ control ctrll keycode 23 = Tab
+ shift control ctrll keycode 23 = Tab
+ altgr control ctrll keycode 23 = Tab
+ shift altgr control ctrll keycode 23 = Tab
+ alt ctrll keycode 23 = Meta_i
+ shift alt ctrll keycode 23 = Meta_I
+ altgr alt ctrll keycode 23 = Meta_i
+ shift altgr alt ctrll keycode 23 = Meta_I
+ control alt ctrll keycode 23 = Meta_Tab
+ shift control alt ctrll keycode 23 = Meta_Tab
+ altgr control alt ctrll keycode 23 = Meta_Tab
+ shift altgr control alt ctrll keycode 23 = Meta_Tab
+ shiftl ctrll keycode 23 = +I
+ altgr shiftl ctrll keycode 23 = U+2192
+ shift altgr shiftl ctrll keycode 23 = +I
+ control shiftl ctrll keycode 23 = Tab
+ shift control shiftl ctrll keycode 23 = Tab
+ altgr control shiftl ctrll keycode 23 = Tab
+ shift altgr control shiftl ctrll keycode 23 = Tab
+ alt shiftl ctrll keycode 23 = Meta_i
+ shift alt shiftl ctrll keycode 23 = Meta_I
+ altgr alt shiftl ctrll keycode 23 = Meta_i
+ shift altgr alt shiftl ctrll keycode 23 = Meta_I
+ control alt shiftl ctrll keycode 23 = Meta_Tab
+ shift control alt shiftl ctrll keycode 23 = Meta_Tab
+ altgr control alt shiftl ctrll keycode 23 = Meta_Tab
+ shift altgr control alt shiftl ctrll keycode 23 = Meta_Tab
+ shiftr ctrll keycode 23 = +I
+ altgr shiftr ctrll keycode 23 = U+2192
+ shift altgr shiftr ctrll keycode 23 = +I
+ control shiftr ctrll keycode 23 = Tab
+ shift control shiftr ctrll keycode 23 = Tab
+ altgr control shiftr ctrll keycode 23 = Tab
+ shift altgr control shiftr ctrll keycode 23 = Tab
+ alt shiftr ctrll keycode 23 = Meta_i
+ shift alt shiftr ctrll keycode 23 = Meta_I
+ altgr alt shiftr ctrll keycode 23 = Meta_i
+ shift altgr alt shiftr ctrll keycode 23 = Meta_I
+ control alt shiftr ctrll keycode 23 = Meta_Tab
+ shift control alt shiftr ctrll keycode 23 = Meta_Tab
+ altgr control alt shiftr ctrll keycode 23 = Meta_Tab
+ shift altgr control alt shiftr ctrll keycode 23 = Meta_Tab
+ shiftl shiftr ctrll keycode 23 = +I
+ altgr shiftl shiftr ctrll keycode 23 = U+2192
+ shift altgr shiftl shiftr ctrll keycode 23 = +I
+ control shiftl shiftr ctrll keycode 23 = Tab
+ shift control shiftl shiftr ctrll keycode 23 = Tab
+ altgr control shiftl shiftr ctrll keycode 23 = Tab
+ shift altgr control shiftl shiftr ctrll keycode 23 = Tab
+ alt shiftl shiftr ctrll keycode 23 = Meta_i
+ shift alt shiftl shiftr ctrll keycode 23 = Meta_I
+ altgr alt shiftl shiftr ctrll keycode 23 = Meta_i
+ shift altgr alt shiftl shiftr ctrll keycode 23 = Meta_I
+ control alt shiftl shiftr ctrll keycode 23 = Meta_Tab
+ shift control alt shiftl shiftr ctrll keycode 23 = Meta_Tab
+ altgr control alt shiftl shiftr ctrll keycode 23 = Meta_Tab
+ shift altgr control alt shiftl shiftr ctrll keycode 23 = Meta_Tab
+keycode 24 = +o
+ shift keycode 24 = +O
+ altgr keycode 24 = +oslash
+ shift altgr keycode 24 = +Ooblique
+ control keycode 24 = Control_o
+ shift control keycode 24 = Control_o
+ altgr control keycode 24 = Control_o
+ shift altgr control keycode 24 = Control_o
+ alt keycode 24 = Meta_o
+ shift alt keycode 24 = Meta_O
+ altgr alt keycode 24 = Meta_o
+ shift altgr alt keycode 24 = Meta_O
+ control alt keycode 24 = Meta_Control_o
+ shift control alt keycode 24 = Meta_Control_o
+ altgr control alt keycode 24 = Meta_Control_o
+ shift altgr control alt keycode 24 = Meta_Control_o
+ shift shiftl keycode 24 = +O
+ altgr shiftl keycode 24 = +oslash
+ shift altgr shiftl keycode 24 = +Ooblique
+ control shiftl keycode 24 = Control_o
+ shift control shiftl keycode 24 = Control_o
+ altgr control shiftl keycode 24 = Control_o
+ shift altgr control shiftl keycode 24 = Control_o
+ alt shiftl keycode 24 = Meta_o
+ shift alt shiftl keycode 24 = Meta_O
+ altgr alt shiftl keycode 24 = Meta_o
+ shift altgr alt shiftl keycode 24 = Meta_O
+ control alt shiftl keycode 24 = Meta_Control_o
+ shift control alt shiftl keycode 24 = Meta_Control_o
+ altgr control alt shiftl keycode 24 = Meta_Control_o
+ shift altgr control alt shiftl keycode 24 = Meta_Control_o
+ shift shiftr keycode 24 = +O
+ altgr shiftr keycode 24 = +oslash
+ shift altgr shiftr keycode 24 = +Ooblique
+ control shiftr keycode 24 = Control_o
+ shift control shiftr keycode 24 = Control_o
+ altgr control shiftr keycode 24 = Control_o
+ shift altgr control shiftr keycode 24 = Control_o
+ alt shiftr keycode 24 = Meta_o
+ shift alt shiftr keycode 24 = Meta_O
+ altgr alt shiftr keycode 24 = Meta_o
+ shift altgr alt shiftr keycode 24 = Meta_O
+ control alt shiftr keycode 24 = Meta_Control_o
+ shift control alt shiftr keycode 24 = Meta_Control_o
+ altgr control alt shiftr keycode 24 = Meta_Control_o
+ shift altgr control alt shiftr keycode 24 = Meta_Control_o
+ shift shiftl shiftr keycode 24 = +O
+ altgr shiftl shiftr keycode 24 = +oslash
+ shift altgr shiftl shiftr keycode 24 = +Ooblique
+ control shiftl shiftr keycode 24 = Control_o
+ shift control shiftl shiftr keycode 24 = Control_o
+ altgr control shiftl shiftr keycode 24 = Control_o
+ shift altgr control shiftl shiftr keycode 24 = Control_o
+ alt shiftl shiftr keycode 24 = Meta_o
+ shift alt shiftl shiftr keycode 24 = Meta_O
+ altgr alt shiftl shiftr keycode 24 = Meta_o
+ shift altgr alt shiftl shiftr keycode 24 = Meta_O
+ control alt shiftl shiftr keycode 24 = Meta_Control_o
+ shift control alt shiftl shiftr keycode 24 = Meta_Control_o
+ altgr control alt shiftl shiftr keycode 24 = Meta_Control_o
+ shift altgr control alt shiftl shiftr keycode 24 = Meta_Control_o
+ ctrll keycode 24 = +O
+ altgr ctrll keycode 24 = +Ooblique
+ shift altgr ctrll keycode 24 = +oslash
+ control ctrll keycode 24 = Control_o
+ shift control ctrll keycode 24 = Control_o
+ altgr control ctrll keycode 24 = Control_o
+ shift altgr control ctrll keycode 24 = Control_o
+ alt ctrll keycode 24 = Meta_o
+ shift alt ctrll keycode 24 = Meta_O
+ altgr alt ctrll keycode 24 = Meta_o
+ shift altgr alt ctrll keycode 24 = Meta_O
+ control alt ctrll keycode 24 = Meta_Control_o
+ shift control alt ctrll keycode 24 = Meta_Control_o
+ altgr control alt ctrll keycode 24 = Meta_Control_o
+ shift altgr control alt ctrll keycode 24 = Meta_Control_o
+ shiftl ctrll keycode 24 = +O
+ altgr shiftl ctrll keycode 24 = +Ooblique
+ shift altgr shiftl ctrll keycode 24 = +oslash
+ control shiftl ctrll keycode 24 = Control_o
+ shift control shiftl ctrll keycode 24 = Control_o
+ altgr control shiftl ctrll keycode 24 = Control_o
+ shift altgr control shiftl ctrll keycode 24 = Control_o
+ alt shiftl ctrll keycode 24 = Meta_o
+ shift alt shiftl ctrll keycode 24 = Meta_O
+ altgr alt shiftl ctrll keycode 24 = Meta_o
+ shift altgr alt shiftl ctrll keycode 24 = Meta_O
+ control alt shiftl ctrll keycode 24 = Meta_Control_o
+ shift control alt shiftl ctrll keycode 24 = Meta_Control_o
+ altgr control alt shiftl ctrll keycode 24 = Meta_Control_o
+ shift altgr control alt shiftl ctrll keycode 24 = Meta_Control_o
+ shiftr ctrll keycode 24 = +O
+ altgr shiftr ctrll keycode 24 = +Ooblique
+ shift altgr shiftr ctrll keycode 24 = +oslash
+ control shiftr ctrll keycode 24 = Control_o
+ shift control shiftr ctrll keycode 24 = Control_o
+ altgr control shiftr ctrll keycode 24 = Control_o
+ shift altgr control shiftr ctrll keycode 24 = Control_o
+ alt shiftr ctrll keycode 24 = Meta_o
+ shift alt shiftr ctrll keycode 24 = Meta_O
+ altgr alt shiftr ctrll keycode 24 = Meta_o
+ shift altgr alt shiftr ctrll keycode 24 = Meta_O
+ control alt shiftr ctrll keycode 24 = Meta_Control_o
+ shift control alt shiftr ctrll keycode 24 = Meta_Control_o
+ altgr control alt shiftr ctrll keycode 24 = Meta_Control_o
+ shift altgr control alt shiftr ctrll keycode 24 = Meta_Control_o
+ shiftl shiftr ctrll keycode 24 = +O
+ altgr shiftl shiftr ctrll keycode 24 = +Ooblique
+ shift altgr shiftl shiftr ctrll keycode 24 = +oslash
+ control shiftl shiftr ctrll keycode 24 = Control_o
+ shift control shiftl shiftr ctrll keycode 24 = Control_o
+ altgr control shiftl shiftr ctrll keycode 24 = Control_o
+ shift altgr control shiftl shiftr ctrll keycode 24 = Control_o
+ alt shiftl shiftr ctrll keycode 24 = Meta_o
+ shift alt shiftl shiftr ctrll keycode 24 = Meta_O
+ altgr alt shiftl shiftr ctrll keycode 24 = Meta_o
+ shift altgr alt shiftl shiftr ctrll keycode 24 = Meta_O
+ control alt shiftl shiftr ctrll keycode 24 = Meta_Control_o
+ shift control alt shiftl shiftr ctrll keycode 24 = Meta_Control_o
+ altgr control alt shiftl shiftr ctrll keycode 24 = Meta_Control_o
+ shift altgr control alt shiftl shiftr ctrll keycode 24 = Meta_Control_o
+keycode 25 = +p
+ shift keycode 25 = +P
+ altgr keycode 25 = +thorn
+ shift altgr keycode 25 = +THORN
+ control keycode 25 = Control_p
+ shift control keycode 25 = Control_p
+ altgr control keycode 25 = Control_p
+ shift altgr control keycode 25 = Control_p
+ alt keycode 25 = Meta_p
+ shift alt keycode 25 = Meta_P
+ altgr alt keycode 25 = Meta_p
+ shift altgr alt keycode 25 = Meta_P
+ control alt keycode 25 = Meta_Control_p
+ shift control alt keycode 25 = Meta_Control_p
+ altgr control alt keycode 25 = Meta_Control_p
+ shift altgr control alt keycode 25 = Meta_Control_p
+ shift shiftl keycode 25 = +P
+ altgr shiftl keycode 25 = +thorn
+ shift altgr shiftl keycode 25 = +THORN
+ control shiftl keycode 25 = Control_p
+ shift control shiftl keycode 25 = Control_p
+ altgr control shiftl keycode 25 = Control_p
+ shift altgr control shiftl keycode 25 = Control_p
+ alt shiftl keycode 25 = Meta_p
+ shift alt shiftl keycode 25 = Meta_P
+ altgr alt shiftl keycode 25 = Meta_p
+ shift altgr alt shiftl keycode 25 = Meta_P
+ control alt shiftl keycode 25 = Meta_Control_p
+ shift control alt shiftl keycode 25 = Meta_Control_p
+ altgr control alt shiftl keycode 25 = Meta_Control_p
+ shift altgr control alt shiftl keycode 25 = Meta_Control_p
+ shift shiftr keycode 25 = +P
+ altgr shiftr keycode 25 = +thorn
+ shift altgr shiftr keycode 25 = +THORN
+ control shiftr keycode 25 = Control_p
+ shift control shiftr keycode 25 = Control_p
+ altgr control shiftr keycode 25 = Control_p
+ shift altgr control shiftr keycode 25 = Control_p
+ alt shiftr keycode 25 = Meta_p
+ shift alt shiftr keycode 25 = Meta_P
+ altgr alt shiftr keycode 25 = Meta_p
+ shift altgr alt shiftr keycode 25 = Meta_P
+ control alt shiftr keycode 25 = Meta_Control_p
+ shift control alt shiftr keycode 25 = Meta_Control_p
+ altgr control alt shiftr keycode 25 = Meta_Control_p
+ shift altgr control alt shiftr keycode 25 = Meta_Control_p
+ shift shiftl shiftr keycode 25 = +P
+ altgr shiftl shiftr keycode 25 = +thorn
+ shift altgr shiftl shiftr keycode 25 = +THORN
+ control shiftl shiftr keycode 25 = Control_p
+ shift control shiftl shiftr keycode 25 = Control_p
+ altgr control shiftl shiftr keycode 25 = Control_p
+ shift altgr control shiftl shiftr keycode 25 = Control_p
+ alt shiftl shiftr keycode 25 = Meta_p
+ shift alt shiftl shiftr keycode 25 = Meta_P
+ altgr alt shiftl shiftr keycode 25 = Meta_p
+ shift altgr alt shiftl shiftr keycode 25 = Meta_P
+ control alt shiftl shiftr keycode 25 = Meta_Control_p
+ shift control alt shiftl shiftr keycode 25 = Meta_Control_p
+ altgr control alt shiftl shiftr keycode 25 = Meta_Control_p
+ shift altgr control alt shiftl shiftr keycode 25 = Meta_Control_p
+ ctrll keycode 25 = +P
+ altgr ctrll keycode 25 = +THORN
+ shift altgr ctrll keycode 25 = +thorn
+ control ctrll keycode 25 = Control_p
+ shift control ctrll keycode 25 = Control_p
+ altgr control ctrll keycode 25 = Control_p
+ shift altgr control ctrll keycode 25 = Control_p
+ alt ctrll keycode 25 = Meta_p
+ shift alt ctrll keycode 25 = Meta_P
+ altgr alt ctrll keycode 25 = Meta_p
+ shift altgr alt ctrll keycode 25 = Meta_P
+ control alt ctrll keycode 25 = Meta_Control_p
+ shift control alt ctrll keycode 25 = Meta_Control_p
+ altgr control alt ctrll keycode 25 = Meta_Control_p
+ shift altgr control alt ctrll keycode 25 = Meta_Control_p
+ shiftl ctrll keycode 25 = +P
+ altgr shiftl ctrll keycode 25 = +THORN
+ shift altgr shiftl ctrll keycode 25 = +thorn
+ control shiftl ctrll keycode 25 = Control_p
+ shift control shiftl ctrll keycode 25 = Control_p
+ altgr control shiftl ctrll keycode 25 = Control_p
+ shift altgr control shiftl ctrll keycode 25 = Control_p
+ alt shiftl ctrll keycode 25 = Meta_p
+ shift alt shiftl ctrll keycode 25 = Meta_P
+ altgr alt shiftl ctrll keycode 25 = Meta_p
+ shift altgr alt shiftl ctrll keycode 25 = Meta_P
+ control alt shiftl ctrll keycode 25 = Meta_Control_p
+ shift control alt shiftl ctrll keycode 25 = Meta_Control_p
+ altgr control alt shiftl ctrll keycode 25 = Meta_Control_p
+ shift altgr control alt shiftl ctrll keycode 25 = Meta_Control_p
+ shiftr ctrll keycode 25 = +P
+ altgr shiftr ctrll keycode 25 = +THORN
+ shift altgr shiftr ctrll keycode 25 = +thorn
+ control shiftr ctrll keycode 25 = Control_p
+ shift control shiftr ctrll keycode 25 = Control_p
+ altgr control shiftr ctrll keycode 25 = Control_p
+ shift altgr control shiftr ctrll keycode 25 = Control_p
+ alt shiftr ctrll keycode 25 = Meta_p
+ shift alt shiftr ctrll keycode 25 = Meta_P
+ altgr alt shiftr ctrll keycode 25 = Meta_p
+ shift altgr alt shiftr ctrll keycode 25 = Meta_P
+ control alt shiftr ctrll keycode 25 = Meta_Control_p
+ shift control alt shiftr ctrll keycode 25 = Meta_Control_p
+ altgr control alt shiftr ctrll keycode 25 = Meta_Control_p
+ shift altgr control alt shiftr ctrll keycode 25 = Meta_Control_p
+ shiftl shiftr ctrll keycode 25 = +P
+ altgr shiftl shiftr ctrll keycode 25 = +THORN
+ shift altgr shiftl shiftr ctrll keycode 25 = +thorn
+ control shiftl shiftr ctrll keycode 25 = Control_p
+ shift control shiftl shiftr ctrll keycode 25 = Control_p
+ altgr control shiftl shiftr ctrll keycode 25 = Control_p
+ shift altgr control shiftl shiftr ctrll keycode 25 = Control_p
+ alt shiftl shiftr ctrll keycode 25 = Meta_p
+ shift alt shiftl shiftr ctrll keycode 25 = Meta_P
+ altgr alt shiftl shiftr ctrll keycode 25 = Meta_p
+ shift altgr alt shiftl shiftr ctrll keycode 25 = Meta_P
+ control alt shiftl shiftr ctrll keycode 25 = Meta_Control_p
+ shift control alt shiftl shiftr ctrll keycode 25 = Meta_Control_p
+ altgr control alt shiftl shiftr ctrll keycode 25 = Meta_Control_p
+ shift altgr control alt shiftl shiftr ctrll keycode 25 = Meta_Control_p
+keycode 26 = dead_acute
+ shift keycode 26 = dead_grave
+ altgr keycode 26 = apostrophe
+ shift altgr keycode 26 = grave
+ shift control keycode 26 = dead_grave
+ altgr control keycode 26 = Control_g
+ shift altgr control keycode 26 = nul
+ shift alt keycode 26 = dead_grave
+ altgr alt keycode 26 = Meta_apostrophe
+ shift altgr alt keycode 26 = Meta_grave
+ shift control alt keycode 26 = dead_grave
+ altgr control alt keycode 26 = Meta_Control_g
+ shift altgr control alt keycode 26 = Meta_nul
+ shift shiftl keycode 26 = dead_grave
+ altgr shiftl keycode 26 = apostrophe
+ shift altgr shiftl keycode 26 = grave
+ shift control shiftl keycode 26 = dead_grave
+ altgr control shiftl keycode 26 = Control_g
+ shift altgr control shiftl keycode 26 = nul
+ shift alt shiftl keycode 26 = dead_grave
+ altgr alt shiftl keycode 26 = Meta_apostrophe
+ shift altgr alt shiftl keycode 26 = Meta_grave
+ shift control alt shiftl keycode 26 = dead_grave
+ altgr control alt shiftl keycode 26 = Meta_Control_g
+ shift altgr control alt shiftl keycode 26 = Meta_nul
+ shift shiftr keycode 26 = dead_grave
+ altgr shiftr keycode 26 = apostrophe
+ shift altgr shiftr keycode 26 = grave
+ shift control shiftr keycode 26 = dead_grave
+ altgr control shiftr keycode 26 = Control_g
+ shift altgr control shiftr keycode 26 = nul
+ shift alt shiftr keycode 26 = dead_grave
+ altgr alt shiftr keycode 26 = Meta_apostrophe
+ shift altgr alt shiftr keycode 26 = Meta_grave
+ shift control alt shiftr keycode 26 = dead_grave
+ altgr control alt shiftr keycode 26 = Meta_Control_g
+ shift altgr control alt shiftr keycode 26 = Meta_nul
+ shift shiftl shiftr keycode 26 = dead_grave
+ altgr shiftl shiftr keycode 26 = apostrophe
+ shift altgr shiftl shiftr keycode 26 = grave
+ shift control shiftl shiftr keycode 26 = dead_grave
+ altgr control shiftl shiftr keycode 26 = Control_g
+ shift altgr control shiftl shiftr keycode 26 = nul
+ shift alt shiftl shiftr keycode 26 = dead_grave
+ altgr alt shiftl shiftr keycode 26 = Meta_apostrophe
+ shift altgr alt shiftl shiftr keycode 26 = Meta_grave
+ shift control alt shiftl shiftr keycode 26 = dead_grave
+ altgr control alt shiftl shiftr keycode 26 = Meta_Control_g
+ shift altgr control alt shiftl shiftr keycode 26 = Meta_nul
+ shift ctrll keycode 26 = dead_grave
+ altgr ctrll keycode 26 = apostrophe
+ shift altgr ctrll keycode 26 = grave
+ shift control ctrll keycode 26 = dead_grave
+ altgr control ctrll keycode 26 = Control_g
+ shift altgr control ctrll keycode 26 = nul
+ shift alt ctrll keycode 26 = dead_grave
+ altgr alt ctrll keycode 26 = Meta_apostrophe
+ shift altgr alt ctrll keycode 26 = Meta_grave
+ shift control alt ctrll keycode 26 = dead_grave
+ altgr control alt ctrll keycode 26 = Meta_Control_g
+ shift altgr control alt ctrll keycode 26 = Meta_nul
+ shift shiftl ctrll keycode 26 = dead_grave
+ altgr shiftl ctrll keycode 26 = apostrophe
+ shift altgr shiftl ctrll keycode 26 = grave
+ shift control shiftl ctrll keycode 26 = dead_grave
+ altgr control shiftl ctrll keycode 26 = Control_g
+ shift altgr control shiftl ctrll keycode 26 = nul
+ shift alt shiftl ctrll keycode 26 = dead_grave
+ altgr alt shiftl ctrll keycode 26 = Meta_apostrophe
+ shift altgr alt shiftl ctrll keycode 26 = Meta_grave
+ shift control alt shiftl ctrll keycode 26 = dead_grave
+ altgr control alt shiftl ctrll keycode 26 = Meta_Control_g
+ shift altgr control alt shiftl ctrll keycode 26 = Meta_nul
+ shift shiftr ctrll keycode 26 = dead_grave
+ altgr shiftr ctrll keycode 26 = apostrophe
+ shift altgr shiftr ctrll keycode 26 = grave
+ shift control shiftr ctrll keycode 26 = dead_grave
+ altgr control shiftr ctrll keycode 26 = Control_g
+ shift altgr control shiftr ctrll keycode 26 = nul
+ shift alt shiftr ctrll keycode 26 = dead_grave
+ altgr alt shiftr ctrll keycode 26 = Meta_apostrophe
+ shift altgr alt shiftr ctrll keycode 26 = Meta_grave
+ shift control alt shiftr ctrll keycode 26 = dead_grave
+ altgr control alt shiftr ctrll keycode 26 = Meta_Control_g
+ shift altgr control alt shiftr ctrll keycode 26 = Meta_nul
+ shift shiftl shiftr ctrll keycode 26 = dead_grave
+ altgr shiftl shiftr ctrll keycode 26 = apostrophe
+ shift altgr shiftl shiftr ctrll keycode 26 = grave
+ shift control shiftl shiftr ctrll keycode 26 = dead_grave
+ altgr control shiftl shiftr ctrll keycode 26 = Control_g
+ shift altgr control shiftl shiftr ctrll keycode 26 = nul
+ shift alt shiftl shiftr ctrll keycode 26 = dead_grave
+ altgr alt shiftl shiftr ctrll keycode 26 = Meta_apostrophe
+ shift altgr alt shiftl shiftr ctrll keycode 26 = Meta_grave
+ shift control alt shiftl shiftr ctrll keycode 26 = dead_grave
+ altgr control alt shiftl shiftr ctrll keycode 26 = Meta_Control_g
+ shift altgr control alt shiftl shiftr ctrll keycode 26 = Meta_nul
+keycode 27 = bracketleft
+ shift keycode 27 = braceleft
+ altgr keycode 27 = +ordfeminine
+ shift altgr keycode 27 = underscore
+ control keycode 27 = Escape
+ shift control keycode 27 = Escape
+ altgr control keycode 27 = Escape
+ shift altgr control keycode 27 = Control_underscore
+ alt keycode 27 = Meta_bracketleft
+ shift alt keycode 27 = Meta_braceleft
+ altgr alt keycode 27 = Meta_bracketleft
+ shift altgr alt keycode 27 = Meta_underscore
+ control alt keycode 27 = Meta_Escape
+ shift control alt keycode 27 = Meta_Escape
+ altgr control alt keycode 27 = Meta_Escape
+ shift altgr control alt keycode 27 = Meta_Control_underscore
+ shift shiftl keycode 27 = braceleft
+ altgr shiftl keycode 27 = +ordfeminine
+ shift altgr shiftl keycode 27 = underscore
+ control shiftl keycode 27 = Escape
+ shift control shiftl keycode 27 = Escape
+ altgr control shiftl keycode 27 = Escape
+ shift altgr control shiftl keycode 27 = Control_underscore
+ alt shiftl keycode 27 = Meta_bracketleft
+ shift alt shiftl keycode 27 = Meta_braceleft
+ altgr alt shiftl keycode 27 = Meta_bracketleft
+ shift altgr alt shiftl keycode 27 = Meta_underscore
+ control alt shiftl keycode 27 = Meta_Escape
+ shift control alt shiftl keycode 27 = Meta_Escape
+ altgr control alt shiftl keycode 27 = Meta_Escape
+ shift altgr control alt shiftl keycode 27 = Meta_Control_underscore
+ shift shiftr keycode 27 = braceleft
+ altgr shiftr keycode 27 = +ordfeminine
+ shift altgr shiftr keycode 27 = underscore
+ control shiftr keycode 27 = Escape
+ shift control shiftr keycode 27 = Escape
+ altgr control shiftr keycode 27 = Escape
+ shift altgr control shiftr keycode 27 = Control_underscore
+ alt shiftr keycode 27 = Meta_bracketleft
+ shift alt shiftr keycode 27 = Meta_braceleft
+ altgr alt shiftr keycode 27 = Meta_bracketleft
+ shift altgr alt shiftr keycode 27 = Meta_underscore
+ control alt shiftr keycode 27 = Meta_Escape
+ shift control alt shiftr keycode 27 = Meta_Escape
+ altgr control alt shiftr keycode 27 = Meta_Escape
+ shift altgr control alt shiftr keycode 27 = Meta_Control_underscore
+ shift shiftl shiftr keycode 27 = braceleft
+ altgr shiftl shiftr keycode 27 = +ordfeminine
+ shift altgr shiftl shiftr keycode 27 = underscore
+ control shiftl shiftr keycode 27 = Escape
+ shift control shiftl shiftr keycode 27 = Escape
+ altgr control shiftl shiftr keycode 27 = Escape
+ shift altgr control shiftl shiftr keycode 27 = Control_underscore
+ alt shiftl shiftr keycode 27 = Meta_bracketleft
+ shift alt shiftl shiftr keycode 27 = Meta_braceleft
+ altgr alt shiftl shiftr keycode 27 = Meta_bracketleft
+ shift altgr alt shiftl shiftr keycode 27 = Meta_underscore
+ control alt shiftl shiftr keycode 27 = Meta_Escape
+ shift control alt shiftl shiftr keycode 27 = Meta_Escape
+ altgr control alt shiftl shiftr keycode 27 = Meta_Escape
+ shift altgr control alt shiftl shiftr keycode 27 = Meta_Control_underscore
+ shift ctrll keycode 27 = braceleft
+ altgr ctrll keycode 27 = +ordfeminine
+ shift altgr ctrll keycode 27 = underscore
+ control ctrll keycode 27 = Escape
+ shift control ctrll keycode 27 = Escape
+ altgr control ctrll keycode 27 = Escape
+ shift altgr control ctrll keycode 27 = Control_underscore
+ alt ctrll keycode 27 = Meta_bracketleft
+ shift alt ctrll keycode 27 = Meta_braceleft
+ altgr alt ctrll keycode 27 = Meta_bracketleft
+ shift altgr alt ctrll keycode 27 = Meta_underscore
+ control alt ctrll keycode 27 = Meta_Escape
+ shift control alt ctrll keycode 27 = Meta_Escape
+ altgr control alt ctrll keycode 27 = Meta_Escape
+ shift altgr control alt ctrll keycode 27 = Meta_Control_underscore
+ shift shiftl ctrll keycode 27 = braceleft
+ altgr shiftl ctrll keycode 27 = +ordfeminine
+ shift altgr shiftl ctrll keycode 27 = underscore
+ control shiftl ctrll keycode 27 = Escape
+ shift control shiftl ctrll keycode 27 = Escape
+ altgr control shiftl ctrll keycode 27 = Escape
+ shift altgr control shiftl ctrll keycode 27 = Control_underscore
+ alt shiftl ctrll keycode 27 = Meta_bracketleft
+ shift alt shiftl ctrll keycode 27 = Meta_braceleft
+ altgr alt shiftl ctrll keycode 27 = Meta_bracketleft
+ shift altgr alt shiftl ctrll keycode 27 = Meta_underscore
+ control alt shiftl ctrll keycode 27 = Meta_Escape
+ shift control alt shiftl ctrll keycode 27 = Meta_Escape
+ altgr control alt shiftl ctrll keycode 27 = Meta_Escape
+ shift altgr control alt shiftl ctrll keycode 27 = Meta_Control_underscore
+ shift shiftr ctrll keycode 27 = braceleft
+ altgr shiftr ctrll keycode 27 = +ordfeminine
+ shift altgr shiftr ctrll keycode 27 = underscore
+ control shiftr ctrll keycode 27 = Escape
+ shift control shiftr ctrll keycode 27 = Escape
+ altgr control shiftr ctrll keycode 27 = Escape
+ shift altgr control shiftr ctrll keycode 27 = Control_underscore
+ alt shiftr ctrll keycode 27 = Meta_bracketleft
+ shift alt shiftr ctrll keycode 27 = Meta_braceleft
+ altgr alt shiftr ctrll keycode 27 = Meta_bracketleft
+ shift altgr alt shiftr ctrll keycode 27 = Meta_underscore
+ control alt shiftr ctrll keycode 27 = Meta_Escape
+ shift control alt shiftr ctrll keycode 27 = Meta_Escape
+ altgr control alt shiftr ctrll keycode 27 = Meta_Escape
+ shift altgr control alt shiftr ctrll keycode 27 = Meta_Control_underscore
+ shift shiftl shiftr ctrll keycode 27 = braceleft
+ altgr shiftl shiftr ctrll keycode 27 = +ordfeminine
+ shift altgr shiftl shiftr ctrll keycode 27 = underscore
+ control shiftl shiftr ctrll keycode 27 = Escape
+ shift control shiftl shiftr ctrll keycode 27 = Escape
+ altgr control shiftl shiftr ctrll keycode 27 = Escape
+ shift altgr control shiftl shiftr ctrll keycode 27 = Control_underscore
+ alt shiftl shiftr ctrll keycode 27 = Meta_bracketleft
+ shift alt shiftl shiftr ctrll keycode 27 = Meta_braceleft
+ altgr alt shiftl shiftr ctrll keycode 27 = Meta_bracketleft
+ shift altgr alt shiftl shiftr ctrll keycode 27 = Meta_underscore
+ control alt shiftl shiftr ctrll keycode 27 = Meta_Escape
+ shift control alt shiftl shiftr ctrll keycode 27 = Meta_Escape
+ altgr control alt shiftl shiftr ctrll keycode 27 = Meta_Escape
+ shift altgr control alt shiftl shiftr ctrll keycode 27 = Meta_Control_underscore
+keycode 28 = Return
+ control keycode 28 = Control_m
+ shift control keycode 28 = Control_m
+ altgr control keycode 28 = Control_m
+ shift altgr control keycode 28 = Control_m
+ alt keycode 28 = Meta_Control_m
+ shift alt keycode 28 = Meta_Control_m
+ altgr alt keycode 28 = Meta_Control_m
+ shift altgr alt keycode 28 = Meta_Control_m
+ control alt keycode 28 = Meta_Control_m
+ shift control alt keycode 28 = Meta_Control_m
+ altgr control alt keycode 28 = Meta_Control_m
+ shift altgr control alt keycode 28 = Meta_Control_m
+ control shiftl keycode 28 = Control_m
+ shift control shiftl keycode 28 = Control_m
+ altgr control shiftl keycode 28 = Control_m
+ shift altgr control shiftl keycode 28 = Control_m
+ alt shiftl keycode 28 = Meta_Control_m
+ shift alt shiftl keycode 28 = Meta_Control_m
+ altgr alt shiftl keycode 28 = Meta_Control_m
+ shift altgr alt shiftl keycode 28 = Meta_Control_m
+ control alt shiftl keycode 28 = Meta_Control_m
+ shift control alt shiftl keycode 28 = Meta_Control_m
+ altgr control alt shiftl keycode 28 = Meta_Control_m
+ shift altgr control alt shiftl keycode 28 = Meta_Control_m
+ control shiftr keycode 28 = Control_m
+ shift control shiftr keycode 28 = Control_m
+ altgr control shiftr keycode 28 = Control_m
+ shift altgr control shiftr keycode 28 = Control_m
+ alt shiftr keycode 28 = Meta_Control_m
+ shift alt shiftr keycode 28 = Meta_Control_m
+ altgr alt shiftr keycode 28 = Meta_Control_m
+ shift altgr alt shiftr keycode 28 = Meta_Control_m
+ control alt shiftr keycode 28 = Meta_Control_m
+ shift control alt shiftr keycode 28 = Meta_Control_m
+ altgr control alt shiftr keycode 28 = Meta_Control_m
+ shift altgr control alt shiftr keycode 28 = Meta_Control_m
+ control shiftl shiftr keycode 28 = Control_m
+ shift control shiftl shiftr keycode 28 = Control_m
+ altgr control shiftl shiftr keycode 28 = Control_m
+ shift altgr control shiftl shiftr keycode 28 = Control_m
+ alt shiftl shiftr keycode 28 = Meta_Control_m
+ shift alt shiftl shiftr keycode 28 = Meta_Control_m
+ altgr alt shiftl shiftr keycode 28 = Meta_Control_m
+ shift altgr alt shiftl shiftr keycode 28 = Meta_Control_m
+ control alt shiftl shiftr keycode 28 = Meta_Control_m
+ shift control alt shiftl shiftr keycode 28 = Meta_Control_m
+ altgr control alt shiftl shiftr keycode 28 = Meta_Control_m
+ shift altgr control alt shiftl shiftr keycode 28 = Meta_Control_m
+ control ctrll keycode 28 = Control_m
+ shift control ctrll keycode 28 = Control_m
+ altgr control ctrll keycode 28 = Control_m
+ shift altgr control ctrll keycode 28 = Control_m
+ alt ctrll keycode 28 = Meta_Control_m
+ shift alt ctrll keycode 28 = Meta_Control_m
+ altgr alt ctrll keycode 28 = Meta_Control_m
+ shift altgr alt ctrll keycode 28 = Meta_Control_m
+ control alt ctrll keycode 28 = Meta_Control_m
+ shift control alt ctrll keycode 28 = Meta_Control_m
+ altgr control alt ctrll keycode 28 = Meta_Control_m
+ shift altgr control alt ctrll keycode 28 = Meta_Control_m
+ control shiftl ctrll keycode 28 = Control_m
+ shift control shiftl ctrll keycode 28 = Control_m
+ altgr control shiftl ctrll keycode 28 = Control_m
+ shift altgr control shiftl ctrll keycode 28 = Control_m
+ alt shiftl ctrll keycode 28 = Meta_Control_m
+ shift alt shiftl ctrll keycode 28 = Meta_Control_m
+ altgr alt shiftl ctrll keycode 28 = Meta_Control_m
+ shift altgr alt shiftl ctrll keycode 28 = Meta_Control_m
+ control alt shiftl ctrll keycode 28 = Meta_Control_m
+ shift control alt shiftl ctrll keycode 28 = Meta_Control_m
+ altgr control alt shiftl ctrll keycode 28 = Meta_Control_m
+ shift altgr control alt shiftl ctrll keycode 28 = Meta_Control_m
+ control shiftr ctrll keycode 28 = Control_m
+ shift control shiftr ctrll keycode 28 = Control_m
+ altgr control shiftr ctrll keycode 28 = Control_m
+ shift altgr control shiftr ctrll keycode 28 = Control_m
+ alt shiftr ctrll keycode 28 = Meta_Control_m
+ shift alt shiftr ctrll keycode 28 = Meta_Control_m
+ altgr alt shiftr ctrll keycode 28 = Meta_Control_m
+ shift altgr alt shiftr ctrll keycode 28 = Meta_Control_m
+ control alt shiftr ctrll keycode 28 = Meta_Control_m
+ shift control alt shiftr ctrll keycode 28 = Meta_Control_m
+ altgr control alt shiftr ctrll keycode 28 = Meta_Control_m
+ shift altgr control alt shiftr ctrll keycode 28 = Meta_Control_m
+ control shiftl shiftr ctrll keycode 28 = Control_m
+ shift control shiftl shiftr ctrll keycode 28 = Control_m
+ altgr control shiftl shiftr ctrll keycode 28 = Control_m
+ shift altgr control shiftl shiftr ctrll keycode 28 = Control_m
+ alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ shift alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ altgr alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ shift altgr alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ control alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ shift control alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ altgr control alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+ shift altgr control alt shiftl shiftr ctrll keycode 28 = Meta_Control_m
+keycode 29 = Control
+keycode 30 = +a
+ shift keycode 30 = +A
+ altgr keycode 30 = +ae
+ shift altgr keycode 30 = +AE
+ control keycode 30 = Control_a
+ shift control keycode 30 = Control_a
+ altgr control keycode 30 = Control_a
+ shift altgr control keycode 30 = Control_a
+ alt keycode 30 = Meta_a
+ shift alt keycode 30 = Meta_A
+ altgr alt keycode 30 = Meta_a
+ shift altgr alt keycode 30 = Meta_A
+ control alt keycode 30 = Meta_Control_a
+ shift control alt keycode 30 = Meta_Control_a
+ altgr control alt keycode 30 = Meta_Control_a
+ shift altgr control alt keycode 30 = Meta_Control_a
+ shift shiftl keycode 30 = +A
+ altgr shiftl keycode 30 = +ae
+ shift altgr shiftl keycode 30 = +AE
+ control shiftl keycode 30 = Control_a
+ shift control shiftl keycode 30 = Control_a
+ altgr control shiftl keycode 30 = Control_a
+ shift altgr control shiftl keycode 30 = Control_a
+ alt shiftl keycode 30 = Meta_a
+ shift alt shiftl keycode 30 = Meta_A
+ altgr alt shiftl keycode 30 = Meta_a
+ shift altgr alt shiftl keycode 30 = Meta_A
+ control alt shiftl keycode 30 = Meta_Control_a
+ shift control alt shiftl keycode 30 = Meta_Control_a
+ altgr control alt shiftl keycode 30 = Meta_Control_a
+ shift altgr control alt shiftl keycode 30 = Meta_Control_a
+ shift shiftr keycode 30 = +A
+ altgr shiftr keycode 30 = +ae
+ shift altgr shiftr keycode 30 = +AE
+ control shiftr keycode 30 = Control_a
+ shift control shiftr keycode 30 = Control_a
+ altgr control shiftr keycode 30 = Control_a
+ shift altgr control shiftr keycode 30 = Control_a
+ alt shiftr keycode 30 = Meta_a
+ shift alt shiftr keycode 30 = Meta_A
+ altgr alt shiftr keycode 30 = Meta_a
+ shift altgr alt shiftr keycode 30 = Meta_A
+ control alt shiftr keycode 30 = Meta_Control_a
+ shift control alt shiftr keycode 30 = Meta_Control_a
+ altgr control alt shiftr keycode 30 = Meta_Control_a
+ shift altgr control alt shiftr keycode 30 = Meta_Control_a
+ shift shiftl shiftr keycode 30 = +A
+ altgr shiftl shiftr keycode 30 = +ae
+ shift altgr shiftl shiftr keycode 30 = +AE
+ control shiftl shiftr keycode 30 = Control_a
+ shift control shiftl shiftr keycode 30 = Control_a
+ altgr control shiftl shiftr keycode 30 = Control_a
+ shift altgr control shiftl shiftr keycode 30 = Control_a
+ alt shiftl shiftr keycode 30 = Meta_a
+ shift alt shiftl shiftr keycode 30 = Meta_A
+ altgr alt shiftl shiftr keycode 30 = Meta_a
+ shift altgr alt shiftl shiftr keycode 30 = Meta_A
+ control alt shiftl shiftr keycode 30 = Meta_Control_a
+ shift control alt shiftl shiftr keycode 30 = Meta_Control_a
+ altgr control alt shiftl shiftr keycode 30 = Meta_Control_a
+ shift altgr control alt shiftl shiftr keycode 30 = Meta_Control_a
+ ctrll keycode 30 = +A
+ altgr ctrll keycode 30 = +AE
+ shift altgr ctrll keycode 30 = +ae
+ control ctrll keycode 30 = Control_a
+ shift control ctrll keycode 30 = Control_a
+ altgr control ctrll keycode 30 = Control_a
+ shift altgr control ctrll keycode 30 = Control_a
+ alt ctrll keycode 30 = Meta_a
+ shift alt ctrll keycode 30 = Meta_A
+ altgr alt ctrll keycode 30 = Meta_a
+ shift altgr alt ctrll keycode 30 = Meta_A
+ control alt ctrll keycode 30 = Meta_Control_a
+ shift control alt ctrll keycode 30 = Meta_Control_a
+ altgr control alt ctrll keycode 30 = Meta_Control_a
+ shift altgr control alt ctrll keycode 30 = Meta_Control_a
+ shiftl ctrll keycode 30 = +A
+ altgr shiftl ctrll keycode 30 = +AE
+ shift altgr shiftl ctrll keycode 30 = +ae
+ control shiftl ctrll keycode 30 = Control_a
+ shift control shiftl ctrll keycode 30 = Control_a
+ altgr control shiftl ctrll keycode 30 = Control_a
+ shift altgr control shiftl ctrll keycode 30 = Control_a
+ alt shiftl ctrll keycode 30 = Meta_a
+ shift alt shiftl ctrll keycode 30 = Meta_A
+ altgr alt shiftl ctrll keycode 30 = Meta_a
+ shift altgr alt shiftl ctrll keycode 30 = Meta_A
+ control alt shiftl ctrll keycode 30 = Meta_Control_a
+ shift control alt shiftl ctrll keycode 30 = Meta_Control_a
+ altgr control alt shiftl ctrll keycode 30 = Meta_Control_a
+ shift altgr control alt shiftl ctrll keycode 30 = Meta_Control_a
+ shiftr ctrll keycode 30 = +A
+ altgr shiftr ctrll keycode 30 = +AE
+ shift altgr shiftr ctrll keycode 30 = +ae
+ control shiftr ctrll keycode 30 = Control_a
+ shift control shiftr ctrll keycode 30 = Control_a
+ altgr control shiftr ctrll keycode 30 = Control_a
+ shift altgr control shiftr ctrll keycode 30 = Control_a
+ alt shiftr ctrll keycode 30 = Meta_a
+ shift alt shiftr ctrll keycode 30 = Meta_A
+ altgr alt shiftr ctrll keycode 30 = Meta_a
+ shift altgr alt shiftr ctrll keycode 30 = Meta_A
+ control alt shiftr ctrll keycode 30 = Meta_Control_a
+ shift control alt shiftr ctrll keycode 30 = Meta_Control_a
+ altgr control alt shiftr ctrll keycode 30 = Meta_Control_a
+ shift altgr control alt shiftr ctrll keycode 30 = Meta_Control_a
+ shiftl shiftr ctrll keycode 30 = +A
+ altgr shiftl shiftr ctrll keycode 30 = +AE
+ shift altgr shiftl shiftr ctrll keycode 30 = +ae
+ control shiftl shiftr ctrll keycode 30 = Control_a
+ shift control shiftl shiftr ctrll keycode 30 = Control_a
+ altgr control shiftl shiftr ctrll keycode 30 = Control_a
+ shift altgr control shiftl shiftr ctrll keycode 30 = Control_a
+ alt shiftl shiftr ctrll keycode 30 = Meta_a
+ shift alt shiftl shiftr ctrll keycode 30 = Meta_A
+ altgr alt shiftl shiftr ctrll keycode 30 = Meta_a
+ shift altgr alt shiftl shiftr ctrll keycode 30 = Meta_A
+ control alt shiftl shiftr ctrll keycode 30 = Meta_Control_a
+ shift control alt shiftl shiftr ctrll keycode 30 = Meta_Control_a
+ altgr control alt shiftl shiftr ctrll keycode 30 = Meta_Control_a
+ shift altgr control alt shiftl shiftr ctrll keycode 30 = Meta_Control_a
+keycode 31 = +s
+ shift keycode 31 = +S
+ altgr keycode 31 = +ssharp
+ shift altgr keycode 31 = section
+ control keycode 31 = Control_s
+ shift control keycode 31 = Control_s
+ altgr control keycode 31 = Control_s
+ shift altgr control keycode 31 = Control_s
+ alt keycode 31 = Meta_s
+ shift alt keycode 31 = Meta_S
+ altgr alt keycode 31 = Meta_s
+ shift altgr alt keycode 31 = Meta_S
+ control alt keycode 31 = Meta_Control_s
+ shift control alt keycode 31 = Meta_Control_s
+ altgr control alt keycode 31 = Meta_Control_s
+ shift altgr control alt keycode 31 = Meta_Control_s
+ shift shiftl keycode 31 = +S
+ altgr shiftl keycode 31 = +ssharp
+ shift altgr shiftl keycode 31 = section
+ control shiftl keycode 31 = Control_s
+ shift control shiftl keycode 31 = Control_s
+ altgr control shiftl keycode 31 = Control_s
+ shift altgr control shiftl keycode 31 = Control_s
+ alt shiftl keycode 31 = Meta_s
+ shift alt shiftl keycode 31 = Meta_S
+ altgr alt shiftl keycode 31 = Meta_s
+ shift altgr alt shiftl keycode 31 = Meta_S
+ control alt shiftl keycode 31 = Meta_Control_s
+ shift control alt shiftl keycode 31 = Meta_Control_s
+ altgr control alt shiftl keycode 31 = Meta_Control_s
+ shift altgr control alt shiftl keycode 31 = Meta_Control_s
+ shift shiftr keycode 31 = +S
+ altgr shiftr keycode 31 = +ssharp
+ shift altgr shiftr keycode 31 = section
+ control shiftr keycode 31 = Control_s
+ shift control shiftr keycode 31 = Control_s
+ altgr control shiftr keycode 31 = Control_s
+ shift altgr control shiftr keycode 31 = Control_s
+ alt shiftr keycode 31 = Meta_s
+ shift alt shiftr keycode 31 = Meta_S
+ altgr alt shiftr keycode 31 = Meta_s
+ shift altgr alt shiftr keycode 31 = Meta_S
+ control alt shiftr keycode 31 = Meta_Control_s
+ shift control alt shiftr keycode 31 = Meta_Control_s
+ altgr control alt shiftr keycode 31 = Meta_Control_s
+ shift altgr control alt shiftr keycode 31 = Meta_Control_s
+ shift shiftl shiftr keycode 31 = +S
+ altgr shiftl shiftr keycode 31 = +ssharp
+ shift altgr shiftl shiftr keycode 31 = section
+ control shiftl shiftr keycode 31 = Control_s
+ shift control shiftl shiftr keycode 31 = Control_s
+ altgr control shiftl shiftr keycode 31 = Control_s
+ shift altgr control shiftl shiftr keycode 31 = Control_s
+ alt shiftl shiftr keycode 31 = Meta_s
+ shift alt shiftl shiftr keycode 31 = Meta_S
+ altgr alt shiftl shiftr keycode 31 = Meta_s
+ shift altgr alt shiftl shiftr keycode 31 = Meta_S
+ control alt shiftl shiftr keycode 31 = Meta_Control_s
+ shift control alt shiftl shiftr keycode 31 = Meta_Control_s
+ altgr control alt shiftl shiftr keycode 31 = Meta_Control_s
+ shift altgr control alt shiftl shiftr keycode 31 = Meta_Control_s
+ ctrll keycode 31 = +S
+ altgr ctrll keycode 31 = +S
+ shift altgr ctrll keycode 31 = section
+ control ctrll keycode 31 = Control_s
+ shift control ctrll keycode 31 = Control_s
+ altgr control ctrll keycode 31 = Control_s
+ shift altgr control ctrll keycode 31 = Control_s
+ alt ctrll keycode 31 = Meta_s
+ shift alt ctrll keycode 31 = Meta_S
+ altgr alt ctrll keycode 31 = Meta_s
+ shift altgr alt ctrll keycode 31 = Meta_S
+ control alt ctrll keycode 31 = Meta_Control_s
+ shift control alt ctrll keycode 31 = Meta_Control_s
+ altgr control alt ctrll keycode 31 = Meta_Control_s
+ shift altgr control alt ctrll keycode 31 = Meta_Control_s
+ shiftl ctrll keycode 31 = +S
+ altgr shiftl ctrll keycode 31 = +S
+ shift altgr shiftl ctrll keycode 31 = section
+ control shiftl ctrll keycode 31 = Control_s
+ shift control shiftl ctrll keycode 31 = Control_s
+ altgr control shiftl ctrll keycode 31 = Control_s
+ shift altgr control shiftl ctrll keycode 31 = Control_s
+ alt shiftl ctrll keycode 31 = Meta_s
+ shift alt shiftl ctrll keycode 31 = Meta_S
+ altgr alt shiftl ctrll keycode 31 = Meta_s
+ shift altgr alt shiftl ctrll keycode 31 = Meta_S
+ control alt shiftl ctrll keycode 31 = Meta_Control_s
+ shift control alt shiftl ctrll keycode 31 = Meta_Control_s
+ altgr control alt shiftl ctrll keycode 31 = Meta_Control_s
+ shift altgr control alt shiftl ctrll keycode 31 = Meta_Control_s
+ shiftr ctrll keycode 31 = +S
+ altgr shiftr ctrll keycode 31 = +S
+ shift altgr shiftr ctrll keycode 31 = section
+ control shiftr ctrll keycode 31 = Control_s
+ shift control shiftr ctrll keycode 31 = Control_s
+ altgr control shiftr ctrll keycode 31 = Control_s
+ shift altgr control shiftr ctrll keycode 31 = Control_s
+ alt shiftr ctrll keycode 31 = Meta_s
+ shift alt shiftr ctrll keycode 31 = Meta_S
+ altgr alt shiftr ctrll keycode 31 = Meta_s
+ shift altgr alt shiftr ctrll keycode 31 = Meta_S
+ control alt shiftr ctrll keycode 31 = Meta_Control_s
+ shift control alt shiftr ctrll keycode 31 = Meta_Control_s
+ altgr control alt shiftr ctrll keycode 31 = Meta_Control_s
+ shift altgr control alt shiftr ctrll keycode 31 = Meta_Control_s
+ shiftl shiftr ctrll keycode 31 = +S
+ altgr shiftl shiftr ctrll keycode 31 = +S
+ shift altgr shiftl shiftr ctrll keycode 31 = section
+ control shiftl shiftr ctrll keycode 31 = Control_s
+ shift control shiftl shiftr ctrll keycode 31 = Control_s
+ altgr control shiftl shiftr ctrll keycode 31 = Control_s
+ shift altgr control shiftl shiftr ctrll keycode 31 = Control_s
+ alt shiftl shiftr ctrll keycode 31 = Meta_s
+ shift alt shiftl shiftr ctrll keycode 31 = Meta_S
+ altgr alt shiftl shiftr ctrll keycode 31 = Meta_s
+ shift altgr alt shiftl shiftr ctrll keycode 31 = Meta_S
+ control alt shiftl shiftr ctrll keycode 31 = Meta_Control_s
+ shift control alt shiftl shiftr ctrll keycode 31 = Meta_Control_s
+ altgr control alt shiftl shiftr ctrll keycode 31 = Meta_Control_s
+ shift altgr control alt shiftl shiftr ctrll keycode 31 = Meta_Control_s
+keycode 32 = +d
+ shift keycode 32 = +D
+ altgr keycode 32 = +eth
+ shift altgr keycode 32 = +ETH
+ control keycode 32 = Control_d
+ shift control keycode 32 = Control_d
+ altgr control keycode 32 = Control_d
+ shift altgr control keycode 32 = Control_d
+ alt keycode 32 = Meta_d
+ shift alt keycode 32 = Meta_D
+ altgr alt keycode 32 = Meta_d
+ shift altgr alt keycode 32 = Meta_D
+ control alt keycode 32 = Meta_Control_d
+ shift control alt keycode 32 = Meta_Control_d
+ altgr control alt keycode 32 = Meta_Control_d
+ shift altgr control alt keycode 32 = Meta_Control_d
+ shift shiftl keycode 32 = +D
+ altgr shiftl keycode 32 = +eth
+ shift altgr shiftl keycode 32 = +ETH
+ control shiftl keycode 32 = Control_d
+ shift control shiftl keycode 32 = Control_d
+ altgr control shiftl keycode 32 = Control_d
+ shift altgr control shiftl keycode 32 = Control_d
+ alt shiftl keycode 32 = Meta_d
+ shift alt shiftl keycode 32 = Meta_D
+ altgr alt shiftl keycode 32 = Meta_d
+ shift altgr alt shiftl keycode 32 = Meta_D
+ control alt shiftl keycode 32 = Meta_Control_d
+ shift control alt shiftl keycode 32 = Meta_Control_d
+ altgr control alt shiftl keycode 32 = Meta_Control_d
+ shift altgr control alt shiftl keycode 32 = Meta_Control_d
+ shift shiftr keycode 32 = +D
+ altgr shiftr keycode 32 = +eth
+ shift altgr shiftr keycode 32 = +ETH
+ control shiftr keycode 32 = Control_d
+ shift control shiftr keycode 32 = Control_d
+ altgr control shiftr keycode 32 = Control_d
+ shift altgr control shiftr keycode 32 = Control_d
+ alt shiftr keycode 32 = Meta_d
+ shift alt shiftr keycode 32 = Meta_D
+ altgr alt shiftr keycode 32 = Meta_d
+ shift altgr alt shiftr keycode 32 = Meta_D
+ control alt shiftr keycode 32 = Meta_Control_d
+ shift control alt shiftr keycode 32 = Meta_Control_d
+ altgr control alt shiftr keycode 32 = Meta_Control_d
+ shift altgr control alt shiftr keycode 32 = Meta_Control_d
+ shift shiftl shiftr keycode 32 = +D
+ altgr shiftl shiftr keycode 32 = +eth
+ shift altgr shiftl shiftr keycode 32 = +ETH
+ control shiftl shiftr keycode 32 = Control_d
+ shift control shiftl shiftr keycode 32 = Control_d
+ altgr control shiftl shiftr keycode 32 = Control_d
+ shift altgr control shiftl shiftr keycode 32 = Control_d
+ alt shiftl shiftr keycode 32 = Meta_d
+ shift alt shiftl shiftr keycode 32 = Meta_D
+ altgr alt shiftl shiftr keycode 32 = Meta_d
+ shift altgr alt shiftl shiftr keycode 32 = Meta_D
+ control alt shiftl shiftr keycode 32 = Meta_Control_d
+ shift control alt shiftl shiftr keycode 32 = Meta_Control_d
+ altgr control alt shiftl shiftr keycode 32 = Meta_Control_d
+ shift altgr control alt shiftl shiftr keycode 32 = Meta_Control_d
+ ctrll keycode 32 = +D
+ altgr ctrll keycode 32 = +ETH
+ shift altgr ctrll keycode 32 = +eth
+ control ctrll keycode 32 = Control_d
+ shift control ctrll keycode 32 = Control_d
+ altgr control ctrll keycode 32 = Control_d
+ shift altgr control ctrll keycode 32 = Control_d
+ alt ctrll keycode 32 = Meta_d
+ shift alt ctrll keycode 32 = Meta_D
+ altgr alt ctrll keycode 32 = Meta_d
+ shift altgr alt ctrll keycode 32 = Meta_D
+ control alt ctrll keycode 32 = Meta_Control_d
+ shift control alt ctrll keycode 32 = Meta_Control_d
+ altgr control alt ctrll keycode 32 = Meta_Control_d
+ shift altgr control alt ctrll keycode 32 = Meta_Control_d
+ shiftl ctrll keycode 32 = +D
+ altgr shiftl ctrll keycode 32 = +ETH
+ shift altgr shiftl ctrll keycode 32 = +eth
+ control shiftl ctrll keycode 32 = Control_d
+ shift control shiftl ctrll keycode 32 = Control_d
+ altgr control shiftl ctrll keycode 32 = Control_d
+ shift altgr control shiftl ctrll keycode 32 = Control_d
+ alt shiftl ctrll keycode 32 = Meta_d
+ shift alt shiftl ctrll keycode 32 = Meta_D
+ altgr alt shiftl ctrll keycode 32 = Meta_d
+ shift altgr alt shiftl ctrll keycode 32 = Meta_D
+ control alt shiftl ctrll keycode 32 = Meta_Control_d
+ shift control alt shiftl ctrll keycode 32 = Meta_Control_d
+ altgr control alt shiftl ctrll keycode 32 = Meta_Control_d
+ shift altgr control alt shiftl ctrll keycode 32 = Meta_Control_d
+ shiftr ctrll keycode 32 = +D
+ altgr shiftr ctrll keycode 32 = +ETH
+ shift altgr shiftr ctrll keycode 32 = +eth
+ control shiftr ctrll keycode 32 = Control_d
+ shift control shiftr ctrll keycode 32 = Control_d
+ altgr control shiftr ctrll keycode 32 = Control_d
+ shift altgr control shiftr ctrll keycode 32 = Control_d
+ alt shiftr ctrll keycode 32 = Meta_d
+ shift alt shiftr ctrll keycode 32 = Meta_D
+ altgr alt shiftr ctrll keycode 32 = Meta_d
+ shift altgr alt shiftr ctrll keycode 32 = Meta_D
+ control alt shiftr ctrll keycode 32 = Meta_Control_d
+ shift control alt shiftr ctrll keycode 32 = Meta_Control_d
+ altgr control alt shiftr ctrll keycode 32 = Meta_Control_d
+ shift altgr control alt shiftr ctrll keycode 32 = Meta_Control_d
+ shiftl shiftr ctrll keycode 32 = +D
+ altgr shiftl shiftr ctrll keycode 32 = +ETH
+ shift altgr shiftl shiftr ctrll keycode 32 = +eth
+ control shiftl shiftr ctrll keycode 32 = Control_d
+ shift control shiftl shiftr ctrll keycode 32 = Control_d
+ altgr control shiftl shiftr ctrll keycode 32 = Control_d
+ shift altgr control shiftl shiftr ctrll keycode 32 = Control_d
+ alt shiftl shiftr ctrll keycode 32 = Meta_d
+ shift alt shiftl shiftr ctrll keycode 32 = Meta_D
+ altgr alt shiftl shiftr ctrll keycode 32 = Meta_d
+ shift altgr alt shiftl shiftr ctrll keycode 32 = Meta_D
+ control alt shiftl shiftr ctrll keycode 32 = Meta_Control_d
+ shift control alt shiftl shiftr ctrll keycode 32 = Meta_Control_d
+ altgr control alt shiftl shiftr ctrll keycode 32 = Meta_Control_d
+ shift altgr control alt shiftl shiftr ctrll keycode 32 = Meta_Control_d
+keycode 33 = +f
+ shift keycode 33 = +F
+ altgr keycode 33 = dstroke
+ shift altgr keycode 33 = +ordfeminine
+ control keycode 33 = Control_f
+ shift control keycode 33 = Control_f
+ altgr control keycode 33 = Control_f
+ shift altgr control keycode 33 = Control_f
+ alt keycode 33 = Meta_f
+ shift alt keycode 33 = Meta_F
+ altgr alt keycode 33 = Meta_f
+ shift altgr alt keycode 33 = Meta_F
+ control alt keycode 33 = Meta_Control_f
+ shift control alt keycode 33 = Meta_Control_f
+ altgr control alt keycode 33 = Meta_Control_f
+ shift altgr control alt keycode 33 = Meta_Control_f
+ shift shiftl keycode 33 = +F
+ altgr shiftl keycode 33 = dstroke
+ shift altgr shiftl keycode 33 = +ordfeminine
+ control shiftl keycode 33 = Control_f
+ shift control shiftl keycode 33 = Control_f
+ altgr control shiftl keycode 33 = Control_f
+ shift altgr control shiftl keycode 33 = Control_f
+ alt shiftl keycode 33 = Meta_f
+ shift alt shiftl keycode 33 = Meta_F
+ altgr alt shiftl keycode 33 = Meta_f
+ shift altgr alt shiftl keycode 33 = Meta_F
+ control alt shiftl keycode 33 = Meta_Control_f
+ shift control alt shiftl keycode 33 = Meta_Control_f
+ altgr control alt shiftl keycode 33 = Meta_Control_f
+ shift altgr control alt shiftl keycode 33 = Meta_Control_f
+ shift shiftr keycode 33 = +F
+ altgr shiftr keycode 33 = dstroke
+ shift altgr shiftr keycode 33 = +ordfeminine
+ control shiftr keycode 33 = Control_f
+ shift control shiftr keycode 33 = Control_f
+ altgr control shiftr keycode 33 = Control_f
+ shift altgr control shiftr keycode 33 = Control_f
+ alt shiftr keycode 33 = Meta_f
+ shift alt shiftr keycode 33 = Meta_F
+ altgr alt shiftr keycode 33 = Meta_f
+ shift altgr alt shiftr keycode 33 = Meta_F
+ control alt shiftr keycode 33 = Meta_Control_f
+ shift control alt shiftr keycode 33 = Meta_Control_f
+ altgr control alt shiftr keycode 33 = Meta_Control_f
+ shift altgr control alt shiftr keycode 33 = Meta_Control_f
+ shift shiftl shiftr keycode 33 = +F
+ altgr shiftl shiftr keycode 33 = dstroke
+ shift altgr shiftl shiftr keycode 33 = +ordfeminine
+ control shiftl shiftr keycode 33 = Control_f
+ shift control shiftl shiftr keycode 33 = Control_f
+ altgr control shiftl shiftr keycode 33 = Control_f
+ shift altgr control shiftl shiftr keycode 33 = Control_f
+ alt shiftl shiftr keycode 33 = Meta_f
+ shift alt shiftl shiftr keycode 33 = Meta_F
+ altgr alt shiftl shiftr keycode 33 = Meta_f
+ shift altgr alt shiftl shiftr keycode 33 = Meta_F
+ control alt shiftl shiftr keycode 33 = Meta_Control_f
+ shift control alt shiftl shiftr keycode 33 = Meta_Control_f
+ altgr control alt shiftl shiftr keycode 33 = Meta_Control_f
+ shift altgr control alt shiftl shiftr keycode 33 = Meta_Control_f
+ ctrll keycode 33 = +F
+ altgr ctrll keycode 33 = Dstroke
+ shift altgr ctrll keycode 33 = +ordfeminine
+ control ctrll keycode 33 = Control_f
+ shift control ctrll keycode 33 = Control_f
+ altgr control ctrll keycode 33 = Control_f
+ shift altgr control ctrll keycode 33 = Control_f
+ alt ctrll keycode 33 = Meta_f
+ shift alt ctrll keycode 33 = Meta_F
+ altgr alt ctrll keycode 33 = Meta_f
+ shift altgr alt ctrll keycode 33 = Meta_F
+ control alt ctrll keycode 33 = Meta_Control_f
+ shift control alt ctrll keycode 33 = Meta_Control_f
+ altgr control alt ctrll keycode 33 = Meta_Control_f
+ shift altgr control alt ctrll keycode 33 = Meta_Control_f
+ shiftl ctrll keycode 33 = +F
+ altgr shiftl ctrll keycode 33 = Dstroke
+ shift altgr shiftl ctrll keycode 33 = +ordfeminine
+ control shiftl ctrll keycode 33 = Control_f
+ shift control shiftl ctrll keycode 33 = Control_f
+ altgr control shiftl ctrll keycode 33 = Control_f
+ shift altgr control shiftl ctrll keycode 33 = Control_f
+ alt shiftl ctrll keycode 33 = Meta_f
+ shift alt shiftl ctrll keycode 33 = Meta_F
+ altgr alt shiftl ctrll keycode 33 = Meta_f
+ shift altgr alt shiftl ctrll keycode 33 = Meta_F
+ control alt shiftl ctrll keycode 33 = Meta_Control_f
+ shift control alt shiftl ctrll keycode 33 = Meta_Control_f
+ altgr control alt shiftl ctrll keycode 33 = Meta_Control_f
+ shift altgr control alt shiftl ctrll keycode 33 = Meta_Control_f
+ shiftr ctrll keycode 33 = +F
+ altgr shiftr ctrll keycode 33 = Dstroke
+ shift altgr shiftr ctrll keycode 33 = +ordfeminine
+ control shiftr ctrll keycode 33 = Control_f
+ shift control shiftr ctrll keycode 33 = Control_f
+ altgr control shiftr ctrll keycode 33 = Control_f
+ shift altgr control shiftr ctrll keycode 33 = Control_f
+ alt shiftr ctrll keycode 33 = Meta_f
+ shift alt shiftr ctrll keycode 33 = Meta_F
+ altgr alt shiftr ctrll keycode 33 = Meta_f
+ shift altgr alt shiftr ctrll keycode 33 = Meta_F
+ control alt shiftr ctrll keycode 33 = Meta_Control_f
+ shift control alt shiftr ctrll keycode 33 = Meta_Control_f
+ altgr control alt shiftr ctrll keycode 33 = Meta_Control_f
+ shift altgr control alt shiftr ctrll keycode 33 = Meta_Control_f
+ shiftl shiftr ctrll keycode 33 = +F
+ altgr shiftl shiftr ctrll keycode 33 = Dstroke
+ shift altgr shiftl shiftr ctrll keycode 33 = +ordfeminine
+ control shiftl shiftr ctrll keycode 33 = Control_f
+ shift control shiftl shiftr ctrll keycode 33 = Control_f
+ altgr control shiftl shiftr ctrll keycode 33 = Control_f
+ shift altgr control shiftl shiftr ctrll keycode 33 = Control_f
+ alt shiftl shiftr ctrll keycode 33 = Meta_f
+ shift alt shiftl shiftr ctrll keycode 33 = Meta_F
+ altgr alt shiftl shiftr ctrll keycode 33 = Meta_f
+ shift altgr alt shiftl shiftr ctrll keycode 33 = Meta_F
+ control alt shiftl shiftr ctrll keycode 33 = Meta_Control_f
+ shift control alt shiftl shiftr ctrll keycode 33 = Meta_Control_f
+ altgr control alt shiftl shiftr ctrll keycode 33 = Meta_Control_f
+ shift altgr control alt shiftl shiftr ctrll keycode 33 = Meta_Control_f
+keycode 34 = +g
+ shift keycode 34 = +G
+ altgr keycode 34 = eng
+ shift altgr keycode 34 = ENG
+ control keycode 34 = Control_g
+ shift control keycode 34 = Control_g
+ altgr control keycode 34 = Control_g
+ shift altgr control keycode 34 = Control_g
+ alt keycode 34 = Meta_g
+ shift alt keycode 34 = Meta_G
+ altgr alt keycode 34 = Meta_g
+ shift altgr alt keycode 34 = Meta_G
+ control alt keycode 34 = Meta_Control_g
+ shift control alt keycode 34 = Meta_Control_g
+ altgr control alt keycode 34 = Meta_Control_g
+ shift altgr control alt keycode 34 = Meta_Control_g
+ shift shiftl keycode 34 = +G
+ altgr shiftl keycode 34 = eng
+ shift altgr shiftl keycode 34 = ENG
+ control shiftl keycode 34 = Control_g
+ shift control shiftl keycode 34 = Control_g
+ altgr control shiftl keycode 34 = Control_g
+ shift altgr control shiftl keycode 34 = Control_g
+ alt shiftl keycode 34 = Meta_g
+ shift alt shiftl keycode 34 = Meta_G
+ altgr alt shiftl keycode 34 = Meta_g
+ shift altgr alt shiftl keycode 34 = Meta_G
+ control alt shiftl keycode 34 = Meta_Control_g
+ shift control alt shiftl keycode 34 = Meta_Control_g
+ altgr control alt shiftl keycode 34 = Meta_Control_g
+ shift altgr control alt shiftl keycode 34 = Meta_Control_g
+ shift shiftr keycode 34 = +G
+ altgr shiftr keycode 34 = eng
+ shift altgr shiftr keycode 34 = ENG
+ control shiftr keycode 34 = Control_g
+ shift control shiftr keycode 34 = Control_g
+ altgr control shiftr keycode 34 = Control_g
+ shift altgr control shiftr keycode 34 = Control_g
+ alt shiftr keycode 34 = Meta_g
+ shift alt shiftr keycode 34 = Meta_G
+ altgr alt shiftr keycode 34 = Meta_g
+ shift altgr alt shiftr keycode 34 = Meta_G
+ control alt shiftr keycode 34 = Meta_Control_g
+ shift control alt shiftr keycode 34 = Meta_Control_g
+ altgr control alt shiftr keycode 34 = Meta_Control_g
+ shift altgr control alt shiftr keycode 34 = Meta_Control_g
+ shift shiftl shiftr keycode 34 = +G
+ altgr shiftl shiftr keycode 34 = eng
+ shift altgr shiftl shiftr keycode 34 = ENG
+ control shiftl shiftr keycode 34 = Control_g
+ shift control shiftl shiftr keycode 34 = Control_g
+ altgr control shiftl shiftr keycode 34 = Control_g
+ shift altgr control shiftl shiftr keycode 34 = Control_g
+ alt shiftl shiftr keycode 34 = Meta_g
+ shift alt shiftl shiftr keycode 34 = Meta_G
+ altgr alt shiftl shiftr keycode 34 = Meta_g
+ shift altgr alt shiftl shiftr keycode 34 = Meta_G
+ control alt shiftl shiftr keycode 34 = Meta_Control_g
+ shift control alt shiftl shiftr keycode 34 = Meta_Control_g
+ altgr control alt shiftl shiftr keycode 34 = Meta_Control_g
+ shift altgr control alt shiftl shiftr keycode 34 = Meta_Control_g
+ ctrll keycode 34 = +G
+ altgr ctrll keycode 34 = ENG
+ shift altgr ctrll keycode 34 = eng
+ control ctrll keycode 34 = Control_g
+ shift control ctrll keycode 34 = Control_g
+ altgr control ctrll keycode 34 = Control_g
+ shift altgr control ctrll keycode 34 = Control_g
+ alt ctrll keycode 34 = Meta_g
+ shift alt ctrll keycode 34 = Meta_G
+ altgr alt ctrll keycode 34 = Meta_g
+ shift altgr alt ctrll keycode 34 = Meta_G
+ control alt ctrll keycode 34 = Meta_Control_g
+ shift control alt ctrll keycode 34 = Meta_Control_g
+ altgr control alt ctrll keycode 34 = Meta_Control_g
+ shift altgr control alt ctrll keycode 34 = Meta_Control_g
+ shiftl ctrll keycode 34 = +G
+ altgr shiftl ctrll keycode 34 = ENG
+ shift altgr shiftl ctrll keycode 34 = eng
+ control shiftl ctrll keycode 34 = Control_g
+ shift control shiftl ctrll keycode 34 = Control_g
+ altgr control shiftl ctrll keycode 34 = Control_g
+ shift altgr control shiftl ctrll keycode 34 = Control_g
+ alt shiftl ctrll keycode 34 = Meta_g
+ shift alt shiftl ctrll keycode 34 = Meta_G
+ altgr alt shiftl ctrll keycode 34 = Meta_g
+ shift altgr alt shiftl ctrll keycode 34 = Meta_G
+ control alt shiftl ctrll keycode 34 = Meta_Control_g
+ shift control alt shiftl ctrll keycode 34 = Meta_Control_g
+ altgr control alt shiftl ctrll keycode 34 = Meta_Control_g
+ shift altgr control alt shiftl ctrll keycode 34 = Meta_Control_g
+ shiftr ctrll keycode 34 = +G
+ altgr shiftr ctrll keycode 34 = ENG
+ shift altgr shiftr ctrll keycode 34 = eng
+ control shiftr ctrll keycode 34 = Control_g
+ shift control shiftr ctrll keycode 34 = Control_g
+ altgr control shiftr ctrll keycode 34 = Control_g
+ shift altgr control shiftr ctrll keycode 34 = Control_g
+ alt shiftr ctrll keycode 34 = Meta_g
+ shift alt shiftr ctrll keycode 34 = Meta_G
+ altgr alt shiftr ctrll keycode 34 = Meta_g
+ shift altgr alt shiftr ctrll keycode 34 = Meta_G
+ control alt shiftr ctrll keycode 34 = Meta_Control_g
+ shift control alt shiftr ctrll keycode 34 = Meta_Control_g
+ altgr control alt shiftr ctrll keycode 34 = Meta_Control_g
+ shift altgr control alt shiftr ctrll keycode 34 = Meta_Control_g
+ shiftl shiftr ctrll keycode 34 = +G
+ altgr shiftl shiftr ctrll keycode 34 = ENG
+ shift altgr shiftl shiftr ctrll keycode 34 = eng
+ control shiftl shiftr ctrll keycode 34 = Control_g
+ shift control shiftl shiftr ctrll keycode 34 = Control_g
+ altgr control shiftl shiftr ctrll keycode 34 = Control_g
+ shift altgr control shiftl shiftr ctrll keycode 34 = Control_g
+ alt shiftl shiftr ctrll keycode 34 = Meta_g
+ shift alt shiftl shiftr ctrll keycode 34 = Meta_G
+ altgr alt shiftl shiftr ctrll keycode 34 = Meta_g
+ shift altgr alt shiftl shiftr ctrll keycode 34 = Meta_G
+ control alt shiftl shiftr ctrll keycode 34 = Meta_Control_g
+ shift control alt shiftl shiftr ctrll keycode 34 = Meta_Control_g
+ altgr control alt shiftl shiftr ctrll keycode 34 = Meta_Control_g
+ shift altgr control alt shiftl shiftr ctrll keycode 34 = Meta_Control_g
+keycode 35 = +h
+ shift keycode 35 = +H
+ altgr keycode 35 = hstroke
+ shift altgr keycode 35 = Hstroke
+ control keycode 35 = BackSpace
+ shift control keycode 35 = BackSpace
+ altgr control keycode 35 = BackSpace
+ shift altgr control keycode 35 = BackSpace
+ alt keycode 35 = Meta_h
+ shift alt keycode 35 = Meta_H
+ altgr alt keycode 35 = Meta_h
+ shift altgr alt keycode 35 = Meta_H
+ control alt keycode 35 = Meta_BackSpace
+ shift control alt keycode 35 = Meta_BackSpace
+ altgr control alt keycode 35 = Meta_BackSpace
+ shift altgr control alt keycode 35 = Meta_BackSpace
+ shift shiftl keycode 35 = +H
+ altgr shiftl keycode 35 = hstroke
+ shift altgr shiftl keycode 35 = Hstroke
+ control shiftl keycode 35 = BackSpace
+ shift control shiftl keycode 35 = BackSpace
+ altgr control shiftl keycode 35 = BackSpace
+ shift altgr control shiftl keycode 35 = BackSpace
+ alt shiftl keycode 35 = Meta_h
+ shift alt shiftl keycode 35 = Meta_H
+ altgr alt shiftl keycode 35 = Meta_h
+ shift altgr alt shiftl keycode 35 = Meta_H
+ control alt shiftl keycode 35 = Meta_BackSpace
+ shift control alt shiftl keycode 35 = Meta_BackSpace
+ altgr control alt shiftl keycode 35 = Meta_BackSpace
+ shift altgr control alt shiftl keycode 35 = Meta_BackSpace
+ shift shiftr keycode 35 = +H
+ altgr shiftr keycode 35 = hstroke
+ shift altgr shiftr keycode 35 = Hstroke
+ control shiftr keycode 35 = BackSpace
+ shift control shiftr keycode 35 = BackSpace
+ altgr control shiftr keycode 35 = BackSpace
+ shift altgr control shiftr keycode 35 = BackSpace
+ alt shiftr keycode 35 = Meta_h
+ shift alt shiftr keycode 35 = Meta_H
+ altgr alt shiftr keycode 35 = Meta_h
+ shift altgr alt shiftr keycode 35 = Meta_H
+ control alt shiftr keycode 35 = Meta_BackSpace
+ shift control alt shiftr keycode 35 = Meta_BackSpace
+ altgr control alt shiftr keycode 35 = Meta_BackSpace
+ shift altgr control alt shiftr keycode 35 = Meta_BackSpace
+ shift shiftl shiftr keycode 35 = +H
+ altgr shiftl shiftr keycode 35 = hstroke
+ shift altgr shiftl shiftr keycode 35 = Hstroke
+ control shiftl shiftr keycode 35 = BackSpace
+ shift control shiftl shiftr keycode 35 = BackSpace
+ altgr control shiftl shiftr keycode 35 = BackSpace
+ shift altgr control shiftl shiftr keycode 35 = BackSpace
+ alt shiftl shiftr keycode 35 = Meta_h
+ shift alt shiftl shiftr keycode 35 = Meta_H
+ altgr alt shiftl shiftr keycode 35 = Meta_h
+ shift altgr alt shiftl shiftr keycode 35 = Meta_H
+ control alt shiftl shiftr keycode 35 = Meta_BackSpace
+ shift control alt shiftl shiftr keycode 35 = Meta_BackSpace
+ altgr control alt shiftl shiftr keycode 35 = Meta_BackSpace
+ shift altgr control alt shiftl shiftr keycode 35 = Meta_BackSpace
+ ctrll keycode 35 = +H
+ altgr ctrll keycode 35 = Hstroke
+ shift altgr ctrll keycode 35 = hstroke
+ control ctrll keycode 35 = BackSpace
+ shift control ctrll keycode 35 = BackSpace
+ altgr control ctrll keycode 35 = BackSpace
+ shift altgr control ctrll keycode 35 = BackSpace
+ alt ctrll keycode 35 = Meta_h
+ shift alt ctrll keycode 35 = Meta_H
+ altgr alt ctrll keycode 35 = Meta_h
+ shift altgr alt ctrll keycode 35 = Meta_H
+ control alt ctrll keycode 35 = Meta_BackSpace
+ shift control alt ctrll keycode 35 = Meta_BackSpace
+ altgr control alt ctrll keycode 35 = Meta_BackSpace
+ shift altgr control alt ctrll keycode 35 = Meta_BackSpace
+ shiftl ctrll keycode 35 = +H
+ altgr shiftl ctrll keycode 35 = Hstroke
+ shift altgr shiftl ctrll keycode 35 = hstroke
+ control shiftl ctrll keycode 35 = BackSpace
+ shift control shiftl ctrll keycode 35 = BackSpace
+ altgr control shiftl ctrll keycode 35 = BackSpace
+ shift altgr control shiftl ctrll keycode 35 = BackSpace
+ alt shiftl ctrll keycode 35 = Meta_h
+ shift alt shiftl ctrll keycode 35 = Meta_H
+ altgr alt shiftl ctrll keycode 35 = Meta_h
+ shift altgr alt shiftl ctrll keycode 35 = Meta_H
+ control alt shiftl ctrll keycode 35 = Meta_BackSpace
+ shift control alt shiftl ctrll keycode 35 = Meta_BackSpace
+ altgr control alt shiftl ctrll keycode 35 = Meta_BackSpace
+ shift altgr control alt shiftl ctrll keycode 35 = Meta_BackSpace
+ shiftr ctrll keycode 35 = +H
+ altgr shiftr ctrll keycode 35 = Hstroke
+ shift altgr shiftr ctrll keycode 35 = hstroke
+ control shiftr ctrll keycode 35 = BackSpace
+ shift control shiftr ctrll keycode 35 = BackSpace
+ altgr control shiftr ctrll keycode 35 = BackSpace
+ shift altgr control shiftr ctrll keycode 35 = BackSpace
+ alt shiftr ctrll keycode 35 = Meta_h
+ shift alt shiftr ctrll keycode 35 = Meta_H
+ altgr alt shiftr ctrll keycode 35 = Meta_h
+ shift altgr alt shiftr ctrll keycode 35 = Meta_H
+ control alt shiftr ctrll keycode 35 = Meta_BackSpace
+ shift control alt shiftr ctrll keycode 35 = Meta_BackSpace
+ altgr control alt shiftr ctrll keycode 35 = Meta_BackSpace
+ shift altgr control alt shiftr ctrll keycode 35 = Meta_BackSpace
+ shiftl shiftr ctrll keycode 35 = +H
+ altgr shiftl shiftr ctrll keycode 35 = Hstroke
+ shift altgr shiftl shiftr ctrll keycode 35 = hstroke
+ control shiftl shiftr ctrll keycode 35 = BackSpace
+ shift control shiftl shiftr ctrll keycode 35 = BackSpace
+ altgr control shiftl shiftr ctrll keycode 35 = BackSpace
+ shift altgr control shiftl shiftr ctrll keycode 35 = BackSpace
+ alt shiftl shiftr ctrll keycode 35 = Meta_h
+ shift alt shiftl shiftr ctrll keycode 35 = Meta_H
+ altgr alt shiftl shiftr ctrll keycode 35 = Meta_h
+ shift altgr alt shiftl shiftr ctrll keycode 35 = Meta_H
+ control alt shiftl shiftr ctrll keycode 35 = Meta_BackSpace
+ shift control alt shiftl shiftr ctrll keycode 35 = Meta_BackSpace
+ altgr control alt shiftl shiftr ctrll keycode 35 = Meta_BackSpace
+ shift altgr control alt shiftl shiftr ctrll keycode 35 = Meta_BackSpace
+keycode 36 = +j
+ shift keycode 36 = +J
+ altgr keycode 36 = U+0309
+ shift altgr keycode 36 = U+031b
+ control keycode 36 = Linefeed
+ shift control keycode 36 = Linefeed
+ altgr control keycode 36 = Linefeed
+ shift altgr control keycode 36 = Linefeed
+ alt keycode 36 = Meta_j
+ shift alt keycode 36 = Meta_J
+ altgr alt keycode 36 = Meta_j
+ shift altgr alt keycode 36 = Meta_J
+ control alt keycode 36 = Meta_Linefeed
+ shift control alt keycode 36 = Meta_Linefeed
+ altgr control alt keycode 36 = Meta_Linefeed
+ shift altgr control alt keycode 36 = Meta_Linefeed
+ shift shiftl keycode 36 = +J
+ altgr shiftl keycode 36 = U+0309
+ shift altgr shiftl keycode 36 = U+031b
+ control shiftl keycode 36 = Linefeed
+ shift control shiftl keycode 36 = Linefeed
+ altgr control shiftl keycode 36 = Linefeed
+ shift altgr control shiftl keycode 36 = Linefeed
+ alt shiftl keycode 36 = Meta_j
+ shift alt shiftl keycode 36 = Meta_J
+ altgr alt shiftl keycode 36 = Meta_j
+ shift altgr alt shiftl keycode 36 = Meta_J
+ control alt shiftl keycode 36 = Meta_Linefeed
+ shift control alt shiftl keycode 36 = Meta_Linefeed
+ altgr control alt shiftl keycode 36 = Meta_Linefeed
+ shift altgr control alt shiftl keycode 36 = Meta_Linefeed
+ shift shiftr keycode 36 = +J
+ altgr shiftr keycode 36 = U+0309
+ shift altgr shiftr keycode 36 = U+031b
+ control shiftr keycode 36 = Linefeed
+ shift control shiftr keycode 36 = Linefeed
+ altgr control shiftr keycode 36 = Linefeed
+ shift altgr control shiftr keycode 36 = Linefeed
+ alt shiftr keycode 36 = Meta_j
+ shift alt shiftr keycode 36 = Meta_J
+ altgr alt shiftr keycode 36 = Meta_j
+ shift altgr alt shiftr keycode 36 = Meta_J
+ control alt shiftr keycode 36 = Meta_Linefeed
+ shift control alt shiftr keycode 36 = Meta_Linefeed
+ altgr control alt shiftr keycode 36 = Meta_Linefeed
+ shift altgr control alt shiftr keycode 36 = Meta_Linefeed
+ shift shiftl shiftr keycode 36 = +J
+ altgr shiftl shiftr keycode 36 = U+0309
+ shift altgr shiftl shiftr keycode 36 = U+031b
+ control shiftl shiftr keycode 36 = Linefeed
+ shift control shiftl shiftr keycode 36 = Linefeed
+ altgr control shiftl shiftr keycode 36 = Linefeed
+ shift altgr control shiftl shiftr keycode 36 = Linefeed
+ alt shiftl shiftr keycode 36 = Meta_j
+ shift alt shiftl shiftr keycode 36 = Meta_J
+ altgr alt shiftl shiftr keycode 36 = Meta_j
+ shift altgr alt shiftl shiftr keycode 36 = Meta_J
+ control alt shiftl shiftr keycode 36 = Meta_Linefeed
+ shift control alt shiftl shiftr keycode 36 = Meta_Linefeed
+ altgr control alt shiftl shiftr keycode 36 = Meta_Linefeed
+ shift altgr control alt shiftl shiftr keycode 36 = Meta_Linefeed
+ ctrll keycode 36 = +J
+ altgr ctrll keycode 36 = U+0309
+ shift altgr ctrll keycode 36 = U+031b
+ control ctrll keycode 36 = Linefeed
+ shift control ctrll keycode 36 = Linefeed
+ altgr control ctrll keycode 36 = Linefeed
+ shift altgr control ctrll keycode 36 = Linefeed
+ alt ctrll keycode 36 = Meta_j
+ shift alt ctrll keycode 36 = Meta_J
+ altgr alt ctrll keycode 36 = Meta_j
+ shift altgr alt ctrll keycode 36 = Meta_J
+ control alt ctrll keycode 36 = Meta_Linefeed
+ shift control alt ctrll keycode 36 = Meta_Linefeed
+ altgr control alt ctrll keycode 36 = Meta_Linefeed
+ shift altgr control alt ctrll keycode 36 = Meta_Linefeed
+ shiftl ctrll keycode 36 = +J
+ altgr shiftl ctrll keycode 36 = U+0309
+ shift altgr shiftl ctrll keycode 36 = U+031b
+ control shiftl ctrll keycode 36 = Linefeed
+ shift control shiftl ctrll keycode 36 = Linefeed
+ altgr control shiftl ctrll keycode 36 = Linefeed
+ shift altgr control shiftl ctrll keycode 36 = Linefeed
+ alt shiftl ctrll keycode 36 = Meta_j
+ shift alt shiftl ctrll keycode 36 = Meta_J
+ altgr alt shiftl ctrll keycode 36 = Meta_j
+ shift altgr alt shiftl ctrll keycode 36 = Meta_J
+ control alt shiftl ctrll keycode 36 = Meta_Linefeed
+ shift control alt shiftl ctrll keycode 36 = Meta_Linefeed
+ altgr control alt shiftl ctrll keycode 36 = Meta_Linefeed
+ shift altgr control alt shiftl ctrll keycode 36 = Meta_Linefeed
+ shiftr ctrll keycode 36 = +J
+ altgr shiftr ctrll keycode 36 = U+0309
+ shift altgr shiftr ctrll keycode 36 = U+031b
+ control shiftr ctrll keycode 36 = Linefeed
+ shift control shiftr ctrll keycode 36 = Linefeed
+ altgr control shiftr ctrll keycode 36 = Linefeed
+ shift altgr control shiftr ctrll keycode 36 = Linefeed
+ alt shiftr ctrll keycode 36 = Meta_j
+ shift alt shiftr ctrll keycode 36 = Meta_J
+ altgr alt shiftr ctrll keycode 36 = Meta_j
+ shift altgr alt shiftr ctrll keycode 36 = Meta_J
+ control alt shiftr ctrll keycode 36 = Meta_Linefeed
+ shift control alt shiftr ctrll keycode 36 = Meta_Linefeed
+ altgr control alt shiftr ctrll keycode 36 = Meta_Linefeed
+ shift altgr control alt shiftr ctrll keycode 36 = Meta_Linefeed
+ shiftl shiftr ctrll keycode 36 = +J
+ altgr shiftl shiftr ctrll keycode 36 = U+0309
+ shift altgr shiftl shiftr ctrll keycode 36 = U+031b
+ control shiftl shiftr ctrll keycode 36 = Linefeed
+ shift control shiftl shiftr ctrll keycode 36 = Linefeed
+ altgr control shiftl shiftr ctrll keycode 36 = Linefeed
+ shift altgr control shiftl shiftr ctrll keycode 36 = Linefeed
+ alt shiftl shiftr ctrll keycode 36 = Meta_j
+ shift alt shiftl shiftr ctrll keycode 36 = Meta_J
+ altgr alt shiftl shiftr ctrll keycode 36 = Meta_j
+ shift altgr alt shiftl shiftr ctrll keycode 36 = Meta_J
+ control alt shiftl shiftr ctrll keycode 36 = Meta_Linefeed
+ shift control alt shiftl shiftr ctrll keycode 36 = Meta_Linefeed
+ altgr control alt shiftl shiftr ctrll keycode 36 = Meta_Linefeed
+ shift altgr control alt shiftl shiftr ctrll keycode 36 = Meta_Linefeed
+keycode 37 = +k
+ shift keycode 37 = +K
+ altgr keycode 37 = kra
+ shift altgr keycode 37 = ampersand
+ control keycode 37 = Control_k
+ shift control keycode 37 = Control_k
+ altgr control keycode 37 = Control_k
+ shift altgr control keycode 37 = Control_k
+ alt keycode 37 = Meta_k
+ shift alt keycode 37 = Meta_K
+ altgr alt keycode 37 = Meta_k
+ shift altgr alt keycode 37 = Meta_ampersand
+ control alt keycode 37 = Meta_Control_k
+ shift control alt keycode 37 = Meta_Control_k
+ altgr control alt keycode 37 = Meta_Control_k
+ shift altgr control alt keycode 37 = Meta_Control_k
+ shift shiftl keycode 37 = +K
+ altgr shiftl keycode 37 = kra
+ shift altgr shiftl keycode 37 = ampersand
+ control shiftl keycode 37 = Control_k
+ shift control shiftl keycode 37 = Control_k
+ altgr control shiftl keycode 37 = Control_k
+ shift altgr control shiftl keycode 37 = Control_k
+ alt shiftl keycode 37 = Meta_k
+ shift alt shiftl keycode 37 = Meta_K
+ altgr alt shiftl keycode 37 = Meta_k
+ shift altgr alt shiftl keycode 37 = Meta_ampersand
+ control alt shiftl keycode 37 = Meta_Control_k
+ shift control alt shiftl keycode 37 = Meta_Control_k
+ altgr control alt shiftl keycode 37 = Meta_Control_k
+ shift altgr control alt shiftl keycode 37 = Meta_Control_k
+ shift shiftr keycode 37 = +K
+ altgr shiftr keycode 37 = kra
+ shift altgr shiftr keycode 37 = ampersand
+ control shiftr keycode 37 = Control_k
+ shift control shiftr keycode 37 = Control_k
+ altgr control shiftr keycode 37 = Control_k
+ shift altgr control shiftr keycode 37 = Control_k
+ alt shiftr keycode 37 = Meta_k
+ shift alt shiftr keycode 37 = Meta_K
+ altgr alt shiftr keycode 37 = Meta_k
+ shift altgr alt shiftr keycode 37 = Meta_ampersand
+ control alt shiftr keycode 37 = Meta_Control_k
+ shift control alt shiftr keycode 37 = Meta_Control_k
+ altgr control alt shiftr keycode 37 = Meta_Control_k
+ shift altgr control alt shiftr keycode 37 = Meta_Control_k
+ shift shiftl shiftr keycode 37 = +K
+ altgr shiftl shiftr keycode 37 = kra
+ shift altgr shiftl shiftr keycode 37 = ampersand
+ control shiftl shiftr keycode 37 = Control_k
+ shift control shiftl shiftr keycode 37 = Control_k
+ altgr control shiftl shiftr keycode 37 = Control_k
+ shift altgr control shiftl shiftr keycode 37 = Control_k
+ alt shiftl shiftr keycode 37 = Meta_k
+ shift alt shiftl shiftr keycode 37 = Meta_K
+ altgr alt shiftl shiftr keycode 37 = Meta_k
+ shift altgr alt shiftl shiftr keycode 37 = Meta_ampersand
+ control alt shiftl shiftr keycode 37 = Meta_Control_k
+ shift control alt shiftl shiftr keycode 37 = Meta_Control_k
+ altgr control alt shiftl shiftr keycode 37 = Meta_Control_k
+ shift altgr control alt shiftl shiftr keycode 37 = Meta_Control_k
+ ctrll keycode 37 = +K
+ altgr ctrll keycode 37 = kra
+ shift altgr ctrll keycode 37 = ampersand
+ control ctrll keycode 37 = Control_k
+ shift control ctrll keycode 37 = Control_k
+ altgr control ctrll keycode 37 = Control_k
+ shift altgr control ctrll keycode 37 = Control_k
+ alt ctrll keycode 37 = Meta_k
+ shift alt ctrll keycode 37 = Meta_K
+ altgr alt ctrll keycode 37 = Meta_k
+ shift altgr alt ctrll keycode 37 = Meta_ampersand
+ control alt ctrll keycode 37 = Meta_Control_k
+ shift control alt ctrll keycode 37 = Meta_Control_k
+ altgr control alt ctrll keycode 37 = Meta_Control_k
+ shift altgr control alt ctrll keycode 37 = Meta_Control_k
+ shiftl ctrll keycode 37 = +K
+ altgr shiftl ctrll keycode 37 = kra
+ shift altgr shiftl ctrll keycode 37 = ampersand
+ control shiftl ctrll keycode 37 = Control_k
+ shift control shiftl ctrll keycode 37 = Control_k
+ altgr control shiftl ctrll keycode 37 = Control_k
+ shift altgr control shiftl ctrll keycode 37 = Control_k
+ alt shiftl ctrll keycode 37 = Meta_k
+ shift alt shiftl ctrll keycode 37 = Meta_K
+ altgr alt shiftl ctrll keycode 37 = Meta_k
+ shift altgr alt shiftl ctrll keycode 37 = Meta_ampersand
+ control alt shiftl ctrll keycode 37 = Meta_Control_k
+ shift control alt shiftl ctrll keycode 37 = Meta_Control_k
+ altgr control alt shiftl ctrll keycode 37 = Meta_Control_k
+ shift altgr control alt shiftl ctrll keycode 37 = Meta_Control_k
+ shiftr ctrll keycode 37 = +K
+ altgr shiftr ctrll keycode 37 = kra
+ shift altgr shiftr ctrll keycode 37 = ampersand
+ control shiftr ctrll keycode 37 = Control_k
+ shift control shiftr ctrll keycode 37 = Control_k
+ altgr control shiftr ctrll keycode 37 = Control_k
+ shift altgr control shiftr ctrll keycode 37 = Control_k
+ alt shiftr ctrll keycode 37 = Meta_k
+ shift alt shiftr ctrll keycode 37 = Meta_K
+ altgr alt shiftr ctrll keycode 37 = Meta_k
+ shift altgr alt shiftr ctrll keycode 37 = Meta_ampersand
+ control alt shiftr ctrll keycode 37 = Meta_Control_k
+ shift control alt shiftr ctrll keycode 37 = Meta_Control_k
+ altgr control alt shiftr ctrll keycode 37 = Meta_Control_k
+ shift altgr control alt shiftr ctrll keycode 37 = Meta_Control_k
+ shiftl shiftr ctrll keycode 37 = +K
+ altgr shiftl shiftr ctrll keycode 37 = kra
+ shift altgr shiftl shiftr ctrll keycode 37 = ampersand
+ control shiftl shiftr ctrll keycode 37 = Control_k
+ shift control shiftl shiftr ctrll keycode 37 = Control_k
+ altgr control shiftl shiftr ctrll keycode 37 = Control_k
+ shift altgr control shiftl shiftr ctrll keycode 37 = Control_k
+ alt shiftl shiftr ctrll keycode 37 = Meta_k
+ shift alt shiftl shiftr ctrll keycode 37 = Meta_K
+ altgr alt shiftl shiftr ctrll keycode 37 = Meta_k
+ shift altgr alt shiftl shiftr ctrll keycode 37 = Meta_ampersand
+ control alt shiftl shiftr ctrll keycode 37 = Meta_Control_k
+ shift control alt shiftl shiftr ctrll keycode 37 = Meta_Control_k
+ altgr control alt shiftl shiftr ctrll keycode 37 = Meta_Control_k
+ shift altgr control alt shiftl shiftr ctrll keycode 37 = Meta_Control_k
+keycode 38 = +l
+ shift keycode 38 = +L
+ altgr keycode 38 = lstroke
+ shift altgr keycode 38 = Lstroke
+ control keycode 38 = Control_l
+ shift control keycode 38 = Control_l
+ altgr control keycode 38 = Control_l
+ shift altgr control keycode 38 = Control_l
+ alt keycode 38 = Meta_l
+ shift alt keycode 38 = Meta_L
+ altgr alt keycode 38 = Meta_l
+ shift altgr alt keycode 38 = Meta_L
+ control alt keycode 38 = Meta_Control_l
+ shift control alt keycode 38 = Meta_Control_l
+ altgr control alt keycode 38 = Meta_Control_l
+ shift altgr control alt keycode 38 = Meta_Control_l
+ shift shiftl keycode 38 = +L
+ altgr shiftl keycode 38 = lstroke
+ shift altgr shiftl keycode 38 = Lstroke
+ control shiftl keycode 38 = Control_l
+ shift control shiftl keycode 38 = Control_l
+ altgr control shiftl keycode 38 = Control_l
+ shift altgr control shiftl keycode 38 = Control_l
+ alt shiftl keycode 38 = Meta_l
+ shift alt shiftl keycode 38 = Meta_L
+ altgr alt shiftl keycode 38 = Meta_l
+ shift altgr alt shiftl keycode 38 = Meta_L
+ control alt shiftl keycode 38 = Meta_Control_l
+ shift control alt shiftl keycode 38 = Meta_Control_l
+ altgr control alt shiftl keycode 38 = Meta_Control_l
+ shift altgr control alt shiftl keycode 38 = Meta_Control_l
+ shift shiftr keycode 38 = +L
+ altgr shiftr keycode 38 = lstroke
+ shift altgr shiftr keycode 38 = Lstroke
+ control shiftr keycode 38 = Control_l
+ shift control shiftr keycode 38 = Control_l
+ altgr control shiftr keycode 38 = Control_l
+ shift altgr control shiftr keycode 38 = Control_l
+ alt shiftr keycode 38 = Meta_l
+ shift alt shiftr keycode 38 = Meta_L
+ altgr alt shiftr keycode 38 = Meta_l
+ shift altgr alt shiftr keycode 38 = Meta_L
+ control alt shiftr keycode 38 = Meta_Control_l
+ shift control alt shiftr keycode 38 = Meta_Control_l
+ altgr control alt shiftr keycode 38 = Meta_Control_l
+ shift altgr control alt shiftr keycode 38 = Meta_Control_l
+ shift shiftl shiftr keycode 38 = +L
+ altgr shiftl shiftr keycode 38 = lstroke
+ shift altgr shiftl shiftr keycode 38 = Lstroke
+ control shiftl shiftr keycode 38 = Control_l
+ shift control shiftl shiftr keycode 38 = Control_l
+ altgr control shiftl shiftr keycode 38 = Control_l
+ shift altgr control shiftl shiftr keycode 38 = Control_l
+ alt shiftl shiftr keycode 38 = Meta_l
+ shift alt shiftl shiftr keycode 38 = Meta_L
+ altgr alt shiftl shiftr keycode 38 = Meta_l
+ shift altgr alt shiftl shiftr keycode 38 = Meta_L
+ control alt shiftl shiftr keycode 38 = Meta_Control_l
+ shift control alt shiftl shiftr keycode 38 = Meta_Control_l
+ altgr control alt shiftl shiftr keycode 38 = Meta_Control_l
+ shift altgr control alt shiftl shiftr keycode 38 = Meta_Control_l
+ ctrll keycode 38 = +L
+ altgr ctrll keycode 38 = Lstroke
+ shift altgr ctrll keycode 38 = lstroke
+ control ctrll keycode 38 = Control_l
+ shift control ctrll keycode 38 = Control_l
+ altgr control ctrll keycode 38 = Control_l
+ shift altgr control ctrll keycode 38 = Control_l
+ alt ctrll keycode 38 = Meta_l
+ shift alt ctrll keycode 38 = Meta_L
+ altgr alt ctrll keycode 38 = Meta_l
+ shift altgr alt ctrll keycode 38 = Meta_L
+ control alt ctrll keycode 38 = Meta_Control_l
+ shift control alt ctrll keycode 38 = Meta_Control_l
+ altgr control alt ctrll keycode 38 = Meta_Control_l
+ shift altgr control alt ctrll keycode 38 = Meta_Control_l
+ shiftl ctrll keycode 38 = +L
+ altgr shiftl ctrll keycode 38 = Lstroke
+ shift altgr shiftl ctrll keycode 38 = lstroke
+ control shiftl ctrll keycode 38 = Control_l
+ shift control shiftl ctrll keycode 38 = Control_l
+ altgr control shiftl ctrll keycode 38 = Control_l
+ shift altgr control shiftl ctrll keycode 38 = Control_l
+ alt shiftl ctrll keycode 38 = Meta_l
+ shift alt shiftl ctrll keycode 38 = Meta_L
+ altgr alt shiftl ctrll keycode 38 = Meta_l
+ shift altgr alt shiftl ctrll keycode 38 = Meta_L
+ control alt shiftl ctrll keycode 38 = Meta_Control_l
+ shift control alt shiftl ctrll keycode 38 = Meta_Control_l
+ altgr control alt shiftl ctrll keycode 38 = Meta_Control_l
+ shift altgr control alt shiftl ctrll keycode 38 = Meta_Control_l
+ shiftr ctrll keycode 38 = +L
+ altgr shiftr ctrll keycode 38 = Lstroke
+ shift altgr shiftr ctrll keycode 38 = lstroke
+ control shiftr ctrll keycode 38 = Control_l
+ shift control shiftr ctrll keycode 38 = Control_l
+ altgr control shiftr ctrll keycode 38 = Control_l
+ shift altgr control shiftr ctrll keycode 38 = Control_l
+ alt shiftr ctrll keycode 38 = Meta_l
+ shift alt shiftr ctrll keycode 38 = Meta_L
+ altgr alt shiftr ctrll keycode 38 = Meta_l
+ shift altgr alt shiftr ctrll keycode 38 = Meta_L
+ control alt shiftr ctrll keycode 38 = Meta_Control_l
+ shift control alt shiftr ctrll keycode 38 = Meta_Control_l
+ altgr control alt shiftr ctrll keycode 38 = Meta_Control_l
+ shift altgr control alt shiftr ctrll keycode 38 = Meta_Control_l
+ shiftl shiftr ctrll keycode 38 = +L
+ altgr shiftl shiftr ctrll keycode 38 = Lstroke
+ shift altgr shiftl shiftr ctrll keycode 38 = lstroke
+ control shiftl shiftr ctrll keycode 38 = Control_l
+ shift control shiftl shiftr ctrll keycode 38 = Control_l
+ altgr control shiftl shiftr ctrll keycode 38 = Control_l
+ shift altgr control shiftl shiftr ctrll keycode 38 = Control_l
+ alt shiftl shiftr ctrll keycode 38 = Meta_l
+ shift alt shiftl shiftr ctrll keycode 38 = Meta_L
+ altgr alt shiftl shiftr ctrll keycode 38 = Meta_l
+ shift altgr alt shiftl shiftr ctrll keycode 38 = Meta_L
+ control alt shiftl shiftr ctrll keycode 38 = Meta_Control_l
+ shift control alt shiftl shiftr ctrll keycode 38 = Meta_Control_l
+ altgr control alt shiftl shiftr ctrll keycode 38 = Meta_Control_l
+ shift altgr control alt shiftl shiftr ctrll keycode 38 = Meta_Control_l
+keycode 39 = +ccedilla
+ shift keycode 39 = +Ccedilla
+ altgr keycode 39 = dead_acute
+ shift altgr keycode 39 = dead_tilde
+ control keycode 39 = dead_acute
+ shift control keycode 39 = dead_tilde
+ altgr control keycode 39 = dead_acute
+ shift altgr control keycode 39 = dead_tilde
+ alt keycode 39 = dead_acute
+ shift alt keycode 39 = dead_tilde
+ altgr alt keycode 39 = dead_acute
+ shift altgr alt keycode 39 = dead_tilde
+ control alt keycode 39 = dead_acute
+ shift control alt keycode 39 = dead_tilde
+ altgr control alt keycode 39 = dead_acute
+ shift altgr control alt keycode 39 = dead_tilde
+ shift shiftl keycode 39 = +Ccedilla
+ altgr shiftl keycode 39 = dead_acute
+ shift altgr shiftl keycode 39 = dead_tilde
+ control shiftl keycode 39 = dead_acute
+ shift control shiftl keycode 39 = dead_tilde
+ altgr control shiftl keycode 39 = dead_acute
+ shift altgr control shiftl keycode 39 = dead_tilde
+ alt shiftl keycode 39 = dead_acute
+ shift alt shiftl keycode 39 = dead_tilde
+ altgr alt shiftl keycode 39 = dead_acute
+ shift altgr alt shiftl keycode 39 = dead_tilde
+ control alt shiftl keycode 39 = dead_acute
+ shift control alt shiftl keycode 39 = dead_tilde
+ altgr control alt shiftl keycode 39 = dead_acute
+ shift altgr control alt shiftl keycode 39 = dead_tilde
+ shift shiftr keycode 39 = +Ccedilla
+ altgr shiftr keycode 39 = dead_acute
+ shift altgr shiftr keycode 39 = dead_tilde
+ control shiftr keycode 39 = dead_acute
+ shift control shiftr keycode 39 = dead_tilde
+ altgr control shiftr keycode 39 = dead_acute
+ shift altgr control shiftr keycode 39 = dead_tilde
+ alt shiftr keycode 39 = dead_acute
+ shift alt shiftr keycode 39 = dead_tilde
+ altgr alt shiftr keycode 39 = dead_acute
+ shift altgr alt shiftr keycode 39 = dead_tilde
+ control alt shiftr keycode 39 = dead_acute
+ shift control alt shiftr keycode 39 = dead_tilde
+ altgr control alt shiftr keycode 39 = dead_acute
+ shift altgr control alt shiftr keycode 39 = dead_tilde
+ shift shiftl shiftr keycode 39 = +Ccedilla
+ altgr shiftl shiftr keycode 39 = dead_acute
+ shift altgr shiftl shiftr keycode 39 = dead_tilde
+ control shiftl shiftr keycode 39 = dead_acute
+ shift control shiftl shiftr keycode 39 = dead_tilde
+ altgr control shiftl shiftr keycode 39 = dead_acute
+ shift altgr control shiftl shiftr keycode 39 = dead_tilde
+ alt shiftl shiftr keycode 39 = dead_acute
+ shift alt shiftl shiftr keycode 39 = dead_tilde
+ altgr alt shiftl shiftr keycode 39 = dead_acute
+ shift altgr alt shiftl shiftr keycode 39 = dead_tilde
+ control alt shiftl shiftr keycode 39 = dead_acute
+ shift control alt shiftl shiftr keycode 39 = dead_tilde
+ altgr control alt shiftl shiftr keycode 39 = dead_acute
+ shift altgr control alt shiftl shiftr keycode 39 = dead_tilde
+ ctrll keycode 39 = +Ccedilla
+ altgr ctrll keycode 39 = dead_acute
+ shift altgr ctrll keycode 39 = dead_tilde
+ control ctrll keycode 39 = dead_acute
+ shift control ctrll keycode 39 = dead_tilde
+ altgr control ctrll keycode 39 = dead_acute
+ shift altgr control ctrll keycode 39 = dead_tilde
+ alt ctrll keycode 39 = dead_acute
+ shift alt ctrll keycode 39 = dead_tilde
+ altgr alt ctrll keycode 39 = dead_acute
+ shift altgr alt ctrll keycode 39 = dead_tilde
+ control alt ctrll keycode 39 = dead_acute
+ shift control alt ctrll keycode 39 = dead_tilde
+ altgr control alt ctrll keycode 39 = dead_acute
+ shift altgr control alt ctrll keycode 39 = dead_tilde
+ shiftl ctrll keycode 39 = +Ccedilla
+ altgr shiftl ctrll keycode 39 = dead_acute
+ shift altgr shiftl ctrll keycode 39 = dead_tilde
+ control shiftl ctrll keycode 39 = dead_acute
+ shift control shiftl ctrll keycode 39 = dead_tilde
+ altgr control shiftl ctrll keycode 39 = dead_acute
+ shift altgr control shiftl ctrll keycode 39 = dead_tilde
+ alt shiftl ctrll keycode 39 = dead_acute
+ shift alt shiftl ctrll keycode 39 = dead_tilde
+ altgr alt shiftl ctrll keycode 39 = dead_acute
+ shift altgr alt shiftl ctrll keycode 39 = dead_tilde
+ control alt shiftl ctrll keycode 39 = dead_acute
+ shift control alt shiftl ctrll keycode 39 = dead_tilde
+ altgr control alt shiftl ctrll keycode 39 = dead_acute
+ shift altgr control alt shiftl ctrll keycode 39 = dead_tilde
+ shiftr ctrll keycode 39 = +Ccedilla
+ altgr shiftr ctrll keycode 39 = dead_acute
+ shift altgr shiftr ctrll keycode 39 = dead_tilde
+ control shiftr ctrll keycode 39 = dead_acute
+ shift control shiftr ctrll keycode 39 = dead_tilde
+ altgr control shiftr ctrll keycode 39 = dead_acute
+ shift altgr control shiftr ctrll keycode 39 = dead_tilde
+ alt shiftr ctrll keycode 39 = dead_acute
+ shift alt shiftr ctrll keycode 39 = dead_tilde
+ altgr alt shiftr ctrll keycode 39 = dead_acute
+ shift altgr alt shiftr ctrll keycode 39 = dead_tilde
+ control alt shiftr ctrll keycode 39 = dead_acute
+ shift control alt shiftr ctrll keycode 39 = dead_tilde
+ altgr control alt shiftr ctrll keycode 39 = dead_acute
+ shift altgr control alt shiftr ctrll keycode 39 = dead_tilde
+ shiftl shiftr ctrll keycode 39 = +Ccedilla
+ altgr shiftl shiftr ctrll keycode 39 = dead_acute
+ shift altgr shiftl shiftr ctrll keycode 39 = dead_tilde
+ control shiftl shiftr ctrll keycode 39 = dead_acute
+ shift control shiftl shiftr ctrll keycode 39 = dead_tilde
+ altgr control shiftl shiftr ctrll keycode 39 = dead_acute
+ shift altgr control shiftl shiftr ctrll keycode 39 = dead_tilde
+ alt shiftl shiftr ctrll keycode 39 = dead_acute
+ shift alt shiftl shiftr ctrll keycode 39 = dead_tilde
+ altgr alt shiftl shiftr ctrll keycode 39 = dead_acute
+ shift altgr alt shiftl shiftr ctrll keycode 39 = dead_tilde
+ control alt shiftl shiftr ctrll keycode 39 = dead_acute
+ shift control alt shiftl shiftr ctrll keycode 39 = dead_tilde
+ altgr control alt shiftl shiftr ctrll keycode 39 = dead_acute
+ shift altgr control alt shiftl shiftr ctrll keycode 39 = dead_tilde
+keycode 40 = dead_tilde
+ shift keycode 40 = dead_circumflex
+ altgr keycode 40 = asciitilde
+ shift altgr keycode 40 = asciicircum
+ shift control keycode 40 = dead_circumflex
+ shift altgr control keycode 40 = Control_asciicircum
+ shift alt keycode 40 = dead_circumflex
+ altgr alt keycode 40 = Meta_asciitilde
+ shift altgr alt keycode 40 = Meta_asciicircum
+ shift control alt keycode 40 = dead_circumflex
+ shift altgr control alt keycode 40 = Meta_Control_asciicircum
+ shift shiftl keycode 40 = dead_circumflex
+ altgr shiftl keycode 40 = asciitilde
+ shift altgr shiftl keycode 40 = asciicircum
+ shift control shiftl keycode 40 = dead_circumflex
+ shift altgr control shiftl keycode 40 = Control_asciicircum
+ shift alt shiftl keycode 40 = dead_circumflex
+ altgr alt shiftl keycode 40 = Meta_asciitilde
+ shift altgr alt shiftl keycode 40 = Meta_asciicircum
+ shift control alt shiftl keycode 40 = dead_circumflex
+ shift altgr control alt shiftl keycode 40 = Meta_Control_asciicircum
+ shift shiftr keycode 40 = dead_circumflex
+ altgr shiftr keycode 40 = asciitilde
+ shift altgr shiftr keycode 40 = asciicircum
+ shift control shiftr keycode 40 = dead_circumflex
+ shift altgr control shiftr keycode 40 = Control_asciicircum
+ shift alt shiftr keycode 40 = dead_circumflex
+ altgr alt shiftr keycode 40 = Meta_asciitilde
+ shift altgr alt shiftr keycode 40 = Meta_asciicircum
+ shift control alt shiftr keycode 40 = dead_circumflex
+ shift altgr control alt shiftr keycode 40 = Meta_Control_asciicircum
+ shift shiftl shiftr keycode 40 = dead_circumflex
+ altgr shiftl shiftr keycode 40 = asciitilde
+ shift altgr shiftl shiftr keycode 40 = asciicircum
+ shift control shiftl shiftr keycode 40 = dead_circumflex
+ shift altgr control shiftl shiftr keycode 40 = Control_asciicircum
+ shift alt shiftl shiftr keycode 40 = dead_circumflex
+ altgr alt shiftl shiftr keycode 40 = Meta_asciitilde
+ shift altgr alt shiftl shiftr keycode 40 = Meta_asciicircum
+ shift control alt shiftl shiftr keycode 40 = dead_circumflex
+ shift altgr control alt shiftl shiftr keycode 40 = Meta_Control_asciicircum
+ shift ctrll keycode 40 = dead_circumflex
+ altgr ctrll keycode 40 = asciitilde
+ shift altgr ctrll keycode 40 = asciicircum
+ shift control ctrll keycode 40 = dead_circumflex
+ shift altgr control ctrll keycode 40 = Control_asciicircum
+ shift alt ctrll keycode 40 = dead_circumflex
+ altgr alt ctrll keycode 40 = Meta_asciitilde
+ shift altgr alt ctrll keycode 40 = Meta_asciicircum
+ shift control alt ctrll keycode 40 = dead_circumflex
+ shift altgr control alt ctrll keycode 40 = Meta_Control_asciicircum
+ shift shiftl ctrll keycode 40 = dead_circumflex
+ altgr shiftl ctrll keycode 40 = asciitilde
+ shift altgr shiftl ctrll keycode 40 = asciicircum
+ shift control shiftl ctrll keycode 40 = dead_circumflex
+ shift altgr control shiftl ctrll keycode 40 = Control_asciicircum
+ shift alt shiftl ctrll keycode 40 = dead_circumflex
+ altgr alt shiftl ctrll keycode 40 = Meta_asciitilde
+ shift altgr alt shiftl ctrll keycode 40 = Meta_asciicircum
+ shift control alt shiftl ctrll keycode 40 = dead_circumflex
+ shift altgr control alt shiftl ctrll keycode 40 = Meta_Control_asciicircum
+ shift shiftr ctrll keycode 40 = dead_circumflex
+ altgr shiftr ctrll keycode 40 = asciitilde
+ shift altgr shiftr ctrll keycode 40 = asciicircum
+ shift control shiftr ctrll keycode 40 = dead_circumflex
+ shift altgr control shiftr ctrll keycode 40 = Control_asciicircum
+ shift alt shiftr ctrll keycode 40 = dead_circumflex
+ altgr alt shiftr ctrll keycode 40 = Meta_asciitilde
+ shift altgr alt shiftr ctrll keycode 40 = Meta_asciicircum
+ shift control alt shiftr ctrll keycode 40 = dead_circumflex
+ shift altgr control alt shiftr ctrll keycode 40 = Meta_Control_asciicircum
+ shift shiftl shiftr ctrll keycode 40 = dead_circumflex
+ altgr shiftl shiftr ctrll keycode 40 = asciitilde
+ shift altgr shiftl shiftr ctrll keycode 40 = asciicircum
+ shift control shiftl shiftr ctrll keycode 40 = dead_circumflex
+ shift altgr control shiftl shiftr ctrll keycode 40 = Control_asciicircum
+ shift alt shiftl shiftr ctrll keycode 40 = dead_circumflex
+ altgr alt shiftl shiftr ctrll keycode 40 = Meta_asciitilde
+ shift altgr alt shiftl shiftr ctrll keycode 40 = Meta_asciicircum
+ shift control alt shiftl shiftr ctrll keycode 40 = dead_circumflex
+ shift altgr control alt shiftl shiftr ctrll keycode 40 = Meta_Control_asciicircum
+keycode 41 = apostrophe
+ shift keycode 41 = quotedbl
+ altgr keycode 41 = notsign
+ shift altgr keycode 41 = notsign
+ control keycode 41 = Control_g
+ shift control keycode 41 = Control_g
+ altgr control keycode 41 = Control_g
+ shift altgr control keycode 41 = Control_g
+ alt keycode 41 = Meta_apostrophe
+ shift alt keycode 41 = Meta_quotedbl
+ altgr alt keycode 41 = Meta_apostrophe
+ shift altgr alt keycode 41 = Meta_quotedbl
+ control alt keycode 41 = Meta_Control_g
+ shift control alt keycode 41 = Meta_Control_g
+ altgr control alt keycode 41 = Meta_Control_g
+ shift altgr control alt keycode 41 = Meta_Control_g
+ shift shiftl keycode 41 = quotedbl
+ altgr shiftl keycode 41 = notsign
+ shift altgr shiftl keycode 41 = notsign
+ control shiftl keycode 41 = Control_g
+ shift control shiftl keycode 41 = Control_g
+ altgr control shiftl keycode 41 = Control_g
+ shift altgr control shiftl keycode 41 = Control_g
+ alt shiftl keycode 41 = Meta_apostrophe
+ shift alt shiftl keycode 41 = Meta_quotedbl
+ altgr alt shiftl keycode 41 = Meta_apostrophe
+ shift altgr alt shiftl keycode 41 = Meta_quotedbl
+ control alt shiftl keycode 41 = Meta_Control_g
+ shift control alt shiftl keycode 41 = Meta_Control_g
+ altgr control alt shiftl keycode 41 = Meta_Control_g
+ shift altgr control alt shiftl keycode 41 = Meta_Control_g
+ shift shiftr keycode 41 = quotedbl
+ altgr shiftr keycode 41 = notsign
+ shift altgr shiftr keycode 41 = notsign
+ control shiftr keycode 41 = Control_g
+ shift control shiftr keycode 41 = Control_g
+ altgr control shiftr keycode 41 = Control_g
+ shift altgr control shiftr keycode 41 = Control_g
+ alt shiftr keycode 41 = Meta_apostrophe
+ shift alt shiftr keycode 41 = Meta_quotedbl
+ altgr alt shiftr keycode 41 = Meta_apostrophe
+ shift altgr alt shiftr keycode 41 = Meta_quotedbl
+ control alt shiftr keycode 41 = Meta_Control_g
+ shift control alt shiftr keycode 41 = Meta_Control_g
+ altgr control alt shiftr keycode 41 = Meta_Control_g
+ shift altgr control alt shiftr keycode 41 = Meta_Control_g
+ shift shiftl shiftr keycode 41 = quotedbl
+ altgr shiftl shiftr keycode 41 = notsign
+ shift altgr shiftl shiftr keycode 41 = notsign
+ control shiftl shiftr keycode 41 = Control_g
+ shift control shiftl shiftr keycode 41 = Control_g
+ altgr control shiftl shiftr keycode 41 = Control_g
+ shift altgr control shiftl shiftr keycode 41 = Control_g
+ alt shiftl shiftr keycode 41 = Meta_apostrophe
+ shift alt shiftl shiftr keycode 41 = Meta_quotedbl
+ altgr alt shiftl shiftr keycode 41 = Meta_apostrophe
+ shift altgr alt shiftl shiftr keycode 41 = Meta_quotedbl
+ control alt shiftl shiftr keycode 41 = Meta_Control_g
+ shift control alt shiftl shiftr keycode 41 = Meta_Control_g
+ altgr control alt shiftl shiftr keycode 41 = Meta_Control_g
+ shift altgr control alt shiftl shiftr keycode 41 = Meta_Control_g
+ shift ctrll keycode 41 = quotedbl
+ altgr ctrll keycode 41 = notsign
+ shift altgr ctrll keycode 41 = notsign
+ control ctrll keycode 41 = Control_g
+ shift control ctrll keycode 41 = Control_g
+ altgr control ctrll keycode 41 = Control_g
+ shift altgr control ctrll keycode 41 = Control_g
+ alt ctrll keycode 41 = Meta_apostrophe
+ shift alt ctrll keycode 41 = Meta_quotedbl
+ altgr alt ctrll keycode 41 = Meta_apostrophe
+ shift altgr alt ctrll keycode 41 = Meta_quotedbl
+ control alt ctrll keycode 41 = Meta_Control_g
+ shift control alt ctrll keycode 41 = Meta_Control_g
+ altgr control alt ctrll keycode 41 = Meta_Control_g
+ shift altgr control alt ctrll keycode 41 = Meta_Control_g
+ shift shiftl ctrll keycode 41 = quotedbl
+ altgr shiftl ctrll keycode 41 = notsign
+ shift altgr shiftl ctrll keycode 41 = notsign
+ control shiftl ctrll keycode 41 = Control_g
+ shift control shiftl ctrll keycode 41 = Control_g
+ altgr control shiftl ctrll keycode 41 = Control_g
+ shift altgr control shiftl ctrll keycode 41 = Control_g
+ alt shiftl ctrll keycode 41 = Meta_apostrophe
+ shift alt shiftl ctrll keycode 41 = Meta_quotedbl
+ altgr alt shiftl ctrll keycode 41 = Meta_apostrophe
+ shift altgr alt shiftl ctrll keycode 41 = Meta_quotedbl
+ control alt shiftl ctrll keycode 41 = Meta_Control_g
+ shift control alt shiftl ctrll keycode 41 = Meta_Control_g
+ altgr control alt shiftl ctrll keycode 41 = Meta_Control_g
+ shift altgr control alt shiftl ctrll keycode 41 = Meta_Control_g
+ shift shiftr ctrll keycode 41 = quotedbl
+ altgr shiftr ctrll keycode 41 = notsign
+ shift altgr shiftr ctrll keycode 41 = notsign
+ control shiftr ctrll keycode 41 = Control_g
+ shift control shiftr ctrll keycode 41 = Control_g
+ altgr control shiftr ctrll keycode 41 = Control_g
+ shift altgr control shiftr ctrll keycode 41 = Control_g
+ alt shiftr ctrll keycode 41 = Meta_apostrophe
+ shift alt shiftr ctrll keycode 41 = Meta_quotedbl
+ altgr alt shiftr ctrll keycode 41 = Meta_apostrophe
+ shift altgr alt shiftr ctrll keycode 41 = Meta_quotedbl
+ control alt shiftr ctrll keycode 41 = Meta_Control_g
+ shift control alt shiftr ctrll keycode 41 = Meta_Control_g
+ altgr control alt shiftr ctrll keycode 41 = Meta_Control_g
+ shift altgr control alt shiftr ctrll keycode 41 = Meta_Control_g
+ shift shiftl shiftr ctrll keycode 41 = quotedbl
+ altgr shiftl shiftr ctrll keycode 41 = notsign
+ shift altgr shiftl shiftr ctrll keycode 41 = notsign
+ control shiftl shiftr ctrll keycode 41 = Control_g
+ shift control shiftl shiftr ctrll keycode 41 = Control_g
+ altgr control shiftl shiftr ctrll keycode 41 = Control_g
+ shift altgr control shiftl shiftr ctrll keycode 41 = Control_g
+ alt shiftl shiftr ctrll keycode 41 = Meta_apostrophe
+ shift alt shiftl shiftr ctrll keycode 41 = Meta_quotedbl
+ altgr alt shiftl shiftr ctrll keycode 41 = Meta_apostrophe
+ shift altgr alt shiftl shiftr ctrll keycode 41 = Meta_quotedbl
+ control alt shiftl shiftr ctrll keycode 41 = Meta_Control_g
+ shift control alt shiftl shiftr ctrll keycode 41 = Meta_Control_g
+ altgr control alt shiftl shiftr ctrll keycode 41 = Meta_Control_g
+ shift altgr control alt shiftl shiftr ctrll keycode 41 = Meta_Control_g
+keycode 42 = Shift
+keycode 43 = bracketright
+ shift keycode 43 = braceright
+ altgr keycode 43 = +masculine
+ shift altgr keycode 43 = +masculine
+ control keycode 43 = Control_bracketright
+ shift control keycode 43 = Control_bracketright
+ altgr control keycode 43 = Control_bracketright
+ shift altgr control keycode 43 = Control_bracketright
+ alt keycode 43 = Meta_bracketright
+ shift alt keycode 43 = Meta_braceright
+ altgr alt keycode 43 = Meta_bracketright
+ shift altgr alt keycode 43 = Meta_braceright
+ control alt keycode 43 = Meta_Control_bracketright
+ shift control alt keycode 43 = Meta_Control_bracketright
+ altgr control alt keycode 43 = Meta_Control_bracketright
+ shift altgr control alt keycode 43 = Meta_Control_bracketright
+ shift shiftl keycode 43 = braceright
+ altgr shiftl keycode 43 = +masculine
+ shift altgr shiftl keycode 43 = +masculine
+ control shiftl keycode 43 = Control_bracketright
+ shift control shiftl keycode 43 = Control_bracketright
+ altgr control shiftl keycode 43 = Control_bracketright
+ shift altgr control shiftl keycode 43 = Control_bracketright
+ alt shiftl keycode 43 = Meta_bracketright
+ shift alt shiftl keycode 43 = Meta_braceright
+ altgr alt shiftl keycode 43 = Meta_bracketright
+ shift altgr alt shiftl keycode 43 = Meta_braceright
+ control alt shiftl keycode 43 = Meta_Control_bracketright
+ shift control alt shiftl keycode 43 = Meta_Control_bracketright
+ altgr control alt shiftl keycode 43 = Meta_Control_bracketright
+ shift altgr control alt shiftl keycode 43 = Meta_Control_bracketright
+ shift shiftr keycode 43 = braceright
+ altgr shiftr keycode 43 = +masculine
+ shift altgr shiftr keycode 43 = +masculine
+ control shiftr keycode 43 = Control_bracketright
+ shift control shiftr keycode 43 = Control_bracketright
+ altgr control shiftr keycode 43 = Control_bracketright
+ shift altgr control shiftr keycode 43 = Control_bracketright
+ alt shiftr keycode 43 = Meta_bracketright
+ shift alt shiftr keycode 43 = Meta_braceright
+ altgr alt shiftr keycode 43 = Meta_bracketright
+ shift altgr alt shiftr keycode 43 = Meta_braceright
+ control alt shiftr keycode 43 = Meta_Control_bracketright
+ shift control alt shiftr keycode 43 = Meta_Control_bracketright
+ altgr control alt shiftr keycode 43 = Meta_Control_bracketright
+ shift altgr control alt shiftr keycode 43 = Meta_Control_bracketright
+ shift shiftl shiftr keycode 43 = braceright
+ altgr shiftl shiftr keycode 43 = +masculine
+ shift altgr shiftl shiftr keycode 43 = +masculine
+ control shiftl shiftr keycode 43 = Control_bracketright
+ shift control shiftl shiftr keycode 43 = Control_bracketright
+ altgr control shiftl shiftr keycode 43 = Control_bracketright
+ shift altgr control shiftl shiftr keycode 43 = Control_bracketright
+ alt shiftl shiftr keycode 43 = Meta_bracketright
+ shift alt shiftl shiftr keycode 43 = Meta_braceright
+ altgr alt shiftl shiftr keycode 43 = Meta_bracketright
+ shift altgr alt shiftl shiftr keycode 43 = Meta_braceright
+ control alt shiftl shiftr keycode 43 = Meta_Control_bracketright
+ shift control alt shiftl shiftr keycode 43 = Meta_Control_bracketright
+ altgr control alt shiftl shiftr keycode 43 = Meta_Control_bracketright
+ shift altgr control alt shiftl shiftr keycode 43 = Meta_Control_bracketright
+ shift ctrll keycode 43 = braceright
+ altgr ctrll keycode 43 = +masculine
+ shift altgr ctrll keycode 43 = +masculine
+ control ctrll keycode 43 = Control_bracketright
+ shift control ctrll keycode 43 = Control_bracketright
+ altgr control ctrll keycode 43 = Control_bracketright
+ shift altgr control ctrll keycode 43 = Control_bracketright
+ alt ctrll keycode 43 = Meta_bracketright
+ shift alt ctrll keycode 43 = Meta_braceright
+ altgr alt ctrll keycode 43 = Meta_bracketright
+ shift altgr alt ctrll keycode 43 = Meta_braceright
+ control alt ctrll keycode 43 = Meta_Control_bracketright
+ shift control alt ctrll keycode 43 = Meta_Control_bracketright
+ altgr control alt ctrll keycode 43 = Meta_Control_bracketright
+ shift altgr control alt ctrll keycode 43 = Meta_Control_bracketright
+ shift shiftl ctrll keycode 43 = braceright
+ altgr shiftl ctrll keycode 43 = +masculine
+ shift altgr shiftl ctrll keycode 43 = +masculine
+ control shiftl ctrll keycode 43 = Control_bracketright
+ shift control shiftl ctrll keycode 43 = Control_bracketright
+ altgr control shiftl ctrll keycode 43 = Control_bracketright
+ shift altgr control shiftl ctrll keycode 43 = Control_bracketright
+ alt shiftl ctrll keycode 43 = Meta_bracketright
+ shift alt shiftl ctrll keycode 43 = Meta_braceright
+ altgr alt shiftl ctrll keycode 43 = Meta_bracketright
+ shift altgr alt shiftl ctrll keycode 43 = Meta_braceright
+ control alt shiftl ctrll keycode 43 = Meta_Control_bracketright
+ shift control alt shiftl ctrll keycode 43 = Meta_Control_bracketright
+ altgr control alt shiftl ctrll keycode 43 = Meta_Control_bracketright
+ shift altgr control alt shiftl ctrll keycode 43 = Meta_Control_bracketright
+ shift shiftr ctrll keycode 43 = braceright
+ altgr shiftr ctrll keycode 43 = +masculine
+ shift altgr shiftr ctrll keycode 43 = +masculine
+ control shiftr ctrll keycode 43 = Control_bracketright
+ shift control shiftr ctrll keycode 43 = Control_bracketright
+ altgr control shiftr ctrll keycode 43 = Control_bracketright
+ shift altgr control shiftr ctrll keycode 43 = Control_bracketright
+ alt shiftr ctrll keycode 43 = Meta_bracketright
+ shift alt shiftr ctrll keycode 43 = Meta_braceright
+ altgr alt shiftr ctrll keycode 43 = Meta_bracketright
+ shift altgr alt shiftr ctrll keycode 43 = Meta_braceright
+ control alt shiftr ctrll keycode 43 = Meta_Control_bracketright
+ shift control alt shiftr ctrll keycode 43 = Meta_Control_bracketright
+ altgr control alt shiftr ctrll keycode 43 = Meta_Control_bracketright
+ shift altgr control alt shiftr ctrll keycode 43 = Meta_Control_bracketright
+ shift shiftl shiftr ctrll keycode 43 = braceright
+ altgr shiftl shiftr ctrll keycode 43 = +masculine
+ shift altgr shiftl shiftr ctrll keycode 43 = +masculine
+ control shiftl shiftr ctrll keycode 43 = Control_bracketright
+ shift control shiftl shiftr ctrll keycode 43 = Control_bracketright
+ altgr control shiftl shiftr ctrll keycode 43 = Control_bracketright
+ shift altgr control shiftl shiftr ctrll keycode 43 = Control_bracketright
+ alt shiftl shiftr ctrll keycode 43 = Meta_bracketright
+ shift alt shiftl shiftr ctrll keycode 43 = Meta_braceright
+ altgr alt shiftl shiftr ctrll keycode 43 = Meta_bracketright
+ shift altgr alt shiftl shiftr ctrll keycode 43 = Meta_braceright
+ control alt shiftl shiftr ctrll keycode 43 = Meta_Control_bracketright
+ shift control alt shiftl shiftr ctrll keycode 43 = Meta_Control_bracketright
+ altgr control alt shiftl shiftr ctrll keycode 43 = Meta_Control_bracketright
+ shift altgr control alt shiftl shiftr ctrll keycode 43 = Meta_Control_bracketright
+keycode 44 = +z
+ shift keycode 44 = +Z
+ altgr keycode 44 = guillemotleft
+ shift altgr keycode 44 = less
+ control keycode 44 = Control_z
+ shift control keycode 44 = Control_z
+ altgr control keycode 44 = Control_z
+ shift altgr control keycode 44 = Control_z
+ alt keycode 44 = Meta_z
+ shift alt keycode 44 = Meta_Z
+ altgr alt keycode 44 = Meta_z
+ shift altgr alt keycode 44 = Meta_less
+ control alt keycode 44 = Meta_Control_z
+ shift control alt keycode 44 = Meta_Control_z
+ altgr control alt keycode 44 = Meta_Control_z
+ shift altgr control alt keycode 44 = Meta_Control_z
+ shift shiftl keycode 44 = +Z
+ altgr shiftl keycode 44 = guillemotleft
+ shift altgr shiftl keycode 44 = less
+ control shiftl keycode 44 = Control_z
+ shift control shiftl keycode 44 = Control_z
+ altgr control shiftl keycode 44 = Control_z
+ shift altgr control shiftl keycode 44 = Control_z
+ alt shiftl keycode 44 = Meta_z
+ shift alt shiftl keycode 44 = Meta_Z
+ altgr alt shiftl keycode 44 = Meta_z
+ shift altgr alt shiftl keycode 44 = Meta_less
+ control alt shiftl keycode 44 = Meta_Control_z
+ shift control alt shiftl keycode 44 = Meta_Control_z
+ altgr control alt shiftl keycode 44 = Meta_Control_z
+ shift altgr control alt shiftl keycode 44 = Meta_Control_z
+ shift shiftr keycode 44 = +Z
+ altgr shiftr keycode 44 = guillemotleft
+ shift altgr shiftr keycode 44 = less
+ control shiftr keycode 44 = Control_z
+ shift control shiftr keycode 44 = Control_z
+ altgr control shiftr keycode 44 = Control_z
+ shift altgr control shiftr keycode 44 = Control_z
+ alt shiftr keycode 44 = Meta_z
+ shift alt shiftr keycode 44 = Meta_Z
+ altgr alt shiftr keycode 44 = Meta_z
+ shift altgr alt shiftr keycode 44 = Meta_less
+ control alt shiftr keycode 44 = Meta_Control_z
+ shift control alt shiftr keycode 44 = Meta_Control_z
+ altgr control alt shiftr keycode 44 = Meta_Control_z
+ shift altgr control alt shiftr keycode 44 = Meta_Control_z
+ shift shiftl shiftr keycode 44 = +Z
+ altgr shiftl shiftr keycode 44 = guillemotleft
+ shift altgr shiftl shiftr keycode 44 = less
+ control shiftl shiftr keycode 44 = Control_z
+ shift control shiftl shiftr keycode 44 = Control_z
+ altgr control shiftl shiftr keycode 44 = Control_z
+ shift altgr control shiftl shiftr keycode 44 = Control_z
+ alt shiftl shiftr keycode 44 = Meta_z
+ shift alt shiftl shiftr keycode 44 = Meta_Z
+ altgr alt shiftl shiftr keycode 44 = Meta_z
+ shift altgr alt shiftl shiftr keycode 44 = Meta_less
+ control alt shiftl shiftr keycode 44 = Meta_Control_z
+ shift control alt shiftl shiftr keycode 44 = Meta_Control_z
+ altgr control alt shiftl shiftr keycode 44 = Meta_Control_z
+ shift altgr control alt shiftl shiftr keycode 44 = Meta_Control_z
+ ctrll keycode 44 = +Z
+ altgr ctrll keycode 44 = guillemotleft
+ shift altgr ctrll keycode 44 = less
+ control ctrll keycode 44 = Control_z
+ shift control ctrll keycode 44 = Control_z
+ altgr control ctrll keycode 44 = Control_z
+ shift altgr control ctrll keycode 44 = Control_z
+ alt ctrll keycode 44 = Meta_z
+ shift alt ctrll keycode 44 = Meta_Z
+ altgr alt ctrll keycode 44 = Meta_z
+ shift altgr alt ctrll keycode 44 = Meta_less
+ control alt ctrll keycode 44 = Meta_Control_z
+ shift control alt ctrll keycode 44 = Meta_Control_z
+ altgr control alt ctrll keycode 44 = Meta_Control_z
+ shift altgr control alt ctrll keycode 44 = Meta_Control_z
+ shiftl ctrll keycode 44 = +Z
+ altgr shiftl ctrll keycode 44 = guillemotleft
+ shift altgr shiftl ctrll keycode 44 = less
+ control shiftl ctrll keycode 44 = Control_z
+ shift control shiftl ctrll keycode 44 = Control_z
+ altgr control shiftl ctrll keycode 44 = Control_z
+ shift altgr control shiftl ctrll keycode 44 = Control_z
+ alt shiftl ctrll keycode 44 = Meta_z
+ shift alt shiftl ctrll keycode 44 = Meta_Z
+ altgr alt shiftl ctrll keycode 44 = Meta_z
+ shift altgr alt shiftl ctrll keycode 44 = Meta_less
+ control alt shiftl ctrll keycode 44 = Meta_Control_z
+ shift control alt shiftl ctrll keycode 44 = Meta_Control_z
+ altgr control alt shiftl ctrll keycode 44 = Meta_Control_z
+ shift altgr control alt shiftl ctrll keycode 44 = Meta_Control_z
+ shiftr ctrll keycode 44 = +Z
+ altgr shiftr ctrll keycode 44 = guillemotleft
+ shift altgr shiftr ctrll keycode 44 = less
+ control shiftr ctrll keycode 44 = Control_z
+ shift control shiftr ctrll keycode 44 = Control_z
+ altgr control shiftr ctrll keycode 44 = Control_z
+ shift altgr control shiftr ctrll keycode 44 = Control_z
+ alt shiftr ctrll keycode 44 = Meta_z
+ shift alt shiftr ctrll keycode 44 = Meta_Z
+ altgr alt shiftr ctrll keycode 44 = Meta_z
+ shift altgr alt shiftr ctrll keycode 44 = Meta_less
+ control alt shiftr ctrll keycode 44 = Meta_Control_z
+ shift control alt shiftr ctrll keycode 44 = Meta_Control_z
+ altgr control alt shiftr ctrll keycode 44 = Meta_Control_z
+ shift altgr control alt shiftr ctrll keycode 44 = Meta_Control_z
+ shiftl shiftr ctrll keycode 44 = +Z
+ altgr shiftl shiftr ctrll keycode 44 = guillemotleft
+ shift altgr shiftl shiftr ctrll keycode 44 = less
+ control shiftl shiftr ctrll keycode 44 = Control_z
+ shift control shiftl shiftr ctrll keycode 44 = Control_z
+ altgr control shiftl shiftr ctrll keycode 44 = Control_z
+ shift altgr control shiftl shiftr ctrll keycode 44 = Control_z
+ alt shiftl shiftr ctrll keycode 44 = Meta_z
+ shift alt shiftl shiftr ctrll keycode 44 = Meta_Z
+ altgr alt shiftl shiftr ctrll keycode 44 = Meta_z
+ shift altgr alt shiftl shiftr ctrll keycode 44 = Meta_less
+ control alt shiftl shiftr ctrll keycode 44 = Meta_Control_z
+ shift control alt shiftl shiftr ctrll keycode 44 = Meta_Control_z
+ altgr control alt shiftl shiftr ctrll keycode 44 = Meta_Control_z
+ shift altgr control alt shiftl shiftr ctrll keycode 44 = Meta_Control_z
+keycode 45 = +x
+ shift keycode 45 = +X
+ altgr keycode 45 = guillemotright
+ shift altgr keycode 45 = greater
+ control keycode 45 = Control_x
+ shift control keycode 45 = Control_x
+ altgr control keycode 45 = Control_x
+ shift altgr control keycode 45 = Control_x
+ alt keycode 45 = Meta_x
+ shift alt keycode 45 = Meta_X
+ altgr alt keycode 45 = Meta_x
+ shift altgr alt keycode 45 = Meta_greater
+ control alt keycode 45 = Meta_Control_x
+ shift control alt keycode 45 = Meta_Control_x
+ altgr control alt keycode 45 = Meta_Control_x
+ shift altgr control alt keycode 45 = Meta_Control_x
+ shift shiftl keycode 45 = +X
+ altgr shiftl keycode 45 = guillemotright
+ shift altgr shiftl keycode 45 = greater
+ control shiftl keycode 45 = Control_x
+ shift control shiftl keycode 45 = Control_x
+ altgr control shiftl keycode 45 = Control_x
+ shift altgr control shiftl keycode 45 = Control_x
+ alt shiftl keycode 45 = Meta_x
+ shift alt shiftl keycode 45 = Meta_X
+ altgr alt shiftl keycode 45 = Meta_x
+ shift altgr alt shiftl keycode 45 = Meta_greater
+ control alt shiftl keycode 45 = Meta_Control_x
+ shift control alt shiftl keycode 45 = Meta_Control_x
+ altgr control alt shiftl keycode 45 = Meta_Control_x
+ shift altgr control alt shiftl keycode 45 = Meta_Control_x
+ shift shiftr keycode 45 = +X
+ altgr shiftr keycode 45 = guillemotright
+ shift altgr shiftr keycode 45 = greater
+ control shiftr keycode 45 = Control_x
+ shift control shiftr keycode 45 = Control_x
+ altgr control shiftr keycode 45 = Control_x
+ shift altgr control shiftr keycode 45 = Control_x
+ alt shiftr keycode 45 = Meta_x
+ shift alt shiftr keycode 45 = Meta_X
+ altgr alt shiftr keycode 45 = Meta_x
+ shift altgr alt shiftr keycode 45 = Meta_greater
+ control alt shiftr keycode 45 = Meta_Control_x
+ shift control alt shiftr keycode 45 = Meta_Control_x
+ altgr control alt shiftr keycode 45 = Meta_Control_x
+ shift altgr control alt shiftr keycode 45 = Meta_Control_x
+ shift shiftl shiftr keycode 45 = +X
+ altgr shiftl shiftr keycode 45 = guillemotright
+ shift altgr shiftl shiftr keycode 45 = greater
+ control shiftl shiftr keycode 45 = Control_x
+ shift control shiftl shiftr keycode 45 = Control_x
+ altgr control shiftl shiftr keycode 45 = Control_x
+ shift altgr control shiftl shiftr keycode 45 = Control_x
+ alt shiftl shiftr keycode 45 = Meta_x
+ shift alt shiftl shiftr keycode 45 = Meta_X
+ altgr alt shiftl shiftr keycode 45 = Meta_x
+ shift altgr alt shiftl shiftr keycode 45 = Meta_greater
+ control alt shiftl shiftr keycode 45 = Meta_Control_x
+ shift control alt shiftl shiftr keycode 45 = Meta_Control_x
+ altgr control alt shiftl shiftr keycode 45 = Meta_Control_x
+ shift altgr control alt shiftl shiftr keycode 45 = Meta_Control_x
+ ctrll keycode 45 = +X
+ altgr ctrll keycode 45 = guillemotright
+ shift altgr ctrll keycode 45 = greater
+ control ctrll keycode 45 = Control_x
+ shift control ctrll keycode 45 = Control_x
+ altgr control ctrll keycode 45 = Control_x
+ shift altgr control ctrll keycode 45 = Control_x
+ alt ctrll keycode 45 = Meta_x
+ shift alt ctrll keycode 45 = Meta_X
+ altgr alt ctrll keycode 45 = Meta_x
+ shift altgr alt ctrll keycode 45 = Meta_greater
+ control alt ctrll keycode 45 = Meta_Control_x
+ shift control alt ctrll keycode 45 = Meta_Control_x
+ altgr control alt ctrll keycode 45 = Meta_Control_x
+ shift altgr control alt ctrll keycode 45 = Meta_Control_x
+ shiftl ctrll keycode 45 = +X
+ altgr shiftl ctrll keycode 45 = guillemotright
+ shift altgr shiftl ctrll keycode 45 = greater
+ control shiftl ctrll keycode 45 = Control_x
+ shift control shiftl ctrll keycode 45 = Control_x
+ altgr control shiftl ctrll keycode 45 = Control_x
+ shift altgr control shiftl ctrll keycode 45 = Control_x
+ alt shiftl ctrll keycode 45 = Meta_x
+ shift alt shiftl ctrll keycode 45 = Meta_X
+ altgr alt shiftl ctrll keycode 45 = Meta_x
+ shift altgr alt shiftl ctrll keycode 45 = Meta_greater
+ control alt shiftl ctrll keycode 45 = Meta_Control_x
+ shift control alt shiftl ctrll keycode 45 = Meta_Control_x
+ altgr control alt shiftl ctrll keycode 45 = Meta_Control_x
+ shift altgr control alt shiftl ctrll keycode 45 = Meta_Control_x
+ shiftr ctrll keycode 45 = +X
+ altgr shiftr ctrll keycode 45 = guillemotright
+ shift altgr shiftr ctrll keycode 45 = greater
+ control shiftr ctrll keycode 45 = Control_x
+ shift control shiftr ctrll keycode 45 = Control_x
+ altgr control shiftr ctrll keycode 45 = Control_x
+ shift altgr control shiftr ctrll keycode 45 = Control_x
+ alt shiftr ctrll keycode 45 = Meta_x
+ shift alt shiftr ctrll keycode 45 = Meta_X
+ altgr alt shiftr ctrll keycode 45 = Meta_x
+ shift altgr alt shiftr ctrll keycode 45 = Meta_greater
+ control alt shiftr ctrll keycode 45 = Meta_Control_x
+ shift control alt shiftr ctrll keycode 45 = Meta_Control_x
+ altgr control alt shiftr ctrll keycode 45 = Meta_Control_x
+ shift altgr control alt shiftr ctrll keycode 45 = Meta_Control_x
+ shiftl shiftr ctrll keycode 45 = +X
+ altgr shiftl shiftr ctrll keycode 45 = guillemotright
+ shift altgr shiftl shiftr ctrll keycode 45 = greater
+ control shiftl shiftr ctrll keycode 45 = Control_x
+ shift control shiftl shiftr ctrll keycode 45 = Control_x
+ altgr control shiftl shiftr ctrll keycode 45 = Control_x
+ shift altgr control shiftl shiftr ctrll keycode 45 = Control_x
+ alt shiftl shiftr ctrll keycode 45 = Meta_x
+ shift alt shiftl shiftr ctrll keycode 45 = Meta_X
+ altgr alt shiftl shiftr ctrll keycode 45 = Meta_x
+ shift altgr alt shiftl shiftr ctrll keycode 45 = Meta_greater
+ control alt shiftl shiftr ctrll keycode 45 = Meta_Control_x
+ shift control alt shiftl shiftr ctrll keycode 45 = Meta_Control_x
+ altgr control alt shiftl shiftr ctrll keycode 45 = Meta_Control_x
+ shift altgr control alt shiftl shiftr ctrll keycode 45 = Meta_Control_x
+keycode 46 = +c
+ shift keycode 46 = +C
+ altgr keycode 46 = copyright
+ shift altgr keycode 46 = copyright
+ control keycode 46 = Control_c
+ shift control keycode 46 = Control_c
+ altgr control keycode 46 = Control_c
+ shift altgr control keycode 46 = Control_c
+ alt keycode 46 = Meta_c
+ shift alt keycode 46 = Meta_C
+ altgr alt keycode 46 = Meta_c
+ shift altgr alt keycode 46 = Meta_C
+ control alt keycode 46 = Meta_Control_c
+ shift control alt keycode 46 = Meta_Control_c
+ altgr control alt keycode 46 = Meta_Control_c
+ shift altgr control alt keycode 46 = Meta_Control_c
+ shift shiftl keycode 46 = +C
+ altgr shiftl keycode 46 = copyright
+ shift altgr shiftl keycode 46 = copyright
+ control shiftl keycode 46 = Control_c
+ shift control shiftl keycode 46 = Control_c
+ altgr control shiftl keycode 46 = Control_c
+ shift altgr control shiftl keycode 46 = Control_c
+ alt shiftl keycode 46 = Meta_c
+ shift alt shiftl keycode 46 = Meta_C
+ altgr alt shiftl keycode 46 = Meta_c
+ shift altgr alt shiftl keycode 46 = Meta_C
+ control alt shiftl keycode 46 = Meta_Control_c
+ shift control alt shiftl keycode 46 = Meta_Control_c
+ altgr control alt shiftl keycode 46 = Meta_Control_c
+ shift altgr control alt shiftl keycode 46 = Meta_Control_c
+ shift shiftr keycode 46 = +C
+ altgr shiftr keycode 46 = copyright
+ shift altgr shiftr keycode 46 = copyright
+ control shiftr keycode 46 = Control_c
+ shift control shiftr keycode 46 = Control_c
+ altgr control shiftr keycode 46 = Control_c
+ shift altgr control shiftr keycode 46 = Control_c
+ alt shiftr keycode 46 = Meta_c
+ shift alt shiftr keycode 46 = Meta_C
+ altgr alt shiftr keycode 46 = Meta_c
+ shift altgr alt shiftr keycode 46 = Meta_C
+ control alt shiftr keycode 46 = Meta_Control_c
+ shift control alt shiftr keycode 46 = Meta_Control_c
+ altgr control alt shiftr keycode 46 = Meta_Control_c
+ shift altgr control alt shiftr keycode 46 = Meta_Control_c
+ shift shiftl shiftr keycode 46 = +C
+ altgr shiftl shiftr keycode 46 = copyright
+ shift altgr shiftl shiftr keycode 46 = copyright
+ control shiftl shiftr keycode 46 = Control_c
+ shift control shiftl shiftr keycode 46 = Control_c
+ altgr control shiftl shiftr keycode 46 = Control_c
+ shift altgr control shiftl shiftr keycode 46 = Control_c
+ alt shiftl shiftr keycode 46 = Meta_c
+ shift alt shiftl shiftr keycode 46 = Meta_C
+ altgr alt shiftl shiftr keycode 46 = Meta_c
+ shift altgr alt shiftl shiftr keycode 46 = Meta_C
+ control alt shiftl shiftr keycode 46 = Meta_Control_c
+ shift control alt shiftl shiftr keycode 46 = Meta_Control_c
+ altgr control alt shiftl shiftr keycode 46 = Meta_Control_c
+ shift altgr control alt shiftl shiftr keycode 46 = Meta_Control_c
+ ctrll keycode 46 = +C
+ altgr ctrll keycode 46 = copyright
+ shift altgr ctrll keycode 46 = copyright
+ control ctrll keycode 46 = Control_c
+ shift control ctrll keycode 46 = Control_c
+ altgr control ctrll keycode 46 = Control_c
+ shift altgr control ctrll keycode 46 = Control_c
+ alt ctrll keycode 46 = Meta_c
+ shift alt ctrll keycode 46 = Meta_C
+ altgr alt ctrll keycode 46 = Meta_c
+ shift altgr alt ctrll keycode 46 = Meta_C
+ control alt ctrll keycode 46 = Meta_Control_c
+ shift control alt ctrll keycode 46 = Meta_Control_c
+ altgr control alt ctrll keycode 46 = Meta_Control_c
+ shift altgr control alt ctrll keycode 46 = Meta_Control_c
+ shiftl ctrll keycode 46 = +C
+ altgr shiftl ctrll keycode 46 = copyright
+ shift altgr shiftl ctrll keycode 46 = copyright
+ control shiftl ctrll keycode 46 = Control_c
+ shift control shiftl ctrll keycode 46 = Control_c
+ altgr control shiftl ctrll keycode 46 = Control_c
+ shift altgr control shiftl ctrll keycode 46 = Control_c
+ alt shiftl ctrll keycode 46 = Meta_c
+ shift alt shiftl ctrll keycode 46 = Meta_C
+ altgr alt shiftl ctrll keycode 46 = Meta_c
+ shift altgr alt shiftl ctrll keycode 46 = Meta_C
+ control alt shiftl ctrll keycode 46 = Meta_Control_c
+ shift control alt shiftl ctrll keycode 46 = Meta_Control_c
+ altgr control alt shiftl ctrll keycode 46 = Meta_Control_c
+ shift altgr control alt shiftl ctrll keycode 46 = Meta_Control_c
+ shiftr ctrll keycode 46 = +C
+ altgr shiftr ctrll keycode 46 = copyright
+ shift altgr shiftr ctrll keycode 46 = copyright
+ control shiftr ctrll keycode 46 = Control_c
+ shift control shiftr ctrll keycode 46 = Control_c
+ altgr control shiftr ctrll keycode 46 = Control_c
+ shift altgr control shiftr ctrll keycode 46 = Control_c
+ alt shiftr ctrll keycode 46 = Meta_c
+ shift alt shiftr ctrll keycode 46 = Meta_C
+ altgr alt shiftr ctrll keycode 46 = Meta_c
+ shift altgr alt shiftr ctrll keycode 46 = Meta_C
+ control alt shiftr ctrll keycode 46 = Meta_Control_c
+ shift control alt shiftr ctrll keycode 46 = Meta_Control_c
+ altgr control alt shiftr ctrll keycode 46 = Meta_Control_c
+ shift altgr control alt shiftr ctrll keycode 46 = Meta_Control_c
+ shiftl shiftr ctrll keycode 46 = +C
+ altgr shiftl shiftr ctrll keycode 46 = copyright
+ shift altgr shiftl shiftr ctrll keycode 46 = copyright
+ control shiftl shiftr ctrll keycode 46 = Control_c
+ shift control shiftl shiftr ctrll keycode 46 = Control_c
+ altgr control shiftl shiftr ctrll keycode 46 = Control_c
+ shift altgr control shiftl shiftr ctrll keycode 46 = Control_c
+ alt shiftl shiftr ctrll keycode 46 = Meta_c
+ shift alt shiftl shiftr ctrll keycode 46 = Meta_C
+ altgr alt shiftl shiftr ctrll keycode 46 = Meta_c
+ shift altgr alt shiftl shiftr ctrll keycode 46 = Meta_C
+ control alt shiftl shiftr ctrll keycode 46 = Meta_Control_c
+ shift control alt shiftl shiftr ctrll keycode 46 = Meta_Control_c
+ altgr control alt shiftl shiftr ctrll keycode 46 = Meta_Control_c
+ shift altgr control alt shiftl shiftr ctrll keycode 46 = Meta_Control_c
+keycode 47 = +v
+ shift keycode 47 = +V
+ altgr keycode 47 = U+201c
+ shift altgr keycode 47 = U+2018
+ control keycode 47 = Control_v
+ shift control keycode 47 = Control_v
+ altgr control keycode 47 = Control_v
+ shift altgr control keycode 47 = Control_v
+ alt keycode 47 = Meta_v
+ shift alt keycode 47 = Meta_V
+ altgr alt keycode 47 = Meta_v
+ shift altgr alt keycode 47 = Meta_V
+ control alt keycode 47 = Meta_Control_v
+ shift control alt keycode 47 = Meta_Control_v
+ altgr control alt keycode 47 = Meta_Control_v
+ shift altgr control alt keycode 47 = Meta_Control_v
+ shift shiftl keycode 47 = +V
+ altgr shiftl keycode 47 = U+201c
+ shift altgr shiftl keycode 47 = U+2018
+ control shiftl keycode 47 = Control_v
+ shift control shiftl keycode 47 = Control_v
+ altgr control shiftl keycode 47 = Control_v
+ shift altgr control shiftl keycode 47 = Control_v
+ alt shiftl keycode 47 = Meta_v
+ shift alt shiftl keycode 47 = Meta_V
+ altgr alt shiftl keycode 47 = Meta_v
+ shift altgr alt shiftl keycode 47 = Meta_V
+ control alt shiftl keycode 47 = Meta_Control_v
+ shift control alt shiftl keycode 47 = Meta_Control_v
+ altgr control alt shiftl keycode 47 = Meta_Control_v
+ shift altgr control alt shiftl keycode 47 = Meta_Control_v
+ shift shiftr keycode 47 = +V
+ altgr shiftr keycode 47 = U+201c
+ shift altgr shiftr keycode 47 = U+2018
+ control shiftr keycode 47 = Control_v
+ shift control shiftr keycode 47 = Control_v
+ altgr control shiftr keycode 47 = Control_v
+ shift altgr control shiftr keycode 47 = Control_v
+ alt shiftr keycode 47 = Meta_v
+ shift alt shiftr keycode 47 = Meta_V
+ altgr alt shiftr keycode 47 = Meta_v
+ shift altgr alt shiftr keycode 47 = Meta_V
+ control alt shiftr keycode 47 = Meta_Control_v
+ shift control alt shiftr keycode 47 = Meta_Control_v
+ altgr control alt shiftr keycode 47 = Meta_Control_v
+ shift altgr control alt shiftr keycode 47 = Meta_Control_v
+ shift shiftl shiftr keycode 47 = +V
+ altgr shiftl shiftr keycode 47 = U+201c
+ shift altgr shiftl shiftr keycode 47 = U+2018
+ control shiftl shiftr keycode 47 = Control_v
+ shift control shiftl shiftr keycode 47 = Control_v
+ altgr control shiftl shiftr keycode 47 = Control_v
+ shift altgr control shiftl shiftr keycode 47 = Control_v
+ alt shiftl shiftr keycode 47 = Meta_v
+ shift alt shiftl shiftr keycode 47 = Meta_V
+ altgr alt shiftl shiftr keycode 47 = Meta_v
+ shift altgr alt shiftl shiftr keycode 47 = Meta_V
+ control alt shiftl shiftr keycode 47 = Meta_Control_v
+ shift control alt shiftl shiftr keycode 47 = Meta_Control_v
+ altgr control alt shiftl shiftr keycode 47 = Meta_Control_v
+ shift altgr control alt shiftl shiftr keycode 47 = Meta_Control_v
+ ctrll keycode 47 = +V
+ altgr ctrll keycode 47 = U+201c
+ shift altgr ctrll keycode 47 = U+2018
+ control ctrll keycode 47 = Control_v
+ shift control ctrll keycode 47 = Control_v
+ altgr control ctrll keycode 47 = Control_v
+ shift altgr control ctrll keycode 47 = Control_v
+ alt ctrll keycode 47 = Meta_v
+ shift alt ctrll keycode 47 = Meta_V
+ altgr alt ctrll keycode 47 = Meta_v
+ shift altgr alt ctrll keycode 47 = Meta_V
+ control alt ctrll keycode 47 = Meta_Control_v
+ shift control alt ctrll keycode 47 = Meta_Control_v
+ altgr control alt ctrll keycode 47 = Meta_Control_v
+ shift altgr control alt ctrll keycode 47 = Meta_Control_v
+ shiftl ctrll keycode 47 = +V
+ altgr shiftl ctrll keycode 47 = U+201c
+ shift altgr shiftl ctrll keycode 47 = U+2018
+ control shiftl ctrll keycode 47 = Control_v
+ shift control shiftl ctrll keycode 47 = Control_v
+ altgr control shiftl ctrll keycode 47 = Control_v
+ shift altgr control shiftl ctrll keycode 47 = Control_v
+ alt shiftl ctrll keycode 47 = Meta_v
+ shift alt shiftl ctrll keycode 47 = Meta_V
+ altgr alt shiftl ctrll keycode 47 = Meta_v
+ shift altgr alt shiftl ctrll keycode 47 = Meta_V
+ control alt shiftl ctrll keycode 47 = Meta_Control_v
+ shift control alt shiftl ctrll keycode 47 = Meta_Control_v
+ altgr control alt shiftl ctrll keycode 47 = Meta_Control_v
+ shift altgr control alt shiftl ctrll keycode 47 = Meta_Control_v
+ shiftr ctrll keycode 47 = +V
+ altgr shiftr ctrll keycode 47 = U+201c
+ shift altgr shiftr ctrll keycode 47 = U+2018
+ control shiftr ctrll keycode 47 = Control_v
+ shift control shiftr ctrll keycode 47 = Control_v
+ altgr control shiftr ctrll keycode 47 = Control_v
+ shift altgr control shiftr ctrll keycode 47 = Control_v
+ alt shiftr ctrll keycode 47 = Meta_v
+ shift alt shiftr ctrll keycode 47 = Meta_V
+ altgr alt shiftr ctrll keycode 47 = Meta_v
+ shift altgr alt shiftr ctrll keycode 47 = Meta_V
+ control alt shiftr ctrll keycode 47 = Meta_Control_v
+ shift control alt shiftr ctrll keycode 47 = Meta_Control_v
+ altgr control alt shiftr ctrll keycode 47 = Meta_Control_v
+ shift altgr control alt shiftr ctrll keycode 47 = Meta_Control_v
+ shiftl shiftr ctrll keycode 47 = +V
+ altgr shiftl shiftr ctrll keycode 47 = U+201c
+ shift altgr shiftl shiftr ctrll keycode 47 = U+2018
+ control shiftl shiftr ctrll keycode 47 = Control_v
+ shift control shiftl shiftr ctrll keycode 47 = Control_v
+ altgr control shiftl shiftr ctrll keycode 47 = Control_v
+ shift altgr control shiftl shiftr ctrll keycode 47 = Control_v
+ alt shiftl shiftr ctrll keycode 47 = Meta_v
+ shift alt shiftl shiftr ctrll keycode 47 = Meta_V
+ altgr alt shiftl shiftr ctrll keycode 47 = Meta_v
+ shift altgr alt shiftl shiftr ctrll keycode 47 = Meta_V
+ control alt shiftl shiftr ctrll keycode 47 = Meta_Control_v
+ shift control alt shiftl shiftr ctrll keycode 47 = Meta_Control_v
+ altgr control alt shiftl shiftr ctrll keycode 47 = Meta_Control_v
+ shift altgr control alt shiftl shiftr ctrll keycode 47 = Meta_Control_v
+keycode 48 = +b
+ shift keycode 48 = +B
+ altgr keycode 48 = U+201d
+ shift altgr keycode 48 = U+2019
+ control keycode 48 = Control_b
+ shift control keycode 48 = Control_b
+ altgr control keycode 48 = Control_b
+ shift altgr control keycode 48 = Control_b
+ alt keycode 48 = Meta_b
+ shift alt keycode 48 = Meta_B
+ altgr alt keycode 48 = Meta_b
+ shift altgr alt keycode 48 = Meta_B
+ control alt keycode 48 = Meta_Control_b
+ shift control alt keycode 48 = Meta_Control_b
+ altgr control alt keycode 48 = Meta_Control_b
+ shift altgr control alt keycode 48 = Meta_Control_b
+ shift shiftl keycode 48 = +B
+ altgr shiftl keycode 48 = U+201d
+ shift altgr shiftl keycode 48 = U+2019
+ control shiftl keycode 48 = Control_b
+ shift control shiftl keycode 48 = Control_b
+ altgr control shiftl keycode 48 = Control_b
+ shift altgr control shiftl keycode 48 = Control_b
+ alt shiftl keycode 48 = Meta_b
+ shift alt shiftl keycode 48 = Meta_B
+ altgr alt shiftl keycode 48 = Meta_b
+ shift altgr alt shiftl keycode 48 = Meta_B
+ control alt shiftl keycode 48 = Meta_Control_b
+ shift control alt shiftl keycode 48 = Meta_Control_b
+ altgr control alt shiftl keycode 48 = Meta_Control_b
+ shift altgr control alt shiftl keycode 48 = Meta_Control_b
+ shift shiftr keycode 48 = +B
+ altgr shiftr keycode 48 = U+201d
+ shift altgr shiftr keycode 48 = U+2019
+ control shiftr keycode 48 = Control_b
+ shift control shiftr keycode 48 = Control_b
+ altgr control shiftr keycode 48 = Control_b
+ shift altgr control shiftr keycode 48 = Control_b
+ alt shiftr keycode 48 = Meta_b
+ shift alt shiftr keycode 48 = Meta_B
+ altgr alt shiftr keycode 48 = Meta_b
+ shift altgr alt shiftr keycode 48 = Meta_B
+ control alt shiftr keycode 48 = Meta_Control_b
+ shift control alt shiftr keycode 48 = Meta_Control_b
+ altgr control alt shiftr keycode 48 = Meta_Control_b
+ shift altgr control alt shiftr keycode 48 = Meta_Control_b
+ shift shiftl shiftr keycode 48 = +B
+ altgr shiftl shiftr keycode 48 = U+201d
+ shift altgr shiftl shiftr keycode 48 = U+2019
+ control shiftl shiftr keycode 48 = Control_b
+ shift control shiftl shiftr keycode 48 = Control_b
+ altgr control shiftl shiftr keycode 48 = Control_b
+ shift altgr control shiftl shiftr keycode 48 = Control_b
+ alt shiftl shiftr keycode 48 = Meta_b
+ shift alt shiftl shiftr keycode 48 = Meta_B
+ altgr alt shiftl shiftr keycode 48 = Meta_b
+ shift altgr alt shiftl shiftr keycode 48 = Meta_B
+ control alt shiftl shiftr keycode 48 = Meta_Control_b
+ shift control alt shiftl shiftr keycode 48 = Meta_Control_b
+ altgr control alt shiftl shiftr keycode 48 = Meta_Control_b
+ shift altgr control alt shiftl shiftr keycode 48 = Meta_Control_b
+ ctrll keycode 48 = +B
+ altgr ctrll keycode 48 = U+201d
+ shift altgr ctrll keycode 48 = U+2019
+ control ctrll keycode 48 = Control_b
+ shift control ctrll keycode 48 = Control_b
+ altgr control ctrll keycode 48 = Control_b
+ shift altgr control ctrll keycode 48 = Control_b
+ alt ctrll keycode 48 = Meta_b
+ shift alt ctrll keycode 48 = Meta_B
+ altgr alt ctrll keycode 48 = Meta_b
+ shift altgr alt ctrll keycode 48 = Meta_B
+ control alt ctrll keycode 48 = Meta_Control_b
+ shift control alt ctrll keycode 48 = Meta_Control_b
+ altgr control alt ctrll keycode 48 = Meta_Control_b
+ shift altgr control alt ctrll keycode 48 = Meta_Control_b
+ shiftl ctrll keycode 48 = +B
+ altgr shiftl ctrll keycode 48 = U+201d
+ shift altgr shiftl ctrll keycode 48 = U+2019
+ control shiftl ctrll keycode 48 = Control_b
+ shift control shiftl ctrll keycode 48 = Control_b
+ altgr control shiftl ctrll keycode 48 = Control_b
+ shift altgr control shiftl ctrll keycode 48 = Control_b
+ alt shiftl ctrll keycode 48 = Meta_b
+ shift alt shiftl ctrll keycode 48 = Meta_B
+ altgr alt shiftl ctrll keycode 48 = Meta_b
+ shift altgr alt shiftl ctrll keycode 48 = Meta_B
+ control alt shiftl ctrll keycode 48 = Meta_Control_b
+ shift control alt shiftl ctrll keycode 48 = Meta_Control_b
+ altgr control alt shiftl ctrll keycode 48 = Meta_Control_b
+ shift altgr control alt shiftl ctrll keycode 48 = Meta_Control_b
+ shiftr ctrll keycode 48 = +B
+ altgr shiftr ctrll keycode 48 = U+201d
+ shift altgr shiftr ctrll keycode 48 = U+2019
+ control shiftr ctrll keycode 48 = Control_b
+ shift control shiftr ctrll keycode 48 = Control_b
+ altgr control shiftr ctrll keycode 48 = Control_b
+ shift altgr control shiftr ctrll keycode 48 = Control_b
+ alt shiftr ctrll keycode 48 = Meta_b
+ shift alt shiftr ctrll keycode 48 = Meta_B
+ altgr alt shiftr ctrll keycode 48 = Meta_b
+ shift altgr alt shiftr ctrll keycode 48 = Meta_B
+ control alt shiftr ctrll keycode 48 = Meta_Control_b
+ shift control alt shiftr ctrll keycode 48 = Meta_Control_b
+ altgr control alt shiftr ctrll keycode 48 = Meta_Control_b
+ shift altgr control alt shiftr ctrll keycode 48 = Meta_Control_b
+ shiftl shiftr ctrll keycode 48 = +B
+ altgr shiftl shiftr ctrll keycode 48 = U+201d
+ shift altgr shiftl shiftr ctrll keycode 48 = U+2019
+ control shiftl shiftr ctrll keycode 48 = Control_b
+ shift control shiftl shiftr ctrll keycode 48 = Control_b
+ altgr control shiftl shiftr ctrll keycode 48 = Control_b
+ shift altgr control shiftl shiftr ctrll keycode 48 = Control_b
+ alt shiftl shiftr ctrll keycode 48 = Meta_b
+ shift alt shiftl shiftr ctrll keycode 48 = Meta_B
+ altgr alt shiftl shiftr ctrll keycode 48 = Meta_b
+ shift altgr alt shiftl shiftr ctrll keycode 48 = Meta_B
+ control alt shiftl shiftr ctrll keycode 48 = Meta_Control_b
+ shift control alt shiftl shiftr ctrll keycode 48 = Meta_Control_b
+ altgr control alt shiftl shiftr ctrll keycode 48 = Meta_Control_b
+ shift altgr control alt shiftl shiftr ctrll keycode 48 = Meta_Control_b
+keycode 49 = +n
+ shift keycode 49 = +N
+ shift altgr keycode 49 = +N
+ control keycode 49 = Control_n
+ shift control keycode 49 = Control_n
+ altgr control keycode 49 = Control_n
+ shift altgr control keycode 49 = Control_n
+ alt keycode 49 = Meta_n
+ shift alt keycode 49 = Meta_N
+ altgr alt keycode 49 = Meta_n
+ shift altgr alt keycode 49 = Meta_N
+ control alt keycode 49 = Meta_Control_n
+ shift control alt keycode 49 = Meta_Control_n
+ altgr control alt keycode 49 = Meta_Control_n
+ shift altgr control alt keycode 49 = Meta_Control_n
+ shift shiftl keycode 49 = +N
+ shift altgr shiftl keycode 49 = +N
+ control shiftl keycode 49 = Control_n
+ shift control shiftl keycode 49 = Control_n
+ altgr control shiftl keycode 49 = Control_n
+ shift altgr control shiftl keycode 49 = Control_n
+ alt shiftl keycode 49 = Meta_n
+ shift alt shiftl keycode 49 = Meta_N
+ altgr alt shiftl keycode 49 = Meta_n
+ shift altgr alt shiftl keycode 49 = Meta_N
+ control alt shiftl keycode 49 = Meta_Control_n
+ shift control alt shiftl keycode 49 = Meta_Control_n
+ altgr control alt shiftl keycode 49 = Meta_Control_n
+ shift altgr control alt shiftl keycode 49 = Meta_Control_n
+ shift shiftr keycode 49 = +N
+ shift altgr shiftr keycode 49 = +N
+ control shiftr keycode 49 = Control_n
+ shift control shiftr keycode 49 = Control_n
+ altgr control shiftr keycode 49 = Control_n
+ shift altgr control shiftr keycode 49 = Control_n
+ alt shiftr keycode 49 = Meta_n
+ shift alt shiftr keycode 49 = Meta_N
+ altgr alt shiftr keycode 49 = Meta_n
+ shift altgr alt shiftr keycode 49 = Meta_N
+ control alt shiftr keycode 49 = Meta_Control_n
+ shift control alt shiftr keycode 49 = Meta_Control_n
+ altgr control alt shiftr keycode 49 = Meta_Control_n
+ shift altgr control alt shiftr keycode 49 = Meta_Control_n
+ shift shiftl shiftr keycode 49 = +N
+ shift altgr shiftl shiftr keycode 49 = +N
+ control shiftl shiftr keycode 49 = Control_n
+ shift control shiftl shiftr keycode 49 = Control_n
+ altgr control shiftl shiftr keycode 49 = Control_n
+ shift altgr control shiftl shiftr keycode 49 = Control_n
+ alt shiftl shiftr keycode 49 = Meta_n
+ shift alt shiftl shiftr keycode 49 = Meta_N
+ altgr alt shiftl shiftr keycode 49 = Meta_n
+ shift altgr alt shiftl shiftr keycode 49 = Meta_N
+ control alt shiftl shiftr keycode 49 = Meta_Control_n
+ shift control alt shiftl shiftr keycode 49 = Meta_Control_n
+ altgr control alt shiftl shiftr keycode 49 = Meta_Control_n
+ shift altgr control alt shiftl shiftr keycode 49 = Meta_Control_n
+ ctrll keycode 49 = +N
+ altgr ctrll keycode 49 = +N
+ control ctrll keycode 49 = Control_n
+ shift control ctrll keycode 49 = Control_n
+ altgr control ctrll keycode 49 = Control_n
+ shift altgr control ctrll keycode 49 = Control_n
+ alt ctrll keycode 49 = Meta_n
+ shift alt ctrll keycode 49 = Meta_N
+ altgr alt ctrll keycode 49 = Meta_n
+ shift altgr alt ctrll keycode 49 = Meta_N
+ control alt ctrll keycode 49 = Meta_Control_n
+ shift control alt ctrll keycode 49 = Meta_Control_n
+ altgr control alt ctrll keycode 49 = Meta_Control_n
+ shift altgr control alt ctrll keycode 49 = Meta_Control_n
+ shiftl ctrll keycode 49 = +N
+ altgr shiftl ctrll keycode 49 = +N
+ control shiftl ctrll keycode 49 = Control_n
+ shift control shiftl ctrll keycode 49 = Control_n
+ altgr control shiftl ctrll keycode 49 = Control_n
+ shift altgr control shiftl ctrll keycode 49 = Control_n
+ alt shiftl ctrll keycode 49 = Meta_n
+ shift alt shiftl ctrll keycode 49 = Meta_N
+ altgr alt shiftl ctrll keycode 49 = Meta_n
+ shift altgr alt shiftl ctrll keycode 49 = Meta_N
+ control alt shiftl ctrll keycode 49 = Meta_Control_n
+ shift control alt shiftl ctrll keycode 49 = Meta_Control_n
+ altgr control alt shiftl ctrll keycode 49 = Meta_Control_n
+ shift altgr control alt shiftl ctrll keycode 49 = Meta_Control_n
+ shiftr ctrll keycode 49 = +N
+ altgr shiftr ctrll keycode 49 = +N
+ control shiftr ctrll keycode 49 = Control_n
+ shift control shiftr ctrll keycode 49 = Control_n
+ altgr control shiftr ctrll keycode 49 = Control_n
+ shift altgr control shiftr ctrll keycode 49 = Control_n
+ alt shiftr ctrll keycode 49 = Meta_n
+ shift alt shiftr ctrll keycode 49 = Meta_N
+ altgr alt shiftr ctrll keycode 49 = Meta_n
+ shift altgr alt shiftr ctrll keycode 49 = Meta_N
+ control alt shiftr ctrll keycode 49 = Meta_Control_n
+ shift control alt shiftr ctrll keycode 49 = Meta_Control_n
+ altgr control alt shiftr ctrll keycode 49 = Meta_Control_n
+ shift altgr control alt shiftr ctrll keycode 49 = Meta_Control_n
+ shiftl shiftr ctrll keycode 49 = +N
+ altgr shiftl shiftr ctrll keycode 49 = +N
+ control shiftl shiftr ctrll keycode 49 = Control_n
+ shift control shiftl shiftr ctrll keycode 49 = Control_n
+ altgr control shiftl shiftr ctrll keycode 49 = Control_n
+ shift altgr control shiftl shiftr ctrll keycode 49 = Control_n
+ alt shiftl shiftr ctrll keycode 49 = Meta_n
+ shift alt shiftl shiftr ctrll keycode 49 = Meta_N
+ altgr alt shiftl shiftr ctrll keycode 49 = Meta_n
+ shift altgr alt shiftl shiftr ctrll keycode 49 = Meta_N
+ control alt shiftl shiftr ctrll keycode 49 = Meta_Control_n
+ shift control alt shiftl shiftr ctrll keycode 49 = Meta_Control_n
+ altgr control alt shiftl shiftr ctrll keycode 49 = Meta_Control_n
+ shift altgr control alt shiftl shiftr ctrll keycode 49 = Meta_Control_n
+keycode 50 = +m
+ shift keycode 50 = +M
+ altgr keycode 50 = +mu
+ shift altgr keycode 50 = +mu
+ control keycode 50 = Control_m
+ shift control keycode 50 = Control_m
+ altgr control keycode 50 = Control_m
+ shift altgr control keycode 50 = Control_m
+ alt keycode 50 = Meta_m
+ shift alt keycode 50 = Meta_M
+ altgr alt keycode 50 = Meta_m
+ shift altgr alt keycode 50 = Meta_M
+ control alt keycode 50 = Meta_Control_m
+ shift control alt keycode 50 = Meta_Control_m
+ altgr control alt keycode 50 = Meta_Control_m
+ shift altgr control alt keycode 50 = Meta_Control_m
+ shift shiftl keycode 50 = +M
+ altgr shiftl keycode 50 = +mu
+ shift altgr shiftl keycode 50 = +mu
+ control shiftl keycode 50 = Control_m
+ shift control shiftl keycode 50 = Control_m
+ altgr control shiftl keycode 50 = Control_m
+ shift altgr control shiftl keycode 50 = Control_m
+ alt shiftl keycode 50 = Meta_m
+ shift alt shiftl keycode 50 = Meta_M
+ altgr alt shiftl keycode 50 = Meta_m
+ shift altgr alt shiftl keycode 50 = Meta_M
+ control alt shiftl keycode 50 = Meta_Control_m
+ shift control alt shiftl keycode 50 = Meta_Control_m
+ altgr control alt shiftl keycode 50 = Meta_Control_m
+ shift altgr control alt shiftl keycode 50 = Meta_Control_m
+ shift shiftr keycode 50 = +M
+ altgr shiftr keycode 50 = +mu
+ shift altgr shiftr keycode 50 = +mu
+ control shiftr keycode 50 = Control_m
+ shift control shiftr keycode 50 = Control_m
+ altgr control shiftr keycode 50 = Control_m
+ shift altgr control shiftr keycode 50 = Control_m
+ alt shiftr keycode 50 = Meta_m
+ shift alt shiftr keycode 50 = Meta_M
+ altgr alt shiftr keycode 50 = Meta_m
+ shift altgr alt shiftr keycode 50 = Meta_M
+ control alt shiftr keycode 50 = Meta_Control_m
+ shift control alt shiftr keycode 50 = Meta_Control_m
+ altgr control alt shiftr keycode 50 = Meta_Control_m
+ shift altgr control alt shiftr keycode 50 = Meta_Control_m
+ shift shiftl shiftr keycode 50 = +M
+ altgr shiftl shiftr keycode 50 = +mu
+ shift altgr shiftl shiftr keycode 50 = +mu
+ control shiftl shiftr keycode 50 = Control_m
+ shift control shiftl shiftr keycode 50 = Control_m
+ altgr control shiftl shiftr keycode 50 = Control_m
+ shift altgr control shiftl shiftr keycode 50 = Control_m
+ alt shiftl shiftr keycode 50 = Meta_m
+ shift alt shiftl shiftr keycode 50 = Meta_M
+ altgr alt shiftl shiftr keycode 50 = Meta_m
+ shift altgr alt shiftl shiftr keycode 50 = Meta_M
+ control alt shiftl shiftr keycode 50 = Meta_Control_m
+ shift control alt shiftl shiftr keycode 50 = Meta_Control_m
+ altgr control alt shiftl shiftr keycode 50 = Meta_Control_m
+ shift altgr control alt shiftl shiftr keycode 50 = Meta_Control_m
+ ctrll keycode 50 = +M
+ altgr ctrll keycode 50 = Mu
+ shift altgr ctrll keycode 50 = Mu
+ control ctrll keycode 50 = Control_m
+ shift control ctrll keycode 50 = Control_m
+ altgr control ctrll keycode 50 = Control_m
+ shift altgr control ctrll keycode 50 = Control_m
+ alt ctrll keycode 50 = Meta_m
+ shift alt ctrll keycode 50 = Meta_M
+ altgr alt ctrll keycode 50 = Meta_m
+ shift altgr alt ctrll keycode 50 = Meta_M
+ control alt ctrll keycode 50 = Meta_Control_m
+ shift control alt ctrll keycode 50 = Meta_Control_m
+ altgr control alt ctrll keycode 50 = Meta_Control_m
+ shift altgr control alt ctrll keycode 50 = Meta_Control_m
+ shiftl ctrll keycode 50 = +M
+ altgr shiftl ctrll keycode 50 = Mu
+ shift altgr shiftl ctrll keycode 50 = Mu
+ control shiftl ctrll keycode 50 = Control_m
+ shift control shiftl ctrll keycode 50 = Control_m
+ altgr control shiftl ctrll keycode 50 = Control_m
+ shift altgr control shiftl ctrll keycode 50 = Control_m
+ alt shiftl ctrll keycode 50 = Meta_m
+ shift alt shiftl ctrll keycode 50 = Meta_M
+ altgr alt shiftl ctrll keycode 50 = Meta_m
+ shift altgr alt shiftl ctrll keycode 50 = Meta_M
+ control alt shiftl ctrll keycode 50 = Meta_Control_m
+ shift control alt shiftl ctrll keycode 50 = Meta_Control_m
+ altgr control alt shiftl ctrll keycode 50 = Meta_Control_m
+ shift altgr control alt shiftl ctrll keycode 50 = Meta_Control_m
+ shiftr ctrll keycode 50 = +M
+ altgr shiftr ctrll keycode 50 = Mu
+ shift altgr shiftr ctrll keycode 50 = Mu
+ control shiftr ctrll keycode 50 = Control_m
+ shift control shiftr ctrll keycode 50 = Control_m
+ altgr control shiftr ctrll keycode 50 = Control_m
+ shift altgr control shiftr ctrll keycode 50 = Control_m
+ alt shiftr ctrll keycode 50 = Meta_m
+ shift alt shiftr ctrll keycode 50 = Meta_M
+ altgr alt shiftr ctrll keycode 50 = Meta_m
+ shift altgr alt shiftr ctrll keycode 50 = Meta_M
+ control alt shiftr ctrll keycode 50 = Meta_Control_m
+ shift control alt shiftr ctrll keycode 50 = Meta_Control_m
+ altgr control alt shiftr ctrll keycode 50 = Meta_Control_m
+ shift altgr control alt shiftr ctrll keycode 50 = Meta_Control_m
+ shiftl shiftr ctrll keycode 50 = +M
+ altgr shiftl shiftr ctrll keycode 50 = Mu
+ shift altgr shiftl shiftr ctrll keycode 50 = Mu
+ control shiftl shiftr ctrll keycode 50 = Control_m
+ shift control shiftl shiftr ctrll keycode 50 = Control_m
+ altgr control shiftl shiftr ctrll keycode 50 = Control_m
+ shift altgr control shiftl shiftr ctrll keycode 50 = Control_m
+ alt shiftl shiftr ctrll keycode 50 = Meta_m
+ shift alt shiftl shiftr ctrll keycode 50 = Meta_M
+ altgr alt shiftl shiftr ctrll keycode 50 = Meta_m
+ shift altgr alt shiftl shiftr ctrll keycode 50 = Meta_M
+ control alt shiftl shiftr ctrll keycode 50 = Meta_Control_m
+ shift control alt shiftl shiftr ctrll keycode 50 = Meta_Control_m
+ altgr control alt shiftl shiftr ctrll keycode 50 = Meta_Control_m
+ shift altgr control alt shiftl shiftr ctrll keycode 50 = Meta_Control_m
+keycode 51 = comma less U+2500 multiply
+ alt keycode 51 = Meta_comma
+ shift alt keycode 51 = Meta_less
+ altgr alt keycode 51 = Meta_comma
+ shift altgr alt keycode 51 = Meta_less
+ shiftl keycode 51 = comma
+ shift shiftl keycode 51 = less
+ altgr shiftl keycode 51 = U+2500
+ shift altgr shiftl keycode 51 = multiply
+ alt shiftl keycode 51 = Meta_comma
+ shift alt shiftl keycode 51 = Meta_less
+ altgr alt shiftl keycode 51 = Meta_comma
+ shift altgr alt shiftl keycode 51 = Meta_less
+ shiftr keycode 51 = comma
+ shift shiftr keycode 51 = less
+ altgr shiftr keycode 51 = U+2500
+ shift altgr shiftr keycode 51 = multiply
+ alt shiftr keycode 51 = Meta_comma
+ shift alt shiftr keycode 51 = Meta_less
+ altgr alt shiftr keycode 51 = Meta_comma
+ shift altgr alt shiftr keycode 51 = Meta_less
+ shiftl shiftr keycode 51 = comma
+ shift shiftl shiftr keycode 51 = less
+ altgr shiftl shiftr keycode 51 = U+2500
+ shift altgr shiftl shiftr keycode 51 = multiply
+ alt shiftl shiftr keycode 51 = Meta_comma
+ shift alt shiftl shiftr keycode 51 = Meta_less
+ altgr alt shiftl shiftr keycode 51 = Meta_comma
+ shift altgr alt shiftl shiftr keycode 51 = Meta_less
+ ctrll keycode 51 = comma
+ shift ctrll keycode 51 = less
+ altgr ctrll keycode 51 = U+2500
+ shift altgr ctrll keycode 51 = multiply
+ alt ctrll keycode 51 = Meta_comma
+ shift alt ctrll keycode 51 = Meta_less
+ altgr alt ctrll keycode 51 = Meta_comma
+ shift altgr alt ctrll keycode 51 = Meta_less
+ shiftl ctrll keycode 51 = comma
+ shift shiftl ctrll keycode 51 = less
+ altgr shiftl ctrll keycode 51 = U+2500
+ shift altgr shiftl ctrll keycode 51 = multiply
+ alt shiftl ctrll keycode 51 = Meta_comma
+ shift alt shiftl ctrll keycode 51 = Meta_less
+ altgr alt shiftl ctrll keycode 51 = Meta_comma
+ shift altgr alt shiftl ctrll keycode 51 = Meta_less
+ shiftr ctrll keycode 51 = comma
+ shift shiftr ctrll keycode 51 = less
+ altgr shiftr ctrll keycode 51 = U+2500
+ shift altgr shiftr ctrll keycode 51 = multiply
+ alt shiftr ctrll keycode 51 = Meta_comma
+ shift alt shiftr ctrll keycode 51 = Meta_less
+ altgr alt shiftr ctrll keycode 51 = Meta_comma
+ shift altgr alt shiftr ctrll keycode 51 = Meta_less
+ shiftl shiftr ctrll keycode 51 = comma
+ shift shiftl shiftr ctrll keycode 51 = less
+ altgr shiftl shiftr ctrll keycode 51 = U+2500
+ shift altgr shiftl shiftr ctrll keycode 51 = multiply
+ alt shiftl shiftr ctrll keycode 51 = Meta_comma
+ shift alt shiftl shiftr ctrll keycode 51 = Meta_less
+ altgr alt shiftl shiftr ctrll keycode 51 = Meta_comma
+ shift altgr alt shiftl shiftr ctrll keycode 51 = Meta_less
+keycode 52 = period
+ shift keycode 52 = greater
+ altgr keycode 52 = periodcentered
+ shift altgr keycode 52 = division
+ control keycode 52 = Compose
+ shift control keycode 52 = Compose
+ altgr control keycode 52 = Compose
+ shift altgr control keycode 52 = Compose
+ alt keycode 52 = Meta_period
+ shift alt keycode 52 = Meta_greater
+ altgr alt keycode 52 = Meta_period
+ shift altgr alt keycode 52 = Meta_greater
+ control alt keycode 52 = Compose
+ shift control alt keycode 52 = Compose
+ altgr control alt keycode 52 = Compose
+ shift altgr control alt keycode 52 = Compose
+ shift shiftl keycode 52 = greater
+ altgr shiftl keycode 52 = periodcentered
+ shift altgr shiftl keycode 52 = division
+ control shiftl keycode 52 = Compose
+ shift control shiftl keycode 52 = Compose
+ altgr control shiftl keycode 52 = Compose
+ shift altgr control shiftl keycode 52 = Compose
+ alt shiftl keycode 52 = Meta_period
+ shift alt shiftl keycode 52 = Meta_greater
+ altgr alt shiftl keycode 52 = Meta_period
+ shift altgr alt shiftl keycode 52 = Meta_greater
+ control alt shiftl keycode 52 = Compose
+ shift control alt shiftl keycode 52 = Compose
+ altgr control alt shiftl keycode 52 = Compose
+ shift altgr control alt shiftl keycode 52 = Compose
+ shift shiftr keycode 52 = greater
+ altgr shiftr keycode 52 = periodcentered
+ shift altgr shiftr keycode 52 = division
+ control shiftr keycode 52 = Compose
+ shift control shiftr keycode 52 = Compose
+ altgr control shiftr keycode 52 = Compose
+ shift altgr control shiftr keycode 52 = Compose
+ alt shiftr keycode 52 = Meta_period
+ shift alt shiftr keycode 52 = Meta_greater
+ altgr alt shiftr keycode 52 = Meta_period
+ shift altgr alt shiftr keycode 52 = Meta_greater
+ control alt shiftr keycode 52 = Compose
+ shift control alt shiftr keycode 52 = Compose
+ altgr control alt shiftr keycode 52 = Compose
+ shift altgr control alt shiftr keycode 52 = Compose
+ shift shiftl shiftr keycode 52 = greater
+ altgr shiftl shiftr keycode 52 = periodcentered
+ shift altgr shiftl shiftr keycode 52 = division
+ control shiftl shiftr keycode 52 = Compose
+ shift control shiftl shiftr keycode 52 = Compose
+ altgr control shiftl shiftr keycode 52 = Compose
+ shift altgr control shiftl shiftr keycode 52 = Compose
+ alt shiftl shiftr keycode 52 = Meta_period
+ shift alt shiftl shiftr keycode 52 = Meta_greater
+ altgr alt shiftl shiftr keycode 52 = Meta_period
+ shift altgr alt shiftl shiftr keycode 52 = Meta_greater
+ control alt shiftl shiftr keycode 52 = Compose
+ shift control alt shiftl shiftr keycode 52 = Compose
+ altgr control alt shiftl shiftr keycode 52 = Compose
+ shift altgr control alt shiftl shiftr keycode 52 = Compose
+ shift ctrll keycode 52 = greater
+ altgr ctrll keycode 52 = periodcentered
+ shift altgr ctrll keycode 52 = division
+ control ctrll keycode 52 = Compose
+ shift control ctrll keycode 52 = Compose
+ altgr control ctrll keycode 52 = Compose
+ shift altgr control ctrll keycode 52 = Compose
+ alt ctrll keycode 52 = Meta_period
+ shift alt ctrll keycode 52 = Meta_greater
+ altgr alt ctrll keycode 52 = Meta_period
+ shift altgr alt ctrll keycode 52 = Meta_greater
+ control alt ctrll keycode 52 = Compose
+ shift control alt ctrll keycode 52 = Compose
+ altgr control alt ctrll keycode 52 = Compose
+ shift altgr control alt ctrll keycode 52 = Compose
+ shift shiftl ctrll keycode 52 = greater
+ altgr shiftl ctrll keycode 52 = periodcentered
+ shift altgr shiftl ctrll keycode 52 = division
+ control shiftl ctrll keycode 52 = Compose
+ shift control shiftl ctrll keycode 52 = Compose
+ altgr control shiftl ctrll keycode 52 = Compose
+ shift altgr control shiftl ctrll keycode 52 = Compose
+ alt shiftl ctrll keycode 52 = Meta_period
+ shift alt shiftl ctrll keycode 52 = Meta_greater
+ altgr alt shiftl ctrll keycode 52 = Meta_period
+ shift altgr alt shiftl ctrll keycode 52 = Meta_greater
+ control alt shiftl ctrll keycode 52 = Compose
+ shift control alt shiftl ctrll keycode 52 = Compose
+ altgr control alt shiftl ctrll keycode 52 = Compose
+ shift altgr control alt shiftl ctrll keycode 52 = Compose
+ shift shiftr ctrll keycode 52 = greater
+ altgr shiftr ctrll keycode 52 = periodcentered
+ shift altgr shiftr ctrll keycode 52 = division
+ control shiftr ctrll keycode 52 = Compose
+ shift control shiftr ctrll keycode 52 = Compose
+ altgr control shiftr ctrll keycode 52 = Compose
+ shift altgr control shiftr ctrll keycode 52 = Compose
+ alt shiftr ctrll keycode 52 = Meta_period
+ shift alt shiftr ctrll keycode 52 = Meta_greater
+ altgr alt shiftr ctrll keycode 52 = Meta_period
+ shift altgr alt shiftr ctrll keycode 52 = Meta_greater
+ control alt shiftr ctrll keycode 52 = Compose
+ shift control alt shiftr ctrll keycode 52 = Compose
+ altgr control alt shiftr ctrll keycode 52 = Compose
+ shift altgr control alt shiftr ctrll keycode 52 = Compose
+ shift shiftl shiftr ctrll keycode 52 = greater
+ altgr shiftl shiftr ctrll keycode 52 = periodcentered
+ shift altgr shiftl shiftr ctrll keycode 52 = division
+ control shiftl shiftr ctrll keycode 52 = Compose
+ shift control shiftl shiftr ctrll keycode 52 = Compose
+ altgr control shiftl shiftr ctrll keycode 52 = Compose
+ shift altgr control shiftl shiftr ctrll keycode 52 = Compose
+ alt shiftl shiftr ctrll keycode 52 = Meta_period
+ shift alt shiftl shiftr ctrll keycode 52 = Meta_greater
+ altgr alt shiftl shiftr ctrll keycode 52 = Meta_period
+ shift altgr alt shiftl shiftr ctrll keycode 52 = Meta_greater
+ control alt shiftl shiftr ctrll keycode 52 = Compose
+ shift control alt shiftl shiftr ctrll keycode 52 = Compose
+ altgr control alt shiftl shiftr ctrll keycode 52 = Compose
+ shift altgr control alt shiftl shiftr ctrll keycode 52 = Compose
+keycode 53 = semicolon
+ shift keycode 53 = colon
+ altgr keycode 53 = U+0323
+ shift altgr keycode 53 = period
+ control keycode 53 = Compose
+ shift control keycode 53 = Compose
+ altgr control keycode 53 = Compose
+ shift altgr control keycode 53 = Compose
+ alt keycode 53 = Meta_semicolon
+ shift alt keycode 53 = Meta_colon
+ altgr alt keycode 53 = Meta_semicolon
+ shift altgr alt keycode 53 = Meta_period
+ control alt keycode 53 = Compose
+ shift control alt keycode 53 = Compose
+ altgr control alt keycode 53 = Compose
+ shift altgr control alt keycode 53 = Compose
+ shift shiftl keycode 53 = colon
+ altgr shiftl keycode 53 = U+0323
+ shift altgr shiftl keycode 53 = period
+ control shiftl keycode 53 = Compose
+ shift control shiftl keycode 53 = Compose
+ altgr control shiftl keycode 53 = Compose
+ shift altgr control shiftl keycode 53 = Compose
+ alt shiftl keycode 53 = Meta_semicolon
+ shift alt shiftl keycode 53 = Meta_colon
+ altgr alt shiftl keycode 53 = Meta_semicolon
+ shift altgr alt shiftl keycode 53 = Meta_period
+ control alt shiftl keycode 53 = Compose
+ shift control alt shiftl keycode 53 = Compose
+ altgr control alt shiftl keycode 53 = Compose
+ shift altgr control alt shiftl keycode 53 = Compose
+ shift shiftr keycode 53 = colon
+ altgr shiftr keycode 53 = U+0323
+ shift altgr shiftr keycode 53 = period
+ control shiftr keycode 53 = Compose
+ shift control shiftr keycode 53 = Compose
+ altgr control shiftr keycode 53 = Compose
+ shift altgr control shiftr keycode 53 = Compose
+ alt shiftr keycode 53 = Meta_semicolon
+ shift alt shiftr keycode 53 = Meta_colon
+ altgr alt shiftr keycode 53 = Meta_semicolon
+ shift altgr alt shiftr keycode 53 = Meta_period
+ control alt shiftr keycode 53 = Compose
+ shift control alt shiftr keycode 53 = Compose
+ altgr control alt shiftr keycode 53 = Compose
+ shift altgr control alt shiftr keycode 53 = Compose
+ shift shiftl shiftr keycode 53 = colon
+ altgr shiftl shiftr keycode 53 = U+0323
+ shift altgr shiftl shiftr keycode 53 = period
+ control shiftl shiftr keycode 53 = Compose
+ shift control shiftl shiftr keycode 53 = Compose
+ altgr control shiftl shiftr keycode 53 = Compose
+ shift altgr control shiftl shiftr keycode 53 = Compose
+ alt shiftl shiftr keycode 53 = Meta_semicolon
+ shift alt shiftl shiftr keycode 53 = Meta_colon
+ altgr alt shiftl shiftr keycode 53 = Meta_semicolon
+ shift altgr alt shiftl shiftr keycode 53 = Meta_period
+ control alt shiftl shiftr keycode 53 = Compose
+ shift control alt shiftl shiftr keycode 53 = Compose
+ altgr control alt shiftl shiftr keycode 53 = Compose
+ shift altgr control alt shiftl shiftr keycode 53 = Compose
+ shift ctrll keycode 53 = colon
+ altgr ctrll keycode 53 = U+0323
+ shift altgr ctrll keycode 53 = period
+ control ctrll keycode 53 = Compose
+ shift control ctrll keycode 53 = Compose
+ altgr control ctrll keycode 53 = Compose
+ shift altgr control ctrll keycode 53 = Compose
+ alt ctrll keycode 53 = Meta_semicolon
+ shift alt ctrll keycode 53 = Meta_colon
+ altgr alt ctrll keycode 53 = Meta_semicolon
+ shift altgr alt ctrll keycode 53 = Meta_period
+ control alt ctrll keycode 53 = Compose
+ shift control alt ctrll keycode 53 = Compose
+ altgr control alt ctrll keycode 53 = Compose
+ shift altgr control alt ctrll keycode 53 = Compose
+ shift shiftl ctrll keycode 53 = colon
+ altgr shiftl ctrll keycode 53 = U+0323
+ shift altgr shiftl ctrll keycode 53 = period
+ control shiftl ctrll keycode 53 = Compose
+ shift control shiftl ctrll keycode 53 = Compose
+ altgr control shiftl ctrll keycode 53 = Compose
+ shift altgr control shiftl ctrll keycode 53 = Compose
+ alt shiftl ctrll keycode 53 = Meta_semicolon
+ shift alt shiftl ctrll keycode 53 = Meta_colon
+ altgr alt shiftl ctrll keycode 53 = Meta_semicolon
+ shift altgr alt shiftl ctrll keycode 53 = Meta_period
+ control alt shiftl ctrll keycode 53 = Compose
+ shift control alt shiftl ctrll keycode 53 = Compose
+ altgr control alt shiftl ctrll keycode 53 = Compose
+ shift altgr control alt shiftl ctrll keycode 53 = Compose
+ shift shiftr ctrll keycode 53 = colon
+ altgr shiftr ctrll keycode 53 = U+0323
+ shift altgr shiftr ctrll keycode 53 = period
+ control shiftr ctrll keycode 53 = Compose
+ shift control shiftr ctrll keycode 53 = Compose
+ altgr control shiftr ctrll keycode 53 = Compose
+ shift altgr control shiftr ctrll keycode 53 = Compose
+ alt shiftr ctrll keycode 53 = Meta_semicolon
+ shift alt shiftr ctrll keycode 53 = Meta_colon
+ altgr alt shiftr ctrll keycode 53 = Meta_semicolon
+ shift altgr alt shiftr ctrll keycode 53 = Meta_period
+ control alt shiftr ctrll keycode 53 = Compose
+ shift control alt shiftr ctrll keycode 53 = Compose
+ altgr control alt shiftr ctrll keycode 53 = Compose
+ shift altgr control alt shiftr ctrll keycode 53 = Compose
+ shift shiftl shiftr ctrll keycode 53 = colon
+ altgr shiftl shiftr ctrll keycode 53 = U+0323
+ shift altgr shiftl shiftr ctrll keycode 53 = period
+ control shiftl shiftr ctrll keycode 53 = Compose
+ shift control shiftl shiftr ctrll keycode 53 = Compose
+ altgr control shiftl shiftr ctrll keycode 53 = Compose
+ shift altgr control shiftl shiftr ctrll keycode 53 = Compose
+ alt shiftl shiftr ctrll keycode 53 = Meta_semicolon
+ shift alt shiftl shiftr ctrll keycode 53 = Meta_colon
+ altgr alt shiftl shiftr ctrll keycode 53 = Meta_semicolon
+ shift altgr alt shiftl shiftr ctrll keycode 53 = Meta_period
+ control alt shiftl shiftr ctrll keycode 53 = Compose
+ shift control alt shiftl shiftr ctrll keycode 53 = Compose
+ altgr control alt shiftl shiftr ctrll keycode 53 = Compose
+ shift altgr control alt shiftl shiftr ctrll keycode 53 = Compose
+keycode 54 = Shift
+keycode 55 = KP_Multiply
+ altgr keycode 55 = Hex_C
+ shift alt keycode 55 = Hex_C
+ altgr shiftl keycode 55 = Hex_C
+ shift alt shiftl keycode 55 = Hex_C
+ altgr shiftr keycode 55 = Hex_C
+ shift alt shiftr keycode 55 = Hex_C
+ altgr shiftl shiftr keycode 55 = Hex_C
+ shift alt shiftl shiftr keycode 55 = Hex_C
+ altgr ctrll keycode 55 = Hex_C
+ shift alt ctrll keycode 55 = Hex_C
+ altgr shiftl ctrll keycode 55 = Hex_C
+ shift alt shiftl ctrll keycode 55 = Hex_C
+ altgr shiftr ctrll keycode 55 = Hex_C
+ shift alt shiftr ctrll keycode 55 = Hex_C
+ altgr shiftl shiftr ctrll keycode 55 = Hex_C
+ shift alt shiftl shiftr ctrll keycode 55 = Hex_C
+keycode 56 = Alt
+keycode 57 = space
+ control keycode 57 = nul
+ shift control keycode 57 = nul
+ altgr control keycode 57 = nul
+ shift altgr control keycode 57 = nul
+ alt keycode 57 = Meta_space
+ shift alt keycode 57 = Meta_space
+ altgr alt keycode 57 = Meta_space
+ shift altgr alt keycode 57 = Meta_space
+ control alt keycode 57 = Meta_nul
+ shift control alt keycode 57 = Meta_nul
+ altgr control alt keycode 57 = Meta_nul
+ shift altgr control alt keycode 57 = Meta_nul
+ control shiftl keycode 57 = nul
+ shift control shiftl keycode 57 = nul
+ altgr control shiftl keycode 57 = nul
+ shift altgr control shiftl keycode 57 = nul
+ alt shiftl keycode 57 = Meta_space
+ shift alt shiftl keycode 57 = Meta_space
+ altgr alt shiftl keycode 57 = Meta_space
+ shift altgr alt shiftl keycode 57 = Meta_space
+ control alt shiftl keycode 57 = Meta_nul
+ shift control alt shiftl keycode 57 = Meta_nul
+ altgr control alt shiftl keycode 57 = Meta_nul
+ shift altgr control alt shiftl keycode 57 = Meta_nul
+ control shiftr keycode 57 = nul
+ shift control shiftr keycode 57 = nul
+ altgr control shiftr keycode 57 = nul
+ shift altgr control shiftr keycode 57 = nul
+ alt shiftr keycode 57 = Meta_space
+ shift alt shiftr keycode 57 = Meta_space
+ altgr alt shiftr keycode 57 = Meta_space
+ shift altgr alt shiftr keycode 57 = Meta_space
+ control alt shiftr keycode 57 = Meta_nul
+ shift control alt shiftr keycode 57 = Meta_nul
+ altgr control alt shiftr keycode 57 = Meta_nul
+ shift altgr control alt shiftr keycode 57 = Meta_nul
+ control shiftl shiftr keycode 57 = nul
+ shift control shiftl shiftr keycode 57 = nul
+ altgr control shiftl shiftr keycode 57 = nul
+ shift altgr control shiftl shiftr keycode 57 = nul
+ alt shiftl shiftr keycode 57 = Meta_space
+ shift alt shiftl shiftr keycode 57 = Meta_space
+ altgr alt shiftl shiftr keycode 57 = Meta_space
+ shift altgr alt shiftl shiftr keycode 57 = Meta_space
+ control alt shiftl shiftr keycode 57 = Meta_nul
+ shift control alt shiftl shiftr keycode 57 = Meta_nul
+ altgr control alt shiftl shiftr keycode 57 = Meta_nul
+ shift altgr control alt shiftl shiftr keycode 57 = Meta_nul
+ control ctrll keycode 57 = nul
+ shift control ctrll keycode 57 = nul
+ altgr control ctrll keycode 57 = nul
+ shift altgr control ctrll keycode 57 = nul
+ alt ctrll keycode 57 = Meta_space
+ shift alt ctrll keycode 57 = Meta_space
+ altgr alt ctrll keycode 57 = Meta_space
+ shift altgr alt ctrll keycode 57 = Meta_space
+ control alt ctrll keycode 57 = Meta_nul
+ shift control alt ctrll keycode 57 = Meta_nul
+ altgr control alt ctrll keycode 57 = Meta_nul
+ shift altgr control alt ctrll keycode 57 = Meta_nul
+ control shiftl ctrll keycode 57 = nul
+ shift control shiftl ctrll keycode 57 = nul
+ altgr control shiftl ctrll keycode 57 = nul
+ shift altgr control shiftl ctrll keycode 57 = nul
+ alt shiftl ctrll keycode 57 = Meta_space
+ shift alt shiftl ctrll keycode 57 = Meta_space
+ altgr alt shiftl ctrll keycode 57 = Meta_space
+ shift altgr alt shiftl ctrll keycode 57 = Meta_space
+ control alt shiftl ctrll keycode 57 = Meta_nul
+ shift control alt shiftl ctrll keycode 57 = Meta_nul
+ altgr control alt shiftl ctrll keycode 57 = Meta_nul
+ shift altgr control alt shiftl ctrll keycode 57 = Meta_nul
+ control shiftr ctrll keycode 57 = nul
+ shift control shiftr ctrll keycode 57 = nul
+ altgr control shiftr ctrll keycode 57 = nul
+ shift altgr control shiftr ctrll keycode 57 = nul
+ alt shiftr ctrll keycode 57 = Meta_space
+ shift alt shiftr ctrll keycode 57 = Meta_space
+ altgr alt shiftr ctrll keycode 57 = Meta_space
+ shift altgr alt shiftr ctrll keycode 57 = Meta_space
+ control alt shiftr ctrll keycode 57 = Meta_nul
+ shift control alt shiftr ctrll keycode 57 = Meta_nul
+ altgr control alt shiftr ctrll keycode 57 = Meta_nul
+ shift altgr control alt shiftr ctrll keycode 57 = Meta_nul
+ control shiftl shiftr ctrll keycode 57 = nul
+ shift control shiftl shiftr ctrll keycode 57 = nul
+ altgr control shiftl shiftr ctrll keycode 57 = nul
+ shift altgr control shiftl shiftr ctrll keycode 57 = nul
+ alt shiftl shiftr ctrll keycode 57 = Meta_space
+ shift alt shiftl shiftr ctrll keycode 57 = Meta_space
+ altgr alt shiftl shiftr ctrll keycode 57 = Meta_space
+ shift altgr alt shiftl shiftr ctrll keycode 57 = Meta_space
+ control alt shiftl shiftr ctrll keycode 57 = Meta_nul
+ shift control alt shiftl shiftr ctrll keycode 57 = Meta_nul
+ altgr control alt shiftl shiftr ctrll keycode 57 = Meta_nul
+ shift altgr control alt shiftl shiftr ctrll keycode 57 = Meta_nul
+keycode 58 = CtrlL_Lock
+keycode 59 = F1
+ shift keycode 59 = F13
+ altgr keycode 59 = Console_13
+ shift altgr keycode 59 = Console_25
+ control keycode 59 = F25
+ shift control keycode 59 = F37
+ altgr control keycode 59 = Console_13
+ shift altgr control keycode 59 = Console_25
+ alt keycode 59 = Console_1
+ shift alt keycode 59 = Console_13
+ control alt keycode 59 = Console_1
+ shift control alt keycode 59 = Console_13
+ shift shiftl keycode 59 = F13
+ altgr shiftl keycode 59 = Console_13
+ shift altgr shiftl keycode 59 = Console_25
+ control shiftl keycode 59 = F25
+ shift control shiftl keycode 59 = F37
+ altgr control shiftl keycode 59 = Console_13
+ shift altgr control shiftl keycode 59 = Console_25
+ alt shiftl keycode 59 = Console_1
+ shift alt shiftl keycode 59 = Console_13
+ control alt shiftl keycode 59 = Console_1
+ shift control alt shiftl keycode 59 = Console_13
+ shift shiftr keycode 59 = F13
+ altgr shiftr keycode 59 = Console_13
+ shift altgr shiftr keycode 59 = Console_25
+ control shiftr keycode 59 = F25
+ shift control shiftr keycode 59 = F37
+ altgr control shiftr keycode 59 = Console_13
+ shift altgr control shiftr keycode 59 = Console_25
+ alt shiftr keycode 59 = Console_1
+ shift alt shiftr keycode 59 = Console_13
+ control alt shiftr keycode 59 = Console_1
+ shift control alt shiftr keycode 59 = Console_13
+ shift shiftl shiftr keycode 59 = F13
+ altgr shiftl shiftr keycode 59 = Console_13
+ shift altgr shiftl shiftr keycode 59 = Console_25
+ control shiftl shiftr keycode 59 = F25
+ shift control shiftl shiftr keycode 59 = F37
+ altgr control shiftl shiftr keycode 59 = Console_13
+ shift altgr control shiftl shiftr keycode 59 = Console_25
+ alt shiftl shiftr keycode 59 = Console_1
+ shift alt shiftl shiftr keycode 59 = Console_13
+ control alt shiftl shiftr keycode 59 = Console_1
+ shift control alt shiftl shiftr keycode 59 = Console_13
+ shift ctrll keycode 59 = F13
+ altgr ctrll keycode 59 = Console_13
+ shift altgr ctrll keycode 59 = Console_25
+ control ctrll keycode 59 = F25
+ shift control ctrll keycode 59 = F37
+ altgr control ctrll keycode 59 = Console_13
+ shift altgr control ctrll keycode 59 = Console_25
+ alt ctrll keycode 59 = Console_1
+ shift alt ctrll keycode 59 = Console_13
+ control alt ctrll keycode 59 = Console_1
+ shift control alt ctrll keycode 59 = Console_13
+ shift shiftl ctrll keycode 59 = F13
+ altgr shiftl ctrll keycode 59 = Console_13
+ shift altgr shiftl ctrll keycode 59 = Console_25
+ control shiftl ctrll keycode 59 = F25
+ shift control shiftl ctrll keycode 59 = F37
+ altgr control shiftl ctrll keycode 59 = Console_13
+ shift altgr control shiftl ctrll keycode 59 = Console_25
+ alt shiftl ctrll keycode 59 = Console_1
+ shift alt shiftl ctrll keycode 59 = Console_13
+ control alt shiftl ctrll keycode 59 = Console_1
+ shift control alt shiftl ctrll keycode 59 = Console_13
+ shift shiftr ctrll keycode 59 = F13
+ altgr shiftr ctrll keycode 59 = Console_13
+ shift altgr shiftr ctrll keycode 59 = Console_25
+ control shiftr ctrll keycode 59 = F25
+ shift control shiftr ctrll keycode 59 = F37
+ altgr control shiftr ctrll keycode 59 = Console_13
+ shift altgr control shiftr ctrll keycode 59 = Console_25
+ alt shiftr ctrll keycode 59 = Console_1
+ shift alt shiftr ctrll keycode 59 = Console_13
+ control alt shiftr ctrll keycode 59 = Console_1
+ shift control alt shiftr ctrll keycode 59 = Console_13
+ shift shiftl shiftr ctrll keycode 59 = F13
+ altgr shiftl shiftr ctrll keycode 59 = Console_13
+ shift altgr shiftl shiftr ctrll keycode 59 = Console_25
+ control shiftl shiftr ctrll keycode 59 = F25
+ shift control shiftl shiftr ctrll keycode 59 = F37
+ altgr control shiftl shiftr ctrll keycode 59 = Console_13
+ shift altgr control shiftl shiftr ctrll keycode 59 = Console_25
+ alt shiftl shiftr ctrll keycode 59 = Console_1
+ shift alt shiftl shiftr ctrll keycode 59 = Console_13
+ control alt shiftl shiftr ctrll keycode 59 = Console_1
+ shift control alt shiftl shiftr ctrll keycode 59 = Console_13
+keycode 60 = F2
+ shift keycode 60 = F14
+ altgr keycode 60 = Console_14
+ shift altgr keycode 60 = Console_26
+ control keycode 60 = F26
+ shift control keycode 60 = F38
+ altgr control keycode 60 = Console_14
+ shift altgr control keycode 60 = Console_26
+ alt keycode 60 = Console_2
+ shift alt keycode 60 = Console_14
+ control alt keycode 60 = Console_2
+ shift control alt keycode 60 = Console_14
+ shift shiftl keycode 60 = F14
+ altgr shiftl keycode 60 = Console_14
+ shift altgr shiftl keycode 60 = Console_26
+ control shiftl keycode 60 = F26
+ shift control shiftl keycode 60 = F38
+ altgr control shiftl keycode 60 = Console_14
+ shift altgr control shiftl keycode 60 = Console_26
+ alt shiftl keycode 60 = Console_2
+ shift alt shiftl keycode 60 = Console_14
+ control alt shiftl keycode 60 = Console_2
+ shift control alt shiftl keycode 60 = Console_14
+ shift shiftr keycode 60 = F14
+ altgr shiftr keycode 60 = Console_14
+ shift altgr shiftr keycode 60 = Console_26
+ control shiftr keycode 60 = F26
+ shift control shiftr keycode 60 = F38
+ altgr control shiftr keycode 60 = Console_14
+ shift altgr control shiftr keycode 60 = Console_26
+ alt shiftr keycode 60 = Console_2
+ shift alt shiftr keycode 60 = Console_14
+ control alt shiftr keycode 60 = Console_2
+ shift control alt shiftr keycode 60 = Console_14
+ shift shiftl shiftr keycode 60 = F14
+ altgr shiftl shiftr keycode 60 = Console_14
+ shift altgr shiftl shiftr keycode 60 = Console_26
+ control shiftl shiftr keycode 60 = F26
+ shift control shiftl shiftr keycode 60 = F38
+ altgr control shiftl shiftr keycode 60 = Console_14
+ shift altgr control shiftl shiftr keycode 60 = Console_26
+ alt shiftl shiftr keycode 60 = Console_2
+ shift alt shiftl shiftr keycode 60 = Console_14
+ control alt shiftl shiftr keycode 60 = Console_2
+ shift control alt shiftl shiftr keycode 60 = Console_14
+ shift ctrll keycode 60 = F14
+ altgr ctrll keycode 60 = Console_14
+ shift altgr ctrll keycode 60 = Console_26
+ control ctrll keycode 60 = F26
+ shift control ctrll keycode 60 = F38
+ altgr control ctrll keycode 60 = Console_14
+ shift altgr control ctrll keycode 60 = Console_26
+ alt ctrll keycode 60 = Console_2
+ shift alt ctrll keycode 60 = Console_14
+ control alt ctrll keycode 60 = Console_2
+ shift control alt ctrll keycode 60 = Console_14
+ shift shiftl ctrll keycode 60 = F14
+ altgr shiftl ctrll keycode 60 = Console_14
+ shift altgr shiftl ctrll keycode 60 = Console_26
+ control shiftl ctrll keycode 60 = F26
+ shift control shiftl ctrll keycode 60 = F38
+ altgr control shiftl ctrll keycode 60 = Console_14
+ shift altgr control shiftl ctrll keycode 60 = Console_26
+ alt shiftl ctrll keycode 60 = Console_2
+ shift alt shiftl ctrll keycode 60 = Console_14
+ control alt shiftl ctrll keycode 60 = Console_2
+ shift control alt shiftl ctrll keycode 60 = Console_14
+ shift shiftr ctrll keycode 60 = F14
+ altgr shiftr ctrll keycode 60 = Console_14
+ shift altgr shiftr ctrll keycode 60 = Console_26
+ control shiftr ctrll keycode 60 = F26
+ shift control shiftr ctrll keycode 60 = F38
+ altgr control shiftr ctrll keycode 60 = Console_14
+ shift altgr control shiftr ctrll keycode 60 = Console_26
+ alt shiftr ctrll keycode 60 = Console_2
+ shift alt shiftr ctrll keycode 60 = Console_14
+ control alt shiftr ctrll keycode 60 = Console_2
+ shift control alt shiftr ctrll keycode 60 = Console_14
+ shift shiftl shiftr ctrll keycode 60 = F14
+ altgr shiftl shiftr ctrll keycode 60 = Console_14
+ shift altgr shiftl shiftr ctrll keycode 60 = Console_26
+ control shiftl shiftr ctrll keycode 60 = F26
+ shift control shiftl shiftr ctrll keycode 60 = F38
+ altgr control shiftl shiftr ctrll keycode 60 = Console_14
+ shift altgr control shiftl shiftr ctrll keycode 60 = Console_26
+ alt shiftl shiftr ctrll keycode 60 = Console_2
+ shift alt shiftl shiftr ctrll keycode 60 = Console_14
+ control alt shiftl shiftr ctrll keycode 60 = Console_2
+ shift control alt shiftl shiftr ctrll keycode 60 = Console_14
+keycode 61 = F3
+ shift keycode 61 = F15
+ altgr keycode 61 = Console_15
+ shift altgr keycode 61 = Console_27
+ control keycode 61 = F27
+ shift control keycode 61 = F39
+ altgr control keycode 61 = Console_15
+ shift altgr control keycode 61 = Console_27
+ alt keycode 61 = Console_3
+ shift alt keycode 61 = Console_15
+ control alt keycode 61 = Console_3
+ shift control alt keycode 61 = Console_15
+ shift shiftl keycode 61 = F15
+ altgr shiftl keycode 61 = Console_15
+ shift altgr shiftl keycode 61 = Console_27
+ control shiftl keycode 61 = F27
+ shift control shiftl keycode 61 = F39
+ altgr control shiftl keycode 61 = Console_15
+ shift altgr control shiftl keycode 61 = Console_27
+ alt shiftl keycode 61 = Console_3
+ shift alt shiftl keycode 61 = Console_15
+ control alt shiftl keycode 61 = Console_3
+ shift control alt shiftl keycode 61 = Console_15
+ shift shiftr keycode 61 = F15
+ altgr shiftr keycode 61 = Console_15
+ shift altgr shiftr keycode 61 = Console_27
+ control shiftr keycode 61 = F27
+ shift control shiftr keycode 61 = F39
+ altgr control shiftr keycode 61 = Console_15
+ shift altgr control shiftr keycode 61 = Console_27
+ alt shiftr keycode 61 = Console_3
+ shift alt shiftr keycode 61 = Console_15
+ control alt shiftr keycode 61 = Console_3
+ shift control alt shiftr keycode 61 = Console_15
+ shift shiftl shiftr keycode 61 = F15
+ altgr shiftl shiftr keycode 61 = Console_15
+ shift altgr shiftl shiftr keycode 61 = Console_27
+ control shiftl shiftr keycode 61 = F27
+ shift control shiftl shiftr keycode 61 = F39
+ altgr control shiftl shiftr keycode 61 = Console_15
+ shift altgr control shiftl shiftr keycode 61 = Console_27
+ alt shiftl shiftr keycode 61 = Console_3
+ shift alt shiftl shiftr keycode 61 = Console_15
+ control alt shiftl shiftr keycode 61 = Console_3
+ shift control alt shiftl shiftr keycode 61 = Console_15
+ shift ctrll keycode 61 = F15
+ altgr ctrll keycode 61 = Console_15
+ shift altgr ctrll keycode 61 = Console_27
+ control ctrll keycode 61 = F27
+ shift control ctrll keycode 61 = F39
+ altgr control ctrll keycode 61 = Console_15
+ shift altgr control ctrll keycode 61 = Console_27
+ alt ctrll keycode 61 = Console_3
+ shift alt ctrll keycode 61 = Console_15
+ control alt ctrll keycode 61 = Console_3
+ shift control alt ctrll keycode 61 = Console_15
+ shift shiftl ctrll keycode 61 = F15
+ altgr shiftl ctrll keycode 61 = Console_15
+ shift altgr shiftl ctrll keycode 61 = Console_27
+ control shiftl ctrll keycode 61 = F27
+ shift control shiftl ctrll keycode 61 = F39
+ altgr control shiftl ctrll keycode 61 = Console_15
+ shift altgr control shiftl ctrll keycode 61 = Console_27
+ alt shiftl ctrll keycode 61 = Console_3
+ shift alt shiftl ctrll keycode 61 = Console_15
+ control alt shiftl ctrll keycode 61 = Console_3
+ shift control alt shiftl ctrll keycode 61 = Console_15
+ shift shiftr ctrll keycode 61 = F15
+ altgr shiftr ctrll keycode 61 = Console_15
+ shift altgr shiftr ctrll keycode 61 = Console_27
+ control shiftr ctrll keycode 61 = F27
+ shift control shiftr ctrll keycode 61 = F39
+ altgr control shiftr ctrll keycode 61 = Console_15
+ shift altgr control shiftr ctrll keycode 61 = Console_27
+ alt shiftr ctrll keycode 61 = Console_3
+ shift alt shiftr ctrll keycode 61 = Console_15
+ control alt shiftr ctrll keycode 61 = Console_3
+ shift control alt shiftr ctrll keycode 61 = Console_15
+ shift shiftl shiftr ctrll keycode 61 = F15
+ altgr shiftl shiftr ctrll keycode 61 = Console_15
+ shift altgr shiftl shiftr ctrll keycode 61 = Console_27
+ control shiftl shiftr ctrll keycode 61 = F27
+ shift control shiftl shiftr ctrll keycode 61 = F39
+ altgr control shiftl shiftr ctrll keycode 61 = Console_15
+ shift altgr control shiftl shiftr ctrll keycode 61 = Console_27
+ alt shiftl shiftr ctrll keycode 61 = Console_3
+ shift alt shiftl shiftr ctrll keycode 61 = Console_15
+ control alt shiftl shiftr ctrll keycode 61 = Console_3
+ shift control alt shiftl shiftr ctrll keycode 61 = Console_15
+keycode 62 = F4
+ shift keycode 62 = F16
+ altgr keycode 62 = Console_16
+ shift altgr keycode 62 = Console_28
+ control keycode 62 = F28
+ shift control keycode 62 = F40
+ altgr control keycode 62 = Console_16
+ shift altgr control keycode 62 = Console_28
+ alt keycode 62 = Console_4
+ shift alt keycode 62 = Console_16
+ control alt keycode 62 = Console_4
+ shift control alt keycode 62 = Console_16
+ shift shiftl keycode 62 = F16
+ altgr shiftl keycode 62 = Console_16
+ shift altgr shiftl keycode 62 = Console_28
+ control shiftl keycode 62 = F28
+ shift control shiftl keycode 62 = F40
+ altgr control shiftl keycode 62 = Console_16
+ shift altgr control shiftl keycode 62 = Console_28
+ alt shiftl keycode 62 = Console_4
+ shift alt shiftl keycode 62 = Console_16
+ control alt shiftl keycode 62 = Console_4
+ shift control alt shiftl keycode 62 = Console_16
+ shift shiftr keycode 62 = F16
+ altgr shiftr keycode 62 = Console_16
+ shift altgr shiftr keycode 62 = Console_28
+ control shiftr keycode 62 = F28
+ shift control shiftr keycode 62 = F40
+ altgr control shiftr keycode 62 = Console_16
+ shift altgr control shiftr keycode 62 = Console_28
+ alt shiftr keycode 62 = Console_4
+ shift alt shiftr keycode 62 = Console_16
+ control alt shiftr keycode 62 = Console_4
+ shift control alt shiftr keycode 62 = Console_16
+ shift shiftl shiftr keycode 62 = F16
+ altgr shiftl shiftr keycode 62 = Console_16
+ shift altgr shiftl shiftr keycode 62 = Console_28
+ control shiftl shiftr keycode 62 = F28
+ shift control shiftl shiftr keycode 62 = F40
+ altgr control shiftl shiftr keycode 62 = Console_16
+ shift altgr control shiftl shiftr keycode 62 = Console_28
+ alt shiftl shiftr keycode 62 = Console_4
+ shift alt shiftl shiftr keycode 62 = Console_16
+ control alt shiftl shiftr keycode 62 = Console_4
+ shift control alt shiftl shiftr keycode 62 = Console_16
+ shift ctrll keycode 62 = F16
+ altgr ctrll keycode 62 = Console_16
+ shift altgr ctrll keycode 62 = Console_28
+ control ctrll keycode 62 = F28
+ shift control ctrll keycode 62 = F40
+ altgr control ctrll keycode 62 = Console_16
+ shift altgr control ctrll keycode 62 = Console_28
+ alt ctrll keycode 62 = Console_4
+ shift alt ctrll keycode 62 = Console_16
+ control alt ctrll keycode 62 = Console_4
+ shift control alt ctrll keycode 62 = Console_16
+ shift shiftl ctrll keycode 62 = F16
+ altgr shiftl ctrll keycode 62 = Console_16
+ shift altgr shiftl ctrll keycode 62 = Console_28
+ control shiftl ctrll keycode 62 = F28
+ shift control shiftl ctrll keycode 62 = F40
+ altgr control shiftl ctrll keycode 62 = Console_16
+ shift altgr control shiftl ctrll keycode 62 = Console_28
+ alt shiftl ctrll keycode 62 = Console_4
+ shift alt shiftl ctrll keycode 62 = Console_16
+ control alt shiftl ctrll keycode 62 = Console_4
+ shift control alt shiftl ctrll keycode 62 = Console_16
+ shift shiftr ctrll keycode 62 = F16
+ altgr shiftr ctrll keycode 62 = Console_16
+ shift altgr shiftr ctrll keycode 62 = Console_28
+ control shiftr ctrll keycode 62 = F28
+ shift control shiftr ctrll keycode 62 = F40
+ altgr control shiftr ctrll keycode 62 = Console_16
+ shift altgr control shiftr ctrll keycode 62 = Console_28
+ alt shiftr ctrll keycode 62 = Console_4
+ shift alt shiftr ctrll keycode 62 = Console_16
+ control alt shiftr ctrll keycode 62 = Console_4
+ shift control alt shiftr ctrll keycode 62 = Console_16
+ shift shiftl shiftr ctrll keycode 62 = F16
+ altgr shiftl shiftr ctrll keycode 62 = Console_16
+ shift altgr shiftl shiftr ctrll keycode 62 = Console_28
+ control shiftl shiftr ctrll keycode 62 = F28
+ shift control shiftl shiftr ctrll keycode 62 = F40
+ altgr control shiftl shiftr ctrll keycode 62 = Console_16
+ shift altgr control shiftl shiftr ctrll keycode 62 = Console_28
+ alt shiftl shiftr ctrll keycode 62 = Console_4
+ shift alt shiftl shiftr ctrll keycode 62 = Console_16
+ control alt shiftl shiftr ctrll keycode 62 = Console_4
+ shift control alt shiftl shiftr ctrll keycode 62 = Console_16
+keycode 63 = F5
+ shift keycode 63 = F17
+ altgr keycode 63 = Console_17
+ shift altgr keycode 63 = Console_29
+ control keycode 63 = F29
+ shift control keycode 63 = F41
+ altgr control keycode 63 = Console_17
+ shift altgr control keycode 63 = Console_29
+ alt keycode 63 = Console_5
+ shift alt keycode 63 = Console_17
+ control alt keycode 63 = Console_5
+ shift control alt keycode 63 = Console_17
+ shift shiftl keycode 63 = F17
+ altgr shiftl keycode 63 = Console_17
+ shift altgr shiftl keycode 63 = Console_29
+ control shiftl keycode 63 = F29
+ shift control shiftl keycode 63 = F41
+ altgr control shiftl keycode 63 = Console_17
+ shift altgr control shiftl keycode 63 = Console_29
+ alt shiftl keycode 63 = Console_5
+ shift alt shiftl keycode 63 = Console_17
+ control alt shiftl keycode 63 = Console_5
+ shift control alt shiftl keycode 63 = Console_17
+ shift shiftr keycode 63 = F17
+ altgr shiftr keycode 63 = Console_17
+ shift altgr shiftr keycode 63 = Console_29
+ control shiftr keycode 63 = F29
+ shift control shiftr keycode 63 = F41
+ altgr control shiftr keycode 63 = Console_17
+ shift altgr control shiftr keycode 63 = Console_29
+ alt shiftr keycode 63 = Console_5
+ shift alt shiftr keycode 63 = Console_17
+ control alt shiftr keycode 63 = Console_5
+ shift control alt shiftr keycode 63 = Console_17
+ shift shiftl shiftr keycode 63 = F17
+ altgr shiftl shiftr keycode 63 = Console_17
+ shift altgr shiftl shiftr keycode 63 = Console_29
+ control shiftl shiftr keycode 63 = F29
+ shift control shiftl shiftr keycode 63 = F41
+ altgr control shiftl shiftr keycode 63 = Console_17
+ shift altgr control shiftl shiftr keycode 63 = Console_29
+ alt shiftl shiftr keycode 63 = Console_5
+ shift alt shiftl shiftr keycode 63 = Console_17
+ control alt shiftl shiftr keycode 63 = Console_5
+ shift control alt shiftl shiftr keycode 63 = Console_17
+ shift ctrll keycode 63 = F17
+ altgr ctrll keycode 63 = Console_17
+ shift altgr ctrll keycode 63 = Console_29
+ control ctrll keycode 63 = F29
+ shift control ctrll keycode 63 = F41
+ altgr control ctrll keycode 63 = Console_17
+ shift altgr control ctrll keycode 63 = Console_29
+ alt ctrll keycode 63 = Console_5
+ shift alt ctrll keycode 63 = Console_17
+ control alt ctrll keycode 63 = Console_5
+ shift control alt ctrll keycode 63 = Console_17
+ shift shiftl ctrll keycode 63 = F17
+ altgr shiftl ctrll keycode 63 = Console_17
+ shift altgr shiftl ctrll keycode 63 = Console_29
+ control shiftl ctrll keycode 63 = F29
+ shift control shiftl ctrll keycode 63 = F41
+ altgr control shiftl ctrll keycode 63 = Console_17
+ shift altgr control shiftl ctrll keycode 63 = Console_29
+ alt shiftl ctrll keycode 63 = Console_5
+ shift alt shiftl ctrll keycode 63 = Console_17
+ control alt shiftl ctrll keycode 63 = Console_5
+ shift control alt shiftl ctrll keycode 63 = Console_17
+ shift shiftr ctrll keycode 63 = F17
+ altgr shiftr ctrll keycode 63 = Console_17
+ shift altgr shiftr ctrll keycode 63 = Console_29
+ control shiftr ctrll keycode 63 = F29
+ shift control shiftr ctrll keycode 63 = F41
+ altgr control shiftr ctrll keycode 63 = Console_17
+ shift altgr control shiftr ctrll keycode 63 = Console_29
+ alt shiftr ctrll keycode 63 = Console_5
+ shift alt shiftr ctrll keycode 63 = Console_17
+ control alt shiftr ctrll keycode 63 = Console_5
+ shift control alt shiftr ctrll keycode 63 = Console_17
+ shift shiftl shiftr ctrll keycode 63 = F17
+ altgr shiftl shiftr ctrll keycode 63 = Console_17
+ shift altgr shiftl shiftr ctrll keycode 63 = Console_29
+ control shiftl shiftr ctrll keycode 63 = F29
+ shift control shiftl shiftr ctrll keycode 63 = F41
+ altgr control shiftl shiftr ctrll keycode 63 = Console_17
+ shift altgr control shiftl shiftr ctrll keycode 63 = Console_29
+ alt shiftl shiftr ctrll keycode 63 = Console_5
+ shift alt shiftl shiftr ctrll keycode 63 = Console_17
+ control alt shiftl shiftr ctrll keycode 63 = Console_5
+ shift control alt shiftl shiftr ctrll keycode 63 = Console_17
+keycode 64 = F6
+ shift keycode 64 = F18
+ altgr keycode 64 = Console_18
+ shift altgr keycode 64 = Console_30
+ control keycode 64 = F30
+ shift control keycode 64 = F42
+ altgr control keycode 64 = Console_18
+ shift altgr control keycode 64 = Console_30
+ alt keycode 64 = Console_6
+ shift alt keycode 64 = Console_18
+ control alt keycode 64 = Console_6
+ shift control alt keycode 64 = Console_18
+ shift shiftl keycode 64 = F18
+ altgr shiftl keycode 64 = Console_18
+ shift altgr shiftl keycode 64 = Console_30
+ control shiftl keycode 64 = F30
+ shift control shiftl keycode 64 = F42
+ altgr control shiftl keycode 64 = Console_18
+ shift altgr control shiftl keycode 64 = Console_30
+ alt shiftl keycode 64 = Console_6
+ shift alt shiftl keycode 64 = Console_18
+ control alt shiftl keycode 64 = Console_6
+ shift control alt shiftl keycode 64 = Console_18
+ shift shiftr keycode 64 = F18
+ altgr shiftr keycode 64 = Console_18
+ shift altgr shiftr keycode 64 = Console_30
+ control shiftr keycode 64 = F30
+ shift control shiftr keycode 64 = F42
+ altgr control shiftr keycode 64 = Console_18
+ shift altgr control shiftr keycode 64 = Console_30
+ alt shiftr keycode 64 = Console_6
+ shift alt shiftr keycode 64 = Console_18
+ control alt shiftr keycode 64 = Console_6
+ shift control alt shiftr keycode 64 = Console_18
+ shift shiftl shiftr keycode 64 = F18
+ altgr shiftl shiftr keycode 64 = Console_18
+ shift altgr shiftl shiftr keycode 64 = Console_30
+ control shiftl shiftr keycode 64 = F30
+ shift control shiftl shiftr keycode 64 = F42
+ altgr control shiftl shiftr keycode 64 = Console_18
+ shift altgr control shiftl shiftr keycode 64 = Console_30
+ alt shiftl shiftr keycode 64 = Console_6
+ shift alt shiftl shiftr keycode 64 = Console_18
+ control alt shiftl shiftr keycode 64 = Console_6
+ shift control alt shiftl shiftr keycode 64 = Console_18
+ shift ctrll keycode 64 = F18
+ altgr ctrll keycode 64 = Console_18
+ shift altgr ctrll keycode 64 = Console_30
+ control ctrll keycode 64 = F30
+ shift control ctrll keycode 64 = F42
+ altgr control ctrll keycode 64 = Console_18
+ shift altgr control ctrll keycode 64 = Console_30
+ alt ctrll keycode 64 = Console_6
+ shift alt ctrll keycode 64 = Console_18
+ control alt ctrll keycode 64 = Console_6
+ shift control alt ctrll keycode 64 = Console_18
+ shift shiftl ctrll keycode 64 = F18
+ altgr shiftl ctrll keycode 64 = Console_18
+ shift altgr shiftl ctrll keycode 64 = Console_30
+ control shiftl ctrll keycode 64 = F30
+ shift control shiftl ctrll keycode 64 = F42
+ altgr control shiftl ctrll keycode 64 = Console_18
+ shift altgr control shiftl ctrll keycode 64 = Console_30
+ alt shiftl ctrll keycode 64 = Console_6
+ shift alt shiftl ctrll keycode 64 = Console_18
+ control alt shiftl ctrll keycode 64 = Console_6
+ shift control alt shiftl ctrll keycode 64 = Console_18
+ shift shiftr ctrll keycode 64 = F18
+ altgr shiftr ctrll keycode 64 = Console_18
+ shift altgr shiftr ctrll keycode 64 = Console_30
+ control shiftr ctrll keycode 64 = F30
+ shift control shiftr ctrll keycode 64 = F42
+ altgr control shiftr ctrll keycode 64 = Console_18
+ shift altgr control shiftr ctrll keycode 64 = Console_30
+ alt shiftr ctrll keycode 64 = Console_6
+ shift alt shiftr ctrll keycode 64 = Console_18
+ control alt shiftr ctrll keycode 64 = Console_6
+ shift control alt shiftr ctrll keycode 64 = Console_18
+ shift shiftl shiftr ctrll keycode 64 = F18
+ altgr shiftl shiftr ctrll keycode 64 = Console_18
+ shift altgr shiftl shiftr ctrll keycode 64 = Console_30
+ control shiftl shiftr ctrll keycode 64 = F30
+ shift control shiftl shiftr ctrll keycode 64 = F42
+ altgr control shiftl shiftr ctrll keycode 64 = Console_18
+ shift altgr control shiftl shiftr ctrll keycode 64 = Console_30
+ alt shiftl shiftr ctrll keycode 64 = Console_6
+ shift alt shiftl shiftr ctrll keycode 64 = Console_18
+ control alt shiftl shiftr ctrll keycode 64 = Console_6
+ shift control alt shiftl shiftr ctrll keycode 64 = Console_18
+keycode 65 = F7
+ shift keycode 65 = F19
+ altgr keycode 65 = Console_19
+ shift altgr keycode 65 = Console_31
+ control keycode 65 = F31
+ shift control keycode 65 = F43
+ altgr control keycode 65 = Console_19
+ shift altgr control keycode 65 = Console_31
+ alt keycode 65 = Console_7
+ shift alt keycode 65 = Console_19
+ control alt keycode 65 = Console_7
+ shift control alt keycode 65 = Console_19
+ shift shiftl keycode 65 = F19
+ altgr shiftl keycode 65 = Console_19
+ shift altgr shiftl keycode 65 = Console_31
+ control shiftl keycode 65 = F31
+ shift control shiftl keycode 65 = F43
+ altgr control shiftl keycode 65 = Console_19
+ shift altgr control shiftl keycode 65 = Console_31
+ alt shiftl keycode 65 = Console_7
+ shift alt shiftl keycode 65 = Console_19
+ control alt shiftl keycode 65 = Console_7
+ shift control alt shiftl keycode 65 = Console_19
+ shift shiftr keycode 65 = F19
+ altgr shiftr keycode 65 = Console_19
+ shift altgr shiftr keycode 65 = Console_31
+ control shiftr keycode 65 = F31
+ shift control shiftr keycode 65 = F43
+ altgr control shiftr keycode 65 = Console_19
+ shift altgr control shiftr keycode 65 = Console_31
+ alt shiftr keycode 65 = Console_7
+ shift alt shiftr keycode 65 = Console_19
+ control alt shiftr keycode 65 = Console_7
+ shift control alt shiftr keycode 65 = Console_19
+ shift shiftl shiftr keycode 65 = F19
+ altgr shiftl shiftr keycode 65 = Console_19
+ shift altgr shiftl shiftr keycode 65 = Console_31
+ control shiftl shiftr keycode 65 = F31
+ shift control shiftl shiftr keycode 65 = F43
+ altgr control shiftl shiftr keycode 65 = Console_19
+ shift altgr control shiftl shiftr keycode 65 = Console_31
+ alt shiftl shiftr keycode 65 = Console_7
+ shift alt shiftl shiftr keycode 65 = Console_19
+ control alt shiftl shiftr keycode 65 = Console_7
+ shift control alt shiftl shiftr keycode 65 = Console_19
+ shift ctrll keycode 65 = F19
+ altgr ctrll keycode 65 = Console_19
+ shift altgr ctrll keycode 65 = Console_31
+ control ctrll keycode 65 = F31
+ shift control ctrll keycode 65 = F43
+ altgr control ctrll keycode 65 = Console_19
+ shift altgr control ctrll keycode 65 = Console_31
+ alt ctrll keycode 65 = Console_7
+ shift alt ctrll keycode 65 = Console_19
+ control alt ctrll keycode 65 = Console_7
+ shift control alt ctrll keycode 65 = Console_19
+ shift shiftl ctrll keycode 65 = F19
+ altgr shiftl ctrll keycode 65 = Console_19
+ shift altgr shiftl ctrll keycode 65 = Console_31
+ control shiftl ctrll keycode 65 = F31
+ shift control shiftl ctrll keycode 65 = F43
+ altgr control shiftl ctrll keycode 65 = Console_19
+ shift altgr control shiftl ctrll keycode 65 = Console_31
+ alt shiftl ctrll keycode 65 = Console_7
+ shift alt shiftl ctrll keycode 65 = Console_19
+ control alt shiftl ctrll keycode 65 = Console_7
+ shift control alt shiftl ctrll keycode 65 = Console_19
+ shift shiftr ctrll keycode 65 = F19
+ altgr shiftr ctrll keycode 65 = Console_19
+ shift altgr shiftr ctrll keycode 65 = Console_31
+ control shiftr ctrll keycode 65 = F31
+ shift control shiftr ctrll keycode 65 = F43
+ altgr control shiftr ctrll keycode 65 = Console_19
+ shift altgr control shiftr ctrll keycode 65 = Console_31
+ alt shiftr ctrll keycode 65 = Console_7
+ shift alt shiftr ctrll keycode 65 = Console_19
+ control alt shiftr ctrll keycode 65 = Console_7
+ shift control alt shiftr ctrll keycode 65 = Console_19
+ shift shiftl shiftr ctrll keycode 65 = F19
+ altgr shiftl shiftr ctrll keycode 65 = Console_19
+ shift altgr shiftl shiftr ctrll keycode 65 = Console_31
+ control shiftl shiftr ctrll keycode 65 = F31
+ shift control shiftl shiftr ctrll keycode 65 = F43
+ altgr control shiftl shiftr ctrll keycode 65 = Console_19
+ shift altgr control shiftl shiftr ctrll keycode 65 = Console_31
+ alt shiftl shiftr ctrll keycode 65 = Console_7
+ shift alt shiftl shiftr ctrll keycode 65 = Console_19
+ control alt shiftl shiftr ctrll keycode 65 = Console_7
+ shift control alt shiftl shiftr ctrll keycode 65 = Console_19
+keycode 66 = F8
+ shift keycode 66 = F20
+ altgr keycode 66 = Console_20
+ shift altgr keycode 66 = Console_32
+ control keycode 66 = F32
+ shift control keycode 66 = F44
+ altgr control keycode 66 = Console_20
+ shift altgr control keycode 66 = Console_32
+ alt keycode 66 = Console_8
+ shift alt keycode 66 = Console_20
+ control alt keycode 66 = Console_8
+ shift control alt keycode 66 = Console_20
+ shift shiftl keycode 66 = F20
+ altgr shiftl keycode 66 = Console_20
+ shift altgr shiftl keycode 66 = Console_32
+ control shiftl keycode 66 = F32
+ shift control shiftl keycode 66 = F44
+ altgr control shiftl keycode 66 = Console_20
+ shift altgr control shiftl keycode 66 = Console_32
+ alt shiftl keycode 66 = Console_8
+ shift alt shiftl keycode 66 = Console_20
+ control alt shiftl keycode 66 = Console_8
+ shift control alt shiftl keycode 66 = Console_20
+ shift shiftr keycode 66 = F20
+ altgr shiftr keycode 66 = Console_20
+ shift altgr shiftr keycode 66 = Console_32
+ control shiftr keycode 66 = F32
+ shift control shiftr keycode 66 = F44
+ altgr control shiftr keycode 66 = Console_20
+ shift altgr control shiftr keycode 66 = Console_32
+ alt shiftr keycode 66 = Console_8
+ shift alt shiftr keycode 66 = Console_20
+ control alt shiftr keycode 66 = Console_8
+ shift control alt shiftr keycode 66 = Console_20
+ shift shiftl shiftr keycode 66 = F20
+ altgr shiftl shiftr keycode 66 = Console_20
+ shift altgr shiftl shiftr keycode 66 = Console_32
+ control shiftl shiftr keycode 66 = F32
+ shift control shiftl shiftr keycode 66 = F44
+ altgr control shiftl shiftr keycode 66 = Console_20
+ shift altgr control shiftl shiftr keycode 66 = Console_32
+ alt shiftl shiftr keycode 66 = Console_8
+ shift alt shiftl shiftr keycode 66 = Console_20
+ control alt shiftl shiftr keycode 66 = Console_8
+ shift control alt shiftl shiftr keycode 66 = Console_20
+ shift ctrll keycode 66 = F20
+ altgr ctrll keycode 66 = Console_20
+ shift altgr ctrll keycode 66 = Console_32
+ control ctrll keycode 66 = F32
+ shift control ctrll keycode 66 = F44
+ altgr control ctrll keycode 66 = Console_20
+ shift altgr control ctrll keycode 66 = Console_32
+ alt ctrll keycode 66 = Console_8
+ shift alt ctrll keycode 66 = Console_20
+ control alt ctrll keycode 66 = Console_8
+ shift control alt ctrll keycode 66 = Console_20
+ shift shiftl ctrll keycode 66 = F20
+ altgr shiftl ctrll keycode 66 = Console_20
+ shift altgr shiftl ctrll keycode 66 = Console_32
+ control shiftl ctrll keycode 66 = F32
+ shift control shiftl ctrll keycode 66 = F44
+ altgr control shiftl ctrll keycode 66 = Console_20
+ shift altgr control shiftl ctrll keycode 66 = Console_32
+ alt shiftl ctrll keycode 66 = Console_8
+ shift alt shiftl ctrll keycode 66 = Console_20
+ control alt shiftl ctrll keycode 66 = Console_8
+ shift control alt shiftl ctrll keycode 66 = Console_20
+ shift shiftr ctrll keycode 66 = F20
+ altgr shiftr ctrll keycode 66 = Console_20
+ shift altgr shiftr ctrll keycode 66 = Console_32
+ control shiftr ctrll keycode 66 = F32
+ shift control shiftr ctrll keycode 66 = F44
+ altgr control shiftr ctrll keycode 66 = Console_20
+ shift altgr control shiftr ctrll keycode 66 = Console_32
+ alt shiftr ctrll keycode 66 = Console_8
+ shift alt shiftr ctrll keycode 66 = Console_20
+ control alt shiftr ctrll keycode 66 = Console_8
+ shift control alt shiftr ctrll keycode 66 = Console_20
+ shift shiftl shiftr ctrll keycode 66 = F20
+ altgr shiftl shiftr ctrll keycode 66 = Console_20
+ shift altgr shiftl shiftr ctrll keycode 66 = Console_32
+ control shiftl shiftr ctrll keycode 66 = F32
+ shift control shiftl shiftr ctrll keycode 66 = F44
+ altgr control shiftl shiftr ctrll keycode 66 = Console_20
+ shift altgr control shiftl shiftr ctrll keycode 66 = Console_32
+ alt shiftl shiftr ctrll keycode 66 = Console_8
+ shift alt shiftl shiftr ctrll keycode 66 = Console_20
+ control alt shiftl shiftr ctrll keycode 66 = Console_8
+ shift control alt shiftl shiftr ctrll keycode 66 = Console_20
+keycode 67 = F9
+ shift keycode 67 = F21
+ altgr keycode 67 = Console_21
+ shift altgr keycode 67 = Console_33
+ control keycode 67 = F33
+ shift control keycode 67 = F45
+ altgr control keycode 67 = Console_21
+ shift altgr control keycode 67 = Console_33
+ alt keycode 67 = Console_9
+ shift alt keycode 67 = Console_21
+ control alt keycode 67 = Console_9
+ shift control alt keycode 67 = Console_21
+ shift shiftl keycode 67 = F21
+ altgr shiftl keycode 67 = Console_21
+ shift altgr shiftl keycode 67 = Console_33
+ control shiftl keycode 67 = F33
+ shift control shiftl keycode 67 = F45
+ altgr control shiftl keycode 67 = Console_21
+ shift altgr control shiftl keycode 67 = Console_33
+ alt shiftl keycode 67 = Console_9
+ shift alt shiftl keycode 67 = Console_21
+ control alt shiftl keycode 67 = Console_9
+ shift control alt shiftl keycode 67 = Console_21
+ shift shiftr keycode 67 = F21
+ altgr shiftr keycode 67 = Console_21
+ shift altgr shiftr keycode 67 = Console_33
+ control shiftr keycode 67 = F33
+ shift control shiftr keycode 67 = F45
+ altgr control shiftr keycode 67 = Console_21
+ shift altgr control shiftr keycode 67 = Console_33
+ alt shiftr keycode 67 = Console_9
+ shift alt shiftr keycode 67 = Console_21
+ control alt shiftr keycode 67 = Console_9
+ shift control alt shiftr keycode 67 = Console_21
+ shift shiftl shiftr keycode 67 = F21
+ altgr shiftl shiftr keycode 67 = Console_21
+ shift altgr shiftl shiftr keycode 67 = Console_33
+ control shiftl shiftr keycode 67 = F33
+ shift control shiftl shiftr keycode 67 = F45
+ altgr control shiftl shiftr keycode 67 = Console_21
+ shift altgr control shiftl shiftr keycode 67 = Console_33
+ alt shiftl shiftr keycode 67 = Console_9
+ shift alt shiftl shiftr keycode 67 = Console_21
+ control alt shiftl shiftr keycode 67 = Console_9
+ shift control alt shiftl shiftr keycode 67 = Console_21
+ shift ctrll keycode 67 = F21
+ altgr ctrll keycode 67 = Console_21
+ shift altgr ctrll keycode 67 = Console_33
+ control ctrll keycode 67 = F33
+ shift control ctrll keycode 67 = F45
+ altgr control ctrll keycode 67 = Console_21
+ shift altgr control ctrll keycode 67 = Console_33
+ alt ctrll keycode 67 = Console_9
+ shift alt ctrll keycode 67 = Console_21
+ control alt ctrll keycode 67 = Console_9
+ shift control alt ctrll keycode 67 = Console_21
+ shift shiftl ctrll keycode 67 = F21
+ altgr shiftl ctrll keycode 67 = Console_21
+ shift altgr shiftl ctrll keycode 67 = Console_33
+ control shiftl ctrll keycode 67 = F33
+ shift control shiftl ctrll keycode 67 = F45
+ altgr control shiftl ctrll keycode 67 = Console_21
+ shift altgr control shiftl ctrll keycode 67 = Console_33
+ alt shiftl ctrll keycode 67 = Console_9
+ shift alt shiftl ctrll keycode 67 = Console_21
+ control alt shiftl ctrll keycode 67 = Console_9
+ shift control alt shiftl ctrll keycode 67 = Console_21
+ shift shiftr ctrll keycode 67 = F21
+ altgr shiftr ctrll keycode 67 = Console_21
+ shift altgr shiftr ctrll keycode 67 = Console_33
+ control shiftr ctrll keycode 67 = F33
+ shift control shiftr ctrll keycode 67 = F45
+ altgr control shiftr ctrll keycode 67 = Console_21
+ shift altgr control shiftr ctrll keycode 67 = Console_33
+ alt shiftr ctrll keycode 67 = Console_9
+ shift alt shiftr ctrll keycode 67 = Console_21
+ control alt shiftr ctrll keycode 67 = Console_9
+ shift control alt shiftr ctrll keycode 67 = Console_21
+ shift shiftl shiftr ctrll keycode 67 = F21
+ altgr shiftl shiftr ctrll keycode 67 = Console_21
+ shift altgr shiftl shiftr ctrll keycode 67 = Console_33
+ control shiftl shiftr ctrll keycode 67 = F33
+ shift control shiftl shiftr ctrll keycode 67 = F45
+ altgr control shiftl shiftr ctrll keycode 67 = Console_21
+ shift altgr control shiftl shiftr ctrll keycode 67 = Console_33
+ alt shiftl shiftr ctrll keycode 67 = Console_9
+ shift alt shiftl shiftr ctrll keycode 67 = Console_21
+ control alt shiftl shiftr ctrll keycode 67 = Console_9
+ shift control alt shiftl shiftr ctrll keycode 67 = Console_21
+keycode 68 = F10
+ shift keycode 68 = F22
+ altgr keycode 68 = Console_22
+ shift altgr keycode 68 = Console_34
+ control keycode 68 = F34
+ shift control keycode 68 = F46
+ altgr control keycode 68 = Console_22
+ shift altgr control keycode 68 = Console_34
+ alt keycode 68 = Console_10
+ shift alt keycode 68 = Console_22
+ control alt keycode 68 = Console_10
+ shift control alt keycode 68 = Console_22
+ shift shiftl keycode 68 = F22
+ altgr shiftl keycode 68 = Console_22
+ shift altgr shiftl keycode 68 = Console_34
+ control shiftl keycode 68 = F34
+ shift control shiftl keycode 68 = F46
+ altgr control shiftl keycode 68 = Console_22
+ shift altgr control shiftl keycode 68 = Console_34
+ alt shiftl keycode 68 = Console_10
+ shift alt shiftl keycode 68 = Console_22
+ control alt shiftl keycode 68 = Console_10
+ shift control alt shiftl keycode 68 = Console_22
+ shift shiftr keycode 68 = F22
+ altgr shiftr keycode 68 = Console_22
+ shift altgr shiftr keycode 68 = Console_34
+ control shiftr keycode 68 = F34
+ shift control shiftr keycode 68 = F46
+ altgr control shiftr keycode 68 = Console_22
+ shift altgr control shiftr keycode 68 = Console_34
+ alt shiftr keycode 68 = Console_10
+ shift alt shiftr keycode 68 = Console_22
+ control alt shiftr keycode 68 = Console_10
+ shift control alt shiftr keycode 68 = Console_22
+ shift shiftl shiftr keycode 68 = F22
+ altgr shiftl shiftr keycode 68 = Console_22
+ shift altgr shiftl shiftr keycode 68 = Console_34
+ control shiftl shiftr keycode 68 = F34
+ shift control shiftl shiftr keycode 68 = F46
+ altgr control shiftl shiftr keycode 68 = Console_22
+ shift altgr control shiftl shiftr keycode 68 = Console_34
+ alt shiftl shiftr keycode 68 = Console_10
+ shift alt shiftl shiftr keycode 68 = Console_22
+ control alt shiftl shiftr keycode 68 = Console_10
+ shift control alt shiftl shiftr keycode 68 = Console_22
+ shift ctrll keycode 68 = F22
+ altgr ctrll keycode 68 = Console_22
+ shift altgr ctrll keycode 68 = Console_34
+ control ctrll keycode 68 = F34
+ shift control ctrll keycode 68 = F46
+ altgr control ctrll keycode 68 = Console_22
+ shift altgr control ctrll keycode 68 = Console_34
+ alt ctrll keycode 68 = Console_10
+ shift alt ctrll keycode 68 = Console_22
+ control alt ctrll keycode 68 = Console_10
+ shift control alt ctrll keycode 68 = Console_22
+ shift shiftl ctrll keycode 68 = F22
+ altgr shiftl ctrll keycode 68 = Console_22
+ shift altgr shiftl ctrll keycode 68 = Console_34
+ control shiftl ctrll keycode 68 = F34
+ shift control shiftl ctrll keycode 68 = F46
+ altgr control shiftl ctrll keycode 68 = Console_22
+ shift altgr control shiftl ctrll keycode 68 = Console_34
+ alt shiftl ctrll keycode 68 = Console_10
+ shift alt shiftl ctrll keycode 68 = Console_22
+ control alt shiftl ctrll keycode 68 = Console_10
+ shift control alt shiftl ctrll keycode 68 = Console_22
+ shift shiftr ctrll keycode 68 = F22
+ altgr shiftr ctrll keycode 68 = Console_22
+ shift altgr shiftr ctrll keycode 68 = Console_34
+ control shiftr ctrll keycode 68 = F34
+ shift control shiftr ctrll keycode 68 = F46
+ altgr control shiftr ctrll keycode 68 = Console_22
+ shift altgr control shiftr ctrll keycode 68 = Console_34
+ alt shiftr ctrll keycode 68 = Console_10
+ shift alt shiftr ctrll keycode 68 = Console_22
+ control alt shiftr ctrll keycode 68 = Console_10
+ shift control alt shiftr ctrll keycode 68 = Console_22
+ shift shiftl shiftr ctrll keycode 68 = F22
+ altgr shiftl shiftr ctrll keycode 68 = Console_22
+ shift altgr shiftl shiftr ctrll keycode 68 = Console_34
+ control shiftl shiftr ctrll keycode 68 = F34
+ shift control shiftl shiftr ctrll keycode 68 = F46
+ altgr control shiftl shiftr ctrll keycode 68 = Console_22
+ shift altgr control shiftl shiftr ctrll keycode 68 = Console_34
+ alt shiftl shiftr ctrll keycode 68 = Console_10
+ shift alt shiftl shiftr ctrll keycode 68 = Console_22
+ control alt shiftl shiftr ctrll keycode 68 = Console_10
+ shift control alt shiftl shiftr ctrll keycode 68 = Console_22
+keycode 69 = Num_Lock
+ altgr keycode 69 = Hex_A
+ shift alt keycode 69 = Hex_A
+ altgr shiftl keycode 69 = Hex_A
+ shift alt shiftl keycode 69 = Hex_A
+ altgr shiftr keycode 69 = Hex_A
+ shift alt shiftr keycode 69 = Hex_A
+ altgr shiftl shiftr keycode 69 = Hex_A
+ shift alt shiftl shiftr keycode 69 = Hex_A
+ altgr ctrll keycode 69 = Hex_A
+ shift alt ctrll keycode 69 = Hex_A
+ altgr shiftl ctrll keycode 69 = Hex_A
+ shift alt shiftl ctrll keycode 69 = Hex_A
+ altgr shiftr ctrll keycode 69 = Hex_A
+ shift alt shiftr ctrll keycode 69 = Hex_A
+ altgr shiftl shiftr ctrll keycode 69 = Hex_A
+ shift alt shiftl shiftr ctrll keycode 69 = Hex_A
+keycode 70 = Scroll_Lock
+ shift keycode 70 = Show_Memory
+ altgr keycode 70 = Show_Registers
+ control keycode 70 = Show_State
+ alt keycode 70 = Show_Registers
+ shift shiftl keycode 70 = Show_Memory
+ altgr shiftl keycode 70 = Show_Registers
+ control shiftl keycode 70 = Show_State
+ alt shiftl keycode 70 = Show_Registers
+ shift shiftr keycode 70 = Show_Memory
+ altgr shiftr keycode 70 = Show_Registers
+ control shiftr keycode 70 = Show_State
+ alt shiftr keycode 70 = Show_Registers
+ shift shiftl shiftr keycode 70 = Show_Memory
+ altgr shiftl shiftr keycode 70 = Show_Registers
+ control shiftl shiftr keycode 70 = Show_State
+ alt shiftl shiftr keycode 70 = Show_Registers
+ shift ctrll keycode 70 = Show_Memory
+ altgr ctrll keycode 70 = Show_Registers
+ control ctrll keycode 70 = Show_State
+ alt ctrll keycode 70 = Show_Registers
+ shift shiftl ctrll keycode 70 = Show_Memory
+ altgr shiftl ctrll keycode 70 = Show_Registers
+ control shiftl ctrll keycode 70 = Show_State
+ alt shiftl ctrll keycode 70 = Show_Registers
+ shift shiftr ctrll keycode 70 = Show_Memory
+ altgr shiftr ctrll keycode 70 = Show_Registers
+ control shiftr ctrll keycode 70 = Show_State
+ alt shiftr ctrll keycode 70 = Show_Registers
+ shift shiftl shiftr ctrll keycode 70 = Show_Memory
+ altgr shiftl shiftr ctrll keycode 70 = Show_Registers
+ control shiftl shiftr ctrll keycode 70 = Show_State
+ alt shiftl shiftr ctrll keycode 70 = Show_Registers
+keycode 71 = KP_7
+ altgr keycode 71 = Hex_7
+ alt keycode 71 = Ascii_7
+ shift alt keycode 71 = Hex_7
+ altgr shiftl keycode 71 = Hex_7
+ alt shiftl keycode 71 = Ascii_7
+ shift alt shiftl keycode 71 = Hex_7
+ altgr shiftr keycode 71 = Hex_7
+ alt shiftr keycode 71 = Ascii_7
+ shift alt shiftr keycode 71 = Hex_7
+ altgr shiftl shiftr keycode 71 = Hex_7
+ alt shiftl shiftr keycode 71 = Ascii_7
+ shift alt shiftl shiftr keycode 71 = Hex_7
+ altgr ctrll keycode 71 = Hex_7
+ alt ctrll keycode 71 = Ascii_7
+ shift alt ctrll keycode 71 = Hex_7
+ altgr shiftl ctrll keycode 71 = Hex_7
+ alt shiftl ctrll keycode 71 = Ascii_7
+ shift alt shiftl ctrll keycode 71 = Hex_7
+ altgr shiftr ctrll keycode 71 = Hex_7
+ alt shiftr ctrll keycode 71 = Ascii_7
+ shift alt shiftr ctrll keycode 71 = Hex_7
+ altgr shiftl shiftr ctrll keycode 71 = Hex_7
+ alt shiftl shiftr ctrll keycode 71 = Ascii_7
+ shift alt shiftl shiftr ctrll keycode 71 = Hex_7
+keycode 72 = KP_8
+ altgr keycode 72 = Hex_8
+ alt keycode 72 = Ascii_8
+ shift alt keycode 72 = Hex_8
+ altgr shiftl keycode 72 = Hex_8
+ alt shiftl keycode 72 = Ascii_8
+ shift alt shiftl keycode 72 = Hex_8
+ altgr shiftr keycode 72 = Hex_8
+ alt shiftr keycode 72 = Ascii_8
+ shift alt shiftr keycode 72 = Hex_8
+ altgr shiftl shiftr keycode 72 = Hex_8
+ alt shiftl shiftr keycode 72 = Ascii_8
+ shift alt shiftl shiftr keycode 72 = Hex_8
+ altgr ctrll keycode 72 = Hex_8
+ alt ctrll keycode 72 = Ascii_8
+ shift alt ctrll keycode 72 = Hex_8
+ altgr shiftl ctrll keycode 72 = Hex_8
+ alt shiftl ctrll keycode 72 = Ascii_8
+ shift alt shiftl ctrll keycode 72 = Hex_8
+ altgr shiftr ctrll keycode 72 = Hex_8
+ alt shiftr ctrll keycode 72 = Ascii_8
+ shift alt shiftr ctrll keycode 72 = Hex_8
+ altgr shiftl shiftr ctrll keycode 72 = Hex_8
+ alt shiftl shiftr ctrll keycode 72 = Ascii_8
+ shift alt shiftl shiftr ctrll keycode 72 = Hex_8
+keycode 73 = KP_9
+ altgr keycode 73 = Hex_9
+ alt keycode 73 = Ascii_9
+ shift alt keycode 73 = Hex_9
+ altgr shiftl keycode 73 = Hex_9
+ alt shiftl keycode 73 = Ascii_9
+ shift alt shiftl keycode 73 = Hex_9
+ altgr shiftr keycode 73 = Hex_9
+ alt shiftr keycode 73 = Ascii_9
+ shift alt shiftr keycode 73 = Hex_9
+ altgr shiftl shiftr keycode 73 = Hex_9
+ alt shiftl shiftr keycode 73 = Ascii_9
+ shift alt shiftl shiftr keycode 73 = Hex_9
+ altgr ctrll keycode 73 = Hex_9
+ alt ctrll keycode 73 = Ascii_9
+ shift alt ctrll keycode 73 = Hex_9
+ altgr shiftl ctrll keycode 73 = Hex_9
+ alt shiftl ctrll keycode 73 = Ascii_9
+ shift alt shiftl ctrll keycode 73 = Hex_9
+ altgr shiftr ctrll keycode 73 = Hex_9
+ alt shiftr ctrll keycode 73 = Ascii_9
+ shift alt shiftr ctrll keycode 73 = Hex_9
+ altgr shiftl shiftr ctrll keycode 73 = Hex_9
+ alt shiftl shiftr ctrll keycode 73 = Ascii_9
+ shift alt shiftl shiftr ctrll keycode 73 = Hex_9
+keycode 74 = KP_Subtract
+ altgr keycode 74 = Hex_D
+ shift alt keycode 74 = Hex_D
+ altgr shiftl keycode 74 = Hex_D
+ shift alt shiftl keycode 74 = Hex_D
+ altgr shiftr keycode 74 = Hex_D
+ shift alt shiftr keycode 74 = Hex_D
+ altgr shiftl shiftr keycode 74 = Hex_D
+ shift alt shiftl shiftr keycode 74 = Hex_D
+ altgr ctrll keycode 74 = Hex_D
+ shift alt ctrll keycode 74 = Hex_D
+ altgr shiftl ctrll keycode 74 = Hex_D
+ shift alt shiftl ctrll keycode 74 = Hex_D
+ altgr shiftr ctrll keycode 74 = Hex_D
+ shift alt shiftr ctrll keycode 74 = Hex_D
+ altgr shiftl shiftr ctrll keycode 74 = Hex_D
+ shift alt shiftl shiftr ctrll keycode 74 = Hex_D
+keycode 75 = KP_4
+ altgr keycode 75 = Hex_4
+ alt keycode 75 = Ascii_4
+ shift alt keycode 75 = Hex_4
+ altgr shiftl keycode 75 = Hex_4
+ alt shiftl keycode 75 = Ascii_4
+ shift alt shiftl keycode 75 = Hex_4
+ altgr shiftr keycode 75 = Hex_4
+ alt shiftr keycode 75 = Ascii_4
+ shift alt shiftr keycode 75 = Hex_4
+ altgr shiftl shiftr keycode 75 = Hex_4
+ alt shiftl shiftr keycode 75 = Ascii_4
+ shift alt shiftl shiftr keycode 75 = Hex_4
+ altgr ctrll keycode 75 = Hex_4
+ alt ctrll keycode 75 = Ascii_4
+ shift alt ctrll keycode 75 = Hex_4
+ altgr shiftl ctrll keycode 75 = Hex_4
+ alt shiftl ctrll keycode 75 = Ascii_4
+ shift alt shiftl ctrll keycode 75 = Hex_4
+ altgr shiftr ctrll keycode 75 = Hex_4
+ alt shiftr ctrll keycode 75 = Ascii_4
+ shift alt shiftr ctrll keycode 75 = Hex_4
+ altgr shiftl shiftr ctrll keycode 75 = Hex_4
+ alt shiftl shiftr ctrll keycode 75 = Ascii_4
+ shift alt shiftl shiftr ctrll keycode 75 = Hex_4
+keycode 76 = KP_5
+ altgr keycode 76 = Hex_5
+ alt keycode 76 = Ascii_5
+ shift alt keycode 76 = Hex_5
+ altgr shiftl keycode 76 = Hex_5
+ alt shiftl keycode 76 = Ascii_5
+ shift alt shiftl keycode 76 = Hex_5
+ altgr shiftr keycode 76 = Hex_5
+ alt shiftr keycode 76 = Ascii_5
+ shift alt shiftr keycode 76 = Hex_5
+ altgr shiftl shiftr keycode 76 = Hex_5
+ alt shiftl shiftr keycode 76 = Ascii_5
+ shift alt shiftl shiftr keycode 76 = Hex_5
+ altgr ctrll keycode 76 = Hex_5
+ alt ctrll keycode 76 = Ascii_5
+ shift alt ctrll keycode 76 = Hex_5
+ altgr shiftl ctrll keycode 76 = Hex_5
+ alt shiftl ctrll keycode 76 = Ascii_5
+ shift alt shiftl ctrll keycode 76 = Hex_5
+ altgr shiftr ctrll keycode 76 = Hex_5
+ alt shiftr ctrll keycode 76 = Ascii_5
+ shift alt shiftr ctrll keycode 76 = Hex_5
+ altgr shiftl shiftr ctrll keycode 76 = Hex_5
+ alt shiftl shiftr ctrll keycode 76 = Ascii_5
+ shift alt shiftl shiftr ctrll keycode 76 = Hex_5
+keycode 77 = KP_6
+ altgr keycode 77 = Hex_6
+ alt keycode 77 = Ascii_6
+ shift alt keycode 77 = Hex_6
+ altgr shiftl keycode 77 = Hex_6
+ alt shiftl keycode 77 = Ascii_6
+ shift alt shiftl keycode 77 = Hex_6
+ altgr shiftr keycode 77 = Hex_6
+ alt shiftr keycode 77 = Ascii_6
+ shift alt shiftr keycode 77 = Hex_6
+ altgr shiftl shiftr keycode 77 = Hex_6
+ alt shiftl shiftr keycode 77 = Ascii_6
+ shift alt shiftl shiftr keycode 77 = Hex_6
+ altgr ctrll keycode 77 = Hex_6
+ alt ctrll keycode 77 = Ascii_6
+ shift alt ctrll keycode 77 = Hex_6
+ altgr shiftl ctrll keycode 77 = Hex_6
+ alt shiftl ctrll keycode 77 = Ascii_6
+ shift alt shiftl ctrll keycode 77 = Hex_6
+ altgr shiftr ctrll keycode 77 = Hex_6
+ alt shiftr ctrll keycode 77 = Ascii_6
+ shift alt shiftr ctrll keycode 77 = Hex_6
+ altgr shiftl shiftr ctrll keycode 77 = Hex_6
+ alt shiftl shiftr ctrll keycode 77 = Ascii_6
+ shift alt shiftl shiftr ctrll keycode 77 = Hex_6
+keycode 78 = KP_Add
+ altgr keycode 78 = Hex_E
+ shift alt keycode 78 = Hex_E
+ altgr shiftl keycode 78 = Hex_E
+ shift alt shiftl keycode 78 = Hex_E
+ altgr shiftr keycode 78 = Hex_E
+ shift alt shiftr keycode 78 = Hex_E
+ altgr shiftl shiftr keycode 78 = Hex_E
+ shift alt shiftl shiftr keycode 78 = Hex_E
+ altgr ctrll keycode 78 = Hex_E
+ shift alt ctrll keycode 78 = Hex_E
+ altgr shiftl ctrll keycode 78 = Hex_E
+ shift alt shiftl ctrll keycode 78 = Hex_E
+ altgr shiftr ctrll keycode 78 = Hex_E
+ shift alt shiftr ctrll keycode 78 = Hex_E
+ altgr shiftl shiftr ctrll keycode 78 = Hex_E
+ shift alt shiftl shiftr ctrll keycode 78 = Hex_E
+keycode 79 = KP_1
+ altgr keycode 79 = Hex_1
+ alt keycode 79 = Ascii_1
+ shift alt keycode 79 = Hex_1
+ altgr shiftl keycode 79 = Hex_1
+ alt shiftl keycode 79 = Ascii_1
+ shift alt shiftl keycode 79 = Hex_1
+ altgr shiftr keycode 79 = Hex_1
+ alt shiftr keycode 79 = Ascii_1
+ shift alt shiftr keycode 79 = Hex_1
+ altgr shiftl shiftr keycode 79 = Hex_1
+ alt shiftl shiftr keycode 79 = Ascii_1
+ shift alt shiftl shiftr keycode 79 = Hex_1
+ altgr ctrll keycode 79 = Hex_1
+ alt ctrll keycode 79 = Ascii_1
+ shift alt ctrll keycode 79 = Hex_1
+ altgr shiftl ctrll keycode 79 = Hex_1
+ alt shiftl ctrll keycode 79 = Ascii_1
+ shift alt shiftl ctrll keycode 79 = Hex_1
+ altgr shiftr ctrll keycode 79 = Hex_1
+ alt shiftr ctrll keycode 79 = Ascii_1
+ shift alt shiftr ctrll keycode 79 = Hex_1
+ altgr shiftl shiftr ctrll keycode 79 = Hex_1
+ alt shiftl shiftr ctrll keycode 79 = Ascii_1
+ shift alt shiftl shiftr ctrll keycode 79 = Hex_1
+keycode 80 = KP_2
+ altgr keycode 80 = Hex_2
+ alt keycode 80 = Ascii_2
+ shift alt keycode 80 = Hex_2
+ altgr shiftl keycode 80 = Hex_2
+ alt shiftl keycode 80 = Ascii_2
+ shift alt shiftl keycode 80 = Hex_2
+ altgr shiftr keycode 80 = Hex_2
+ alt shiftr keycode 80 = Ascii_2
+ shift alt shiftr keycode 80 = Hex_2
+ altgr shiftl shiftr keycode 80 = Hex_2
+ alt shiftl shiftr keycode 80 = Ascii_2
+ shift alt shiftl shiftr keycode 80 = Hex_2
+ altgr ctrll keycode 80 = Hex_2
+ alt ctrll keycode 80 = Ascii_2
+ shift alt ctrll keycode 80 = Hex_2
+ altgr shiftl ctrll keycode 80 = Hex_2
+ alt shiftl ctrll keycode 80 = Ascii_2
+ shift alt shiftl ctrll keycode 80 = Hex_2
+ altgr shiftr ctrll keycode 80 = Hex_2
+ alt shiftr ctrll keycode 80 = Ascii_2
+ shift alt shiftr ctrll keycode 80 = Hex_2
+ altgr shiftl shiftr ctrll keycode 80 = Hex_2
+ alt shiftl shiftr ctrll keycode 80 = Ascii_2
+ shift alt shiftl shiftr ctrll keycode 80 = Hex_2
+keycode 81 = KP_3
+ altgr keycode 81 = Hex_3
+ alt keycode 81 = Ascii_3
+ shift alt keycode 81 = Hex_3
+ altgr shiftl keycode 81 = Hex_3
+ alt shiftl keycode 81 = Ascii_3
+ shift alt shiftl keycode 81 = Hex_3
+ altgr shiftr keycode 81 = Hex_3
+ alt shiftr keycode 81 = Ascii_3
+ shift alt shiftr keycode 81 = Hex_3
+ altgr shiftl shiftr keycode 81 = Hex_3
+ alt shiftl shiftr keycode 81 = Ascii_3
+ shift alt shiftl shiftr keycode 81 = Hex_3
+ altgr ctrll keycode 81 = Hex_3
+ alt ctrll keycode 81 = Ascii_3
+ shift alt ctrll keycode 81 = Hex_3
+ altgr shiftl ctrll keycode 81 = Hex_3
+ alt shiftl ctrll keycode 81 = Ascii_3
+ shift alt shiftl ctrll keycode 81 = Hex_3
+ altgr shiftr ctrll keycode 81 = Hex_3
+ alt shiftr ctrll keycode 81 = Ascii_3
+ shift alt shiftr ctrll keycode 81 = Hex_3
+ altgr shiftl shiftr ctrll keycode 81 = Hex_3
+ alt shiftl shiftr ctrll keycode 81 = Ascii_3
+ shift alt shiftl shiftr ctrll keycode 81 = Hex_3
+keycode 82 = KP_0
+ altgr keycode 82 = Hex_0
+ alt keycode 82 = Ascii_0
+ shift alt keycode 82 = Hex_0
+ altgr shiftl keycode 82 = Hex_0
+ alt shiftl keycode 82 = Ascii_0
+ shift alt shiftl keycode 82 = Hex_0
+ altgr shiftr keycode 82 = Hex_0
+ alt shiftr keycode 82 = Ascii_0
+ shift alt shiftr keycode 82 = Hex_0
+ altgr shiftl shiftr keycode 82 = Hex_0
+ alt shiftl shiftr keycode 82 = Ascii_0
+ shift alt shiftl shiftr keycode 82 = Hex_0
+ altgr ctrll keycode 82 = Hex_0
+ alt ctrll keycode 82 = Ascii_0
+ shift alt ctrll keycode 82 = Hex_0
+ altgr shiftl ctrll keycode 82 = Hex_0
+ alt shiftl ctrll keycode 82 = Ascii_0
+ shift alt shiftl ctrll keycode 82 = Hex_0
+ altgr shiftr ctrll keycode 82 = Hex_0
+ alt shiftr ctrll keycode 82 = Ascii_0
+ shift alt shiftr ctrll keycode 82 = Hex_0
+ altgr shiftl shiftr ctrll keycode 82 = Hex_0
+ alt shiftl shiftr ctrll keycode 82 = Ascii_0
+ shift alt shiftl shiftr ctrll keycode 82 = Hex_0
+keycode 83 = KP_Comma
+ altgr control keycode 83 = Boot
+ control alt keycode 83 = Boot
+ altgr control alt keycode 83 = Boot
+ altgr control shiftl keycode 83 = Boot
+ control alt shiftl keycode 83 = Boot
+ altgr control alt shiftl keycode 83 = Boot
+ altgr control shiftr keycode 83 = Boot
+ control alt shiftr keycode 83 = Boot
+ altgr control alt shiftr keycode 83 = Boot
+ altgr control shiftl shiftr keycode 83 = Boot
+ control alt shiftl shiftr keycode 83 = Boot
+ altgr control alt shiftl shiftr keycode 83 = Boot
+ altgr control ctrll keycode 83 = Boot
+ control alt ctrll keycode 83 = Boot
+ altgr control alt ctrll keycode 83 = Boot
+ altgr control shiftl ctrll keycode 83 = Boot
+ control alt shiftl ctrll keycode 83 = Boot
+ altgr control alt shiftl ctrll keycode 83 = Boot
+ altgr control shiftr ctrll keycode 83 = Boot
+ control alt shiftr ctrll keycode 83 = Boot
+ altgr control alt shiftr ctrll keycode 83 = Boot
+ altgr control shiftl shiftr ctrll keycode 83 = Boot
+ control alt shiftl shiftr ctrll keycode 83 = Boot
+ altgr control alt shiftl shiftr ctrll keycode 83 = Boot
+keycode 84 = Last_Console Last_Console Last_Console
+ control keycode 84 = Last_Console
+ shift control keycode 84 = Last_Console
+ alt keycode 84 = Last_Console
+ control alt keycode 84 = Last_Console
+keycode 85 =
+keycode 86 = backslash
+ shift keycode 86 = bar
+ altgr keycode 86 = +masculine
+ shift altgr keycode 86 = dead_tilde
+ control keycode 86 = Control_backslash
+ shift control keycode 86 = Control_backslash
+ altgr control keycode 86 = Control_backslash
+ shift altgr control keycode 86 = dead_tilde
+ alt keycode 86 = Meta_backslash
+ shift alt keycode 86 = Meta_bar
+ altgr alt keycode 86 = Meta_backslash
+ shift altgr alt keycode 86 = dead_tilde
+ control alt keycode 86 = Meta_Control_backslash
+ shift control alt keycode 86 = Meta_Control_backslash
+ altgr control alt keycode 86 = Meta_Control_backslash
+ shift altgr control alt keycode 86 = dead_tilde
+ shift shiftl keycode 86 = bar
+ altgr shiftl keycode 86 = +masculine
+ shift altgr shiftl keycode 86 = dead_tilde
+ control shiftl keycode 86 = Control_backslash
+ shift control shiftl keycode 86 = Control_backslash
+ altgr control shiftl keycode 86 = Control_backslash
+ shift altgr control shiftl keycode 86 = dead_tilde
+ alt shiftl keycode 86 = Meta_backslash
+ shift alt shiftl keycode 86 = Meta_bar
+ altgr alt shiftl keycode 86 = Meta_backslash
+ shift altgr alt shiftl keycode 86 = dead_tilde
+ control alt shiftl keycode 86 = Meta_Control_backslash
+ shift control alt shiftl keycode 86 = Meta_Control_backslash
+ altgr control alt shiftl keycode 86 = Meta_Control_backslash
+ shift altgr control alt shiftl keycode 86 = dead_tilde
+ shift shiftr keycode 86 = bar
+ altgr shiftr keycode 86 = +masculine
+ shift altgr shiftr keycode 86 = dead_tilde
+ control shiftr keycode 86 = Control_backslash
+ shift control shiftr keycode 86 = Control_backslash
+ altgr control shiftr keycode 86 = Control_backslash
+ shift altgr control shiftr keycode 86 = dead_tilde
+ alt shiftr keycode 86 = Meta_backslash
+ shift alt shiftr keycode 86 = Meta_bar
+ altgr alt shiftr keycode 86 = Meta_backslash
+ shift altgr alt shiftr keycode 86 = dead_tilde
+ control alt shiftr keycode 86 = Meta_Control_backslash
+ shift control alt shiftr keycode 86 = Meta_Control_backslash
+ altgr control alt shiftr keycode 86 = Meta_Control_backslash
+ shift altgr control alt shiftr keycode 86 = dead_tilde
+ shift shiftl shiftr keycode 86 = bar
+ altgr shiftl shiftr keycode 86 = +masculine
+ shift altgr shiftl shiftr keycode 86 = dead_tilde
+ control shiftl shiftr keycode 86 = Control_backslash
+ shift control shiftl shiftr keycode 86 = Control_backslash
+ altgr control shiftl shiftr keycode 86 = Control_backslash
+ shift altgr control shiftl shiftr keycode 86 = dead_tilde
+ alt shiftl shiftr keycode 86 = Meta_backslash
+ shift alt shiftl shiftr keycode 86 = Meta_bar
+ altgr alt shiftl shiftr keycode 86 = Meta_backslash
+ shift altgr alt shiftl shiftr keycode 86 = dead_tilde
+ control alt shiftl shiftr keycode 86 = Meta_Control_backslash
+ shift control alt shiftl shiftr keycode 86 = Meta_Control_backslash
+ altgr control alt shiftl shiftr keycode 86 = Meta_Control_backslash
+ shift altgr control alt shiftl shiftr keycode 86 = dead_tilde
+ shift ctrll keycode 86 = bar
+ altgr ctrll keycode 86 = +masculine
+ shift altgr ctrll keycode 86 = dead_tilde
+ control ctrll keycode 86 = Control_backslash
+ shift control ctrll keycode 86 = Control_backslash
+ altgr control ctrll keycode 86 = Control_backslash
+ shift altgr control ctrll keycode 86 = dead_tilde
+ alt ctrll keycode 86 = Meta_backslash
+ shift alt ctrll keycode 86 = Meta_bar
+ altgr alt ctrll keycode 86 = Meta_backslash
+ shift altgr alt ctrll keycode 86 = dead_tilde
+ control alt ctrll keycode 86 = Meta_Control_backslash
+ shift control alt ctrll keycode 86 = Meta_Control_backslash
+ altgr control alt ctrll keycode 86 = Meta_Control_backslash
+ shift altgr control alt ctrll keycode 86 = dead_tilde
+ shift shiftl ctrll keycode 86 = bar
+ altgr shiftl ctrll keycode 86 = +masculine
+ shift altgr shiftl ctrll keycode 86 = dead_tilde
+ control shiftl ctrll keycode 86 = Control_backslash
+ shift control shiftl ctrll keycode 86 = Control_backslash
+ altgr control shiftl ctrll keycode 86 = Control_backslash
+ shift altgr control shiftl ctrll keycode 86 = dead_tilde
+ alt shiftl ctrll keycode 86 = Meta_backslash
+ shift alt shiftl ctrll keycode 86 = Meta_bar
+ altgr alt shiftl ctrll keycode 86 = Meta_backslash
+ shift altgr alt shiftl ctrll keycode 86 = dead_tilde
+ control alt shiftl ctrll keycode 86 = Meta_Control_backslash
+ shift control alt shiftl ctrll keycode 86 = Meta_Control_backslash
+ altgr control alt shiftl ctrll keycode 86 = Meta_Control_backslash
+ shift altgr control alt shiftl ctrll keycode 86 = dead_tilde
+ shift shiftr ctrll keycode 86 = bar
+ altgr shiftr ctrll keycode 86 = +masculine
+ shift altgr shiftr ctrll keycode 86 = dead_tilde
+ control shiftr ctrll keycode 86 = Control_backslash
+ shift control shiftr ctrll keycode 86 = Control_backslash
+ altgr control shiftr ctrll keycode 86 = Control_backslash
+ shift altgr control shiftr ctrll keycode 86 = dead_tilde
+ alt shiftr ctrll keycode 86 = Meta_backslash
+ shift alt shiftr ctrll keycode 86 = Meta_bar
+ altgr alt shiftr ctrll keycode 86 = Meta_backslash
+ shift altgr alt shiftr ctrll keycode 86 = dead_tilde
+ control alt shiftr ctrll keycode 86 = Meta_Control_backslash
+ shift control alt shiftr ctrll keycode 86 = Meta_Control_backslash
+ altgr control alt shiftr ctrll keycode 86 = Meta_Control_backslash
+ shift altgr control alt shiftr ctrll keycode 86 = dead_tilde
+ shift shiftl shiftr ctrll keycode 86 = bar
+ altgr shiftl shiftr ctrll keycode 86 = +masculine
+ shift altgr shiftl shiftr ctrll keycode 86 = dead_tilde
+ control shiftl shiftr ctrll keycode 86 = Control_backslash
+ shift control shiftl shiftr ctrll keycode 86 = Control_backslash
+ altgr control shiftl shiftr ctrll keycode 86 = Control_backslash
+ shift altgr control shiftl shiftr ctrll keycode 86 = dead_tilde
+ alt shiftl shiftr ctrll keycode 86 = Meta_backslash
+ shift alt shiftl shiftr ctrll keycode 86 = Meta_bar
+ altgr alt shiftl shiftr ctrll keycode 86 = Meta_backslash
+ shift altgr alt shiftl shiftr ctrll keycode 86 = dead_tilde
+ control alt shiftl shiftr ctrll keycode 86 = Meta_Control_backslash
+ shift control alt shiftl shiftr ctrll keycode 86 = Meta_Control_backslash
+ altgr control alt shiftl shiftr ctrll keycode 86 = Meta_Control_backslash
+ shift altgr control alt shiftl shiftr ctrll keycode 86 = dead_tilde
+keycode 87 = F11
+ shift keycode 87 = F23
+ altgr keycode 87 = Console_23
+ shift altgr keycode 87 = Console_35
+ control keycode 87 = F35
+ shift control keycode 87 = F47
+ altgr control keycode 87 = Console_23
+ shift altgr control keycode 87 = Console_35
+ alt keycode 87 = Console_11
+ shift alt keycode 87 = Console_23
+ control alt keycode 87 = Console_11
+ shift control alt keycode 87 = Console_23
+ shift shiftl keycode 87 = F23
+ altgr shiftl keycode 87 = Console_23
+ shift altgr shiftl keycode 87 = Console_35
+ control shiftl keycode 87 = F35
+ shift control shiftl keycode 87 = F47
+ altgr control shiftl keycode 87 = Console_23
+ shift altgr control shiftl keycode 87 = Console_35
+ alt shiftl keycode 87 = Console_11
+ shift alt shiftl keycode 87 = Console_23
+ control alt shiftl keycode 87 = Console_11
+ shift control alt shiftl keycode 87 = Console_23
+ shift shiftr keycode 87 = F23
+ altgr shiftr keycode 87 = Console_23
+ shift altgr shiftr keycode 87 = Console_35
+ control shiftr keycode 87 = F35
+ shift control shiftr keycode 87 = F47
+ altgr control shiftr keycode 87 = Console_23
+ shift altgr control shiftr keycode 87 = Console_35
+ alt shiftr keycode 87 = Console_11
+ shift alt shiftr keycode 87 = Console_23
+ control alt shiftr keycode 87 = Console_11
+ shift control alt shiftr keycode 87 = Console_23
+ shift shiftl shiftr keycode 87 = F23
+ altgr shiftl shiftr keycode 87 = Console_23
+ shift altgr shiftl shiftr keycode 87 = Console_35
+ control shiftl shiftr keycode 87 = F35
+ shift control shiftl shiftr keycode 87 = F47
+ altgr control shiftl shiftr keycode 87 = Console_23
+ shift altgr control shiftl shiftr keycode 87 = Console_35
+ alt shiftl shiftr keycode 87 = Console_11
+ shift alt shiftl shiftr keycode 87 = Console_23
+ control alt shiftl shiftr keycode 87 = Console_11
+ shift control alt shiftl shiftr keycode 87 = Console_23
+ shift ctrll keycode 87 = F23
+ altgr ctrll keycode 87 = Console_23
+ shift altgr ctrll keycode 87 = Console_35
+ control ctrll keycode 87 = F35
+ shift control ctrll keycode 87 = F47
+ altgr control ctrll keycode 87 = Console_23
+ shift altgr control ctrll keycode 87 = Console_35
+ alt ctrll keycode 87 = Console_11
+ shift alt ctrll keycode 87 = Console_23
+ control alt ctrll keycode 87 = Console_11
+ shift control alt ctrll keycode 87 = Console_23
+ shift shiftl ctrll keycode 87 = F23
+ altgr shiftl ctrll keycode 87 = Console_23
+ shift altgr shiftl ctrll keycode 87 = Console_35
+ control shiftl ctrll keycode 87 = F35
+ shift control shiftl ctrll keycode 87 = F47
+ altgr control shiftl ctrll keycode 87 = Console_23
+ shift altgr control shiftl ctrll keycode 87 = Console_35
+ alt shiftl ctrll keycode 87 = Console_11
+ shift alt shiftl ctrll keycode 87 = Console_23
+ control alt shiftl ctrll keycode 87 = Console_11
+ shift control alt shiftl ctrll keycode 87 = Console_23
+ shift shiftr ctrll keycode 87 = F23
+ altgr shiftr ctrll keycode 87 = Console_23
+ shift altgr shiftr ctrll keycode 87 = Console_35
+ control shiftr ctrll keycode 87 = F35
+ shift control shiftr ctrll keycode 87 = F47
+ altgr control shiftr ctrll keycode 87 = Console_23
+ shift altgr control shiftr ctrll keycode 87 = Console_35
+ alt shiftr ctrll keycode 87 = Console_11
+ shift alt shiftr ctrll keycode 87 = Console_23
+ control alt shiftr ctrll keycode 87 = Console_11
+ shift control alt shiftr ctrll keycode 87 = Console_23
+ shift shiftl shiftr ctrll keycode 87 = F23
+ altgr shiftl shiftr ctrll keycode 87 = Console_23
+ shift altgr shiftl shiftr ctrll keycode 87 = Console_35
+ control shiftl shiftr ctrll keycode 87 = F35
+ shift control shiftl shiftr ctrll keycode 87 = F47
+ altgr control shiftl shiftr ctrll keycode 87 = Console_23
+ shift altgr control shiftl shiftr ctrll keycode 87 = Console_35
+ alt shiftl shiftr ctrll keycode 87 = Console_11
+ shift alt shiftl shiftr ctrll keycode 87 = Console_23
+ control alt shiftl shiftr ctrll keycode 87 = Console_11
+ shift control alt shiftl shiftr ctrll keycode 87 = Console_23
+keycode 88 = F12
+ shift keycode 88 = F24
+ altgr keycode 88 = Console_24
+ shift altgr keycode 88 = Console_36
+ control keycode 88 = F36
+ shift control keycode 88 = F48
+ altgr control keycode 88 = Console_24
+ shift altgr control keycode 88 = Console_36
+ alt keycode 88 = Console_12
+ shift alt keycode 88 = Console_24
+ control alt keycode 88 = Console_12
+ shift control alt keycode 88 = Console_24
+ shift shiftl keycode 88 = F24
+ altgr shiftl keycode 88 = Console_24
+ shift altgr shiftl keycode 88 = Console_36
+ control shiftl keycode 88 = F36
+ shift control shiftl keycode 88 = F48
+ altgr control shiftl keycode 88 = Console_24
+ shift altgr control shiftl keycode 88 = Console_36
+ alt shiftl keycode 88 = Console_12
+ shift alt shiftl keycode 88 = Console_24
+ control alt shiftl keycode 88 = Console_12
+ shift control alt shiftl keycode 88 = Console_24
+ shift shiftr keycode 88 = F24
+ altgr shiftr keycode 88 = Console_24
+ shift altgr shiftr keycode 88 = Console_36
+ control shiftr keycode 88 = F36
+ shift control shiftr keycode 88 = F48
+ altgr control shiftr keycode 88 = Console_24
+ shift altgr control shiftr keycode 88 = Console_36
+ alt shiftr keycode 88 = Console_12
+ shift alt shiftr keycode 88 = Console_24
+ control alt shiftr keycode 88 = Console_12
+ shift control alt shiftr keycode 88 = Console_24
+ shift shiftl shiftr keycode 88 = F24
+ altgr shiftl shiftr keycode 88 = Console_24
+ shift altgr shiftl shiftr keycode 88 = Console_36
+ control shiftl shiftr keycode 88 = F36
+ shift control shiftl shiftr keycode 88 = F48
+ altgr control shiftl shiftr keycode 88 = Console_24
+ shift altgr control shiftl shiftr keycode 88 = Console_36
+ alt shiftl shiftr keycode 88 = Console_12
+ shift alt shiftl shiftr keycode 88 = Console_24
+ control alt shiftl shiftr keycode 88 = Console_12
+ shift control alt shiftl shiftr keycode 88 = Console_24
+ shift ctrll keycode 88 = F24
+ altgr ctrll keycode 88 = Console_24
+ shift altgr ctrll keycode 88 = Console_36
+ control ctrll keycode 88 = F36
+ shift control ctrll keycode 88 = F48
+ altgr control ctrll keycode 88 = Console_24
+ shift altgr control ctrll keycode 88 = Console_36
+ alt ctrll keycode 88 = Console_12
+ shift alt ctrll keycode 88 = Console_24
+ control alt ctrll keycode 88 = Console_12
+ shift control alt ctrll keycode 88 = Console_24
+ shift shiftl ctrll keycode 88 = F24
+ altgr shiftl ctrll keycode 88 = Console_24
+ shift altgr shiftl ctrll keycode 88 = Console_36
+ control shiftl ctrll keycode 88 = F36
+ shift control shiftl ctrll keycode 88 = F48
+ altgr control shiftl ctrll keycode 88 = Console_24
+ shift altgr control shiftl ctrll keycode 88 = Console_36
+ alt shiftl ctrll keycode 88 = Console_12
+ shift alt shiftl ctrll keycode 88 = Console_24
+ control alt shiftl ctrll keycode 88 = Console_12
+ shift control alt shiftl ctrll keycode 88 = Console_24
+ shift shiftr ctrll keycode 88 = F24
+ altgr shiftr ctrll keycode 88 = Console_24
+ shift altgr shiftr ctrll keycode 88 = Console_36
+ control shiftr ctrll keycode 88 = F36
+ shift control shiftr ctrll keycode 88 = F48
+ altgr control shiftr ctrll keycode 88 = Console_24
+ shift altgr control shiftr ctrll keycode 88 = Console_36
+ alt shiftr ctrll keycode 88 = Console_12
+ shift alt shiftr ctrll keycode 88 = Console_24
+ control alt shiftr ctrll keycode 88 = Console_12
+ shift control alt shiftr ctrll keycode 88 = Console_24
+ shift shiftl shiftr ctrll keycode 88 = F24
+ altgr shiftl shiftr ctrll keycode 88 = Console_24
+ shift altgr shiftl shiftr ctrll keycode 88 = Console_36
+ control shiftl shiftr ctrll keycode 88 = F36
+ shift control shiftl shiftr ctrll keycode 88 = F48
+ altgr control shiftl shiftr ctrll keycode 88 = Console_24
+ shift altgr control shiftl shiftr ctrll keycode 88 = Console_36
+ alt shiftl shiftr ctrll keycode 88 = Console_12
+ shift alt shiftl shiftr ctrll keycode 88 = Console_24
+ control alt shiftl shiftr ctrll keycode 88 = Console_12
+ shift control alt shiftl shiftr ctrll keycode 88 = Console_24
+keycode 89 = slash
+ shift keycode 89 = question
+ altgr keycode 89 = degree
+ shift altgr keycode 89 = questiondown
+ control keycode 89 = Delete
+ shift control keycode 89 = Delete
+ altgr control keycode 89 = Delete
+ shift altgr control keycode 89 = Delete
+ alt keycode 89 = Meta_slash
+ shift alt keycode 89 = Meta_question
+ altgr alt keycode 89 = Meta_slash
+ shift altgr alt keycode 89 = Meta_question
+ control alt keycode 89 = Meta_Delete
+ shift control alt keycode 89 = Meta_Delete
+ altgr control alt keycode 89 = Meta_Delete
+ shift altgr control alt keycode 89 = Meta_Delete
+ shift shiftl keycode 89 = question
+ altgr shiftl keycode 89 = degree
+ shift altgr shiftl keycode 89 = questiondown
+ control shiftl keycode 89 = Delete
+ shift control shiftl keycode 89 = Delete
+ altgr control shiftl keycode 89 = Delete
+ shift altgr control shiftl keycode 89 = Delete
+ alt shiftl keycode 89 = Meta_slash
+ shift alt shiftl keycode 89 = Meta_question
+ altgr alt shiftl keycode 89 = Meta_slash
+ shift altgr alt shiftl keycode 89 = Meta_question
+ control alt shiftl keycode 89 = Meta_Delete
+ shift control alt shiftl keycode 89 = Meta_Delete
+ altgr control alt shiftl keycode 89 = Meta_Delete
+ shift altgr control alt shiftl keycode 89 = Meta_Delete
+ shift shiftr keycode 89 = question
+ altgr shiftr keycode 89 = degree
+ shift altgr shiftr keycode 89 = questiondown
+ control shiftr keycode 89 = Delete
+ shift control shiftr keycode 89 = Delete
+ altgr control shiftr keycode 89 = Delete
+ shift altgr control shiftr keycode 89 = Delete
+ alt shiftr keycode 89 = Meta_slash
+ shift alt shiftr keycode 89 = Meta_question
+ altgr alt shiftr keycode 89 = Meta_slash
+ shift altgr alt shiftr keycode 89 = Meta_question
+ control alt shiftr keycode 89 = Meta_Delete
+ shift control alt shiftr keycode 89 = Meta_Delete
+ altgr control alt shiftr keycode 89 = Meta_Delete
+ shift altgr control alt shiftr keycode 89 = Meta_Delete
+ shift shiftl shiftr keycode 89 = question
+ altgr shiftl shiftr keycode 89 = degree
+ shift altgr shiftl shiftr keycode 89 = questiondown
+ control shiftl shiftr keycode 89 = Delete
+ shift control shiftl shiftr keycode 89 = Delete
+ altgr control shiftl shiftr keycode 89 = Delete
+ shift altgr control shiftl shiftr keycode 89 = Delete
+ alt shiftl shiftr keycode 89 = Meta_slash
+ shift alt shiftl shiftr keycode 89 = Meta_question
+ altgr alt shiftl shiftr keycode 89 = Meta_slash
+ shift altgr alt shiftl shiftr keycode 89 = Meta_question
+ control alt shiftl shiftr keycode 89 = Meta_Delete
+ shift control alt shiftl shiftr keycode 89 = Meta_Delete
+ altgr control alt shiftl shiftr keycode 89 = Meta_Delete
+ shift altgr control alt shiftl shiftr keycode 89 = Meta_Delete
+ shift ctrll keycode 89 = question
+ altgr ctrll keycode 89 = degree
+ shift altgr ctrll keycode 89 = questiondown
+ control ctrll keycode 89 = Delete
+ shift control ctrll keycode 89 = Delete
+ altgr control ctrll keycode 89 = Delete
+ shift altgr control ctrll keycode 89 = Delete
+ alt ctrll keycode 89 = Meta_slash
+ shift alt ctrll keycode 89 = Meta_question
+ altgr alt ctrll keycode 89 = Meta_slash
+ shift altgr alt ctrll keycode 89 = Meta_question
+ control alt ctrll keycode 89 = Meta_Delete
+ shift control alt ctrll keycode 89 = Meta_Delete
+ altgr control alt ctrll keycode 89 = Meta_Delete
+ shift altgr control alt ctrll keycode 89 = Meta_Delete
+ shift shiftl ctrll keycode 89 = question
+ altgr shiftl ctrll keycode 89 = degree
+ shift altgr shiftl ctrll keycode 89 = questiondown
+ control shiftl ctrll keycode 89 = Delete
+ shift control shiftl ctrll keycode 89 = Delete
+ altgr control shiftl ctrll keycode 89 = Delete
+ shift altgr control shiftl ctrll keycode 89 = Delete
+ alt shiftl ctrll keycode 89 = Meta_slash
+ shift alt shiftl ctrll keycode 89 = Meta_question
+ altgr alt shiftl ctrll keycode 89 = Meta_slash
+ shift altgr alt shiftl ctrll keycode 89 = Meta_question
+ control alt shiftl ctrll keycode 89 = Meta_Delete
+ shift control alt shiftl ctrll keycode 89 = Meta_Delete
+ altgr control alt shiftl ctrll keycode 89 = Meta_Delete
+ shift altgr control alt shiftl ctrll keycode 89 = Meta_Delete
+ shift shiftr ctrll keycode 89 = question
+ altgr shiftr ctrll keycode 89 = degree
+ shift altgr shiftr ctrll keycode 89 = questiondown
+ control shiftr ctrll keycode 89 = Delete
+ shift control shiftr ctrll keycode 89 = Delete
+ altgr control shiftr ctrll keycode 89 = Delete
+ shift altgr control shiftr ctrll keycode 89 = Delete
+ alt shiftr ctrll keycode 89 = Meta_slash
+ shift alt shiftr ctrll keycode 89 = Meta_question
+ altgr alt shiftr ctrll keycode 89 = Meta_slash
+ shift altgr alt shiftr ctrll keycode 89 = Meta_question
+ control alt shiftr ctrll keycode 89 = Meta_Delete
+ shift control alt shiftr ctrll keycode 89 = Meta_Delete
+ altgr control alt shiftr ctrll keycode 89 = Meta_Delete
+ shift altgr control alt shiftr ctrll keycode 89 = Meta_Delete
+ shift shiftl shiftr ctrll keycode 89 = question
+ altgr shiftl shiftr ctrll keycode 89 = degree
+ shift altgr shiftl shiftr ctrll keycode 89 = questiondown
+ control shiftl shiftr ctrll keycode 89 = Delete
+ shift control shiftl shiftr ctrll keycode 89 = Delete
+ altgr control shiftl shiftr ctrll keycode 89 = Delete
+ shift altgr control shiftl shiftr ctrll keycode 89 = Delete
+ alt shiftl shiftr ctrll keycode 89 = Meta_slash
+ shift alt shiftl shiftr ctrll keycode 89 = Meta_question
+ altgr alt shiftl shiftr ctrll keycode 89 = Meta_slash
+ shift altgr alt shiftl shiftr ctrll keycode 89 = Meta_question
+ control alt shiftl shiftr ctrll keycode 89 = Meta_Delete
+ shift control alt shiftl shiftr ctrll keycode 89 = Meta_Delete
+ altgr control alt shiftl shiftr ctrll keycode 89 = Meta_Delete
+ shift altgr control alt shiftl shiftr ctrll keycode 89 = Meta_Delete
+keycode 90 =
+keycode 91 =
+keycode 92 =
+keycode 93 =
+keycode 94 =
+keycode 95 =
+keycode 96 = KP_Enter
+ altgr keycode 96 = Hex_F
+ shift alt keycode 96 = Hex_F
+ altgr shiftl keycode 96 = Hex_F
+ shift alt shiftl keycode 96 = Hex_F
+ altgr shiftr keycode 96 = Hex_F
+ shift alt shiftr keycode 96 = Hex_F
+ altgr shiftl shiftr keycode 96 = Hex_F
+ shift alt shiftl shiftr keycode 96 = Hex_F
+ altgr ctrll keycode 96 = Hex_F
+ shift alt ctrll keycode 96 = Hex_F
+ altgr shiftl ctrll keycode 96 = Hex_F
+ shift alt shiftl ctrll keycode 96 = Hex_F
+ altgr shiftr ctrll keycode 96 = Hex_F
+ shift alt shiftr ctrll keycode 96 = Hex_F
+ altgr shiftl shiftr ctrll keycode 96 = Hex_F
+ shift alt shiftl shiftr ctrll keycode 96 = Hex_F
+keycode 97 = Control
+keycode 98 = KP_Divide
+ altgr keycode 98 = Hex_B
+ shift alt keycode 98 = Hex_B
+ altgr shiftl keycode 98 = Hex_B
+ shift alt shiftl keycode 98 = Hex_B
+ altgr shiftr keycode 98 = Hex_B
+ shift alt shiftr keycode 98 = Hex_B
+ altgr shiftl shiftr keycode 98 = Hex_B
+ shift alt shiftl shiftr keycode 98 = Hex_B
+ altgr ctrll keycode 98 = Hex_B
+ shift alt ctrll keycode 98 = Hex_B
+ altgr shiftl ctrll keycode 98 = Hex_B
+ shift alt shiftl ctrll keycode 98 = Hex_B
+ altgr shiftr ctrll keycode 98 = Hex_B
+ shift alt shiftr ctrll keycode 98 = Hex_B
+ altgr shiftl shiftr ctrll keycode 98 = Hex_B
+ shift alt shiftl shiftr ctrll keycode 98 = Hex_B
+keycode 99 =
+ altgr keycode 99 = Control_backslash
+ shift altgr keycode 99 = Control_backslash
+ control keycode 99 = Control_backslash
+ shift control keycode 99 = Control_backslash
+ altgr control keycode 99 = Control_backslash
+ shift altgr control keycode 99 = Control_backslash
+ alt keycode 99 = Control_backslash
+ shift alt keycode 99 = Control_backslash
+ altgr alt keycode 99 = Control_backslash
+ shift altgr alt keycode 99 = Control_backslash
+ control alt keycode 99 = Control_backslash
+ shift control alt keycode 99 = Control_backslash
+ altgr control alt keycode 99 = Control_backslash
+ shift altgr control alt keycode 99 = Control_backslash
+ altgr shiftl keycode 99 = Control_backslash
+ shift altgr shiftl keycode 99 = Control_backslash
+ control shiftl keycode 99 = Control_backslash
+ shift control shiftl keycode 99 = Control_backslash
+ altgr control shiftl keycode 99 = Control_backslash
+ shift altgr control shiftl keycode 99 = Control_backslash
+ alt shiftl keycode 99 = Control_backslash
+ shift alt shiftl keycode 99 = Control_backslash
+ altgr alt shiftl keycode 99 = Control_backslash
+ shift altgr alt shiftl keycode 99 = Control_backslash
+ control alt shiftl keycode 99 = Control_backslash
+ shift control alt shiftl keycode 99 = Control_backslash
+ altgr control alt shiftl keycode 99 = Control_backslash
+ shift altgr control alt shiftl keycode 99 = Control_backslash
+ altgr shiftr keycode 99 = Control_backslash
+ shift altgr shiftr keycode 99 = Control_backslash
+ control shiftr keycode 99 = Control_backslash
+ shift control shiftr keycode 99 = Control_backslash
+ altgr control shiftr keycode 99 = Control_backslash
+ shift altgr control shiftr keycode 99 = Control_backslash
+ alt shiftr keycode 99 = Control_backslash
+ shift alt shiftr keycode 99 = Control_backslash
+ altgr alt shiftr keycode 99 = Control_backslash
+ shift altgr alt shiftr keycode 99 = Control_backslash
+ control alt shiftr keycode 99 = Control_backslash
+ shift control alt shiftr keycode 99 = Control_backslash
+ altgr control alt shiftr keycode 99 = Control_backslash
+ shift altgr control alt shiftr keycode 99 = Control_backslash
+ altgr shiftl shiftr keycode 99 = Control_backslash
+ shift altgr shiftl shiftr keycode 99 = Control_backslash
+ control shiftl shiftr keycode 99 = Control_backslash
+ shift control shiftl shiftr keycode 99 = Control_backslash
+ altgr control shiftl shiftr keycode 99 = Control_backslash
+ shift altgr control shiftl shiftr keycode 99 = Control_backslash
+ alt shiftl shiftr keycode 99 = Control_backslash
+ shift alt shiftl shiftr keycode 99 = Control_backslash
+ altgr alt shiftl shiftr keycode 99 = Control_backslash
+ shift altgr alt shiftl shiftr keycode 99 = Control_backslash
+ control alt shiftl shiftr keycode 99 = Control_backslash
+ shift control alt shiftl shiftr keycode 99 = Control_backslash
+ altgr control alt shiftl shiftr keycode 99 = Control_backslash
+ shift altgr control alt shiftl shiftr keycode 99 = Control_backslash
+ altgr ctrll keycode 99 = Control_backslash
+ shift altgr ctrll keycode 99 = Control_backslash
+ control ctrll keycode 99 = Control_backslash
+ shift control ctrll keycode 99 = Control_backslash
+ altgr control ctrll keycode 99 = Control_backslash
+ shift altgr control ctrll keycode 99 = Control_backslash
+ alt ctrll keycode 99 = Control_backslash
+ shift alt ctrll keycode 99 = Control_backslash
+ altgr alt ctrll keycode 99 = Control_backslash
+ shift altgr alt ctrll keycode 99 = Control_backslash
+ control alt ctrll keycode 99 = Control_backslash
+ shift control alt ctrll keycode 99 = Control_backslash
+ altgr control alt ctrll keycode 99 = Control_backslash
+ shift altgr control alt ctrll keycode 99 = Control_backslash
+ altgr shiftl ctrll keycode 99 = Control_backslash
+ shift altgr shiftl ctrll keycode 99 = Control_backslash
+ control shiftl ctrll keycode 99 = Control_backslash
+ shift control shiftl ctrll keycode 99 = Control_backslash
+ altgr control shiftl ctrll keycode 99 = Control_backslash
+ shift altgr control shiftl ctrll keycode 99 = Control_backslash
+ alt shiftl ctrll keycode 99 = Control_backslash
+ shift alt shiftl ctrll keycode 99 = Control_backslash
+ altgr alt shiftl ctrll keycode 99 = Control_backslash
+ shift altgr alt shiftl ctrll keycode 99 = Control_backslash
+ control alt shiftl ctrll keycode 99 = Control_backslash
+ shift control alt shiftl ctrll keycode 99 = Control_backslash
+ altgr control alt shiftl ctrll keycode 99 = Control_backslash
+ shift altgr control alt shiftl ctrll keycode 99 = Control_backslash
+ altgr shiftr ctrll keycode 99 = Control_backslash
+ shift altgr shiftr ctrll keycode 99 = Control_backslash
+ control shiftr ctrll keycode 99 = Control_backslash
+ shift control shiftr ctrll keycode 99 = Control_backslash
+ altgr control shiftr ctrll keycode 99 = Control_backslash
+ shift altgr control shiftr ctrll keycode 99 = Control_backslash
+ alt shiftr ctrll keycode 99 = Control_backslash
+ shift alt shiftr ctrll keycode 99 = Control_backslash
+ altgr alt shiftr ctrll keycode 99 = Control_backslash
+ shift altgr alt shiftr ctrll keycode 99 = Control_backslash
+ control alt shiftr ctrll keycode 99 = Control_backslash
+ shift control alt shiftr ctrll keycode 99 = Control_backslash
+ altgr control alt shiftr ctrll keycode 99 = Control_backslash
+ shift altgr control alt shiftr ctrll keycode 99 = Control_backslash
+ altgr shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift altgr shiftl shiftr ctrll keycode 99 = Control_backslash
+ control shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift control shiftl shiftr ctrll keycode 99 = Control_backslash
+ altgr control shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift altgr control shiftl shiftr ctrll keycode 99 = Control_backslash
+ alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ altgr alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift altgr alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ control alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift control alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ altgr control alt shiftl shiftr ctrll keycode 99 = Control_backslash
+ shift altgr control alt shiftl shiftr ctrll keycode 99 = Control_backslash
+keycode 100 = AltGr
+keycode 101 = Break Break Break
+ control keycode 101 = Break
+ shift control keycode 101 = Break
+ alt keycode 101 = Break
+ control alt keycode 101 = Break
+keycode 102 = Find
+keycode 103 = Up
+ alt keycode 103 = KeyboardSignal
+ alt shiftl keycode 103 = KeyboardSignal
+ alt shiftr keycode 103 = KeyboardSignal
+ alt shiftl shiftr keycode 103 = KeyboardSignal
+ alt ctrll keycode 103 = KeyboardSignal
+ alt shiftl ctrll keycode 103 = KeyboardSignal
+ alt shiftr ctrll keycode 103 = KeyboardSignal
+ alt shiftl shiftr ctrll keycode 103 = KeyboardSignal
+keycode 104 = Prior
+ shift keycode 104 = Scroll_Backward
+ shift shiftl keycode 104 = Scroll_Backward
+ shift shiftr keycode 104 = Scroll_Backward
+ shift shiftl shiftr keycode 104 = Scroll_Backward
+ shift ctrll keycode 104 = Scroll_Backward
+ shift shiftl ctrll keycode 104 = Scroll_Backward
+ shift shiftr ctrll keycode 104 = Scroll_Backward
+ shift shiftl shiftr ctrll keycode 104 = Scroll_Backward
+keycode 105 = Left
+ alt keycode 105 = Decr_Console
+ alt shiftl keycode 105 = Decr_Console
+ alt shiftr keycode 105 = Decr_Console
+ alt shiftl shiftr keycode 105 = Decr_Console
+ alt ctrll keycode 105 = Decr_Console
+ alt shiftl ctrll keycode 105 = Decr_Console
+ alt shiftr ctrll keycode 105 = Decr_Console
+ alt shiftl shiftr ctrll keycode 105 = Decr_Console
+keycode 106 = Right
+ alt keycode 106 = Incr_Console
+ alt shiftl keycode 106 = Incr_Console
+ alt shiftr keycode 106 = Incr_Console
+ alt shiftl shiftr keycode 106 = Incr_Console
+ alt ctrll keycode 106 = Incr_Console
+ alt shiftl ctrll keycode 106 = Incr_Console
+ alt shiftr ctrll keycode 106 = Incr_Console
+ alt shiftl shiftr ctrll keycode 106 = Incr_Console
+keycode 107 = Select
+keycode 108 = Down
+keycode 109 = Next
+ shift keycode 109 = Scroll_Forward
+ shift shiftl keycode 109 = Scroll_Forward
+ shift shiftr keycode 109 = Scroll_Forward
+ shift shiftl shiftr keycode 109 = Scroll_Forward
+ shift ctrll keycode 109 = Scroll_Forward
+ shift shiftl ctrll keycode 109 = Scroll_Forward
+ shift shiftr ctrll keycode 109 = Scroll_Forward
+ shift shiftl shiftr ctrll keycode 109 = Scroll_Forward
+keycode 110 = Insert
+keycode 111 = Remove
+ altgr control keycode 111 = Boot
+ control alt keycode 111 = Boot
+ altgr control alt keycode 111 = Boot
+ altgr control shiftl keycode 111 = Boot
+ control alt shiftl keycode 111 = Boot
+ altgr control alt shiftl keycode 111 = Boot
+ altgr control shiftr keycode 111 = Boot
+ control alt shiftr keycode 111 = Boot
+ altgr control alt shiftr keycode 111 = Boot
+ altgr control shiftl shiftr keycode 111 = Boot
+ control alt shiftl shiftr keycode 111 = Boot
+ altgr control alt shiftl shiftr keycode 111 = Boot
+ altgr control ctrll keycode 111 = Boot
+ control alt ctrll keycode 111 = Boot
+ altgr control alt ctrll keycode 111 = Boot
+ altgr control shiftl ctrll keycode 111 = Boot
+ control alt shiftl ctrll keycode 111 = Boot
+ altgr control alt shiftl ctrll keycode 111 = Boot
+ altgr control shiftr ctrll keycode 111 = Boot
+ control alt shiftr ctrll keycode 111 = Boot
+ altgr control alt shiftr ctrll keycode 111 = Boot
+ altgr control shiftl shiftr ctrll keycode 111 = Boot
+ control alt shiftl shiftr ctrll keycode 111 = Boot
+ altgr control alt shiftl shiftr ctrll keycode 111 = Boot
+keycode 112 = Macro Macro Macro
+ control keycode 112 = Macro
+ shift control keycode 112 = Macro
+ alt keycode 112 = Macro
+ control alt keycode 112 = Macro
+keycode 113 = F13 F13 F13
+ control keycode 113 = F13
+ shift control keycode 113 = F13
+ alt keycode 113 = F13
+ control alt keycode 113 = F13
+keycode 114 = F14 F14 F14
+ control keycode 114 = F14
+ shift control keycode 114 = F14
+ alt keycode 114 = F14
+ control alt keycode 114 = F14
+keycode 115 = Help Help Help
+ control keycode 115 = Help
+ shift control keycode 115 = Help
+ alt keycode 115 = Help
+ control alt keycode 115 = Help
+keycode 116 = Do Do Do
+ control keycode 116 = Do
+ shift control keycode 116 = Do
+ alt keycode 116 = Do
+ control alt keycode 116 = Do
+keycode 117 = F17 F17 F17
+ control keycode 117 = F17
+ shift control keycode 117 = F17
+ alt keycode 117 = F17
+ control alt keycode 117 = F17
+keycode 118 = KP_MinPlus KP_MinPlus KP_MinPlus
+ control keycode 118 = KP_MinPlus
+ shift control keycode 118 = KP_MinPlus
+ alt keycode 118 = KP_MinPlus
+ control alt keycode 118 = KP_MinPlus
+keycode 119 = Pause
+keycode 120 =
+keycode 121 = KP_Period
+keycode 122 =
+keycode 123 =
+keycode 124 =
+keycode 125 = Alt
+keycode 126 = Alt
+keycode 127 =
+keycode 128 = nul nul nul
+ control keycode 128 = nul
+ shift control keycode 128 = nul
+ alt keycode 128 = nul
+ control alt keycode 128 = nul
+keycode 129 = nul nul nul
+ control keycode 129 = nul
+ shift control keycode 129 = nul
+ alt keycode 129 = nul
+ control alt keycode 129 = nul
+keycode 130 = nul nul nul
+ control keycode 130 = nul
+ shift control keycode 130 = nul
+ alt keycode 130 = nul
+ control alt keycode 130 = nul
+keycode 131 = nul nul nul
+ control keycode 131 = nul
+ shift control keycode 131 = nul
+ alt keycode 131 = nul
+ control alt keycode 131 = nul
+keycode 132 = nul nul nul
+ control keycode 132 = nul
+ shift control keycode 132 = nul
+ alt keycode 132 = nul
+ control alt keycode 132 = nul
+keycode 133 = nul nul nul
+ control keycode 133 = nul
+ shift control keycode 133 = nul
+ alt keycode 133 = nul
+ control alt keycode 133 = nul
+keycode 134 = nul nul nul
+ control keycode 134 = nul
+ shift control keycode 134 = nul
+ alt keycode 134 = nul
+ control alt keycode 134 = nul
+keycode 135 = nul nul nul
+ control keycode 135 = nul
+ shift control keycode 135 = nul
+ alt keycode 135 = nul
+ control alt keycode 135 = nul
+keycode 136 = nul nul nul
+ control keycode 136 = nul
+ shift control keycode 136 = nul
+ alt keycode 136 = nul
+ control alt keycode 136 = nul
+keycode 137 = nul nul nul
+ control keycode 137 = nul
+ shift control keycode 137 = nul
+ alt keycode 137 = nul
+ control alt keycode 137 = nul
+keycode 138 = nul nul nul
+ control keycode 138 = nul
+ shift control keycode 138 = nul
+ alt keycode 138 = nul
+ control alt keycode 138 = nul
+keycode 139 = nul nul nul
+ control keycode 139 = nul
+ shift control keycode 139 = nul
+ alt keycode 139 = nul
+ control alt keycode 139 = nul
+keycode 140 = nul nul nul
+ control keycode 140 = nul
+ shift control keycode 140 = nul
+ alt keycode 140 = nul
+ control alt keycode 140 = nul
+keycode 141 = nul nul nul
+ control keycode 141 = nul
+ shift control keycode 141 = nul
+ alt keycode 141 = nul
+ control alt keycode 141 = nul
+keycode 142 = nul nul nul
+ control keycode 142 = nul
+ shift control keycode 142 = nul
+ alt keycode 142 = nul
+ control alt keycode 142 = nul
+keycode 143 = nul nul nul
+ control keycode 143 = nul
+ shift control keycode 143 = nul
+ alt keycode 143 = nul
+ control alt keycode 143 = nul
+keycode 144 = nul nul nul
+ control keycode 144 = nul
+ shift control keycode 144 = nul
+ alt keycode 144 = nul
+ control alt keycode 144 = nul
+keycode 145 = nul nul nul
+ control keycode 145 = nul
+ shift control keycode 145 = nul
+ alt keycode 145 = nul
+ control alt keycode 145 = nul
+keycode 146 = nul nul nul
+ control keycode 146 = nul
+ shift control keycode 146 = nul
+ alt keycode 146 = nul
+ control alt keycode 146 = nul
+keycode 147 = nul nul nul
+ control keycode 147 = nul
+ shift control keycode 147 = nul
+ alt keycode 147 = nul
+ control alt keycode 147 = nul
+keycode 148 = nul nul nul
+ control keycode 148 = nul
+ shift control keycode 148 = nul
+ alt keycode 148 = nul
+ control alt keycode 148 = nul
+keycode 149 = nul nul nul
+ control keycode 149 = nul
+ shift control keycode 149 = nul
+ alt keycode 149 = nul
+ control alt keycode 149 = nul
+keycode 150 = nul nul nul
+ control keycode 150 = nul
+ shift control keycode 150 = nul
+ alt keycode 150 = nul
+ control alt keycode 150 = nul
+keycode 151 = nul nul nul
+ control keycode 151 = nul
+ shift control keycode 151 = nul
+ alt keycode 151 = nul
+ control alt keycode 151 = nul
+keycode 152 = nul nul nul
+ control keycode 152 = nul
+ shift control keycode 152 = nul
+ alt keycode 152 = nul
+ control alt keycode 152 = nul
+keycode 153 = nul nul nul
+ control keycode 153 = nul
+ shift control keycode 153 = nul
+ alt keycode 153 = nul
+ control alt keycode 153 = nul
+keycode 154 = nul nul nul
+ control keycode 154 = nul
+ shift control keycode 154 = nul
+ alt keycode 154 = nul
+ control alt keycode 154 = nul
+keycode 155 = nul nul nul
+ control keycode 155 = nul
+ shift control keycode 155 = nul
+ alt keycode 155 = nul
+ control alt keycode 155 = nul
+keycode 156 = nul nul nul
+ control keycode 156 = nul
+ shift control keycode 156 = nul
+ alt keycode 156 = nul
+ control alt keycode 156 = nul
+keycode 157 = nul nul nul
+ control keycode 157 = nul
+ shift control keycode 157 = nul
+ alt keycode 157 = nul
+ control alt keycode 157 = nul
+keycode 158 = nul nul nul
+ control keycode 158 = nul
+ shift control keycode 158 = nul
+ alt keycode 158 = nul
+ control alt keycode 158 = nul
+keycode 159 = nul nul nul
+ control keycode 159 = nul
+ shift control keycode 159 = nul
+ alt keycode 159 = nul
+ control alt keycode 159 = nul
+keycode 160 = nul nul nul
+ control keycode 160 = nul
+ shift control keycode 160 = nul
+ alt keycode 160 = nul
+ control alt keycode 160 = nul
+keycode 161 = nul nul nul
+ control keycode 161 = nul
+ shift control keycode 161 = nul
+ alt keycode 161 = nul
+ control alt keycode 161 = nul
+keycode 162 = nul nul nul
+ control keycode 162 = nul
+ shift control keycode 162 = nul
+ alt keycode 162 = nul
+ control alt keycode 162 = nul
+keycode 163 = nul nul nul
+ control keycode 163 = nul
+ shift control keycode 163 = nul
+ alt keycode 163 = nul
+ control alt keycode 163 = nul
+keycode 164 = nul nul nul
+ control keycode 164 = nul
+ shift control keycode 164 = nul
+ alt keycode 164 = nul
+ control alt keycode 164 = nul
+keycode 165 = nul nul nul
+ control keycode 165 = nul
+ shift control keycode 165 = nul
+ alt keycode 165 = nul
+ control alt keycode 165 = nul
+keycode 166 = nul nul nul
+ control keycode 166 = nul
+ shift control keycode 166 = nul
+ alt keycode 166 = nul
+ control alt keycode 166 = nul
+keycode 167 = nul nul nul
+ control keycode 167 = nul
+ shift control keycode 167 = nul
+ alt keycode 167 = nul
+ control alt keycode 167 = nul
+keycode 168 = nul nul nul
+ control keycode 168 = nul
+ shift control keycode 168 = nul
+ alt keycode 168 = nul
+ control alt keycode 168 = nul
+keycode 169 = nul nul nul
+ control keycode 169 = nul
+ shift control keycode 169 = nul
+ alt keycode 169 = nul
+ control alt keycode 169 = nul
+keycode 170 = nul nul nul
+ control keycode 170 = nul
+ shift control keycode 170 = nul
+ alt keycode 170 = nul
+ control alt keycode 170 = nul
+keycode 171 = nul nul nul
+ control keycode 171 = nul
+ shift control keycode 171 = nul
+ alt keycode 171 = nul
+ control alt keycode 171 = nul
+keycode 172 = nul nul nul
+ control keycode 172 = nul
+ shift control keycode 172 = nul
+ alt keycode 172 = nul
+ control alt keycode 172 = nul
+keycode 173 = nul nul nul
+ control keycode 173 = nul
+ shift control keycode 173 = nul
+ alt keycode 173 = nul
+ control alt keycode 173 = nul
+keycode 174 = nul nul nul
+ control keycode 174 = nul
+ shift control keycode 174 = nul
+ alt keycode 174 = nul
+ control alt keycode 174 = nul
+keycode 175 = nul nul nul
+ control keycode 175 = nul
+ shift control keycode 175 = nul
+ alt keycode 175 = nul
+ control alt keycode 175 = nul
+keycode 176 = nul nul nul
+ control keycode 176 = nul
+ shift control keycode 176 = nul
+ alt keycode 176 = nul
+ control alt keycode 176 = nul
+keycode 177 = nul nul nul
+ control keycode 177 = nul
+ shift control keycode 177 = nul
+ alt keycode 177 = nul
+ control alt keycode 177 = nul
+keycode 178 = nul nul nul
+ control keycode 178 = nul
+ shift control keycode 178 = nul
+ alt keycode 178 = nul
+ control alt keycode 178 = nul
+keycode 179 = nul nul nul
+ control keycode 179 = nul
+ shift control keycode 179 = nul
+ alt keycode 179 = nul
+ control alt keycode 179 = nul
+keycode 180 = nul nul nul
+ control keycode 180 = nul
+ shift control keycode 180 = nul
+ alt keycode 180 = nul
+ control alt keycode 180 = nul
+keycode 181 = nul nul nul
+ control keycode 181 = nul
+ shift control keycode 181 = nul
+ alt keycode 181 = nul
+ control alt keycode 181 = nul
+keycode 182 = nul nul nul
+ control keycode 182 = nul
+ shift control keycode 182 = nul
+ alt keycode 182 = nul
+ control alt keycode 182 = nul
+keycode 183 = nul nul nul
+ control keycode 183 = nul
+ shift control keycode 183 = nul
+ alt keycode 183 = nul
+ control alt keycode 183 = nul
+keycode 184 = nul nul nul
+ control keycode 184 = nul
+ shift control keycode 184 = nul
+ alt keycode 184 = nul
+ control alt keycode 184 = nul
+keycode 185 = nul nul nul
+ control keycode 185 = nul
+ shift control keycode 185 = nul
+ alt keycode 185 = nul
+ control alt keycode 185 = nul
+keycode 186 = nul nul nul
+ control keycode 186 = nul
+ shift control keycode 186 = nul
+ alt keycode 186 = nul
+ control alt keycode 186 = nul
+keycode 187 = nul nul nul
+ control keycode 187 = nul
+ shift control keycode 187 = nul
+ alt keycode 187 = nul
+ control alt keycode 187 = nul
+keycode 188 = nul nul nul
+ control keycode 188 = nul
+ shift control keycode 188 = nul
+ alt keycode 188 = nul
+ control alt keycode 188 = nul
+keycode 189 = nul nul nul
+ control keycode 189 = nul
+ shift control keycode 189 = nul
+ alt keycode 189 = nul
+ control alt keycode 189 = nul
+keycode 190 = nul nul nul
+ control keycode 190 = nul
+ shift control keycode 190 = nul
+ alt keycode 190 = nul
+ control alt keycode 190 = nul
+keycode 191 = nul nul nul
+ control keycode 191 = nul
+ shift control keycode 191 = nul
+ alt keycode 191 = nul
+ control alt keycode 191 = nul
+keycode 192 = nul nul nul
+ control keycode 192 = nul
+ shift control keycode 192 = nul
+ alt keycode 192 = nul
+ control alt keycode 192 = nul
+keycode 193 = nul nul nul
+ control keycode 193 = nul
+ shift control keycode 193 = nul
+ alt keycode 193 = nul
+ control alt keycode 193 = nul
+keycode 194 = nul nul nul
+ control keycode 194 = nul
+ shift control keycode 194 = nul
+ alt keycode 194 = nul
+ control alt keycode 194 = nul
+keycode 195 = nul nul nul
+ control keycode 195 = nul
+ shift control keycode 195 = nul
+ alt keycode 195 = nul
+ control alt keycode 195 = nul
+keycode 196 = nul nul nul
+ control keycode 196 = nul
+ shift control keycode 196 = nul
+ alt keycode 196 = nul
+ control alt keycode 196 = nul
+keycode 197 = nul nul nul
+ control keycode 197 = nul
+ shift control keycode 197 = nul
+ alt keycode 197 = nul
+ control alt keycode 197 = nul
+keycode 198 = nul nul nul
+ control keycode 198 = nul
+ shift control keycode 198 = nul
+ alt keycode 198 = nul
+ control alt keycode 198 = nul
+keycode 199 = nul nul nul
+ control keycode 199 = nul
+ shift control keycode 199 = nul
+ alt keycode 199 = nul
+ control alt keycode 199 = nul
+keycode 200 = nul nul nul
+ control keycode 200 = nul
+ shift control keycode 200 = nul
+ alt keycode 200 = nul
+ control alt keycode 200 = nul
+keycode 201 = nul nul nul
+ control keycode 201 = nul
+ shift control keycode 201 = nul
+ alt keycode 201 = nul
+ control alt keycode 201 = nul
+keycode 202 = nul nul nul
+ control keycode 202 = nul
+ shift control keycode 202 = nul
+ alt keycode 202 = nul
+ control alt keycode 202 = nul
+keycode 203 = nul nul nul
+ control keycode 203 = nul
+ shift control keycode 203 = nul
+ alt keycode 203 = nul
+ control alt keycode 203 = nul
+keycode 204 = nul nul nul
+ control keycode 204 = nul
+ shift control keycode 204 = nul
+ alt keycode 204 = nul
+ control alt keycode 204 = nul
+keycode 205 = nul nul nul
+ control keycode 205 = nul
+ shift control keycode 205 = nul
+ alt keycode 205 = nul
+ control alt keycode 205 = nul
+keycode 206 = nul nul nul
+ control keycode 206 = nul
+ shift control keycode 206 = nul
+ alt keycode 206 = nul
+ control alt keycode 206 = nul
+keycode 207 = nul nul nul
+ control keycode 207 = nul
+ shift control keycode 207 = nul
+ alt keycode 207 = nul
+ control alt keycode 207 = nul
+keycode 208 = nul nul nul
+ control keycode 208 = nul
+ shift control keycode 208 = nul
+ alt keycode 208 = nul
+ control alt keycode 208 = nul
+keycode 209 = nul nul nul
+ control keycode 209 = nul
+ shift control keycode 209 = nul
+ alt keycode 209 = nul
+ control alt keycode 209 = nul
+keycode 210 = nul nul nul
+ control keycode 210 = nul
+ shift control keycode 210 = nul
+ alt keycode 210 = nul
+ control alt keycode 210 = nul
+keycode 211 = nul nul nul
+ control keycode 211 = nul
+ shift control keycode 211 = nul
+ alt keycode 211 = nul
+ control alt keycode 211 = nul
+keycode 212 = nul nul nul
+ control keycode 212 = nul
+ shift control keycode 212 = nul
+ alt keycode 212 = nul
+ control alt keycode 212 = nul
+keycode 213 = nul nul nul
+ control keycode 213 = nul
+ shift control keycode 213 = nul
+ alt keycode 213 = nul
+ control alt keycode 213 = nul
+keycode 214 = nul nul nul
+ control keycode 214 = nul
+ shift control keycode 214 = nul
+ alt keycode 214 = nul
+ control alt keycode 214 = nul
+keycode 215 = nul nul nul
+ control keycode 215 = nul
+ shift control keycode 215 = nul
+ alt keycode 215 = nul
+ control alt keycode 215 = nul
+keycode 216 = nul nul nul
+ control keycode 216 = nul
+ shift control keycode 216 = nul
+ alt keycode 216 = nul
+ control alt keycode 216 = nul
+keycode 217 = nul nul nul
+ control keycode 217 = nul
+ shift control keycode 217 = nul
+ alt keycode 217 = nul
+ control alt keycode 217 = nul
+keycode 218 = nul nul nul
+ control keycode 218 = nul
+ shift control keycode 218 = nul
+ alt keycode 218 = nul
+ control alt keycode 218 = nul
+keycode 219 = nul nul nul
+ control keycode 219 = nul
+ shift control keycode 219 = nul
+ alt keycode 219 = nul
+ control alt keycode 219 = nul
+keycode 220 = nul nul nul
+ control keycode 220 = nul
+ shift control keycode 220 = nul
+ alt keycode 220 = nul
+ control alt keycode 220 = nul
+keycode 221 = nul nul nul
+ control keycode 221 = nul
+ shift control keycode 221 = nul
+ alt keycode 221 = nul
+ control alt keycode 221 = nul
+keycode 222 = nul nul nul
+ control keycode 222 = nul
+ shift control keycode 222 = nul
+ alt keycode 222 = nul
+ control alt keycode 222 = nul
+keycode 223 = nul nul nul
+ control keycode 223 = nul
+ shift control keycode 223 = nul
+ alt keycode 223 = nul
+ control alt keycode 223 = nul
+keycode 224 = nul nul nul
+ control keycode 224 = nul
+ shift control keycode 224 = nul
+ alt keycode 224 = nul
+ control alt keycode 224 = nul
+keycode 225 = nul nul nul
+ control keycode 225 = nul
+ shift control keycode 225 = nul
+ alt keycode 225 = nul
+ control alt keycode 225 = nul
+keycode 226 = nul nul nul
+ control keycode 226 = nul
+ shift control keycode 226 = nul
+ alt keycode 226 = nul
+ control alt keycode 226 = nul
+keycode 227 = nul nul nul
+ control keycode 227 = nul
+ shift control keycode 227 = nul
+ alt keycode 227 = nul
+ control alt keycode 227 = nul
+keycode 228 = nul nul nul
+ control keycode 228 = nul
+ shift control keycode 228 = nul
+ alt keycode 228 = nul
+ control alt keycode 228 = nul
+keycode 229 = nul nul nul
+ control keycode 229 = nul
+ shift control keycode 229 = nul
+ alt keycode 229 = nul
+ control alt keycode 229 = nul
+keycode 230 = nul nul nul
+ control keycode 230 = nul
+ shift control keycode 230 = nul
+ alt keycode 230 = nul
+ control alt keycode 230 = nul
+keycode 231 = nul nul nul
+ control keycode 231 = nul
+ shift control keycode 231 = nul
+ alt keycode 231 = nul
+ control alt keycode 231 = nul
+keycode 232 = nul nul nul
+ control keycode 232 = nul
+ shift control keycode 232 = nul
+ alt keycode 232 = nul
+ control alt keycode 232 = nul
+keycode 233 = nul nul nul
+ control keycode 233 = nul
+ shift control keycode 233 = nul
+ alt keycode 233 = nul
+ control alt keycode 233 = nul
+keycode 234 = nul nul nul
+ control keycode 234 = nul
+ shift control keycode 234 = nul
+ alt keycode 234 = nul
+ control alt keycode 234 = nul
+keycode 235 = nul nul nul
+ control keycode 235 = nul
+ shift control keycode 235 = nul
+ alt keycode 235 = nul
+ control alt keycode 235 = nul
+keycode 236 = nul nul nul
+ control keycode 236 = nul
+ shift control keycode 236 = nul
+ alt keycode 236 = nul
+ control alt keycode 236 = nul
+keycode 237 = nul nul nul
+ control keycode 237 = nul
+ shift control keycode 237 = nul
+ alt keycode 237 = nul
+ control alt keycode 237 = nul
+keycode 238 = nul nul nul
+ control keycode 238 = nul
+ shift control keycode 238 = nul
+ alt keycode 238 = nul
+ control alt keycode 238 = nul
+keycode 239 = nul nul nul
+ control keycode 239 = nul
+ shift control keycode 239 = nul
+ alt keycode 239 = nul
+ control alt keycode 239 = nul
+keycode 240 = nul nul nul
+ control keycode 240 = nul
+ shift control keycode 240 = nul
+ alt keycode 240 = nul
+ control alt keycode 240 = nul
+keycode 241 = nul nul nul
+ control keycode 241 = nul
+ shift control keycode 241 = nul
+ alt keycode 241 = nul
+ control alt keycode 241 = nul
+keycode 242 = nul nul nul
+ control keycode 242 = nul
+ shift control keycode 242 = nul
+ alt keycode 242 = nul
+ control alt keycode 242 = nul
+keycode 243 = nul nul nul
+ control keycode 243 = nul
+ shift control keycode 243 = nul
+ alt keycode 243 = nul
+ control alt keycode 243 = nul
+keycode 244 = nul nul nul
+ control keycode 244 = nul
+ shift control keycode 244 = nul
+ alt keycode 244 = nul
+ control alt keycode 244 = nul
+keycode 245 = nul nul nul
+ control keycode 245 = nul
+ shift control keycode 245 = nul
+ alt keycode 245 = nul
+ control alt keycode 245 = nul
+keycode 246 = nul nul nul
+ control keycode 246 = nul
+ shift control keycode 246 = nul
+ alt keycode 246 = nul
+ control alt keycode 246 = nul
+keycode 247 = nul nul nul
+ control keycode 247 = nul
+ shift control keycode 247 = nul
+ alt keycode 247 = nul
+ control alt keycode 247 = nul
+keycode 248 = nul nul nul
+ control keycode 248 = nul
+ shift control keycode 248 = nul
+ alt keycode 248 = nul
+ control alt keycode 248 = nul
+keycode 249 = nul nul nul
+ control keycode 249 = nul
+ shift control keycode 249 = nul
+ alt keycode 249 = nul
+ control alt keycode 249 = nul
+keycode 250 = nul nul nul
+ control keycode 250 = nul
+ shift control keycode 250 = nul
+ alt keycode 250 = nul
+ control alt keycode 250 = nul
+keycode 251 = nul nul nul
+ control keycode 251 = nul
+ shift control keycode 251 = nul
+ alt keycode 251 = nul
+ control alt keycode 251 = nul
+keycode 252 = nul nul nul
+ control keycode 252 = nul
+ shift control keycode 252 = nul
+ alt keycode 252 = nul
+ control alt keycode 252 = nul
+keycode 253 = nul nul nul
+ control keycode 253 = nul
+ shift control keycode 253 = nul
+ alt keycode 253 = nul
+ control alt keycode 253 = nul
+keycode 254 = nul nul nul
+ control keycode 254 = nul
+ shift control keycode 254 = nul
+ alt keycode 254 = nul
+ control alt keycode 254 = nul
+keycode 255 = nul nul nul
+ control keycode 255 = nul
+ shift control keycode 255 = nul
+ alt keycode 255 = nul
+ control alt keycode 255 = nul
+string F1 = "\033[[A"
+string F2 = "\033[[B"
+string F3 = "\033[[C"
+string F4 = "\033[[D"
+string F5 = "\033[[E"
+string F6 = "\033[17~"
+string F7 = "\033[18~"
+string F8 = "\033[19~"
+string F9 = "\033[20~"
+string F10 = "\033[21~"
+string F11 = "\033[23~"
+string F12 = "\033[24~"
+string F13 = "\033[25~"
+string F14 = "\033[26~"
+string F15 = "\033[28~"
+string F16 = "\033[29~"
+string F17 = "\033[31~"
+string F18 = "\033[32~"
+string F19 = "\033[33~"
+string F20 = "\033[34~"
+string Find = "\033[1~"
+string Insert = "\033[2~"
+string Remove = "\033[3~"
+string Select = "\033[4~"
+string Prior = "\033[5~"
+string Next = "\033[6~"
+string Macro = "\033[M"
+string Pause = "\033[P"
diff --git a/core/modules/brazilian/data/opt/openslx/scripts/systemd-load_brazilian_keymaps b/core/modules/brazilian/data/opt/openslx/scripts/systemd-load_brazilian_keymaps
new file mode 100755
index 00000000..190104b9
--- /dev/null
+++ b/core/modules/brazilian/data/opt/openslx/scripts/systemd-load_brazilian_keymaps
@@ -0,0 +1,22 @@
+#!/bin/ash
+# Script serves as container script for a systemd-call due to the buggyness of several
+# loadkeys-implementations <= kbd (Linux keyboard tools) 1.15.3.
+# This bug can be detected through failure of the command pipe 'dumpkeys|loadkeys' yielding
+# the message "unknown keysym 'compose'.
+
+# So we first try to insert a keymap including compose-lines:
+loadkeys /opt/openslx/keymaps/brazilian_qwerty_compose_keyboard_translation.map
+ERR=$?
+
+# ... if this fails we enter a keymap without compose-lines:
+if [ "$ERR" -eq 0 ]; then
+ exit 0 # in that case everything went smooth - exit.
+fi
+
+loadkeys /opt/openslx/keymaps/brazilian_qwerty_keyboard_translation.map # insert a keymap without compose lines
+ERR=$?
+
+# if at this point the second keymap insertion failed we pass the errorlevel to
+# systemd - we cannot do more at this point.
+exit $ERR
+
diff --git a/core/modules/brazilian/module.build b/core/modules/brazilian/module.build
new file mode 100644
index 00000000..c6fbe0ff
--- /dev/null
+++ b/core/modules/brazilian/module.build
@@ -0,0 +1,40 @@
+fetch_source() {
+ :
+}
+
+build() {
+ # Debian-like
+ if [ -e "/etc/locale.gen" ] && ! grep -q -E '^\s*pt_BR\.UTF-8' "/etc/locale.gen"; then
+ pinfo "Generating locales..."
+ echo 'pt_BR.UTF-8 UTF-8' >> "/etc/locale.gen"
+ locale-gen || perror "Could not generate locales (debian style)"
+ fi
+
+ # Ubuntu's version
+ if [ -d "/var/lib/locales/supported.d" ] && [ ! -d /usr/lib/locale/pt_BR.utf8 ]; then
+ pinfo "Generating locales..."
+ grep -q -E -r '^\s*pt_BR\.UTF-8' "/var/lib/locales/supported.d" || echo 'pt_BR.UTF-8 UTF-8' >> "/var/lib/locales/supported.d/openslx"
+ locale-gen --no-archive --purge "pt_BR.UTF-8" || perror "Could not generate locales (ubuntu style)"
+ fi
+
+ # Put everything we build or get from the system in build dir
+ local FILELIST="$MODULE_WORK_DIR/list_copy_build"
+ rm -f "$FILELIST"
+
+ # Copy required directories from source system to build dir
+ for FILE in ${REQUIRED_DIRECTORIES}; do
+ [ ! -d "${FILE}" ] && perror "Missing required directory $FILE"
+ echo ${FILE} >> "${FILELIST}"
+ done
+
+ # Done collecting file and directory names, copy everything
+ tarcopy "$(sort -u "$FILELIST")" "$MODULE_BUILD_DIR"
+
+}
+
+post_copy() {
+ for i in LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION; do
+ add_env $i pt_BR.UTF-8 || perror "$i: add_env function failed."
+ done
+}
+
diff --git a/core/modules/brazilian/module.conf b/core/modules/brazilian/module.conf
new file mode 100644
index 00000000..e2f82123
--- /dev/null
+++ b/core/modules/brazilian/module.conf
@@ -0,0 +1,5 @@
+REQUIRED_BINARIES=""
+REQUIRED_FILES=""
+REQUIRED_DIRECTORIES="
+ /usr/share/X11
+"
diff --git a/core/modules/brazilian/module.conf.debian b/core/modules/brazilian/module.conf.debian
new file mode 100644
index 00000000..a43faea2
--- /dev/null
+++ b/core/modules/brazilian/module.conf.debian
@@ -0,0 +1,10 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libX11-data
+"
+REQUIRED_CONTENT_PACKAGES="
+ libX11-data
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/locale
+"
+
diff --git a/core/modules/brazilian/module.conf.opensuse b/core/modules/brazilian/module.conf.opensuse
new file mode 100644
index 00000000..43cce6e6
--- /dev/null
+++ b/core/modules/brazilian/module.conf.opensuse
@@ -0,0 +1,13 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libX11-data
+ glibc-locale
+"
+REQUIRED_CONTENT_PACKAGES="
+ libX11-data
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/locale/pt_BR.utf8
+"
+REQUIRED_BINARIES=""
+REQUIRED_FILES=""
+
diff --git a/core/modules/brazilian/module.conf.scientific b/core/modules/brazilian/module.conf.scientific
new file mode 100644
index 00000000..88ac0d27
--- /dev/null
+++ b/core/modules/brazilian/module.conf.scientific
@@ -0,0 +1,8 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libX11-data
+ glibc-common
+"
+REQUIRED_CONTENT_PACKAGES="
+ libX11-data"
+REQUIRED_BINARIES=""
+REQUIRED_FILES=""
diff --git a/core/modules/brazilian/module.conf.ubuntu b/core/modules/brazilian/module.conf.ubuntu
new file mode 100644
index 00000000..2558791f
--- /dev/null
+++ b/core/modules/brazilian/module.conf.ubuntu
@@ -0,0 +1,12 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libx11-data
+ language-pack-pt
+"
+REQUIRED_CONTENT_PACKAGES="
+ libx11-data
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/locale/C.UTF-8
+ /usr/lib/locale/pt_BR.utf8
+"
+
diff --git a/core/modules/busybox/fbsplash-center.patch b/core/modules/busybox/fbsplash-center.patch
new file mode 100644
index 00000000..748420fd
--- /dev/null
+++ b/core/modules/busybox/fbsplash-center.patch
@@ -0,0 +1,85 @@
+diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
+index 7b695b2..e3a55ca 100644
+--- a/miscutils/fbsplash.c
++++ b/miscutils/fbsplash.c
+@@ -9,6 +9,7 @@
+ * - put somewhere fbsplash.cfg file and an image in .ppm format.
+ * - run applet: $ setsid fbsplash [params] &
+ * -c: hide cursor
++ * -x: center image (if smaller than screen)
+ * -d /dev/fbN: framebuffer device (if not /dev/fb0)
+ * -s path_to_image_file (can be "-" for stdin)
+ * -i path_to_cfg_file
+@@ -22,10 +23,11 @@
+ */
+
+ //usage:#define fbsplash_trivial_usage
+-//usage: "-s IMGFILE [-c] [-d DEV] [-i INIFILE] [-f CMD]"
++//usage: "-s IMGFILE [-c] [-x] [-d DEV] [-i INIFILE] [-f CMD]"
+ //usage:#define fbsplash_full_usage "\n\n"
+ //usage: " -s Image"
+ //usage: "\n -c Hide cursor"
++//usage: "\n -x Center image (if smaller than screen)"
+ //usage: "\n -d Framebuffer device (default /dev/fb0)"
+ //usage: "\n -i Config file (var=value):"
+ //usage: "\n BAR_LEFT,BAR_TOP,BAR_WIDTH,BAR_HEIGHT"
+@@ -54,6 +56,7 @@ struct globals {
+ unsigned red_shift;
+ unsigned green_shift;
+ unsigned blue_shift;
++ bool bcenter_image;
+ };
+ #define G (*ptr_to_globals)
+ #define INIT_G() do { \
+@@ -349,6 +352,8 @@ static void fb_drawimage(void)
+ char *read_ptr;
+ unsigned char *pixline;
+ unsigned i, j, width, height, line_size;
++ int xoffset = 0;
++ int yoffset = 0;
+
+ if (LONE_DASH(G.image_filename)) {
+ theme_file = stdin;
+@@ -396,6 +401,13 @@ static void fb_drawimage(void)
+ line_size = width*3;
+ pixline = xmalloc(line_size);
+
++ if (G.bcenter_image) {
++ if (width < G.scr_var.xres)
++ xoffset = ((G.scr_var.xres - width) / 2) * G.bytes_per_pixel;
++ if (height < G.scr_var.yres)
++ yoffset = (G.scr_var.yres - height) / 2;
++ }
++
+ if (width > G.scr_var.xres)
+ width = G.scr_var.xres;
+ if (height > G.scr_var.yres)
+@@ -407,7 +419,7 @@ static void fb_drawimage(void)
+ if (fread(pixline, 1, line_size, theme_file) != line_size)
+ bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
+ pixel = pixline;
+- src = G.addr + j * G.scr_fix.line_length;
++ src = G.addr + (j + yoffset) * G.scr_fix.line_length + xoffset;
+ for (i = 0; i < width; i++) {
+ unsigned thispix = fb_pixel_value(pixel[0], pixel[1], pixel[2]);
+ fb_write_pixel(src, thispix);
+@@ -463,6 +475,7 @@ int fbsplash_main(int argc UNUSED_PARAM, char **argv)
+ FILE *fp = fp; // for compiler
+ char *num_buf;
+ unsigned num;
++ unsigned optret;
+ bool bCursorOff;
+
+ INIT_G();
+@@ -471,8 +484,10 @@ int fbsplash_main(int argc UNUSED_PARAM, char **argv)
+ fb_device = "/dev/fb0";
+ cfg_filename = NULL;
+ fifo_filename = NULL;
+- bCursorOff = 1 & getopt32(argv, "cs:d:i:f:",
++ optret = getopt32(argv, "cxs:d:i:f:",
+ &G.image_filename, &fb_device, &cfg_filename, &fifo_filename);
++ bCursorOff = 1 & optret;
++ G.bcenter_image = 2 & optret;
+
+ // parse configuration file
+ if (cfg_filename)
diff --git a/core/modules/busybox/fbsplash-fillbg.patch b/core/modules/busybox/fbsplash-fillbg.patch
new file mode 100644
index 00000000..51695ba7
--- /dev/null
+++ b/core/modules/busybox/fbsplash-fillbg.patch
@@ -0,0 +1,74 @@
+diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c
+index e3a55ca..daea60d 100644
+--- a/miscutils/fbsplash.c
++++ b/miscutils/fbsplash.c
+@@ -23,11 +23,12 @@
+ */
+
+ //usage:#define fbsplash_trivial_usage
+-//usage: "-s IMGFILE [-c] [-x] [-d DEV] [-i INIFILE] [-f CMD]"
++//usage: "-s IMGFILE [-c] [-x] [-b] [-d DEV] [-i INIFILE] [-f CMD]"
+ //usage:#define fbsplash_full_usage "\n\n"
+ //usage: " -s Image"
+ //usage: "\n -c Hide cursor"
+ //usage: "\n -x Center image (if smaller than screen)"
++//usage: "\n -b Fill background with color of top left pixel of image"
+ //usage: "\n -d Framebuffer device (default /dev/fb0)"
+ //usage: "\n -i Config file (var=value):"
+ //usage: "\n BAR_LEFT,BAR_TOP,BAR_WIDTH,BAR_HEIGHT"
+@@ -57,6 +58,7 @@ struct globals {
+ unsigned green_shift;
+ unsigned blue_shift;
+ bool bcenter_image;
++ bool bfill_background;
+ };
+ #define G (*ptr_to_globals)
+ #define INIT_G() do { \
+@@ -342,6 +344,23 @@ static void fb_drawprogressbar(unsigned percent)
+ G.nbar_colr, G.nbar_colg, G.nbar_colb);
+ }
+
++/**
++ * Fill screen around image with given color
++ */
++static void fb_fillbackground(unsigned char* pixel, const int xoffset, const int yoffset, const int width, const int height)
++{
++ int i, j;
++ unsigned thispix = fb_pixel_value(pixel[0], pixel[1], pixel[2]);
++
++ for (j = 0; j < G.scr_var.yres; j++) {
++ unsigned char *src = G.addr + j * G.scr_fix.line_length;
++
++ for (i = 0; i < G.scr_var.xres; i++) {
++ if ((j < yoffset || j >= yoffset + height) || (i < xoffset || i >= xoffset + width))
++ fb_write_pixel(src + i * G.bytes_per_pixel, thispix);
++ }
++ }
++}
+
+ /**
+ * Draw image from PPM file
+@@ -420,6 +439,10 @@ static void fb_drawimage(void)
+ bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
+ pixel = pixline;
+ src = G.addr + (j + yoffset) * G.scr_fix.line_length + xoffset;
++
++ if (G.bfill_background && j == 0)
++ fb_fillbackground(pixel, xoffset / G.bytes_per_pixel, yoffset, width, height);
++
+ for (i = 0; i < width; i++) {
+ unsigned thispix = fb_pixel_value(pixel[0], pixel[1], pixel[2]);
+ fb_write_pixel(src, thispix);
+@@ -484,10 +507,11 @@ int fbsplash_main(int argc UNUSED_PARAM, char **argv)
+ fb_device = "/dev/fb0";
+ cfg_filename = NULL;
+ fifo_filename = NULL;
+- optret = getopt32(argv, "cxs:d:i:f:",
++ optret = getopt32(argv, "cxbs:d:i:f:",
+ &G.image_filename, &fb_device, &cfg_filename, &fifo_filename);
+ bCursorOff = 1 & optret;
+ G.bcenter_image = 2 & optret;
++ G.bfill_background = 4 & optret;
+
+ // parse configuration file
+ if (cfg_filename)
diff --git a/core/modules/busybox/module.build b/core/modules/busybox/module.build
new file mode 100644
index 00000000..46b60c1c
--- /dev/null
+++ b/core/modules/busybox/module.build
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+fetch_source() {
+ git clone --depth 1 "${REQUIRED_GIT}" --branch "$REQUIRED_BRANCH" src || perror "Could not clone busybox git"
+ cd src || perror "Could not cd to src"
+ # Patch image centering and background filling if not patched yet
+ if ! grep -q "bcenter_image" "miscutils/fbsplash.c"; then
+ git apply "${MODULE_DIR}/fbsplash-center.patch" || perror "Could not apply busybox patch for fbsplash image centering"
+ fi
+ if ! grep -q "bfill_background" "miscutils/fbsplash.c"; then
+ git apply "${MODULE_DIR}/fbsplash-fillbg.patch" || perror "Could not apply busybox patch for fbsplash background filling"
+ fi
+ cd .. || perror "cd .. failed"
+}
+
+build() {
+ cp "${MODULE_DIR}/openslx-busybox-config" "src/.config"
+ cd src || perror "Could not cd to src"
+ yes '' | make oldconfig
+ pinfo "Running make (if this hangs, check for unset options, ie. when you increased the REQUIRED_BRANCH)"
+ make || perror "failed."
+ pinfo "Running make install"
+ make CONFIG_PREFIX="$MODULE_BUILD_DIR" install || perror "failed"
+ rm -f "$MODULE_BUILD_DIR/bin/mount" "$MODULE_BUILD_DIR/bin/umount" "$MODULE_BUILD_DIR/bin/bash"
+ cd - &> /dev/null
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/busybox/module.conf b/core/modules/busybox/module.conf
new file mode 100644
index 00000000..6acfa16c
--- /dev/null
+++ b/core/modules/busybox/module.conf
@@ -0,0 +1,7 @@
+REQUIRED_GIT="git://git.busybox.net/busybox"
+REQUIRED_BRANCH="1_22_1"
+REQUIRED_BINARIES="busybox"
+REQUIRED_DIRECTORIES="
+ /bin
+ /sbin
+"
diff --git a/core/modules/busybox/module.conf.centos b/core/modules/busybox/module.conf.centos
new file mode 100644
index 00000000..adf935c8
--- /dev/null
+++ b/core/modules/busybox/module.conf.centos
@@ -0,0 +1,4 @@
+REQUIRED_DIRECTORIES="
+ /usr/bin
+ /usr/sbin
+"
diff --git a/core/modules/busybox/openslx-busybox-config b/core/modules/busybox/openslx-busybox-config
new file mode 100644
index 00000000..00a008d7
--- /dev/null
+++ b/core/modules/busybox/openslx-busybox-config
@@ -0,0 +1,1038 @@
+#
+# Automatically generated make config: don't edit
+# Busybox version: 1.22.1
+# Sat Feb 15 19:51:48 2014
+#
+CONFIG_HAVE_DOT_CONFIG=y
+
+#
+# Busybox Settings
+#
+
+#
+# General Configuration
+#
+# CONFIG_DESKTOP is not set
+# CONFIG_EXTRA_COMPAT is not set
+# CONFIG_INCLUDE_SUSv2 is not set
+# CONFIG_USE_PORTABLE_CODE is not set
+CONFIG_PLATFORM_LINUX=y
+CONFIG_FEATURE_BUFFERS_USE_MALLOC=y
+# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set
+# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
+CONFIG_SHOW_USAGE=y
+# CONFIG_FEATURE_VERBOSE_USAGE is not set
+CONFIG_FEATURE_COMPRESS_USAGE=y
+# CONFIG_FEATURE_INSTALLER is not set
+CONFIG_INSTALL_NO_USR=y
+CONFIG_LOCALE_SUPPORT=y
+CONFIG_UNICODE_SUPPORT=y
+# CONFIG_UNICODE_USING_LOCALE is not set
+CONFIG_FEATURE_CHECK_UNICODE_IN_ENV=y
+CONFIG_SUBST_WCHAR=63
+CONFIG_LAST_SUPPORTED_WCHAR=767
+# CONFIG_UNICODE_COMBINING_WCHARS is not set
+# CONFIG_UNICODE_WIDE_WCHARS is not set
+# CONFIG_UNICODE_BIDI_SUPPORT is not set
+# CONFIG_UNICODE_NEUTRAL_TABLE is not set
+# CONFIG_UNICODE_PRESERVE_BROKEN is not set
+CONFIG_LONG_OPTS=y
+CONFIG_FEATURE_DEVPTS=y
+# CONFIG_FEATURE_CLEAN_UP is not set
+CONFIG_FEATURE_UTMP=y
+# CONFIG_FEATURE_WTMP is not set
+CONFIG_FEATURE_PIDFILE=y
+CONFIG_PID_FILE_PATH="/var/run"
+CONFIG_FEATURE_SUID=y
+# CONFIG_FEATURE_SUID_CONFIG is not set
+# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set
+# CONFIG_SELINUX is not set
+# CONFIG_FEATURE_PREFER_APPLETS is not set
+CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe"
+CONFIG_FEATURE_SYSLOG=y
+CONFIG_FEATURE_HAVE_RPC=y
+
+#
+# Build Options
+#
+# CONFIG_STATIC is not set
+# CONFIG_PIE is not set
+# CONFIG_NOMMU is not set
+# CONFIG_BUILD_LIBBUSYBOX is not set
+# CONFIG_FEATURE_INDIVIDUAL is not set
+# CONFIG_FEATURE_SHARED_BUSYBOX is not set
+CONFIG_LFS=y
+CONFIG_CROSS_COMPILER_PREFIX=""
+CONFIG_SYSROOT=""
+CONFIG_EXTRA_CFLAGS=""
+CONFIG_EXTRA_LDFLAGS=""
+CONFIG_EXTRA_LDLIBS=""
+
+#
+# Debugging Options
+#
+# CONFIG_DEBUG is not set
+# CONFIG_DEBUG_PESSIMIZE is not set
+# CONFIG_WERROR is not set
+CONFIG_NO_DEBUG_LIB=y
+# CONFIG_DMALLOC is not set
+# CONFIG_EFENCE is not set
+
+#
+# Installation Options ("make install" behavior)
+#
+CONFIG_INSTALL_APPLET_SYMLINKS=y
+# CONFIG_INSTALL_APPLET_HARDLINKS is not set
+# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set
+# CONFIG_INSTALL_APPLET_DONT is not set
+# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set
+# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set
+# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set
+CONFIG_PREFIX="./_install"
+
+#
+# Busybox Library Tuning
+#
+CONFIG_FEATURE_SYSTEMD=y
+CONFIG_FEATURE_RTMINMAX=y
+CONFIG_PASSWORD_MINLEN=6
+CONFIG_MD5_SMALL=1
+CONFIG_SHA3_SMALL=1
+CONFIG_FEATURE_FAST_TOP=y
+# CONFIG_FEATURE_ETC_NETWORKS is not set
+CONFIG_FEATURE_USE_TERMIOS=y
+CONFIG_FEATURE_EDITING=y
+CONFIG_FEATURE_EDITING_MAX_LEN=1024
+# CONFIG_FEATURE_EDITING_VI is not set
+CONFIG_FEATURE_EDITING_HISTORY=15
+CONFIG_FEATURE_EDITING_SAVEHISTORY=y
+# CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set
+CONFIG_FEATURE_REVERSE_SEARCH=y
+CONFIG_FEATURE_TAB_COMPLETION=y
+# CONFIG_FEATURE_USERNAME_COMPLETION is not set
+CONFIG_FEATURE_EDITING_FANCY_PROMPT=y
+# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set
+CONFIG_FEATURE_NON_POSIX_CP=y
+CONFIG_FEATURE_VERBOSE_CP_MESSAGE=y
+CONFIG_FEATURE_COPYBUF_KB=4
+CONFIG_FEATURE_SKIP_ROOTFS=y
+CONFIG_MONOTONIC_SYSCALL=y
+CONFIG_IOCTL_HEX2STR_ERROR=y
+# CONFIG_FEATURE_HWIB is not set
+
+#
+# Applets
+#
+
+#
+# Archival Utilities
+#
+CONFIG_FEATURE_SEAMLESS_XZ=y
+CONFIG_FEATURE_SEAMLESS_LZMA=y
+CONFIG_FEATURE_SEAMLESS_BZ2=y
+CONFIG_FEATURE_SEAMLESS_GZ=y
+CONFIG_FEATURE_SEAMLESS_Z=y
+CONFIG_AR=y
+# CONFIG_FEATURE_AR_LONG_FILENAMES is not set
+CONFIG_FEATURE_AR_CREATE=y
+# CONFIG_UNCOMPRESS is not set
+CONFIG_GUNZIP=y
+CONFIG_BUNZIP2=y
+CONFIG_UNLZMA=y
+# CONFIG_FEATURE_LZMA_FAST is not set
+CONFIG_LZMA=y
+CONFIG_UNXZ=y
+CONFIG_XZ=y
+CONFIG_BZIP2=y
+CONFIG_CPIO=y
+# CONFIG_FEATURE_CPIO_O is not set
+# CONFIG_FEATURE_CPIO_P is not set
+# CONFIG_DPKG is not set
+# CONFIG_DPKG_DEB is not set
+# CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set
+CONFIG_GZIP=y
+# CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set
+CONFIG_GZIP_FAST=0
+# CONFIG_LZOP is not set
+# CONFIG_LZOP_COMPR_HIGH is not set
+# CONFIG_RPM is not set
+CONFIG_RPM2CPIO=y
+CONFIG_TAR=y
+CONFIG_FEATURE_TAR_CREATE=y
+CONFIG_FEATURE_TAR_AUTODETECT=y
+CONFIG_FEATURE_TAR_FROM=y
+# CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set
+# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set
+CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y
+# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set
+# CONFIG_FEATURE_TAR_TO_COMMAND is not set
+# CONFIG_FEATURE_TAR_UNAME_GNAME is not set
+CONFIG_FEATURE_TAR_NOPRESERVE_TIME=y
+# CONFIG_FEATURE_TAR_SELINUX is not set
+# CONFIG_UNZIP is not set
+
+#
+# Coreutils
+#
+CONFIG_BASENAME=y
+CONFIG_CAT=y
+CONFIG_DATE=y
+CONFIG_FEATURE_DATE_ISOFMT=y
+# CONFIG_FEATURE_DATE_NANO is not set
+CONFIG_FEATURE_DATE_COMPAT=y
+# CONFIG_HOSTID is not set
+CONFIG_ID=y
+CONFIG_GROUPS=y
+CONFIG_TEST=y
+# CONFIG_FEATURE_TEST_64 is not set
+CONFIG_TOUCH=y
+CONFIG_FEATURE_TOUCH_NODEREF=y
+CONFIG_FEATURE_TOUCH_SUSV3=y
+CONFIG_TR=y
+# CONFIG_FEATURE_TR_CLASSES is not set
+# CONFIG_FEATURE_TR_EQUIV is not set
+CONFIG_BASE64=y
+CONFIG_WHO=y
+# CONFIG_USERS is not set
+# CONFIG_CAL is not set
+# CONFIG_CATV is not set
+CONFIG_CHGRP=y
+CONFIG_CHMOD=y
+CONFIG_CHOWN=y
+# CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set
+CONFIG_CHROOT=y
+# CONFIG_CKSUM is not set
+# CONFIG_COMM is not set
+CONFIG_CP=y
+# CONFIG_FEATURE_CP_LONG_OPTIONS is not set
+CONFIG_CUT=y
+CONFIG_DD=y
+# CONFIG_FEATURE_DD_SIGNAL_HANDLING is not set
+# CONFIG_FEATURE_DD_THIRD_STATUS_LINE is not set
+# CONFIG_FEATURE_DD_IBS_OBS is not set
+CONFIG_DF=y
+# CONFIG_FEATURE_DF_FANCY is not set
+CONFIG_DIRNAME=y
+# CONFIG_DOS2UNIX is not set
+# CONFIG_UNIX2DOS is not set
+CONFIG_DU=y
+CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y
+CONFIG_ECHO=y
+CONFIG_FEATURE_FANCY_ECHO=y
+CONFIG_ENV=y
+# CONFIG_FEATURE_ENV_LONG_OPTIONS is not set
+# CONFIG_EXPAND is not set
+# CONFIG_FEATURE_EXPAND_LONG_OPTIONS is not set
+CONFIG_EXPR=y
+CONFIG_EXPR_MATH_SUPPORT_64=y
+CONFIG_FALSE=y
+# CONFIG_FOLD is not set
+# CONFIG_FSYNC is not set
+CONFIG_HEAD=y
+# CONFIG_FEATURE_FANCY_HEAD is not set
+# CONFIG_INSTALL is not set
+# CONFIG_FEATURE_INSTALL_LONG_OPTIONS is not set
+CONFIG_LN=y
+# CONFIG_LOGNAME is not set
+CONFIG_LS=y
+CONFIG_FEATURE_LS_FILETYPES=y
+CONFIG_FEATURE_LS_FOLLOWLINKS=y
+CONFIG_FEATURE_LS_RECURSIVE=y
+CONFIG_FEATURE_LS_SORTFILES=y
+CONFIG_FEATURE_LS_TIMESTAMPS=y
+CONFIG_FEATURE_LS_USERNAME=y
+CONFIG_FEATURE_LS_COLOR=y
+# CONFIG_FEATURE_LS_COLOR_IS_DEFAULT is not set
+CONFIG_MD5SUM=y
+CONFIG_MKDIR=y
+# CONFIG_FEATURE_MKDIR_LONG_OPTIONS is not set
+CONFIG_MKFIFO=y
+CONFIG_MKNOD=y
+CONFIG_MV=y
+# CONFIG_FEATURE_MV_LONG_OPTIONS is not set
+CONFIG_NICE=y
+# CONFIG_NOHUP is not set
+# CONFIG_OD is not set
+# CONFIG_PRINTENV is not set
+CONFIG_PRINTF=y
+CONFIG_PWD=y
+CONFIG_READLINK=y
+CONFIG_FEATURE_READLINK_FOLLOW=y
+CONFIG_REALPATH=y
+CONFIG_RM=y
+CONFIG_RMDIR=y
+CONFIG_FEATURE_RMDIR_LONG_OPTIONS=y
+# CONFIG_SEQ is not set
+# CONFIG_SHA1SUM is not set
+CONFIG_SHA256SUM=y
+# CONFIG_SHA512SUM is not set
+# CONFIG_SHA3SUM is not set
+CONFIG_SLEEP=y
+# CONFIG_FEATURE_FANCY_SLEEP is not set
+# CONFIG_FEATURE_FLOAT_SLEEP is not set
+CONFIG_SORT=y
+CONFIG_FEATURE_SORT_BIG=y
+# CONFIG_SPLIT is not set
+# CONFIG_FEATURE_SPLIT_FANCY is not set
+CONFIG_STAT=y
+CONFIG_FEATURE_STAT_FORMAT=y
+# CONFIG_STTY is not set
+# CONFIG_SUM is not set
+CONFIG_SYNC=y
+# CONFIG_TAC is not set
+CONFIG_TAIL=y
+CONFIG_FEATURE_FANCY_TAIL=y
+# CONFIG_TEE is not set
+# CONFIG_FEATURE_TEE_USE_BLOCK_IO is not set
+CONFIG_TRUE=y
+# CONFIG_TTY is not set
+CONFIG_UNAME=y
+# CONFIG_UNEXPAND is not set
+# CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set
+CONFIG_UNIQ=y
+CONFIG_USLEEP=y
+# CONFIG_UUDECODE is not set
+# CONFIG_UUENCODE is not set
+CONFIG_WC=y
+# CONFIG_FEATURE_WC_LARGE is not set
+CONFIG_WHOAMI=y
+# CONFIG_YES is not set
+
+#
+# Common options for cp and mv
+#
+CONFIG_FEATURE_PRESERVE_HARDLINKS=y
+
+#
+# Common options for ls, more and telnet
+#
+CONFIG_FEATURE_AUTOWIDTH=y
+
+#
+# Common options for df, du, ls
+#
+CONFIG_FEATURE_HUMAN_READABLE=y
+
+#
+# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum
+#
+CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y
+
+#
+# Console Utilities
+#
+CONFIG_CHVT=y
+CONFIG_FGCONSOLE=y
+CONFIG_CLEAR=y
+CONFIG_DEALLOCVT=y
+CONFIG_DUMPKMAP=y
+# CONFIG_KBD_MODE is not set
+CONFIG_LOADFONT=y
+CONFIG_LOADKMAP=y
+CONFIG_OPENVT=y
+CONFIG_RESET=y
+CONFIG_RESIZE=y
+CONFIG_FEATURE_RESIZE_PRINT=y
+CONFIG_SETCONSOLE=y
+CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS=y
+CONFIG_SETFONT=y
+CONFIG_FEATURE_SETFONT_TEXTUAL_MAP=y
+CONFIG_DEFAULT_SETFONT_DIR=""
+CONFIG_SETKEYCODES=y
+CONFIG_SETLOGCONS=y
+# CONFIG_SHOWKEY is not set
+
+#
+# Common options for loadfont and setfont
+#
+CONFIG_FEATURE_LOADFONT_PSF2=y
+CONFIG_FEATURE_LOADFONT_RAW=y
+
+#
+# Debian Utilities
+#
+CONFIG_MKTEMP=y
+# CONFIG_PIPE_PROGRESS is not set
+# CONFIG_RUN_PARTS is not set
+# CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS is not set
+# CONFIG_FEATURE_RUN_PARTS_FANCY is not set
+# CONFIG_START_STOP_DAEMON is not set
+# CONFIG_FEATURE_START_STOP_DAEMON_FANCY is not set
+# CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set
+CONFIG_WHICH=y
+
+#
+# Editors
+#
+CONFIG_AWK=y
+# CONFIG_FEATURE_AWK_LIBM is not set
+CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y
+# CONFIG_CMP is not set
+CONFIG_DIFF=y
+CONFIG_FEATURE_DIFF_LONG_OPTIONS=y
+CONFIG_FEATURE_DIFF_DIR=y
+# CONFIG_ED is not set
+# CONFIG_PATCH is not set
+CONFIG_SED=y
+CONFIG_VI=y
+CONFIG_FEATURE_VI_MAX_LEN=1024
+CONFIG_FEATURE_VI_8BIT=y
+CONFIG_FEATURE_VI_COLON=y
+CONFIG_FEATURE_VI_YANKMARK=y
+CONFIG_FEATURE_VI_SEARCH=y
+CONFIG_FEATURE_VI_REGEX_SEARCH=y
+CONFIG_FEATURE_VI_USE_SIGNALS=y
+CONFIG_FEATURE_VI_DOT_CMD=y
+CONFIG_FEATURE_VI_READONLY=y
+# CONFIG_FEATURE_VI_SETOPTS is not set
+CONFIG_FEATURE_VI_SET=y
+CONFIG_FEATURE_VI_WIN_RESIZE=y
+CONFIG_FEATURE_VI_ASK_TERMINAL=y
+# CONFIG_FEATURE_ALLOW_EXEC is not set
+
+#
+# Finding Utilities
+#
+CONFIG_FIND=y
+CONFIG_FEATURE_FIND_PRINT0=y
+CONFIG_FEATURE_FIND_MTIME=y
+CONFIG_FEATURE_FIND_MMIN=y
+CONFIG_FEATURE_FIND_PERM=y
+CONFIG_FEATURE_FIND_TYPE=y
+CONFIG_FEATURE_FIND_XDEV=y
+CONFIG_FEATURE_FIND_MAXDEPTH=y
+CONFIG_FEATURE_FIND_NEWER=y
+CONFIG_FEATURE_FIND_INUM=y
+CONFIG_FEATURE_FIND_EXEC=y
+CONFIG_FEATURE_FIND_USER=y
+CONFIG_FEATURE_FIND_GROUP=y
+CONFIG_FEATURE_FIND_NOT=y
+CONFIG_FEATURE_FIND_DEPTH=y
+CONFIG_FEATURE_FIND_PAREN=y
+CONFIG_FEATURE_FIND_SIZE=y
+CONFIG_FEATURE_FIND_PRUNE=y
+CONFIG_FEATURE_FIND_DELETE=y
+CONFIG_FEATURE_FIND_PATH=y
+CONFIG_FEATURE_FIND_REGEX=y
+# CONFIG_FEATURE_FIND_CONTEXT is not set
+# CONFIG_FEATURE_FIND_LINKS is not set
+CONFIG_GREP=y
+CONFIG_FEATURE_GREP_EGREP_ALIAS=y
+# CONFIG_FEATURE_GREP_FGREP_ALIAS is not set
+CONFIG_FEATURE_GREP_CONTEXT=y
+CONFIG_XARGS=y
+# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set
+# CONFIG_FEATURE_XARGS_SUPPORT_QUOTES is not set
+# CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT is not set
+# CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM is not set
+
+#
+# Init Utilities
+#
+# CONFIG_BOOTCHARTD is not set
+# CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set
+# CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set
+CONFIG_HALT=y
+CONFIG_FEATURE_CALL_TELINIT=y
+CONFIG_TELINIT_PATH="/sbin/telinit"
+# CONFIG_INIT is not set
+# CONFIG_FEATURE_USE_INITTAB is not set
+# CONFIG_FEATURE_KILL_REMOVED is not set
+CONFIG_FEATURE_KILL_DELAY=0
+# CONFIG_FEATURE_INIT_SCTTY is not set
+# CONFIG_FEATURE_INIT_SYSLOG is not set
+# CONFIG_FEATURE_EXTRA_QUIET is not set
+# CONFIG_FEATURE_INIT_COREDUMPS is not set
+# CONFIG_FEATURE_INITRD is not set
+CONFIG_INIT_TERMINAL_TYPE=""
+# CONFIG_MESG is not set
+# CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP is not set
+
+#
+# Login/Password Management Utilities
+#
+# CONFIG_ADD_SHELL is not set
+# CONFIG_REMOVE_SHELL is not set
+CONFIG_FEATURE_SHADOWPASSWDS=y
+# CONFIG_USE_BB_PWD_GRP is not set
+# CONFIG_USE_BB_SHADOW is not set
+CONFIG_USE_BB_CRYPT=y
+CONFIG_USE_BB_CRYPT_SHA=y
+CONFIG_ADDUSER=y
+CONFIG_FEATURE_ADDUSER_LONG_OPTIONS=y
+# CONFIG_FEATURE_CHECK_NAMES is not set
+CONFIG_FIRST_SYSTEM_ID=100
+CONFIG_LAST_SYSTEM_ID=999
+CONFIG_ADDGROUP=y
+CONFIG_FEATURE_ADDGROUP_LONG_OPTIONS=y
+CONFIG_FEATURE_ADDUSER_TO_GROUP=y
+# CONFIG_DELUSER is not set
+# CONFIG_DELGROUP is not set
+# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set
+CONFIG_GETTY=y
+# CONFIG_LOGIN is not set
+# CONFIG_LOGIN_SESSION_AS_CHILD is not set
+# CONFIG_PAM is not set
+# CONFIG_LOGIN_SCRIPTS is not set
+# CONFIG_FEATURE_NOLOGIN is not set
+# CONFIG_FEATURE_SECURETTY is not set
+CONFIG_PASSWD=y
+CONFIG_FEATURE_PASSWD_WEAK_CHECK=y
+# CONFIG_CRYPTPW is not set
+# CONFIG_CHPASSWD is not set
+CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="des"
+CONFIG_SU=y
+CONFIG_FEATURE_SU_SYSLOG=y
+CONFIG_FEATURE_SU_CHECKS_SHELLS=y
+# CONFIG_SULOGIN is not set
+# CONFIG_VLOCK is not set
+
+#
+# Linux Ext2 FS Progs
+#
+# CONFIG_CHATTR is not set
+# CONFIG_FSCK is not set
+# CONFIG_LSATTR is not set
+# CONFIG_TUNE2FS is not set
+
+#
+# Linux Module Utilities
+#
+CONFIG_MODINFO=y
+# CONFIG_MODPROBE_SMALL is not set
+# CONFIG_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE is not set
+# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set
+CONFIG_INSMOD=y
+CONFIG_RMMOD=y
+CONFIG_LSMOD=y
+# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set
+CONFIG_MODPROBE=y
+CONFIG_FEATURE_MODPROBE_BLACKLIST=y
+# CONFIG_DEPMOD is not set
+
+#
+# Options common to multiple modutils
+#
+# CONFIG_FEATURE_2_4_MODULES is not set
+# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set
+# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set
+# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set
+# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set
+# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set
+# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set
+CONFIG_FEATURE_CHECK_TAINTED_MODULE=y
+CONFIG_FEATURE_MODUTILS_ALIAS=y
+CONFIG_FEATURE_MODUTILS_SYMBOLS=y
+CONFIG_DEFAULT_MODULES_DIR="/lib/modules"
+CONFIG_DEFAULT_DEPMOD_FILE="modules.dep"
+
+#
+# Linux System Utilities
+#
+CONFIG_BLOCKDEV=y
+# CONFIG_FSTRIM is not set
+# CONFIG_MDEV is not set
+# CONFIG_FEATURE_MDEV_CONF is not set
+# CONFIG_FEATURE_MDEV_RENAME is not set
+# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set
+# CONFIG_FEATURE_MDEV_EXEC is not set
+# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set
+# CONFIG_REV is not set
+# CONFIG_ACPID is not set
+# CONFIG_FEATURE_ACPID_COMPAT is not set
+CONFIG_BLKID=y
+# CONFIG_FEATURE_BLKID_TYPE is not set
+CONFIG_DMESG=y
+CONFIG_FEATURE_DMESG_PRETTY=y
+CONFIG_FBSET=y
+CONFIG_FEATURE_FBSET_FANCY=y
+# CONFIG_FEATURE_FBSET_READMODE is not set
+# CONFIG_FDFLUSH is not set
+# CONFIG_FDFORMAT is not set
+CONFIG_FDISK=y
+# CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set
+CONFIG_FEATURE_FDISK_WRITABLE=y
+# CONFIG_FEATURE_AIX_LABEL is not set
+# CONFIG_FEATURE_SGI_LABEL is not set
+# CONFIG_FEATURE_SUN_LABEL is not set
+# CONFIG_FEATURE_OSF_LABEL is not set
+CONFIG_FEATURE_GPT_LABEL=y
+# CONFIG_FEATURE_FDISK_ADVANCED is not set
+# CONFIG_FINDFS is not set
+CONFIG_FLOCK=y
+# CONFIG_FREERAMDISK is not set
+# CONFIG_FSCK_MINIX is not set
+CONFIG_MKFS_EXT2=y
+# CONFIG_MKFS_MINIX is not set
+# CONFIG_FEATURE_MINIX2 is not set
+# CONFIG_MKFS_REISER is not set
+CONFIG_MKFS_VFAT=y
+# CONFIG_GETOPT is not set
+# CONFIG_FEATURE_GETOPT_LONG is not set
+# CONFIG_HEXDUMP is not set
+# CONFIG_FEATURE_HEXDUMP_REVERSE is not set
+# CONFIG_HD is not set
+CONFIG_HWCLOCK=y
+# CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS is not set
+CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y
+# CONFIG_IPCRM is not set
+# CONFIG_IPCS is not set
+# CONFIG_LOSETUP is not set
+CONFIG_LSPCI=y
+CONFIG_LSUSB=y
+CONFIG_MKSWAP=y
+# CONFIG_FEATURE_MKSWAP_UUID is not set
+CONFIG_MORE=y
+CONFIG_MOUNT=y
+# CONFIG_FEATURE_MOUNT_FAKE is not set
+# CONFIG_FEATURE_MOUNT_VERBOSE is not set
+CONFIG_FEATURE_MOUNT_HELPERS=y
+# CONFIG_FEATURE_MOUNT_LABEL is not set
+CONFIG_FEATURE_MOUNT_NFS=y
+CONFIG_FEATURE_MOUNT_CIFS=y
+CONFIG_FEATURE_MOUNT_FLAGS=y
+CONFIG_FEATURE_MOUNT_FSTAB=y
+# CONFIG_PIVOT_ROOT is not set
+CONFIG_RDATE=y
+# CONFIG_RDEV is not set
+# CONFIG_READPROFILE is not set
+# CONFIG_RTCWAKE is not set
+# CONFIG_SCRIPT is not set
+# CONFIG_SCRIPTREPLAY is not set
+# CONFIG_SETARCH is not set
+CONFIG_SWAPONOFF=y
+CONFIG_FEATURE_SWAPON_PRI=y
+CONFIG_SWITCH_ROOT=y
+CONFIG_UMOUNT=y
+# CONFIG_FEATURE_UMOUNT_ALL is not set
+
+#
+# Common options for mount/umount
+#
+CONFIG_FEATURE_MOUNT_LOOP=y
+CONFIG_FEATURE_MOUNT_LOOP_CREATE=y
+# CONFIG_FEATURE_MTAB_SUPPORT is not set
+CONFIG_VOLUMEID=y
+
+#
+# Filesystem/Volume identification
+#
+CONFIG_FEATURE_VOLUMEID_BTRFS=y
+CONFIG_FEATURE_VOLUMEID_CRAMFS=y
+CONFIG_FEATURE_VOLUMEID_EXFAT=y
+CONFIG_FEATURE_VOLUMEID_EXT=y
+CONFIG_FEATURE_VOLUMEID_F2FS=y
+CONFIG_FEATURE_VOLUMEID_FAT=y
+CONFIG_FEATURE_VOLUMEID_HFS=y
+CONFIG_FEATURE_VOLUMEID_ISO9660=y
+CONFIG_FEATURE_VOLUMEID_JFS=y
+CONFIG_FEATURE_VOLUMEID_LINUXRAID=y
+CONFIG_FEATURE_VOLUMEID_LINUXSWAP=y
+CONFIG_FEATURE_VOLUMEID_LUKS=y
+CONFIG_FEATURE_VOLUMEID_NILFS=y
+CONFIG_FEATURE_VOLUMEID_NTFS=y
+CONFIG_FEATURE_VOLUMEID_OCFS2=y
+CONFIG_FEATURE_VOLUMEID_REISERFS=y
+CONFIG_FEATURE_VOLUMEID_ROMFS=y
+# CONFIG_FEATURE_VOLUMEID_SQUASHFS is not set
+CONFIG_FEATURE_VOLUMEID_SYSV=y
+CONFIG_FEATURE_VOLUMEID_UDF=y
+CONFIG_FEATURE_VOLUMEID_XFS=y
+
+#
+# Miscellaneous Utilities
+#
+# CONFIG_CONSPY is not set
+# CONFIG_LESS is not set
+CONFIG_FEATURE_LESS_MAXLINES=0
+# CONFIG_FEATURE_LESS_BRACKETS is not set
+# CONFIG_FEATURE_LESS_FLAGS is not set
+# CONFIG_FEATURE_LESS_MARKS is not set
+# CONFIG_FEATURE_LESS_REGEXP is not set
+# CONFIG_FEATURE_LESS_WINCH is not set
+# CONFIG_FEATURE_LESS_ASK_TERMINAL is not set
+# CONFIG_FEATURE_LESS_DASHCMD is not set
+# CONFIG_FEATURE_LESS_LINENUMS is not set
+# CONFIG_NANDWRITE is not set
+# CONFIG_NANDDUMP is not set
+# CONFIG_RFKILL is not set
+CONFIG_SETSERIAL=y
+# CONFIG_UBIATTACH is not set
+# CONFIG_UBIDETACH is not set
+CONFIG_UBIMKVOL=y
+CONFIG_UBIRMVOL=y
+CONFIG_UBIRSVOL=y
+CONFIG_UBIUPDATEVOL=y
+# CONFIG_WALL is not set
+# CONFIG_ADJTIMEX is not set
+# CONFIG_BBCONFIG is not set
+# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set
+# CONFIG_BEEP is not set
+CONFIG_FEATURE_BEEP_FREQ=0
+CONFIG_FEATURE_BEEP_LENGTH_MS=0
+# CONFIG_CHAT is not set
+# CONFIG_FEATURE_CHAT_NOFAIL is not set
+# CONFIG_FEATURE_CHAT_TTY_HIFI is not set
+# CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set
+# CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set
+# CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set
+# CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set
+# CONFIG_FEATURE_CHAT_CLR_ABORT is not set
+# CONFIG_CHRT is not set
+# CONFIG_CROND is not set
+# CONFIG_FEATURE_CROND_D is not set
+# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set
+CONFIG_FEATURE_CROND_DIR=""
+# CONFIG_CRONTAB is not set
+# CONFIG_DC is not set
+# CONFIG_FEATURE_DC_LIBM is not set
+# CONFIG_DEVFSD is not set
+# CONFIG_DEVFSD_MODLOAD is not set
+# CONFIG_DEVFSD_FG_NP is not set
+# CONFIG_DEVFSD_VERBOSE is not set
+# CONFIG_FEATURE_DEVFS is not set
+# CONFIG_DEVMEM is not set
+CONFIG_EJECT=y
+CONFIG_FEATURE_EJECT_SCSI=y
+CONFIG_FBSPLASH=y
+# CONFIG_FLASHCP is not set
+# CONFIG_FLASH_LOCK is not set
+# CONFIG_FLASH_UNLOCK is not set
+# CONFIG_FLASH_ERASEALL is not set
+# CONFIG_IONICE is not set
+CONFIG_INOTIFYD=y
+# CONFIG_LAST is not set
+# CONFIG_FEATURE_LAST_SMALL is not set
+# CONFIG_FEATURE_LAST_FANCY is not set
+CONFIG_HDPARM=y
+CONFIG_FEATURE_HDPARM_GET_IDENTITY=y
+CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF=y
+CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF=y
+CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET=y
+CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF=y
+CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA=y
+# CONFIG_MAKEDEVS is not set
+# CONFIG_FEATURE_MAKEDEVS_LEAF is not set
+# CONFIG_FEATURE_MAKEDEVS_TABLE is not set
+# CONFIG_MAN is not set
+# CONFIG_MICROCOM is not set
+# CONFIG_MOUNTPOINT is not set
+# CONFIG_MT is not set
+# CONFIG_RAIDAUTORUN is not set
+CONFIG_READAHEAD=y
+# CONFIG_RUNLEVEL is not set
+# CONFIG_RX is not set
+CONFIG_SETSID=y
+CONFIG_STRINGS=y
+# CONFIG_TASKSET is not set
+# CONFIG_FEATURE_TASKSET_FANCY is not set
+CONFIG_TIME=y
+CONFIG_TIMEOUT=y
+CONFIG_TTYSIZE=y
+# CONFIG_VOLNAME is not set
+CONFIG_WATCHDOG=y
+
+#
+# Networking Utilities
+#
+# CONFIG_NAMEIF is not set
+# CONFIG_FEATURE_NAMEIF_EXTENDED is not set
+CONFIG_NBDCLIENT=y
+CONFIG_NC=y
+# CONFIG_NC_SERVER is not set
+# CONFIG_NC_EXTRA is not set
+# CONFIG_NC_110_COMPAT is not set
+CONFIG_PING=y
+CONFIG_PING6=y
+CONFIG_FEATURE_FANCY_PING=y
+CONFIG_WHOIS=y
+CONFIG_FEATURE_IPV6=y
+# CONFIG_FEATURE_UNIX_LOCAL is not set
+# CONFIG_FEATURE_PREFER_IPV4_ADDRESS is not set
+# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set
+CONFIG_ARP=y
+CONFIG_ARPING=y
+CONFIG_BRCTL=y
+CONFIG_FEATURE_BRCTL_FANCY=y
+CONFIG_FEATURE_BRCTL_SHOW=y
+# CONFIG_DNSD is not set
+# CONFIG_ETHER_WAKE is not set
+# CONFIG_FAKEIDENTD is not set
+# CONFIG_FTPD is not set
+# CONFIG_FEATURE_FTP_WRITE is not set
+# CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set
+CONFIG_FTPGET=y
+CONFIG_FTPPUT=y
+# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set
+CONFIG_HOSTNAME=y
+# CONFIG_HTTPD is not set
+# CONFIG_FEATURE_HTTPD_RANGES is not set
+# CONFIG_FEATURE_HTTPD_USE_SENDFILE is not set
+# CONFIG_FEATURE_HTTPD_SETUID is not set
+# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set
+# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set
+# CONFIG_FEATURE_HTTPD_CGI is not set
+# CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set
+# CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set
+# CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set
+# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set
+# CONFIG_FEATURE_HTTPD_PROXY is not set
+# CONFIG_FEATURE_HTTPD_GZIP is not set
+# CONFIG_IFCONFIG is not set
+# CONFIG_FEATURE_IFCONFIG_STATUS is not set
+# CONFIG_FEATURE_IFCONFIG_SLIP is not set
+# CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set
+# CONFIG_FEATURE_IFCONFIG_HW is not set
+# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set
+# CONFIG_IFENSLAVE is not set
+# CONFIG_IFPLUGD is not set
+# CONFIG_IFUPDOWN is not set
+CONFIG_IFUPDOWN_IFSTATE_PATH=""
+# CONFIG_FEATURE_IFUPDOWN_IP is not set
+# CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN is not set
+# CONFIG_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN is not set
+# CONFIG_FEATURE_IFUPDOWN_IPV4 is not set
+# CONFIG_FEATURE_IFUPDOWN_IPV6 is not set
+# CONFIG_FEATURE_IFUPDOWN_MAPPING is not set
+# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set
+# CONFIG_INETD is not set
+# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set
+# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set
+# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set
+# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set
+# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set
+# CONFIG_FEATURE_INETD_RPC is not set
+CONFIG_IP=y
+CONFIG_FEATURE_IP_ADDRESS=y
+CONFIG_FEATURE_IP_LINK=y
+CONFIG_FEATURE_IP_ROUTE=y
+CONFIG_FEATURE_IP_TUNNEL=y
+# CONFIG_FEATURE_IP_RULE is not set
+# CONFIG_FEATURE_IP_SHORT_FORMS is not set
+# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set
+# CONFIG_IPADDR is not set
+# CONFIG_IPLINK is not set
+# CONFIG_IPROUTE is not set
+# CONFIG_IPTUNNEL is not set
+# CONFIG_IPRULE is not set
+CONFIG_IPCALC=y
+CONFIG_FEATURE_IPCALC_FANCY=y
+# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set
+CONFIG_NETSTAT=y
+CONFIG_FEATURE_NETSTAT_WIDE=y
+CONFIG_FEATURE_NETSTAT_PRG=y
+CONFIG_NSLOOKUP=y
+# CONFIG_NTPD is not set
+# CONFIG_FEATURE_NTPD_SERVER is not set
+# CONFIG_PSCAN is not set
+CONFIG_ROUTE=y
+# CONFIG_SLATTACH is not set
+CONFIG_TCPSVD=y
+CONFIG_TELNET=y
+CONFIG_FEATURE_TELNET_TTYPE=y
+CONFIG_FEATURE_TELNET_AUTOLOGIN=y
+# CONFIG_TELNETD is not set
+# CONFIG_FEATURE_TELNETD_STANDALONE is not set
+# CONFIG_FEATURE_TELNETD_INETD_WAIT is not set
+CONFIG_TFTP=y
+# CONFIG_TFTPD is not set
+
+#
+# Common options for tftp/tftpd
+#
+CONFIG_FEATURE_TFTP_GET=y
+# CONFIG_FEATURE_TFTP_PUT is not set
+# CONFIG_FEATURE_TFTP_BLOCKSIZE is not set
+# CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set
+# CONFIG_TFTP_DEBUG is not set
+# CONFIG_TRACEROUTE is not set
+# CONFIG_TRACEROUTE6 is not set
+# CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set
+# CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE is not set
+# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set
+CONFIG_TUNCTL=y
+CONFIG_FEATURE_TUNCTL_UG=y
+# CONFIG_UDHCPC6 is not set
+CONFIG_UDHCPD=y
+CONFIG_DHCPRELAY=y
+CONFIG_DUMPLEASES=y
+CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY=y
+# CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set
+CONFIG_DHCPD_LEASES_FILE="/var/lib/misc/udhcpd.leases"
+CONFIG_UDHCPC=y
+CONFIG_FEATURE_UDHCPC_ARPING=y
+# CONFIG_FEATURE_UDHCP_PORT is not set
+CONFIG_UDHCP_DEBUG=0
+CONFIG_FEATURE_UDHCP_RFC3397=y
+CONFIG_FEATURE_UDHCP_8021Q=y
+CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script"
+CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80
+CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS=""
+# CONFIG_UDPSVD is not set
+CONFIG_VCONFIG=y
+CONFIG_WGET=y
+CONFIG_FEATURE_WGET_STATUSBAR=y
+CONFIG_FEATURE_WGET_AUTHENTICATION=y
+# CONFIG_FEATURE_WGET_LONG_OPTIONS is not set
+CONFIG_FEATURE_WGET_TIMEOUT=y
+CONFIG_ZCIP=y
+
+#
+# Print Utilities
+#
+CONFIG_LPD=y
+CONFIG_LPR=y
+CONFIG_LPQ=y
+
+#
+# Mail Utilities
+#
+# CONFIG_MAKEMIME is not set
+CONFIG_FEATURE_MIME_CHARSET=""
+# CONFIG_POPMAILDIR is not set
+# CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set
+# CONFIG_REFORMIME is not set
+# CONFIG_FEATURE_REFORMIME_COMPAT is not set
+# CONFIG_SENDMAIL is not set
+
+#
+# Process Utilities
+#
+CONFIG_IOSTAT=y
+CONFIG_LSOF=y
+CONFIG_MPSTAT=y
+CONFIG_NMETER=y
+CONFIG_PMAP=y
+CONFIG_POWERTOP=y
+CONFIG_PSTREE=y
+CONFIG_PWDX=y
+CONFIG_SMEMCAP=y
+CONFIG_TOP=y
+CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
+CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
+CONFIG_FEATURE_TOP_SMP_CPU=y
+CONFIG_FEATURE_TOP_DECIMALS=y
+CONFIG_FEATURE_TOP_SMP_PROCESS=y
+CONFIG_FEATURE_TOPMEM=y
+CONFIG_UPTIME=y
+# CONFIG_FEATURE_UPTIME_UTMP_SUPPORT is not set
+CONFIG_FREE=y
+CONFIG_FUSER=y
+CONFIG_KILL=y
+CONFIG_KILLALL=y
+# CONFIG_KILLALL5 is not set
+# CONFIG_PGREP is not set
+CONFIG_PIDOF=y
+# CONFIG_FEATURE_PIDOF_SINGLE is not set
+# CONFIG_FEATURE_PIDOF_OMIT is not set
+# CONFIG_PKILL is not set
+CONFIG_PS=y
+CONFIG_FEATURE_PS_WIDE=y
+CONFIG_FEATURE_PS_LONG=y
+# CONFIG_FEATURE_PS_TIME is not set
+# CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set
+# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set
+# CONFIG_RENICE is not set
+CONFIG_BB_SYSCTL=y
+# CONFIG_FEATURE_SHOW_THREADS is not set
+# CONFIG_WATCH is not set
+
+#
+# Runit Utilities
+#
+# CONFIG_RUNSV is not set
+# CONFIG_RUNSVDIR is not set
+# CONFIG_FEATURE_RUNSVDIR_LOG is not set
+# CONFIG_SV is not set
+CONFIG_SV_DEFAULT_SERVICE_DIR=""
+# CONFIG_SVLOGD is not set
+# CONFIG_CHPST is not set
+# CONFIG_SETUIDGID is not set
+# CONFIG_ENVUIDGID is not set
+# CONFIG_ENVDIR is not set
+# CONFIG_SOFTLIMIT is not set
+# CONFIG_CHCON is not set
+# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set
+# CONFIG_GETENFORCE is not set
+# CONFIG_GETSEBOOL is not set
+# CONFIG_LOAD_POLICY is not set
+# CONFIG_MATCHPATHCON is not set
+# CONFIG_RESTORECON is not set
+# CONFIG_RUNCON is not set
+# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set
+# CONFIG_SELINUXENABLED is not set
+# CONFIG_SETENFORCE is not set
+# CONFIG_SETFILES is not set
+# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set
+# CONFIG_SETSEBOOL is not set
+# CONFIG_SESTATUS is not set
+
+#
+# Shells
+#
+CONFIG_ASH=y
+CONFIG_ASH_BASH_COMPAT=y
+# CONFIG_ASH_IDLE_TIMEOUT is not set
+CONFIG_ASH_JOB_CONTROL=y
+CONFIG_ASH_ALIAS=y
+CONFIG_ASH_GETOPTS=y
+CONFIG_ASH_BUILTIN_ECHO=y
+CONFIG_ASH_BUILTIN_PRINTF=y
+CONFIG_ASH_BUILTIN_TEST=y
+CONFIG_ASH_CMDCMD=y
+# CONFIG_ASH_MAIL is not set
+CONFIG_ASH_OPTIMIZE_FOR_SIZE=y
+CONFIG_ASH_RANDOM_SUPPORT=y
+CONFIG_ASH_EXPAND_PRMT=y
+CONFIG_CTTYHACK=y
+# CONFIG_HUSH is not set
+# CONFIG_HUSH_BASH_COMPAT is not set
+# CONFIG_HUSH_BRACE_EXPANSION is not set
+# CONFIG_HUSH_HELP is not set
+# CONFIG_HUSH_INTERACTIVE is not set
+# CONFIG_HUSH_SAVEHISTORY is not set
+# CONFIG_HUSH_JOB is not set
+# CONFIG_HUSH_TICK is not set
+# CONFIG_HUSH_IF is not set
+# CONFIG_HUSH_LOOPS is not set
+# CONFIG_HUSH_CASE is not set
+# CONFIG_HUSH_FUNCTIONS is not set
+# CONFIG_HUSH_LOCAL is not set
+# CONFIG_HUSH_RANDOM_SUPPORT is not set
+# CONFIG_HUSH_EXPORT_N is not set
+# CONFIG_HUSH_MODE_X is not set
+# CONFIG_MSH is not set
+CONFIG_FEATURE_SH_IS_ASH=y
+# CONFIG_FEATURE_SH_IS_HUSH is not set
+# CONFIG_FEATURE_SH_IS_NONE is not set
+CONFIG_FEATURE_BASH_IS_ASH=y
+# CONFIG_FEATURE_BASH_IS_HUSH is not set
+# CONFIG_FEATURE_BASH_IS_NONE is not set
+CONFIG_SH_MATH_SUPPORT=y
+# CONFIG_SH_MATH_SUPPORT_64 is not set
+CONFIG_FEATURE_SH_EXTRA_QUIET=y
+# CONFIG_FEATURE_SH_STANDALONE is not set
+# CONFIG_FEATURE_SH_NOFORK is not set
+CONFIG_FEATURE_SH_HISTFILESIZE=y
+
+#
+# System Logging Utilities
+#
+CONFIG_SYSLOGD=y
+# CONFIG_FEATURE_ROTATE_LOGFILE is not set
+CONFIG_FEATURE_REMOTE_LOG=y
+# CONFIG_FEATURE_SYSLOGD_DUP is not set
+CONFIG_FEATURE_SYSLOGD_CFG=y
+CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256
+CONFIG_FEATURE_IPC_SYSLOG=y
+CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16
+CONFIG_LOGREAD=y
+CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y
+CONFIG_FEATURE_KMSG_SYSLOG=y
+CONFIG_KLOGD=y
+
+#
+# klogd should not be used together with syslog to kernel printk buffer
+#
+CONFIG_FEATURE_KLOGD_KLOGCTL=y
+CONFIG_LOGGER=y
diff --git a/core/modules/consolekit/TODO b/core/modules/consolekit/TODO
new file mode 100644
index 00000000..6203c18f
--- /dev/null
+++ b/core/modules/consolekit/TODO
@@ -0,0 +1 @@
+update to new config scheme
diff --git a/core/modules/consolekit/data/etc/systemd/system/basic.target.wants/console-kit-daemon.service b/core/modules/consolekit/data/etc/systemd/system/basic.target.wants/console-kit-daemon.service
new file mode 120000
index 00000000..2b34a3f6
--- /dev/null
+++ b/core/modules/consolekit/data/etc/systemd/system/basic.target.wants/console-kit-daemon.service
@@ -0,0 +1 @@
+../console-kit-daemon.service \ No newline at end of file
diff --git a/core/modules/consolekit/data/etc/systemd/system/console-kit-daemon.service b/core/modules/consolekit/data/etc/systemd/system/console-kit-daemon.service
new file mode 100644
index 00000000..bc2a0de9
--- /dev/null
+++ b/core/modules/consolekit/data/etc/systemd/system/console-kit-daemon.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=ConsoleKit
+
+[Service]
+Type=dbus
+BusName=org.freedesktop.ConsoleKit
+ExecStart=/usr/sbin/console-kit-daemon --no-daemon
+
diff --git a/core/modules/consolekit/data/usr/share/dbus-1/system-services/org.freedesktop.ConsoleKit.service b/core/modules/consolekit/data/usr/share/dbus-1/system-services/org.freedesktop.ConsoleKit.service
new file mode 100644
index 00000000..cbefc9a4
--- /dev/null
+++ b/core/modules/consolekit/data/usr/share/dbus-1/system-services/org.freedesktop.ConsoleKit.service
@@ -0,0 +1,6 @@
+[D-BUS Service]
+Name=org.freedesktop.ConsoleKit
+Exec=/usr/sbin/console-kit-daemon --no-daemon
+User=root
+SystemdService=console-kit-daemon.service
+
diff --git a/core/modules/consolekit/module.build b/core/modules/consolekit/module.build
new file mode 100644
index 00000000..6f1dd2e7
--- /dev/null
+++ b/core/modules/consolekit/module.build
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+fetch_source() {
+ pinfo "Extracting from running system..."
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "${COPYLIST}" ] && rm "${COPYLIST}"
+
+ list_packet_files >> "${COPYLIST}"
+ tarcopy "$(cat "${COPYLIST}" | sort -u)" "${MODULE_BUILD_DIR}"
+ # Systemd/dbus
+ mkdir -p "$MODULE_BUILD_DIR/usr/share/dbus-1/system-services" "$MODULE_BUILD_DIR/etc/systemd/system"
+ local DAEMON=$(find "$MODULE_BUILD_DIR" -name console-kit-daemon -executable | head -n 1)
+ DAEMON="${DAEMON#$MODULE_BUILD_DIR}"
+ [ -z "$DAEMON" ] && perror "Could not find console-kit-daemon binary"
+ sed "s,%DAEMON%,/$DAEMON,g" "${MODULE_DIR}/templates/consolekit.systemd.service" > "$MODULE_BUILD_DIR/etc/systemd/system/console-kit-daemon.service" || perror "Could not generate systemd service"
+ sed "s,%DAEMON%,/$DAEMON,g" "${MODULE_DIR}/templates/consolekit.dbus.service" > "$MODULE_BUILD_DIR/usr/share/dbus-1/system-services/org.freedesktop.ConsoleKit.service" || perror "Could not generate dbus service"
+}
+
+post_copy() {
+ mkdir -p "${TARGET_BUILD_DIR}/usr/lib/ConsoleKit/run-seat.d"
+ mkdir -p "${TARGET_BUILD_DIR}/etc/ConsoleKit/run-seat.d"
+ mkdir -p "${TARGET_BUILD_DIR}/etc/ConsoleKit/run-session.d"
+ mkdir -p "${TARGET_BUILD_DIR}/var/log/ConsoleKit"
+}
+
diff --git a/core/modules/consolekit/module.conf b/core/modules/consolekit/module.conf
new file mode 100644
index 00000000..e27b15e6
--- /dev/null
+++ b/core/modules/consolekit/module.conf
@@ -0,0 +1,17 @@
+REQUIRED_BINARIES="
+ console-kit-daemon
+ ck-history
+ ck-launch-session
+ ck-list-sessions
+"
+REQUIRED_DIRECTORIES="
+ /etc/ConsoleKit
+ /etc/dbus-1
+ /usr/lib/ConsoleKit
+ /usr/share
+"
+REQUIRED_LIBRARIES="
+ pam_ck_connector
+ libck-connector
+"
+
diff --git a/core/modules/consolekit/module.conf.debian b/core/modules/consolekit/module.conf.debian
new file mode 100644
index 00000000..0171868a
--- /dev/null
+++ b/core/modules/consolekit/module.conf.debian
@@ -0,0 +1,6 @@
+REQUIRED_CONTENT_PACKAGES="
+ consolekit
+ libpam-ck-connector
+"
+
+
diff --git a/core/modules/consolekit/module.conf.opensuse b/core/modules/consolekit/module.conf.opensuse
new file mode 100644
index 00000000..d0f46410
--- /dev/null
+++ b/core/modules/consolekit/module.conf.opensuse
@@ -0,0 +1,8 @@
+REQUIRED_INSTALLED_PACKAGES="
+ ConsoleKit
+ ConsoleKit-x11
+"
+REQUIRED_CONTENT_PACKAGES="
+ ConsoleKit
+ ConsoleKit-x11
+"
diff --git a/core/modules/consolekit/module.conf.ubuntu b/core/modules/consolekit/module.conf.ubuntu
new file mode 100644
index 00000000..e7f5e47d
--- /dev/null
+++ b/core/modules/consolekit/module.conf.ubuntu
@@ -0,0 +1,9 @@
+REQUIRED_INSTALLED_PACKAGES="
+ consolekit
+"
+REQUIRED_CONTENT_PACKAGES="
+ consolekit
+ libpam-ck-connector
+ libck-connector0
+"
+
diff --git a/core/modules/consolekit/templates/consolekit.dbus.service b/core/modules/consolekit/templates/consolekit.dbus.service
new file mode 100644
index 00000000..5720e4cf
--- /dev/null
+++ b/core/modules/consolekit/templates/consolekit.dbus.service
@@ -0,0 +1,6 @@
+[D-BUS Service]
+Name=org.freedesktop.ConsoleKit
+Exec=%DAEMON% --no-daemon
+User=root
+SystemdService=console-kit-daemon.service
+
diff --git a/core/modules/consolekit/templates/consolekit.systemd.service b/core/modules/consolekit/templates/consolekit.systemd.service
new file mode 100644
index 00000000..f86158cc
--- /dev/null
+++ b/core/modules/consolekit/templates/consolekit.systemd.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=ConsoleKit (Legacy)
+After=syslog.target
+
+[Service]
+Type=dbus
+BusName=org.freedesktop.ConsoleKit
+ExecStart=%DAEMON% --no-daemon
+
diff --git a/core/modules/cpugovernor/data/etc/systemd/system/basic.target.wants/cpu-governor.service b/core/modules/cpugovernor/data/etc/systemd/system/basic.target.wants/cpu-governor.service
new file mode 120000
index 00000000..878a1676
--- /dev/null
+++ b/core/modules/cpugovernor/data/etc/systemd/system/basic.target.wants/cpu-governor.service
@@ -0,0 +1 @@
+../cpu-governor.service \ No newline at end of file
diff --git a/core/modules/cpugovernor/data/etc/systemd/system/cpu-governor.service b/core/modules/cpugovernor/data/etc/systemd/system/cpu-governor.service
new file mode 100644
index 00000000..e2ba1491
--- /dev/null
+++ b/core/modules/cpugovernor/data/etc/systemd/system/cpu-governor.service
@@ -0,0 +1,6 @@
+[Unit]
+Description=Sets the CPU governor
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-cpu_governor
diff --git a/core/modules/cpugovernor/data/opt/openslx/scripts/systemd-cpu_governor b/core/modules/cpugovernor/data/opt/openslx/scripts/systemd-cpu_governor
new file mode 100755
index 00000000..f7aa255a
--- /dev/null
+++ b/core/modules/cpugovernor/data/opt/openslx/scripts/systemd-cpu_governor
@@ -0,0 +1,62 @@
+#!/bin/ash
+#
+# Script to set the CPU governor to ondemand on all cores
+#
+
+# source global config
+. /opt/openslx/config || \
+ { echo "ERROR: Could not source /opt/openslx/config."; exit 1; }
+
+# set the governor to the one given in SLX_GOVERNOR
+TARGET_GOVERNOR=""
+if [ -n "$SLX_GOVERNOR" ]; then
+ TARGET_GOVERNOR="$SLX_GOVERNOR"
+else
+ # use 'ondemand' per default
+ TARGET_GOVERNOR="ondemand"
+fi
+echo "Trying to set CPU governor to $TARGET_GOVERNOR"
+# global information needed
+# CORES is the range of cores present, on bwpc4 it has the value '0-3'
+# thus the split: MINCORE=0 MAXCORE=3
+CORES="$(cat /sys/devices/system/cpu/present)"
+MINCORE="$(echo $CORES | awk -F "-" '{print $1}')"
+MAXCORE="$(echo $CORES | awk -F "-" '{print $2}')"
+
+# Helper function 'test_for_gov'
+# Usage:
+# test_for_gov <governor>
+# Example:
+# test_for_gov "ondemand"
+# Return 0 if it is supported by all cpus, 1 otherwise
+test_for_gov() {
+ # if no argument is given, print error and exit (yes exit the whole script!)
+ [ $# -ne 1 ] && echo "Usage: test_for_gov <governor>. No arguments given!" && exit 1
+ local GOVERNOR="$1"
+
+ # check for each cpu just to be safe
+ # ash-style loop ....
+ local i=$MINCORE
+ while [ $i -le $MAXCORE ]; do
+ # check if the given governor is supported
+ grep -q "${GOVERNOR}" /sys/devices/system/cpu/cpu${i}/cpufreq/scaling_available_governors 2>/dev/null || return 1;
+ # increment
+ true $(( i++ ))
+ done
+ return 0;
+}
+# now actually test the cpus for the 'ondemand' cpu governor
+if test_for_gov "${TARGET_GOVERNOR}"; then
+ # ok, so now set the governor to 'ondemand' for all cores
+ i=$MINCORE
+ while [ $i -le $MAXCORE ]; do
+ if ! echo "${TARGET_GOVERNOR}" > /sys/devices/system/cpu/cpu${i}/cpufreq/scaling_governor; then
+ echo "ERROR: Could not set the cpu governor to '${TARGET_GOVERNOR}'!"
+ exit 1
+ fi
+ true $(( i++ ))
+ done
+else
+ echo "ERROR: '${TARGET_GOVERNOR}' is not supported by this machine!"
+ exit 0
+fi
diff --git a/core/modules/cpugovernor/module.build b/core/modules/cpugovernor/module.build
new file mode 100644
index 00000000..97e93235
--- /dev/null
+++ b/core/modules/cpugovernor/module.build
@@ -0,0 +1,11 @@
+fetch_source() {
+ :
+}
+
+build() {
+ :
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/cpugovernor/module.conf b/core/modules/cpugovernor/module.conf
new file mode 100644
index 00000000..0cd03752
--- /dev/null
+++ b/core/modules/cpugovernor/module.conf
@@ -0,0 +1,3 @@
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/cron/data/etc/cron.d/.placeholder b/core/modules/cron/data/etc/cron.d/.placeholder
new file mode 100644
index 00000000..98d2cd16
--- /dev/null
+++ b/core/modules/cron/data/etc/cron.d/.placeholder
@@ -0,0 +1,2 @@
+# DO NOT EDIT OR REMOVE
+# This file is a simple placeholder to keep git from removing this directory
diff --git a/core/modules/cron/data/etc/systemd/system/cron.service b/core/modules/cron/data/etc/systemd/system/cron.service
new file mode 100644
index 00000000..d2c09ebb
--- /dev/null
+++ b/core/modules/cron/data/etc/systemd/system/cron.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Cron Daemon (cronie)
+After=auditd.service nss-user-lookup.target systemd-user-sessions.service time-sync.target ypbind.service
+
+[Service]
+ExecStart=/opt/openslx/sbin/crond -n
+Restart=on-failure
+ExecReload=/opt/openslx/bin/kill -HUP $MAINPID
+KillMode=process
+
diff --git a/core/modules/cron/data/etc/systemd/system/multi-user.target.wants/cron.service b/core/modules/cron/data/etc/systemd/system/multi-user.target.wants/cron.service
new file mode 120000
index 00000000..8c1084c3
--- /dev/null
+++ b/core/modules/cron/data/etc/systemd/system/multi-user.target.wants/cron.service
@@ -0,0 +1 @@
+../cron.service \ No newline at end of file
diff --git a/core/modules/cron/data/opt/openslx/scripts/cron-sendmail b/core/modules/cron/data/opt/openslx/scripts/cron-sendmail
new file mode 100755
index 00000000..3ce2a19d
--- /dev/null
+++ b/core/modules/cron/data/opt/openslx/scripts/cron-sendmail
@@ -0,0 +1,30 @@
+#!/bin/ash
+
+. /opt/openslx/config
+
+if [ "x$SLX_CRON_MAIL" = "xslxlog" ]; then
+ # slxlog handling - special case
+ TMP=$(mktemp)
+ cat > "$TMP"
+
+ SUBJ=$(grep '^Subject: .*$' "$TMP" | cut -c 10-)
+
+ if [ -n "$SUBJ" ]; then
+ slxlog "cron" "$SUBJ" "$TMP"
+ fi
+
+ rm -f -- "$TMP"
+elif [ -n "$SLX_CRON_MAIL" ] && [ -x "$SLX_CRON_MAIL" ]; then
+ # see if SLX_CRON_MAIL is a valid binary and use that
+ $SLX_CRON_MAIL $@
+elif which sendmail 2> /dev/null; then
+ # fallback to sendmail
+ sendmail $@
+elif which logger 2> /dev/null; then
+ # nothing worked, write to syslog if logger is present
+ TMP=$(mktemp /tmp/cron.XXXXXXXX)
+ cat > "$TMP"
+ chmod 0600 "$TMP"
+ logger "cron tried to mail, but no mailer found! Mail dumped to $TMP"
+fi
+
diff --git a/core/modules/cron/module.build b/core/modules/cron/module.build
new file mode 100644
index 00000000..a80caf57
--- /dev/null
+++ b/core/modules/cron/module.build
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+
+fetch_source() {
+ [ -d "${MODULE_WORK_DIR}/src/.git" ] && return 0
+ rm -rf -- "${MODULE_WORK_DIR}/src"
+ git clone --depth 1 "${REQUIRED_GIT}" "${MODULE_WORK_DIR}/src" || perror "Could not create ${MODULE_WORK_DIR}/src"
+ cd "${MODULE_WORK_DIR}/src"
+ git checkout "${REQUIRED_COMMIT}" || perror "Could not switch to required commit"
+ cd -
+}
+
+build() {
+
+ # compilation
+ cd "${MODULE_WORK_DIR}/src" || perror "Could not cd to '${MODULE_WORK_DIR}/src'. Did fetch_source work?"
+ ./autogen.sh || perror "Autogen failed"
+ ./configure --disable-dependency-tracking --enable-syscrontab --prefix= --exec-prefix= --bindir=/opt/openslx/bin --sbindir=/opt/openslx/sbin || perror "configure failed"
+
+ make || perror "Could not compile cron using 'make'."
+
+ # NO MAKE INSTALL: Copy to build dir, since there are no shared libs linked in
+ mkdir -p "${MODULE_BUILD_DIR}/opt/openslx/sbin"
+ cp "${MODULE_WORK_DIR}/src/src/crond" "${MODULE_BUILD_DIR}/opt/openslx/sbin/" || perror "Could not copy crond binary to ${MODULE_BUILD_DIR}"
+
+ cd - &>/dev/null
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/cron/module.conf b/core/modules/cron/module.conf
new file mode 100644
index 00000000..60d5555d
--- /dev/null
+++ b/core/modules/cron/module.conf
@@ -0,0 +1,5 @@
+REQUIRED_GIT="http://git.fedorahosted.org/git/cronie.git"
+REQUIRED_COMMIT="bab45f0b817d8829f2423e033d90974c9a3abc20"
+REQUIRED_BINARIES="
+ crond
+"
diff --git a/core/modules/cups/data/etc/cups/cupsd.conf b/core/modules/cups/data/etc/cups/cupsd.conf
new file mode 100644
index 00000000..bd3bc179
--- /dev/null
+++ b/core/modules/cups/data/etc/cups/cupsd.conf
@@ -0,0 +1,143 @@
+#
+#
+# Sample configuration file for the CUPS scheduler. See "man cupsd.conf" for a
+# complete description of this file.
+#
+
+# Log general information in error_log - change "warn" to "debug"
+# for troubleshooting...
+LogLevel warn
+
+# Deactivate CUPS' internal logrotating, as we provide a better one, especially
+# LogLevel debug2 gets usable now
+MaxLogSize 0
+
+# Administrator user group...
+SystemGroup lpadmin
+
+
+# Only listen for connections from the local machine.
+Listen localhost:631
+Listen /var/run/cups/cups.sock
+
+# Show shared printers on the local network.
+Browsing Off
+BrowseOrder allow,deny
+BrowseAllow all
+BrowseLocalProtocols CUPS dnssd
+BrowseAddress @LOCAL
+
+# Default authentication type, when authentication is required...
+DefaultAuthType Basic
+
+# Web interface setting...
+WebInterface Yes
+
+# Restrict access to the server...
+<Location />
+ Order allow,deny
+</Location>
+
+# Restrict access to the admin pages...
+<Location /admin>
+ Order allow,deny
+</Location>
+
+# Restrict access to configuration files...
+<Location /admin/conf>
+ AuthType Default
+ Require user @SYSTEM
+ Order allow,deny
+</Location>
+
+# Set the default printer/job policies...
+<Policy default>
+ # Job/subscription privacy...
+ JobPrivateAccess default
+ JobPrivateValues default
+ SubscriptionPrivateAccess default
+ SubscriptionPrivateValues default
+
+ # Job-related operations must be done by the owner or an administrator...
+ <Limit Create-Job Print-Job Print-URI Validate-Job>
+ Order deny,allow
+ </Limit>
+
+ <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job CUPS-Get-Document>
+ Require user @OWNER @SYSTEM
+ Order deny,allow
+ </Limit>
+
+ # All administration operations require an administrator to authenticate...
+ <Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default CUPS-Get-Devices>
+ AuthType Default
+ Require user @SYSTEM
+ Order deny,allow
+ </Limit>
+
+ # All printer operations require a printer operator to authenticate...
+ <Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>
+ AuthType Default
+ Require user @SYSTEM
+ Order deny,allow
+ </Limit>
+
+ # Only the owner or an administrator can cancel or authenticate a job...
+ <Limit Cancel-Job CUPS-Authenticate-Job>
+ Require user @OWNER @SYSTEM
+ Order deny,allow
+ </Limit>
+
+ <Limit All>
+ Order deny,allow
+ </Limit>
+</Policy>
+
+# Set the authenticated printer/job policies...
+<Policy authenticated>
+ # Job/subscription privacy...
+ JobPrivateAccess default
+ JobPrivateValues default
+ SubscriptionPrivateAccess default
+ SubscriptionPrivateValues default
+
+ # Job-related operations must be done by the owner or an administrator...
+ <Limit Create-Job Print-Job Print-URI Validate-Job>
+ AuthType Default
+ Order deny,allow
+ </Limit>
+
+ <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job CUPS-Get-Document>
+ AuthType Default
+ Require user @OWNER @SYSTEM
+ Order deny,allow
+ </Limit>
+
+ # All administration operations require an administrator to authenticate...
+ <Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default>
+ AuthType Default
+ Require user @SYSTEM
+ Order deny,allow
+ </Limit>
+
+ # All printer operations require a printer operator to authenticate...
+ <Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>
+ AuthType Default
+ Require user @SYSTEM
+ Order deny,allow
+ </Limit>
+
+ # Only the owner or an administrator can cancel or authenticate a job...
+ <Limit Cancel-Job CUPS-Authenticate-Job>
+ AuthType Default
+ Require user @OWNER @SYSTEM
+ Order deny,allow
+ </Limit>
+
+ <Limit All>
+ Order deny,allow
+ </Limit>
+</Policy>
+
+#
+#
diff --git a/core/modules/cups/data/etc/systemd/system/cups.service b/core/modules/cups/data/etc/systemd/system/cups.service
new file mode 100644
index 00000000..1c1e6305
--- /dev/null
+++ b/core/modules/cups/data/etc/systemd/system/cups.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Common Unix Printing System
+Requires=network.target graphical.target
+After=network.target
+Before=graphical.target
+ConditionFileNotEmpty=/etc/cups/printers.conf
+
+[Service]
+ExecStart=/usr/sbin/cupsd -f
diff --git a/core/modules/cups/data/etc/systemd/system/network.target.wants/cups.service b/core/modules/cups/data/etc/systemd/system/network.target.wants/cups.service
new file mode 120000
index 00000000..d8578ebb
--- /dev/null
+++ b/core/modules/cups/data/etc/systemd/system/network.target.wants/cups.service
@@ -0,0 +1 @@
+../cups.service \ No newline at end of file
diff --git a/core/modules/cups/module.build b/core/modules/cups/module.build
new file mode 100644
index 00000000..0128c3e6
--- /dev/null
+++ b/core/modules/cups/module.build
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+fetch_source() {
+ :
+}
+
+build() {
+ local COPYLIST file
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+
+ # cups insists on overriding PATH, so we need to fix any scripts
+ for file in "${MODULE_BUILD_DIR}"/usr/lib/cups/{filter,backend}/*; do
+ head -n 1 "$file" | grep -q '^#!/' && sed -i '/^#!\//a . \/etc\/environment' "$file"
+ done
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/cups/module.conf b/core/modules/cups/module.conf
new file mode 100644
index 00000000..6ec99ac9
--- /dev/null
+++ b/core/modules/cups/module.conf
@@ -0,0 +1,13 @@
+REQUIRED_BINARIES="
+ cupsd
+ foomatic-rip
+ gs
+"
+REQUIRED_DIRECTORIES="
+ /usr/lib/cups/
+ /usr/share/cups/
+ /usr/share/ghostscript/
+ /usr/share/ppd/cupsfilters/
+ /usr/bin/
+"
+REQUIRED_FILES=""
diff --git a/core/modules/cups/module.conf.debian b/core/modules/cups/module.conf.debian
new file mode 100644
index 00000000..1bb1efad
--- /dev/null
+++ b/core/modules/cups/module.conf.debian
@@ -0,0 +1,10 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cups-daemon
+ ghostscript
+ foomatic-filters
+"
+REQUIRED_CONTENT_PACKAGES="
+ cups-daemon
+ ghostscript
+ foomatic-filters
+"
diff --git a/core/modules/cups/module.conf.fedora b/core/modules/cups/module.conf.fedora
new file mode 100644
index 00000000..6b028b11
--- /dev/null
+++ b/core/modules/cups/module.conf.fedora
@@ -0,0 +1,12 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cups
+ cups-libs
+ foomatic-filters
+ ghostscript
+"
+REQUIRED_CONTENT_PACKAGES="
+ cups
+ cups-libs
+ foomatic-filters
+ ghostscript
+"
diff --git a/core/modules/cups/module.conf.opensuse b/core/modules/cups/module.conf.opensuse
new file mode 100644
index 00000000..6b028b11
--- /dev/null
+++ b/core/modules/cups/module.conf.opensuse
@@ -0,0 +1,12 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cups
+ cups-libs
+ foomatic-filters
+ ghostscript
+"
+REQUIRED_CONTENT_PACKAGES="
+ cups
+ cups-libs
+ foomatic-filters
+ ghostscript
+"
diff --git a/core/modules/cups/module.conf.opensuse.13.2 b/core/modules/cups/module.conf.opensuse.13.2
new file mode 100644
index 00000000..ebe832dd
--- /dev/null
+++ b/core/modules/cups/module.conf.opensuse.13.2
@@ -0,0 +1,12 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cups
+ cups-libs
+ cups-filters-foomatic-rip
+ ghostscript
+"
+REQUIRED_CONTENT_PACKAGES="
+ cups
+ cups-libs
+ cups-filters-foomatic-rip
+ ghostscript
+"
diff --git a/core/modules/cups/module.conf.ubuntu b/core/modules/cups/module.conf.ubuntu
new file mode 100644
index 00000000..8ca1d1c6
--- /dev/null
+++ b/core/modules/cups/module.conf.ubuntu
@@ -0,0 +1,10 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cups
+ ghostscript-cups
+ foomatic-filters
+"
+REQUIRED_CONTENT_PACKAGES="
+ cups
+ ghostscript-cups
+ foomatic-filters
+"
diff --git a/core/modules/cups/module.conf.ubuntu.12 b/core/modules/cups/module.conf.ubuntu.12
new file mode 100644
index 00000000..e858e04c
--- /dev/null
+++ b/core/modules/cups/module.conf.ubuntu.12
@@ -0,0 +1,16 @@
+REQUIRED_INSTALLED_PACKAGES="
+ ghostscript
+ cups
+ ghostscript-cups
+ cups-filters
+ foomatic-filters
+ libgs9-common
+"
+REQUIRED_CONTENT_PACKAGES="
+ ghostscript
+ cups
+ ghostscript-cups
+ cups-filters
+ foomatic-filters
+ libgs9-common
+"
diff --git a/core/modules/cups/module.conf.ubuntu.13 b/core/modules/cups/module.conf.ubuntu.13
new file mode 100644
index 00000000..53c8d62d
--- /dev/null
+++ b/core/modules/cups/module.conf.ubuntu.13
@@ -0,0 +1,12 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cups
+ cups-daemon
+ ghostscript-cups
+ foomatic-filters
+"
+REQUIRED_CONTENT_PACKAGES="
+ cups
+ cups-daemon
+ ghostscript-cups
+ foomatic-filters
+"
diff --git a/core/modules/cups/module.conf.ubuntu.13.10 b/core/modules/cups/module.conf.ubuntu.13.10
new file mode 100644
index 00000000..d3fa3b5d
--- /dev/null
+++ b/core/modules/cups/module.conf.ubuntu.13.10
@@ -0,0 +1,12 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cups
+ cups-daemon
+ cups-filters
+ foomatic-filters
+"
+REQUIRED_CONTENT_PACKAGES="
+ cups
+ cups-daemon
+ cups-filters
+ foomatic-filters
+"
diff --git a/core/modules/cups/module.conf.ubuntu.14 b/core/modules/cups/module.conf.ubuntu.14
new file mode 100644
index 00000000..23207e5b
--- /dev/null
+++ b/core/modules/cups/module.conf.ubuntu.14
@@ -0,0 +1,18 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cups
+ cups-daemon
+ cups-filters
+ cups-core-drivers
+ cups-filters-core-drivers
+ ghostscript
+ libgs9-common
+"
+REQUIRED_CONTENT_PACKAGES="
+ cups
+ cups-daemon
+ cups-filters
+ cups-core-drivers
+ cups-filters-core-drivers
+ ghostscript
+ libgs9-common
+"
diff --git a/core/modules/cups/module.conf.ubuntu.16 b/core/modules/cups/module.conf.ubuntu.16
new file mode 100644
index 00000000..23207e5b
--- /dev/null
+++ b/core/modules/cups/module.conf.ubuntu.16
@@ -0,0 +1,18 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cups
+ cups-daemon
+ cups-filters
+ cups-core-drivers
+ cups-filters-core-drivers
+ ghostscript
+ libgs9-common
+"
+REQUIRED_CONTENT_PACKAGES="
+ cups
+ cups-daemon
+ cups-filters
+ cups-core-drivers
+ cups-filters-core-drivers
+ ghostscript
+ libgs9-common
+"
diff --git a/core/modules/dbus/data/etc/dbus-1/system.d/99-nsa-prism-module.conf b/core/modules/dbus/data/etc/dbus-1/system.d/99-nsa-prism-module.conf
new file mode 100644
index 00000000..b6470bd3
--- /dev/null
+++ b/core/modules/dbus/data/etc/dbus-1/system.d/99-nsa-prism-module.conf
@@ -0,0 +1,14 @@
+<!DOCTYPE busconfig PUBLIC
+ "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+ <policy user="root">
+ <allow eavesdrop="true"/>
+ <allow eavesdrop="true"
+ send_type="method_call"
+ send_destination="*"
+ send_path="/org/freedesktop/DBus"
+ send_interface="org.freedesktop.DBus"
+ send_member="AddMatch"/>
+ </policy>
+</busconfig>
diff --git a/core/modules/dbus/data/etc/systemd/system/dbus.socket b/core/modules/dbus/data/etc/systemd/system/dbus.socket
new file mode 100644
index 00000000..5c373cf4
--- /dev/null
+++ b/core/modules/dbus/data/etc/systemd/system/dbus.socket
@@ -0,0 +1,5 @@
+[Unit]
+Description=D-Bus System Message Bus Socket
+
+[Socket]
+ListenStream=/run/dbus/system_bus_socket
diff --git a/core/modules/dbus/data/etc/systemd/system/multi-user.target.wants/dbus.service b/core/modules/dbus/data/etc/systemd/system/multi-user.target.wants/dbus.service
new file mode 120000
index 00000000..224df24b
--- /dev/null
+++ b/core/modules/dbus/data/etc/systemd/system/multi-user.target.wants/dbus.service
@@ -0,0 +1 @@
+../dbus.service \ No newline at end of file
diff --git a/core/modules/dbus/data/etc/systemd/system/sockets.target.wants/dbus.socket b/core/modules/dbus/data/etc/systemd/system/sockets.target.wants/dbus.socket
new file mode 120000
index 00000000..fe02d162
--- /dev/null
+++ b/core/modules/dbus/data/etc/systemd/system/sockets.target.wants/dbus.socket
@@ -0,0 +1 @@
+../dbus.socket \ No newline at end of file
diff --git a/core/modules/dbus/module.build b/core/modules/dbus/module.build
new file mode 100644
index 00000000..c6b05a8a
--- /dev/null
+++ b/core/modules/dbus/module.build
@@ -0,0 +1,65 @@
+#!/bin/bash
+
+fetch_source() {
+ echo "Extracting from running system..."
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "${COPYLIST}" ] && rm "${COPYLIST}"
+
+ list_packet_files >> "${COPYLIST}"
+ tarcopy "$(cat "${COPYLIST}" | sort -u)" "${MODULE_BUILD_DIR}"
+
+ # Generate systemd files
+ mkdir -p "$MODULE_BUILD_DIR/etc/systemd/system"
+ # This is ugly, as the command line arguments changed over time. Try to do the right thing (whatever that is)
+ # Need to run dbus-uuidgen first?
+ local UUIDGEN="# This line intentionally left blank"
+ if files_contain "ExecStartPre.*uuidgen" "/lib/systemd/system/dbus.service" "/usr/lib/systemd/system/dbus.service"; then
+ UUIDGEN=$(find "$MODULE_BUILD_DIR" -name dbus-uuidgen -executable | head -n 1)
+ [ -z "$UUIDGEN" ] && perror "Could not determine dbus-uuidgen location"
+ UUIDGEN="ExecStartPre=/${UUIDGEN#$MODULE_BUILD_DIR} --ensure"
+ fi
+ # Figure out daemon location
+ local DAEMON=$(find "$MODULE_BUILD_DIR" -name dbus-daemon -executable | head -n 1)
+ [ -z "$DAEMON" ] && perror "Could not determine dbus-daemon location"
+ DAEMON="/${DAEMON#$MODULE_BUILD_DIR}"
+ local DAEMON_ARGS=""
+ # Daemon arguments
+ if files_contain "dbus-daemon.*nopidfile" "/lib/systemd/system/dbus.service" "/usr/lib/systemd/system/dbus.service"; then
+ DAEMON_ARGS+=" --nopidfile"
+ fi
+ if files_contain "dbus-daemon.*activation=systemd" "/lib/systemd/system/dbus.service" "/usr/lib/systemd/system/dbus.service"; then
+ DAEMON_ARGS+=" --activation=systemd"
+ fi
+ if files_contain "dbus-daemon.*systemd-activation" "/lib/systemd/system/dbus.service" "/usr/lib/systemd/system/dbus.service"; then
+ DAEMON_ARGS+=" --systemd-activation"
+ fi
+ # dbus-send location
+ local SEND=$(find "$MODULE_BUILD_DIR" -name dbus-send -executable | head -n 1)
+ [ -z "$SEND" ] && perror "Could not determine dbus-send location"
+ SEND="/${SEND#$MODULE_BUILD_DIR}"
+ sed "s,%UUIDGEN%,$UUIDGEN,g;s,%DAEMON%,$DAEMON,g;s,%SEND%,$SEND,g;s,%DAEMON_ARGS%,$DAEMON_ARGS,g" "${MODULE_DIR}/templates/dbus.service" \
+ > "$MODULE_BUILD_DIR/etc/systemd/system/dbus.service" \
+ || perror "Could not generate $MODULE_BUILD_DIR/etc/systemd/system/dbus.service"
+ # This is REQUIRED, otherwise the session daemon won't start (can be empty, but has to exist...)
+ mkdir -p "${MODULE_BUILD_DIR}/etc/dbus-1/session.d"
+}
+
+post_copy() {
+ :
+}
+
+files_contain () {
+ [ $# -lt 2 ] && perror "files_contain needs at least 2 arguments (pattern, file)"
+ local PATTERN="$1"
+ shift
+ local FILE
+ for FILE in $@; do
+ [ -e "$FILE" ] || continue
+ grep -q "$PATTERN" "$FILE" && return 0 # Found
+ done
+ return 1
+}
+
diff --git a/core/modules/dbus/module.conf b/core/modules/dbus/module.conf
new file mode 100644
index 00000000..5e5dc4f8
--- /dev/null
+++ b/core/modules/dbus/module.conf
@@ -0,0 +1,16 @@
+REQUIRED_BINARIES="
+ dbus-cleanup-sockets
+ dbus-daemon
+ dbus-uuidgen
+ dbus-monitor
+ dbus-send
+ dbus-daemon-launch-helper
+ dbus-launch
+ "
+REQUIRED_DIRECTORIES="
+ /etc/dbus-1
+"
+REQUIRED_FILES="
+ /etc/systemd/system/dbus.service
+"
+
diff --git a/core/modules/dbus/module.conf.centos b/core/modules/dbus/module.conf.centos
new file mode 100644
index 00000000..f38f590f
--- /dev/null
+++ b/core/modules/dbus/module.conf.centos
@@ -0,0 +1,4 @@
+REQUIRED_CONTENT_PACKAGES="
+ dbus
+"
+
diff --git a/core/modules/dbus/module.conf.debian b/core/modules/dbus/module.conf.debian
new file mode 100644
index 00000000..d007c2ef
--- /dev/null
+++ b/core/modules/dbus/module.conf.debian
@@ -0,0 +1,9 @@
+REQUIRED_CONTENT_PACKAGES="
+ dbus
+"
+REQUIRED_DIRECTORIES+="
+ /lib/systemd
+"
+REQUIRED_FILES="
+ /etc/default/dbus
+"
diff --git a/core/modules/dbus/module.conf.fedora b/core/modules/dbus/module.conf.fedora
new file mode 100644
index 00000000..f38f590f
--- /dev/null
+++ b/core/modules/dbus/module.conf.fedora
@@ -0,0 +1,4 @@
+REQUIRED_CONTENT_PACKAGES="
+ dbus
+"
+
diff --git a/core/modules/dbus/module.conf.opensuse b/core/modules/dbus/module.conf.opensuse
new file mode 100644
index 00000000..9bc514e2
--- /dev/null
+++ b/core/modules/dbus/module.conf.opensuse
@@ -0,0 +1,4 @@
+REQUIRED_CONTENT_PACKAGES="
+ dbus-1
+"
+
diff --git a/core/modules/dbus/module.conf.ubuntu b/core/modules/dbus/module.conf.ubuntu
new file mode 100644
index 00000000..558eea7f
--- /dev/null
+++ b/core/modules/dbus/module.conf.ubuntu
@@ -0,0 +1,7 @@
+REQUIRED_CONTENT_PACKAGES="
+ dbus
+"
+REQUIRED_FILES+="
+ /etc/default/dbus
+"
+
diff --git a/core/modules/dbus/module.conf.ubuntu.16 b/core/modules/dbus/module.conf.ubuntu.16
new file mode 100644
index 00000000..dc01164f
--- /dev/null
+++ b/core/modules/dbus/module.conf.ubuntu.16
@@ -0,0 +1,9 @@
+REQUIRED_CONTENT_PACKAGES="
+ dbus
+ dbus-x11
+"
+REQUIRED_FILES+="
+"
+REQUIRED_DIRECTORIES="
+ /usr/share/dbus-1
+"
diff --git a/core/modules/dbus/templates/dbus.service b/core/modules/dbus/templates/dbus.service
new file mode 100644
index 00000000..c9f747b0
--- /dev/null
+++ b/core/modules/dbus/templates/dbus.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=D-Bus System Message Bus
+Wants=dbus.socket
+Requires=dbus.socket
+After=syslog.target
+
+[Service]
+%UUIDGEN%
+ExecStartPre=-/opt/openslx/bin/rm -f /var/run/dbus/pid
+ExecStart=%DAEMON% --system --address=systemd: --nofork %DAEMON_ARGS%
+ExecReload=%SEND% --print-reply --system --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig
+OOMScoreAdjust=-900
+
diff --git a/core/modules/debug/data/addon-init b/core/modules/debug/data/addon-init
new file mode 100755
index 00000000..e83c21ba
--- /dev/null
+++ b/core/modules/debug/data/addon-init
@@ -0,0 +1,4 @@
+#!/bin/ash
+
+systemctl daemon-reload
+systemctl start debug-shell.service
diff --git a/core/modules/debug/data/etc/systemd/system/debug-udevd_logger.service b/core/modules/debug/data/etc/systemd/system/debug-udevd_logger.service
new file mode 100644
index 00000000..387defde
--- /dev/null
+++ b/core/modules/debug/data/etc/systemd/system/debug-udevd_logger.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Logger for udevd-messages via udevadmin monitor
+DefaultDependencies=no
+IgnoreOnIsolate=yes
+
+[Service]
+ExecStart=/opt/openslx/scripts/systemd-debug_udevd_logger
+
diff --git a/core/modules/debug/data/etc/systemd/system/sysinit.target.wants/debug-udevd_logger.service b/core/modules/debug/data/etc/systemd/system/sysinit.target.wants/debug-udevd_logger.service
new file mode 120000
index 00000000..ad7f978f
--- /dev/null
+++ b/core/modules/debug/data/etc/systemd/system/sysinit.target.wants/debug-udevd_logger.service
@@ -0,0 +1 @@
+../debug-udevd_logger.service \ No newline at end of file
diff --git a/core/modules/debug/data/opt/openslx/bin/debug_report b/core/modules/debug/data/opt/openslx/bin/debug_report
new file mode 100755
index 00000000..4cdfae4e
--- /dev/null
+++ b/core/modules/debug/data/opt/openslx/bin/debug_report
@@ -0,0 +1,98 @@
+#!/bin/ash
+
+TOOLS="
+ journalctl
+ systemctl
+ loginctl
+ lspci
+ lsusb
+ lsmod
+ mount
+"
+
+URL="http://132.230.8.113/error_report.php"
+
+if [ "$UID" != "0" ]; then
+ echo "Debug Reports können nur von root versendet werden" >&2
+ exit 1
+fi
+
+if ! curl -H "Expect:" -f -s -S --connect-timeout 5 "$URL" > /dev/null; then
+ echo "Kann den Debug-Report-Server in Freiburg nicht erreichen. :-(" >&2
+ exit 1
+fi
+
+rm -rf /tmp/debug-report
+mkdir -p /tmp/debug-report/{static,generated}
+
+if [ ! -d /tmp/debug-report ]; then
+ echo "FEHLER: Konnte /tmp/debug-report nicht erstellen!" >&2
+ exit 1
+fi
+
+cd /tmp/debug-report
+
+cat > err-desc <<HEREEND
+
+# Bitte hier kurz eine passende Fehlerbeschreibung eingeben, anschließend
+# Strg+O, ENTER, und Strg+X drücken.
+HEREEND
+
+nano -w err-desc
+
+echo -n "Beginne mit dem Erstellen des Fehlerberichts..."
+
+. /opt/openslx/config
+
+echo "TIME INFORMATION:" > metadata
+hwclock >> metadata
+date >> metadata
+for srv in 132.230.1.9 $SLX_NTP_SERVER 0.de.pool.ntp.org; do
+ ntpdate -u -q -p 2 -t 1 "$srv" >> metadata && break
+done
+echo -n "..."
+
+cp /opt/openslx/config /tmp/udhcpclog static/ 2> /dev/null
+echo -n "."
+
+find /tmp/vmware* -name "*.log" -exec cp {} static/ \; 2> /dev/null
+echo -n "."
+
+cp /var/log/Xorg.0.lo* static/ 2> /dev/null
+cp /var/log/{auth.log,kdm.log,syslog,messages,user.log} static/ 2> /dev/null
+cp /proc/cpuinfo static/ 2> /dev/null
+echo -n "."
+
+for tool in $TOOLS; do
+ $tool > "generated/${tool}-out" 2> "generated/${tool}-err"
+ echo -n "."
+done
+
+ip a > "generated/ip-a-out" 2> "generated/ip-a-err"
+echo -n "."
+
+systemctl status > "generated/systemctl-status-out" 2> "generated/systemctl-status-err"
+echo -n "."
+
+ps aux > "generated/ps-out" 2> "generated/ps-err"
+echo -n "."
+
+echo "..fertig!"
+
+cd /tmp
+rm -f error-report.tar.gz
+echo -n "Packe Fehlerbericht ein..."
+if ! tar czf error-report.tar.gz debug-report; then
+ echo "Fehler beim Packen des Berichts!" >&2
+ exit 1
+fi
+echo "....fertig!"
+
+echo -n "Lade Fehlerbericht hoch...."
+if ! curl -H "Expect:" -f -s -S -F "file=@error-report.tar.gz;filename=report" "$URL" > /dev/null; then
+ echo "Fehler beim Hochladen des Fehlerberichts :-(" >&2
+ exit 1
+fi
+
+echo "Fehlerbericht erfolgreich versendet!"
+
diff --git a/core/modules/debug/data/opt/openslx/scripts/systemd-debug_udevd_logger b/core/modules/debug/data/opt/openslx/scripts/systemd-debug_udevd_logger
new file mode 100755
index 00000000..fb04d568
--- /dev/null
+++ b/core/modules/debug/data/opt/openslx/scripts/systemd-debug_udevd_logger
@@ -0,0 +1,2 @@
+#!/bin/ash
+/usr/bin/udevadm monitor | /usr/bin/logger
diff --git a/core/modules/debug/module.build b/core/modules/debug/module.build
new file mode 100644
index 00000000..c020181d
--- /dev/null
+++ b/core/modules/debug/module.build
@@ -0,0 +1,20 @@
+fetch_source() {
+ :
+}
+
+build() {
+
+ for BIN in $REQUIRED_BINARIES; do
+ [[ "$BIN" == @* ]] && BIN=$(echo "$BIN" | cut -c 2-)
+ BIN_LOCATION=$(which ${BIN})
+ if [ ! -z ${BIN_LOCATION} -a -e ${BIN_LOCATION} ]; then
+ tarcopy "$(get_link_chain ${BIN_LOCATION})" "${MODULE_BUILD_DIR}"
+ else
+ pwarning "'${BIN}' not found on the system."
+ fi
+ done
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/debug/module.conf b/core/modules/debug/module.conf
new file mode 100644
index 00000000..71006514
--- /dev/null
+++ b/core/modules/debug/module.conf
@@ -0,0 +1,18 @@
+REQUIRED_BINARIES="
+ strace
+ ltrace
+ ldd
+ setterm
+ curl
+ nano
+ fc-cache
+ fc-query
+ @xset
+ locale
+ su
+ file
+ @htop
+ @logger
+ @tcpdump
+ getfacl
+"
diff --git a/core/modules/debug/module.conf.debian b/core/modules/debug/module.conf.debian
new file mode 100644
index 00000000..00bfea2c
--- /dev/null
+++ b/core/modules/debug/module.conf.debian
@@ -0,0 +1,7 @@
+REQUIRED_INSTALLED_PACKAGES="
+ curl
+ ltrace
+ strace
+ nano
+ fontconfig
+"
diff --git a/core/modules/debug/module.conf.opensuse b/core/modules/debug/module.conf.opensuse
new file mode 100644
index 00000000..b7971956
--- /dev/null
+++ b/core/modules/debug/module.conf.opensuse
@@ -0,0 +1,11 @@
+REQUIRED_INSTALLED_PACKAGES="
+ curl
+ ltrace
+ nano
+ fontconfig
+ fonts-config
+ xset
+"
+REQUIRED_BINARIES+="
+ fonts-config
+"
diff --git a/core/modules/debug/module.conf.ubuntu b/core/modules/debug/module.conf.ubuntu
new file mode 100644
index 00000000..00bfea2c
--- /dev/null
+++ b/core/modules/debug/module.conf.ubuntu
@@ -0,0 +1,7 @@
+REQUIRED_INSTALLED_PACKAGES="
+ curl
+ ltrace
+ strace
+ nano
+ fontconfig
+"
diff --git a/core/modules/dhcpc-busybox/README b/core/modules/dhcpc-busybox/README
new file mode 100644
index 00000000..5dd78e73
--- /dev/null
+++ b/core/modules/dhcpc-busybox/README
@@ -0,0 +1,7 @@
+This module requires that busybox udhcpc is present in stage 3.2
+
+The default setup builds busybox with udhcpc, puts it in stage 3.1
+which copies it to stage 3.2 before the switchroot happens. That's
+why there is no direct dependency in this module's .conf: busybox
+is not part of the stage 3.2 target.
+
diff --git a/core/modules/dhcpc-busybox/data/etc/systemd/system/dhcpc@.service b/core/modules/dhcpc-busybox/data/etc/systemd/system/dhcpc@.service
new file mode 120000
index 00000000..a2e7487d
--- /dev/null
+++ b/core/modules/dhcpc-busybox/data/etc/systemd/system/dhcpc@.service
@@ -0,0 +1 @@
+udhcpc@.service \ No newline at end of file
diff --git a/core/modules/dhcpc-busybox/data/etc/systemd/system/udhcpc@.service b/core/modules/dhcpc-busybox/data/etc/systemd/system/udhcpc@.service
new file mode 100644
index 00000000..6c2061a0
--- /dev/null
+++ b/core/modules/dhcpc-busybox/data/etc/systemd/system/udhcpc@.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=DHCP Client for %i
+After=systemd-tmpfiles-setup.service
+
+[Service]
+Type=forking
+PIDFile=/run/udhcpc/udhcpc.%I.pid
+ExecStart=/opt/openslx/scripts/systemd-udhcpc++ %I
+ExecStopPost=/opt/openslx/bin/rm /run/udhcpc/udhcpc.%I.pid
+
diff --git a/core/modules/dhcpc-busybox/data/etc/tmpfiles.d/udhcpc.conf b/core/modules/dhcpc-busybox/data/etc/tmpfiles.d/udhcpc.conf
new file mode 100644
index 00000000..2b8ede25
--- /dev/null
+++ b/core/modules/dhcpc-busybox/data/etc/tmpfiles.d/udhcpc.conf
@@ -0,0 +1 @@
+d /run/udhcpc 0755 root root
diff --git a/core/modules/dhcpc-busybox/data/opt/openslx/scripts/systemd-udhcpc++ b/core/modules/dhcpc-busybox/data/opt/openslx/scripts/systemd-udhcpc++
new file mode 100755
index 00000000..b3de09e7
--- /dev/null
+++ b/core/modules/dhcpc-busybox/data/opt/openslx/scripts/systemd-udhcpc++
@@ -0,0 +1,20 @@
+#!/bin/bash
+PATH=$PATH:/opt/openslx/bin:/opt/openslx/sbin
+
+NET_IF="$1"
+NET_IP="$(ip addr show dev "${NET_IF}" | grep -m1 '^\s*inet ' | awk -F " " '{print $2}' | awk -F "/" '{print $1}')"
+
+UDHCPC_OPTS=""
+[ ! -z "$NET_IP" ] && UDHCPC_OPTS=" -r $NET_IP"
+
+mkdir -p /run/udhcpc || echo "Could not create '/run/udhcpc'."
+
+/opt/openslx/sbin/udhcpc $UDHCPC_OPTS -O domain -O nissrv -O nisdomain -O wpad -O search -t 8 -s /opt/openslx/scripts/udhcpc-openslx -i "$NET_IF" -p "/run/udhcpc/udhcpc.$NET_IF.pid"
+RET=$?
+
+if [ "$RET" != 0 ]; then
+ slxlog "udhcpc" "Could not run 'udhcpc${UDHCPC_OPTS}' on ${NET_IF}."
+fi
+
+exit "$RET"
+
diff --git a/core/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx b/core/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx
new file mode 100755
index 00000000..dd8cd8ba
--- /dev/null
+++ b/core/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx
@@ -0,0 +1,254 @@
+#!/bin/bash
+# Needs bash for printf -v VARNAME
+# -----------------------------------------------------------------------------
+#
+# Copyright (c) 2011 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+#
+# Mini-Linux Toolkit
+#
+# -----------------------------------------------------------------------------
+
+. /opt/openslx/config
+
+RESOLV_CONF="/opt/openslx/resolv.conf"
+THIS_RESOLV="/run/network/${interface}.resolv"
+
+rebuild_resolv_conf () {
+ # Don't do anything if the active resolv.conf is not ours
+ # Also this will not run resolvconf update.d... No idea if we should still do so...
+ [ -L "/etc/resolv.conf" ] || return 0
+ [ "x$(readlink "/etc/resolv.conf")" == "x${RESOLV_CONF}" ] || return 0
+ # Maybe make this smarter some time, if anyone is using clients that are on multiple networks at once etc...
+ # This is a little braindead but should work most of the time
+ sort -u /run/network/*.resolv > "$RESOLV_CONF" 2> /dev/null
+
+ # add support for resolv.conf update scripts // see man(8) resolvconf
+ if [ -d /etc/resolvconf/update.d ]; then
+ for s in $(ls -1 /etc/resolvconf/update.d/*.sh); do
+ $s
+ done
+ fi
+}
+
+escape_search() {
+ echo "$@" | sed -e 's/[]\/()$*.^|[]/\\&/g'
+}
+
+escape_replace() {
+ echo "$@" | sed -e 's/[\/&]/\\&/g'
+}
+
+check_env() {
+ if [ -z "$ip" -o -z "$subnet" -o -z "$interface" ]; then
+ echo "$1 event with missing data" >&2
+ echo "ip = '$ip'" >&2
+ echo "subnet = '$subnet'" >&2
+ echo "interface = '$interface'" >&2
+ exit 1
+ fi
+}
+
+if [ ! -d /run ]; then
+ echo -n "Waiting for /run." >&2
+ while [ ! -d /run ]; do
+ echo -n "." >&2
+ usleep 500000
+ done
+ echo "" >&2
+fi
+
+case "$1" in
+ bound|renew)
+ check_env "$1"
+ mkdir -p "/run/dhcpc"
+ # Set address on interface
+ ip addr add "$ip/$(ipcalc -s -p $ip $subnet|sed s/.*=//)" dev "$interface"
+ # Set default route, if given
+ if [ -n "$router" ]; then
+ ip route add default via "$router"
+ fi
+
+ # get domain, hostname and thus fqdn from DNS
+ dns_fqdn=$(/opt/openslx/bin/busybox timeout -t 3 rdns "$ip")
+ dns_short="${dns_fqdn%%.*}"
+ # check if it is fqdn
+ if [ "$dns_fqdn" == "$dns_short" ]; then
+ unset dns_fqdn dns_short
+ fi
+
+ # Update resolver configuration file
+ CONF=""
+ if [ -n "$domain" ]; then
+ printf -v CONF "${CONF}domain $domain\n"
+ elif [ -n "$dns_fqdn" ]; then
+ domain="${dns_fqdn#*.}"
+ printf -v CONF "${CONF}domain $domain\n"
+
+ elif [ -n "$SLX_NET_DOMAIN" ]; then
+ domain="$SLX_NET_DOMAIN"
+ printf -v CONF "${CONF}domain $domain\n"
+ fi
+ if [ -n "$search" ]; then
+ printf -v CONF "${CONF}search $search\n"
+ elif [ -n "$SLX_SEARCH_DOMAIN" ]; then
+ printf -v CONF "${CONF}search $SLX_SEARCH_DOMAIN\n"
+ elif [ -n "$SLX_NET_DOMAIN" ]; then
+ printf -v CONF "${CONF}search $SLX_NET_DOMAIN\n"
+ fi
+ for i in $dns; do
+ echo "$0: Adding DNS $i"
+ printf -v CONF "${CONF}nameserver $i\n"
+ done
+
+ if [ -x "/sbin/resolvconf" ] && [ -L "/etc/resolv.conf" ] && [ -d "/etc/resolvconf/update.d" ]; then
+ # Automatic handling :-)
+ resolvconf --create-runtime-directories
+ resolvconf --enable-updates
+ echo -n "$CONF" | resolvconf -a "${interface}.udhcpc"
+ else
+ # Manual handling required :-(
+ echo -n "$CONF" > "$THIS_RESOLV"
+ rebuild_resolv_conf
+ fi
+
+
+ # Things that should only happen for the main interface that was used for booting
+ if [ "$interface" == "br0" ]; then
+ # Update IP
+ sed -i "s/^\(SLX_PXE_CLIENT_IP=\).*$/\1'$ip'/" /opt/openslx/config
+
+ # Only if network is not ready yet
+ if [ ! -e "/run/network/network-ready" ]; then
+ # Update hostname
+ if [ -z "$dns_fqdn" -a -n "$domain" -a -n "$hostname" ]; then
+ # fallback to what the dhcp told us
+ dns_fqdn="${hostname}.${domain}"
+ fi
+ if [ -z "$dns_fqdn" ]; then
+ # only if there is no /etc/hostname, we fall back (far back, that is)
+ [ ! -s "/etc/hostname" ] && dns_fqdn="slx-client"
+ fi
+ # finally, if dns_fqdn was set to anything, apply it
+ if [ -n "$dns_fqdn" ]; then
+ dns_short="${dns_fqdn%%.*}"
+ echo "$dns_short" > "/proc/sys/kernel/hostname"
+ echo "$dns_short" > "/etc/hostname"
+ if grep '^SLX_HOSTNAME=' /opt/openslx/config 2>/dev/null; then
+ sed -i "s/^\(SLX_HOSTNAME=\).*$/\1'$dns_short'/" /opt/openslx/config
+ else
+ echo "# Config written by openslx-dhcp-script (1)" >> /opt/openslx/config
+ echo "SLX_HOSTNAME='$dns_short'" >> /opt/openslx/config
+ fi
+ fi
+
+ # if domain is given from dhcp, save it to openslx config for later use in VMs
+ if [ -n "$domain" ]; then
+ # check if SLX_NET_DOMAIN is in the config at all
+ if grep '^SLX_NET_DOMAIN=' /opt/openslx/config 2>/dev/null; then
+ sed -i "s/^\(SLX_NET_DOMAIN=\).*$/\1'$domain'/" /opt/openslx/config
+ else
+ # not set, add it
+ echo "SLX_NET_DOMAIN='$domain'" >> /opt/openslx/config
+ fi
+ fi
+ # Update /etc/issue for proper spacing
+ /opt/openslx/scripts/openslx-create_issue
+ touch "/run/network/network-ready"
+ # Mark network target as reached
+ systemctl start network.target &
+ fi # end "network not ready yet"
+ fi # end "br0 only"
+
+ # Hostname in /etc/hosts
+ touch "/etc/hosts"
+ hostlist=""
+ [ -n "$dns_fqdn" ] && hostlist="$dns_fqdn"
+ [ -n "$hostname" -a -n "$domain" -a "x${hostname}.${domain}" != "x$dns_fqdn" ] && hostlist="$hostlist ${hostname}.${domain}"
+ if [ -n "$hostlist" ]; then
+ for host in $hostlist; do
+ host_short="${host%%.*}"
+ [ "x$host_short" = "x$host" ] && host_short=""
+ sed -i -r "s/\s$(escape_search "$host")(\s|$)/ /g" /etc/hosts
+ [ -n "$host_short" ] && sed -i -r "s/\s$(escape_search "$host_short")(\s|$)/ /g" /etc/hosts
+ if grep -q -E "^$ip\s" /etc/hosts; then
+ sed -i "s/^$(escape_search "$ip")\s.*/$(escape_replace "$ip $host $host_short")/g" /etc/hosts
+ else
+ echo "$ip $host $host_short" >> /etc/hosts
+ fi
+ done
+ fi
+ # Get rid of orphaned lines in /etc/hosts
+ sed -i -r '/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\s*$/d' /etc/hosts
+
+ # "dns ready" target
+ if [ -n "$dns" ] && [ ! -e "/run/network/dns-ready" ]; then
+ touch "/run/network/dns-ready"
+ # Write to openslx-config
+ echo "# Config written by openslx-dhcp-script (2)" >> /opt/openslx/config
+ echo "SLX_DNS='$dns'" >> /opt/openslx/config
+ systemctl start network-dns.target &
+ fi
+ # "default route exists" target
+ if [ -n "$router" ] && [ ! -e "/run/network/gateway-ready" ]; then
+ touch "/run/network/gateway-ready"
+ # Write to openslx-config
+ echo "# Config written by openslx-dhcp-script (3)" >> /opt/openslx/config
+ echo "SLX_DNS='$dns'" >> /opt/openslx/config
+ systemctl start network-gateway.target &
+ fi
+
+ # Port redirection for printing happens in printergui module (iptables-helper rule)
+ ####iptables -A INPUT -i br0 -p tcp --dport 515 -j DROP
+ ####iptables -A INPUT -i br0 -p tcp --dport 5515 -j DROP
+ ####iptables -t nat -A PREROUTING -s 192.168.0.0/16 -p tcp --dport 515 -j REDIRECT --to-port 5515
+ ;;
+
+ deconfig)
+ check_env "$1"
+ if [ $(grep -c "nfs=" /proc/cmdline) == 0 ]; then
+ echo 1 > "/proc/sys/net/ipv4/conf/$interface/promote_secondaries"
+ clientip=${ip%%:*}
+ ip addr del "$clientip/$(ipcalc -s -p $clientip $subnet|sed s/.*=//)" dev "$interface"
+ sed -i "/^$(escape_search "$ip")(\s|$)/d" /etc/hosts
+ else
+ echo "NFS is active, not removing old ip adress. warning: lease may expire after a while."
+ fi
+
+ if [ -x /sbin/resolvconf ] && [ -L /etc/resolv.conf ] && [ -d /etc/resolvconf/update.d ]; then
+ # Automatic handling :-)
+ resolvconf -d "${interface}.udhcpc"
+ else
+ # Manual handling required :-(
+ rm -f -- "$THIS_RESOLV"
+ rebuild_resolv_conf
+ fi
+ ;;
+
+ leasefail)
+ echo "$0: Lease failed: $message" >&2
+
+ ;;
+
+ nak)
+ echo "$0: Received a NAK: $message" >&2
+
+ ;;
+
+ *)
+ echo "$0: Unknown udhcpc command: $1" >&2
+ exit 1
+
+ ;;
+esac
+
+exit 0
+
diff --git a/core/modules/dhcpc-busybox/module.build b/core/modules/dhcpc-busybox/module.build
new file mode 100644
index 00000000..d8804784
--- /dev/null
+++ b/core/modules/dhcpc-busybox/module.build
@@ -0,0 +1,13 @@
+
+fetch_source() {
+ :
+}
+
+build() {
+ :
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/dhcpc-busybox/module.conf b/core/modules/dhcpc-busybox/module.conf
new file mode 100644
index 00000000..c01ade29
--- /dev/null
+++ b/core/modules/dhcpc-busybox/module.conf
@@ -0,0 +1 @@
+# Nothing
diff --git a/core/modules/dnbd3/TODO b/core/modules/dnbd3/TODO
new file mode 100644
index 00000000..6203c18f
--- /dev/null
+++ b/core/modules/dnbd3/TODO
@@ -0,0 +1 @@
+update to new config scheme
diff --git a/core/modules/dnbd3/data/etc/fuse.conf b/core/modules/dnbd3/data/etc/fuse.conf
new file mode 100644
index 00000000..926d936f
--- /dev/null
+++ b/core/modules/dnbd3/data/etc/fuse.conf
@@ -0,0 +1,8 @@
+# /etc/fuse.conf - Configuration file for Filesystem in Userspace (FUSE)
+
+# Set the maximum number of FUSE mounts allowed to non-root users.
+# The default is 1000.
+#mount_max = 1000
+
+# Allow non-root users to specify the allow_other or allow_root mount options.
+user_allow_other
diff --git a/core/modules/dnbd3/data/etc/systemd/system/setup-dnbd3.service b/core/modules/dnbd3/data/etc/systemd/system/setup-dnbd3.service
new file mode 100644
index 00000000..516cbfa2
--- /dev/null
+++ b/core/modules/dnbd3/data/etc/systemd/system/setup-dnbd3.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Setup dnbd3 kernel module and user space daemon
+After=sysinit.target
+Before=shutdown.target
+DefaultDependencies=no
+
+[Service]
+ExecStart=/opt/openslx/scripts/systemd-setup_dnbd3
+ExecStop=/opt/openslx/bin/dnbd3-client --kill
+ExecStopPost=/opt/openslx/bin/rm /var/run/dnbd3.socket
+Restart=on-abort
diff --git a/core/modules/dnbd3/data/etc/systemd/system/sysinit.target.wants/setup-dnbd3.service b/core/modules/dnbd3/data/etc/systemd/system/sysinit.target.wants/setup-dnbd3.service
new file mode 120000
index 00000000..05dd4ac2
--- /dev/null
+++ b/core/modules/dnbd3/data/etc/systemd/system/sysinit.target.wants/setup-dnbd3.service
@@ -0,0 +1 @@
+../setup-dnbd3.service \ No newline at end of file
diff --git a/core/modules/dnbd3/data/etc/udev/rules.d/90-dnbd3.rules b/core/modules/dnbd3/data/etc/udev/rules.d/90-dnbd3.rules
new file mode 100644
index 00000000..0eb1f52d
--- /dev/null
+++ b/core/modules/dnbd3/data/etc/udev/rules.d/90-dnbd3.rules
@@ -0,0 +1 @@
+KERNEL=="dnbd*", SUBSYSTEM=="block", MODE="0664"
diff --git a/core/modules/dnbd3/data/opt/openslx/scripts/pam_script_auth.d/10-fuse b/core/modules/dnbd3/data/opt/openslx/scripts/pam_script_auth.d/10-fuse
new file mode 100644
index 00000000..85d8a75a
--- /dev/null
+++ b/core/modules/dnbd3/data/opt/openslx/scripts/pam_script_auth.d/10-fuse
@@ -0,0 +1,6 @@
+
+adduser "${PAM_USER}" "fuse"
+ret=$?
+[ "$ret" -ne "0" ] && slxlog "pam-auth-fuse" "Could not add $PAM_USER to group 'fuse'"
+true
+
diff --git a/core/modules/dnbd3/data/opt/openslx/scripts/systemd-setup_dnbd3 b/core/modules/dnbd3/data/opt/openslx/scripts/systemd-setup_dnbd3
new file mode 100755
index 00000000..e519b1b8
--- /dev/null
+++ b/core/modules/dnbd3/data/opt/openslx/scripts/systemd-setup_dnbd3
@@ -0,0 +1,16 @@
+#!/bin/ash
+
+if ! insmod /lib/modules/dnbd3/dnbd3.ko; then
+ slxlog "dnbd3-kernel" "Error loading dnbd3 client kernel module"
+ exit 1
+fi
+
+[ -e "/dev/dnbd0" ] || exit 1
+for i in /dev/dnbd*; do
+ echo 8192 > "/sys/block/dnbd${i#/dev/dnbd}/queue/nr_requests"
+done
+
+exec /opt/openslx/bin/dnbd3-client --daemon
+slxlog "dnbd3-daemon" "Error launching dnbd3-client daemon"
+exit 1
+
diff --git a/core/modules/dnbd3/module.build b/core/modules/dnbd3/module.build
new file mode 100644
index 00000000..e7c91f45
--- /dev/null
+++ b/core/modules/dnbd3/module.build
@@ -0,0 +1,45 @@
+fetch_source() {
+ mkdir -p "src/kmod"
+ if [ ! -d "src/dnbd3" ]; then
+ git clone "$REQUIRED_GIT" "src/dnbd3" || perror "Could not clone dnbd3 git repo"
+ fi
+ cd src/dnbd3
+ #git checkout "$REQUIRED_BRANCH" || perror "Could not checkout requested branch $REQUIRED_BRANCH"
+ git checkout "$REQUIRED_COMMIT" || perror "Could not checkout requested commit $REQUIRED_COMMIT"
+ cd -
+ cp src/dnbd3/Kbuild.in src/dnbd3/src/*.{c,h} src/dnbd3/src/kernel/*.{c,h} src/kmod/ || perror "Could not copy kernel module source files"
+ cat > "src/kmod/Makefile" <<HEREEND
+include \$(PWD)/Kbuild.in
+
+ifndef KDIR
+ KDIR = /lib/modules/\$(shell uname -r)/build
+endif
+
+all:
+ make -C "\$(KDIR)" "M=\$(PWD)" modules
+
+clean:
+ make -C "\$(KDIR)" "M=\$(PWD)" clean
+HEREEND
+}
+
+build() {
+ cd "$MODULE_WORK_DIR/src/kmod" || perror "Could not CD to standalone dnbd3 kmod dir"
+ make MODULE_NAME=dnbd3 KDIR="$KERNEL_HEADERS_DIR" || perror "Could not compile kernel module"
+ mkdir -p "$MODULE_BUILD_DIR/lib/modules/dnbd3" || perror "Could not create lib/modules/dnbd3"
+ mkdir -p "$MODULE_BUILD_DIR/opt/openslx/bin" || perror "Coould not create opt/openslx/bin"
+ cp "$MODULE_WORK_DIR/src/kmod/dnbd3.ko" "$MODULE_BUILD_DIR/lib/modules/dnbd3/" || perror "could not cp dnbd3.ko"
+ cd "$MODULE_BUILD_DIR/opt/openslx/bin" || perror "Could not cd to build dir for client binary"
+ cmake "$MODULE_WORK_DIR/src/dnbd3" || perror "Could not cmake"
+ make dnbd3-client || perror "Could not make dnbd3-client"
+ make dnbd3-fuse || perror "Could not make dnbd3-fuse"
+ chown root:root "dnbd3-client" "dnbd3-fuse"
+ chmod +xs "dnbd3-client"
+ chmod +x "dnbd3-fuse"
+ cd "$MODULE_WORK_DIR"
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/dnbd3/module.conf b/core/modules/dnbd3/module.conf
new file mode 100644
index 00000000..29442db7
--- /dev/null
+++ b/core/modules/dnbd3/module.conf
@@ -0,0 +1,10 @@
+REQUIRED_MODULES="kernel"
+REQUIRED_GIT="git://git.openslx.org/dnbd3.git"
+REQUIRED_COMMIT="6d6455b271ac99c5862691620e1217ed7b3b78b4"
+REQUIRED_BINARIES="
+ dnbd3-client
+ dnbd3-fuse
+"
+REQUIRED_DIRECTORIES="
+ /lib/modules
+"
diff --git a/core/modules/dnbd3/module.conf.debian b/core/modules/dnbd3/module.conf.debian
new file mode 100644
index 00000000..d303245c
--- /dev/null
+++ b/core/modules/dnbd3/module.conf.debian
@@ -0,0 +1,8 @@
+REQUIRED_CONTENT_PACKAGES="
+ cmake
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ cmake
+ zlib1g-dev
+"
diff --git a/core/modules/dnbd3/module.conf.opensuse b/core/modules/dnbd3/module.conf.opensuse
new file mode 100644
index 00000000..713ad2b1
--- /dev/null
+++ b/core/modules/dnbd3/module.conf.opensuse
@@ -0,0 +1,8 @@
+REQUIRED_CONTENT_PACKAGES="
+ cmake
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ cmake
+ zlib-devel
+"
diff --git a/core/modules/dnbd3/module.conf.ubuntu b/core/modules/dnbd3/module.conf.ubuntu
new file mode 100644
index 00000000..8033437b
--- /dev/null
+++ b/core/modules/dnbd3/module.conf.ubuntu
@@ -0,0 +1,9 @@
+REQUIRED_CONTENT_PACKAGES="
+ cmake
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ cmake
+ zlib1g-dev
+ libfuse-dev
+"
diff --git a/core/modules/firefox/data/opt/openslx/scripts/firefox-session b/core/modules/firefox/data/opt/openslx/scripts/firefox-session
new file mode 100755
index 00000000..c6e49a28
--- /dev/null
+++ b/core/modules/firefox/data/opt/openslx/scripts/firefox-session
@@ -0,0 +1,6 @@
+#!/bin/ash
+
+. /opt/openslx/config
+
+openbox &
+exec /usr/bin/firefox --new-window "$SLX_BROWSER_START_URL"
diff --git a/core/modules/firefox/data/usr/share/xsessions/firefox.desktop b/core/modules/firefox/data/usr/share/xsessions/firefox.desktop
new file mode 100755
index 00000000..c639f9ae
--- /dev/null
+++ b/core/modules/firefox/data/usr/share/xsessions/firefox.desktop
@@ -0,0 +1,6 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Firefox
+Exec=/opt/openslx/scripts/firefox-session
+Icon=
+Type=Application
diff --git a/core/modules/firefox/module.build b/core/modules/firefox/module.build
new file mode 100644
index 00000000..bd2e4624
--- /dev/null
+++ b/core/modules/firefox/module.build
@@ -0,0 +1,15 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/firefox/module.conf b/core/modules/firefox/module.conf
new file mode 100644
index 00000000..0718324f
--- /dev/null
+++ b/core/modules/firefox/module.conf
@@ -0,0 +1,6 @@
+REQUIRED_BINARIES="
+ firefox
+"
+REQUIRED_DIRECTORIES="
+ /
+"
diff --git a/core/modules/firefox/module.conf.ubuntu b/core/modules/firefox/module.conf.ubuntu
new file mode 100644
index 00000000..45f7e899
--- /dev/null
+++ b/core/modules/firefox/module.conf.ubuntu
@@ -0,0 +1,2 @@
+REQUIRED_INSTALLED_PACKAGES="firefox"
+REQUIRED_CONTENT_PACKAGES="firefox"
diff --git a/core/modules/gdisk/data/inc/prepare_localhd.functions b/core/modules/gdisk/data/inc/prepare_localhd.functions
new file mode 100755
index 00000000..45075ab0
--- /dev/null
+++ b/core/modules/gdisk/data/inc/prepare_localhd.functions
@@ -0,0 +1,163 @@
+#!/bin/ash
+# Copyright (c) 2014 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Local hard disk autodetection script for OpenSLX linux stateless clients,
+# detecting special GPT partitions
+
+#############################################################################
+
+# Patition IDs
+# Prefix for all paritions is 0FC63DAF-8483-4772-8E79-9999999999
+# Suffix:
+# 44: non-persistent scratch partition
+# 45: persistent partiton
+# 46: non-persistent openslx partition for config, overlayfs and qcow images
+
+# We use special non assigned partition type for harddisk scratch
+# space, thus no normal filesystem will be incidentally deleted or
+# corrupted
+
+# Set disks to none
+ID44=
+ID45=
+ID46=
+
+# General formatter for the /tmp partition on a local harddisk
+diskfm () {
+ mopt="" # Global var!
+ local target="$1"
+ local fslist="xfs jfs ext4"
+ local fs
+ local path
+ [ $# -ge 2 ] && fslist="$2"
+ for fs in $fslist ; do
+ unset available
+ case $(cat /proc/filesystems) in
+ *${fs}*) available=yes;;
+ *) modprobe "${fs}" && available=yes;;
+ esac
+ if [ -n "${available}" ]; then
+ unset found
+ if which "mkfs.$fs" >/dev/null; then
+ found=yes
+ case "mkfs.$fs" in
+ mkfs.xfs)
+ fopt="-fq"
+ ;;
+ mkfs.jfs)
+ fopt="-q"
+ ;;
+ mkfs.ext4)
+ fopt="-Fq"
+ ;;
+ esac
+ mkfs.$fs ${fopt} "${target}"
+ fi
+ [ -n "$found" ] && break
+ fi
+ done
+}
+
+# function format_pid ()
+# Formats partition with id 44, 45, 46
+# expects id as parameter
+# usage: format_pid [44|45|46]
+format_pid () {
+ local fmtpid=$1
+ local target
+ case $fmtpid in
+ 44)
+ target=$ID44
+ ;;
+ 45)
+ target=$ID45
+ ;;
+ 46)
+ target=$ID46
+ ;;
+ esac
+ if echo $target | grep -q '/dev/disk/'
+ then
+ # check for supported filesystem and formatter
+ diskfm $target
+ else
+ echo "Could not format partition ID $fmtpid"
+ fi
+}
+
+# function mount_pid ()
+# Mounts partition with id 44, 45, 46
+# expects id and mountpoint as parameter
+# usage: mount_pid [44|45|46] $MNT
+mount_pid () {
+ local mntpid=$1
+ local target=$2
+ local source
+ if [ "x$2" = "x" ]
+ then
+ echo "No mountpoint specified dummy!"
+ else
+ case $mntpid in
+ 44)
+ source=$ID44
+ ;;
+ 45)
+ source=$ID45
+ ;;
+ 46)
+ source=$ID46
+ ;;
+ esac
+ mkdir -p $target
+ if busybox mount -t auto "$source" "$target"
+ then
+ [ "x$mntpid}" = "x44" ] && chmod a+rwxt $target
+ if echo "$target" | grep -Eq "^mnt/|^/mnt/"
+ then
+ fstabtarget=$(echo $target | sed -re "s/[/]{0,1}mnt//")
+ echo -e "$source\t$fstabtarget\tauto\tnoexec\t0 0" \
+ >>/mnt/etc/fstab
+ fi
+ else
+ echo "Could not mount partition ID $mntpid"
+ fi
+ fi
+}
+
+# Get partition types
+hdisks=$(ls /dev/disk/by-path/*-part[0-9]* \
+ | sed -re "s,(.*)-part[0-9]*,\1," \
+ | sort -u)
+
+if echo $hdisks | grep -q '/dev/disk/'
+ then
+ for hd in $(echo $hdisks)
+ do
+ upartid=$(sgdisk -p $hd 2>/dev/null | awk '$6~/FFFF/ {print $1}')
+ for upt in $(echo $upartid)
+ do
+ echo "${hd}-part${upt} $(sgdisk -i $upt $hd)" \
+ | awk '$5 ~ /0FC63DAF-8483-4772-8E79-[0]{10}4[4-6]/ \
+ {print $5 "=" $1}' \
+ | sed -re "s,0FC63DAF-8483-4772-8E79-[0]{10},ID," \
+ >> /etc/hdisks.conf
+ done
+ done
+ if [ -r /etc/hdisks.conf ]
+ then
+ . /etc/hdisks.conf
+ echo -e "Partitions found:\n$(cat /etc/hdisks.conf | cut -d'=' -f1)"
+ else
+ echo "No pratition IDs 44, 45 or 46 found"
+ fi
+
+fi
+
diff --git a/core/modules/gdisk/data/inc/setup_gpt.differentapproach b/core/modules/gdisk/data/inc/setup_gpt.differentapproach
new file mode 100755
index 00000000..25b8dda3
--- /dev/null
+++ b/core/modules/gdisk/data/inc/setup_gpt.differentapproach
@@ -0,0 +1,157 @@
+#!/bin/ash
+# Copyright (c) 2014 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Local hard disk autodetection script for OpenSLX linux stateless clients,
+# detecting special GPT partitions
+
+#############################################################################
+
+# Patition IDs
+# Prefix for all paritions is 0FC63DAF-8483-4772-8E79-9999999999
+# Suffix:
+# 44: non-persistent scratch partition
+# 45: persistent partiton
+# 46: non-persistent openslx partition for config, overlayfs and qcow images
+
+# We use special non assigned partition type for harddisk scratch
+# space, thus no normal filesystem will be incidentally deleted or
+# corrupted
+
+PREFIX=/mnt
+
+# Set disks to none
+ID44=
+ID45=
+ID46=
+
+# Mountpoints
+ID44MNT=/tmp
+ID45MNT=/opt/openslx/mnt/persistent
+ID46MNT=/opt/openslx/mnt/non-persistent
+
+# General formatter for the /tmp partition on a local harddisk
+diskfm () {
+ mopt="" # Global var!
+ local target="$1"
+ local fslist="xfs jfs ext4"
+ local fs
+ local path
+ [ $# -ge 2 ] && fslist="$2"
+ for fs in $fslist ; do
+ unset available
+ case $(cat /proc/filesystems) in
+ *${fs}*) available=yes;;
+ *) modprobe "${fs}" && available=yes;;
+ esac
+ if [ -n "${available}" ]; then
+ unset found
+ if which "mkfs.$fs" ; then
+ found=yes
+ case "mkfs.$fs" in
+ mkfs.xfs)
+ fopt="-fq"
+ ;;
+ mkfs.jfs)
+ fopt="-q"
+ ;;
+ mkfs.ext4)
+ fopt="-Fq"
+ ;;
+ esac
+ mkfs.$fs ${fopt} "${target}"
+ fi
+ [ -n "$found" ] && break
+ fi
+ done
+}
+
+# Format and mount ID44 (/tmp)
+mount_id44 () {
+ HAVE_TMP=no
+ if echo $ID44 | grep -q '/dev/disk/'
+ then
+ # check for supported filesystem and formatter
+ if diskfm $ID44; then
+ mkdir -p $PREFIX$ID44MNT
+ if mount -t auto "$ID44" "$PREFIX$ID44MNT" 2>/dev/null
+ then
+ chmod a+rwxt $PREFIX$ID44MNT
+ echo -e "$ID44\t$ID44MNT\tauto\tnoexec\t0 0" >> "/etc/fstab"
+ HAVE_TMP=yes
+ else
+ echo "Could not mount partition $ID44"
+ fi
+ else
+ echo "Could not format partition $ID44"
+ fi
+ fi
+}
+
+# Mount persistent partition 45
+mount_id45 () {
+ HAVE_PERSISTENT=no
+ if echo $ID45 | grep -q '/dev/disk/'
+ then
+ mkdir -p $PREFIX$ID45MNT
+ if mount -t auto "$ID45" "$PREFIX$ID45MNT" 2>/dev/null
+ then
+ echo -e "$ID45\t$ID45MNT\tauto\tnoauto\t0 0" >> "/etc/fstab"
+ HAVE_PERSISTENT=yes
+ else
+ echo "Could not mount persistent partition $ID45"
+ fi
+ fi
+}
+
+# Mount non-persistent partition 46
+mount_id46 () {
+ HAVE_NONPERSISTENT=no
+ if echo $ID46 | grep -q '/dev/disk/'
+ then
+ # check for supported filesystem and formatter
+ if diskfm $ID46; then
+ mkdir -p $PREFIX$ID46MNT
+ if mount -t auto -o noexec "$ID46" "$PREFIX$ID46MNT" 2>/dev/null
+ then
+ echo -e "$ID46\t$ID46MNT\tauto\tnoauto,noexec\t0 0" >> "/etc/fstab"
+ HAVE_NONPERSISTENT=yes
+ else
+ echo "Could not mount non-persistent partition $ID46"
+ fi
+ else
+ echo "Could not format partition $ID44"
+ fi
+ fi
+}
+
+# Get partition types
+hdisks=$(ls /dev/disk/by-path/*-part[0-9]* \
+ | sed -re "s,(.*)-part[0-9]*,\1," \
+ | sort -u)
+
+if echo $hdisks | grep -q '/dev/disk/'
+ then
+ for hd in $(echo $hdisks)
+ do
+ upartid=$(sgdisk -p $hd 2>/dev/null | awk '$6~/FFFF/ {print $1}')
+ for upt in $(echo $upartid)
+ do
+ echo "${hd}-part${upt} $(sgdisk -i $upt $hd)" \
+ | awk '$5 ~ /0FC63DAF-8483-4772-8E79-[0]{10}4[4-6]/ \
+ {print $5 "=" $1}' \
+ | sed -re "s,0FC63DAF-8483-4772-8E79-[0]{10},ID," \
+ >> /etc/hdisks.conf
+ done
+ done
+ [ -r /etc/hdisks.conf ] && . /etc/hdisks.conf
+
+fi
+
diff --git a/core/modules/gdisk/data/inc/setup_gpt.old b/core/modules/gdisk/data/inc/setup_gpt.old
new file mode 100755
index 00000000..a4c971e4
--- /dev/null
+++ b/core/modules/gdisk/data/inc/setup_gpt.old
@@ -0,0 +1,160 @@
+#!/bin/ash
+# Copyright (c) 2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Local hard disk autodetection script for OpenSLX linux stateless clients,
+# detecting swap and special partitions
+
+#############################################################################
+
+# Mount point for persistent scratch partition (type 45)
+PERSISTENT="/opt/openslx/persistent"
+
+# General formatter for the /tmp partition on a local harddisk
+diskfm () {
+ mopt="" # Global var!
+ local target="$1"
+ local fslist="xfs jfs ext3 ext2 ext4"
+ local fs
+ local path
+ [ $# -ge 2 ] && fslist="$2"
+ for fs in $fslist ; do
+ unset available
+ case $(cat /proc/filesystems) in
+ *${fs}*) available=yes;;
+ *) modprobe "${fs}" && available=yes;;
+ esac
+ if [ -n "${available}" ]; then
+ unset found
+ if which "mkfs.$fs" ; then
+ found=yes
+ case "mkfs.$fs" in
+ mkfs.xfs)
+ fopt="-f -b size=4k -s size=4k -l size=512b" # fastest formatting possible :)
+ mopt="-o noexec"
+ ;;
+ mkfs.ext2)
+ fopt="-Fq"
+ mopt="-o nocheck,noexec"
+ ;;
+ mkfs.ext3|mkfs.ext4)
+ fopt="-Fq"
+ mopt="-o noexec"
+ ;;
+ mkfs.reiserfs)
+ fopt="-f"
+ mopt="-o noexec"
+ ;;
+ mkfs.jfs)
+ fopt="-q"
+ mopt="-o noexec"
+ ;;
+ esac
+ mkfs.$fs ${fopt} "${target}"
+ fi
+ [ -n "$found" ] && break
+ fi
+ done
+}
+
+mount_temp () {
+ local PRE=$(pwd)
+ if ! cd /tmp; then
+ mount_temp_fallback $@
+ return $?
+ fi
+ mount $@ /tmp || return 1
+ chmod a+rwxt /tmp
+ # Move stuff from working directory, which is old /tmp, to new /tmp just mounted
+ mv ./* ./.[!.]* ./..?* /tmp/ 2> /dev/null
+ local OLD=$(LANG=C ls -alh | grep -v -E ' \.\.?$' | grep -v '^total')
+ [ -n "$OLD" ] && echo -- "Leftovers:" && echo -- "$OLD"
+ cd "$PRE"
+}
+
+mount_temp_fallback () {
+ mkdir -p /tmptmp
+ mv /tmp/* /tmp/.* /tmptmp/ 2> /dev/null
+ mount $@ /tmp || return 1
+ chmod a+rwxt /tmp
+ mv /tmptmp/* /tmptmp/.* /tmp/
+ rmdir /tmptmp
+ return 0
+}
+
+fdisk -l | sed -n "/^\/dev\//p" > "/etc/disk.partition"
+
+echo "Partitions:"
+cat "/etc/disk.partition"
+
+
+# sgdisk -i 1 /dev/sda | grep -o "0FC63DAF-8483-4772-8E79-[4]\{12\}"
+
+# Check for standard swap partitions and make them available to the system
+HAVE_SWAP=no
+for hdpartnr in $(sed -n -e "/ 82 /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
+ echo -e "$hdpartnr\tswap\t\tswap\t\tdefaults\t 0 0" >> "/etc/fstab"
+ swapon "$hdpartnr" -p 10 && HAVE_SWAP=yes # low priority, in case we have zram swap, prefer that)
+done
+
+# We use special non assigned partition type (id44) for harddisk scratch
+# space, thus no normal filesystem will be incidentally deleted or
+# corrupted
+HAVE_TEMP=no
+for hdpartnr in $(sed -n -e "/ 44 /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
+ # check for supported filesystem and formatter
+ if diskfm "$hdpartnr"; then
+ # echo "$hdpartnr is mounted to /mnt/tmp at $(sysup)" >/tmp/tmpready
+ mount_temp "$mopt" "$hdpartnr" || continue
+ echo -e "${hdpartnr}\t/tmp\t\tauto\t\tnoexec\t 0 0" >> "/etc/fstab"
+ HAVE_TEMP=yes
+ break
+ else
+ echo "formatting failed for some reason"
+ fi # Made this non-forking, systemd should handle it - 2013-05-28
+done
+
+# Put detected linux partitions (83) into /etc/fstab with "noauto", special
+# partition 45 (persistent scratch) to /var/scratch and 46 to /var/openslx
+HAVE_PERSISTENT=no
+for partid in 83 45 46 ; do
+ for hdpartnr in $(sed -n -e "/ ${partid} /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
+ if [ "${partid}" -eq 83 ]; then
+ mkdir -p "/media/${hdpartnr#/dev/*}"
+ echo -e "${hdpartnr}\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto,noexec\t 0 0" >> "/etc/fstab"
+ elif [ "${partid}" -eq 45 -a "$HAVE_PERSISTENT" = "no" ]; then
+ mkdir -p "$PERSISTENT"
+ if ! mount -t auto -o noexec "${hdpartnr}" "$PERSISTENT"; then
+ diskfm "$hdpartnr" "jfs xfs ext3" || continue
+ mount -t auto -o noexec "${hdpartnr}" "$PERSISTENT" || continue
+ fi
+ HAVE_PERSISTENT=yes
+ echo -e "${hdpartnr}\t${PERSISTENT}\tauto\t\tnoauto,noexec\t\t 0 0" >> "/etc/fstab"
+ elif [ "${partid}" -eq 46 ]; then
+ mkdir -p "/media/${hdpartnr#/dev/*}"
+ echo -e "${hdpartnr}\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto\t\t 0 0" >> "/etc/fstab"
+ fi
+ done
+done
+[ "$HAVE_PERSISTENT" = "no" -a -d "$PERSISTENT" ] && rm -f "$PERSISTENT"
+
+mount -a
+
+# Make huge tmpfs if nothing could be mounted for /tmp
+if [ "$HAVE_TEMP" = "no" ]; then
+ mount_temp -t tmpfs -o size=20G none
+ slxlog "partition-temp" "Running /tmp on tmpfs only!" "/etc/disk.partition"
+fi
+if [ "$HAVE_SWAP" = "no" ]; then
+ slxlog "partition-swap" "Have no (formatted) swap partition, using zram swap only!" "/etc/disk.partition"
+fi
+
+exit 0
+
diff --git a/core/modules/gdisk/module.build b/core/modules/gdisk/module.build
new file mode 100644
index 00000000..59356ded
--- /dev/null
+++ b/core/modules/gdisk/module.build
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+
+}
+
+post_copy() {
+ copy_kernel_modules
+}
+
diff --git a/core/modules/gdisk/module.conf b/core/modules/gdisk/module.conf
new file mode 100644
index 00000000..3d2254cd
--- /dev/null
+++ b/core/modules/gdisk/module.conf
@@ -0,0 +1,94 @@
+REQUIRED_MODULES="
+ kernel
+"
+REQUIRED_BINARIES="
+ sgdisk
+ mkfs.xfs
+ mkfs.ext4
+"
+REQUIRED_KERNEL_MODULES="
+ kernel/fs/xfs/xfs.ko
+ kernel/fs/ext4/ext4.ko
+ kernel/fs/jfs/jfs.ko
+ kernel/drivers/scsi/3w-9xxx.ko
+ kernel/drivers/scsi/3w-sas.ko
+ kernel/drivers/scsi/aacraid/aacraid.ko
+ kernel/drivers/scsi/aic7xxx/aic79xx.ko
+ kernel/drivers/scsi/arcmsr/arcmsr.ko
+ kernel/drivers/scsi/bfa/bfa.ko
+ kernel/drivers/scsi/bnx2fc/bnx2fc.ko
+ kernel/drivers/scsi/csiostor/csiostor.ko
+ kernel/drivers/scsi/fcoe/fcoe.ko
+ kernel/drivers/scsi/fnic/fnic.ko
+ kernel/drivers/scsi/hpsa.ko
+ kernel/drivers/scsi/hptiop.ko
+ kernel/drivers/scsi/hv_storvsc.ko
+ kernel/drivers/scsi/initio.ko
+ kernel/drivers/scsi/isci/isci.ko
+ kernel/drivers/scsi/libiscsi.ko
+ kernel/drivers/scsi/lpfc/lpfc.ko
+ kernel/drivers/scsi/megaraid/megaraid_sas.ko
+ kernel/drivers/scsi/mpt2sas/mpt2sas.ko
+ kernel/drivers/scsi/mpt3sas/mpt3sas.ko
+ kernel/drivers/scsi/mvsas/mvsas.ko
+ kernel/drivers/scsi/mvumi.ko
+ kernel/drivers/scsi/pm8001/pm80xx.ko
+ kernel/drivers/scsi/pmcraid.ko
+ kernel/drivers/scsi/qla2xxx/qla2xxx.ko
+ kernel/drivers/scsi/qla4xxx/qla4xxx.ko
+ kernel/drivers/scsi/scsi_transport_sas.ko
+ kernel/drivers/scsi/sd_mod.ko
+ kernel/drivers/scsi/stex.ko
+ kernel/drivers/scsi/ufs/ufshcd.ko
+ kernel/drivers/scsi/virtio_scsi.ko
+ kernel/drivers/scsi/vmw_pvscsi.ko
+ kernel/drivers/ata/pata_ali.ko
+ kernel/drivers/ata/pata_it821x.ko
+ kernel/drivers/ata/pata_acpi.ko
+ kernel/drivers/ata/pata_atiixp.ko
+ kernel/drivers/ata/pata_hpt37x.ko
+ kernel/drivers/ata/pata_ninja32.ko
+ kernel/drivers/ata/ahci_platform.ko
+ kernel/drivers/ata/libahci.ko
+ kernel/drivers/ata/pata_artop.ko
+ kernel/drivers/ata/pdc_adma.ko
+ kernel/drivers/ata/pata_marvell.ko
+ kernel/drivers/ata/sata_promise.ko
+ kernel/drivers/ata/pata_oldpiix.ko
+ kernel/drivers/ata/pata_hpt366.ko
+ kernel/drivers/ata/sata_svw.ko
+ kernel/drivers/ata/pata_hpt3x3.ko
+ kernel/drivers/ata/pata_cmd64x.ko
+ kernel/drivers/ata/pata_sch.ko
+ kernel/drivers/ata/pata_sis.ko
+ kernel/drivers/ata/sata_sil.ko
+ kernel/drivers/ata/pata_it8213.ko
+ kernel/drivers/ata/pata_pdc202xx_old.ko
+ kernel/drivers/ata/pata_sil680.ko
+ kernel/drivers/ata/sata_mv.ko
+ kernel/drivers/ata/pata_rdc.ko
+ kernel/drivers/ata/pata_arasan_cf.ko
+ kernel/drivers/ata/sata_qstor.ko
+ kernel/drivers/ata/pata_atp867x.ko
+ kernel/drivers/ata/pata_piccolo.ko
+ kernel/drivers/ata/ahci.ko
+ kernel/drivers/ata/sata_sx4.ko
+ kernel/drivers/ata/libata.ko
+ kernel/drivers/ata/ata_generic.ko
+ kernel/drivers/ata/sata_sil24.ko
+ kernel/drivers/ata/sata_via.ko
+ kernel/drivers/ata/pata_netcell.ko
+ kernel/drivers/ata/pata_jmicron.ko
+ kernel/drivers/ata/sata_nv.ko
+ kernel/drivers/ata/pata_via.ko
+ kernel/drivers/ata/acard-ahci.ko
+ kernel/drivers/ata/sata_vsc.ko
+ kernel/drivers/ata/pata_hpt3x2n.ko
+ kernel/drivers/ata/sata_sis.ko
+ kernel/drivers/ata/sata_uli.ko
+ kernel/drivers/ata/pata_pdc2027x.ko
+ kernel/drivers/ata/ata_piix.ko
+ kernel/drivers/ata/pata_cs5536.ko
+ kernel/drivers/ata/pata_amd.ko
+ kernel/drivers/ata/pata_serverworks.ko
+"
diff --git a/core/modules/gdisk/module.conf.centos b/core/modules/gdisk/module.conf.centos
new file mode 100644
index 00000000..78fcd634
--- /dev/null
+++ b/core/modules/gdisk/module.conf.centos
@@ -0,0 +1,5 @@
+REQUIRED_CONTENT_PACKAGES="
+ gdisk
+ xfsprogs
+ e2fsprogs
+"
diff --git a/core/modules/german/data/etc/X11/xorg.conf.d/90-keytable.conf b/core/modules/german/data/etc/X11/xorg.conf.d/90-keytable.conf
new file mode 100644
index 00000000..9c8a58fe
--- /dev/null
+++ b/core/modules/german/data/etc/X11/xorg.conf.d/90-keytable.conf
@@ -0,0 +1,6 @@
+Section "InputClass"
+ Identifier "LocalKeyboard"
+ MatchIsKeyboard "on"
+ Option "XkbLayout" "de"
+ Option "XkbVariant" "nodeadkeys"
+EndSection
diff --git a/core/modules/german/data/etc/default/locale b/core/modules/german/data/etc/default/locale
new file mode 100644
index 00000000..b20033b4
--- /dev/null
+++ b/core/modules/german/data/etc/default/locale
@@ -0,0 +1 @@
+LANG="de_DE.UTF-8"
diff --git a/core/modules/german/data/etc/systemd/system/basic.target.wants/load-german-keymap.service b/core/modules/german/data/etc/systemd/system/basic.target.wants/load-german-keymap.service
new file mode 120000
index 00000000..88db2273
--- /dev/null
+++ b/core/modules/german/data/etc/systemd/system/basic.target.wants/load-german-keymap.service
@@ -0,0 +1 @@
+../../system/load-german-keymap.service \ No newline at end of file
diff --git a/core/modules/german/data/etc/systemd/system/load-german-keymap.service b/core/modules/german/data/etc/systemd/system/load-german-keymap.service
new file mode 100644
index 00000000..c26346fe
--- /dev/null
+++ b/core/modules/german/data/etc/systemd/system/load-german-keymap.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Setup german keyboard layout
+DefaultDependencies=no
+After=sysinit.target
+Before=shutdown.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-load_german_keymaps
diff --git a/core/modules/german/data/opt/openslx/keymaps/german_qwertz_compose_keyboard_translation.map b/core/modules/german/data/opt/openslx/keymaps/german_qwertz_compose_keyboard_translation.map
new file mode 100644
index 00000000..9d0c73d0
--- /dev/null
+++ b/core/modules/german/data/opt/openslx/keymaps/german_qwertz_compose_keyboard_translation.map
@@ -0,0 +1,967 @@
+keymaps 0-2,4-6,8-10,12
+keycode 1 = Escape Escape
+ alt keycode 1 = Meta_Escape
+ shift alt keycode 1 = Meta_Escape
+keycode 2 = one exclam
+ alt keycode 2 = Meta_one
+ shift alt keycode 2 = Meta_exclam
+keycode 3 = two quotedbl twosuperior nul
+ alt keycode 3 = Meta_two
+ shift alt keycode 3 = Meta_quotedbl
+ control alt keycode 3 = Meta_nul
+keycode 4 = three section threesuperior Escape
+ alt keycode 4 = Meta_three
+ control alt keycode 4 = Meta_Escape
+keycode 5 = four dollar
+ alt keycode 5 = Meta_four
+ shift alt keycode 5 = Meta_dollar
+keycode 6 = five percent
+ alt keycode 6 = Meta_five
+ shift alt keycode 6 = Meta_percent
+keycode 7 = six ampersand
+ control keycode 7 = Control_asciicircum
+ alt keycode 7 = Meta_six
+ shift alt keycode 7 = Meta_ampersand
+keycode 8 = seven slash braceleft
+ alt keycode 8 = Meta_seven
+ shift alt keycode 8 = Meta_slash
+ altgr alt keycode 8 = Meta_braceleft
+keycode 9 = eight parenleft bracketleft
+ alt keycode 9 = Meta_eight
+ shift alt keycode 9 = Meta_parenleft
+ altgr alt keycode 9 = Meta_bracketleft
+keycode 10 = nine parenright bracketright
+ altgr control keycode 10 = Control_bracketright
+ alt keycode 10 = Meta_nine
+ shift alt keycode 10 = Meta_parenright
+ altgr alt keycode 10 = Meta_bracketright
+keycode 11 = zero equal braceright
+ alt keycode 11 = Meta_zero
+ shift alt keycode 11 = Meta_equal
+ altgr alt keycode 11 = Meta_braceright
+keycode 12 = ssharp question backslash
+ altgr control keycode 12 = Control_backslash
+ shift alt keycode 12 = Meta_question
+ altgr alt keycode 12 = Meta_backslash
+keycode 13 = apostrophe grave
+ alt keycode 13 = 0x08b4
+ shift alt keycode 13 = Meta_grave
+keycode 14 = Delete Delete
+ alt keycode 14 = Meta_Delete
+ shift alt keycode 14 = Meta_Delete
+keycode 15 = Tab Meta_Tab
+ alt keycode 15 = Meta_Tab
+keycode 16 = +q +Q at Control_q Control_q nul Meta_q Meta_Q Meta_at Meta_Control_q
+keycode 17 = w
+keycode 18 = +e +E currency Control_e Control_e Control_e Meta_e Meta_E Meta_e Meta_Control_e
+keycode 19 = r
+keycode 20 = t
+keycode 21 = z
+keycode 22 = u
+keycode 23 = i
+keycode 24 = o
+keycode 25 = p
+keycode 26 = +udiaeresis +Udiaeresis
+keycode 27 = plus asterisk asciitilde
+ alt keycode 27 = Meta_plus
+ shift alt keycode 27 = Meta_asterisk
+keycode 28 = Return
+ alt keycode 28 = Meta_Control_m
+keycode 29 = Control
+keycode 30 = a
+keycode 31 = s
+keycode 32 = d
+keycode 33 = f
+keycode 34 = g
+keycode 35 = h
+keycode 36 = j
+keycode 37 = k
+keycode 38 = l
+keycode 39 = +odiaeresis +Odiaeresis
+keycode 40 = +adiaeresis +Adiaeresis
+keycode 41 = asciicircum degree Meta_asciicircum Control_asciicircum
+ control alt keycode 41 = Meta_Control_asciicircum
+keycode 42 = Shift
+keycode 43 = numbersign apostrophe
+ alt keycode 43 = Meta_numbersign
+ shift alt keycode 43 = Meta_apostrophe
+keycode 44 = y
+keycode 45 = x
+keycode 46 = +c +C cent Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_Control_c
+keycode 47 = v
+keycode 48 = b
+keycode 49 = n
+keycode 50 = +m +M mu Control_m Control_m Control_m Meta_m Meta_M Meta_m Meta_Control_m
+keycode 51 = comma semicolon
+ alt keycode 51 = Meta_comma
+ shift alt keycode 51 = Meta_semicolon
+keycode 52 = period colon
+ alt keycode 52 = Meta_period
+ shift alt keycode 52 = Meta_colon
+keycode 53 = minus underscore Meta_minus
+ shift control keycode 53 = Control_underscore
+ alt keycode 53 = Meta_minus
+ shift alt keycode 53 = Meta_underscore
+keycode 54 = Shift
+keycode 55 = KP_Multiply
+ altgr keycode 55 = Hex_C
+keycode 56 = Alt
+keycode 57 = space space Meta_space nul
+ alt keycode 57 = Meta_space
+ shift alt keycode 57 = Meta_space
+ control alt keycode 57 = Meta_nul
+keycode 58 = Caps_Lock
+keycode 59 = F1 F13 Console_13 F25
+ alt keycode 59 = Console_1
+ control alt keycode 59 = Console_1
+keycode 60 = F2 F14 Console_14 F26
+ alt keycode 60 = Console_2
+ control alt keycode 60 = Console_2
+keycode 61 = F3 F15 Console_15 F27
+ alt keycode 61 = Console_3
+ control alt keycode 61 = Console_3
+keycode 62 = F4 F16 Console_16 F28
+ alt keycode 62 = Console_4
+ control alt keycode 62 = Console_4
+keycode 63 = F5 F17 Console_17 F29
+ alt keycode 63 = Console_5
+ control alt keycode 63 = Console_5
+keycode 64 = F6 F18 Console_18 F30
+ alt keycode 64 = Console_6
+ control alt keycode 64 = Console_6
+keycode 65 = F7 F19 Console_19 F31
+ alt keycode 65 = Console_7
+ control alt keycode 65 = Console_7
+keycode 66 = F8 F20 Console_20 F32
+ alt keycode 66 = Console_8
+ control alt keycode 66 = Console_8
+keycode 67 = F9 F21 Console_21 F33
+ alt keycode 67 = Console_9
+ control alt keycode 67 = Console_9
+keycode 68 = F10 F22 Console_22 F34
+ alt keycode 68 = Console_10
+ control alt keycode 68 = Console_10
+keycode 69 = Num_Lock
+ altgr keycode 69 = Hex_A
+keycode 70 = Scroll_Lock Show_Memory Show_Registers Show_State
+ alt keycode 70 = Scroll_Lock
+keycode 71 = KP_7
+ altgr keycode 71 = Hex_7
+ alt keycode 71 = Ascii_7
+keycode 72 = KP_8
+ altgr keycode 72 = Hex_8
+ alt keycode 72 = Ascii_8
+keycode 73 = KP_9
+ altgr keycode 73 = Hex_9
+ alt keycode 73 = Ascii_9
+keycode 74 = KP_Subtract
+ altgr keycode 74 = Hex_D
+keycode 75 = KP_4
+ altgr keycode 75 = Hex_4
+ alt keycode 75 = Ascii_4
+keycode 76 = KP_5
+ altgr keycode 76 = Hex_5
+ alt keycode 76 = Ascii_5
+keycode 77 = KP_6
+ altgr keycode 77 = Hex_6
+ alt keycode 77 = Ascii_6
+keycode 78 = KP_Add
+ altgr keycode 78 = Hex_E
+keycode 79 = KP_1
+ altgr keycode 79 = Hex_1
+ alt keycode 79 = Ascii_1
+keycode 80 = KP_2
+ altgr keycode 80 = Hex_2
+ alt keycode 80 = Ascii_2
+keycode 81 = KP_3
+ altgr keycode 81 = Hex_3
+ alt keycode 81 = Ascii_3
+keycode 82 = KP_0
+ altgr keycode 82 = Hex_0
+ alt keycode 82 = Ascii_0
+keycode 83 = KP_Comma
+ altgr control keycode 83 = Boot
+ control alt keycode 83 = Boot
+keycode 84 = Last_Console
+keycode 85 =
+keycode 86 = less greater bar
+ alt keycode 86 = Meta_less
+ shift alt keycode 86 = Meta_greater
+ altgr alt keycode 86 = Meta_bar
+keycode 87 = F11 F23 Console_23 F35
+ alt keycode 87 = Console_11
+ control alt keycode 87 = Console_11
+keycode 88 = F12 F24 Console_24 F36
+ alt keycode 88 = Console_12
+ control alt keycode 88 = Console_12
+keycode 89 =
+keycode 90 =
+keycode 91 =
+keycode 92 =
+keycode 93 =
+keycode 94 =
+keycode 95 =
+keycode 96 = KP_Enter
+ altgr keycode 96 = Hex_F
+keycode 97 = Control
+keycode 98 = KP_Divide
+ altgr keycode 98 = Hex_B
+keycode 99 = Compose
+ control keycode 99 = Control_backslash
+ alt keycode 99 = Control_backslash
+ control alt keycode 99 = Meta_Control_backslash
+keycode 100 = AltGr
+ alt keycode 100 = Compose
+keycode 101 = Break
+keycode 102 = Find
+keycode 103 = Up
+ alt keycode 103 = KeyboardSignal
+keycode 104 = Prior
+ shift keycode 104 = Scroll_Backward
+keycode 105 = Left
+ alt keycode 105 = Decr_Console
+keycode 106 = Right
+ alt keycode 106 = Incr_Console
+keycode 107 = Select
+keycode 108 = Down
+keycode 109 = Next
+ shift keycode 109 = Scroll_Forward
+keycode 110 = Insert
+keycode 111 = Remove
+ altgr control keycode 111 = Boot
+ control alt keycode 111 = Boot
+keycode 112 = Macro
+ altgr control keycode 112 = VoidSymbol
+ shift alt keycode 112 = VoidSymbol
+ altgr alt keycode 112 = VoidSymbol
+keycode 113 = F13
+ altgr control keycode 113 = VoidSymbol
+ shift alt keycode 113 = VoidSymbol
+ altgr alt keycode 113 = VoidSymbol
+keycode 114 = F14
+ altgr control keycode 114 = VoidSymbol
+ shift alt keycode 114 = VoidSymbol
+ altgr alt keycode 114 = VoidSymbol
+keycode 115 = Help
+ altgr control keycode 115 = VoidSymbol
+ shift alt keycode 115 = VoidSymbol
+ altgr alt keycode 115 = VoidSymbol
+keycode 116 = Do
+ altgr control keycode 116 = VoidSymbol
+ shift alt keycode 116 = VoidSymbol
+ altgr alt keycode 116 = VoidSymbol
+keycode 117 = F17
+ altgr control keycode 117 = VoidSymbol
+ shift alt keycode 117 = VoidSymbol
+ altgr alt keycode 117 = VoidSymbol
+keycode 118 = KP_MinPlus
+ altgr control keycode 118 = VoidSymbol
+ shift alt keycode 118 = VoidSymbol
+ altgr alt keycode 118 = VoidSymbol
+keycode 119 = Pause
+keycode 120 =
+keycode 121 =
+keycode 122 =
+keycode 123 =
+keycode 124 =
+keycode 125 =
+keycode 126 =
+keycode 127 =
+keycode 128 = nul
+ altgr control keycode 128 = VoidSymbol
+ shift alt keycode 128 = VoidSymbol
+ altgr alt keycode 128 = VoidSymbol
+keycode 129 = nul
+ altgr control keycode 129 = VoidSymbol
+ shift alt keycode 129 = VoidSymbol
+ altgr alt keycode 129 = VoidSymbol
+keycode 130 = nul
+ altgr control keycode 130 = VoidSymbol
+ shift alt keycode 130 = VoidSymbol
+ altgr alt keycode 130 = VoidSymbol
+keycode 131 = nul
+ altgr control keycode 131 = VoidSymbol
+ shift alt keycode 131 = VoidSymbol
+ altgr alt keycode 131 = VoidSymbol
+keycode 132 = nul
+ altgr control keycode 132 = VoidSymbol
+ shift alt keycode 132 = VoidSymbol
+ altgr alt keycode 132 = VoidSymbol
+keycode 133 = nul
+ altgr control keycode 133 = VoidSymbol
+ shift alt keycode 133 = VoidSymbol
+ altgr alt keycode 133 = VoidSymbol
+keycode 134 = nul
+ altgr control keycode 134 = VoidSymbol
+ shift alt keycode 134 = VoidSymbol
+ altgr alt keycode 134 = VoidSymbol
+keycode 135 = nul
+ altgr control keycode 135 = VoidSymbol
+ shift alt keycode 135 = VoidSymbol
+ altgr alt keycode 135 = VoidSymbol
+keycode 136 = nul
+ altgr control keycode 136 = VoidSymbol
+ shift alt keycode 136 = VoidSymbol
+ altgr alt keycode 136 = VoidSymbol
+keycode 137 = nul
+ altgr control keycode 137 = VoidSymbol
+ shift alt keycode 137 = VoidSymbol
+ altgr alt keycode 137 = VoidSymbol
+keycode 138 = nul
+ altgr control keycode 138 = VoidSymbol
+ shift alt keycode 138 = VoidSymbol
+ altgr alt keycode 138 = VoidSymbol
+keycode 139 = nul
+ altgr control keycode 139 = VoidSymbol
+ shift alt keycode 139 = VoidSymbol
+ altgr alt keycode 139 = VoidSymbol
+keycode 140 = nul
+ altgr control keycode 140 = VoidSymbol
+ shift alt keycode 140 = VoidSymbol
+ altgr alt keycode 140 = VoidSymbol
+keycode 141 = nul
+ altgr control keycode 141 = VoidSymbol
+ shift alt keycode 141 = VoidSymbol
+ altgr alt keycode 141 = VoidSymbol
+keycode 142 = nul
+ altgr control keycode 142 = VoidSymbol
+ shift alt keycode 142 = VoidSymbol
+ altgr alt keycode 142 = VoidSymbol
+keycode 143 = nul
+ altgr control keycode 143 = VoidSymbol
+ shift alt keycode 143 = VoidSymbol
+ altgr alt keycode 143 = VoidSymbol
+keycode 144 = nul
+ altgr control keycode 144 = VoidSymbol
+ shift alt keycode 144 = VoidSymbol
+ altgr alt keycode 144 = VoidSymbol
+keycode 145 = nul
+ altgr control keycode 145 = VoidSymbol
+ shift alt keycode 145 = VoidSymbol
+ altgr alt keycode 145 = VoidSymbol
+keycode 146 = nul
+ altgr control keycode 146 = VoidSymbol
+ shift alt keycode 146 = VoidSymbol
+ altgr alt keycode 146 = VoidSymbol
+keycode 147 = nul
+ altgr control keycode 147 = VoidSymbol
+ shift alt keycode 147 = VoidSymbol
+ altgr alt keycode 147 = VoidSymbol
+keycode 148 = nul
+ altgr control keycode 148 = VoidSymbol
+ shift alt keycode 148 = VoidSymbol
+ altgr alt keycode 148 = VoidSymbol
+keycode 149 = nul
+ altgr control keycode 149 = VoidSymbol
+ shift alt keycode 149 = VoidSymbol
+ altgr alt keycode 149 = VoidSymbol
+keycode 150 = nul
+ altgr control keycode 150 = VoidSymbol
+ shift alt keycode 150 = VoidSymbol
+ altgr alt keycode 150 = VoidSymbol
+keycode 151 = nul
+ altgr control keycode 151 = VoidSymbol
+ shift alt keycode 151 = VoidSymbol
+ altgr alt keycode 151 = VoidSymbol
+keycode 152 = nul
+ altgr control keycode 152 = VoidSymbol
+ shift alt keycode 152 = VoidSymbol
+ altgr alt keycode 152 = VoidSymbol
+keycode 153 = nul
+ altgr control keycode 153 = VoidSymbol
+ shift alt keycode 153 = VoidSymbol
+ altgr alt keycode 153 = VoidSymbol
+keycode 154 = nul
+ altgr control keycode 154 = VoidSymbol
+ shift alt keycode 154 = VoidSymbol
+ altgr alt keycode 154 = VoidSymbol
+keycode 155 = nul
+ altgr control keycode 155 = VoidSymbol
+ shift alt keycode 155 = VoidSymbol
+ altgr alt keycode 155 = VoidSymbol
+keycode 156 = nul
+ altgr control keycode 156 = VoidSymbol
+ shift alt keycode 156 = VoidSymbol
+ altgr alt keycode 156 = VoidSymbol
+keycode 157 = nul
+ altgr control keycode 157 = VoidSymbol
+ shift alt keycode 157 = VoidSymbol
+ altgr alt keycode 157 = VoidSymbol
+keycode 158 = nul
+ altgr control keycode 158 = VoidSymbol
+ shift alt keycode 158 = VoidSymbol
+ altgr alt keycode 158 = VoidSymbol
+keycode 159 = nul
+ altgr control keycode 159 = VoidSymbol
+ shift alt keycode 159 = VoidSymbol
+ altgr alt keycode 159 = VoidSymbol
+keycode 160 = nul
+ altgr control keycode 160 = VoidSymbol
+ shift alt keycode 160 = VoidSymbol
+ altgr alt keycode 160 = VoidSymbol
+keycode 161 = nul
+ altgr control keycode 161 = VoidSymbol
+ shift alt keycode 161 = VoidSymbol
+ altgr alt keycode 161 = VoidSymbol
+keycode 162 = nul
+ altgr control keycode 162 = VoidSymbol
+ shift alt keycode 162 = VoidSymbol
+ altgr alt keycode 162 = VoidSymbol
+keycode 163 = nul
+ altgr control keycode 163 = VoidSymbol
+ shift alt keycode 163 = VoidSymbol
+ altgr alt keycode 163 = VoidSymbol
+keycode 164 = nul
+ altgr control keycode 164 = VoidSymbol
+ shift alt keycode 164 = VoidSymbol
+ altgr alt keycode 164 = VoidSymbol
+keycode 165 = nul
+ altgr control keycode 165 = VoidSymbol
+ shift alt keycode 165 = VoidSymbol
+ altgr alt keycode 165 = VoidSymbol
+keycode 166 = nul
+ altgr control keycode 166 = VoidSymbol
+ shift alt keycode 166 = VoidSymbol
+ altgr alt keycode 166 = VoidSymbol
+keycode 167 = nul
+ altgr control keycode 167 = VoidSymbol
+ shift alt keycode 167 = VoidSymbol
+ altgr alt keycode 167 = VoidSymbol
+keycode 168 = nul
+ altgr control keycode 168 = VoidSymbol
+ shift alt keycode 168 = VoidSymbol
+ altgr alt keycode 168 = VoidSymbol
+keycode 169 = nul
+ altgr control keycode 169 = VoidSymbol
+ shift alt keycode 169 = VoidSymbol
+ altgr alt keycode 169 = VoidSymbol
+keycode 170 = nul
+ altgr control keycode 170 = VoidSymbol
+ shift alt keycode 170 = VoidSymbol
+ altgr alt keycode 170 = VoidSymbol
+keycode 171 = nul
+ altgr control keycode 171 = VoidSymbol
+ shift alt keycode 171 = VoidSymbol
+ altgr alt keycode 171 = VoidSymbol
+keycode 172 = nul
+ altgr control keycode 172 = VoidSymbol
+ shift alt keycode 172 = VoidSymbol
+ altgr alt keycode 172 = VoidSymbol
+keycode 173 = nul
+ altgr control keycode 173 = VoidSymbol
+ shift alt keycode 173 = VoidSymbol
+ altgr alt keycode 173 = VoidSymbol
+keycode 174 = nul
+ altgr control keycode 174 = VoidSymbol
+ shift alt keycode 174 = VoidSymbol
+ altgr alt keycode 174 = VoidSymbol
+keycode 175 = nul
+ altgr control keycode 175 = VoidSymbol
+ shift alt keycode 175 = VoidSymbol
+ altgr alt keycode 175 = VoidSymbol
+keycode 176 = nul
+ altgr control keycode 176 = VoidSymbol
+ shift alt keycode 176 = VoidSymbol
+ altgr alt keycode 176 = VoidSymbol
+keycode 177 = nul
+ altgr control keycode 177 = VoidSymbol
+ shift alt keycode 177 = VoidSymbol
+ altgr alt keycode 177 = VoidSymbol
+keycode 178 = nul
+ altgr control keycode 178 = VoidSymbol
+ shift alt keycode 178 = VoidSymbol
+ altgr alt keycode 178 = VoidSymbol
+keycode 179 = nul
+ altgr control keycode 179 = VoidSymbol
+ shift alt keycode 179 = VoidSymbol
+ altgr alt keycode 179 = VoidSymbol
+keycode 180 = nul
+ altgr control keycode 180 = VoidSymbol
+ shift alt keycode 180 = VoidSymbol
+ altgr alt keycode 180 = VoidSymbol
+keycode 181 = nul
+ altgr control keycode 181 = VoidSymbol
+ shift alt keycode 181 = VoidSymbol
+ altgr alt keycode 181 = VoidSymbol
+keycode 182 = nul
+ altgr control keycode 182 = VoidSymbol
+ shift alt keycode 182 = VoidSymbol
+ altgr alt keycode 182 = VoidSymbol
+keycode 183 = nul
+ altgr control keycode 183 = VoidSymbol
+ shift alt keycode 183 = VoidSymbol
+ altgr alt keycode 183 = VoidSymbol
+keycode 184 = nul
+ altgr control keycode 184 = VoidSymbol
+ shift alt keycode 184 = VoidSymbol
+ altgr alt keycode 184 = VoidSymbol
+keycode 185 = nul
+ altgr control keycode 185 = VoidSymbol
+ shift alt keycode 185 = VoidSymbol
+ altgr alt keycode 185 = VoidSymbol
+keycode 186 = nul
+ altgr control keycode 186 = VoidSymbol
+ shift alt keycode 186 = VoidSymbol
+ altgr alt keycode 186 = VoidSymbol
+keycode 187 = nul
+ altgr control keycode 187 = VoidSymbol
+ shift alt keycode 187 = VoidSymbol
+ altgr alt keycode 187 = VoidSymbol
+keycode 188 = nul
+ altgr control keycode 188 = VoidSymbol
+ shift alt keycode 188 = VoidSymbol
+ altgr alt keycode 188 = VoidSymbol
+keycode 189 = nul
+ altgr control keycode 189 = VoidSymbol
+ shift alt keycode 189 = VoidSymbol
+ altgr alt keycode 189 = VoidSymbol
+keycode 190 = nul
+ altgr control keycode 190 = VoidSymbol
+ shift alt keycode 190 = VoidSymbol
+ altgr alt keycode 190 = VoidSymbol
+keycode 191 = nul
+ altgr control keycode 191 = VoidSymbol
+ shift alt keycode 191 = VoidSymbol
+ altgr alt keycode 191 = VoidSymbol
+keycode 192 = nul
+ altgr control keycode 192 = VoidSymbol
+ shift alt keycode 192 = VoidSymbol
+ altgr alt keycode 192 = VoidSymbol
+keycode 193 = nul
+ altgr control keycode 193 = VoidSymbol
+ shift alt keycode 193 = VoidSymbol
+ altgr alt keycode 193 = VoidSymbol
+keycode 194 = nul
+ altgr control keycode 194 = VoidSymbol
+ shift alt keycode 194 = VoidSymbol
+ altgr alt keycode 194 = VoidSymbol
+keycode 195 = nul
+ altgr control keycode 195 = VoidSymbol
+ shift alt keycode 195 = VoidSymbol
+ altgr alt keycode 195 = VoidSymbol
+keycode 196 = nul
+ altgr control keycode 196 = VoidSymbol
+ shift alt keycode 196 = VoidSymbol
+ altgr alt keycode 196 = VoidSymbol
+keycode 197 = nul
+ altgr control keycode 197 = VoidSymbol
+ shift alt keycode 197 = VoidSymbol
+ altgr alt keycode 197 = VoidSymbol
+keycode 198 = nul
+ altgr control keycode 198 = VoidSymbol
+ shift alt keycode 198 = VoidSymbol
+ altgr alt keycode 198 = VoidSymbol
+keycode 199 = nul
+ altgr control keycode 199 = VoidSymbol
+ shift alt keycode 199 = VoidSymbol
+ altgr alt keycode 199 = VoidSymbol
+keycode 200 = nul
+ altgr control keycode 200 = VoidSymbol
+ shift alt keycode 200 = VoidSymbol
+ altgr alt keycode 200 = VoidSymbol
+keycode 201 = nul
+ altgr control keycode 201 = VoidSymbol
+ shift alt keycode 201 = VoidSymbol
+ altgr alt keycode 201 = VoidSymbol
+keycode 202 = nul
+ altgr control keycode 202 = VoidSymbol
+ shift alt keycode 202 = VoidSymbol
+ altgr alt keycode 202 = VoidSymbol
+keycode 203 = nul
+ altgr control keycode 203 = VoidSymbol
+ shift alt keycode 203 = VoidSymbol
+ altgr alt keycode 203 = VoidSymbol
+keycode 204 = nul
+ altgr control keycode 204 = VoidSymbol
+ shift alt keycode 204 = VoidSymbol
+ altgr alt keycode 204 = VoidSymbol
+keycode 205 = nul
+ altgr control keycode 205 = VoidSymbol
+ shift alt keycode 205 = VoidSymbol
+ altgr alt keycode 205 = VoidSymbol
+keycode 206 = nul
+ altgr control keycode 206 = VoidSymbol
+ shift alt keycode 206 = VoidSymbol
+ altgr alt keycode 206 = VoidSymbol
+keycode 207 = nul
+ altgr control keycode 207 = VoidSymbol
+ shift alt keycode 207 = VoidSymbol
+ altgr alt keycode 207 = VoidSymbol
+keycode 208 = nul
+ altgr control keycode 208 = VoidSymbol
+ shift alt keycode 208 = VoidSymbol
+ altgr alt keycode 208 = VoidSymbol
+keycode 209 = nul
+ altgr control keycode 209 = VoidSymbol
+ shift alt keycode 209 = VoidSymbol
+ altgr alt keycode 209 = VoidSymbol
+keycode 210 = nul
+ altgr control keycode 210 = VoidSymbol
+ shift alt keycode 210 = VoidSymbol
+ altgr alt keycode 210 = VoidSymbol
+keycode 211 = nul
+ altgr control keycode 211 = VoidSymbol
+ shift alt keycode 211 = VoidSymbol
+ altgr alt keycode 211 = VoidSymbol
+keycode 212 = nul
+ altgr control keycode 212 = VoidSymbol
+ shift alt keycode 212 = VoidSymbol
+ altgr alt keycode 212 = VoidSymbol
+keycode 213 = nul
+ altgr control keycode 213 = VoidSymbol
+ shift alt keycode 213 = VoidSymbol
+ altgr alt keycode 213 = VoidSymbol
+keycode 214 = nul
+ altgr control keycode 214 = VoidSymbol
+ shift alt keycode 214 = VoidSymbol
+ altgr alt keycode 214 = VoidSymbol
+keycode 215 = nul
+ altgr control keycode 215 = VoidSymbol
+ shift alt keycode 215 = VoidSymbol
+ altgr alt keycode 215 = VoidSymbol
+keycode 216 = nul
+ altgr control keycode 216 = VoidSymbol
+ shift alt keycode 216 = VoidSymbol
+ altgr alt keycode 216 = VoidSymbol
+keycode 217 = nul
+ altgr control keycode 217 = VoidSymbol
+ shift alt keycode 217 = VoidSymbol
+ altgr alt keycode 217 = VoidSymbol
+keycode 218 = nul
+ altgr control keycode 218 = VoidSymbol
+ shift alt keycode 218 = VoidSymbol
+ altgr alt keycode 218 = VoidSymbol
+keycode 219 = nul
+ altgr control keycode 219 = VoidSymbol
+ shift alt keycode 219 = VoidSymbol
+ altgr alt keycode 219 = VoidSymbol
+keycode 220 = nul
+ altgr control keycode 220 = VoidSymbol
+ shift alt keycode 220 = VoidSymbol
+ altgr alt keycode 220 = VoidSymbol
+keycode 221 = nul
+ altgr control keycode 221 = VoidSymbol
+ shift alt keycode 221 = VoidSymbol
+ altgr alt keycode 221 = VoidSymbol
+keycode 222 = nul
+ altgr control keycode 222 = VoidSymbol
+ shift alt keycode 222 = VoidSymbol
+ altgr alt keycode 222 = VoidSymbol
+keycode 223 = nul
+ altgr control keycode 223 = VoidSymbol
+ shift alt keycode 223 = VoidSymbol
+ altgr alt keycode 223 = VoidSymbol
+keycode 224 = nul
+ altgr control keycode 224 = VoidSymbol
+ shift alt keycode 224 = VoidSymbol
+ altgr alt keycode 224 = VoidSymbol
+keycode 225 = nul
+ altgr control keycode 225 = VoidSymbol
+ shift alt keycode 225 = VoidSymbol
+ altgr alt keycode 225 = VoidSymbol
+keycode 226 = nul
+ altgr control keycode 226 = VoidSymbol
+ shift alt keycode 226 = VoidSymbol
+ altgr alt keycode 226 = VoidSymbol
+keycode 227 = nul
+ altgr control keycode 227 = VoidSymbol
+ shift alt keycode 227 = VoidSymbol
+ altgr alt keycode 227 = VoidSymbol
+keycode 228 = nul
+ altgr control keycode 228 = VoidSymbol
+ shift alt keycode 228 = VoidSymbol
+ altgr alt keycode 228 = VoidSymbol
+keycode 229 = nul
+ altgr control keycode 229 = VoidSymbol
+ shift alt keycode 229 = VoidSymbol
+ altgr alt keycode 229 = VoidSymbol
+keycode 230 = nul
+ altgr control keycode 230 = VoidSymbol
+ shift alt keycode 230 = VoidSymbol
+ altgr alt keycode 230 = VoidSymbol
+keycode 231 = nul
+ altgr control keycode 231 = VoidSymbol
+ shift alt keycode 231 = VoidSymbol
+ altgr alt keycode 231 = VoidSymbol
+keycode 232 = nul
+ altgr control keycode 232 = VoidSymbol
+ shift alt keycode 232 = VoidSymbol
+ altgr alt keycode 232 = VoidSymbol
+keycode 233 = nul
+ altgr control keycode 233 = VoidSymbol
+ shift alt keycode 233 = VoidSymbol
+ altgr alt keycode 233 = VoidSymbol
+keycode 234 = nul
+ altgr control keycode 234 = VoidSymbol
+ shift alt keycode 234 = VoidSymbol
+ altgr alt keycode 234 = VoidSymbol
+keycode 235 = nul
+ altgr control keycode 235 = VoidSymbol
+ shift alt keycode 235 = VoidSymbol
+ altgr alt keycode 235 = VoidSymbol
+keycode 236 = nul
+ altgr control keycode 236 = VoidSymbol
+ shift alt keycode 236 = VoidSymbol
+ altgr alt keycode 236 = VoidSymbol
+keycode 237 = nul
+ altgr control keycode 237 = VoidSymbol
+ shift alt keycode 237 = VoidSymbol
+ altgr alt keycode 237 = VoidSymbol
+keycode 238 = nul
+ altgr control keycode 238 = VoidSymbol
+ shift alt keycode 238 = VoidSymbol
+ altgr alt keycode 238 = VoidSymbol
+keycode 239 = nul
+ altgr control keycode 239 = VoidSymbol
+ shift alt keycode 239 = VoidSymbol
+ altgr alt keycode 239 = VoidSymbol
+keycode 240 = nul
+ altgr control keycode 240 = VoidSymbol
+ shift alt keycode 240 = VoidSymbol
+ altgr alt keycode 240 = VoidSymbol
+keycode 241 = nul
+ altgr control keycode 241 = VoidSymbol
+ shift alt keycode 241 = VoidSymbol
+ altgr alt keycode 241 = VoidSymbol
+keycode 242 = nul
+ altgr control keycode 242 = VoidSymbol
+ shift alt keycode 242 = VoidSymbol
+ altgr alt keycode 242 = VoidSymbol
+keycode 243 = nul
+ altgr control keycode 243 = VoidSymbol
+ shift alt keycode 243 = VoidSymbol
+ altgr alt keycode 243 = VoidSymbol
+keycode 244 = nul
+ altgr control keycode 244 = VoidSymbol
+ shift alt keycode 244 = VoidSymbol
+ altgr alt keycode 244 = VoidSymbol
+keycode 245 = nul
+ altgr control keycode 245 = VoidSymbol
+ shift alt keycode 245 = VoidSymbol
+ altgr alt keycode 245 = VoidSymbol
+keycode 246 = nul
+ altgr control keycode 246 = VoidSymbol
+ shift alt keycode 246 = VoidSymbol
+ altgr alt keycode 246 = VoidSymbol
+keycode 247 = nul
+ altgr control keycode 247 = VoidSymbol
+ shift alt keycode 247 = VoidSymbol
+ altgr alt keycode 247 = VoidSymbol
+keycode 248 = nul
+ altgr control keycode 248 = VoidSymbol
+ shift alt keycode 248 = VoidSymbol
+ altgr alt keycode 248 = VoidSymbol
+keycode 249 = nul
+ altgr control keycode 249 = VoidSymbol
+ shift alt keycode 249 = VoidSymbol
+ altgr alt keycode 249 = VoidSymbol
+keycode 250 = nul
+ altgr control keycode 250 = VoidSymbol
+ shift alt keycode 250 = VoidSymbol
+ altgr alt keycode 250 = VoidSymbol
+keycode 251 = nul
+ altgr control keycode 251 = VoidSymbol
+ shift alt keycode 251 = VoidSymbol
+ altgr alt keycode 251 = VoidSymbol
+keycode 252 = nul
+ altgr control keycode 252 = VoidSymbol
+ shift alt keycode 252 = VoidSymbol
+ altgr alt keycode 252 = VoidSymbol
+keycode 253 = nul
+ altgr control keycode 253 = VoidSymbol
+ shift alt keycode 253 = VoidSymbol
+ altgr alt keycode 253 = VoidSymbol
+keycode 254 = nul
+ altgr control keycode 254 = VoidSymbol
+ shift alt keycode 254 = VoidSymbol
+ altgr alt keycode 254 = VoidSymbol
+keycode 255 = nul
+ altgr control keycode 255 = VoidSymbol
+ shift alt keycode 255 = VoidSymbol
+ altgr alt keycode 255 = VoidSymbol
+string F1 = "\033[[A"
+string F2 = "\033[[B"
+string F3 = "\033[[C"
+string F4 = "\033[[D"
+string F5 = "\033[[E"
+string F6 = "\033[17~"
+string F7 = "\033[18~"
+string F8 = "\033[19~"
+string F9 = "\033[20~"
+string F10 = "\033[21~"
+string F11 = "\033[23~"
+string F12 = "\033[24~"
+string F13 = "\033[25~"
+string F14 = "\033[26~"
+string F15 = "\033[28~"
+string F16 = "\033[29~"
+string F17 = "\033[31~"
+string F18 = "\033[32~"
+string F19 = "\033[33~"
+string F20 = "\033[34~"
+string Find = "\033[1~"
+string Insert = "\033[2~"
+string Remove = "\033[3~"
+string Select = "\033[4~"
+string Prior = "\033[5~"
+string Next = "\033[6~"
+string Macro = "\033[M"
+string Pause = "\033[P"
+compose '`' 'A' to U+00c0
+compose '`' 'a' to U+00e0
+compose '\'' 'A' to U+00c1
+compose '\'' 'a' to U+00e1
+compose '^' 'A' to U+00c2
+compose '^' 'a' to U+00e2
+compose '~' 'A' to U+00c3
+compose '~' 'a' to U+00e3
+compose '"' 'A' to U+00c4
+compose '"' 'a' to U+00e4
+compose '-' 'a' to U+00aa
+compose '-' 'A' to U+00aa
+compose 'O' 'A' to U+00c5
+compose 'o' 'a' to U+00e5
+compose '0' 'A' to U+00c5
+compose '0' 'a' to U+00e5
+compose 'A' 'A' to U+00c5
+compose 'a' 'a' to U+00e5
+compose '°' 'A' to U+00c5
+compose '°' 'a' to U+00e5
+compose 'A' 'E' to U+00c6
+compose 'a' 'e' to U+00e6
+compose ',' 'C' to U+00c7
+compose ',' 'c' to U+00e7
+compose '^' 'C' to U+00c7
+compose '^' 'c' to U+00e7
+compose '`' 'E' to U+00c8
+compose '`' 'e' to U+00e8
+compose '\'' 'E' to U+00c9
+compose '\'' 'e' to U+00e9
+compose '^' 'E' to U+00ca
+compose '^' 'e' to U+00ea
+compose '"' 'E' to U+00cb
+compose '"' 'e' to U+00eb
+compose '`' 'I' to U+00cc
+compose '`' 'i' to U+00ec
+compose '\'' 'I' to U+00cd
+compose '\'' 'i' to U+00ed
+compose '^' 'I' to U+00ce
+compose '^' 'i' to U+00ee
+compose '"' 'I' to U+00cf
+compose '"' 'i' to U+00ef
+compose '-' 'D' to U+00d0
+compose '-' 'd' to U+00f0
+compose '^' 'D' to U+00d0
+compose '^' 'd' to U+00f0
+compose '~' 'N' to U+00d1
+compose '~' 'n' to U+00f1
+compose '^' 'N' to U+00d1
+compose '^' 'n' to U+00f1
+compose '`' 'O' to U+00d2
+compose '`' 'o' to U+00f2
+compose '\'' 'O' to U+00d3
+compose '\'' 'o' to U+00f3
+compose '^' 'O' to U+00d4
+compose '^' 'o' to U+00f4
+compose '~' 'O' to U+00d5
+compose '~' 'o' to U+00f5
+compose '"' 'O' to U+00d6
+compose '"' 'o' to U+00f6
+compose '/' 'O' to U+00d8
+compose '/' 'o' to U+00f8
+compose '-' 'o' to U+00ba
+compose '-' 'O' to U+00ba
+compose '`' 'U' to U+00d9
+compose '`' 'u' to U+00f9
+compose '\'' 'U' to U+00da
+compose '\'' 'u' to U+00fa
+compose '^' 'U' to U+00db
+compose '^' 'u' to U+00fb
+compose '"' 'U' to U+00dc
+compose '"' 'u' to U+00fc
+compose '\'' 'Y' to U+00dd
+compose '\'' 'y' to U+00fd
+compose 'T' 'H' to U+00de
+compose 't' 'h' to U+00fe
+compose 's' 's' to U+00df
+compose '"' 'y' to U+00ff
+compose 's' 'z' to U+00df
+compose 'n' 'n' to U+00f1
+compose 'n' 'h' to U+00f1
+compose 'N' 'Y' to U+00d1
+compose 'N' 'N' to U+00d1
+compose 'N' 'H' to U+00d1
+compose 'N' 'y' to U+00d1
+compose 'N' 'n' to U+00d1
+compose 'N' 'h' to U+00d1
+compose '-' 'L' to U+00a3
+compose '<' '<' to U+00ab
+compose '>' '>' to U+00bb
+compose '?' '?' to U+00bf
+compose '^' '?' to U+00bf
+compose '!' '!' to U+00a1
+compose '^' '!' to U+00a1
+compose '^' '1' to U+00b9
+compose '^' '2' to U+00b2
+compose '^' '3' to U+00b3
+compose '+' '-' to U+00b1
+compose 'c' '=' to U+00a2
+compose 'c' '/' to U+00a2
+compose '/' 'c' to U+00a2
+compose '-' 'c' to U+00a2
+compose '-' 'C' to U+00a2
+compose '|' 'c' to U+00a2
+compose '|' 'C' to U+00a2
+compose 'L' '=' to U+00a3
+compose '-' 'L' to U+00a3
+compose '-' 'l' to U+00a3
+compose '^' '*' to U+00d7
+compose '^' 'x' to U+00d7
+compose 'x' 'x' to U+00d7
+compose '^' '.' to U+00b7
+compose '.' '.' to U+00b7
+compose '^' '/' to U+00f7
+compose '^' ':' to U+00f7
+compose '-' ':' to U+00f7
+compose ':' '-' to U+00f7
+compose 'Y' '=' to U+00a5
+compose '=' 'Y' to U+00a5
+compose '-' 'Y' to U+00a5
+compose '-' 'l' to U+00a5
+compose '(' 'c' to U+00a9
+compose '"' 'c' to U+00a9
+compose 'O' 'C' to U+00a9
+compose '(' 'C' to U+00a9
+compose 'C' ')' to U+00a9
+compose '-' 'a' to U+00aa
+compose '-' 'A' to U+00aa
+compose '-' 'o' to U+00ba
+compose '-' 'O' to U+00ba
+compose '(' 'r' to U+00ae
+compose '"' 'r' to U+00ae
+compose 'O' 'R' to U+00ae
+compose '(' 'R' to U+00ae
+compose 'R' ')' to U+00ae
+compose 'm' 'u' to U+00b5
+compose 'P' 'P' to U+00b6
+compose '1' '4' to U+00bc
+compose '1' '2' to U+00bd
+compose '3' '4' to U+00be
+compose 'e' '=' to U+00a4
+compose '-' 'e' to U+00a4
+compose '-' 'E' to U+00a4
+compose '=' 'E' to U+00a4
+compose 'v' 'S' to U+00a6
+compose '^' 'S' to U+00a6
+compose 'v' 's' to U+00a8
+compose '^' 's' to U+00a8
+compose 'v' 'Z' to U+00b4
+compose '^' 'Z' to U+00b4
+compose 'v' 'z' to U+00b8
+compose '^' 'z' to U+00b8
+compose 'O' 'E' to U+00bc
+compose 'O' 'e' to U+00bc
+compose 'o' 'e' to U+00bd
+compose '"' 'Y' to U+00be
+compose 'i' 'j' to U+00ff
+compose 'I' 'J' to U+00be
diff --git a/core/modules/german/data/opt/openslx/keymaps/german_qwertz_keyboard_translation.map b/core/modules/german/data/opt/openslx/keymaps/german_qwertz_keyboard_translation.map
new file mode 100644
index 00000000..d5069876
--- /dev/null
+++ b/core/modules/german/data/opt/openslx/keymaps/german_qwertz_keyboard_translation.map
@@ -0,0 +1,809 @@
+keymaps 0-2,4-6,8-10,12
+keycode 1 = Escape Escape
+ alt keycode 1 = Meta_Escape
+ shift alt keycode 1 = Meta_Escape
+keycode 2 = one exclam
+ alt keycode 2 = Meta_one
+ shift alt keycode 2 = Meta_exclam
+keycode 3 = two quotedbl twosuperior nul
+ alt keycode 3 = Meta_two
+ shift alt keycode 3 = Meta_quotedbl
+ control alt keycode 3 = Meta_nul
+keycode 4 = three section threesuperior Escape
+ alt keycode 4 = Meta_three
+ control alt keycode 4 = Meta_Escape
+keycode 5 = four dollar
+ alt keycode 5 = Meta_four
+ shift alt keycode 5 = Meta_dollar
+keycode 6 = five percent
+ alt keycode 6 = Meta_five
+ shift alt keycode 6 = Meta_percent
+keycode 7 = six ampersand
+ control keycode 7 = Control_asciicircum
+ alt keycode 7 = Meta_six
+ shift alt keycode 7 = Meta_ampersand
+keycode 8 = seven slash braceleft
+ alt keycode 8 = Meta_seven
+ shift alt keycode 8 = Meta_slash
+ altgr alt keycode 8 = Meta_braceleft
+keycode 9 = eight parenleft bracketleft
+ alt keycode 9 = Meta_eight
+ shift alt keycode 9 = Meta_parenleft
+ altgr alt keycode 9 = Meta_bracketleft
+keycode 10 = nine parenright bracketright
+ altgr control keycode 10 = Control_bracketright
+ alt keycode 10 = Meta_nine
+ shift alt keycode 10 = Meta_parenright
+ altgr alt keycode 10 = Meta_bracketright
+keycode 11 = zero equal braceright
+ alt keycode 11 = Meta_zero
+ shift alt keycode 11 = Meta_equal
+ altgr alt keycode 11 = Meta_braceright
+keycode 12 = ssharp question backslash
+ altgr control keycode 12 = Control_backslash
+ shift alt keycode 12 = Meta_question
+ altgr alt keycode 12 = Meta_backslash
+keycode 13 = apostrophe grave
+ alt keycode 13 = 0x08b4
+ shift alt keycode 13 = Meta_grave
+keycode 14 = Delete Delete
+ alt keycode 14 = Meta_Delete
+ shift alt keycode 14 = Meta_Delete
+keycode 15 = Tab Meta_Tab
+ alt keycode 15 = Meta_Tab
+keycode 16 = +q +Q at Control_q Control_q nul Meta_q Meta_Q Meta_at Meta_Control_q
+keycode 17 = w
+keycode 18 = +e +E currency Control_e Control_e Control_e Meta_e Meta_E Meta_e Meta_Control_e
+keycode 19 = r
+keycode 20 = t
+keycode 21 = z
+keycode 22 = u
+keycode 23 = i
+keycode 24 = o
+keycode 25 = p
+keycode 26 = +udiaeresis +Udiaeresis
+keycode 27 = plus asterisk asciitilde
+ alt keycode 27 = Meta_plus
+ shift alt keycode 27 = Meta_asterisk
+keycode 28 = Return
+ alt keycode 28 = Meta_Control_m
+keycode 29 = Control
+keycode 30 = a
+keycode 31 = s
+keycode 32 = d
+keycode 33 = f
+keycode 34 = g
+keycode 35 = h
+keycode 36 = j
+keycode 37 = k
+keycode 38 = l
+keycode 39 = +odiaeresis +Odiaeresis
+keycode 40 = +adiaeresis +Adiaeresis
+keycode 41 = asciicircum degree Meta_asciicircum Control_asciicircum
+ control alt keycode 41 = Meta_Control_asciicircum
+keycode 42 = Shift
+keycode 43 = numbersign apostrophe
+ alt keycode 43 = Meta_numbersign
+ shift alt keycode 43 = Meta_apostrophe
+keycode 44 = y
+keycode 45 = x
+keycode 46 = +c +C cent Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_Control_c
+keycode 47 = v
+keycode 48 = b
+keycode 49 = n
+keycode 50 = +m +M mu Control_m Control_m Control_m Meta_m Meta_M Meta_m Meta_Control_m
+keycode 51 = comma semicolon
+ alt keycode 51 = Meta_comma
+ shift alt keycode 51 = Meta_semicolon
+keycode 52 = period colon
+ alt keycode 52 = Meta_period
+ shift alt keycode 52 = Meta_colon
+keycode 53 = minus underscore Meta_minus
+ shift control keycode 53 = Control_underscore
+ alt keycode 53 = Meta_minus
+ shift alt keycode 53 = Meta_underscore
+keycode 54 = Shift
+keycode 55 = KP_Multiply
+ altgr keycode 55 = Hex_C
+keycode 56 = Alt
+keycode 57 = space space Meta_space nul
+ alt keycode 57 = Meta_space
+ shift alt keycode 57 = Meta_space
+ control alt keycode 57 = Meta_nul
+keycode 58 = Caps_Lock
+keycode 59 = F1 F13 Console_13 F25
+ alt keycode 59 = Console_1
+ control alt keycode 59 = Console_1
+keycode 60 = F2 F14 Console_14 F26
+ alt keycode 60 = Console_2
+ control alt keycode 60 = Console_2
+keycode 61 = F3 F15 Console_15 F27
+ alt keycode 61 = Console_3
+ control alt keycode 61 = Console_3
+keycode 62 = F4 F16 Console_16 F28
+ alt keycode 62 = Console_4
+ control alt keycode 62 = Console_4
+keycode 63 = F5 F17 Console_17 F29
+ alt keycode 63 = Console_5
+ control alt keycode 63 = Console_5
+keycode 64 = F6 F18 Console_18 F30
+ alt keycode 64 = Console_6
+ control alt keycode 64 = Console_6
+keycode 65 = F7 F19 Console_19 F31
+ alt keycode 65 = Console_7
+ control alt keycode 65 = Console_7
+keycode 66 = F8 F20 Console_20 F32
+ alt keycode 66 = Console_8
+ control alt keycode 66 = Console_8
+keycode 67 = F9 F21 Console_21 F33
+ alt keycode 67 = Console_9
+ control alt keycode 67 = Console_9
+keycode 68 = F10 F22 Console_22 F34
+ alt keycode 68 = Console_10
+ control alt keycode 68 = Console_10
+keycode 69 = Num_Lock
+ altgr keycode 69 = Hex_A
+keycode 70 = Scroll_Lock Show_Memory Show_Registers Show_State
+ alt keycode 70 = Scroll_Lock
+keycode 71 = KP_7
+ altgr keycode 71 = Hex_7
+ alt keycode 71 = Ascii_7
+keycode 72 = KP_8
+ altgr keycode 72 = Hex_8
+ alt keycode 72 = Ascii_8
+keycode 73 = KP_9
+ altgr keycode 73 = Hex_9
+ alt keycode 73 = Ascii_9
+keycode 74 = KP_Subtract
+ altgr keycode 74 = Hex_D
+keycode 75 = KP_4
+ altgr keycode 75 = Hex_4
+ alt keycode 75 = Ascii_4
+keycode 76 = KP_5
+ altgr keycode 76 = Hex_5
+ alt keycode 76 = Ascii_5
+keycode 77 = KP_6
+ altgr keycode 77 = Hex_6
+ alt keycode 77 = Ascii_6
+keycode 78 = KP_Add
+ altgr keycode 78 = Hex_E
+keycode 79 = KP_1
+ altgr keycode 79 = Hex_1
+ alt keycode 79 = Ascii_1
+keycode 80 = KP_2
+ altgr keycode 80 = Hex_2
+ alt keycode 80 = Ascii_2
+keycode 81 = KP_3
+ altgr keycode 81 = Hex_3
+ alt keycode 81 = Ascii_3
+keycode 82 = KP_0
+ altgr keycode 82 = Hex_0
+ alt keycode 82 = Ascii_0
+keycode 83 = KP_Comma
+ altgr control keycode 83 = Boot
+ control alt keycode 83 = Boot
+keycode 84 = Last_Console
+keycode 85 =
+keycode 86 = less greater bar
+ alt keycode 86 = Meta_less
+ shift alt keycode 86 = Meta_greater
+ altgr alt keycode 86 = Meta_bar
+keycode 87 = F11 F23 Console_23 F35
+ alt keycode 87 = Console_11
+ control alt keycode 87 = Console_11
+keycode 88 = F12 F24 Console_24 F36
+ alt keycode 88 = Console_12
+ control alt keycode 88 = Console_12
+keycode 89 =
+keycode 90 =
+keycode 91 =
+keycode 92 =
+keycode 93 =
+keycode 94 =
+keycode 95 =
+keycode 96 = KP_Enter
+ altgr keycode 96 = Hex_F
+keycode 97 = Control
+keycode 98 = KP_Divide
+ altgr keycode 98 = Hex_B
+keycode 99 = Compose
+ control keycode 99 = Control_backslash
+ alt keycode 99 = Control_backslash
+ control alt keycode 99 = Meta_Control_backslash
+keycode 100 = AltGr
+ alt keycode 100 = Compose
+keycode 101 = Break
+keycode 102 = Find
+keycode 103 = Up
+ alt keycode 103 = KeyboardSignal
+keycode 104 = Prior
+ shift keycode 104 = Scroll_Backward
+keycode 105 = Left
+ alt keycode 105 = Decr_Console
+keycode 106 = Right
+ alt keycode 106 = Incr_Console
+keycode 107 = Select
+keycode 108 = Down
+keycode 109 = Next
+ shift keycode 109 = Scroll_Forward
+keycode 110 = Insert
+keycode 111 = Remove
+ altgr control keycode 111 = Boot
+ control alt keycode 111 = Boot
+keycode 112 = Macro
+ altgr control keycode 112 = VoidSymbol
+ shift alt keycode 112 = VoidSymbol
+ altgr alt keycode 112 = VoidSymbol
+keycode 113 = F13
+ altgr control keycode 113 = VoidSymbol
+ shift alt keycode 113 = VoidSymbol
+ altgr alt keycode 113 = VoidSymbol
+keycode 114 = F14
+ altgr control keycode 114 = VoidSymbol
+ shift alt keycode 114 = VoidSymbol
+ altgr alt keycode 114 = VoidSymbol
+keycode 115 = Help
+ altgr control keycode 115 = VoidSymbol
+ shift alt keycode 115 = VoidSymbol
+ altgr alt keycode 115 = VoidSymbol
+keycode 116 = Do
+ altgr control keycode 116 = VoidSymbol
+ shift alt keycode 116 = VoidSymbol
+ altgr alt keycode 116 = VoidSymbol
+keycode 117 = F17
+ altgr control keycode 117 = VoidSymbol
+ shift alt keycode 117 = VoidSymbol
+ altgr alt keycode 117 = VoidSymbol
+keycode 118 = KP_MinPlus
+ altgr control keycode 118 = VoidSymbol
+ shift alt keycode 118 = VoidSymbol
+ altgr alt keycode 118 = VoidSymbol
+keycode 119 = Pause
+keycode 120 =
+keycode 121 =
+keycode 122 =
+keycode 123 =
+keycode 124 =
+keycode 125 =
+keycode 126 =
+keycode 127 =
+keycode 128 = nul
+ altgr control keycode 128 = VoidSymbol
+ shift alt keycode 128 = VoidSymbol
+ altgr alt keycode 128 = VoidSymbol
+keycode 129 = nul
+ altgr control keycode 129 = VoidSymbol
+ shift alt keycode 129 = VoidSymbol
+ altgr alt keycode 129 = VoidSymbol
+keycode 130 = nul
+ altgr control keycode 130 = VoidSymbol
+ shift alt keycode 130 = VoidSymbol
+ altgr alt keycode 130 = VoidSymbol
+keycode 131 = nul
+ altgr control keycode 131 = VoidSymbol
+ shift alt keycode 131 = VoidSymbol
+ altgr alt keycode 131 = VoidSymbol
+keycode 132 = nul
+ altgr control keycode 132 = VoidSymbol
+ shift alt keycode 132 = VoidSymbol
+ altgr alt keycode 132 = VoidSymbol
+keycode 133 = nul
+ altgr control keycode 133 = VoidSymbol
+ shift alt keycode 133 = VoidSymbol
+ altgr alt keycode 133 = VoidSymbol
+keycode 134 = nul
+ altgr control keycode 134 = VoidSymbol
+ shift alt keycode 134 = VoidSymbol
+ altgr alt keycode 134 = VoidSymbol
+keycode 135 = nul
+ altgr control keycode 135 = VoidSymbol
+ shift alt keycode 135 = VoidSymbol
+ altgr alt keycode 135 = VoidSymbol
+keycode 136 = nul
+ altgr control keycode 136 = VoidSymbol
+ shift alt keycode 136 = VoidSymbol
+ altgr alt keycode 136 = VoidSymbol
+keycode 137 = nul
+ altgr control keycode 137 = VoidSymbol
+ shift alt keycode 137 = VoidSymbol
+ altgr alt keycode 137 = VoidSymbol
+keycode 138 = nul
+ altgr control keycode 138 = VoidSymbol
+ shift alt keycode 138 = VoidSymbol
+ altgr alt keycode 138 = VoidSymbol
+keycode 139 = nul
+ altgr control keycode 139 = VoidSymbol
+ shift alt keycode 139 = VoidSymbol
+ altgr alt keycode 139 = VoidSymbol
+keycode 140 = nul
+ altgr control keycode 140 = VoidSymbol
+ shift alt keycode 140 = VoidSymbol
+ altgr alt keycode 140 = VoidSymbol
+keycode 141 = nul
+ altgr control keycode 141 = VoidSymbol
+ shift alt keycode 141 = VoidSymbol
+ altgr alt keycode 141 = VoidSymbol
+keycode 142 = nul
+ altgr control keycode 142 = VoidSymbol
+ shift alt keycode 142 = VoidSymbol
+ altgr alt keycode 142 = VoidSymbol
+keycode 143 = nul
+ altgr control keycode 143 = VoidSymbol
+ shift alt keycode 143 = VoidSymbol
+ altgr alt keycode 143 = VoidSymbol
+keycode 144 = nul
+ altgr control keycode 144 = VoidSymbol
+ shift alt keycode 144 = VoidSymbol
+ altgr alt keycode 144 = VoidSymbol
+keycode 145 = nul
+ altgr control keycode 145 = VoidSymbol
+ shift alt keycode 145 = VoidSymbol
+ altgr alt keycode 145 = VoidSymbol
+keycode 146 = nul
+ altgr control keycode 146 = VoidSymbol
+ shift alt keycode 146 = VoidSymbol
+ altgr alt keycode 146 = VoidSymbol
+keycode 147 = nul
+ altgr control keycode 147 = VoidSymbol
+ shift alt keycode 147 = VoidSymbol
+ altgr alt keycode 147 = VoidSymbol
+keycode 148 = nul
+ altgr control keycode 148 = VoidSymbol
+ shift alt keycode 148 = VoidSymbol
+ altgr alt keycode 148 = VoidSymbol
+keycode 149 = nul
+ altgr control keycode 149 = VoidSymbol
+ shift alt keycode 149 = VoidSymbol
+ altgr alt keycode 149 = VoidSymbol
+keycode 150 = nul
+ altgr control keycode 150 = VoidSymbol
+ shift alt keycode 150 = VoidSymbol
+ altgr alt keycode 150 = VoidSymbol
+keycode 151 = nul
+ altgr control keycode 151 = VoidSymbol
+ shift alt keycode 151 = VoidSymbol
+ altgr alt keycode 151 = VoidSymbol
+keycode 152 = nul
+ altgr control keycode 152 = VoidSymbol
+ shift alt keycode 152 = VoidSymbol
+ altgr alt keycode 152 = VoidSymbol
+keycode 153 = nul
+ altgr control keycode 153 = VoidSymbol
+ shift alt keycode 153 = VoidSymbol
+ altgr alt keycode 153 = VoidSymbol
+keycode 154 = nul
+ altgr control keycode 154 = VoidSymbol
+ shift alt keycode 154 = VoidSymbol
+ altgr alt keycode 154 = VoidSymbol
+keycode 155 = nul
+ altgr control keycode 155 = VoidSymbol
+ shift alt keycode 155 = VoidSymbol
+ altgr alt keycode 155 = VoidSymbol
+keycode 156 = nul
+ altgr control keycode 156 = VoidSymbol
+ shift alt keycode 156 = VoidSymbol
+ altgr alt keycode 156 = VoidSymbol
+keycode 157 = nul
+ altgr control keycode 157 = VoidSymbol
+ shift alt keycode 157 = VoidSymbol
+ altgr alt keycode 157 = VoidSymbol
+keycode 158 = nul
+ altgr control keycode 158 = VoidSymbol
+ shift alt keycode 158 = VoidSymbol
+ altgr alt keycode 158 = VoidSymbol
+keycode 159 = nul
+ altgr control keycode 159 = VoidSymbol
+ shift alt keycode 159 = VoidSymbol
+ altgr alt keycode 159 = VoidSymbol
+keycode 160 = nul
+ altgr control keycode 160 = VoidSymbol
+ shift alt keycode 160 = VoidSymbol
+ altgr alt keycode 160 = VoidSymbol
+keycode 161 = nul
+ altgr control keycode 161 = VoidSymbol
+ shift alt keycode 161 = VoidSymbol
+ altgr alt keycode 161 = VoidSymbol
+keycode 162 = nul
+ altgr control keycode 162 = VoidSymbol
+ shift alt keycode 162 = VoidSymbol
+ altgr alt keycode 162 = VoidSymbol
+keycode 163 = nul
+ altgr control keycode 163 = VoidSymbol
+ shift alt keycode 163 = VoidSymbol
+ altgr alt keycode 163 = VoidSymbol
+keycode 164 = nul
+ altgr control keycode 164 = VoidSymbol
+ shift alt keycode 164 = VoidSymbol
+ altgr alt keycode 164 = VoidSymbol
+keycode 165 = nul
+ altgr control keycode 165 = VoidSymbol
+ shift alt keycode 165 = VoidSymbol
+ altgr alt keycode 165 = VoidSymbol
+keycode 166 = nul
+ altgr control keycode 166 = VoidSymbol
+ shift alt keycode 166 = VoidSymbol
+ altgr alt keycode 166 = VoidSymbol
+keycode 167 = nul
+ altgr control keycode 167 = VoidSymbol
+ shift alt keycode 167 = VoidSymbol
+ altgr alt keycode 167 = VoidSymbol
+keycode 168 = nul
+ altgr control keycode 168 = VoidSymbol
+ shift alt keycode 168 = VoidSymbol
+ altgr alt keycode 168 = VoidSymbol
+keycode 169 = nul
+ altgr control keycode 169 = VoidSymbol
+ shift alt keycode 169 = VoidSymbol
+ altgr alt keycode 169 = VoidSymbol
+keycode 170 = nul
+ altgr control keycode 170 = VoidSymbol
+ shift alt keycode 170 = VoidSymbol
+ altgr alt keycode 170 = VoidSymbol
+keycode 171 = nul
+ altgr control keycode 171 = VoidSymbol
+ shift alt keycode 171 = VoidSymbol
+ altgr alt keycode 171 = VoidSymbol
+keycode 172 = nul
+ altgr control keycode 172 = VoidSymbol
+ shift alt keycode 172 = VoidSymbol
+ altgr alt keycode 172 = VoidSymbol
+keycode 173 = nul
+ altgr control keycode 173 = VoidSymbol
+ shift alt keycode 173 = VoidSymbol
+ altgr alt keycode 173 = VoidSymbol
+keycode 174 = nul
+ altgr control keycode 174 = VoidSymbol
+ shift alt keycode 174 = VoidSymbol
+ altgr alt keycode 174 = VoidSymbol
+keycode 175 = nul
+ altgr control keycode 175 = VoidSymbol
+ shift alt keycode 175 = VoidSymbol
+ altgr alt keycode 175 = VoidSymbol
+keycode 176 = nul
+ altgr control keycode 176 = VoidSymbol
+ shift alt keycode 176 = VoidSymbol
+ altgr alt keycode 176 = VoidSymbol
+keycode 177 = nul
+ altgr control keycode 177 = VoidSymbol
+ shift alt keycode 177 = VoidSymbol
+ altgr alt keycode 177 = VoidSymbol
+keycode 178 = nul
+ altgr control keycode 178 = VoidSymbol
+ shift alt keycode 178 = VoidSymbol
+ altgr alt keycode 178 = VoidSymbol
+keycode 179 = nul
+ altgr control keycode 179 = VoidSymbol
+ shift alt keycode 179 = VoidSymbol
+ altgr alt keycode 179 = VoidSymbol
+keycode 180 = nul
+ altgr control keycode 180 = VoidSymbol
+ shift alt keycode 180 = VoidSymbol
+ altgr alt keycode 180 = VoidSymbol
+keycode 181 = nul
+ altgr control keycode 181 = VoidSymbol
+ shift alt keycode 181 = VoidSymbol
+ altgr alt keycode 181 = VoidSymbol
+keycode 182 = nul
+ altgr control keycode 182 = VoidSymbol
+ shift alt keycode 182 = VoidSymbol
+ altgr alt keycode 182 = VoidSymbol
+keycode 183 = nul
+ altgr control keycode 183 = VoidSymbol
+ shift alt keycode 183 = VoidSymbol
+ altgr alt keycode 183 = VoidSymbol
+keycode 184 = nul
+ altgr control keycode 184 = VoidSymbol
+ shift alt keycode 184 = VoidSymbol
+ altgr alt keycode 184 = VoidSymbol
+keycode 185 = nul
+ altgr control keycode 185 = VoidSymbol
+ shift alt keycode 185 = VoidSymbol
+ altgr alt keycode 185 = VoidSymbol
+keycode 186 = nul
+ altgr control keycode 186 = VoidSymbol
+ shift alt keycode 186 = VoidSymbol
+ altgr alt keycode 186 = VoidSymbol
+keycode 187 = nul
+ altgr control keycode 187 = VoidSymbol
+ shift alt keycode 187 = VoidSymbol
+ altgr alt keycode 187 = VoidSymbol
+keycode 188 = nul
+ altgr control keycode 188 = VoidSymbol
+ shift alt keycode 188 = VoidSymbol
+ altgr alt keycode 188 = VoidSymbol
+keycode 189 = nul
+ altgr control keycode 189 = VoidSymbol
+ shift alt keycode 189 = VoidSymbol
+ altgr alt keycode 189 = VoidSymbol
+keycode 190 = nul
+ altgr control keycode 190 = VoidSymbol
+ shift alt keycode 190 = VoidSymbol
+ altgr alt keycode 190 = VoidSymbol
+keycode 191 = nul
+ altgr control keycode 191 = VoidSymbol
+ shift alt keycode 191 = VoidSymbol
+ altgr alt keycode 191 = VoidSymbol
+keycode 192 = nul
+ altgr control keycode 192 = VoidSymbol
+ shift alt keycode 192 = VoidSymbol
+ altgr alt keycode 192 = VoidSymbol
+keycode 193 = nul
+ altgr control keycode 193 = VoidSymbol
+ shift alt keycode 193 = VoidSymbol
+ altgr alt keycode 193 = VoidSymbol
+keycode 194 = nul
+ altgr control keycode 194 = VoidSymbol
+ shift alt keycode 194 = VoidSymbol
+ altgr alt keycode 194 = VoidSymbol
+keycode 195 = nul
+ altgr control keycode 195 = VoidSymbol
+ shift alt keycode 195 = VoidSymbol
+ altgr alt keycode 195 = VoidSymbol
+keycode 196 = nul
+ altgr control keycode 196 = VoidSymbol
+ shift alt keycode 196 = VoidSymbol
+ altgr alt keycode 196 = VoidSymbol
+keycode 197 = nul
+ altgr control keycode 197 = VoidSymbol
+ shift alt keycode 197 = VoidSymbol
+ altgr alt keycode 197 = VoidSymbol
+keycode 198 = nul
+ altgr control keycode 198 = VoidSymbol
+ shift alt keycode 198 = VoidSymbol
+ altgr alt keycode 198 = VoidSymbol
+keycode 199 = nul
+ altgr control keycode 199 = VoidSymbol
+ shift alt keycode 199 = VoidSymbol
+ altgr alt keycode 199 = VoidSymbol
+keycode 200 = nul
+ altgr control keycode 200 = VoidSymbol
+ shift alt keycode 200 = VoidSymbol
+ altgr alt keycode 200 = VoidSymbol
+keycode 201 = nul
+ altgr control keycode 201 = VoidSymbol
+ shift alt keycode 201 = VoidSymbol
+ altgr alt keycode 201 = VoidSymbol
+keycode 202 = nul
+ altgr control keycode 202 = VoidSymbol
+ shift alt keycode 202 = VoidSymbol
+ altgr alt keycode 202 = VoidSymbol
+keycode 203 = nul
+ altgr control keycode 203 = VoidSymbol
+ shift alt keycode 203 = VoidSymbol
+ altgr alt keycode 203 = VoidSymbol
+keycode 204 = nul
+ altgr control keycode 204 = VoidSymbol
+ shift alt keycode 204 = VoidSymbol
+ altgr alt keycode 204 = VoidSymbol
+keycode 205 = nul
+ altgr control keycode 205 = VoidSymbol
+ shift alt keycode 205 = VoidSymbol
+ altgr alt keycode 205 = VoidSymbol
+keycode 206 = nul
+ altgr control keycode 206 = VoidSymbol
+ shift alt keycode 206 = VoidSymbol
+ altgr alt keycode 206 = VoidSymbol
+keycode 207 = nul
+ altgr control keycode 207 = VoidSymbol
+ shift alt keycode 207 = VoidSymbol
+ altgr alt keycode 207 = VoidSymbol
+keycode 208 = nul
+ altgr control keycode 208 = VoidSymbol
+ shift alt keycode 208 = VoidSymbol
+ altgr alt keycode 208 = VoidSymbol
+keycode 209 = nul
+ altgr control keycode 209 = VoidSymbol
+ shift alt keycode 209 = VoidSymbol
+ altgr alt keycode 209 = VoidSymbol
+keycode 210 = nul
+ altgr control keycode 210 = VoidSymbol
+ shift alt keycode 210 = VoidSymbol
+ altgr alt keycode 210 = VoidSymbol
+keycode 211 = nul
+ altgr control keycode 211 = VoidSymbol
+ shift alt keycode 211 = VoidSymbol
+ altgr alt keycode 211 = VoidSymbol
+keycode 212 = nul
+ altgr control keycode 212 = VoidSymbol
+ shift alt keycode 212 = VoidSymbol
+ altgr alt keycode 212 = VoidSymbol
+keycode 213 = nul
+ altgr control keycode 213 = VoidSymbol
+ shift alt keycode 213 = VoidSymbol
+ altgr alt keycode 213 = VoidSymbol
+keycode 214 = nul
+ altgr control keycode 214 = VoidSymbol
+ shift alt keycode 214 = VoidSymbol
+ altgr alt keycode 214 = VoidSymbol
+keycode 215 = nul
+ altgr control keycode 215 = VoidSymbol
+ shift alt keycode 215 = VoidSymbol
+ altgr alt keycode 215 = VoidSymbol
+keycode 216 = nul
+ altgr control keycode 216 = VoidSymbol
+ shift alt keycode 216 = VoidSymbol
+ altgr alt keycode 216 = VoidSymbol
+keycode 217 = nul
+ altgr control keycode 217 = VoidSymbol
+ shift alt keycode 217 = VoidSymbol
+ altgr alt keycode 217 = VoidSymbol
+keycode 218 = nul
+ altgr control keycode 218 = VoidSymbol
+ shift alt keycode 218 = VoidSymbol
+ altgr alt keycode 218 = VoidSymbol
+keycode 219 = nul
+ altgr control keycode 219 = VoidSymbol
+ shift alt keycode 219 = VoidSymbol
+ altgr alt keycode 219 = VoidSymbol
+keycode 220 = nul
+ altgr control keycode 220 = VoidSymbol
+ shift alt keycode 220 = VoidSymbol
+ altgr alt keycode 220 = VoidSymbol
+keycode 221 = nul
+ altgr control keycode 221 = VoidSymbol
+ shift alt keycode 221 = VoidSymbol
+ altgr alt keycode 221 = VoidSymbol
+keycode 222 = nul
+ altgr control keycode 222 = VoidSymbol
+ shift alt keycode 222 = VoidSymbol
+ altgr alt keycode 222 = VoidSymbol
+keycode 223 = nul
+ altgr control keycode 223 = VoidSymbol
+ shift alt keycode 223 = VoidSymbol
+ altgr alt keycode 223 = VoidSymbol
+keycode 224 = nul
+ altgr control keycode 224 = VoidSymbol
+ shift alt keycode 224 = VoidSymbol
+ altgr alt keycode 224 = VoidSymbol
+keycode 225 = nul
+ altgr control keycode 225 = VoidSymbol
+ shift alt keycode 225 = VoidSymbol
+ altgr alt keycode 225 = VoidSymbol
+keycode 226 = nul
+ altgr control keycode 226 = VoidSymbol
+ shift alt keycode 226 = VoidSymbol
+ altgr alt keycode 226 = VoidSymbol
+keycode 227 = nul
+ altgr control keycode 227 = VoidSymbol
+ shift alt keycode 227 = VoidSymbol
+ altgr alt keycode 227 = VoidSymbol
+keycode 228 = nul
+ altgr control keycode 228 = VoidSymbol
+ shift alt keycode 228 = VoidSymbol
+ altgr alt keycode 228 = VoidSymbol
+keycode 229 = nul
+ altgr control keycode 229 = VoidSymbol
+ shift alt keycode 229 = VoidSymbol
+ altgr alt keycode 229 = VoidSymbol
+keycode 230 = nul
+ altgr control keycode 230 = VoidSymbol
+ shift alt keycode 230 = VoidSymbol
+ altgr alt keycode 230 = VoidSymbol
+keycode 231 = nul
+ altgr control keycode 231 = VoidSymbol
+ shift alt keycode 231 = VoidSymbol
+ altgr alt keycode 231 = VoidSymbol
+keycode 232 = nul
+ altgr control keycode 232 = VoidSymbol
+ shift alt keycode 232 = VoidSymbol
+ altgr alt keycode 232 = VoidSymbol
+keycode 233 = nul
+ altgr control keycode 233 = VoidSymbol
+ shift alt keycode 233 = VoidSymbol
+ altgr alt keycode 233 = VoidSymbol
+keycode 234 = nul
+ altgr control keycode 234 = VoidSymbol
+ shift alt keycode 234 = VoidSymbol
+ altgr alt keycode 234 = VoidSymbol
+keycode 235 = nul
+ altgr control keycode 235 = VoidSymbol
+ shift alt keycode 235 = VoidSymbol
+ altgr alt keycode 235 = VoidSymbol
+keycode 236 = nul
+ altgr control keycode 236 = VoidSymbol
+ shift alt keycode 236 = VoidSymbol
+ altgr alt keycode 236 = VoidSymbol
+keycode 237 = nul
+ altgr control keycode 237 = VoidSymbol
+ shift alt keycode 237 = VoidSymbol
+ altgr alt keycode 237 = VoidSymbol
+keycode 238 = nul
+ altgr control keycode 238 = VoidSymbol
+ shift alt keycode 238 = VoidSymbol
+ altgr alt keycode 238 = VoidSymbol
+keycode 239 = nul
+ altgr control keycode 239 = VoidSymbol
+ shift alt keycode 239 = VoidSymbol
+ altgr alt keycode 239 = VoidSymbol
+keycode 240 = nul
+ altgr control keycode 240 = VoidSymbol
+ shift alt keycode 240 = VoidSymbol
+ altgr alt keycode 240 = VoidSymbol
+keycode 241 = nul
+ altgr control keycode 241 = VoidSymbol
+ shift alt keycode 241 = VoidSymbol
+ altgr alt keycode 241 = VoidSymbol
+keycode 242 = nul
+ altgr control keycode 242 = VoidSymbol
+ shift alt keycode 242 = VoidSymbol
+ altgr alt keycode 242 = VoidSymbol
+keycode 243 = nul
+ altgr control keycode 243 = VoidSymbol
+ shift alt keycode 243 = VoidSymbol
+ altgr alt keycode 243 = VoidSymbol
+keycode 244 = nul
+ altgr control keycode 244 = VoidSymbol
+ shift alt keycode 244 = VoidSymbol
+ altgr alt keycode 244 = VoidSymbol
+keycode 245 = nul
+ altgr control keycode 245 = VoidSymbol
+ shift alt keycode 245 = VoidSymbol
+ altgr alt keycode 245 = VoidSymbol
+keycode 246 = nul
+ altgr control keycode 246 = VoidSymbol
+ shift alt keycode 246 = VoidSymbol
+ altgr alt keycode 246 = VoidSymbol
+keycode 247 = nul
+ altgr control keycode 247 = VoidSymbol
+ shift alt keycode 247 = VoidSymbol
+ altgr alt keycode 247 = VoidSymbol
+keycode 248 = nul
+ altgr control keycode 248 = VoidSymbol
+ shift alt keycode 248 = VoidSymbol
+ altgr alt keycode 248 = VoidSymbol
+keycode 249 = nul
+ altgr control keycode 249 = VoidSymbol
+ shift alt keycode 249 = VoidSymbol
+ altgr alt keycode 249 = VoidSymbol
+keycode 250 = nul
+ altgr control keycode 250 = VoidSymbol
+ shift alt keycode 250 = VoidSymbol
+ altgr alt keycode 250 = VoidSymbol
+keycode 251 = nul
+ altgr control keycode 251 = VoidSymbol
+ shift alt keycode 251 = VoidSymbol
+ altgr alt keycode 251 = VoidSymbol
+keycode 252 = nul
+ altgr control keycode 252 = VoidSymbol
+ shift alt keycode 252 = VoidSymbol
+ altgr alt keycode 252 = VoidSymbol
+keycode 253 = nul
+ altgr control keycode 253 = VoidSymbol
+ shift alt keycode 253 = VoidSymbol
+ altgr alt keycode 253 = VoidSymbol
+keycode 254 = nul
+ altgr control keycode 254 = VoidSymbol
+ shift alt keycode 254 = VoidSymbol
+ altgr alt keycode 254 = VoidSymbol
+keycode 255 = nul
+ altgr control keycode 255 = VoidSymbol
+ shift alt keycode 255 = VoidSymbol
+ altgr alt keycode 255 = VoidSymbol
+string F1 = "\033[[A"
+string F2 = "\033[[B"
+string F3 = "\033[[C"
+string F4 = "\033[[D"
+string F5 = "\033[[E"
+string F6 = "\033[17~"
+string F7 = "\033[18~"
+string F8 = "\033[19~"
+string F9 = "\033[20~"
+string F10 = "\033[21~"
+string F11 = "\033[23~"
+string F12 = "\033[24~"
+string F13 = "\033[25~"
+string F14 = "\033[26~"
+string F15 = "\033[28~"
+string F16 = "\033[29~"
+string F17 = "\033[31~"
+string F18 = "\033[32~"
+string F19 = "\033[33~"
+string F20 = "\033[34~"
+string Find = "\033[1~"
+string Insert = "\033[2~"
+string Remove = "\033[3~"
+string Select = "\033[4~"
+string Prior = "\033[5~"
+string Next = "\033[6~"
+string Macro = "\033[M"
+string Pause = "\033[P"
diff --git a/core/modules/german/data/opt/openslx/scripts/systemd-load_german_keymaps b/core/modules/german/data/opt/openslx/scripts/systemd-load_german_keymaps
new file mode 100755
index 00000000..ee05e692
--- /dev/null
+++ b/core/modules/german/data/opt/openslx/scripts/systemd-load_german_keymaps
@@ -0,0 +1,22 @@
+#!/bin/ash
+# Script serves as container script for a systemd-call due to the buggyness of several
+# loadkeys-implementations <= kbd (Linux keyboard tools) 1.15.3.
+# This bug can be detected through failure of the command pipe 'dumpkeys|loadkeys' yielding
+# the message "unknown keysym 'compose'.
+
+# So we first try to insert a keymap including compose-lines:
+loadkeys /opt/openslx/keymaps/german_qwertz_compose_keyboard_translation.map
+ERR=$?
+
+# ... if this fails we enter a keymap without compose-lines:
+if [ "$ERR" -eq 0 ]; then
+ exit 0 # in that case everything went smooth - exit.
+fi
+
+loadkeys /opt/openslx/keymaps/german_qwertz_keyboard_translation.map # insert a keymap without compose lines
+ERR=$?
+
+# if at this point the second keymap insertion failed we pass the errorlevel to
+# systemd - we cannot do more at this point.
+exit $ERR
+
diff --git a/core/modules/german/module.build b/core/modules/german/module.build
new file mode 100644
index 00000000..8788a459
--- /dev/null
+++ b/core/modules/german/module.build
@@ -0,0 +1,39 @@
+fetch_source() {
+ :
+}
+
+build() {
+ # Debian-like
+ if [ -e "/etc/locale.gen" ] && ! grep -q -E '^\s*de_DE\.UTF-8' "/etc/locale.gen"; then
+ pinfo "Generating locales..."
+ echo 'de_DE.UTF-8 UTF-8' >> "/etc/locale.gen"
+ locale-gen || perror "Could not generate locales (debian style)"
+ fi
+ # Ubuntu's version
+ if [ -d "/var/lib/locales/supported.d" ] && [ ! -d /usr/lib/locale/de_DE.utf8 ]; then
+ pinfo "Generating locales..."
+ grep -q -E -r '^\s*de_DE\.UTF-8' "/var/lib/locales/supported.d" || echo 'de_DE.UTF-8 UTF-8' >> "/var/lib/locales/supported.d/openslx"
+ locale-gen --no-archive --purge "de_DE.UTF-8" || perror "Could not generate locales (ubuntu style)"
+ fi
+
+ # Put everything we build or get from the system in build dir
+ local FILELIST="$MODULE_WORK_DIR/list_copy_build"
+ rm -f "$FILELIST"
+
+ # Copy required directories from source system to build dir
+ for FILE in ${REQUIRED_DIRECTORIES}; do
+ [ ! -d "${FILE}" ] && perror "Missing required directory $FILE"
+ echo ${FILE} >> "${FILELIST}"
+ done
+
+ # Done collecting file and directory names, copy everything
+ tarcopy "$(sort -u "$FILELIST")" "$MODULE_BUILD_DIR"
+
+}
+
+post_copy() {
+ for i in LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION; do
+ add_env $i de_DE.UTF-8 || perror "$i: add_env function failed."
+ done
+}
+
diff --git a/core/modules/german/module.conf b/core/modules/german/module.conf
new file mode 100644
index 00000000..e2f82123
--- /dev/null
+++ b/core/modules/german/module.conf
@@ -0,0 +1,5 @@
+REQUIRED_BINARIES=""
+REQUIRED_FILES=""
+REQUIRED_DIRECTORIES="
+ /usr/share/X11
+"
diff --git a/core/modules/german/module.conf.debian b/core/modules/german/module.conf.debian
new file mode 100644
index 00000000..a43faea2
--- /dev/null
+++ b/core/modules/german/module.conf.debian
@@ -0,0 +1,10 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libX11-data
+"
+REQUIRED_CONTENT_PACKAGES="
+ libX11-data
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/locale
+"
+
diff --git a/core/modules/german/module.conf.opensuse b/core/modules/german/module.conf.opensuse
new file mode 100644
index 00000000..2bb901ff
--- /dev/null
+++ b/core/modules/german/module.conf.opensuse
@@ -0,0 +1,13 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libX11-data
+ glibc-locale
+"
+REQUIRED_CONTENT_PACKAGES="
+ libX11-data
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/locale/de_DE.utf8
+"
+REQUIRED_BINARIES=""
+REQUIRED_FILES=""
+
diff --git a/core/modules/german/module.conf.scientific b/core/modules/german/module.conf.scientific
new file mode 100644
index 00000000..88ac0d27
--- /dev/null
+++ b/core/modules/german/module.conf.scientific
@@ -0,0 +1,8 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libX11-data
+ glibc-common
+"
+REQUIRED_CONTENT_PACKAGES="
+ libX11-data"
+REQUIRED_BINARIES=""
+REQUIRED_FILES=""
diff --git a/core/modules/german/module.conf.ubuntu b/core/modules/german/module.conf.ubuntu
new file mode 100644
index 00000000..aee3c64b
--- /dev/null
+++ b/core/modules/german/module.conf.ubuntu
@@ -0,0 +1,11 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libx11-data
+ language-pack-de
+"
+REQUIRED_CONTENT_PACKAGES="
+ libx11-data
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/locale/de_DE.utf8
+"
+
diff --git a/core/modules/hardware-stats/data/etc/systemd/system/hardware-stats.service b/core/modules/hardware-stats/data/etc/systemd/system/hardware-stats.service
new file mode 100644
index 00000000..c28e75a5
--- /dev/null
+++ b/core/modules/hardware-stats/data/etc/systemd/system/hardware-stats.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Gather statistics about this machine and send to boot server
+DefaultDependencies=no
+After=tmp.target multi-user.target
+Wants=tmp.target
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-hardware_stats
+RemainAfterExit=yes
+
diff --git a/core/modules/hardware-stats/data/etc/systemd/system/multi-user.target.wants/hardware-stats.service b/core/modules/hardware-stats/data/etc/systemd/system/multi-user.target.wants/hardware-stats.service
new file mode 120000
index 00000000..e463586d
--- /dev/null
+++ b/core/modules/hardware-stats/data/etc/systemd/system/multi-user.target.wants/hardware-stats.service
@@ -0,0 +1 @@
+../hardware-stats.service \ No newline at end of file
diff --git a/core/modules/hardware-stats/data/etc/systemd/system/shutdown-usage-log.service b/core/modules/hardware-stats/data/etc/systemd/system/shutdown-usage-log.service
new file mode 100644
index 00000000..fc65fe9f
--- /dev/null
+++ b/core/modules/hardware-stats/data/etc/systemd/system/shutdown-usage-log.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Gather statistics about this machine and send to boot server
+DefaultDependencies=no
+Before=shutdown.target
+RefuseManualStart=yes
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/shutdown-system_usage_update
+RemainAfterExit=yes
+
diff --git a/core/modules/hardware-stats/data/etc/systemd/system/shutdown.target.wants/shutdown-usage-log.service b/core/modules/hardware-stats/data/etc/systemd/system/shutdown.target.wants/shutdown-usage-log.service
new file mode 120000
index 00000000..d94670ed
--- /dev/null
+++ b/core/modules/hardware-stats/data/etc/systemd/system/shutdown.target.wants/shutdown-usage-log.service
@@ -0,0 +1 @@
+../shutdown-usage-log.service \ No newline at end of file
diff --git a/core/modules/hardware-stats/data/opt/openslx/scripts/cron-system_usage_update b/core/modules/hardware-stats/data/opt/openslx/scripts/cron-system_usage_update
new file mode 100755
index 00000000..232e5eab
--- /dev/null
+++ b/core/modules/hardware-stats/data/opt/openslx/scripts/cron-system_usage_update
@@ -0,0 +1,25 @@
+#!/bin/ash
+
+[ -r "/run/system-uuid" ] || exit 0
+
+. /opt/openslx/config
+[ -z "$SLX_REMOTE_LOG" ] && exit 0
+
+UUID=$(cat "/run/system-uuid")
+
+[ -z "$UUID" ] && exit 1
+
+USED=0
+
+for SESSION in $(loginctl | awk '{print $1}'); do
+ unset Display Remote State
+ eval $(loginctl -p Display -p Remote -p State -p Class show-session "$SESSION")
+ if [ -n "$Display" ] && [ "$Remote" = "no" ] && [ "$State" = "active" ] && [ "$Class" = "user" ]; then
+ USED=1
+ break;
+ fi
+done
+
+curl -s --data-urlencode "type=~runstate" --data-urlencode "uuid=$UUID" --data-urlencode "used=$USED" \
+ "$SLX_REMOTE_LOG" > /dev/null 2>&1
+
diff --git a/core/modules/hardware-stats/data/opt/openslx/scripts/pam_script_ses_close.d/usage_stats b/core/modules/hardware-stats/data/opt/openslx/scripts/pam_script_ses_close.d/usage_stats
new file mode 120000
index 00000000..129ca2f8
--- /dev/null
+++ b/core/modules/hardware-stats/data/opt/openslx/scripts/pam_script_ses_close.d/usage_stats
@@ -0,0 +1 @@
+../pam_script_ses_open.d/usage_stats \ No newline at end of file
diff --git a/core/modules/hardware-stats/data/opt/openslx/scripts/pam_script_ses_open.d/usage_stats b/core/modules/hardware-stats/data/opt/openslx/scripts/pam_script_ses_open.d/usage_stats
new file mode 100644
index 00000000..7c15ee1b
--- /dev/null
+++ b/core/modules/hardware-stats/data/opt/openslx/scripts/pam_script_ses_open.d/usage_stats
@@ -0,0 +1,8 @@
+
+(
+ sleep 3
+ /opt/openslx/scripts/cron-system_usage_update
+) &
+
+true
+
diff --git a/core/modules/hardware-stats/data/opt/openslx/scripts/shutdown-system_usage_update b/core/modules/hardware-stats/data/opt/openslx/scripts/shutdown-system_usage_update
new file mode 100755
index 00000000..dc9f8f73
--- /dev/null
+++ b/core/modules/hardware-stats/data/opt/openslx/scripts/shutdown-system_usage_update
@@ -0,0 +1,12 @@
+#!/bin/ash
+
+. /opt/openslx/config
+[ -z "$SLX_REMOTE_LOG" ] && exit 0
+
+UUID=$(cat /run/system-uuid)
+
+[ -z "$UUID" ] && exit 1
+
+curl -s --data-urlencode "type=~poweroff" --data-urlencode "uuid=$UUID" \
+ "$SLX_REMOTE_LOG" > /dev/null 2>&1
+
diff --git a/core/modules/hardware-stats/data/opt/openslx/scripts/systemd-hardware_stats b/core/modules/hardware-stats/data/opt/openslx/scripts/systemd-hardware_stats
new file mode 100755
index 00000000..ce910a2b
--- /dev/null
+++ b/core/modules/hardware-stats/data/opt/openslx/scripts/systemd-hardware_stats
@@ -0,0 +1,211 @@
+#!/bin/bash
+# Use bash since ash can only do math on 32bit numbers, which is not sufficient for ID44 calculations
+# also for negative length to ${x:0:-1}
+
+# This script gathers information about the hardware and configuration and reports it back to the server
+
+. /opt/openslx/config
+export LANG=C
+export LC_ALL=C
+
+if [ -z "$SLX_REMOTE_LOG" ]; then
+ echo "No remote log url given, will not report"
+ exit 1
+fi
+
+# 1) Get MAC Address used for booting
+eval $(grep -Eo BOOTIF=\\S+ /proc/cmdline)
+if [ "${#BOOTIF}" -ne "20" ]; then
+ echo "Getting MAC from /proc/cmdline failed, using 'ip a'..."
+ BOOTIF=01-$(ip a | grep -A 1 ': br0' | grep -o 'ether ..:..:..:..:..:..' | cut -d' ' -f2 | sed s/:/-/g)
+ if [ "${#BOOTIF}" -ne "20" ]; then
+ echo "FAIL FAIL FAIL"
+ BOOTIF="99-88-77-66-55-44-33"
+ fi
+fi
+MAC=${BOOTIF:3}
+
+which dmidecode || sleep 5
+
+# 2) Get machine UUID, with fallback to MAC address if it fails for some reason
+UUID=$(dmidecode -s system-uuid)
+if [ "${#UUID}" -ne "36" ]; then
+ echo "Determined UUID (${UUID}) has not expected length of 36, falling back to MAC..."
+ UUID="000000000000000-$BOOTIF"
+fi
+
+# 3) Uptime in seconds
+UPTIME=$(grep -o -E '^[0-9]+' /proc/uptime)
+
+# 4) Number of real CPU cores
+CPUCORES=$(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | sort -u | wc -l)
+# Fallback 1...
+if [ -z "$CPUCORES" ] || [ "$CPUCORES" = "0" ]; then
+ for c in $(dmidecode -t 4 | grep 'Core Enabled' | awk -F ':' '{print $2}'); do
+ CPUCORES=$(( $CPUCORES + $c ))
+ done
+fi
+# Fallback 2...
+if [ -z "$CPUCORES" ] || [ "$CPUCORES" = "0" ]; then
+ CPUCORES=$(grep -E -e '^core id\s*:' -e '^physical\s*:' /proc/cpuinfo | xargs -l2 echo | sort -u | wc -l)
+fi
+
+# 5) CPU model name
+CPUMODEL=$(grep -m1 '^model name\s*:' /proc/cpuinfo | sed 's/^model name\s*:\s*//;s/\s\s*/ /g;s/^ //;s/ $//')
+
+# 6) RAM
+RAM=$(grep '^MemTotal:' /proc/meminfo | awk '{print $2}')
+RAM=$(( $RAM / 1024 ))
+if [ -z "$RAM" ] || [ "$RAM" -lt 500 ]; then
+ # Fallback to dmidecode
+ RAM=0
+ for c in $(dmidecode -t 17 | grep -o 'Size:.*MB$' | awk '{print $2}'); do
+ RAM=$(( $RAM + $c ))
+ done
+fi
+
+# 7) 64bit virtualization support
+VT="UNSUPPORTED"
+VIRTTYPE=$(grep -m1 '^flags\s*:' /proc/cpuinfo | grep -wo -e svm -e vmx)
+[ -n "$VIRTTYPE" ] && modprobe msr
+
+if [ "$VIRTTYPE" = "vmx" ]; then # intel
+ BIT1=$(rdmsr --bitfield 0:0 0x3a 2>/dev/null || echo "fail")
+ BIT2=$(rdmsr --bitfield 2:2 0x3a 2>/dev/null || echo "fail")
+ if [ "$BIT1" = "fail" -o "$BIT2" = "fail" ]; then
+ VT="UNKNOWN"
+ elif [ "$BIT1" = "0" -o "$BIT2" = "1" ]; then
+ VT="ENABLED"
+ else
+ VT="DISABLED"
+ fi
+elif [ "$VIRTTYPE" = "svm" ]; then # amd
+ BIT=$(rdmsr --bitfield 4:4 0xc0010114 2>/dev/null || echo "fail")
+ if [ "$BIT" = "fail" ]; then
+ VT="UNKNOWN"
+ elif [ "$BIT" = "0" ]; then
+ VT="ENABLED"
+ else
+ VT="DISABLED"
+ fi
+fi
+
+# 8) ID44 partition size
+ID44=0
+for c in $(fdisk -l | grep -E '[0-9]+[\-\+]?\s+44\s+' | awk '{print $1}'); do
+ val=$(blockdev --getsize64 "$c")
+ [ -z "$val" ] && continue
+ [ "$val" -gt "$ID44" ] && ID44=$val
+done
+ID44=$(( $ID44 / 1058576 )) # we'd rather underreport
+
+# 9) check smart values
+BADSECTORS=0
+if which smartctl; then
+ ALLSMART=$(mktemp)
+ FILE=$(mktemp)
+ [ -z "$FILE" ] && FILE="/tmp/smartctl.$$.$RANDOM.$RANDOM"
+ for dev in $(fdisk -l | grep -o '^Disk /dev/\S*:' | cut -c 6-); do
+ dev=${dev:0:-1}
+ smartctl -i -H -A -f "brief" "$dev" > "$FILE" || continue
+ echo "NEXTHDD=$dev" >> "$ALLSMART"
+ cat "$FILE" >> "$ALLSMART"
+ # parse
+ OVERALL=$(grep -o "test result: .*$" "$FILE" | cut -c 14-)
+ [ "x$OVERALL" = "xPASSED" ] && OVERALL=""
+ REALLOC=$(grep "^ *5 " "$FILE" | awk '{print $8}')
+ SPINRETRY_VAL=$(grep "^ *10 " "$FILE" | awk '{print $4}')
+ SPINRETRY_THR=$(grep "^ *10 " "$FILE" | awk '{print $6}')
+ [ -n "$OVERALL" ] && BADSECTORS=$(( $BADSECTORS + 100 ))
+ if [ -n "$REALLOC" ] && [ "$REALLOC" -gt "0" ]; then
+ BADSECTORS=$(( $BADSECTORS + $REALLOC ))
+ fi
+ if [ -n "$SPINRETRY_VAL" ] && [ "$SPINRETRY_VAL" -le "$SPINRETRY_THR" ]; then
+ BADSECTORS=$(( $BADSECTORS + 100 ))
+ fi
+ done
+ rm -f -- "$FILE"
+fi
+
+# A) Read system model and manufacturer
+dmidec() {
+ local MODEL=$(dmidecode "$@" | sed 's/\s\s*/ /g;s/^ //;s/ $//')
+ case "$MODEL" in
+ ""|*"Product Name"*|*"be filled"*|"unknown"|*"product name"*)
+ MODEL="Unknown"
+ ;;
+ esac
+ echo "$MODEL"
+}
+MODEL=$(dmidec -s system-product-name)
+MANUF=$(dmidec -s system-manufacturer)
+# Try fallback to baseboard
+if [ "$MODEL" = "Unknown" ]; then
+ MODEL=$(dmidec -s baseboard-product-name)
+ MANUF=$(dmidec -s baseboard-manufacturer)
+fi
+
+if [ "$MANUF" != "Unknown" ]; then
+ MODEL="$MODEL ($MANUF)"
+fi
+
+# n) Dump raw data to a file
+DATAFILE=$(mktemp)
+[ -z "$DATAFILE" ] && DATAFILE="/root/power-stats.$$"
+cat > "$DATAFILE" <<-EOF
+############################### CPU #####################################
+Sockets: $(grep '^physical id' /proc/cpuinfo | sort -u | wc -l)
+Real cores: $CPUCORES
+Virtual cores: $(grep '^processor' /proc/cpuinfo | sort -u | wc -l)
+######################## Partition tables ###############################
+EOF
+fdisk -l >> "$DATAFILE"
+cat >> "$DATAFILE" <<-EOF
+############################ PCI ID #####################################
+EOF
+lspci -n -m >> "$DATAFILE"
+cat >> "$DATAFILE" <<-EOF
+########################## dmidecode ####################################
+EOF
+dmidecode >> "$DATAFILE"
+if [ -n "$ALLSMART" ] && [ -s "$ALLSMART" ]; then
+ cat >> "$DATAFILE" <<-EOF
+ ########################### smartctl ####################################
+ EOF
+ cat "$ALLSMART" >> "$DATAFILE"
+fi
+cat >> "$DATAFILE" <<-EOF
+#########################
+EOF
+
+[ -n "$ALLSMART" ] && rm -f -- "$ALLSMART"
+
+# Fire away
+for DELAY in 1 1 0; do
+ if curl --data-urlencode "type=~poweron" --data-urlencode "uuid=$UUID" --data-urlencode "macaddr=$MAC" \
+ --data-urlencode "uptime=$UPTIME" --data-urlencode "realcores=$CPUCORES" --data-urlencode "mbram=$RAM" \
+ --data-urlencode "kvmstate=$VT" --data-urlencode "cpumodel=$CPUMODEL" --data-urlencode "id44mb=$ID44" \
+ --data-urlencode "badsectors=$BADSECTORS" --data-urlencode "systemmodel=$MODEL" \
+ --data-urlencode "data@$DATAFILE" "$SLX_REMOTE_LOG" | grep -q "RESULT=0"; then
+ rm -f -- "$DATAFILE"
+ echo "$UUID" > "/run/system-uuid"
+ START=$(( $RANDOM % 5 ))
+ cat > "/etc/cron.d/usage_stats" <<-EOF
+ # Update usage statistics on server
+
+ SHELL=/bin/sh
+ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/openslx/sbin:/opt/openslx/bin
+
+ ${START}-59/5 * * * * root /opt/openslx/scripts/cron-system_usage_update
+ EOF
+ touch "/etc/cron.d" # Sometimes, aufs doesn't update the mtime of dirs when creating files,
+ # so cron would not rescan the cron directory
+ exit 0
+ fi
+ sleep "$DELAY"
+done
+
+echo "Server doesn't seem to support hardware/usage stats - disabling logging"
+rm -f -- "/etc/cron.d/usage_stats"
+exit 1
+
diff --git a/core/modules/hardware-stats/module.build b/core/modules/hardware-stats/module.build
new file mode 100644
index 00000000..f9b81669
--- /dev/null
+++ b/core/modules/hardware-stats/module.build
@@ -0,0 +1,17 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ rm -f -- "$COPYLIST"
+
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "${COPYLIST}" | sort -u)" "${MODULE_BUILD_DIR}"
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/hardware-stats/module.conf b/core/modules/hardware-stats/module.conf
new file mode 100644
index 00000000..5850b267
--- /dev/null
+++ b/core/modules/hardware-stats/module.conf
@@ -0,0 +1,6 @@
+REQUIRED_BINARIES="
+ rdmsr
+ dmidecode
+ blockdev
+"
+
diff --git a/core/modules/hardware-stats/module.conf.ubuntu b/core/modules/hardware-stats/module.conf.ubuntu
new file mode 100644
index 00000000..2037d13c
--- /dev/null
+++ b/core/modules/hardware-stats/module.conf.ubuntu
@@ -0,0 +1,12 @@
+REQUIRED_INSTALLED_PACKAGES="
+ msr-tools
+ dmidecode
+ util-linux
+"
+
+REQUIRED_CONTENT_PACKAGES="
+ msr-tools
+ dmidecode
+ util-linux
+"
+
diff --git a/core/modules/idleaction/data/etc/cron.d/openslx-idleaction b/core/modules/idleaction/data/etc/cron.d/openslx-idleaction
new file mode 100644
index 00000000..3dd07ccb
--- /dev/null
+++ b/core/modules/idleaction/data/etc/cron.d/openslx-idleaction
@@ -0,0 +1,7 @@
+# Trigger scripts that checks idle status of machine and triggers actions
+
+SHELL=/bin/ash
+PATH=/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin
+
+*/5 * * * * root /opt/openslx/scripts/idleaction-cron_script
+
diff --git a/core/modules/idleaction/data/opt/openslx/scripts/idleaction-cron_script b/core/modules/idleaction/data/opt/openslx/scripts/idleaction-cron_script
new file mode 100755
index 00000000..b7617940
--- /dev/null
+++ b/core/modules/idleaction/data/opt/openslx/scripts/idleaction-cron_script
@@ -0,0 +1,138 @@
+#!/bin/ash
+
+. /opt/openslx/config || exit 1
+
+# If existent, no session is open. Will contain timestamp of last activity.
+# If not existent, at least one user is logged in
+CRONFILE="/etc/cron.d/idleaction-shutdown_schedule"
+IDLEHINT="/dev/shm/idlehint"
+NOW=$(date +%s)
+
+#
+# 1) Check for idle timeout
+#
+if [ -n "${SLX_LOGOUT_TIMEOUT}" ] && [ "${SLX_LOGOUT_TIMEOUT}" -gt 0 ]; then
+ # Logout timeout is set, see which users we should kick
+ IS_IDLE=yes
+ # get all sessions
+ SESSIONS=$(loginctl | awk '{print $1}')
+ if [ -n "$SESSIONS" ]; then
+ TMP="/dev/shm/idlecheck.tmp"
+ # Iterate over sessions
+ for ses in $SESSIONS; do
+ # Get information
+ loginctl show-session "$ses" > "$TMP"
+ NAME=$(grep '^Name=' "$TMP" | cut -c 6-)
+ [ -z "$NAME" ] && continue # No name - should not happen
+ export DISPLAY=$(grep '^Display=' "$TMP" | cut -c 9-)
+ # X11
+ if [ -n "$DISPLAY" ]; then
+ # Seems to be x11
+ IDLE=
+ export XAUTHORITY=$(ps a | grep " $DISPLAY " | grep -o -- '-auth.*$' | grep -m1 -v grep | awk '{print $2}')
+ [ -n "$XAUTHORITY" ] && [ -f "$XAUTHORITY" ] && IDLE=$(xprintidle)
+ # Now that we have DISPLAY and XAUTHORITY set, xprintidle should work
+ if [ -z "$IDLE" ]; then
+ # Try user's xauth
+ USRHOME=$(/usr/bin/getent passwd "$NAME" | awk -F ':' '{print $6}')
+ export XAUTHORITY="$USRHOME/.Xauthority"
+ [ -f "$XAUTHORITY" ] && IDLE=$(xprintidle)
+ fi
+ if [ -n "$IDLE" ]; then
+ IDLE=$(( $IDLE / 1000 ))
+ if [ -z "$IDLE" ] || [ "$IDLE" -lt "$SLX_LOGOUT_TIMEOUT" ]; then
+ IS_IDLE=no
+ else
+ loginctl terminate-session "$ses"
+ fi
+ else # xprintidle did not work
+ IS_IDLE=no
+ fi
+ continue # Done with this session, skip normal tty/ssh checks
+ fi
+ # end X11
+ # other sessions
+ IDLE=$(grep '^IdleSinceHint=' "$TMP" | cut -c 15-)
+ if [ "${#IDLE}" -lt 7 ]; then # wah wah waaaah
+ IS_IDLE=no
+ continue
+ fi
+ # divide by 1000000 by chopping of last 6 chars - number might be too large for $(( ))
+ IDLE=$(echo "$IDLE" | cut -c "-$(( ${#IDLE} - 6 ))")
+ [ "$IDLE" -gt "$NOW" ] && IDLE="$NOW"
+ IDLE=$(( $NOW - $IDLE ))
+ if [ "$IDLE" -lt "$SLX_LOGOUT_TIMEOUT" ]; then
+ IS_IDLE=no
+ else
+ loginctl terminate-session "$ses"
+ fi
+ # end other sessions
+ done
+ rm -f -- "$TMP"
+ fi
+ if [ "$IS_IDLE" = "yes" ]; then
+ [ ! -e "$IDLEHINT" ] && echo "$NOW" > "$IDLEHINT"
+ else
+ rm -f -- "$IDLEHINT"
+ fi
+else
+ # No logout timeout is set, take shortcut for shutdown timeout (if set)
+ if [ -n "$SLX_SHUTDOWN_TIMEOUT" ]; then
+ SESSIONS=$(loginctl | wc -l)
+ if [ "$SESSIONS" = "0" ]; then
+ [ ! -e "$IDLEHINT" ] && echo "$NOW" > "$IDLEHINT"
+ else
+ rm -f -- "$IDLEHINT"
+ fi
+ fi
+fi
+
+#
+# 2) Check for no-session-shutdown timeout
+#
+if [ -n "${SLX_SHUTDOWN_TIMEOUT}" ] && [ "${SLX_SHUTDOWN_TIMEOUT}" -gt 0 ] && [ -e "$IDLEHINT" ]; then
+ IDLE=$(cat "$IDLEHINT")
+ [ "$IDLE" -gt "$NOW" ] && IDLE="$NOW"
+ IDLE=$(( $NOW - $IDLE ))
+ if [ "$IDLE" -gt "$SLX_SHUTDOWN_TIMEOUT" ]; then
+ poweroff
+ fi
+fi
+
+#
+# 3) Check for hard scheduled shutdown
+#
+# A cron file is created dynamically here so there's everything
+# in one module and you don't need to repack config.tgz
+
+invalid_time ()
+{
+ slxlog "idleaction-schedule" "Invalid shutdown time: '$time'. Expected HH:MM format."
+ return 0
+}
+
+if [ -n "$SLX_SHUTDOWN_SCHEDULE" -o -n "$SLX_REBOOT_SCHEDULE" ] && [ ! -e "$CRONFILE" ]; then
+ echo "# OpenSLX: Trigger poweroff at certain time of day" > "$CRONFILE"
+ echo "SHELL=/bin/ash" >> "$CRONFILE"
+ echo "PATH=/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin" >> "$CRONFILE"
+ echo "" >> "$CRONFILE"
+ for time in $SLX_SHUTDOWN_SCHEDULE; do
+ HOUR=${time%%:*}
+ MINUTE=${time##*:}
+ [ -z "$HOUR$MINUTE" ] && invalid_time && continue
+ [ "$HOUR" -lt 0 -o "$HOUR" -gt 23 ] && invalid_time && continue
+ [ "$MINUTE" -lt 0 -o "$MINUTE" -gt 59 ] && invalid_time && continue
+ echo "$MINUTE $HOUR * * * root /opt/openslx/scripts/idleaction-scheduled_action poweroff" >> "$CRONFILE"
+ done
+ # do it again for SLX_REBOOT_SCHEDULE
+ for time in $SLX_REBOOT_SCHEDULE; do
+ HOUR=${time%%:*}
+ MINUTE=${time##*:}
+ [ -z "$HOUR$MINUTE" ] && invalid_time && continue
+ [ "$HOUR" -lt 0 -o "$HOUR" -gt 23 ] && invalid_time && continue
+ [ "$MINUTE" -lt 0 -o "$MINUTE" -gt 59 ] && invalid_time && continue
+ echo "$MINUTE $HOUR * * * root /opt/openslx/scripts/idleaction-scheduled_action reboot" >> "$CRONFILE"
+ done
+ touch "/etc/cron.d" # Aufs bug where it won't update dir mtime when creating the file within
+fi
+
diff --git a/core/modules/idleaction/data/opt/openslx/scripts/idleaction-scheduled_action b/core/modules/idleaction/data/opt/openslx/scripts/idleaction-scheduled_action
new file mode 100755
index 00000000..6ef6969c
--- /dev/null
+++ b/core/modules/idleaction/data/opt/openslx/scripts/idleaction-scheduled_action
@@ -0,0 +1,77 @@
+#!/bin/ash
+
+if [ "$(whoami)" != "root" ]; then
+ echo "Only root can call this"
+ exit 1
+fi
+
+if [ $# -ne 1 ]; then
+ echo "$0 <reboot|poweroff>"
+ exit 1
+fi
+
+MODE=$1
+
+if [ "$MODE" != "reboot" ] && [ "$MODE" != "poweroff" ]; then
+ slxlog "idleaction-failed-call" "Invalid call to idleaction-scheduled_action. Mode '$MODE' unknown."
+ exit 1
+fi
+
+NUM=$(who | wc -l)
+[ "$NUM" = "0" ] && $MODE # Easy way out - machine is idle
+
+# Someone logged in
+for MINUTES in 5 X X X X X X X 3 X X X 2 X X X 1 X X X; do
+ NUM=$(who | wc -l)
+ [ "$NUM" = "0" ] && break
+ if [ "$MINUTES" != "X" ]; then
+ USERS=0
+ if [ "$MODE" = "reboot" ]; then
+ MESSAGE="Das System wird in $MINUTES Minute(n) neugestartet, bitte beenden Sie Ihre Sitzung.
+The system will reboot in $MINUTES minute(s). Please save your work and end the session."
+ else
+ MESSAGE="Dieser Rechner wird in $MINUTES Minute(n) abgeschaltet, bitte beenden Sie Ihre Sitzung.
+The system will power off in $MINUTES minute(s). Please save your work and end the session."
+ fi
+ for d in $(who | awk '{print $2}' | sort -u); do
+ if [ "${d:0:1}" = ":" ]; then
+ # X11
+ export DISPLAY=$d
+ export XAUTHORITY=$(ps a | grep " $DISPLAY " | grep -o -- '-auth.*$' | grep -m1 -v grep | awk '{print $2}')
+ # TODO: Don't look... We need to pick a proper util for this
+ /opt/openslx/cups/printergui --error "$MESSAGE" &
+ unset DISPLAY XAUTHORITY
+ USERS=$(( $USERS + 1 ))
+ elif [ "${d:0:3}" = "tty" ]; then
+ # Regular tty
+ cat > "/dev/$d" <<-EOF
+ *
+ ***************************
+ $MESSAGE
+ ***************************
+ *
+ EOF
+ USERS=$(( $USERS + 1 ))
+ elif [ "${d:0:3}" = "pts" ]; then
+ # pts - xterm or ssh session
+ cat > "/dev/pts/${d:3}" <<-EOF
+ *
+ ***************************
+ $MESSAGE
+ ***************************
+ *
+ EOF
+ USERS=$(( $USERS + 1 ))
+ fi
+ done
+ FILE=$(mktemp)
+ who > "$FILE"
+ slxlog "idleaction-busy" "Postponed $MODE ($MINUTES minutes max.) - $USERS user(s) still active"
+ sleep 1
+ rm -- "$FILE"
+ fi
+ sleep 15
+done
+
+$MODE
+
diff --git a/core/modules/idleaction/module.build b/core/modules/idleaction/module.build
new file mode 100644
index 00000000..1b740aa1
--- /dev/null
+++ b/core/modules/idleaction/module.build
@@ -0,0 +1,16 @@
+fetch_source() {
+ :
+}
+
+build() {
+ # We ship xprintidle's source as suse doesn't have it in one of the default repos
+ # and its just too tiny to do anything fancy like fetching source from somewhere
+ mkdir -p "$MODULE_BUILD_DIR/opt/openslx/bin"
+ gcc -o "$MODULE_BUILD_DIR/opt/openslx/bin/xprintidle" "$MODULE_DIR/xprintidle.c" -lX11 -lXss -lXext \
+ || perror "Compilation of xprintidle failed!"
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/idleaction/module.conf b/core/modules/idleaction/module.conf
new file mode 100644
index 00000000..1661735b
--- /dev/null
+++ b/core/modules/idleaction/module.conf
@@ -0,0 +1,4 @@
+REQUIRED_BINARIES="
+ xprintidle
+"
+
diff --git a/core/modules/idleaction/module.conf.centos b/core/modules/idleaction/module.conf.centos
new file mode 100644
index 00000000..d368cbd8
--- /dev/null
+++ b/core/modules/idleaction/module.conf.centos
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libX11-devel
+ libXScrnSaver-devel
+ xorg-x11-proto-devel
+"
+
diff --git a/core/modules/idleaction/module.conf.debian b/core/modules/idleaction/module.conf.debian
new file mode 100644
index 00000000..0dad2e48
--- /dev/null
+++ b/core/modules/idleaction/module.conf.debian
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libx11-dev
+ libxss-dev
+ x11proto-scrnsaver-dev
+"
+
diff --git a/core/modules/idleaction/module.conf.fedora b/core/modules/idleaction/module.conf.fedora
new file mode 100644
index 00000000..d368cbd8
--- /dev/null
+++ b/core/modules/idleaction/module.conf.fedora
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libX11-devel
+ libXScrnSaver-devel
+ xorg-x11-proto-devel
+"
+
diff --git a/core/modules/idleaction/module.conf.opensuse b/core/modules/idleaction/module.conf.opensuse
new file mode 100644
index 00000000..d368cbd8
--- /dev/null
+++ b/core/modules/idleaction/module.conf.opensuse
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libX11-devel
+ libXScrnSaver-devel
+ xorg-x11-proto-devel
+"
+
diff --git a/core/modules/idleaction/module.conf.ubuntu b/core/modules/idleaction/module.conf.ubuntu
new file mode 100644
index 00000000..0dad2e48
--- /dev/null
+++ b/core/modules/idleaction/module.conf.ubuntu
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libx11-dev
+ libxss-dev
+ x11proto-scrnsaver-dev
+"
+
diff --git a/core/modules/idleaction/xprintidle.c b/core/modules/idleaction/xprintidle.c
new file mode 100644
index 00000000..7fc62486
--- /dev/null
+++ b/core/modules/idleaction/xprintidle.c
@@ -0,0 +1,136 @@
+/*
+
+This program prints the "idle time" of the user to stdout. The "idle
+time" is the number of milliseconds since input was received on any
+input device. If unsuccessful, the program prints a message to stderr
+and exits with a non-zero exit code.
+
+Copyright (c) 2005, 2008 Magnus Henoch <henoch@dtek.chalmers.se>
+Copyright (c) 2006, 2007 by Danny Kukawka
+ <dkukawka@suse.de>, <danny.kukawka@web.de>
+Copyright (c) 2008 Eivind Magnus Hvidevold <hvidevold@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of version 2 of the GNU General Public License
+as published by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the
+Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+The function workaroundCreepyXServer was adapted from kpowersave-0.7.3 by
+Eivind Magnus Hvidevold <hvidevold@gmail.com>. kpowersave is licensed under
+the GNU GPL, version 2 _only_.
+
+*/
+
+#include <X11/Xlib.h>
+#include <X11/extensions/dpms.h>
+#include <X11/extensions/scrnsaver.h>
+#include <stdio.h>
+
+void usage(char *name);
+unsigned long workaroundCreepyXServer(Display *dpy, unsigned long _idleTime );
+
+int main(int argc, char *argv[])
+{
+ XScreenSaverInfo ssi;
+ Display *dpy;
+ int event_basep, error_basep;
+
+ if (argc != 1) {
+ usage(argv[0]);
+ return 1;
+ }
+
+ dpy = XOpenDisplay(NULL);
+ if (dpy == NULL) {
+ fprintf(stderr, "couldn't open display\n");
+ return 1;
+ }
+
+ if (!XScreenSaverQueryExtension(dpy, &event_basep, &error_basep)) {
+ fprintf(stderr, "screen saver extension not supported\n");
+ return 1;
+ }
+
+ if (!XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), &ssi)) {
+ fprintf(stderr, "couldn't query screen saver info\n");
+ return 1;
+ }
+
+ printf("%lu\n", workaroundCreepyXServer(dpy, ssi.idle));
+
+ XCloseDisplay(dpy);
+ return 0;
+}
+
+void usage(char *name)
+{
+ fprintf(stderr,
+ "Usage:\n"
+ "%s\n"
+ "That is, no command line arguments. The user's idle time\n"
+ "in milliseconds is printed on stdout.\n",
+ name);
+}
+
+/*!
+ * This function works around an XServer idleTime bug in the
+ * XScreenSaverExtension if dpms is running. In this case the current
+ * dpms-state time is always subtracted from the current idletime.
+ * This means: XScreenSaverInfo->idle is not the time since the last
+ * user activity, as descriped in the header file of the extension.
+ * This result in SUSE bug # and sf.net bug #. The bug in the XServer itself
+ * is reported at https://bugs.freedesktop.org/buglist.cgi?quicksearch=6439.
+ *
+ * Workaround: Check if if XServer is in a dpms state, check the
+ * current timeout for this state and add this value to
+ * the current idle time and return.
+ *
+ * \param _idleTime a unsigned long value with the current idletime from
+ * XScreenSaverInfo->idle
+ * \return a unsigned long with the corrected idletime
+ */
+unsigned long workaroundCreepyXServer(Display *dpy, unsigned long _idleTime ){
+ int dummy;
+ CARD16 standby, suspend, off;
+ CARD16 state;
+ BOOL onoff;
+
+ if (DPMSQueryExtension(dpy, &dummy, &dummy)) {
+ if (DPMSCapable(dpy)) {
+ DPMSGetTimeouts(dpy, &standby, &suspend, &off);
+ DPMSInfo(dpy, &state, &onoff);
+
+ if (onoff) {
+ switch (state) {
+ case DPMSModeStandby:
+ /* this check is a littlebit paranoid, but be sure */
+ if (_idleTime < (unsigned) (standby * 1000))
+ _idleTime += (standby * 1000);
+ break;
+ case DPMSModeSuspend:
+ if (_idleTime < (unsigned) ((suspend + standby) * 1000))
+ _idleTime += ((suspend + standby) * 1000);
+ break;
+ case DPMSModeOff:
+ if (_idleTime < (unsigned) ((off + suspend + standby) * 1000))
+ _idleTime += ((off + suspend + standby) * 1000);
+ break;
+ case DPMSModeOn:
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ return _idleTime;
+}
diff --git a/core/modules/iptables-helper/data/etc/systemd/system/basic.target.wants/openslx-iptables.service b/core/modules/iptables-helper/data/etc/systemd/system/basic.target.wants/openslx-iptables.service
new file mode 120000
index 00000000..40213361
--- /dev/null
+++ b/core/modules/iptables-helper/data/etc/systemd/system/basic.target.wants/openslx-iptables.service
@@ -0,0 +1 @@
+../openslx-iptables.service \ No newline at end of file
diff --git a/core/modules/iptables-helper/data/etc/systemd/system/openslx-iptables.service b/core/modules/iptables-helper/data/etc/systemd/system/openslx-iptables.service
new file mode 100644
index 00000000..ef88cf69
--- /dev/null
+++ b/core/modules/iptables-helper/data/etc/systemd/system/openslx-iptables.service
@@ -0,0 +1,6 @@
+[Unit]
+Description=OpenSLX iptables helper
+
+[Service]
+ExecStart=/opt/openslx/iptables/iptables-reloader
+
diff --git a/core/modules/iptables-helper/data/opt/openslx/iptables/iptables-reloader b/core/modules/iptables-helper/data/opt/openslx/iptables/iptables-reloader
new file mode 100755
index 00000000..60ca1e2c
--- /dev/null
+++ b/core/modules/iptables-helper/data/opt/openslx/iptables/iptables-reloader
@@ -0,0 +1,5 @@
+#!/bin/ash
+
+/opt/openslx/iptables/iptables-reloader-worker
+exec /opt/openslx/sbin/inotifyd /opt/openslx/iptables/iptables-reloader-worker /opt/openslx/iptables/rules.d:cndmy
+
diff --git a/core/modules/iptables-helper/data/opt/openslx/iptables/iptables-reloader-worker b/core/modules/iptables-helper/data/opt/openslx/iptables/iptables-reloader-worker
new file mode 100755
index 00000000..43e35eca
--- /dev/null
+++ b/core/modules/iptables-helper/data/opt/openslx/iptables/iptables-reloader-worker
@@ -0,0 +1,112 @@
+#!/bin/ash
+
+# Reloads iptables rules by flushing the tables and applying everything
+# in /opt/openslx/iptables/rules.d again. Actions are delayed by 5 seconds
+# to coalesce changes, since inotifyd can trigger dozens of events in a row.
+#
+# This scriptis triggered by inotifyd, see openslx-iptables_reloader.service
+
+ALL_RULES="/run/iptables-reloader.cache"
+LOCK="/run/iptables-reloader.lock"
+
+# Expects $1 to be the contents of $LOCK
+reload_rules () {
+ if [ -z "$1" -o ! -s "$LOCK" ]; then
+ echo "'$1' empty or lock non-existent"
+ exit 0
+ fi
+ sleep 2
+ if [ "x$(cat "$LOCK")" != "x$1" ]; then
+ echo "Wrong lock, lost race"
+ exit 0
+ fi
+
+ rm -f -- "${ALL_RULES}.new"
+
+ for file in /opt/openslx/iptables/rules.d/*; do
+ [ -f "$file" ] || continue
+ cat "$file" >> "${ALL_RULES}.new"
+ done
+
+ # No change? Do nothing...
+ [ -s "${ALL_RULES}" -a -s "${ALL_RULES}.new" ] && diff "${ALL_RULES}" "${ALL_RULES}.new" && exit 0
+
+ # Reset
+ # Filter
+ for chain in INPUT FORWARD OUTPUT; do
+ iptables -w -t filter -P "$chain" ACCEPT
+ iptables -w -t filter -N "ipt-helper-$chain" 2>/dev/null
+ iptables -w -t filter -F "ipt-helper-$chain"
+ iptables -w -t filter -D "$chain" -j "ipt-helper-$chain" 2>/dev/null # make sure it's number one
+ iptables -w -t filter -I "$chain" 1 -j "ipt-helper-$chain"
+ done
+ # NAT
+ for chain in INPUT OUTPUT PREROUTING POSTROUTING; do
+ iptables -w -t nat -P "$chain" ACCEPT
+ iptables -w -t nat -N "ipt-helper-$chain" 2>/dev/null
+ iptables -w -t nat -F "ipt-helper-$chain"
+ iptables -w -t nat -D "$chain" -j "ipt-helper-$chain" 2>/dev/null # make sure it's number one
+ iptables -w -t nat -I "$chain" 1 -j "ipt-helper-$chain"
+ done
+ # Mangle
+ for chain in INPUT FORWARD OUTPUT PREROUTING POSTROUTING; do
+ iptables -w -t mangle -P "$chain" ACCEPT
+ iptables -w -t mangle -N "ipt-helper-$chain" 2>/dev/null
+ iptables -w -t mangle -F "ipt-helper-$chain"
+ iptables -w -t mangle -D "$chain" -j "ipt-helper-$chain" 2>/dev/null # make sure it's number one
+ iptables -w -t mangle -I "$chain" 1 -j "ipt-helper-$chain"
+ done
+
+ # Apply
+ local LOGFILE=$(mktemp)
+ local DISABLED="/opt/openslx/iptables/rules.d/disabled/"
+ for file in /opt/openslx/iptables/rules.d/*; do
+ [ -f "$file" ] || continue
+ if [ ! -x "$file" ]; then
+ slxlog "firewall-script-exec" "The firewall script '$file' is not executable (+x), moving to disabled/"
+ mkdir -p "$DISABLED"
+ mv "$file" "$DISABLED"
+ continue
+ fi
+ # patch chain names, add "-w"
+ sed -i -r 's/ (-A|--append|-I|--insert|-D|--delete) +(PREROUTING|INPUT|FORWARD|OUTPUT|POSTROUTING) / \1 ipt-helper-\2 /g;s/iptables +-/iptables -w -/g' "$file"
+ if ! "$file" > "$LOGFILE" 2>&1; then
+ slxlog "firewall-script-apply" "The firewall script '$file' had nonzero exit code. Moving to disabled/" "$LOGFILE"
+ mkdir -p "$DISABLED"
+ mv "$file" "$DISABLED"
+ fi
+ done
+
+ # Add default rule
+ for chain in INPUT FORWARD OUTPUT; do
+ iptables -w -t filter -A "ipt-helper-$chain" -j RETURN
+ done
+ # NAT
+ for chain in INPUT OUTPUT PREROUTING POSTROUTING; do
+ iptables -w -t nat -A "ipt-helper-$chain" -j RETURN
+ done
+ # Mangle
+ for chain in INPUT FORWARD OUTPUT PREROUTING POSTROUTING; do
+ iptables -w -t mangle -A "ipt-helper-$chain" -j RETURN
+ done
+
+ # Do not just move file from above, as we sed'ed above and contents might have changed
+ rm -f -- "${ALL_RULES}.new"
+ for file in /opt/openslx/iptables/rules.d/*; do
+ [ -f "$file" ] || continue
+ cat "$file" >> "${ALL_RULES}.new"
+ done
+ mv -f -- "${ALL_RULES}.new" "${ALL_RULES}"
+
+ echo "iptables rules successfully updated."
+ rm -f -- "$LOCK"
+ exit 0
+}
+
+
+ID="$$+$RANDOM"
+echo "$ID" > "$LOCK"
+reload_rules "$ID" &
+
+exit 0
+
diff --git a/core/modules/iptables-helper/data/opt/openslx/iptables/rules.d/.placeholder b/core/modules/iptables-helper/data/opt/openslx/iptables/rules.d/.placeholder
new file mode 100644
index 00000000..11b30bcc
--- /dev/null
+++ b/core/modules/iptables-helper/data/opt/openslx/iptables/rules.d/.placeholder
@@ -0,0 +1 @@
+# Put your iptables rules here. Full command, like "iptables ...."
diff --git a/core/modules/iptables-helper/module.build b/core/modules/iptables-helper/module.build
new file mode 100644
index 00000000..d8804784
--- /dev/null
+++ b/core/modules/iptables-helper/module.build
@@ -0,0 +1,13 @@
+
+fetch_source() {
+ :
+}
+
+build() {
+ :
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/iptables-helper/module.conf b/core/modules/iptables-helper/module.conf
new file mode 100644
index 00000000..34103f5b
--- /dev/null
+++ b/core/modules/iptables-helper/module.conf
@@ -0,0 +1 @@
+# requires some rootfs that provies iptables
diff --git a/core/modules/kdm/data/etc/branding.svg b/core/modules/kdm/data/etc/branding.svg
new file mode 100644
index 00000000..4891fb58
--- /dev/null
+++ b/core/modules/kdm/data/etc/branding.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="149.62437"
+ height="92.827499"
+ id="svg2985"
+ xml:space="preserve">
+<metadata
+ id="metadata2991"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata>
+<g
+ id="g2993">
+</g>
+</svg> \ No newline at end of file
diff --git a/core/modules/kdm/data/etc/kde b/core/modules/kdm/data/etc/kde
new file mode 120000
index 00000000..5a94165b
--- /dev/null
+++ b/core/modules/kdm/data/etc/kde
@@ -0,0 +1 @@
+kde4 \ No newline at end of file
diff --git a/core/modules/kdm/data/etc/kde4/kdm/kdmrc b/core/modules/kdm/data/etc/kde4/kdm/kdmrc
new file mode 100644
index 00000000..5f9f9e39
--- /dev/null
+++ b/core/modules/kdm/data/etc/kde4/kdm/kdmrc
@@ -0,0 +1,52 @@
+[General]
+PidFile=/var/run/kdm.pid
+ServerVTs=-7
+# Always spawn :0 (this is the default but it won't hurt)
+StaticServers=:0
+
+[X-*-Greeter]
+UseTheme=true
+Theme=/usr/share/desktop/themes/kdm/openslx
+UseBackground=false
+GreetString=OpenSLX Workstation (%h)
+SelectedUsers=
+UserList=false
+AuthComplain=true
+AntiAliasing=true
+
+[X-:*-Greeter]
+AllowClose=false
+UseAdminSession=true
+
+[X-:0-Greeter]
+LogSource=/dev/xconsole
+PreselectUser=None
+UseAdminSession=false
+
+[X-*-Core]
+AllowRootLogin=true
+AllowShutdown=All
+AutoLoginEnable=false
+ServerAttempts=2
+# Custom directory so kdm never sees any other sessions - it's up to the vmchooser to list them
+SessionsDirs=/opt/openslx/xsessions
+TerminateServer=true
+
+# Session is executed to start the user's session (as the user)
+# "One of the keywords failsafe, default or custom, or a string to eval by a Bourne-compatible shell is passed as the first argument."
+Session=/etc/X11/Xsession
+# Reset is run after a session terminates (as root)
+Reset=/etc/X11/Xreset
+# Setup is executed once before the greeter starts (as root)
+Setup=/etc/X11/Xsetup
+# Startup is executed on successful authentication, before the session is opened (as root)
+Startup=/etc/X11/Xstartup
+
+[Shutdown]
+AllowFifo=false
+HaltCmd=/usr/bin/systemctl poweroff
+RebootCmd=/usr/bin/systemctl reboot
+
+[Xdmcp]
+Enable=false
+
diff --git a/core/modules/kdm/data/etc/systemd/system/display-manager.service b/core/modules/kdm/data/etc/systemd/system/display-manager.service
new file mode 120000
index 00000000..640910e3
--- /dev/null
+++ b/core/modules/kdm/data/etc/systemd/system/display-manager.service
@@ -0,0 +1 @@
+kdm.service \ No newline at end of file
diff --git a/core/modules/kdm/data/etc/systemd/system/kdm.service b/core/modules/kdm/data/etc/systemd/system/kdm.service
new file mode 100644
index 00000000..e77d1cbd
--- /dev/null
+++ b/core/modules/kdm/data/etc/systemd/system/kdm.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=KDM Display Manager
+Conflicts=getty@tty7.service
+After=systemd-user-sessions.service getty@tty7.service setup-slx-addon@nvidia_libs.service setup-slx-addon@vmware.service
+
+[Service]
+ExecStartPre=-/opt/openslx/bin/killall fbsplash
+ExecStart=/usr/bin/kdm -nodaemon
+Restart=always
+IgnoreSIGPIPE=no
diff --git a/core/modules/kdm/data/etc/tmpfiles.d/kdm.conf b/core/modules/kdm/data/etc/tmpfiles.d/kdm.conf
new file mode 100644
index 00000000..9b726ba2
--- /dev/null
+++ b/core/modules/kdm/data/etc/tmpfiles.d/kdm.conf
@@ -0,0 +1,2 @@
+d /var/run/kdm 0755 root root
+
diff --git a/core/modules/kdm/data/usr/share/config/kdm b/core/modules/kdm/data/usr/share/config/kdm
new file mode 120000
index 00000000..8f0c47bd
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/config/kdm
@@ -0,0 +1 @@
+/etc/kde4/kdm \ No newline at end of file
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/KdmGreeterTheme.desktop b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/KdmGreeterTheme.desktop
new file mode 100755
index 00000000..3cb9069d
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/KdmGreeterTheme.desktop
@@ -0,0 +1,8 @@
+[KdmGreeterTheme]
+Encoding=UTF-8
+Greeter=theme.xml
+Name=OpenSLX KDM theme
+Description=KDM Port of Daemonic KDM theme for FreeBSD
+Author=MJanc / KDM by aceph <aceph@ventcore.net>
+Copyright=Creative Commons
+Screenshot=screenshot.png
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/color.png b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/color.png
new file mode 100644
index 00000000..7a0feb03
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/color.png
Binary files differ
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/enter.png b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/enter.png
new file mode 100644
index 00000000..b2912721
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/enter.png
Binary files differ
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/enter_inactive.png b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/enter_inactive.png
new file mode 100644
index 00000000..c3efb2ea
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/enter_inactive.png
Binary files differ
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/environment.png b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/environment.png
new file mode 100644
index 00000000..76a4768c
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/environment.png
Binary files differ
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/main-runner.png b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/main-runner.png
new file mode 100644
index 00000000..dde10cc8
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/main-runner.png
Binary files differ
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/openslx-logo-main.png b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/openslx-logo-main.png
new file mode 100644
index 00000000..dfae62d2
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/openslx-logo-main.png
Binary files differ
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/openslx-logo.png b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/openslx-logo.png
new file mode 100644
index 00000000..a2ea7929
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/openslx-logo.png
Binary files differ
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/sessions.png b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/sessions.png
new file mode 100644
index 00000000..fa5c52bf
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/sessions.png
Binary files differ
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/sessions_inactive.png b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/sessions_inactive.png
new file mode 100644
index 00000000..d9c11d93
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/sessions_inactive.png
Binary files differ
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/system.png b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/system.png
new file mode 100644
index 00000000..6e480364
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/system.png
Binary files differ
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/system_inactive.png b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/system_inactive.png
new file mode 100644
index 00000000..28adad5a
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/system_inactive.png
Binary files differ
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/theme.xml b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/theme.xml
new file mode 100644
index 00000000..8b4ca0f9
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/theme.xml
@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE greeter SYSTEM "greeter.dtd">
+<!--
+KDM-OpenSLX-Theme
+-->
+<greeter id="theme">
+ <style font="Sans 11" window-text-color="#f0f0f0" base-color="#f0f0f0" text-color="#000000"/>
+
+ <!-- background -->
+ <item type="pixmap" id="background" background="true">
+ <normal file="color.png"/>
+ <pos x="0" y="0" width="100%" height="100%"/>
+ </item>
+
+ <!-- top / welcome, clock and big logo -->
+ <item type="rect" id="top" background="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="n" x="50%" y="0" width="100%" height="40%"/>
+ <box orientation="vertical" homogeneous="true">
+
+ <item type="pixmap" background="true">
+ <normal file="welcome-time-shadowed.png"/>
+ <pos anchor="n" x="50%" y="0" width="80%" height="44"/>
+ <box orientation="horizontal" homogeneous="true">
+ <!-- Welcome on ... -->
+ <item type="label" background="true">
+ <pos anchor="w" x="10%" y="30%"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <stock type="welcome-label"/>
+ </item>
+ <!-- clock -->
+ <item type="label" id="clock">
+ <pos anchor="e" x="90%" y="30%"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <text>%c</text>
+ </item>
+ </box>
+ </item>
+
+ <item type="rect" id="logo">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="10%" width="100%" height="100%"/>
+ <box orientation="vertical" homogeneous="true">
+ <item type="pixmap">
+ <normal file="openslx-logo-main.png"/>
+ <pos anchor="c" x="50%" y="50%"/>
+ </item>
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ <!-- main part / login, session, menu, ... -->
+ <item type="pixmap" id="main-runner" background="true">
+ <normal file="main-runner.png"/>
+ <pos anchor="c" x="50%" y="50%" width="100%" height="160"/>
+ <box orientation="horizontal" homogeneous="true">
+
+ <item type="rect" background="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="w" x="0%" y="50%" width="100%" height="100%"/>
+ <box orientation="horizontal" homogeneous="true">
+
+ <!-- left part / login -->
+ <item type="rect" background="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="w" x="0" y="50%" width="100%" height="100%"/>
+ <box orientation="horizontal">
+
+ <!-- small logo -->
+ <item type="pixmap" background="true">
+ <normal file="openslx-logo.png"/>
+ <pos anchor="w" x="30" y="50%"/>
+ </item>
+
+ <!-- login -->
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="w" x="70" y="50%" width="box" height="box"/>
+ <box orientation="horizontal" spacing="10">
+
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="sw" x="0" y="100%" width="box" height="100%"/>
+ <box homogeneous="true" spacing="10">
+ <!-- username-label -->
+ <item type="label">
+ <pos anchor="nw" x="0" y="0"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <stock type="username-label"/>
+ </item>
+ <!-- password-label -->
+ <item type="label">
+ <pos anchor="sw" x="0" y="-0"/>
+ <normal color="#f0f0f0" font="Sans 11"/>
+ <stock type="password-label"/>
+ </item>
+ </box>
+ </item>
+
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="nw" x="0" y="0" width="box" height="box"/>
+ <box homogeneous="true" spacing="10">
+ <!-- username-entry -->
+ <item type="entry" id="user-entry">
+ <pos anchor="w" x="0" y="50%" height="20" width="100"/>
+ </item>
+ <!-- password-entry -->
+ <item type="entry" id="pw-entry">
+ <pos anchor="w" x="0" y="50%" height="20" width="100"/>
+ </item>
+ </box>
+ </item>
+
+ <item type="pixmap" button="true" id="login_button">
+ <pos anchor="sw" x="0" y="-0" height="20" width="20"/>
+ <normal file="enter_inactive.png"/>
+ <prelight file="enter.png"/>
+ </item>
+
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ <!-- middle part / errors, caps info, kdm logo -->
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="50%" width="90%" height="100%"/>
+ <box orientation="vertical">
+
+ <!-- Login-Error -->
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="n" x="50%" y="10" width="100%" height="30"/>
+ <box>
+ <item type="label" id="pam-error">
+ <normal color="#ff8b00" font="Sans 11"/>
+ <pos anchor="c" x="50%" y="15"/>
+ <text/>
+ </item>
+ </box>
+ </item>
+
+ <item type="pixmap">
+ <normal file="environment.png"/>
+ <pos anchor="c" x="50%" y="50%"/>
+ </item>
+
+ <!-- capslock-warning -->
+ <item type="rect" id="caps-lock-warning">
+ <normal color="#000000" alpha="0.4"/>
+ <pos anchor="s" x="50%" y="-10" width="100%" height="30"/>
+ <box>
+ <item type="label">
+ <normal color="#ff8b00" font="Sans 11"/>
+ <pos anchor="c" x="50%" y="15"/>
+ <stock type="caps-lock-warning"/>
+ </item>
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ <!-- right part / sessions, menu -->
+ <item type="rect">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="e" x="100%" y="50%" width="100%" height="100%"/>
+ <box orientation="vertical" homogeneous="true" spacing="10">
+
+ <!-- session-button -->
+ <item type="rect" id="session_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="se" x="-50" y="100%" width="box" height="box"/>
+ <box orientation="horizontal">
+ <item type="label">
+ <normal color="#bbbbbb" font="Sans 11"/>
+ <prelight color="#f0f0f0" font="Sans 11"/>
+ <active color="#ff8b00" font="Sans 11"/>
+ <pos anchor="e" x="100%" y="-24"/>
+ <stock type="session"/>
+ </item>
+ <item type="rect" id="session_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="50%" width="10"/>
+ </item>
+ <item type="pixmap" id="session_button" button="true">
+ <normal file="sessions_inactive.png"/>
+ <prelight file="sessions.png"/>
+ <pos anchor="se" x="100%" y="100%"/>
+ </item>
+ </box>
+ </item>
+
+ <!-- menu-button -->
+ <item type="rect" id="system_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="ne" x="-50" y="0" width="box" height="box"/>
+ <box orientation="horizontal">
+ <item type="label">
+ <normal color="#bbbbbb" font="Sans 11"/>
+ <prelight color="#f0f0f0" font="Sans 11"/>
+ <active color="#ff8b00" font="Sans 11"/>
+ <pos anchor="e" x="100%" y="24"/>
+ <stock type="system"/>
+ </item>
+ <item type="rect" id="system_button" button="true">
+ <normal color="#000000" alpha="0.0"/>
+ <pos anchor="c" x="50%" y="50%" width="10"/>
+ </item>
+ <item type="pixmap" id="system_button" button="true">
+ <normal file="system_inactive.png"/>
+ <prelight file="system.png"/>
+ <pos anchor="ne" x="100%" y="0%"/>
+ </item>
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ </box>
+ </item>
+
+ </box>
+ </item>
+ <item type="pixmap" id="distro_logo" button="false">
+ <normal file="/etc/distro.png"/>
+ <pos anchor="se" x="99%" y="99%"/>
+ </item>
+</greeter>
diff --git a/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/welcome-time-shadowed.png b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/welcome-time-shadowed.png
new file mode 100644
index 00000000..d908972e
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/desktop/themes/kdm/openslx/welcome-time-shadowed.png
Binary files differ
diff --git a/core/modules/kdm/data/usr/share/kde4/config/kdm b/core/modules/kdm/data/usr/share/kde4/config/kdm
new file mode 120000
index 00000000..8f0c47bd
--- /dev/null
+++ b/core/modules/kdm/data/usr/share/kde4/config/kdm
@@ -0,0 +1 @@
+/etc/kde4/kdm \ No newline at end of file
diff --git a/core/modules/kdm/data/var/lib/kdm/.placeholder b/core/modules/kdm/data/var/lib/kdm/.placeholder
new file mode 100644
index 00000000..778fd62b
--- /dev/null
+++ b/core/modules/kdm/data/var/lib/kdm/.placeholder
@@ -0,0 +1 @@
+# Nothing to see here, just fooling git a bit
diff --git a/core/modules/kdm/module.build b/core/modules/kdm/module.build
new file mode 100644
index 00000000..d5199340
--- /dev/null
+++ b/core/modules/kdm/module.build
@@ -0,0 +1,19 @@
+
+fetch_source () {
+ :
+}
+
+build () {
+ COPYLIST="list_dpkg_output"
+ [ -e "${COPYLIST}" ] && rm "${COPYLIST}"
+
+ list_packet_files >> "${COPYLIST}"
+ tarcopy "$(cat "${COPYLIST}" | sort -u)" "${MODULE_BUILD_DIR}"
+}
+
+post_copy() {
+ # copy required icons
+ # TODO: Why here? gtk <-> kdm?
+ gtk-update-icon-cache-3.0 "${TARGET_BUILD_DIR}/usr/share/icons/oxygen/" || pwarning "update-icon-cache-3.0 failed."
+}
+
diff --git a/core/modules/kdm/module.conf b/core/modules/kdm/module.conf
new file mode 100644
index 00000000..2778a2bc
--- /dev/null
+++ b/core/modules/kdm/module.conf
@@ -0,0 +1,20 @@
+REQUIRED_BINARIES=""
+REQUIRED_FILES=""
+REQUIRED_DIRECTORIES="
+ /usr/bin
+ /usr/share/dbus-1
+ /usr/share/polkit-1
+ /usr/share/kde4/services
+ /etc/dbus-1
+"
+REQUIRED_LIBRARIES=""
+# non-standard vars
+REQUIRED_SYSTEM_FILES="
+ /usr/share/icons/oxygen/16x16/actions/system-reboot.png
+ /usr/share/icons/oxygen/16x16/actions/system-shutdown.png
+ /usr/share/icons/oxygen/16x16/actions/dialog-cancel.png
+ /usr/share/icons/oxygen/index.theme
+ /usr/share/icons/default.kde4/index.theme
+"
+# Ignore these libs even if output by ldd
+REQUIRED_LDD_BLACKLIST="\|libQtWebKit\|libGL"
diff --git a/core/modules/kdm/module.conf.debian b/core/modules/kdm/module.conf.debian
new file mode 100644
index 00000000..2b1ca00d
--- /dev/null
+++ b/core/modules/kdm/module.conf.debian
@@ -0,0 +1,29 @@
+REQUIRED_INSTALLED_PACKAGES="
+ kdm
+ kde-workspace-kgreet-plugins
+ ttf-dejavu
+"
+REQUIRED_CONTENT_PACKAGES="
+ kdm
+ kde-workspace-kgreet-plugins
+ libicu52
+ libxcursor1
+ libxrandr2
+ libxfixes3
+ libxinerama1
+ libxi6
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib
+ /etc/pam.d
+ /etc/logrotate.d
+ /etc/insserv.conf.d
+ /etc/kde4/kdm
+"
+# non-standard vars
+REQUIRED_SYSTEM_FILES+="
+ /usr/share/kde4/apps/kdm/pics/shutdown.png
+ /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf
+ /usr/share/icons/default/index.theme
+"
+
diff --git a/core/modules/kdm/module.conf.fedora b/core/modules/kdm/module.conf.fedora
new file mode 100644
index 00000000..59bfacb7
--- /dev/null
+++ b/core/modules/kdm/module.conf.fedora
@@ -0,0 +1,26 @@
+REQUIRED_INSTALLED_PACKAGES="
+ kdm
+ kgreeter-plugins
+ oxygen-icon-theme
+"
+REQUIRED_CONTENT_PACKAGES="
+ kdm
+ kgreeter-plugins
+"
+REQUIRED_BINARIES=""
+REQUIRED_DIRECTORIES="
+ /usr/bin
+ /usr/share/kde4/services
+ /usr/$LIB64/kde4
+ /usr/libexec/kde4
+"
+REQUIRED_FILES=""
+REQUIRED_LIBRARIES=""
+#non-standard vars
+REQUIRED_SYSTEM_FILES="
+ /usr/share/icons/oxygen/16x16/actions/system-reboot.png
+ /usr/share/icons/oxygen/16x16/actions/system-shutdown.png
+ /usr/share/icons/oxygen/16x16/actions/dialog-cancel.png
+ /usr/share/icons/oxygen/index.theme
+"
+
diff --git a/core/modules/kdm/module.conf.opensuse b/core/modules/kdm/module.conf.opensuse
new file mode 100644
index 00000000..832baf9c
--- /dev/null
+++ b/core/modules/kdm/module.conf.opensuse
@@ -0,0 +1,10 @@
+REQUIRED_INSTALLED_PACKAGES="
+ kdm
+"
+REQUIRED_CONTENT_PACKAGES="
+ kdm
+ kde4-kgreeter-plugins
+"
+REQUIRED_DIRECTORIES+="
+ /usr/$LIB64/kde4
+"
diff --git a/core/modules/kdm/module.conf.scientific b/core/modules/kdm/module.conf.scientific
new file mode 100644
index 00000000..d61cc8d6
--- /dev/null
+++ b/core/modules/kdm/module.conf.scientific
@@ -0,0 +1,20 @@
+REQUIRED_INSTALLED_PACKAGES="
+ kdm
+"
+REQUIRED_CONTENT_PACKAGES="
+ kdm
+"
+REQUIRED_BINARIES=""
+REQUIRED_DIRECTORIES+="
+ /usr/$LIB64/kde4
+"
+REQUIRED_FILES=""
+REQUIRED_LIBRARIES=""
+#non-standard vars
+REQUIRED_SYSTEM_FILES="
+ /usr/share/icons/oxygen/16x16/actions/system-reboot.png
+ /usr/share/icons/oxygen/16x16/actions/system-shutdown.png
+ /usr/share/icons/oxygen/16x16/actions/dialog-cancel.png
+ /usr/share/icons/oxygen/index.theme
+ /usr/share/icons/default.kde4/index.theme
+"
diff --git a/core/modules/kdm/module.conf.ubuntu b/core/modules/kdm/module.conf.ubuntu
new file mode 100644
index 00000000..660b3a1e
--- /dev/null
+++ b/core/modules/kdm/module.conf.ubuntu
@@ -0,0 +1,29 @@
+REQUIRED_INSTALLED_PACKAGES="
+ kdm
+ kde-workspace-kgreet-plugins
+"
+REQUIRED_CONTENT_PACKAGES="
+ kdm
+ kde-workspace-kgreet-plugins
+ libicu48
+ libxcursor1
+ libxrandr2
+ libxfixes3
+ libxinerama1
+ libxi6
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib
+ /etc/pam.d
+ /etc/logrotate.d
+ /etc/insserv.conf.d
+ /etc/kde4/kdm
+"
+# non-standard vars
+REQUIRED_SYSTEM_FILES+="
+ /usr/share/kde4/apps/kdm/pics/shutdown.png
+ /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf
+ /usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf
+ /usr/share/icons/default/index.theme
+"
+
diff --git a/core/modules/kdm/module.conf.ubuntu.14 b/core/modules/kdm/module.conf.ubuntu.14
new file mode 100644
index 00000000..e29f35d0
--- /dev/null
+++ b/core/modules/kdm/module.conf.ubuntu.14
@@ -0,0 +1,29 @@
+REQUIRED_INSTALLED_PACKAGES="
+ kdm
+ kde-workspace-kgreet-plugins
+"
+REQUIRED_CONTENT_PACKAGES="
+ kdm
+ kde-workspace-kgreet-plugins
+ libicu52
+ libxcursor1
+ libxrandr2
+ libxfixes3
+ libxinerama1
+ libxi6
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib
+ /etc/pam.d
+ /etc/logrotate.d
+ /etc/insserv.conf.d
+ /etc/kde4/kdm
+"
+# non-standard vars
+REQUIRED_SYSTEM_FILES+="
+ /usr/share/kde4/apps/kdm/pics/shutdown.png
+ /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf
+ /usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf
+ /usr/share/icons/default/index.theme
+"
+
diff --git a/core/modules/kernel-system/TODO b/core/modules/kernel-system/TODO
new file mode 100644
index 00000000..7665abac
--- /dev/null
+++ b/core/modules/kernel-system/TODO
@@ -0,0 +1,3 @@
+make the modules load in stage31/init since we dont know which ones are compiled within kernel and which need to be loaded explicitly
+
+Idea: do it like DRM stuff, with pci-ids.
diff --git a/core/modules/kernel-system/module.build b/core/modules/kernel-system/module.build
new file mode 100644
index 00000000..a5bd747c
--- /dev/null
+++ b/core/modules/kernel-system/module.build
@@ -0,0 +1,88 @@
+# kernel-system: Try to use the system's kernel without recompiling
+
+# overloaded get_kernel_version function from kernel.inc
+get_kernel_version(){
+ [ -z "${SYSTEM_KERNEL_LONG}" ] && perror "SYSTEM_KERNEL_LONG is not set, should be done by kernel.inc on startup. Aborting..."
+ [ -n "${TARGET_KERNEL_LONG}" ] && return
+
+ # set TARGET_KERNEL_LONG and TARGET_KERNEL_SHORT correctly
+ declare -rg TARGET_KERNEL_LONG="${SYSTEM_KERNEL_LONG}"
+ declare -rg TARGET_KERNEL_SHORT="$(echo ${SYSTEM_KERNEL_LONG} | grep -o -E '^[0-9\.]+')"
+
+ # figure out linux headers directory
+ local DIR
+ local RES=
+ for DIR in "/lib/modules/$SYSTEM_KERNEL_LONG/build" "/lib/modules/$SYSTEM_KERNEL_LONG/source" \
+ "/usr/src/linux-headers-$SYSTEM_KERNEL_LONG" "/usr/src/kernels/$SYSTEM_KERNEL_LONG"; do
+ [ -e "$DIR/include/linux/input" ] && RES=$DIR && break
+ # Sometimes the directory exists, but doesn't contain headers yet. Need a good way to
+ # figure that out. "include/linux/input" is a quick first idea that works on fedora and ubuntu. :)
+ done
+ # maybe fetch source did not install the headers correctly?
+ [ -z "$RES" ] && perror "kernel headers for $SYSTEM_KERNEL_LONG not found! Re-build the kernel-system module"
+ declare -rg KERNEL_HEADERS_DIR="$RES" 2>/dev/null
+
+ # check kernel modules/firmware directory
+ if [ -d "/lib/modules/${SYSTEM_KERNEL_LONG}" -a -d "/lib/firmware" ]; then
+ # The expected paths exists, set KERNEL_BASE_DIR to /
+ declare -rg KERNEL_BASE_DIR="/" 2>/dev/null
+ else
+ perror "Could not find kernel modules / firmware for kernel version '$SYSTEM_KERNEL_LONG'. \
+ Does '/lib/modules/$SYSTEM_KERNEL_LONG' exist?"
+ fi
+
+ # print debug info
+ pinfo "TARGET_KERNEL_LONG: '$TARGET_KERNEL_LONG'"
+ pinfo "TARGET_KERNEL_SHORT: '$TARGET_KERNEL_SHORT'"
+ pdebug "KERNEL_BASE_DIR: '$KERNEL_BASE_DIR'"
+
+}
+
+
+
+fetch_source() {
+ :
+}
+
+build() {
+
+ # simply copy the kernel from the running system
+ # to the build directory as it is.
+ local KERNEL_SYSTEM_PATH=""
+ local BOOT_IMAGE=""
+
+ # 1st "parse" /proc/cmdline for the kernel name
+ for i in $(cat /proc/cmdline); do
+ [[ "$i" == BOOT_IMAGE=* ]] && BOOT_IMAGE="$(basename "${i#BOOT_IMAGE=}")"
+ done
+ [ -z "${BOOT_IMAGE}" ] && local BOOT_IMAGE="$(uname -r)"
+
+ # exit if KERNEL_SYSTEM_FILENAME is empty, should not happen
+ [ -z "${BOOT_IMAGE}" ] && perror "Could not determine the full path to the running kernel..."
+
+ # now find it in KERNEL_SYSTEM_SEARCH_PATH
+ # NOTE: this variable should be expanded in the future if new locations are to be searched
+ local KERNEL_SYSTEM_SEARCH_PATH="/boot"
+ local KERNEL_SYSTEM_SEARCH_RESULTS="$(find "${KERNEL_SYSTEM_SEARCH_PATH}" -type f -name "${BOOT_IMAGE}")"
+
+ if [ "$(echo $KERNEL_SYSTEM_SEARCH_RESULTS|wc -w)" -eq 1 ]; then
+ # we found the running kernel path
+ KERNEL_SYSTEM_PATH="${KERNEL_SYSTEM_SEARCH_RESULTS}"
+ else
+ # we found more than one, shouldn't happen...
+ perror "Found no or more than one kernel named '${BOOT_IMAGE}' in '${KERNEL_SYSTEM_SEARCH_PATH}'."
+ fi
+
+ # at this point, we should definitly have KERNEL_SYSTEM_PATH, check just in case :)
+ [ -z "${KERNEL_SYSTEM_PATH}" ] && perror "KERNEL_SYSTEM_PATH isn't set, kernel not found. This shouldn't happen!"
+ pinfo "Live kernel path: $KERNEL_SYSTEM_PATH"
+
+ # copy kernel to build directory
+ cp "${KERNEL_SYSTEM_PATH}" "${MODULE_BUILD_DIR}/kernel" \
+ || perror "Copy of kernel failed: From '${KERNEL_SYSTEM_PATH}' to '${MODULE_BUILD_DIR}/kernel'"
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/kernel-system/module.conf b/core/modules/kernel-system/module.conf
new file mode 100644
index 00000000..0cd03752
--- /dev/null
+++ b/core/modules/kernel-system/module.conf
@@ -0,0 +1,3 @@
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/kernel-system/module.conf.fedora b/core/modules/kernel-system/module.conf.fedora
new file mode 100644
index 00000000..cf683784
--- /dev/null
+++ b/core/modules/kernel-system/module.conf.fedora
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ kernel-headers
+"
+REQUIRED_CONTENT_PACKAGES="
+ kernel-headers
+"
diff --git a/core/modules/kernel-system/module.conf.opensuse b/core/modules/kernel-system/module.conf.opensuse
new file mode 100644
index 00000000..6bfc2078
--- /dev/null
+++ b/core/modules/kernel-system/module.conf.opensuse
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ kernel-desktop-devel
+"
+REQUIRED_CONTENT_PACKAGES="
+ kernel-desktop-devel
+"
diff --git a/core/modules/kernel-system/module.conf.ubuntu b/core/modules/kernel-system/module.conf.ubuntu
new file mode 100644
index 00000000..2f2ce122
--- /dev/null
+++ b/core/modules/kernel-system/module.conf.ubuntu
@@ -0,0 +1,7 @@
+REQUIRED_INSTALLED_PACKAGES="
+ linux-headers-${SYSTEM_KERNEL_LONG}
+"
+REQUIRED_CONTENT_PACKAGES="
+ linux-headers-${SYSTEM_KERNEL_LONG}
+"
+
diff --git a/core/modules/kernel-system/patch-speaker b/core/modules/kernel-system/patch-speaker
new file mode 100755
index 00000000..5d5a9f9a
--- /dev/null
+++ b/core/modules/kernel-system/patch-speaker
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+if ! grep notes "ksrc/drivers/input/misc/pcspkr.c" > /dev/null; then
+ echo "Patching pc speaker :-)"
+ sed -i.nomusic -r 's#^static.*int.*pcspkr_event#static const int notes[] = { /*tetris*/ 1319, 988, 1047, 1175, 1047, 988, 880, 880, 1047, 1319, 1175, 1047, 988, 1047, 1175, 1319, 1047, 880, 880, 1175, 1397, 1760, 1568, 1397, 1319, 1047, 1319, 1175, 1047, 988, 988, 1047, 1175, 1319, 1047, 880, 880, /*mario*/ 660, 660, 660, 510, 660, 770, 380, 510, 380, 320, 440, 480, 450, 430, 380, 660, 760, 860, 700, 760, 660, 520, 580, 480, 510, 380, 320, 440, 480, 450, 430, 380, 660, 760, 860, 700, 760, 660, 520, 580, 480, 500, 760, 720, 680, 620, 650, 380, 430, 500, 430, 500, 570, 500, 760, 720, 680, 620, 650, 1020, 1020, 1020, 380, 500, 760, 720, 680, 620, 650, 380, 430, 500, 430, 500, 570, 500, 760, 720, 680, 620, 650, 1020, 1020, 1020, 380, 500, 760, 720, 680, 620, 650, 380, 430, 500, 430, 500, 570, 585, 550, 500, 380, 500, 500, 500, 500, 500, 500, 500, 580, 660, 500, 430, 380, 500, 500, 500, 500, 580, 660, 870, 760, 500, 500, 500, 500, 580, 660, 500, 430, 380, 660, 660, 660, 510, 660, 770, 380, /* elise */ 420, 400, 420, 400, 420, 315, 370, 335, 282, 180, 215, 282, 315, 213, 262, 315, 335, 213, 420, 400, 420, 400, 420, 315, 370, 335, 282, 180, 215, 282, 315, 213, 330, 315, 282 };\nstatic int notePos = 0;\n\n&#g;s#\s*if \(value > 20 && value < 32767\)#\n if (value) value = notes[notePos++ % (sizeof(notes) / sizeof(notes[0]))];\n\n&#g' "ksrc/drivers/input/misc/pcspkr.c"
+fi
diff --git a/core/modules/kernel-vanilla/module.build b/core/modules/kernel-vanilla/module.build
new file mode 100644
index 00000000..66906fb7
--- /dev/null
+++ b/core/modules/kernel-vanilla/module.build
@@ -0,0 +1,165 @@
+# Customized kernel from system: fetch Distro's kernel sources, patch configuration, recompile
+
+# This overrides get_kernel_version from kernel.inc, so the variables will be set properly
+get_kernel_version() {
+ # Do not use MODULE_DIR here as this function might run when we process another module!
+ [ -n "${TARGET_KERNEL_LONG}" ] && return 0
+ [ ! -e "${TARGET_DIR}/kernel/ksrc/include/generated/utsrelease.h" ] && return 0
+ # determine kernel version that will be running in the generated system
+
+ # declare kernel version stuff
+ declare -rg TARGET_KERNEL_LONG=$(grep 'UTS_RELEASE' "${TARGET_DIR}/kernel/ksrc/include/generated/utsrelease.h" | awk -F '"' '{print $2}')
+ declare -rg TARGET_KERNEL_SHORT=$(echo "$TARGET_KERNEL_LONG" | grep -o -E '^[0-9\.]+')
+
+ # declare path to kernel headers and modules/firmware
+ declare -rg KERNEL_HEADERS_DIR="${TARGET_DIR}/kernel/ksrc"
+ declare -rg KERNEL_BASE_DIR="${TARGET_DIR}/kernel/build"
+
+ # print debug info
+ pinfo "TARGET_KERNEL_LONG: '$TARGET_KERNEL_LONG'"
+ pinfo "TARGET_KERNEL_SHORT: '$TARGET_KERNEL_SHORT'"
+ pdebug "KERNEL_BASE_DIR: '$KERNEL_BASE_DIR'"
+}
+
+fetch_source() {
+ pdebug "getting kernel sources via git ...."
+ if grep -q -- "${REQUIRED_GIT}" "./ksrc/.git/config" && grep -q -- "v${REQUIRED_KERNEL}" "./ksrc/.git/config"; then
+ pinfo "Trying to update existing clone"
+ cd ksrc || perror "Could not cd to ksrc"
+ git pull || perror "Could not pull already checked out repo"
+ cd ..
+ else
+ rm -rf "./ksrc"
+ git clone --depth 1 "${REQUIRED_GIT}" -b "v${REQUIRED_KERNEL}" ksrc || perror "Could not clone kernel git."
+ fi
+ # check for aufs
+ local RSL=$(find ksrc/ -type d -name aufs)
+ if [ -z "$RSL" ]; then
+ pinfo "aufs not found in kernel sources, patching it..."
+ patch_aufs
+ else
+ pinfo "aufs detected in kernel source :)"
+ fi
+ # remember the current kernel version
+ echo "${SYSTEM_KERNEL_LONG}" > ksrc/KVERSION
+}
+
+build() {
+ local TARGET_CONFIG_FILE="openslx.config"
+ rm -f "${TARGET_CONFIG_FILE}"
+ # update config and copy to ksrc
+ pinfo "Updating kernel config..."
+ update_config
+ cp "${TARGET_CONFIG_FILE}" "ksrc/.config"
+ # make kernel with the new config
+ cd ksrc || perror "Could not cd to ksrc, was the kernel source fetched properly?"
+ pinfo "Preparing kernel for new config ('make oldconfig')."
+ if [ "x$MLTK_QUIET" = "x1" ]; then
+ yes "" | make oldconfig || perror "make oldconfig failed."
+ else
+ make oldconfig || perror "make oldconfig failed."
+ fi
+ make prepare || perror "make prepare failed."
+ make scripts || perror "make scripts failed."
+
+ pinfo "Compiling kernel... (this will take some time)"
+ # explicitly state number of cores here, as MAKEFLAGS seems to be overridden
+ make "-j$CPU_CORES" || perror "make failed."
+
+ # install modules to build directory
+ pinfo "Installing kernel modules..."
+ if [ -d "${MODULE_BUILD_DIR}/lib/modules" ]; then
+ rm -r "${MODULE_BUILD_DIR}/lib/modules" || pwarning "Could not clean old modules."
+ fi
+ make INSTALL_MOD_PATH="${MODULE_BUILD_DIR}" INSTALL_MOD_STRIP=1 modules_install || perror "make modules_install failed in ${MODULE_BUILD_DIR}."
+ cd - 2> /dev/null
+
+ # copy kernel to build
+ cp ksrc/arch/x86/boot/bzImage "${MODULE_BUILD_DIR}/kernel"
+ pinfo "Kernel was successfully built at ${MODULE_BUILD_DIR}/kernel"
+ [ -z "${KERNEL_BUILD_DIR}" ] && KERNEL_BUILD_DIR="${MODULE_BUILD_DIR}"
+}
+
+post_copy() {
+ :
+}
+
+# helper function to update the current kernel config with our parameters
+update_config() {
+
+ # first we need to update the current config
+ local BASE_CONFIG_FILE="/boot/config-$(uname -r)"
+ [ -e "${BASE_CONFIG_FILE}" ] || perror "$BASE_CONFIG_FILE could not be found! This should not happen."
+
+ # check for our wanted config parameter
+ local OPENSLX_WANTED_CONFIG="${ROOT_DIR}/data/kernel.wanted.config"
+
+ [ -e "${OPENSLX_WANTED_CONFIG}" ] || perror "$OPENSLX_WANTED_CONFIG does not exist! Please add a list of wanted kernel config parameters."
+
+ # copy basic config file
+ cp "$BASE_CONFIG_FILE" "$TARGET_CONFIG_FILE"
+
+ for WANTED_CONFIG in $(cat $OPENSLX_WANTED_CONFIG|sort -u); do
+ local CONFIG_PARAM_NAME="$(echo $WANTED_CONFIG | awk -F "=" '{print $1}')"
+ local SEARCH_RESULT="$(grep -E "^\s*$(echo "$CONFIG_PARAM_NAME" | escape_search)=" "$BASE_CONFIG_FILE")"
+
+ #echo "Process: $SEARCH_RESULT"
+ # analyse results
+ if [ "x$SEARCH_RESULT" == "x" ]; then
+ # no match, add it
+ sed -i -r "s/^\s*#.*\s$(echo "$CONFIG_PARAM_NAME" | escape_search)[^_A-Z0-9].*$//" "$TARGET_CONFIG_FILE"
+ echo "$WANTED_CONFIG" >> "$TARGET_CONFIG_FILE"
+ else
+ # match, change to our setting if they differ
+ if [ "x$SEARCH_RESULT" != "x$WANTED_CONFIG" ]; then
+ sed -i "s/$(echo "$SEARCH_RESULT" | escape_search)/$(echo "$WANTED_CONFIG" | escape_replace)/" "$TARGET_CONFIG_FILE"
+ fi
+ fi
+ done
+}
+
+# helper to patch aufs
+patch_aufs() {
+ local KERNEL_MAJOR=${REQUIRED_KERNEL%%.*}
+ local AUFS="aufs${KERNEL_MAJOR}"
+ pinfo "Cloning ${AUFS} standalone git"
+ cd "$MODULE_WORK_DIR"
+ [ -d "${AUFS}-standalone/.git" ] && rm -rf "${AUFS}-standalone" # if already there, kill it.
+ # git: --depth 1 won't work here due to later "checkout origin/branch"
+ if [ "$KERNEL_MAJOR" = "3" ]; then
+ git clone "git://aufs.git.sourceforge.net/gitroot/aufs/${AUFS}-standalone.git" || perror "Cloning ${AUFS} failed."
+ else
+ git clone "git://github.com/sfjro/${AUFS}-standalone.git" || perror "Cloning ${AUFS} failed."
+ fi
+ # get the needed version
+ [ -n "${SYSTEM_KERNEL_LONG}" ] && local NEEDED_BRANCH=$(echo $REQUIRED_KERNEL | awk -F "." '{print $1"."$2}') \
+ || perror "REQUIRED_KERNEL not set, this should not happen!"
+ pinfo "Getting branch origin/$NEEDED_BRANCH"
+ cd "$MODULE_WORK_DIR/${AUFS}-standalone" || perror "Could not CD to ${AUFS}-standalone"
+ git checkout "origin/aufs$NEEDED_BRANCH" || git checkout "origin/aufs4.x-rcN" || perror "Could not checkout needed branch."
+ pinfo "Starting to patch... $NEEDED_BRANCH"
+ tarcopy "Documentation fs" "$MODULE_WORK_DIR/ksrc"
+
+ # Quick-and-dirty aufs_type.h copying:
+ [ -e "include/linux/aufs_type.h" ] && cp "include/linux/aufs_type.h" "$MODULE_WORK_DIR/ksrc/include/linux/"
+ [ -e "include/uapi/linux/aufs_type.h" ] && cp "include/uapi/linux/aufs_type.h" "$MODULE_WORK_DIR/ksrc/include/uapi/linux/"
+
+ cd "$MODULE_WORK_DIR/ksrc" || perror "Could not CD to kernel-source dir ksrc"
+
+ local PATCH
+ # Mandatory
+ for PATCH in "${AUFS}-kbuild" "${AUFS}-base" "${AUFS}-mmap"; do
+ patch -p1 < "$MODULE_WORK_DIR/${AUFS}-standalone/${PATCH}.patch" || perror "${PATCH}.patch failed!"
+ pinfo "Applied '$MODULE_WORK_DIR/${AUFS}-standalone/${PATCH}.patch'"
+ done
+ # Optional - should we error too?
+ for PATCH in "${AUFS}-loopback" "tmpfs-idr" "vfs-ino"; do
+ [ -e "$MODULE_WORK_DIR/${AUFS}-standalone/${PATCH}.patch" ] || continue
+ patch -p1 < "$MODULE_WORK_DIR/${AUFS}-standalone/${PATCH}.patch" || pwarning "${PATCH}.patch failed!"
+ pinfo "Applied '$MODULE_WORK_DIR/${AUFS}-standalone/${PATCH}.patch'"
+ done
+ pinfo "Patched kernel source with aufs-${NEEDED_BRANCH}"
+ cd "$MODULE_WORK_DIR"
+
+}
+
diff --git a/core/modules/kernel-vanilla/module.conf b/core/modules/kernel-vanilla/module.conf
new file mode 100644
index 00000000..b615dc9b
--- /dev/null
+++ b/core/modules/kernel-vanilla/module.conf
@@ -0,0 +1,5 @@
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
+REQUIRED_KERNEL="4.3.5"
+REQUIRED_GIT="git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git"
diff --git a/core/modules/kernel/.gitignore b/core/modules/kernel/.gitignore
new file mode 100644
index 00000000..56c69270
--- /dev/null
+++ b/core/modules/kernel/.gitignore
@@ -0,0 +1,3 @@
+ksrc
+linux*
+openslx.config
diff --git a/core/modules/kernel/module.build b/core/modules/kernel/module.build
new file mode 100644
index 00000000..f2245ee0
--- /dev/null
+++ b/core/modules/kernel/module.build
@@ -0,0 +1,146 @@
+# Customized kernel from system: fetch Distro's kernel sources, patch configuration, recompile
+
+# This overrides get_kernel_version from kernel.inc, so the variables will be set properly
+get_kernel_version() {
+ # Do not use MODULE_DIR here as this function might run when we process another module!
+ [ -n "${TARGET_KERNEL_LONG}" ] && return 0
+ [ ! -e "${ROOT_DIR}/tmp/work/kernel/ksrc/include/generated/utsrelease.h" ] && return 0
+ # determine kernel version that will be running in the generated system
+
+ # declare kernel version stuff
+ declare -rg TARGET_KERNEL_LONG=$(grep 'UTS_RELEASE' "${ROOT_DIR}/tmp/work/kernel/ksrc/include/generated/utsrelease.h" | awk -F '"' '{print $2}')
+ declare -rg TARGET_KERNEL_SHORT=$(echo "$TARGET_KERNEL_LONG" | grep -o -E '^[0-9\.]+')
+
+ # declare path to kernel headers and modules/firmware
+ declare -rg KERNEL_HEADERS_DIR="${ROOT_DIR}/tmp/work/kernel/ksrc"
+ declare -rg KERNEL_BASE_DIR="${ROOT_DIR}/tmp/work/kernel/build"
+
+ # print debug info
+ pinfo "TARGET_KERNEL_LONG: '$TARGET_KERNEL_LONG'"
+ pinfo "TARGET_KERNEL_SHORT: '$TARGET_KERNEL_SHORT'"
+ pdebug "KERNEL_BASE_DIR: '$KERNEL_BASE_DIR'"
+}
+
+fetch_source() {
+ pdebug "getting kernel sources via git ...."
+ [ -d ./ksrc ] && rm -rf ./ksrc
+ git clone --depth 1 "${REQUIRED_GIT}" -b "${REQUIRED_GIT_BRANCH}" ksrc || perror "Could not clone kernel git."
+ # check for aufs
+ local RSL=$(find ksrc/ -type d -name aufs)
+ if [ -z "$RSL" ]; then
+ pinfo "aufs not found in kernel sources, patching it..."
+ patch_aufs
+ else
+ pinfo "aufs detected in kernel source :)"
+ fi
+ # remember the current kernel version
+ echo "${SYSTEM_KERNEL_LONG}" > ksrc/KVERSION
+}
+
+build() {
+ local TARGET_CONFIG_FILE="openslx.config"
+ rm -f "${TARGET_CONFIG_FILE}"
+ # update config and copy to ksrc
+ pinfo "Updating kernel config..."
+ update_config
+ cp "${TARGET_CONFIG_FILE}" "ksrc/.config"
+ # make kernel with the new config
+ cd ksrc || perror "Could not cd to ksrc, was the kernel source fetched properly?"
+ pinfo "Preparing kernel for new config ('make oldconfig')."
+ if [ "x$MLTK_QUIET" = "x1" ]; then
+ make olddefconfig || perror "make olddefconfig failed."
+ else
+ make oldconfig || perror "make oldconfig failed."
+ fi
+ make prepare || perror "make prepare failed."
+ make scripts || perror "make scripts failed."
+
+ pinfo "Compiling kernel... (this will take some time)"
+ # explicitly state number of cores here, as MAKEFLAGS seems to be overridden
+ make "-j$CPU_CORES" || perror "make failed."
+
+ # install modules to build directory
+ pinfo "Installing kernel modules..."
+ if [ -d "${MODULE_BUILD_DIR}/lib/modules" ]; then
+ rm -r "${MODULE_BUILD_DIR}/lib/modules" || pwarning "Could not clean old modules."
+ fi
+ make INSTALL_MOD_PATH="${MODULE_BUILD_DIR}" INSTALL_MOD_STRIP=1 modules_install || perror "make modules_install failed in ${MODULE_BUILD_DIR}."
+ cd - 2> /dev/null
+
+ # copy kernel to build
+ cp ksrc/arch/x86/boot/bzImage "${MODULE_BUILD_DIR}/kernel"
+ pinfo "Kernel was successfully built at ${MODULE_BUILD_DIR}/kernel"
+ [ -z "${KERNEL_BUILD_DIR}" ] && KERNEL_BUILD_DIR="${MODULE_BUILD_DIR}"
+}
+
+post_copy() {
+ :
+}
+
+# helper function to update the current kernel config with our parameters
+update_config() {
+
+ # first we need to update the current config
+ local BASE_CONFIG_FILE="/boot/config-$(uname -r)"
+ [ -e "${BASE_CONFIG_FILE}" ] || perror "$BASE_CONFIG_FILE could not be found! This should not happen."
+
+ # check for our wanted config parameter
+ local OPENSLX_WANTED_CONFIG="${ROOT_DIR}/data/kernel.wanted.config"
+
+ [ -e "${OPENSLX_WANTED_CONFIG}" ] || perror "$OPENSLX_WANTED_CONFIG does not exist! Please add a list of wanted kernel config parameters."
+
+ # copy basic config file
+ cp "$BASE_CONFIG_FILE" "$TARGET_CONFIG_FILE"
+
+ for WANTED_CONFIG in $(cat $OPENSLX_WANTED_CONFIG|sort -u); do
+ local CONFIG_PARAM_NAME="$(echo $WANTED_CONFIG | awk -F "=" '{print $1}')"
+ local SEARCH_RESULT="$(grep -E "^\s*$(echo "$CONFIG_PARAM_NAME" | escape_search)=" "$BASE_CONFIG_FILE")"
+
+ #echo "Process: $SEARCH_RESULT"
+ # analyse results
+ if [ "x$SEARCH_RESULT" == "x" ]; then
+ # no match, add it
+ sed -i -r "s/^\s*#.*\s$(echo "$CONFIG_PARAM_NAME" | escape_search)[^_A-Z0-9].*$//" "$TARGET_CONFIG_FILE"
+ echo "$WANTED_CONFIG" >> "$TARGET_CONFIG_FILE"
+ else
+ # match, change to our setting if they differ
+ if [ "x$SEARCH_RESULT" != "x$WANTED_CONFIG" ]; then
+ sed -i "s/$(echo "$SEARCH_RESULT" | escape_search)/$(echo "$WANTED_CONFIG" | escape_replace)/" "$TARGET_CONFIG_FILE"
+ fi
+ fi
+ done
+}
+
+# helper to patch aufs
+patch_aufs() {
+ pinfo "Cloning aufs3 standalone git"
+ cd "$MODULE_WORK_DIR"
+ [ -d "aufs3-standalone/.git" ] && rm -rf "aufs3-standalone" # if already there, kill it.
+ # git: --depth 1 won't work here due to later "checkout origin/branch"
+ git clone "git://aufs.git.sourceforge.net/gitroot/aufs/aufs3-standalone.git" || perror "Cloning aufs3 failed."
+ # get the needed version
+ [ ! -z ${SYSTEM_KERNEL_LONG} ] && local NEEDED_BRANCH=$(echo $SYSTEM_KERNEL_LONG | awk -F "." '{print $1"."$2}') \
+ || perror "SYSTEM_KERNEL_LONG not set, this should not happen!"
+ pinfo "Getting branch origin/$NEEDED_BRANCH"
+ cd "$MODULE_WORK_DIR/aufs3-standalone" || perror "Could not CD to aufs3-standalone"
+ git checkout "origin/aufs$NEEDED_BRANCH" || perror "Could not checkout needed branch."
+ pinfo "Starting to patch... $NEEDED_BRANCH"
+ tarcopy "Documentation fs" "$MODULE_WORK_DIR/ksrc"
+
+ # Quick-and-dirty aufs_type.h copying:
+ [ -e "include/linux/aufs_type.h" ] && cp "include/linux/aufs_type.h" "$MODULE_WORK_DIR/ksrc/include/linux/"
+ [ -e "include/uapi/linux/aufs_type.h" ] && cp "include/uapi/linux/aufs_type.h" "$MODULE_WORK_DIR/ksrc/include/uapi/linux/"
+
+ cd "$MODULE_WORK_DIR/ksrc" || perror "Could not CD to kernel-source dir ksrc"
+
+ patch -p1 < "$MODULE_WORK_DIR/aufs3-standalone/aufs3-kbuild.patch" || perror "aufs3-standalone/aufs3-kbuild.patch failed!"
+ patch -p1 < "$MODULE_WORK_DIR/aufs3-standalone/aufs3-base.patch" || perror "aufs3-standalone/aufs3-base.patch failed!"
+
+ # this following 'if' is a burning shame - caused as patching under eg. openSuse 13.1 is always unsuccessful due to hunk failing
+ if [ -f "$MODULE_WORK_DIR/aufs3-standalone/aufs3-mmap.patch" ]; then
+ patch -p1 < "$MODULE_WORK_DIR/aufs3-standalone/aufs3-mmap.patch" || pwarning "Problem patching aufs3-mmap.patch: hunks failed?"
+ fi
+ pinfo "Patched kernel source with aufs-${NEEDED_BRANCH}"
+ cd "$MODULE_WORK_DIR"
+}
+
diff --git a/core/modules/kernel/module.conf b/core/modules/kernel/module.conf
new file mode 100644
index 00000000..0cd03752
--- /dev/null
+++ b/core/modules/kernel/module.conf
@@ -0,0 +1,3 @@
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/kernel/module.conf.centos b/core/modules/kernel/module.conf.centos
new file mode 100644
index 00000000..2e958ce4
--- /dev/null
+++ b/core/modules/kernel/module.conf.centos
@@ -0,0 +1,3 @@
+REQUIRED_GIT_BRANCH="v${SYSTEM_KERNEL_SHORT%.0}"
+REQUIRED_GIT="git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git"
+
diff --git a/core/modules/kernel/module.conf.fedora b/core/modules/kernel/module.conf.fedora
new file mode 100644
index 00000000..53e6ccb6
--- /dev/null
+++ b/core/modules/kernel/module.conf.fedora
@@ -0,0 +1,3 @@
+REQUIRED_GIT_BRANCH="v${SYSTEM_KERNEL_SHORT}"
+REQUIRED_GIT="git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git"
+
diff --git a/core/modules/kernel/module.conf.opensuse b/core/modules/kernel/module.conf.opensuse
new file mode 100644
index 00000000..cdf57cc7
--- /dev/null
+++ b/core/modules/kernel/module.conf.opensuse
@@ -0,0 +1,3 @@
+REQUIRED_GIT_BRANCH="openSUSE-${SYS_VERSION}"
+REQUIRED_GIT="git://kernel.opensuse.org/kernel.git"
+
diff --git a/core/modules/kernel/module.conf.ubuntu b/core/modules/kernel/module.conf.ubuntu
new file mode 100644
index 00000000..1cab5fcd
--- /dev/null
+++ b/core/modules/kernel/module.conf.ubuntu
@@ -0,0 +1,2 @@
+REQUIRED_GIT_BRANCH="master"
+REQUIRED_GIT="git://kernel.ubuntu.com/ubuntu/ubuntu-${SYS_CODENAME}.git"
diff --git a/core/modules/kernel/module.conf.ubuntu.13.04 b/core/modules/kernel/module.conf.ubuntu.13.04
new file mode 100644
index 00000000..e9192f01
--- /dev/null
+++ b/core/modules/kernel/module.conf.ubuntu.13.04
@@ -0,0 +1,2 @@
+REQUIRED_GIT_BRANCH="-b master"
+REQUIRED_GIT="git://kernel.ubuntu.com/ubuntu-archive/ubuntu-${SYS_CODENAME}.git $REQUIRED_GIT_BRANCH"
diff --git a/core/modules/kernel/module.conf.ubuntu.14.04 b/core/modules/kernel/module.conf.ubuntu.14.04
new file mode 100644
index 00000000..77ae8d18
--- /dev/null
+++ b/core/modules/kernel/module.conf.ubuntu.14.04
@@ -0,0 +1,2 @@
+REQUIRED_GIT_BRANCH="lts-backport-vivid"
+REQUIRED_GIT="git://kernel.ubuntu.com/ubuntu/ubuntu-${SYS_CODENAME}.git"
diff --git a/core/modules/kernel/patch-speaker b/core/modules/kernel/patch-speaker
new file mode 100755
index 00000000..5d5a9f9a
--- /dev/null
+++ b/core/modules/kernel/patch-speaker
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+if ! grep notes "ksrc/drivers/input/misc/pcspkr.c" > /dev/null; then
+ echo "Patching pc speaker :-)"
+ sed -i.nomusic -r 's#^static.*int.*pcspkr_event#static const int notes[] = { /*tetris*/ 1319, 988, 1047, 1175, 1047, 988, 880, 880, 1047, 1319, 1175, 1047, 988, 1047, 1175, 1319, 1047, 880, 880, 1175, 1397, 1760, 1568, 1397, 1319, 1047, 1319, 1175, 1047, 988, 988, 1047, 1175, 1319, 1047, 880, 880, /*mario*/ 660, 660, 660, 510, 660, 770, 380, 510, 380, 320, 440, 480, 450, 430, 380, 660, 760, 860, 700, 760, 660, 520, 580, 480, 510, 380, 320, 440, 480, 450, 430, 380, 660, 760, 860, 700, 760, 660, 520, 580, 480, 500, 760, 720, 680, 620, 650, 380, 430, 500, 430, 500, 570, 500, 760, 720, 680, 620, 650, 1020, 1020, 1020, 380, 500, 760, 720, 680, 620, 650, 380, 430, 500, 430, 500, 570, 500, 760, 720, 680, 620, 650, 1020, 1020, 1020, 380, 500, 760, 720, 680, 620, 650, 380, 430, 500, 430, 500, 570, 585, 550, 500, 380, 500, 500, 500, 500, 500, 500, 500, 580, 660, 500, 430, 380, 500, 500, 500, 500, 580, 660, 870, 760, 500, 500, 500, 500, 580, 660, 500, 430, 380, 660, 660, 660, 510, 660, 770, 380, /* elise */ 420, 400, 420, 400, 420, 315, 370, 335, 282, 180, 215, 282, 315, 213, 262, 315, 335, 213, 420, 400, 420, 400, 420, 315, 370, 335, 282, 180, 215, 282, 315, 213, 330, 315, 282 };\nstatic int notePos = 0;\n\n&#g;s#\s*if \(value > 20 && value < 32767\)#\n if (value) value = notes[notePos++ % (sizeof(notes) / sizeof(notes[0]))];\n\n&#g' "ksrc/drivers/input/misc/pcspkr.c"
+fi
diff --git a/core/modules/ldm-gtk-greeter/TODO b/core/modules/ldm-gtk-greeter/TODO
new file mode 100644
index 00000000..6203c18f
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/TODO
@@ -0,0 +1 @@
+update to new config scheme
diff --git a/core/modules/ldm-gtk-greeter/data/etc/fonts/fonts.conf b/core/modules/ldm-gtk-greeter/data/etc/fonts/fonts.conf
new file mode 100644
index 00000000..5eb6afe1
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/etc/fonts/fonts.conf
@@ -0,0 +1,151 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<!-- /etc/fonts/fonts.conf file to configure system font access -->
+<fontconfig>
+
+<!--
+ DO NOT EDIT THIS FILE.
+ IT WILL BE REPLACED WHEN FONTCONFIG IS UPDATED.
+ LOCAL CHANGES BELONG IN 'local.conf'.
+
+ The intent of this standard configuration file is to be adequate for
+ most environments. If you have a reasonably normal environment and
+ have found problems with this configuration, they are probably
+ things that others will also want fixed. Please submit any
+ problems to the fontconfig bugzilla system located at fontconfig.org
+
+ Note that the normal 'make install' procedure for fontconfig is to
+ replace any existing fonts.conf file with the new version. Place
+ any local customizations in local.conf which this file references.
+
+ Keith Packard
+-->
+
+<!-- Font directory list -->
+
+ <dir>/usr/share/fonts</dir>
+ <dir>/usr/X11R6/lib/X11/fonts</dir> <dir>/usr/local/share/fonts</dir>
+ <dir>~/.fonts</dir>
+
+<!--
+ Accept deprecated 'mono' alias, replacing it with 'monospace'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>mono</string>
+ </test>
+ <edit name="family" mode="assign">
+ <string>monospace</string>
+ </edit>
+ </match>
+
+<!--
+ Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans serif</string>
+ </test>
+ <edit name="family" mode="assign">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+<!--
+ Accept deprecated 'sans' alias, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans</string>
+ </test>
+ <edit name="family" mode="assign">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+<!--
+ Load local system customization file
+-->
+ <include ignore_missing="yes">conf.d</include>
+
+<!-- Font cache directory list -->
+
+ <cachedir>/var/cache/fontconfig</cachedir>
+ <cachedir>~/.fontconfig</cachedir>
+
+ <config>
+<!--
+ These are the default Unicode chars that are expected to be blank
+ in fonts. All other blank chars are assumed to be broken and
+ won't appear in the resulting charsets
+ -->
+ <blank>
+ <int>0x0020</int> <!-- SPACE -->
+ <int>0x00A0</int> <!-- NO-BREAK SPACE -->
+ <int>0x00AD</int> <!-- SOFT HYPHEN -->
+ <int>0x034F</int> <!-- COMBINING GRAPHEME JOINER -->
+ <int>0x0600</int> <!-- ARABIC NUMBER SIGN -->
+ <int>0x0601</int> <!-- ARABIC SIGN SANAH -->
+ <int>0x0602</int> <!-- ARABIC FOOTNOTE MARKER -->
+ <int>0x0603</int> <!-- ARABIC SIGN SAFHA -->
+ <int>0x06DD</int> <!-- ARABIC END OF AYAH -->
+ <int>0x070F</int> <!-- SYRIAC ABBREVIATION MARK -->
+ <int>0x115F</int> <!-- HANGUL CHOSEONG FILLER -->
+ <int>0x1160</int> <!-- HANGUL JUNGSEONG FILLER -->
+ <int>0x1680</int> <!-- OGHAM SPACE MARK -->
+ <int>0x17B4</int> <!-- KHMER VOWEL INHERENT AQ -->
+ <int>0x17B5</int> <!-- KHMER VOWEL INHERENT AA -->
+ <int>0x180E</int> <!-- MONGOLIAN VOWEL SEPARATOR -->
+ <int>0x2000</int> <!-- EN QUAD -->
+ <int>0x2001</int> <!-- EM QUAD -->
+ <int>0x2002</int> <!-- EN SPACE -->
+ <int>0x2003</int> <!-- EM SPACE -->
+ <int>0x2004</int> <!-- THREE-PER-EM SPACE -->
+ <int>0x2005</int> <!-- FOUR-PER-EM SPACE -->
+ <int>0x2006</int> <!-- SIX-PER-EM SPACE -->
+ <int>0x2007</int> <!-- FIGURE SPACE -->
+ <int>0x2008</int> <!-- PUNCTUATION SPACE -->
+ <int>0x2009</int> <!-- THIN SPACE -->
+ <int>0x200A</int> <!-- HAIR SPACE -->
+ <int>0x200B</int> <!-- ZERO WIDTH SPACE -->
+ <int>0x200C</int> <!-- ZERO WIDTH NON-JOINER -->
+ <int>0x200D</int> <!-- ZERO WIDTH JOINER -->
+ <int>0x200E</int> <!-- LEFT-TO-RIGHT MARK -->
+ <int>0x200F</int> <!-- RIGHT-TO-LEFT MARK -->
+ <int>0x2028</int> <!-- LINE SEPARATOR -->
+ <int>0x2029</int> <!-- PARAGRAPH SEPARATOR -->
+ <int>0x202A</int> <!-- LEFT-TO-RIGHT EMBEDDING -->
+ <int>0x202B</int> <!-- RIGHT-TO-LEFT EMBEDDING -->
+ <int>0x202C</int> <!-- POP DIRECTIONAL FORMATTING -->
+ <int>0x202D</int> <!-- LEFT-TO-RIGHT OVERRIDE -->
+ <int>0x202E</int> <!-- RIGHT-TO-LEFT OVERRIDE -->
+ <int>0x202F</int> <!-- NARROW NO-BREAK SPACE -->
+ <int>0x205F</int> <!-- MEDIUM MATHEMATICAL SPACE -->
+ <int>0x2060</int> <!-- WORD JOINER -->
+ <int>0x2061</int> <!-- FUNCTION APPLICATION -->
+ <int>0x2062</int> <!-- INVISIBLE TIMES -->
+ <int>0x2063</int> <!-- INVISIBLE SEPARATOR -->
+ <int>0x206A</int> <!-- INHIBIT SYMMETRIC SWAPPING -->
+ <int>0x206B</int> <!-- ACTIVATE SYMMETRIC SWAPPING -->
+ <int>0x206C</int> <!-- INHIBIT ARABIC FORM SHAPING -->
+ <int>0x206D</int> <!-- ACTIVATE ARABIC FORM SHAPING -->
+ <int>0x206E</int> <!-- NATIONAL DIGIT SHAPES -->
+ <int>0x206F</int> <!-- NOMINAL DIGIT SHAPES -->
+ <int>0x2800</int> <!-- BRAILLE PATTERN BLANK -->
+ <int>0x3000</int> <!-- IDEOGRAPHIC SPACE -->
+ <int>0x3164</int> <!-- HANGUL FILLER -->
+ <int>0xFEFF</int> <!-- ZERO WIDTH NO-BREAK SPACE -->
+ <int>0xFFA0</int> <!-- HALFWIDTH HANGUL FILLER -->
+ <int>0xFFF9</int> <!-- INTERLINEAR ANNOTATION ANCHOR -->
+ <int>0xFFFA</int> <!-- INTERLINEAR ANNOTATION SEPARATOR -->
+ <int>0xFFFB</int> <!-- INTERLINEAR ANNOTATION TERMINATOR -->
+ </blank>
+<!--
+ Rescan configuration every 30 seconds when FcFontSetList is called
+ -->
+ <rescan>
+ <int>30</int>
+ </rescan>
+ </config>
+
+</fontconfig>
diff --git a/core/modules/ldm-gtk-greeter/data/etc/lightdm/lightdm-gtk-greeter.conf b/core/modules/ldm-gtk-greeter/data/etc/lightdm/lightdm-gtk-greeter.conf
new file mode 100644
index 00000000..50e5700b
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/etc/lightdm/lightdm-gtk-greeter.conf
@@ -0,0 +1,19 @@
+#
+# background = Background file to use, either an image path or a color (e.g. #772953)
+# theme-name = GTK+ theme to use
+# font-name = Font to use
+# xft-antialias = Whether to antialias Xft fonts (true or false)
+# xft-dpi = Resolution for Xft in dots per inch (e.g. 96)
+# xft-hintstyle = What degree of hinting to use (hintnone, hintslight, hintmedium, or hintfull)
+# xft-rgba = Type of subpixel antialiasing (none, rgb, bgr, vrgb or vbgr)
+# show-language-selector (true or false)
+#
+[greeter]
+background=/usr/share/backgrounds/warty-final-ubuntu.png
+theme-name=Adwaita
+font-name=Ubuntu 11
+xft-antialias=true
+xft-dpi=96
+xft-hintstyle=slight
+xft-rgba=rgb
+show-language-selector=false
diff --git a/core/modules/ldm-gtk-greeter/data/etc/lightdm/lightdm.conf b/core/modules/ldm-gtk-greeter/data/etc/lightdm/lightdm.conf
new file mode 100644
index 00000000..6cb2090c
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/etc/lightdm/lightdm.conf
@@ -0,0 +1,125 @@
+#
+# General configuration
+#
+# start-default-seat = True to always start one seat if none are defined in the configuration
+# greeter-user = User to run greeter as
+# minimum-display-number = Minimum display number to use for X servers
+# minimum-vt = First VT to run displays on
+# lock-memory = True to prevent memory from being paged to disk
+# user-authority-in-system-dir = True if session authority should be in the system location
+# guest-account-script = Script to be run to setup guest account
+# log-directory = Directory to log information to
+# run-directory = Directory to put running state in
+# cache-directory = Directory to cache to
+# xsessions-directory = Directory to find X sessions
+# remote-sessions-directory = Directory to find remote sessions
+# xgreeters-directory = Directory to find X greeters
+#
+[LightDM]
+#start-default-seat=true
+#greeter-user=lightdm
+#minimum-display-number=0
+#minimum-vt=7
+#lock-memory=true
+#user-authority-in-system-dir=false
+#guest-account-script=guest-account
+#log-directory=/var/log/lightdm
+#run-directory=/var/run/lightdm
+#cache-directory=/var/cache/lightdm
+#xsessions-directory=/usr/share/xsessions
+#remote-sessions-directory=/usr/share/lightdm/remote-sessions
+#xgreeters-directory=/usr/share/xgreeters
+
+#
+# Seat defaults
+#
+# type = Seat type (xlocal, xremote)
+# xserver-command = X server command to run (can also contain arguments e.g. X -special-option)
+# xserver-layout = Layout to pass to X server
+# xserver-config = Config file to pass to X server
+# xserver-allow-tcp = True if TCP/IP connections are allowed to this X server
+# xdmcp-manager = XDMCP manager to connect to (implies xserver-allow-tcp=true)
+# xdmcp-port = XDMCP UDP/IP port to communicate on
+# xdmcp-key = Authentication key to use for XDM-AUTHENTICATION-1 (stored in keys.conf)
+# greeter-session = Session to load for greeter
+# greeter-hide-users = True to hide the user list
+# greeter-allow-guest = True if the greeter should show a guest login option
+# greeter-show-manual-login = True if the greeter should offer a manual login option
+# greeter-show-remote-login = True if the greeter should offer a remote login option
+# user-session = Session to load for users
+# allow-guest = True if guest login is allowed
+# guest-session = Session to load for guests (overrides user-session)
+# session-wrapper = Wrapper script to run session with
+# display-setup-script = Script to run when starting a greeter session (runs as root)
+# greeter-setup-script = Script to run when starting a greeter (runs as root)
+# session-setup-script = Script to run when starting a user session (runs as root)
+# session-cleanup-script = Script to run when quitting a user session (runs as root)
+# autologin-guest = True to log in as guest by default
+# autologin-user = User to log in with by default (overrides autologin-guest)
+# autologin-user-timeout = Number of seconds to wait before loading default user
+# autologin-session = Session to load for automatic login (overrides user-session)
+# exit-on-failure = True if the daemon should exit if this seat fails
+#
+[SeatDefaults]
+#type=xlocal
+#xserver-command=X
+#xserver-layout=
+#xserver-config=
+#xserver-allow-tcp=false
+#xdmcp-manager=
+#xdmcp-port=177
+#xdmcp-key=
+greeter-session=lightdm-gtk-greeter
+#greeter-hide-users=false
+#greeter-allow-guest=true
+#greeter-show-manual-login=false
+#greeter-show-remote-login=true
+#user-session=default
+#allow-guest=true
+#guest-session=UNIMPLEMENTED
+#session-wrapper=lightdm-session
+#display-setup-script=
+#greeter-setup-script=
+#session-setup-script=
+#session-cleanup-script=
+#autologin-guest=false
+#autologin-user=
+#autologin-user-timeout=0
+#autologin-session=UNIMPLEMENTED
+#exit-on-failure=false
+
+#
+# Seat configuration
+#
+# Each seat must start with "Seat:".
+# Uses settings from [SeatDefaults], any of these can be overriden by setting them in this section.
+#
+#[Seat:0]
+
+#
+# XDMCP Server configuration
+#
+# enabled = True if XDMCP connections should be allowed
+# port = UDP/IP port to listen for connections on
+# key = Authentication key to use for XDM-AUTHENTICATION-1 or blank to not use authentication (stored in keys.conf)
+#
+# The authentication key is a 56 bit DES key specified in hex as 0xnnnnnnnnnnnnnn. Alternatively
+# it can be a word and the first 7 characters are used as the key.
+#
+[XDMCPServer]
+#enabled=false
+#port=177
+#key=
+
+#
+# VNC Server configuration
+#
+# enabled = True if VNC connections should be allowed
+# port = TCP/IP port to listen for connections on
+#
+[VNCServer]
+#enabled=false
+#port=5900
+#width=1024
+#height=768
+#depth=8
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/backgrounds/warty-final-ubuntu.png b/core/modules/ldm-gtk-greeter/data/usr/share/backgrounds/warty-final-ubuntu.png
new file mode 100644
index 00000000..b9e7b65a
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/backgrounds/warty-final-ubuntu.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf
new file mode 100644
index 00000000..c0142fea
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-BI.ttf b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-BI.ttf
new file mode 100644
index 00000000..12e4c7df
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-BI.ttf
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-C.ttf b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-C.ttf
new file mode 100644
index 00000000..8d3e8676
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-C.ttf
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-L.ttf b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-L.ttf
new file mode 100644
index 00000000..7b7ac7dd
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-L.ttf
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-LI.ttf b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-LI.ttf
new file mode 100644
index 00000000..e36de452
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-LI.ttf
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf
new file mode 100644
index 00000000..45a038ba
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-RI.ttf b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-RI.ttf
new file mode 100644
index 00000000..6f819f69
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-RI.ttf
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-B.ttf b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-B.ttf
new file mode 100644
index 00000000..7bd66657
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-B.ttf
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-BI.ttf b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-BI.ttf
new file mode 100644
index 00000000..6c5b8ba0
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-BI.ttf
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-R.ttf b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-R.ttf
new file mode 100644
index 00000000..fdd309d7
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-R.ttf
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-RI.ttf b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-RI.ttf
new file mode 100644
index 00000000..18f81a29
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-RI.ttf
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/48x48/devices/computer.png b/core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/48x48/devices/computer.png
new file mode 100644
index 00000000..de87c0b0
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/48x48/devices/computer.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/index.theme b/core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/index.theme
new file mode 100644
index 00000000..1c812195
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/index.theme
@@ -0,0 +1,1662 @@
+[Icon Theme]
+Name=Hicolor
+Comment=Fallback icon theme
+Hidden=true
+Directories=16x16/actions,16x16/animations,16x16/apps,16x16/categories,16x16/devices,16x16/emblems,16x16/emotes,16x16/filesystems,16x16/intl,16x16/mimetypes,16x16/places,16x16/status,16x16/stock/chart,16x16/stock/code,16x16/stock/data,16x16/stock/form,16x16/stock/image,16x16/stock/io,16x16/stock/media,16x16/stock/navigation,16x16/stock/net,16x16/stock/object,16x16/stock/table,16x16/stock/text,22x22/actions,22x22/animations,22x22/apps,22x22/categories,22x22/devices,22x22/emblems,22x22/emotes,22x22/filesystems,22x22/intl,22x22/mimetypes,22x22/places,22x22/status,22x22/stock/chart,22x22/stock/code,22x22/stock/data,22x22/stock/form,22x22/stock/image,22x22/stock/io,22x22/stock/media,22x22/stock/navigation,22x22/stock/net,22x22/stock/object,22x22/stock/table,22x22/stock/text,24x24/actions,24x24/animations,24x24/apps,24x24/categories,24x24/devices,24x24/emblems,24x24/emotes,24x24/filesystems,24x24/intl,24x24/mimetypes,24x24/places,24x24/status,24x24/stock/chart,24x24/stock/code,24x24/stock/data,24x24/stock/form,24x24/stock/image,24x24/stock/io,24x24/stock/media,24x24/stock/navigation,24x24/stock/net,24x24/stock/object,24x24/stock/table,24x24/stock/text,32x32/actions,32x32/animations,32x32/apps,32x32/categories,32x32/devices,32x32/emblems,32x32/emotes,32x32/filesystems,32x32/intl,32x32/mimetypes,32x32/places,32x32/status,32x32/stock/chart,32x32/stock/code,32x32/stock/data,32x32/stock/form,32x32/stock/image,32x32/stock/io,32x32/stock/media,32x32/stock/navigation,32x32/stock/net,32x32/stock/object,32x32/stock/table,32x32/stock/text,36x36/actions,36x36/animations,36x36/apps,36x36/categories,36x36/devices,36x36/emblems,36x36/emotes,36x36/filesystems,36x36/intl,36x36/mimetypes,36x36/places,36x36/status,36x36/stock/chart,36x36/stock/code,36x36/stock/data,36x36/stock/form,36x36/stock/image,36x36/stock/io,36x36/stock/media,36x36/stock/navigation,36x36/stock/net,36x36/stock/object,36x36/stock/table,36x36/stock/text,48x48/actions,48x48/animations,48x48/apps,48x48/categories,48x48/devices,48x48/emblems,48x48/emotes,48x48/filesystems,48x48/intl,48x48/mimetypes,48x48/places,48x48/status,48x48/stock/chart,48x48/stock/code,48x48/stock/data,48x48/stock/form,48x48/stock/image,48x48/stock/io,48x48/stock/media,48x48/stock/navigation,48x48/stock/net,48x48/stock/object,48x48/stock/table,48x48/stock/text,64x64/actions,64x64/animations,64x64/apps,64x64/categories,64x64/devices,64x64/emblems,64x64/emotes,64x64/filesystems,64x64/intl,64x64/mimetypes,64x64/places,64x64/status,64x64/stock/chart,64x64/stock/code,64x64/stock/data,64x64/stock/form,64x64/stock/image,64x64/stock/io,64x64/stock/media,64x64/stock/navigation,64x64/stock/net,64x64/stock/object,64x64/stock/table,64x64/stock/text,72x72/actions,72x72/animations,72x72/apps,72x72/categories,72x72/devices,72x72/emblems,72x72/emotes,72x72/filesystems,72x72/intl,72x72/mimetypes,72x72/places,72x72/status,72x72/stock/chart,72x72/stock/code,72x72/stock/data,72x72/stock/form,72x72/stock/image,72x72/stock/io,72x72/stock/media,72x72/stock/navigation,72x72/stock/net,72x72/stock/object,72x72/stock/table,72x72/stock/text,96x96/actions,96x96/animations,96x96/apps,96x96/categories,96x96/devices,96x96/emblems,96x96/emotes,96x96/filesystems,96x96/intl,96x96/mimetypes,96x96/places,96x96/status,96x96/stock/chart,96x96/stock/code,96x96/stock/data,96x96/stock/form,96x96/stock/image,96x96/stock/io,96x96/stock/media,96x96/stock/navigation,96x96/stock/net,96x96/stock/object,96x96/stock/table,96x96/stock/text,128x128/actions,128x128/animations,128x128/apps,128x128/categories,128x128/devices,128x128/emblems,128x128/emotes,128x128/filesystems,128x128/intl,128x128/mimetypes,128x128/places,128x128/status,128x128/stock/chart,128x128/stock/code,128x128/stock/data,128x128/stock/form,128x128/stock/image,128x128/stock/io,128x128/stock/media,128x128/stock/navigation,128x128/stock/net,128x128/stock/object,128x128/stock/table,128x128/stock/text,192x192/actions,192x192/animations,192x192/apps,192x192/categories,192x192/devices,192x192/emblems,192x192/emotes,192x192/filesystems,192x192/intl,192x192/mimetypes,192x192/places,192x192/status,192x192/stock/chart,192x192/stock/code,192x192/stock/data,192x192/stock/form,192x192/stock/image,192x192/stock/io,192x192/stock/media,192x192/stock/navigation,192x192/stock/net,192x192/stock/object,192x192/stock/table,192x192/stock/text,256x256/actions,256x256/animations,256x256/apps,256x256/categories,256x256/devices,256x256/emblems,256x256/emotes,256x256/filesystems,256x256/intl,256x256/mimetypes,256x256/places,256x256/status,256x256/stock/chart,256x256/stock/code,256x256/stock/data,256x256/stock/form,256x256/stock/image,256x256/stock/io,256x256/stock/media,256x256/stock/navigation,256x256/stock/net,256x256/stock/object,256x256/stock/table,256x256/stock/text,scalable/actions,scalable/animations,scalable/apps,scalable/categories,scalable/devices,scalable/emblems,scalable/emotes,scalable/filesystems,scalable/intl,scalable/mimetypes,scalable/places,scalable/status,scalable/stock/chart,scalable/stock/code,scalable/stock/data,scalable/stock/form,scalable/stock/image,scalable/stock/io,scalable/stock/media,scalable/stock/navigation,scalable/stock/net,scalable/stock/object,scalable/stock/table,scalable/stock/text
+
+
+[16x16/actions]
+Size=16
+Context=Actions
+Type=Threshold
+
+[16x16/animations]
+Size=16
+Context=Animations
+Type=Threshold
+
+[16x16/apps]
+Size=16
+Context=Applications
+Type=Threshold
+
+[16x16/categories]
+Size=16
+Context=Categories
+Type=Threshold
+
+[16x16/devices]
+Size=16
+Context=Devices
+Type=Threshold
+
+[16x16/emblems]
+Size=16
+Context=Emblems
+Type=Threshold
+
+[16x16/emotes]
+Size=16
+Context=Emotes
+Type=Threshold
+
+[16x16/filesystems]
+Size=16
+Context=FileSystems
+Type=Threshold
+
+[16x16/intl]
+Size=16
+Context=International
+Type=Threshold
+
+[16x16/mimetypes]
+Size=16
+Context=MimeTypes
+Type=Threshold
+
+[16x16/places]
+Size=16
+Context=Places
+Type=Threshold
+
+[16x16/status]
+Size=16
+Context=Status
+Type=Threshold
+
+[16x16/stock/chart]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/code]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/data]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/form]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/image]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/io]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/media]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/navigation]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/net]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/object]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/table]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/text]
+Size=16
+Context=Stock
+Type=Threshold
+
+[22x22/actions]
+Size=22
+Context=Actions
+Type=Threshold
+
+[22x22/animations]
+Size=22
+Context=Animations
+Type=Threshold
+
+[22x22/apps]
+Size=22
+Context=Applications
+Type=Threshold
+
+[22x22/categories]
+Size=22
+Context=Categories
+Type=Threshold
+
+[22x22/devices]
+Size=22
+Context=Devices
+Type=Threshold
+
+[22x22/emblems]
+Size=22
+Context=Emblems
+Type=Threshold
+
+[22x22/emotes]
+Size=22
+Context=Emotes
+Type=Threshold
+
+[22x22/filesystems]
+Size=22
+Context=FileSystems
+Type=Threshold
+
+[22x22/intl]
+Size=22
+Context=International
+Type=Threshold
+
+[22x22/mimetypes]
+Size=22
+Context=MimeTypes
+Type=Threshold
+
+[22x22/places]
+Size=22
+Context=Places
+Type=Threshold
+
+[22x22/status]
+Size=22
+Context=Status
+Type=Threshold
+
+[22x22/stock/chart]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/code]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/data]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/form]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/image]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/io]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/media]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/navigation]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/net]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/object]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/table]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/text]
+Size=22
+Context=Stock
+Type=Threshold
+
+[24x24/actions]
+Size=24
+Context=Actions
+Type=Threshold
+
+[24x24/animations]
+Size=24
+Context=Animations
+Type=Threshold
+
+[24x24/apps]
+Size=24
+Context=Applications
+Type=Threshold
+
+[24x24/categories]
+Size=24
+Context=Categories
+Type=Threshold
+
+[24x24/devices]
+Size=24
+Context=Devices
+Type=Threshold
+
+[24x24/emblems]
+Size=24
+Context=Emblems
+Type=Threshold
+
+[24x24/emotes]
+Size=24
+Context=Emotes
+Type=Threshold
+
+[24x24/filesystems]
+Size=24
+Context=FileSystems
+Type=Threshold
+
+[24x24/intl]
+Size=24
+Context=International
+Type=Threshold
+
+[24x24/mimetypes]
+Size=24
+Context=MimeTypes
+Type=Threshold
+
+[24x24/places]
+Size=24
+Context=Places
+Type=Threshold
+
+[24x24/status]
+Size=24
+Context=Status
+Type=Threshold
+
+[24x24/stock/chart]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/code]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/data]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/form]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/image]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/io]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/media]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/navigation]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/net]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/object]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/table]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/text]
+Size=24
+Context=Stock
+Type=Threshold
+
+[32x32/actions]
+Size=32
+Context=Actions
+Type=Threshold
+
+[32x32/animations]
+Size=32
+Context=Animations
+Type=Threshold
+
+[32x32/apps]
+Size=32
+Context=Applications
+Type=Threshold
+
+[32x32/categories]
+Size=32
+Context=Categories
+Type=Threshold
+
+[32x32/devices]
+Size=32
+Context=Devices
+Type=Threshold
+
+[32x32/emblems]
+Size=32
+Context=Emblems
+Type=Threshold
+
+[32x32/emotes]
+Size=32
+Context=Emotes
+Type=Threshold
+
+[32x32/filesystems]
+Size=32
+Context=FileSystems
+Type=Threshold
+
+[32x32/intl]
+Size=32
+Context=International
+Type=Threshold
+
+[32x32/mimetypes]
+Size=32
+Context=MimeTypes
+Type=Threshold
+
+[32x32/places]
+Size=32
+Context=Places
+Type=Threshold
+
+[32x32/status]
+Size=32
+Context=Status
+Type=Threshold
+
+[32x32/stock/chart]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/code]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/data]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/form]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/image]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/io]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/media]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/navigation]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/net]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/object]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/table]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/text]
+Size=32
+Context=Stock
+Type=Threshold
+
+[36x36/actions]
+Size=36
+Context=Actions
+Type=Threshold
+
+[36x36/animations]
+Size=36
+Context=Animations
+Type=Threshold
+
+[36x36/apps]
+Size=36
+Context=Applications
+Type=Threshold
+
+[36x36/categories]
+Size=36
+Context=Categories
+Type=Threshold
+
+[36x36/devices]
+Size=36
+Context=Devices
+Type=Threshold
+
+[36x36/emblems]
+Size=36
+Context=Emblems
+Type=Threshold
+
+[36x36/emotes]
+Size=36
+Context=Emotes
+Type=Threshold
+
+[36x36/filesystems]
+Size=36
+Context=FileSystems
+Type=Threshold
+
+[36x36/intl]
+Size=36
+Context=International
+Type=Threshold
+
+[36x36/mimetypes]
+Size=36
+Context=MimeTypes
+Type=Threshold
+
+[36x36/places]
+Size=36
+Context=Places
+Type=Threshold
+
+[36x36/status]
+Size=36
+Context=Status
+Type=Threshold
+
+[36x36/stock/chart]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/code]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/data]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/form]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/image]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/io]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/media]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/navigation]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/net]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/object]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/table]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/text]
+Size=36
+Context=Stock
+Type=Threshold
+
+[48x48/actions]
+Size=48
+Context=Actions
+Type=Threshold
+
+[48x48/animations]
+Size=48
+Context=Animations
+Type=Threshold
+
+[48x48/apps]
+Size=48
+Context=Applications
+Type=Threshold
+
+[48x48/categories]
+Size=48
+Context=Categories
+Type=Threshold
+
+[48x48/devices]
+Size=48
+Context=Devices
+Type=Threshold
+
+[48x48/emblems]
+Size=48
+Context=Emblems
+Type=Threshold
+
+[48x48/emotes]
+Size=48
+Context=Emotes
+Type=Threshold
+
+[48x48/filesystems]
+Size=48
+Context=FileSystems
+Type=Threshold
+
+[48x48/intl]
+Size=48
+Context=International
+Type=Threshold
+
+[48x48/mimetypes]
+Size=48
+Context=MimeTypes
+Type=Threshold
+
+[48x48/places]
+Size=48
+Context=Places
+Type=Threshold
+
+[48x48/status]
+Size=48
+Context=Status
+Type=Threshold
+
+[48x48/stock/chart]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/code]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/data]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/form]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/image]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/io]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/media]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/navigation]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/net]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/object]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/table]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/text]
+Size=48
+Context=Stock
+Type=Threshold
+
+[64x64/actions]
+Size=64
+Context=Actions
+Type=Threshold
+
+[64x64/animations]
+Size=64
+Context=Animations
+Type=Threshold
+
+[64x64/apps]
+Size=64
+Context=Applications
+Type=Threshold
+
+[64x64/categories]
+Size=64
+Context=Categories
+Type=Threshold
+
+[64x64/devices]
+Size=64
+Context=Devices
+Type=Threshold
+
+[64x64/emblems]
+Size=64
+Context=Emblems
+Type=Threshold
+
+[64x64/emotes]
+Size=64
+Context=Emotes
+Type=Threshold
+
+[64x64/filesystems]
+Size=64
+Context=FileSystems
+Type=Threshold
+
+[64x64/intl]
+Size=64
+Context=International
+Type=Threshold
+
+[64x64/mimetypes]
+Size=64
+Context=MimeTypes
+Type=Threshold
+
+[64x64/places]
+Size=64
+Context=Places
+Type=Threshold
+
+[64x64/status]
+Size=64
+Context=Status
+Type=Threshold
+
+[64x64/stock/chart]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/code]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/data]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/form]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/image]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/io]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/media]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/navigation]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/net]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/object]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/table]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/text]
+Size=64
+Context=Stock
+Type=Threshold
+[72x72/actions]
+Size=72
+Context=Actions
+Type=Threshold
+
+[72x72/animations]
+Size=72
+Context=Animations
+Type=Threshold
+
+[72x72/apps]
+Size=72
+Context=Applications
+Type=Threshold
+
+[72x72/categories]
+Size=72
+Context=Categories
+Type=Threshold
+
+[72x72/devices]
+Size=72
+Context=Devices
+Type=Threshold
+
+[72x72/emblems]
+Size=72
+Context=Emblems
+Type=Threshold
+
+[72x72/emotes]
+Size=72
+Context=Emotes
+Type=Threshold
+
+[72x72/filesystems]
+Size=72
+Context=FileSystems
+Type=Threshold
+
+[72x72/intl]
+Size=72
+Context=International
+Type=Threshold
+
+[72x72/mimetypes]
+Size=72
+Context=MimeTypes
+Type=Threshold
+
+[72x72/places]
+Size=72
+Context=Places
+Type=Threshold
+
+[72x72/status]
+Size=72
+Context=Status
+Type=Threshold
+
+[72x72/stock/chart]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/code]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/data]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/form]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/image]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/io]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/media]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/navigation]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/net]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/object]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/table]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/text]
+Size=72
+Context=Stock
+Type=Threshold
+
+[96x96/actions]
+Size=96
+Context=Actions
+Type=Threshold
+
+[96x96/animations]
+Size=96
+Context=Animations
+Type=Threshold
+
+[96x96/apps]
+Size=96
+Context=Applications
+Type=Threshold
+
+[96x96/categories]
+Size=96
+Context=Categories
+Type=Threshold
+
+[96x96/devices]
+Size=96
+Context=Devices
+Type=Threshold
+
+[96x96/emblems]
+Size=96
+Context=Emblems
+Type=Threshold
+
+[96x96/emotes]
+Size=96
+Context=Emotes
+Type=Threshold
+
+[96x96/filesystems]
+Size=96
+Context=FileSystems
+Type=Threshold
+
+[96x96/intl]
+Size=96
+Context=International
+Type=Threshold
+
+[96x96/mimetypes]
+Size=96
+Context=MimeTypes
+Type=Threshold
+
+[96x96/places]
+Size=96
+Context=Places
+Type=Threshold
+
+[96x96/status]
+Size=96
+Context=Status
+Type=Threshold
+
+[96x96/stock/chart]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/code]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/data]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/form]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/image]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/io]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/media]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/navigation]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/net]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/object]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/table]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/text]
+Size=96
+Context=Stock
+Type=Threshold
+
+[128x128/actions]
+Size=128
+Context=Actions
+Type=Threshold
+
+[128x128/animations]
+Size=128
+Context=Animations
+Type=Threshold
+
+[128x128/apps]
+Size=128
+Context=Applications
+Type=Threshold
+
+[128x128/categories]
+Size=128
+Context=Categories
+Type=Threshold
+
+[128x128/devices]
+Size=128
+Context=Devices
+Type=Threshold
+
+[128x128/emblems]
+Size=128
+Context=Emblems
+Type=Threshold
+
+[128x128/emotes]
+Size=128
+Context=Emotes
+Type=Threshold
+
+[128x128/filesystems]
+Size=128
+Context=FileSystems
+Type=Threshold
+
+[128x128/intl]
+Size=128
+Context=International
+Type=Threshold
+
+[128x128/mimetypes]
+Size=128
+Context=MimeTypes
+Type=Threshold
+
+[128x128/places]
+Size=128
+Context=Places
+Type=Threshold
+
+[128x128/status]
+Size=128
+Context=Status
+Type=Threshold
+
+[128x128/stock/chart]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/code]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/data]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/form]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/image]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/io]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/media]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/navigation]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/net]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/object]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/table]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/text]
+Size=128
+Context=Stock
+Type=Threshold
+
+[192x192/actions]
+Size=192
+Context=Actions
+Type=Threshold
+
+[192x192/animations]
+Size=192
+Context=Animations
+Type=Threshold
+
+[192x192/apps]
+Size=192
+Context=Applications
+Type=Threshold
+
+[192x192/categories]
+Size=192
+Context=Categories
+Type=Threshold
+
+[192x192/devices]
+Size=192
+Context=Devices
+Type=Threshold
+
+[192x192/emblems]
+Size=192
+Context=Emblems
+Type=Threshold
+
+[192x192/emotes]
+Size=192
+Context=Emotes
+Type=Threshold
+
+[192x192/filesystems]
+Size=192
+Context=FileSystems
+Type=Threshold
+
+[192x192/intl]
+Size=192
+Context=International
+Type=Threshold
+
+[192x192/mimetypes]
+Size=192
+Context=MimeTypes
+Type=Threshold
+
+[192x192/places]
+Size=192
+Context=Places
+Type=Threshold
+
+[192x192/status]
+Size=192
+Context=Status
+Type=Threshold
+
+[192x192/stock/chart]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/code]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/data]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/form]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/image]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/io]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/media]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/navigation]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/net]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/object]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/table]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/text]
+Size=192
+Context=Stock
+Type=Threshold
+
+[256x256/actions]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Actions
+Type=Scalable
+
+[256x256/animations]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Animations
+Type=Scalable
+
+[256x256/apps]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Applications
+Type=Scalable
+
+[256x256/categories]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Categories
+Type=Scalable
+
+[256x256/devices]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Devices
+Type=Scalable
+
+[256x256/emblems]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Emblems
+Type=Scalable
+
+[256x256/emotes]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Emotes
+Type=Scalable
+
+[256x256/filesystems]
+MinSize=64
+Size=256
+MaxSize=256
+Context=FileSystems
+Type=Scalable
+
+[256x256/intl]
+MinSize=64
+Size=256
+MaxSize=256
+Context=International
+Type=Scalable
+
+[256x256/mimetypes]
+MinSize=64
+Size=256
+MaxSize=256
+Context=MimeTypes
+Type=Scalable
+
+[256x256/places]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Places
+Type=Scalable
+
+[256x256/status]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Status
+Type=Scalable
+
+[256x256/stock/chart]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/code]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/data]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/form]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/image]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/io]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/media]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/navigation]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/net]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/object]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/table]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/text]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/actions]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Actions
+Type=Scalable
+
+[scalable/animations]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Animations
+Type=Scalable
+
+[scalable/apps]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Applications
+Type=Scalable
+
+[scalable/categories]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Categories
+Type=Scalable
+
+[scalable/devices]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Devices
+Type=Scalable
+
+[scalable/emblems]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Emblems
+Type=Scalable
+
+[scalable/emotes]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Emotes
+Type=Scalable
+
+[scalable/filesystems]
+MinSize=1
+Size=128
+MaxSize=256
+Context=FileSystems
+Type=Scalable
+
+[scalable/intl]
+MinSize=1
+Size=128
+MaxSize=256
+Context=International
+Type=Scalable
+
+[scalable/mimetypes]
+MinSize=1
+Size=128
+MaxSize=256
+Context=MimeTypes
+Type=Scalable
+
+[scalable/places]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Places
+Type=Scalable
+
+[scalable/status]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Status
+Type=Scalable
+
+[scalable/stock/chart]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/code]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/data]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/form]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/image]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/io]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/media]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/navigation]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/net]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/object]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/table]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/text]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/scalable/apps/accessibility.svg b/core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/scalable/apps/accessibility.svg
new file mode 100644
index 00000000..d6347d3c
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/scalable/apps/accessibility.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3341" xmlns="http://www.w3.org/2000/svg" height="24" width="24" version="1.0">
+ <g id="layer1">
+ <path id="path3339" style="opacity:.6;fill-rule:evenodd;fill:#eae3d0" d="m12 2c-5.515 0-10 4.485-10 10s4.485 10 10 10 10-4.485 10-10-4.485-10-10-10zm-2.125 5.5312c-0.0098 0.0836-0.0938 0.1328-0.0938 0.2188 0 0.2991 0.2052 0.5169 0.3128 0.7812l-1.3752-0.2187c0.3473-0.3086 0.7316-0.5788 1.1562-0.7813zm4.437 0.125c0.347 0.1853 0.678 0.3975 0.969 0.6563l-1.25 0.1875c0.101-0.2568 0.313-0.4612 0.313-0.75 0-0.0356-0.03-0.0585-0.032-0.0938zm-7.062 3.1558l2.4062 0.75-0.0312 1.5-0.8125 2.469c-1.0229-0.902-1.8125-2.057-1.8125-3.531 0-0.424 0.1516-0.795 0.25-1.188zm9.5 0.032c0.094 0.383 0.25 0.743 0.25 1.156 0 1.504-0.704 2.806-1.75 3.719l-0.844-2.657-0.031-1.374 2.375-0.844zm-4.75 4.812l0.594 1.219c-0.205 0.025-0.382 0.125-0.594 0.125-0.209 0-0.391-0.126-0.594-0.156l0.594-1.188z"/>
+ <path id="path3157" style="fill-rule:evenodd;fill:#3a3935" d="m12 3c-4.968 0-9 4.032-9 9s4.032 9 9 9 9-4.032 9-9-4.032-9-9-9zm0 3c3.312 0 6 2.688 6 6s-2.688 6-6 6-6-2.688-6-6 2.688-6 6-6zm0.062 0.5c-0.713 0-1.281 0.5547-1.281 1.25s0.568 1.2812 1.281 1.2812c0.714 0 1.282-0.5859 1.282-1.2812s-0.568-1.25-1.282-1.25zm-4.6558 2.5938c-0.0698-0.0086-0.1241 0.0014-0.1874 0.0312-0.1268 0.0596-0.2171 0.1782-0.2188 0.3125-0.0016 0.1344 0.0936 0.25 0.2188 0.3125l3.4372 1.062-0.031 2.469-1.2188 3.657c-0.1168 0.166-0.0815 0.357 0.0938 0.468s0.4456 0.073 0.562-0.094l1.938-3.937 1.938 3.937c0.103 0.173 0.318 0.224 0.5 0.126 0.181-0.099 0.26-0.297 0.156-0.469l-1.188-3.688-0.062-2.281 3.5-1.25c0.141-0.0939 0.186-0.2846 0.125-0.4375s-0.236-0.2373-0.407-0.2187c-0.059 0.0094-0.107 0.0278-0.156 0.0624l-4.406 0.6876-4.375-0.6876c-0.0567-0.0401-0.1489-0.0539-0.2188-0.0624z"/>
+ </g>
+</svg>
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/scalable/apps/system-shutdown.svg b/core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/scalable/apps/system-shutdown.svg
new file mode 100644
index 00000000..e7882163
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/icons/hicolor/scalable/apps/system-shutdown.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg2407" xmlns="http://www.w3.org/2000/svg" height="24" width="24" version="1.0">
+ <g id="layer1">
+ <path id="path2405" style="opacity:.6;fill-rule:evenodd;fill:#eae3d0" d="m12.062 1c-0.854 0-1.562 0.7084-1.562 1.5625v7.4995c0 0.855 0.708 1.563 1.562 1.563 0.855 0 1.563-0.708 1.563-1.563v-7.4995c0-0.8541-0.708-1.5625-1.563-1.5625zm4.219 2.5625c-0.118 0.0174-0.227 0.0721-0.312 0.1563-0.82 0.009-1.634 0.3718-1.938 1.1874-0.278 0.7469 0.033 1.4814 0.531 2.0313 0.006 0.0063-0.005 0.025 0 0.0313 0.016 0.0441 0.037 0.0861 0.063 0.125 0.042 0.088 0.107 0.1634 0.187 0.2187 0.011 0.0108 0.021 0.0212 0.032 0.0313 0.129 0.0781 0.217 0.143 0.281 0.1874-0.003-0.002 0.038 0.0358 0.156 0.125 0.048 0.0359 0.1 0.0739 0.125 0.0938 0.075 0.0598 0.171 0.1486 0.282 0.25 0 0.0002 0.01 0.0136 0.062 0.0625 0.094 0.0894 0.177 0.1709 0.25 0.25 0.087 0.0936 0.119 0.1492 0.125 0.1563 0.092 0.1074 0.134 0.1112 0.094 0.0624 0.038 0.046 0.105 0.1151 0.156 0.1876 0.003 0.01 0 0.0311 0 0.0312 0.024 0.0344 0.036 0.0568 0.063 0.0938 0.004 0.0085-0.001 0.0311 0 0.0312 0.108 0.1535 0.221 0.2726 0.281 0.375 0.028 0.0488 0.059 0.1522 0.125 0.2812 0.05 0.0978 0.094 0.1501 0.125 0.2188 0.041 0.0913 0.07 0.1421 0.062 0.125 0.053 0.1247 0.084 0.254 0.125 0.375 0.037 0.109 0.088 0.265 0.125 0.406 0.051 0.194 0.068 0.334 0.094 0.5 0.028 0.179 0.053 0.354 0.063 0.532 0.009 0.171 0.007 0.348 0 0.531-0.003 0.055-0.02 0.155-0.032 0.281-0.008 0.093-0.02 0.173-0.031 0.25-0.024 0.17-0.022 0.183 0 0.031-0.024 0.16-0.027 0.321-0.063 0.469-0.007 0.033-0.036 0.092-0.062 0.188-0.038 0.137-0.044 0.199-0.031 0.156-0.029 0.094-0.061 0.158-0.094 0.25 0.018-0.05-0.028-0.007-0.094 0.156-0.069 0.172-0.094 0.313-0.125 0.375-0.023 0.03-0.04 0.018-0.062 0.063-0.083 0.163-0.149 0.324-0.219 0.437-0.075 0.12-0.163 0.235-0.219 0.313-0.013 0.014-0.017 0.012-0.031 0.031-0.071 0.096-0.138 0.19-0.187 0.25-0.055 0.065-0.111 0.137-0.157 0.187-0.097 0.108-0.162 0.162-0.187 0.188-0.026 0.025-0.08 0.09-0.188 0.187-0.063 0.058-0.116 0.098-0.187 0.157-0.113 0.092-0.203 0.162-0.281 0.218-0.071 0.051-0.125 0.094-0.126 0.094-0.077 0.053-0.2 0.136-0.343 0.219-0.101 0.058-0.133 0.052-0.094 0.031-0.148 0.082-0.246 0.174-0.344 0.219 0.03-0.014-0.042-0.029-0.187 0.031-0.108 0.045-0.2 0.096-0.282 0.125-0.015 0.004-0.015-0.006-0.031 0-0.165 0.057-0.299 0.128-0.406 0.156h-0.031c-0.128 0.034-0.253 0.031-0.438 0.063-0.194 0.033-0.221 0.05-0.094 0.031-0.058 0.009-0.164 0.02-0.281 0.031-0.271 0.028-0.492 0.043-0.75 0.032-0.073-0.004-0.098-0.002-0.062 0 0.026 0.001-0.044-0.019-0.188-0.032-0.161-0.014-0.264-0.019-0.343-0.031-0.156-0.024-0.338-0.031-0.469-0.063 0.038 0.01 0.043-0.003-0.063-0.031-0.056-0.014-0.117-0.029-0.125-0.031-0.126-0.036-0.27-0.106-0.406-0.156-0.018-0.008-0.01 0.008-0.031 0-0.026-0.013 0.002-0.019-0.032-0.032-0.2052-0.078-0.3377-0.107-0.437-0.156-0.0301-0.023-0.0179-0.04-0.0625-0.062-0.1405-0.071-0.2696-0.127-0.375-0.188-0.0176-0.01-0.0463-0.021-0.0625-0.031-0.0119-0.009 0.0144-0.022 0-0.031-0.1686-0.107-0.3206-0.191-0.4375-0.282-0.1095-0.084-0.1923-0.137-0.25-0.187-0.1097-0.096-0.1704-0.135-0.125-0.094-0.0415-0.038-0.0835-0.114-0.1563-0.187-0.0729-0.073-0.1494-0.115-0.1874-0.156-0.0685-0.075-0.16-0.218-0.2813-0.376-0.0905-0.116-0.175-0.268-0.2813-0.437-0.0106-0.017-0.022 0.013-0.0312 0-0.0349-0.056-0.0156-0.047-0.0312-0.063-0.0806-0.132-0.1514-0.269-0.2188-0.406 0.0072 0.015-0.0119-0.014-0.0625-0.125-0.0421-0.092-0.068-0.217-0.0937-0.281-0.0535-0.133-0.0787-0.137-0.0626-0.094-0.0058-0.031 0.0131-0.026 0-0.062-0.0147-0.041-0.0429-0.128-0.0624-0.188-0.0499-0.153-0.1071-0.242-0.125-0.312-0.0341-0.133-0.0421-0.264-0.0626-0.375-0.0249-0.137-0.0508-0.244-0.0624-0.344 0.0016 0.014 0.0125-0.087 0-0.281-0.0109-0.167-0.031-0.248-0.0313-0.282-0.001-0.122 0.0175-0.321 0.0313-0.5 0.0112-0.146 0.0371-0.281 0.0624-0.437 0.0337-0.207 0.0278-0.336 0.0626-0.469-0.0096 0.037 0.0056-0.001 0.0312-0.094 0.0244-0.087 0.098-0.244 0.1562-0.406 0.0102-0.028-0.0047-0.033 0-0.062-0.0129 0.034 0.0313-0.005 0.0938-0.1565 0.0593-0.1439 0.0488-0.2265 0.0312-0.1875 0.0509-0.1129 0.1247-0.2273 0.1876-0.3438 0.0458-0.0852 0.0866-0.169 0.1562-0.2812 0.0473-0.0763 0.1282-0.165 0.1875-0.25 0.0492-0.0698 0.0979-0.1444 0.1563-0.2188 0.0416-0.0537 0.0843-0.1074 0.125-0.1562 0.1109-0.1316 0.1011-0.1424 0.0312-0.0625 0.0503-0.0574 0.1728-0.1412 0.2812-0.25 0.1013-0.1015 0.1914-0.1783 0.3126-0.2813 0.1069-0.0908 0.1836-0.1919 0.2187-0.2187 0.1528-0.118 0.1806-0.1513 0.0625-0.0625 0.0655-0.0488 0.1399-0.0837 0.25-0.1562 0.2086-0.1387 0.2257-0.1675 0.0625-0.0626-0.0429 0.0274-0.0282 0.0112 0.0937-0.0624 0.0215-0.0092 0.0424-0.0196 0.0626-0.0313 0.3864-0.3189 0.6537-0.7266 0.75-1.125 0.0962-0.3984 0.0622-0.7429 0.0312-1.125-0.0029-0.0533-0.0134-0.1059-0.0312-0.1563-0.323-0.8664-1.1896-1.271-2.0626-1.2187-0.0608-0.0356-0.1242-0.0827-0.1874-0.0937-0.124-0.0217-0.1233 0.0429-0.1876 0.0624-0.0497 0.0152-0.1295-0.0171-0.1562 0-0.0108 0.0101-0.0212 0.0205-0.0312 0.0313-0.0046 0.0029-0.0273-0.0023-0.0313 0-0.055 0.0322-0.0954 0.0323-0.0937 0.0313-0.0933 0.0409-0.1728 0.1079-0.25 0.1562-0.5705 0.3551-1.1124 0.7532-1.5938 1.2188-0.4041 0.3908-0.7975 0.828-1.125 1.2812-0.1436 0.1987-0.2331 0.3839-0.3438 0.5625-0.0957 0.1527-0.1737 0.2646-0.2187 0.3437-0.0529 0.094-0.1309 0.2315-0.2187 0.4063-0.0284 0.0561-0.0594 0.1155-0.0938 0.1875-0.1169 0.2457-0.2269 0.4917-0.3125 0.7188-0.0032 0.0083 0.0031 0.0229 0 0.0312-0.0124 0.026-0.0184-0.0032-0.0313 0.0312-0.0001 0.0003-0.0311 0.0934-0.0312 0.0938-0.0034 0.0127 0 0.0314 0 0.0312-0.0015 0.012 0.0005 0.0244 0 0.0313-0.0015 0.0115 0.0005 0.0249 0 0.0313-0.0427 0.132-0.0901 0.2604-0.125 0.375-0.0931 0.3063-0.2142 0.6513-0.2812 1.0002-0.0279 0.144-0.0248 0.209-0.0313 0.25-0.0181 0.112-0.0227 0.217-0.0313 0.281-0.025 0.189-0.0478 0.38-0.0624 0.594-0.015 0.217-0.0326 0.437-0.0313 0.687 0.0012 0.234 0.0155 0.447 0.0313 0.657 0.0088 0.118 0.0201 0.242 0.0312 0.343 0.018 0.164 0.0304 0.34 0.0625 0.531 0.021 0.126 0.038 0.163 0.0313 0.126 0.0375 0.205 0.1098 0.406 0.1562 0.593 0.0381 0.154 0.0596 0.322 0.125 0.531 0.0528 0.17 0.1081 0.338 0.1562 0.469 0.0025 0.011-0.0034 0.022 0 0.031 0.0552 0.148 0.1073 0.27 0.125 0.313 0.0495 0.121 0.1174 0.255 0.1876 0.406 0.0912 0.197 0.1768 0.333 0.25 0.469 0.0901 0.168 0.197 0.346 0.3124 0.531-0.0368-0.059-0.0352-0.011 0.0313 0.094 0.1173 0.185 0.249 0.36 0.375 0.531 0.1429 0.195 0.271 0.372 0.4063 0.532-0.0544-0.065-0.0169-0.034 0.0937 0.093 0.067 0.077 0.089 0.092 0.0625 0.063 0.1452 0.163 0.2672 0.298 0.375 0.406 0.1077 0.108 0.2432 0.23 0.4062 0.375 0.0869 0.077 0.1323 0.136 0.1563 0.156 0.1624 0.138 0.3471 0.281 0.5625 0.438 0.0109 0.008 0.0759 0.079 0.1875 0.156 0.1792 0.124 0.3643 0.226 0.5625 0.344 0.1382 0.081 0.2235 0.141 0.25 0.156 0.2003 0.111 0.3954 0.189 0.5938 0.281 0.151 0.07 0.2854 0.138 0.4062 0.188 0.0435 0.018 0.1646 0.07 0.3125 0.125 0.0093 0.003 0.0203-0.003 0.0313 0 0.1922 0.07 0.3805 0.11 0.5312 0.156 0.1387 0.042 0.3125 0.103 0.5312 0.156 0.2908 0.071 0.5538 0.146 0.8438 0.188 0.031 0.004 0.118 0.018 0.219 0.031 0.25 0.031 0.492 0.052 0.75 0.062 0.272 0.012 0.541 0.012 0.812 0 0.258-0.01 0.5-0.031 0.75-0.062 0.129-0.016 0.206-0.034 0.188-0.031-0.12 0.017-0.082 0.032 0.125 0 0.271-0.042 0.532-0.127 0.781-0.188 0.218-0.053 0.393-0.114 0.531-0.156 0.167-0.051 0.334-0.095 0.5-0.156 0.191-0.07 0.337-0.163 0.469-0.219 0.019-0.008 0.105-0.027 0.25-0.094 0.238-0.109 0.505-0.204 0.75-0.344-0.028 0.016-0.011-0.019 0.062-0.062 0.232-0.134 0.423-0.257 0.594-0.375 0.073-0.05 0.187-0.125 0.313-0.219 0.044-0.032 0.075-0.055 0.125-0.094 0.205-0.158 0.38-0.332 0.531-0.468 0.02-0.018 0.086-0.061 0.187-0.156 0.061-0.058 0.127-0.096 0.157-0.126 0.127-0.125 0.253-0.266 0.406-0.437 0.122-0.136 0.205-0.257 0.25-0.313 0.123-0.148 0.205-0.258 0.313-0.406 0.049-0.067 0.1-0.134 0.093-0.125-0.081 0.115-0.04 0.101 0.094-0.093 0.124-0.18 0.226-0.365 0.344-0.563 0.033-0.057 0.02-0.061 0.031-0.094 0.054-0.093 0.067-0.111 0.062-0.093 0.079-0.134 0.167-0.27 0.25-0.438 0.006-0.012 0.017-0.031 0.032-0.062 0.135-0.279 0.27-0.594 0.375-0.876 0.093-0.248 0.151-0.483 0.219-0.718 0.012-0.028 0.022-0.03 0.031-0.063 0.004-0.016-0.003-0.015 0-0.031 0.004-0.017-0.003-0.015 0-0.031 0.036-0.132 0.086-0.292 0.125-0.469 0.042-0.196 0.097-0.382 0.125-0.562 0.029-0.193 0.018-0.221 0-0.094 0.018-0.125 0.045-0.286 0.062-0.469 0.014-0.15 0.025-0.311 0.031-0.469 0.003-0.061 0.001-0.07 0-0.062 0.008-0.228 0.009-0.491 0-0.719 0-0.005 0.006-0.05 0-0.156-0.003-0.065-0.02-0.056-0.031-0.094-0.003-0.052 0.007-0.037 0-0.063-0.011-0.024-0.028-0.087-0.031-0.093-0.014-0.16-0.011-0.317-0.031-0.469 0.009 0.073 0.033-0.004 0-0.219-0.041-0.26-0.128-0.483-0.188-0.7185-0.001 0.0119 0.01 0.0042-0.031-0.1563-0.002-0.0323 0.017-0.028 0-0.0937-0.055-0.2094-0.127-0.3628-0.188-0.5313 0-0.0057 0.001-0.0234 0-0.0312 0-0.0063 0.001-0.0229 0-0.0312-0.001-0.0066 0.004-0.0186 0-0.0313-0.003-0.0227-0.031-0.0935-0.031-0.0937-0.014-0.0417-0.028-0.0963-0.062-0.1876-0.069-0.1848-0.159-0.3305-0.219-0.4687-0.033-0.0756-0.046-0.0964-0.031-0.0625-0.006-0.0154 0.007-0.0156 0-0.0312-0.088-0.195-0.169-0.3405-0.219-0.4376-0.086-0.1688-0.195-0.3655-0.312-0.5624-0.127-0.212-0.23-0.4409-0.407-0.6876-0.03-0.0423-0.018-0.0159-0.031-0.0312-0.04-0.0552-0.024-0.0239-0.031-0.0312-0.002-0.0003 0-0.0328 0-0.0313-0.194-0.2657-0.366-0.4382-0.5-0.5937-0.165-0.1902-0.368-0.4064-0.594-0.625-0.217-0.2102-0.432-0.3751-0.625-0.5313-0.282-0.2291-0.578-0.464-0.938-0.6875-0.01-0.0003-0.02-0.0003-0.031 0-0.029-0.0239-0.06-0.0449-0.093-0.0625-0.021-0.0117-0.042-0.0221-0.063-0.0313-0.033-0.0167-0.059-0.0473-0.094-0.0624 0.087 0.0498 0.055 0.0058-0.125-0.0938-0.114-0.064-0.246-0.0861-0.375-0.0625z"/>
+ <path id="path2404" style="fill-rule:evenodd;fill:#3a3935" d="m12.052 1.5594c-0.554 0-1.001 0.4463-1.001 1.0006v7.504c0 0.554 0.447 1.001 1.001 1.001s1.001-0.447 1.001-1.001v-7.504c0-0.5543-0.447-1.0006-1.001-1.0006zm-4.5493 2.6577c-0.097 0.0362-0.1812 0.0879-0.2658 0.1407-0.0001-0.0001 0-0.0156 0-0.0156-0.5418 0.3373-1.0371 0.7391-1.4851 1.1725-0.3817 0.3691-0.724 0.7621-1.0318 1.1881-0.1262 0.1745-0.2465 0.3489-0.3596 0.5315-0.0671 0.1071-0.1247 0.2177-0.1876 0.3283-0.07 0.1242-0.1393 0.248-0.2032 0.3752-0.03 0.0593-0.0651 0.1119-0.0938 0.172-0.1083 0.2274-0.2081 0.4678-0.2971 0.7035-0.0041 0.0109-0.0115 0.0203-0.0156 0.0313-0.0018 0.0047 0.0017 0.0109 0 0.0156-0.0634 0.1706-0.119 0.3416-0.172 0.5159-0.0929 0.3057-0.1753 0.6146-0.2345 0.9219-0.0169 0.088-0.0326 0.178-0.0469 0.266-0.0134 0.083-0.0202 0.167-0.0313 0.25-0.025 0.189-0.0494 0.372-0.0625 0.563-0.0152 0.221-0.0167 0.437-0.0156 0.657 0.001 0.21 0.0156 0.417 0.0312 0.625 0.0078 0.103 0.0043 0.21 0.0157 0.313 0.0185 0.168 0.0502 0.334 0.0781 0.5 0.007 0.041 0.0082 0.084 0.0157 0.125 0.0339 0.186 0.0797 0.364 0.125 0.547 0.043 0.174 0.087 0.344 0.1408 0.516 0.0441 0.142 0.0896 0.283 0.1407 0.422 0.0057 0.016 0.0098 0.032 0.0156 0.047 0.0334 0.09 0.0734 0.178 0.1094 0.266 0.0534 0.13 0.1126 0.263 0.172 0.391 0.0739 0.159 0.1523 0.316 0.2345 0.469 0.0912 0.17 0.1794 0.336 0.2814 0.5 0.0137 0.022 0.033 0.041 0.0469 0.063 0.109 0.171 0.2233 0.336 0.3439 0.5 0.1256 0.171 0.2546 0.34 0.3909 0.5 0.026 0.031 0.0516 0.064 0.0781 0.094 0.0192 0.022 0.0432 0.041 0.0626 0.062 0.116 0.131 0.2367 0.253 0.3595 0.376 0.1227 0.123 0.2449 0.243 0.3752 0.359 0.0525 0.047 0.1029 0.096 0.1564 0.141 0.1706 0.145 0.3488 0.289 0.5315 0.422 0.0574 0.042 0.1136 0.085 0.172 0.125 0.1725 0.119 0.3491 0.236 0.5315 0.344 0.0768 0.045 0.1564 0.082 0.2345 0.125 0.1834 0.101 0.3703 0.192 0.5628 0.281 0.1278 0.06 0.2604 0.119 0.3908 0.172 0.0881 0.036 0.176 0.076 0.2658 0.11 0.0156 0.006 0.0312 0.01 0.0469 0.016 0.1593 0.058 0.3221 0.106 0.4846 0.156 0.1673 0.051 0.3322 0.1 0.5003 0.141 0.2734 0.066 0.5384 0.132 0.8134 0.172 0.061 0.008 0.125 0.007 0.187 0.015 0.239 0.03 0.481 0.053 0.719 0.063 0.258 0.011 0.511 0.011 0.766 0 0.239-0.01 0.48-0.033 0.719-0.063 0.052-0.006 0.105-0.008 0.157-0.015 0.041-0.006 0.084-0.01 0.125-0.016 0.244-0.038 0.492-0.098 0.735-0.156 0.167-0.041 0.333-0.091 0.5-0.141 0.159-0.048 0.313-0.1 0.469-0.156 0.154-0.057 0.303-0.124 0.453-0.188 0.078-0.033 0.158-0.059 0.235-0.094 0.234-0.108 0.467-0.218 0.688-0.344 0.022-0.012 0.04-0.034 0.062-0.047 0.195-0.112 0.38-0.234 0.563-0.359 0.096-0.066 0.188-0.134 0.281-0.204 0.045-0.033 0.097-0.059 0.141-0.093 0.172-0.134 0.339-0.278 0.5-0.422 0.058-0.052 0.116-0.104 0.172-0.157 0.043-0.04 0.083-0.083 0.125-0.125 0.137-0.134 0.278-0.263 0.407-0.406 0.079-0.089 0.142-0.19 0.219-0.282 0.113-0.137 0.222-0.277 0.328-0.422 0.019-0.026 0.043-0.051 0.063-0.078 0.026-0.037 0.052-0.072 0.078-0.109 0.119-0.173 0.236-0.35 0.344-0.532 0.015-0.026 0.031-0.052 0.047-0.078 0.097-0.169 0.194-0.341 0.281-0.516 0.01-0.02 0.021-0.042 0.031-0.063 0.125-0.257 0.229-0.529 0.328-0.797 0.084-0.225 0.153-0.456 0.219-0.688 0.008-0.027 0.024-0.051 0.032-0.078 0.003-0.011 0.012-0.02 0.015-0.031 0.041-0.151 0.077-0.3 0.11-0.453 0.038-0.178 0.066-0.354 0.093-0.532 0.005-0.031 0.012-0.063 0.016-0.094 0.021-0.144 0.034-0.292 0.047-0.438 0.013-0.145 0.025-0.293 0.031-0.437 0.001-0.026-0.001-0.052 0-0.078 0.008-0.215 0.008-0.429 0-0.641-0.002-0.053 0.003-0.105 0-0.157-0.001-0.031-0.013-0.062-0.015-0.094-0.013-0.201-0.036-0.394-0.063-0.594-0.009-0.068-0.005-0.135-0.016-0.203-0.043-0.279-0.1-0.566-0.171-0.844-0.005-0.0162-0.012-0.0308-0.016-0.0469-0.059-0.2259-0.126-0.4481-0.203-0.6723-0.002-0.0045 0.001-0.0111 0-0.0156-0.022-0.0631-0.039-0.1247-0.063-0.1876-0.058-0.1557-0.137-0.303-0.203-0.4534-0.009-0.0192-0.007-0.0433-0.016-0.0625-0.005-0.0108-0.011-0.0205-0.015-0.0313-0.063-0.1391-0.135-0.2721-0.204-0.4065-0.089-0.1749-0.181-0.3469-0.281-0.5159-0.133-0.2227-0.271-0.4455-0.422-0.6566-0.004-0.0059-0.011-0.0097-0.016-0.0156-0.007-0.0092-0.009-0.022-0.015-0.0313-0.148-0.2029-0.32-0.3878-0.485-0.5784-0.174-0.201-0.355-0.3926-0.547-0.5784-0.185-0.1792-0.377-0.3522-0.579-0.5159-0.286-0.2322-0.573-0.4588-0.891-0.6566 0 0-0.015 0.0155-0.015 0.0156-0.081-0.0504-0.159-0.1055-0.251-0.1407-0.003-0.0022-0.011 0.0022-0.015 0-0.043-0.0246-0.082-0.0542-0.125-0.0782l-0.016 0.0469c-0.736-0.1921-1.511 0.1946-1.782 0.9224-0.243 0.6512 0.02 1.352 0.563 1.7353l-0.016 0.0313c0.107 0.0646 0.21 0.132 0.313 0.2032 0.065 0.0457 0.124 0.0927 0.187 0.1407 0.041 0.0306 0.085 0.0622 0.125 0.0938 0.107 0.0856 0.213 0.1737 0.313 0.2658 0.028 0.0249 0.051 0.0527 0.078 0.0781 0.095 0.0908 0.193 0.1695 0.282 0.2658 0.051 0.0549 0.091 0.115 0.14 0.172 0.029 0.033 0.067 0.0602 0.094 0.0938 0.088 0.1059 0.17 0.2312 0.25 0.3439 0.005 0.0059 0.012 0.0097 0.016 0.0156 0.096 0.1365 0.18 0.2761 0.266 0.4221 0.056 0.0968 0.12 0.1962 0.172 0.2971 0.045 0.089 0.084 0.1746 0.125 0.2657 0.018 0.0411 0.029 0.0834 0.047 0.1251 0.056 0.1337 0.109 0.2689 0.156 0.4065 0.047 0.138 0.088 0.281 0.125 0.422 0.051 0.196 0.094 0.382 0.125 0.579s0.052 0.397 0.063 0.594c0.01 0.196 0.008 0.399 0 0.594-0.005 0.101-0.006 0.195-0.016 0.297-0.009 0.094-0.018 0.188-0.031 0.281-0.002 0.01 0.001 0.021 0 0.031-0.025 0.171-0.07 0.333-0.11 0.501-0.017 0.071-0.027 0.147-0.047 0.218-0.014 0.052-0.031 0.105-0.046 0.157-0.031 0.101-0.058 0.197-0.094 0.297-0.023 0.064-0.053 0.124-0.078 0.187-0.054 0.133-0.111 0.265-0.172 0.391-0.014 0.027-0.034 0.052-0.047 0.078-0.08 0.158-0.159 0.321-0.25 0.469-0.07 0.112-0.143 0.221-0.219 0.329-0.02 0.027-0.043 0.051-0.063 0.078-0.064 0.086-0.135 0.167-0.203 0.25-0.056 0.067-0.114 0.139-0.172 0.203-0.066 0.074-0.133 0.149-0.203 0.219s-0.146 0.137-0.219 0.203c-0.072 0.066-0.143 0.126-0.219 0.188-0.103 0.085-0.204 0.173-0.313 0.25-0.04 0.029-0.084 0.051-0.125 0.078-0.118 0.081-0.235 0.163-0.359 0.235-0.034 0.019-0.075 0.028-0.11 0.047-0.134 0.074-0.267 0.155-0.406 0.219-0.062 0.028-0.125 0.052-0.188 0.078-0.103 0.043-0.207 0.072-0.312 0.109-0.011 0.004-0.021 0.012-0.032 0.016-0.15 0.052-0.299 0.1-0.453 0.14-0.17 0.045-0.33 0.081-0.5 0.11-0.036 0.006-0.074 0.01-0.11 0.016-0.098 0.014-0.198 0.021-0.297 0.031-0.287 0.029-0.568 0.044-0.86 0.031-0.021-0.001-0.041 0.001-0.062 0-0.067-0.004-0.136-0.01-0.203-0.016-0.132-0.011-0.261-0.026-0.391-0.046-0.16-0.025-0.325-0.056-0.485-0.094-0.036-0.009-0.073-0.022-0.109-0.032-0.037-0.009-0.073-0.02-0.11-0.031-0.157-0.044-0.316-0.099-0.4688-0.156-0.0111-0.004-0.0202-0.012-0.0312-0.016-0.1713-0.065-0.3386-0.124-0.5003-0.203-0.0273-0.013-0.0512-0.033-0.0782-0.047-0.1577-0.079-0.321-0.158-0.469-0.25-0.0121-0.008-0.0192-0.024-0.0312-0.031-0.1624-0.103-0.3191-0.213-0.469-0.329-0.0943-0.073-0.1923-0.14-0.2814-0.218-0.0359-0.032-0.0743-0.062-0.1095-0.094-0.0649-0.06-0.1256-0.126-0.1876-0.188-0.0621-0.062-0.128-0.123-0.1876-0.187-0.1126-0.124-0.2111-0.26-0.3126-0.391-0.1161-0.15-0.226-0.307-0.3283-0.469-0.0064-0.01-0.0094-0.021-0.0157-0.032-0.1029-0.165-0.1938-0.338-0.2814-0.515-0.0254-0.052-0.0541-0.104-0.0781-0.157-0.04-0.087-0.0738-0.176-0.1095-0.266-0.0192-0.047-0.0444-0.092-0.0625-0.14-0.0076-0.021-0.0083-0.042-0.0156-0.063-0.0205-0.057-0.0438-0.114-0.0626-0.172-0.04-0.123-0.093-0.25-0.125-0.375-0.0343-0.134-0.0532-0.27-0.0782-0.406-0.0237-0.13-0.0476-0.262-0.0625-0.391-0.0116-0.1-0.0092-0.198-0.0157-0.297-0.007-0.109-0.0145-0.219-0.0156-0.329-0.0014-0.169 0.0027-0.347 0.0156-0.515 0.013-0.169 0.0356-0.335 0.0626-0.501 0.0303-0.186 0.0618-0.365 0.1094-0.547 0.0081-0.031 0.0226-0.063 0.0313-0.094 0.0395-0.142 0.0909-0.283 0.1407-0.4218 0.0088-0.0247 0.0064-0.0535 0.0156-0.0782 0.0243-0.0653 0.0518-0.1236 0.0782-0.1876 0.024-0.0583 0.0523-0.1145 0.0781-0.172 0.0584-0.1294 0.1212-0.2519 0.1876-0.3752 0.0592-0.11 0.1217-0.222 0.1876-0.3283 0.0569-0.0917 0.1258-0.177 0.1876-0.2657 0.0581-0.0825 0.1102-0.1713 0.172-0.2502 0.0435-0.0561 0.0795-0.1173 0.1251-0.1719 0.0237-0.0281 0.0539-0.0506 0.0781-0.0782 0.0847-0.0967 0.1755-0.1909 0.2658-0.2814 0.1161-0.1163 0.2349-0.2224 0.3596-0.3283 0.0791-0.0673 0.1521-0.1402 0.2345-0.2032 0.0204-0.0158 0.0418-0.0314 0.0625-0.0469 0.0934-0.0696 0.1843-0.1393 0.2814-0.2033 0.0252-0.0167 0.0526-0.0304 0.0782-0.0469 0.0417-0.0265 0.0827-0.0525 0.125-0.0781 0.6329-0.5223 0.6244-1.0188 0.5628-1.7666-0.2703-0.7253-1.0487-1.1099-1.7822-0.9224-0.0207-0.0879-0.1037 0.0208-0.1563 0.0313z"/>
+ </g>
+</svg>
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/banshee.rc b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/banshee.rc
new file mode 100644
index 00000000..d49aaf7d
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/banshee.rc
@@ -0,0 +1,23 @@
+# ==============================================================================
+# BANSHEE SPECIFIC SETTINGS
+# ==============================================================================
+
+style "banshee_scrollbar" {
+ engine "murrine" {
+ roundness = 20
+ }
+}
+
+widget "__gtksharp_1*SeekSlider*" style "scale"
+widget "__gtksharp_1*Player*croll*" style "banshee_scrollbar"
+
+widget_class "__gtksharp_1*<GtkToolbar>*" style "default"
+widget_class "__gtksharp_1*<GtkButton>*" style "button"
+#widget_class "__gtksharp_1*<GtkScale>*" style "scale"
+
+
+
+
+
+
+
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/chromium.rc b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/chromium.rc
new file mode 100644
index 00000000..ededd768
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/chromium.rc
@@ -0,0 +1,39 @@
+# ==============================================================================
+# CHROMIUM SPECIFIC SETTINGS
+# ==============================================================================
+
+style "chromium_toolbar_button" {
+ engine "murrine" {
+ roundness = 3
+ textstyle = 0
+ }
+}
+
+style "chrome-gtk-frame"
+{
+ ChromeGtkFrame::frame-color = "#3c3b37"
+ ChromeGtkFrame::inactive-frame-color = "#3c3b37"
+
+ ChromeGtkFrame::frame-gradient-size = 16
+ ChromeGtkFrame::frame-gradient-color = "#5c5b56"
+
+ ChromeGtkFrame::incognito-frame-color = lighter ("#3c3b37")
+ ChromeGtkFrame::incognito-inactive-frame-color = lighter ("#3c3b37")
+
+ ChromeGtkFrame::incognito-frame-gradient-size = 16
+ ChromeGtkFrame::incognito-frame-gradient-color = "#5c5b56"
+
+ ChromeGtkFrame::scrollbar-trough-color = shade (0.912, @bg_color)
+ ChromeGtkFrame::scrollbar-slider-prelight-color = shade (1.04, @bg_color)
+ ChromeGtkFrame::scrollbar-slider-normal-color = @bg_color
+}
+
+class "ChromeGtkFrame" style "chrome-gtk-frame"
+
+widget_class "*Chrom*Button*" style "chromium_toolbar_button"
+
+
+
+
+
+
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/ff.rc b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/ff.rc
new file mode 100644
index 00000000..3f08b2e7
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/ff.rc
@@ -0,0 +1,30 @@
+# ==============================================================================
+# FIREFOX SPECIFIC SETTINGS
+# ==============================================================================
+
+style "ff-default" {
+ GtkCheckButton::indicator-size = 14
+}
+
+style "ff-statusbar" {
+}
+
+#widget "MozillaGtkWidget*Toolbar*" style "theme-toolbar"
+#widget "MozillaGtkWidget*Statusbar*" style "ff-statusbar"
+
+
+widget "MozillaGtkWidget*" style "ff-default"
+
+# ------------------------------------------------------------------------------
+# Some Firefox (3.0/3.5) GTK widgets hierarchy (maybe useful for someone)
+# ------------------------------------------------------------------------------
+
+# Top toolbars (and maybe others)
+#widget "MozillaGtkWidget.GtkFixed.GtkHandleBox.GtkToolbar" style "theme-dark-toolbar"
+
+# Findbar entry, gecko (all html) entry
+#widget "MozillaGtkWidget.GtkFixed.GtkEntry" style "theme-dark-entry"
+
+# ALL buttons
+#widget "MozillaGtkWidget.GtkFixed.GtkButton" style "theme-dark-button"
+
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/gedit.rc b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/gedit.rc
new file mode 100644
index 00000000..7455cb7c
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/gedit.rc
@@ -0,0 +1,35 @@
+style "gedit-frame"
+{
+ engine "pixmap"
+ {
+ image
+ {
+ function = SHADOW
+ }
+ }
+}
+
+style "thin"
+{
+ xthickness = 0
+ ythickness = 0
+}
+
+widget_class "*Gedit*.<GtkFrame>*" style "gedit-frame"
+widget_class "*Gedit*.<GtkScrolledWindow>" style "thin"
+widget_class "*Gedit*.<GtkArrow>*" style:highest "default"
+
+style "gedit-notebook"
+{
+ base[ACTIVE] = shade (0.94, @selected_bg_color)
+}
+
+widget_class "*GeditNotebook" style "gedit-notebook"
+widget_class "*GeditNotebook*Tab*" style "gedit-notebook"
+
+style "gedit"
+{
+ GtkComboBox::appears-as-list = 0
+}
+
+widget_class "*Gedit*" style "gedit"
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/gnome-panel.rc b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/gnome-panel.rc
new file mode 100644
index 00000000..4478befd
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/gnome-panel.rc
@@ -0,0 +1,118 @@
+# ==============================================================================
+# GNOME PANEL SPECIFIC SETTINGS
+# ==============================================================================
+
+style "panel" = "dark"
+{
+ xthickness = 0
+ ythickness = 0
+
+ bg_pixmap[NORMAL] = "img/panel.png"
+ bg[NORMAL] = "#4b4a46"
+
+ engine "murrine" {
+ #contrast = 1.0
+ textstyle = 2
+ text_shade = 0.35
+ }
+}
+
+style "panel_task_button" = "dark"
+{
+ xthickness = 3
+ xthickness = 3
+
+ GtkWidget::focus-line-width = 0
+ GtkWidget::focus_padding = 0
+ GtkWidget::interior_focus = 0
+ GtkWidget::internal_padding = 0
+
+ GtkButton::child_displacement_x = 0
+ GtkButton::child_displacement_y = 0
+ GtkButton::default_border = {0, 0, 0, 0}
+ GtkButton::default_outside_border = {0, 0, 0, 0}
+ GtkButtonBox::child_internal_pad_x = 0
+ GtkButtonBox::child_internal_pad_y = 0
+ GtkButtonBox::child_min_heigth = 0
+
+ engine "pixmap" {
+
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = NORMAL
+ file = "img/panel-button-inactive.png"
+ border = { 1, 1, 1, 1 }
+ stretch = TRUE
+ }
+
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = PRELIGHT
+ file = "img/panel-button-hover.png"
+ border = { 1, 1, 1, 1 }
+ stretch = TRUE
+ }
+
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ shadow = OUT
+ state = PRELIGHT
+ file = "img/panel-button-hover.png"
+ border = { 1, 1, 1, 1 }
+ stretch = TRUE
+
+ }
+
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ shadow = IN
+ state = PRELIGHT
+ file = "img/panel-button-hover.png"
+ border = { 1, 1, 1, 1 }
+ stretch = TRUE
+
+ }
+
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = ACTIVE
+ file = "img/panel-button-active.png"
+ border = { 4, 4, 4, 4 }
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = INSENSITIVE
+ file = "img/panel-button-inactive.png"
+ border = { 1, 1, 1, 1 }
+ stretch = TRUE
+ }
+ }
+}
+
+#widget_class "*Panel*" style "panel"
+widget "*PanelWidget*" style "panel"
+widget "*PanelApplet*" style "panel"
+widget "*fast-user-switch*" style "panel" # workaround for Fast User Switch applet
+widget "*CPUFreqApplet*" style "panel" # workaround for CpuFreq Applet
+class "PanelApp*" style "panel"
+class "PanelToplevel*" style "panel"
+#widget_class "*Mail*" style "panel"
+widget_class "*notif*" style "panel"
+
+#widget_class "*?anel*utton" style "panel_task_button" # causing problems to monodevelop
+widget "*task*" style "panel_task_button"
+widget "*.tasklist-button" style "panel_task_button"
+widget "*PanelApplet*TaskTitle*" style "panel_task_button"
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/gnome-terminal.rc b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/gnome-terminal.rc
new file mode 100644
index 00000000..403991d8
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/gnome-terminal.rc
@@ -0,0 +1,52 @@
+# ==============================================================================
+# GNOME TERMINAL SPECIFIC SETTINGS
+# ==============================================================================
+
+style "terminal_window" = "dark" {
+}
+
+style "terminal_menubar"
+{
+ engine "murrine" {
+ }
+}
+
+style "terminal_notebook" = "dark"
+{
+ fg[ACTIVE] = mix (0.8, "#dfdbd2", "#3c3b37")
+
+ engine "murrine" {
+ }
+}
+
+style "terminal_scrollbar" = "scrollbar"
+{
+ bg[NORMAL] = "#3c3b37"
+ bg[PRELIGHT] = shade(1.08, "#3c3b37")
+ bg[ACTIVE] = shade(0.94, "#3c3b37")
+ bg[SELECTED] = shade(1.0, @selected_bg_color)
+ bg[INSENSITIVE] = "#3c3b37"
+
+ engine "murrine" {
+ }
+}
+
+style "terminal_screen"
+{
+ text[NORMAL] = "#ffffff"
+ base[NORMAL] = "#300a24"
+
+ TerminalScreen::background-darkness = 0.95
+}
+
+widget "*TerminalWindow*" style "terminal_window"
+#widget "*TerminalWindow.*.*enu?ar" style "terminal_menubar"
+widget "*TerminalWindow.*.GtkNotebook*" style "terminal_notebook"
+widget "*TerminalWindow.*.GtkNotebook.*.GtkVScrollbar*" style "terminal_scrollbar"
+#widget "*TerminalWindow.*.GtkNotebook*utton*" style "terminal_button"
+widget "*TerminalWindow.*.TerminalScreen*" style "terminal_screen"
+
+
+
+
+
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/arrow-down.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/arrow-down.png
new file mode 100644
index 00000000..459c8016
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/arrow-down.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/handle-h.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/handle-h.png
new file mode 100644
index 00000000..fa6c44fb
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/handle-h.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/handle-v.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/handle-v.png
new file mode 100644
index 00000000..fa6c44fb
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/handle-v.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-center-normal.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-center-normal.png
new file mode 100644
index 00000000..1766ef39
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-center-normal.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-center-prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-center-prelight.png
new file mode 100644
index 00000000..3e8b9740
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-center-prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-center-pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-center-pressed.png
new file mode 100644
index 00000000..2fe0720a
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-center-pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-left-normal.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-left-normal.png
new file mode 100644
index 00000000..e20f66b9
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-left-normal.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-left-prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-left-prelight.png
new file mode 100644
index 00000000..fa7f3cf1
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-left-prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-left-pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-left-pressed.png
new file mode 100644
index 00000000..fa68e6ba
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-left-pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-right-normal.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-right-normal.png
new file mode 100644
index 00000000..d46ec888
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-right-normal.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-right-prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-right-prelight.png
new file mode 100644
index 00000000..d6aea289
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-right-prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-right-pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-right-pressed.png
new file mode 100644
index 00000000..7fbcc146
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/mode-right-pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel-button-active.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel-button-active.png
new file mode 100644
index 00000000..8810e14f
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel-button-active.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel-button-hover.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel-button-hover.png
new file mode 100644
index 00000000..b309d8db
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel-button-hover.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel-button-inactive.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel-button-inactive.png
new file mode 100644
index 00000000..df63d807
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel-button-inactive.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel.png
new file mode 100644
index 00000000..eea4adc7
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/img/panel.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/nautilus.rc b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/nautilus.rc
new file mode 100644
index 00000000..1f5fd663
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/nautilus.rc
@@ -0,0 +1,11 @@
+# ==============================================================================
+# NAUTILUS SPECIFIC SETTINGS
+# ==============================================================================
+
+style "nautilus_info_pane" {
+ bg[NORMAL] = @bg_color
+}
+
+widget_class "*Nautilus*<GtkNotebook>*<GtkEventBox>" style "nautilus_info_pane"
+widget_class "*Nautilus*<GtkButton>" style "notebook_button"
+widget_class "*Nautilus*<GtkButton>*<GtkLabel>" style "notebook_button"
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/ubuntuone.rc b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/ubuntuone.rc
new file mode 100644
index 00000000..177b3bf8
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/apps/ubuntuone.rc
@@ -0,0 +1,49 @@
+# ==============================================================================
+# UBUNTU ONE SPECIFIC SETTINGS
+# ==============================================================================
+
+style "ubuntuone-button" = "button" { engine "murrine" { border_shades = {0.3, 0.2} shadow_shades = {0.9,3.0} } }
+style "ubuntuone-sep" = "dark" { engine "murrine" { contrast = 1.4 } }
+style "ubuntuone-buttonfix" = "default" { GtkWidget ::focus-line-width = 0 fg[ACTIVE] = "#fff" }
+
+style "mode-button" {
+ engine "pixmap" {
+ image { function = BOX state = PRELIGHT file = "img/mode-center-prelight.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ image { function = BOX state = NORMAL file = "img/mode-center-normal.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ image { function = BOX state = ACTIVE file = "img/mode-center-pressed.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ image { function = BOX state = INSENSITIVE file = "img/mode-center-pressed.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ image { function = BOX state = SELECTED file = "img/mode-center-pressed.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ }
+}
+
+style "mode-left" {
+ engine "pixmap" {
+ image { function = BOX state = PRELIGHT file = "img/mode-left-prelight.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ image { function = BOX state = NORMAL file = "img/mode-left-normal.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ image { function = BOX state = ACTIVE file = "img/mode-left-pressed.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ image { function = BOX state = INSENSITIVE file = "img/mode-left-pressed.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ image { function = BOX state = SELECTED file = "img/mode-left-pressed.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ }
+}
+
+style "mode-right" {
+ engine "pixmap" {
+ image { function = BOX state = PRELIGHT file = "img/mode-right-prelight.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ image { function = BOX state = NORMAL file = "img/mode-right-normal.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ image { function = BOX state = ACTIVE file = "img/mode-right-pressed.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ image { function = BOX state = INSENSITIVE file = "img/mode-right-pressed.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ image { function = BOX state = SELECTED file = "img/mode-right-pressed.png" border = { 3, 13, 3, 3 } stretch = TRUE }
+ }
+}
+
+widget "*ManagementPanel.GtkVBox.GtkEventBox.GtkVBox.GtkHBox.GtkHBox*Button" style "ubuntuone-button"
+widget "*ManagementPanel.GtkVBox.GtkEventBox.*GtkHButtonBox*Button" style "mode-button"
+widget "*ManagementPanel.GtkVBox.GtkEventBox.*GtkHButtonBox*ModeLeft*" style "mode-left"
+widget "*ManagementPanel.GtkVBox.GtkEventBox.*GtkHButtonBox*ModeRight*" style "mode-right"
+widget "*ManagementPanel.GtkVBox.GtkEventBox.*GtkHButtonBox*" style:highest "ubuntuone-buttonfix"
+widget "*ManagementPanel.GtkVBox.GtkEventBox.GtkVBox.GtkHBox.GtkHSeparator" style "ubuntuone-sep"
+widget "*ManagementPanel.GtkVBox.GtkNotebook.GtkVBox.GtkEventBox*" style "dark"
+widget "*ManagementPanel*DevicesPanel.GtkEventBox*" style "dark"
+widget "*ManagementPanel.GtkVBox.GtkEventBox*" style "dark"
+widget "*OverviewPanel.GtkVBox.GtkEventBox*" style "dark"
+
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/gtkrc b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/gtkrc
new file mode 100644
index 00000000..dc7d7798
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-2.0/gtkrc
@@ -0,0 +1,721 @@
+gtk-color-scheme = "base_color:#ffffff\nfg_color:#4c4c4c\ntooltip_fg_color:#000000\nselected_bg_color:#f07746\nselected_fg_color:#FFFFFF\ntext_color:#3C3C3C\nbg_color:#F2F1F0\ntooltip_bg_color:#f5f5b5\nlink_color:#DD4814"
+
+gtk-icon-sizes = "panel-menu=22,22:gtk-button=16,16"
+
+gtk-auto-mnemonics = 1
+
+style "default" {
+ xthickness = 1
+ ythickness = 1
+
+ #######################
+ # Style Properties
+ #######################
+ GtkWidget::new-tooltip-style = 1
+ GtkButton::child-displacement-x = 1
+ GtkButton::child-displacement-y = 1
+ GtkButton::default-border = { 0, 0, 0, 0 }
+
+ GtkCheckButton::indicator-size = 16
+
+ GtkPaned::handle-size = 6
+
+ GtkRange::trough-border = 0
+ GtkRange::slider-width = 14
+ GtkRange::stepper-size = 13
+ GtkRange::trough-under-steppers = 1
+
+ GtkScale::trough-border = 0
+ GtkScale::slider-width = 23
+ GtkScale::slider-length = 14
+ GtkScale::trough-side-details = 1
+
+ GtkScrollbar::activate-slider = 1
+ GtkScrollbar::trough-border = 0
+ GtkScrollbar::slider-width = 13
+ GtkScrollbar::min-slider-length = 31
+
+ GtkMenuBar::internal-padding = 0
+ GtkMenuBar::shadow-type = GTK_SHADOW_NONE
+ GtkExpander::expander-size = 11
+ GtkToolbar::internal-padding = 1
+ GtkToolbar::shadow-type = GTK_SHADOW_NONE
+ GtkTreeView::expander-size = 7
+ GtkTreeView::vertical-separator = 0
+# GtkTreeView::odd-row-color = shade (0.96, @base_color)
+ GtkNotebook::tab-overlap = -1
+
+ GtkMenu::horizontal-padding = 0
+ GtkMenu::vertical-padding = 3
+
+ WnckTasklist::fade-overlay-rect = 0
+ # The following line hints to gecko (and possibly other appliations)
+ # that the entry should be drawn transparently on the canvas.
+ # Without this, gecko will fill in the background of the entry.
+ GtkEntry::honors-transparent-bg-hint = 1
+ GtkEntry::state-hint = 0
+
+ GtkEntry::progress-border = { 2, 2, 2, 2 }
+
+ GtkProgressBar::min-horizontal-bar-height = 14
+ GtkProgressBar::min-vertical-bar-width = 14
+
+ GtkImage::x-ayatana-indicator-dynamic = 1
+ GtkMenuBar::window-dragging = 1
+
+ GtkWidget::link-color = @link_color
+ GtkWidget::visited-link-color = @text_color
+
+ ####################
+ # Color Definitions
+ ####################
+ bg[NORMAL] = @bg_color
+ bg[PRELIGHT] = shade (1.02, @bg_color)
+ bg[SELECTED] = @selected_bg_color
+ bg[INSENSITIVE] = shade (0.95, @bg_color)
+ bg[ACTIVE] = shade (0.9, @bg_color)
+
+ fg[NORMAL] = @fg_color
+ fg[PRELIGHT] = @fg_color
+ fg[SELECTED] = @selected_fg_color
+ fg[INSENSITIVE] = darker (@bg_color)
+ fg[ACTIVE] = @fg_color
+
+ text[NORMAL] = @text_color
+ text[PRELIGHT] = @text_color
+ text[SELECTED] = @selected_fg_color
+ text[INSENSITIVE] = shade (0.8, @bg_color)
+ text[ACTIVE] = darker (@text_color)
+
+ base[NORMAL] = @base_color
+ base[PRELIGHT] = shade (0.98, @bg_color)
+ base[SELECTED] = @selected_bg_color
+ base[INSENSITIVE] = shade (0.97, @bg_color)
+ base[ACTIVE] = shade (0.94, @bg_color)
+
+ engine "murrine" {
+ contrast = 0.6
+ arrowstyle = 2
+ reliefstyle = 3
+ highlight_shade = 1.0
+ glazestyle = 0
+ default_button_color = shade (1.1, @selected_bg_color)
+ gradient_shades = {1.1, 1.0, 1.0, 0.9}
+ roundness = 4
+ lightborder_shade = 1.26
+ lightborderstyle = 1
+ listviewstyle = 2
+ progressbarstyle = 0
+ colorize_scrollbar = FALSE
+ menubaritemstyle = 1
+ menubarstyle = 1
+ menustyle = 2
+ focusstyle = 3
+ handlestyle = 1
+ sliderstyle = 3
+ scrollbarstyle = 2
+ stepperstyle = 3
+# rgba = TRUE
+ }
+}
+
+style "dark"
+{
+ color["bg_color_dark"] = "#3c3b37"
+ color["fg_color_dark"] = "#dfdbd2"
+ color["selected_fg_color_dark"] = "#ffffff"
+
+ fg[NORMAL] = @fg_color_dark
+ fg[PRELIGHT] = shade (1.15, @fg_color_dark)
+ fg[ACTIVE] = @fg_color_dark
+ fg[SELECTED] = @selected_fg_color_dark
+ fg[INSENSITIVE] = shade (0.5, @fg_color_dark)
+
+ bg[NORMAL] = @bg_color_dark
+ bg[ACTIVE] = shade (0.8, @bg_color_dark)
+ bg[SELECTED] = @selected_bg_color
+ bg[PRELIGHT] = shade (1.0, "#4D4C48")
+ bg[INSENSITIVE] = shade (0.85, @bg_color_dark)
+
+ text[NORMAL] = @fg_color_dark
+ text[PRELIGHT] = shade (1.15, @fg_color_dark)
+ text[SELECTED] = @selected_fg_color_dark
+ text[ACTIVE] = @fg_color_dark
+ text[INSENSITIVE] = mix (0.5, @bg_color, @bg_color_dark)
+}
+
+style "wide" {
+ xthickness = 2
+ ythickness = 2
+}
+
+style "wider" {
+ xthickness = 3
+ ythickness = 3
+}
+
+style "entry" {
+ xthickness = 3
+ ythickness = 3
+
+ engine "murrine" {
+ }
+}
+
+style "vscale" {
+}
+
+style "hscale" {
+}
+
+style "button" {
+ xthickness = 3
+ ythickness = 3
+
+ bg[NORMAL] = "#cdcdcd"
+ bg[PRELIGHT] = shade (1.04, "#cdcdcd")
+ bg[ACTIVE] = shade (0.96, "#cdcdcd")
+ bg[INSENSITIVE] = mix (0.25, @bg_color, "#e2e1e1")
+ fg[INSENSITIVE] = "#9c9c9c"
+
+ engine "murrine" {
+ #contrast = 1.0
+ border_shades = {1.0, 0.9}
+ textstyle = 1
+ glowstyle = 5
+ glow_shade = 1.1
+ #text_shade = 1.04
+ }
+}
+
+style "notebook_button" {
+
+ xthickness = 3
+ ythickness = 3
+
+ bg[NORMAL] = @bg_color
+ bg[PRELIGHT] = shade (1.04, @bg_color)
+ bg[ACTIVE] = shade (0.96, @bg_color)
+ bg[INSENSITIVE] = @bg_color
+
+ engine "murrine" {
+ #contrast = 1.0
+ textstyle = 1
+ border_shades = {0.95, 0.88}
+ glowstyle = 5
+ glow_shade = 1.02
+ lightborder_shade = 1.32
+# lightborderstyle = 0
+ #text_shade = 1.04
+ }
+}
+
+style "spinbutton" = "notebook_button" {
+ xthickness = 4
+
+ engine "murrine" {
+ }
+}
+
+style "scrollbar" = "button" {
+ xthickness = 2
+ ythickness = 2
+
+ bg[NORMAL] = @bg_color
+ bg[PRELIGHT] = shade (1.04, @bg_color)
+
+ bg[ACTIVE] = shade (0.96, @bg_color)
+
+ engine "murrine"
+ {
+ border_shades = {0.95, 0.90}
+ roundness = 20
+ contrast = 1.0
+ trough_shades = {0.92, 0.98}
+ lightborder_shade = 1.3
+ glowstyle = 5
+ glow_shade = 1.02
+ gradient_shades = {1.2, 1.0, 1.0, 0.86}
+ trough_border_shades = {0.9, 0.98}
+ }
+}
+
+style "hscrollbar" {
+}
+
+style "vscrollbar" {
+}
+
+style "overlay_scrollbar"
+{
+ bg[SELECTED] = shade (1.0, @selected_bg_color)
+ bg[INSENSITIVE] = shade (0.85, @bg_color)
+ bg[ACTIVE] = shade (0.6, @bg_color)
+}
+
+style "scale" = "button" {
+ bg[NORMAL] = @bg_color
+ bg[PRELIGHT] = shade (1.06, @bg_color)
+ bg[ACTIVE] = shade (0.94, @bg_color)
+
+ engine "murrine" {
+ contrast = 0.6
+ border_shades = {0.9, 0.8}
+ roundness = 5
+ lightborder_shade = 1.32
+ gradient_shades = {1.1, 1.0, 1.0, 0.8}
+ handlestyle = 2
+ trough_border_shades = {0.9, 1.4}
+ glow_shade = 1.0
+# reliefstyle = 2
+# shadow_shades = { 1.0, 0.9 }
+ }
+}
+
+style "notebook_bg" {
+ bg[NORMAL] = shade (1.02, @bg_color)
+ bg[ACTIVE] = shade (0.97, @bg_color)
+ fg[ACTIVE] = mix (0.8, @fg_color, shade (0.97, @bg_color))
+}
+
+# The color is changed by the notebook_bg style, this style
+# changes the x/ythickness
+style "notebook" {
+ xthickness = 2
+ ythickness = 2
+
+ engine "murrine" {
+ roundness = 3
+ contrast = 0.8
+ focusstyle = 2
+ lightborder_shade = 1.16
+ gradient_shades = {1.1, 1.0, 1.0, 0.68}
+ }
+}
+
+style "statusbar" {
+ engine "murrine" {
+ contrast = 1.2
+ }
+}
+
+style "comboboxentry" = "notebook_button" {
+ xthickness = 3
+ ythickness = 3
+
+ engine "murrine" {
+ textstyle = 1
+ glowstyle = 5
+ glow_shade = 1.02
+ }
+}
+
+style "menubar" = "dark" {
+ engine "murrine" {
+ textstyle = 2
+ text_shade = 0.33
+ gradient_shades = {1.0, 1.0, 1.0, 1.0}
+ lightborder_shade = 1.0
+ }
+}
+
+style "toolbar" {
+ engine "murrine" {
+ textstyle = 1
+ text_shade = 1.32
+ lightborder_shade = 1.0
+ }
+}
+
+style "toolbar-button" = "notebook_button" {
+ engine "murrine" {
+ }
+}
+
+style "menu" = "dark" {
+ xthickness = 0
+ ythickness = 0
+
+ bg[NORMAL] = "#43423f"
+ bg[INSENSITIVE] = "#43423f"
+ fg[INSENSITIVE] = shade (0.54, "#43423f")
+
+ engine "murrine"
+ {
+ roundness = 0
+ }
+}
+
+style "menu_item" = "menu" {
+ xthickness = 2
+ ythickness = 3
+
+ fg[PRELIGHT] = @selected_fg_color
+
+ engine "murrine"
+ {
+ glowstyle = 5
+ glow_shade = 1.1
+ border_shades = {0.95, 0.85}
+ }
+}
+
+style "menubar_item" = "menu" {
+ xthickness = 2
+ ythickness = 3
+
+ engine "murrine" {
+ gradient_shades = {1.1, 1.0, 1.0, 0.88}
+ glowstyle = 5
+ glow_shade = 1.0
+ border_shades = {1.0, 0.9}
+ lightborderstyle = 3
+ lightborder_shade = 1.26
+ }
+}
+
+style "scale_menu_item" = "scale" {
+ GtkScale::slider-width = 21
+ GtkScale::slider-length = 13
+
+ bg[ACTIVE] = shade(0.98, "#4D4C48")
+ bg[INSENSITIVE] = shade (0.9, @bg_color)
+
+ engine "murrine" {
+ roundness = 20
+ border_shades = {1.4, 1.4}
+ reliefstyle = 0
+ lightborder_shade = 1.36
+ }
+}
+
+# This style is there to modify the separator menu items. The goals are:
+# 1. Get a specific height.
+# 2. The line should go to the edges (ie. no border at the left/right)
+style "separator_menu_item" {
+ xthickness = 1
+ ythickness = 0
+
+ GtkSeparatorMenuItem::horizontal-padding = 0
+ GtkWidget::wide-separators = 1
+ GtkWidget::separator-width = 1
+ GtkWidget::separator-height = 7
+
+ engine "murrine" {
+ contrast = 0.6
+ separatorstyle = 0
+ }
+}
+
+style "separator_tool_item" {
+ xthickness = 0
+ ythickness = 1
+
+ GtkVSeparator::vertical-padding = 0
+ GtkWidget::wide-separators = 1
+ GtkWidget::separator-width = 7
+ GtkWidget::separator-height = 1
+
+ engine "murrine" {
+ contrast = 0.6
+ separatorstyle = 0
+ }
+}
+
+style "frame_title" {
+ fg[NORMAL] = lighter (@fg_color)
+}
+
+style "treeview" {
+ engine "murrine"
+ {
+ roundness = 2
+ lightborder_shade = 1.1
+ gradient_shades = {1.04, 1.0, 1.0, 0.96}
+ }
+}
+
+style "progressbar" {
+ xthickness = 1
+ ythickness = 1
+
+ bg[ACTIVE] = shade (0.94, @bg_color)
+ fg[PRELIGHT] = @selected_fg_color
+ #bg[SELECTED] = "#cdcdcd"
+
+ engine "murrine" {
+ #trough_shades = {0.98, 1.02}
+ roundness = 8
+ lightborderstyle = 1
+ lightborder_shade = 1.26
+ border_shades = {0.95, 0.85}
+ gradient_shades = {1.1, 1.0, 1.0, 0.9}
+ trough_border_shades = {0.9, 1.4}
+ }
+}
+
+style "progressbar_menu_item" = "progressbar" {
+ bg[ACTIVE] = shade(0.98, "#4D4C48")
+
+ engine "murrine" {
+ roundness = 0
+ }
+}
+
+# This style is based on the default style, so that the colors from the button
+# style are overriden again.
+style "treeview_header" = "notebook_button" {
+ xthickness = 2
+ ythickness = 1
+
+ engine "murrine" {
+ glazestyle = 1
+ contrast = 0.8
+ lightborder_shade = 1.16
+ textstyle = 1
+ glow_shade = 1.0
+ }
+}
+
+style "treeview_header_scrolled" = "treeview_header" {
+}
+
+style "scrolledwindow" {
+ engine "murrine" {
+ contrast = 0.6
+ }
+}
+
+style "radiocheck" = "button" {
+ text[NORMAL] = shade (0.535, @selected_bg_color)
+ text[PRELIGHT] = shade(1.06, shade (0.535, @selected_bg_color))
+ bg[NORMAL] = shade (0.92, @bg_color)
+ bg[PRELIGHT] = mix (0.2, @selected_bg_color, shade(1.1, @bg_color))
+ fg[INSENSITIVE] = darker (@bg_color)
+ fg[ACTIVE] = @fg_color
+
+ engine "murrine" {
+ reliefstyle = 3
+ gradient_shades = {1.2, 1.0, 1.0, 0.9}
+ shadow_shades = {0.6, 0.5}
+ textstyle = 0
+ }
+}
+
+style "tooltips" {
+ xthickness = 4
+ ythickness = 4
+
+ bg[NORMAL] = @tooltip_bg_color
+ fg[NORMAL] = @tooltip_fg_color
+ bg[SELECTED] = "#000000"
+
+ engine "murrine" {
+ rgba = TRUE
+ }
+}
+
+style "infobar" {
+ engine "murrine" {
+ }
+}
+
+style "nautilus_location" {
+ bg[NORMAL] = mix (0.60, shade (1.05, @bg_color), @selected_bg_color)
+}
+
+style "calendar" {
+ xthickness = 0
+ ythickness = 0
+
+ engine "murrine" {
+ roundness = 0
+ }
+}
+
+style "calendar_menu_item" = "calendar" {
+ base[NORMAL] = "#605E58"
+ base[ACTIVE] = "#4b4944"
+}
+
+style "iconview" {
+ engine "murrine" {
+ roundness = 6
+ border_shades = {1.16, 1.0}
+ glow_shade = 1.1
+ glowstyle = 5
+ }
+}
+
+style "soundfix"
+{
+}
+
+# Wrokaround style for places where the text color is used instead of the fg color.
+style "text_is_fg_color_workaround" {
+ text[NORMAL] = @fg_color
+ text[PRELIGHT] = @fg_color
+ text[SELECTED] = @selected_fg_color
+ text[ACTIVE] = @fg_color
+ text[INSENSITIVE] = darker (@bg_color)
+}
+
+# Workaround style for menus where the text color is used instead of the fg color.
+style "menuitem_text_is_fg_color_workaround" {
+ text[NORMAL] = "#dfd8c8"
+ text[PRELIGHT] = @selected_fg_color
+ text[SELECTED] = @selected_fg_color
+ text[ACTIVE] = @fg_color
+ text[INSENSITIVE] = "#99958b"
+}
+
+# Workaround style for places where the fg color is used instead of the text color.
+style "fg_is_text_color_workaround" {
+ fg[NORMAL] = @text_color
+ fg[PRELIGHT] = @text_color
+ fg[SELECTED] = @selected_fg_color
+ fg[ACTIVE] = @selected_fg_color
+ fg[INSENSITIVE] = darker (@bg_color)
+}
+
+# Style to set the toolbar to use a flat style. This is because the "New" button in
+# Evolution is not drawn transparent. So if there is a gradient in the background it will
+# look really wrong.
+# See http://bugzilla.gnome.org/show_bug.cgi?id=446953.
+style "evo_new_button_workaround" {
+}
+
+###############################################################################
+# The following part of the gtkrc applies the different styles to the widgets.
+###############################################################################
+
+# The default style is applied to every widget
+class "GtkWidget" style "default"
+
+class "GtkSeparator" style "wide"
+class "GtkFrame" style "wide"
+class "GtkCalendar" style "wide"
+class "GtkEntry" style "entry"
+
+class "GtkSpinButton" style "spinbutton"
+class "GtkScale" style "scale"
+class "GtkVScale" style "vscale"
+class "GtkHScale" style "hscale"
+class "GtkScrollbar" style "scrollbar"
+class "GtkHScrollbar" style "hscrollbar"
+class "GtkVScrollbar" style "vscrollbar"
+class "GtkCalendar" style "calendar"
+class "GtkInfoBar" style "infobar"
+class "GtkIconView" style "iconview"
+
+# General matching follows. The order is choosen so that the right styles override
+# each other. EG. progressbar needs to be more important than the menu match.
+widget_class "*<GtkNotebook>" style "notebook_bg"
+# This is not perfect, it could be done better.
+# (That is modify *every* widget in the notebook, and change those back that
+# we really don't want changed)
+widget_class "*<GtkNotebook>*<GtkEventBox>" style "notebook_bg"
+widget_class "*<GtkNotebook>*<GtkDrawingArea>" style "notebook_bg"
+widget_class "*<GtkNotebook>*<GtkLayout>" style "notebook_bg"
+widget_class "*<GtkNotebook>*<GtkLabel>" style "notebook_bg"
+
+widget_class "*<GtkToolbar>*" style "toolbar"
+widget_class "*<GtkScrolledWindow>*" style "scrolledwindow"
+
+widget_class "*<GtkButton>" style "button"
+widget_class "*<GtkButton>*<GtkLabel>" style "button"
+widget_class "*<GtkToolbar>.*.<GtkButton>*" style "notebook_button"
+widget_class "*<GtkNotebook>" style "notebook"
+widget_class "*<GtkStatusbar>" style "statusbar"
+widget_class "*<GtkSpinButton>*" style "spinbutton"
+widget_class "*<GtkNotebook>*<GtkButton>" style "notebook_button"
+widget_class "*<GtkNotebook>*<GtkButton>*<GtkLabel>" style "notebook_button"
+widget_class "*<GtkRadioButton>*" style "radiocheck"
+widget_class "*<GtkCheckButton>*" style "radiocheck"
+
+widget_class "*<GtkComboBoxEntry>*" style "comboboxentry"
+widget_class "*<GtkCombo>*" style "comboboxentry"
+
+widget_class "*<GtkMenuBar>*" style "menubar"
+widget_class "*<GtkMenu>*" style "menu"
+widget_class "*<GtkMenuItem>*" style "menu_item"
+widget_class "*<GtkSeparatorMenuItem>*" style "separator_menu_item"
+widget_class "*<GtkSeparatorToolItem>*" style "separator_tool_item"
+widget_class "*<GtkMenuBar>*<GtkMenuItem>*" style "menubar_item"
+
+widget_class "*.<GtkFrame>.<GtkLabel>" style "frame_title"
+widget_class "*.<GtkTreeView>*" style "treeview"
+
+widget_class "*<GtkProgress>" style "progressbar"
+widget_class "*<GtkMenuItem>.*.<GtkProgressBar>" style "progressbar_menu_item"
+widget_class "*<GtkMenuItem>.*.<GtkScale>" style "scale_menu_item"
+widget_class "*<GtkMenuItem>.*.<GtkCalendar>" style "calendar_menu_item"
+
+# Treeview headers (and similar stock GTK+ widgets)
+widget_class "*.<GtkScrolledWindow>*<GtkTreeView>*" style "treeview_header_scrolled"
+widget_class "*.<GtkTreeView>.<GtkButton>" style "treeview_header"
+widget_class "*.<GtkCTree>.<GtkButton>" style "treeview_header"
+widget_class "*.<GtkList>.<GtkButton>" style "treeview_header"
+widget_class "*.<GtkCList>.<GtkButton>" style "treeview_header"
+widget_class "*.<GtkTreeView>.<GtkButton>.*<GtkLabel>" style "treeview_header"
+widget_class "*.<GtkCTree>.<GtkButton>.*<GtkLabel>" style "treeview_header"
+widget_class "*.<GtkList>.<GtkButton>.*<GtkLabel>" style "treeview_header"
+widget_class "*.<GtkCList>.<GtkButton>.*<GtkLabel>" style "treeview_header"
+
+# Overlay scrollbar
+widget_class "*<OsScrollbar>" style "overlay_scrollbar"
+widget_class "*<OsThumb>" style "overlay_scrollbar"
+
+# The window of the tooltip is called "gtk-tooltip"
+##################################################################
+# FIXME:
+# This will not work if one embeds eg. a button into the tooltip.
+# As far as I can tell right now we will need to rework the theme
+# quite a bit to get this working correctly.
+# (It will involve setting different priorities, etc.)
+##################################################################
+widget "gtk-tooltip*" style "tooltips"
+
+##########################################################################
+# Following are special cases and workarounds for issues in applications.
+##########################################################################
+
+# Workaround for the evolution ETable (bug #527532)
+widget_class "*.ETable.ECanvas" style "treeview_header"
+# Workaround for the evolution ETree
+widget_class "*.ETree.ECanvas" style "treeview_header"
+
+# Special case the nautilus-extra-view-widget
+# ToDo: A more generic approach for all applications that have a widget like this.
+widget "*.nautilus-extra-view-widget" style : highest "nautilus_location"
+
+# Work around for http://bugzilla.gnome.org/show_bug.cgi?id=382646
+# Note that this work around assumes that the combobox is _not_ in appears-as-list mode.
+widget_class "*.<GtkComboBox>.<GtkCellView>" style "text_is_fg_color_workaround"
+# This is the part of the workaround that fixes the menus
+widget "*.gtk-combobox-popup-menu.*" style "menuitem_text_is_fg_color_workaround"
+
+# Work around the usage of GtkLabel inside GtkListItems to display text.
+# This breaks because the label is shown on a background that is based on the base color.
+widget_class "*<GtkListItem>*" style "fg_is_text_color_workaround"
+# GtkCList also uses the fg color to draw text on top of the base colors.
+widget_class "*<GtkCList>" style "fg_is_text_color_workaround"
+# Nautilus when renaming files, and maybe other places.
+widget_class "*<EelEditableLabel>" style "fg_is_text_color_workaround"
+# Work around for ubuntu's lucid sound indicator
+widget "ido-offscreen-scale" style "soundfix"
+# Thickness for indicator menu items
+widget "*IdoEntryMenuItem*" style "wide"
+
+# See the documentation of the style.
+widget_class "EShellWindow.GtkVBox.BonoboDock.BonoboDockBand.BonoboDockItem*" style "evo_new_button_workaround"
+
+# Includes
+#include "apps/banshee.rc"
+include "apps/chromium.rc"
+include "apps/ff.rc"
+#include "apps/gedit.rc"
+include "apps/gnome-panel.rc"
+include "apps/gnome-terminal.rc"
+include "apps/nautilus.rc"
+include "apps/ubuntuone.rc"
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/gnome-panel.css b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/gnome-panel.css
new file mode 100644
index 00000000..37da3e12
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/gnome-panel.css
@@ -0,0 +1,81 @@
+/* Fallback Mode Panel */
+PanelWidget,
+PanelApplet,
+PanelToplevel {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.5)),
+ to (shade (@dark_bg_color, 1.05)));
+ padding: 0;
+
+ color: @dark_fg_color;
+}
+
+.gnome-panel-menu-bar,
+PanelApplet > GtkMenuBar.menubar,
+PanelApplet > GtkMenuBar.menubar.menuitem,
+PanelMenuBar.menubar,
+PanelMenuBar.menubar.menuitem {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.5)),
+ to (shade (@dark_bg_color, 1.05)));
+}
+
+PanelAppletFrame {
+ background-color: @dark_bg_color;
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.5)),
+ to (shade (@dark_bg_color, 1.05)));
+}
+
+PanelApplet .button {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.5)),
+ to (shade (@dark_bg_color, 1.05)));
+ border-color: shade (@dark_bg_color, 0.78);
+ border-radius: 0;
+ border-width: 0 1 0 1;
+
+ text-shadow: none;
+
+ -unico-border-gradient: none;
+ -unico-glow-radius: 0;
+ -unico-inner-stroke-width: 0;
+ -unico-outer-stroke-width: 0;
+}
+
+PanelApplet .button:prelight:active,
+PanelApplet .button:active {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.85)),
+ to (shade (@dark_bg_color, 1.0)));
+ border-color: shade (@dark_bg_color, 0.78);
+ border-radius: 0;
+ border-width: 0 1 0 1;
+
+ -unico-border-gradient: none;
+ -unico-glow-radius: 0;
+ -unico-inner-stroke-width: 0;
+ -unico-outer-stroke-width: 0;
+}
+
+PanelApplet .button:prelight {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.7)),
+ to (shade (@dark_bg_color, 1.25)));
+ border-color: shade (@dark_bg_color, 0.78);
+ border-radius: 0;
+ border-width: 0 1 0 1;
+
+ -unico-border-gradient: none;
+ -unico-glow-radius: 0;
+ -unico-inner-stroke-width: 0;
+ -unico-outer-stroke-width: 0;
+}
+
+ClockBox {
+ text-shadow: 0 -1 shade (@dark_bg_color, 0.6);
+}
+
+WnckPager, WnckTasklist {
+ background-color: @dark_bg_color;
+}
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/gnome-terminal.css b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/gnome-terminal.css
new file mode 100644
index 00000000..9efad7f3
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/gnome-terminal.css
@@ -0,0 +1,114 @@
+/* gnome-terminal */
+TerminalScreen {
+ -TerminalScreen-background-darkness: 0.95;
+
+ background-color: #300a24;
+
+ color: #fff;
+}
+
+/*
+TerminalWindow,
+TerminalWindow.background {
+ background-color: @dark_bg_color;
+
+ color: @dark_fg_color;
+}
+*/
+/* notebook */
+/*
+TerminalWindow .notebook {
+ background-image: none;
+ background-color: shade (@dark_bg_color, 1.02);
+ border-radius: 3;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, right top,
+ from (shade (@dark_bg_color, 0.93)),
+ to (shade (@dark_bg_color, 0.93)));
+ -unico-inner-stroke-width: 0;
+ -unico-outer-stroke-width: 0;
+}
+
+TerminalWindow .notebook tab {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.92)),
+ color-stop (0.60, shade (@dark_bg_color, 0.9)),
+ to (shade (@dark_bg_color, 0.85)));
+ padding: 0;
+
+ color: @dark_fg_color;
+
+ -unico-inner-stroke-color: alpha (shade (@dark_bg_color, 1.26), 0.2);
+}
+
+TerminalWindow .notebook tab:active {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.2)),
+ to (shade (@dark_bg_color, 1.12)));
+
+ -unico-inner-stroke-color: alpha (shade (@dark_bg_color, 1.26), 1.0);
+}
+
+TerminalWindow .notebook .button,
+TerminalWindow .notebook .button:active {
+ background-image: -gtk-gradient (linear, left top, right top,
+ from (shade (@dark_bg_color, 1.08)),
+ to (shade (@dark_bg_color, 0.92)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, right top,
+ from (shade (@dark_bg_color, 0.9)),
+ to (shade (@dark_bg_color, 0.9)));
+ -unico-inner-stroke-color: alpha (shade (@dark_bg_color, 1.26), 0.7);
+ -unico-outer-stroke-style: none;
+}
+*/
+/* Scrollbars */
+/*
+TerminalWindow .scrollbar {
+ border-radius: 20;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.74)),
+ to (shade (@dark_bg_color, 0.74)));
+}
+
+TerminalWindow .scrollbar.trough {
+ background-image: -gtk-gradient (linear, left top, right top,
+ from (shade (@dark_bg_color, 0.9)),
+ to (shade (@dark_bg_color, 0.95)));
+}
+
+TerminalWindow .scrollbar.trough.horizontal {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.9)),
+ to (shade (@dark_bg_color, 0.95)));
+}
+
+TerminalWindow .scrollbar.slider,
+TerminalWindow .scrollbar.slider:prelight,
+TerminalWindow .scrollbar.button,
+TerminalWindow .scrollbar.button:insensitive {
+ background-image: -gtk-gradient (linear, left top, right top,
+ from (shade (@dark_bg_color, 1.08)),
+ to (shade (@dark_bg_color, 0.92)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, right top,
+ from (shade (@dark_bg_color, 0.74)),
+ to (shade (@dark_bg_color, 0.74)));
+ -unico-inner-stroke-color: alpha (shade (@dark_bg_color, 1.26), 0.7);
+}
+
+TerminalWindow .scrollbar.slider.horizontal,
+TerminalWindow .scrollbar.slider.horizontal:prelight,
+TerminalWindow .scrollbar.button.horizontal,
+TerminalWindow .scrollbar.button:insensitive {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.08)),
+ to (shade (@dark_bg_color, 0.92)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.74)),
+ to (shade (@dark_bg_color, 0.74)));
+ -unico-inner-stroke-color: alpha (shade (@dark_bg_color, 1.26), 0.7);
+}
+*/
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/nautilus.css b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/nautilus.css
new file mode 100644
index 00000000..4b765831
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/nautilus.css
@@ -0,0 +1,81 @@
+/* desktop mode */
+.nautilus-desktop.nautilus-canvas-item {
+ color: @bg_color;
+ text-shadow: 1 1 alpha (#000000, 0.8);
+}
+
+.nautilus-desktop.nautilus-canvas-item:active {
+ background-image: none;
+ background-color: alpha (@bg_color, 0.84);
+ border-radius: 4;
+
+ color: @fg_color;
+}
+
+.nautilus-desktop.nautilus-canvas-item:selected {
+ background-image: none;
+ background-color: alpha (@selected_bg_color, 0.84);
+ border-radius: 4;
+
+ color: @selected_fg_color;
+}
+
+.nautilus-desktop.nautilus-canvas-item:active,
+.nautilus-desktop.nautilus-canvas-item:prelight,
+.nautilus-desktop.nautilus-canvas-item:selected {
+ text-shadow: none;
+}
+
+/* browser window */
+NautilusTrashBar.info,
+NautilusXContentBar.info,
+NautilusSearchBar.info,
+NautilusQueryEditor.info {
+ /* this background-color controls the symbolic icon in the entry */
+ background-color: mix (@fg_color, @base_color, 0.3);
+ border-radius: 0;
+ border-style: solid;
+ border-width: 0 1 1 1;
+}
+
+NautilusSearchBar .entry {
+}
+
+.nautilus-cluebar-label {
+ color: @fg_color;
+ font: bold;
+}
+
+#nautilus-search-button *:active,
+#nautilus-search-button *:active:prelight {
+ color: @dark_fg_color;
+}
+
+NautilusFloatingBar {
+ background-color: @info_bg_color;
+ border-radius: 3 3 0 0;
+ border-style: solid;
+ border-width: 1;
+ border-color: darker (@info_bg_color);
+
+ -unico-border-gradient: none;
+}
+
+NautilusFloatingBar .button {
+ -GtkButton-image-spacing: 0;
+ -GtkButton-inner-border: 0;
+}
+
+/* sidebar */
+NautilusWindow .sidebar,
+NautilusWindow .sidebar .view {
+ background-color: @bg_color;
+}
+
+NautilusWindow .sidebar .frame {
+ border-radius: 0;
+ border-width: 0;
+}
+
+NautilusWindow > GtkTable > .pane-separator {
+}
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/unity.css b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/unity.css
new file mode 100644
index 00000000..3cfc7dcb
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/apps/unity.css
@@ -0,0 +1,38 @@
+UnityPanelWidget,
+.unity-panel {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.5)),
+ to (shade (@dark_bg_color, 1.04)));
+ border-top-color: shade (@dark_bg_color, 1.6);
+ border-style: solid;
+ border-width: 1 0 0 0;
+
+ -unico-border-gradient: none;
+}
+
+.unity-panel.menubar,
+.unity-panel .menubar {
+}
+
+.unity-panel.menuitem,
+.unity-panel .menuitem {
+ border-width: 1 1 0 1;
+
+ icon-shadow: 0 -1 shade (@dark_bg_color, 0.7);
+}
+
+.unity-panel.menubar.menuitem:hover,
+.unity-panel.menubar .menuitem *:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.7)),
+ to (shade (@dark_bg_color, 1.12)));
+
+ color: shade (@dark_fg_color, 1.1);
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.08)),
+ to (shade (@dark_bg_color, 0.98)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.8)),
+ to (shade (@dark_bg_color, 1.2)));
+}
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/scrollbar_handle.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/scrollbar_handle.png
new file mode 100644
index 00000000..c8019d19
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/scrollbar_handle.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/scrollbar_handle_vertical.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/scrollbar_handle_vertical.png
new file mode 100644
index 00000000..69642719
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/scrollbar_handle_vertical.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider.png
new file mode 100644
index 00000000..dcb07eba
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider_prelight.png
new file mode 100644
index 00000000..048d8b41
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider_prelight_vertical.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider_prelight_vertical.png
new file mode 100644
index 00000000..eea519f6
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider_prelight_vertical.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider_vertical.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider_vertical.png
new file mode 100644
index 00000000..6a9d409a
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/assets/slider_vertical.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/gtk-widgets.css b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/gtk-widgets.css
new file mode 100644
index 00000000..1daf4833
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/gtk-widgets.css
@@ -0,0 +1,1885 @@
+/* NOTES to contributors:
+ * use 4 spaces intends, and keep code ALIGNED and ORDERED */
+
+/* default */
+* {
+ -GtkArrow-arrow-scaling: 0.6;
+ -GtkButton-child-displacement-x: 1;
+ -GtkButton-child-displacement-y: 1;
+ -GtkButton-default-border: 0;
+ -GtkButton-image-spacing: 0;
+ -GtkButton-interior-focus: true;
+ -GtkButton-inner-border: 3;
+ -GtkCheckButton-indicator-size: 16;
+ -GtkCheckMenuItem-indicator-size: 14;
+ -GtkEntry-inner-border: 2;
+ -GtkEntry-progress-border: 0;
+ -GtkExpander-expander-size: 8;
+ -GtkHTML-link-color: @link_color;
+ -GtkIMHtml-hyperlink-color: @link_color;
+ -GtkMenu-horizontal-padding: 0;
+ -GtkMenu-vertical-padding: 3;
+ -GtkMenuBar-internal-padding: 0;
+ -GtkMenuItem-arrow-scaling: 0.5;
+ -GtkNotebook-tab-overlap: 1;
+ -GtkPaned-handle-size: 6;
+ -GtkProgressBar-min-horizontal-bar-height: 14;
+ -GtkProgressBar-min-vertical-bar-width: 14;
+ -GtkRange-trough-border: 0;
+ -GtkRange-slider-width: 14;
+ -GtkRange-stepper-size: 13;
+ -GtkRange-trough-under-steppers: 1;
+ -GtkRange-stepper-spacing: 0;
+ -GtkScale-trough-border: 0;
+ -GtkScrollbar-activate-slider: 1;
+ -GtkScrollbar-trough-border: 0;
+ -GtkScrollbar-min-slider-length: 31;
+ -GtkScrolledWindow-scrollbar-spacing: 0;
+ -GtkScrolledWindow-scrollbars-within-bevel: 1;
+ -GtkSeparatorMenuItem-horizontal-padding: 0;
+ -GtkStatusbar-shadow-type: none;
+ -GtkTextView-error-underline-color: @error_color;
+ -GtkToolButton-icon-spacing: 6;
+ -GtkToolItemGroup-expander-size: 11;
+ -GtkToolbar-internal-padding: 0;
+ -GtkTreeView-expander-size: 8;
+ -GtkTreeView-vertical-separator: 0;
+ -GtkWidget-wide-separators: true;
+ -GtkWidget-separator-width: 2;
+ -GtkWidget-separator-height: 2;
+ -GtkWidget-focus-padding: 0;
+ -GtkWidget-focus-line-width: 1;
+ -GtkWidget-link-color: @link_color;
+ -GtkWidget-visited-link-color: @link_color;
+ -GtkWindow-resize-grip-default: false;
+ -WnckTasklist-fade-overlay-rect: 0;
+
+ border-width: 1;
+
+ engine: unico;
+
+ -unico-focus-border-color: alpha (@selected_bg_color, 0.5);
+ -unico-focus-border-radius: 3;
+ -unico-focus-fill-color: alpha (@selected_bg_color, 0.1);
+ -unico-focus-outer-stroke-color: @transparent;
+
+ -unico-inner-stroke-color: shade (@bg_color, 1.1);
+ -unico-inner-stroke-width: 0;
+}
+
+/**********
+ * states *
+ **********/
+*:insensitive {
+ color: shade (@bg_color, 0.6);
+ text-shadow: 0 1 alpha (shade (@bg_color, 1.25), 0.5);
+}
+
+*:active {
+}
+
+*:active:hover:insensitive {
+}
+
+*:active:insensitive {
+}
+
+*:hover {
+}
+
+*:hover:insensitive {
+}
+
+*:selected {
+}
+
+*:selected:focused {
+}
+
+/******************
+ * common effects *
+ ******************/
+/* border and inner stroke */
+.button,
+.frame,
+.notebook {
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.8)),
+ to (shade (@bg_color, 0.76)));
+}
+
+.frame,
+.notebook {
+ -unico-inner-stroke-color: alpha (shade (@bg_color, 1.26), 0.2);
+ -unico-inner-stroke-gradient: none;
+ -unico-inner-stroke-width: 1;
+}
+
+.button:insensitive,
+.frame:insensitive,
+.notebook:insensitive {
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.8)),
+ to (shade (@bg_color, 0.8)));
+}
+
+/* inset */
+GtkComboBox.combobox-entry .button,
+.button:active,
+.button:insensitive,
+.check,
+.entry,
+.radio {
+ -unico-outer-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (shade (@bg_color, 0.85), 0.2)),
+ to (alpha (shade (@bg_color, 1.25), 0.6)));
+ -unico-outer-stroke-width: 1;
+}
+
+/* shadow */
+.button,
+.check:active,
+.frame,
+.notebook .button,
+.notebook,
+.radio:active {
+ -unico-outer-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (@bg_color, 0.00)),
+ to (alpha (shade (@bg_color, 1.25), 0.5)));
+ -unico-outer-stroke-width: 1;
+}
+/*
+.button:hover,
+.notebook .button:hover {
+ -unico-outer-stroke-top-color: @transparent;
+ -unico-outer-stroke-right-color: @transparent;
+ -unico-outer-stroke-bottom-color: alpha (shade (@bg_color, 0.05), 0.06);
+ -unico-outer-stroke-left-color: @transparent;
+ -unico-outer-stroke-gradient: none;
+ -unico-outer-stroke-width: 1;
+}
+*/
+/*************
+ * assistant *
+ *************/
+GtkAssistant .sidebar .highlight {
+ color: @fg_color;
+ font: bold;
+}
+
+GtkAssistant .sidebar {
+ background-color: shade (@bg_color, 0.97);
+ border-right-color: shade (@bg_color, 0.8);
+ border-radius: 0;
+ border-style: solid;
+ border-width: 0 1 0 0;
+ padding: 12;
+
+ color: mix (@fg_color, @bg_color, 0.40);
+ text-shadow: 0 1 shade (@bg_color, 1.04);
+
+ -unico-border-gradient: none;
+ -unico-inner-stroke-right-color: shade (@bg_color, 0.94);
+ -unico-inner-stroke-width: 0 1 0 0;
+ -unico-outer-stroke-width: 0;
+}
+
+/**************
+ * background *
+ **************/
+.background {
+ background-color: @bg_color;
+ border-width: 0;
+}
+
+/**********
+ * button *
+ **********/
+.button {
+ -unico-focus-border-color: alpha (@selected_bg_color, 0.7);
+ -unico-focus-fill-color: @transparent;
+ -unico-focus-outer-stroke-color: alpha (@selected_bg_color, 0.2);
+}
+
+GtkComboBox,
+GtkScale.slider,
+.button {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_bg_color, 1.1)),
+ to (shade (@button_bg_color, 0.9)));
+ border-radius: 3;
+ border-style: solid;
+
+ text-shadow: 0 1 alpha (shade (@button_bg_color, 1.25), 0.4);
+
+ transition: 100ms ease-in-out;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_bg_color, 0.85)),
+ to (shade (@button_bg_color, 0.67)));
+ -unico-glow-color: shade (@button_bg_color, 1.14);
+ -unico-glow-radius: 6;
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_bg_color, 1.16)),
+ to (shade (@button_bg_color, 1.015)));
+ -unico-inner-stroke-width: 1;
+}
+
+GtkScale.slider:hover,
+.button:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_bg_color, 1.16)),
+ to (shade (@button_bg_color, 0.95)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_bg_color, 0.89)),
+ to (shade (@button_bg_color, 0.7)));
+ -unico-glow-color: shade (@button_bg_color, 1.18);
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_bg_color, 1.2)),
+ to (shade (@button_bg_color, 1.06)));
+}
+
+.button:active {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_bg_color, 0.9)),
+ to (shade (@button_bg_color, 0.95)));
+
+ -unico-focus-outer-stroke-color: @transparent;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_bg_color, 0.6)),
+ to (shade (@button_bg_color, 0.7)));
+ -unico-glow-radius: 0;
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_bg_color, 0.84)),
+ to (shade (@button_bg_color, 0.9)));
+}
+
+.button:active:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_bg_color, 0.95)),
+ to (shade (@button_bg_color, 1.0)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_bg_color, 0.6)),
+ to (shade (@button_bg_color, 0.7)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_bg_color, 0.88)),
+ to (shade (@button_bg_color, 0.94)));
+}
+
+.button:insensitive {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_insensitive_bg_color, 1.04)),
+ to (shade (@button_insensitive_bg_color, 0.96)));
+
+ text-shadow: 0 1 alpha (shade (@button_bg_color, 1.25), 0.4);
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_insensitive_bg_color, 0.8)),
+ to (shade (@button_insensitive_bg_color, 0.8)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_insensitive_bg_color, 1.08)),
+ to (shade (@button_insensitive_bg_color, 1.0)));
+}
+
+.button:insensitive:active {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_insensitive_bg_color, 0.97)),
+ to (shade (@button_insensitive_bg_color, 1.0)));
+
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_insensitive_bg_color, 0.95)),
+ to (shade (@button_insensitive_bg_color, 0.98)));
+}
+
+GtkComboBox.combobox-entry .button,
+GtkScale.slider,
+GtkScale.slider.vertical,
+.notebook .button,
+.inline-toolbar.toolbar .button {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.12)),
+ to (shade (@bg_color, 0.92)));
+ border-top-color: shade (@bg_color, 0.82);
+ border-right-color: shade (@bg_color, 0.78);
+ border-bottom-color: shade (@bg_color, 0.64);
+ border-left-color: shade (@bg_color, 0.78);
+ padding: 1;
+
+ text-shadow: 0 1 alpha (shade (@bg_color, 1.26), 0.5);
+
+ -unico-border-gradient: none;
+ -unico-glow-color: shade (@bg_color, 1.02);
+ -unico-glow-radius: 4;
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.2)),
+ to (shade (@bg_color, 0.98)));
+}
+
+GtkComboBox.combobox-entry .button:hover,
+GtkScale.slider:hover,
+GtkScale.slider.vertical:hover,
+.notebook .button:hover,
+.inline-toolbar.toolbar .button:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.16)),
+ to (shade (@bg_color, 0.95)));
+ border-top-color: shade (@bg_color, 0.85);
+ border-right-color: shade (@bg_color, 0.82);
+ border-bottom-color: shade (@bg_color, 0.67);
+ border-left-color: shade (@bg_color, 0.82);
+
+ -unico-border-gradient: none;
+ -unico-glow-color: shade (@bg_color, 1.07);
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.21)),
+ to (shade (@bg_color, 1.02)));
+}
+
+GtkComboBox.combobox-entry .button:active,
+.notebook .button:active,
+.inline-toolbar.toolbar .button:active {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.9)),
+ to (shade (@bg_color, 0.95)));
+ border-top-color: shade (@bg_color, 0.62);
+ border-right-color: shade (@bg_color, 0.72);
+ border-bottom-color: shade (@bg_color, 0.76);
+ border-left-color: shade (@bg_color, 0.72);
+
+ -unico-border-gradient: none;
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.85)),
+ to (shade (@bg_color, 0.9)));
+}
+
+GtkComboBox.combobox-entry .button:active:hover,
+.notebook .button:active:hover,
+.inline-toolbar.toolbar .button:active:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.95)),
+ to (shade (@bg_color, 1.0)));
+ border-top-color: shade (@bg_color, 0.64);
+ border-right-color: shade (@bg_color, 0.74);
+ border-bottom-color: shade (@bg_color, 0.79);
+ border-left-color: shade (@bg_color, 0.74);
+
+ -unico-border-gradient: none;
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.93)),
+ to (shade (@bg_color, 0.94)));
+}
+
+GtkComboBox.combobox-entry .button:insensitive,
+.notebook .button:insensitive,
+.inline-toolbar.toolbar .button:insensitive {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.06)),
+ to (shade (@bg_color, 0.98)));
+ border-top-color: shade (@bg_color, 0.86);
+ border-right-color: shade (@bg_color, 0.86);
+ border-bottom-color: shade (@bg_color, 0.86);
+ border-left-color: shade (@bg_color, 0.9);
+
+ -unico-border-gradient: none;
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.1)),
+ to (shade (@bg_color, 1.0)));
+}
+
+/* default button */
+.button.default {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (mix (shade (@selected_bg_color, 1.16), @bg_color, 0.3)),
+ to (mix (shade (@selected_bg_color, 0.84), @bg_color, 0.3)));
+
+ text-shadow: 0 1 alpha (shade (@selected_bg_color, 1.26), 0.4);
+
+ -unico-focus-border-color: @transparent;
+ -unico-focus-outer-stroke-color: alpha (@selected_bg_color, 0.2);
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (mix (shade (@selected_bg_color, 0.8), @bg_color, 0.3)),
+ to (mix (shade (@selected_bg_color, 0.64), @bg_color, 0.3)));
+ -unico-glow-color: mix (shade (@selected_bg_color, 1.5), @bg_color, 0.3);
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (mix (shade (@selected_bg_color, 1.42), @bg_color, 0.3)),
+ to (mix (shade (@selected_bg_color, 1.12), @bg_color, 0.3)));
+}
+
+.button.default:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (mix (shade (@selected_bg_color, 1.21), @bg_color, 0.3)),
+ to (mix (shade (@selected_bg_color, 0.89), @bg_color, 0.3)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (mix (shade (@selected_bg_color, 0.83), @bg_color, 0.3)),
+ to (mix (shade (@selected_bg_color, 0.67), @bg_color, 0.3)));
+ -unico-glow-color: mix (shade (@selected_bg_color, 1.55), @bg_color, 0.3);
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (mix (shade (@selected_bg_color, 1.47), @bg_color, 0.3)),
+ to (mix (shade (@selected_bg_color, 1.17), @bg_color, 0.3)));
+}
+
+.button.default:active {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (mix (shade (@selected_bg_color, 0.95), @bg_color, 0.3)),
+ to (mix (shade (@selected_bg_color, 1.05), @bg_color, 0.3)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (mix (shade (@selected_bg_color, 0.7), @bg_color, 0.3)),
+ to (mix (shade (@selected_bg_color, 0.7), @bg_color, 0.3)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (mix (shade (@selected_bg_color, 0.9), @bg_color, 0.3)),
+ to (mix (shade (@selected_bg_color, 1.0), @bg_color, 0.3)));
+}
+
+.button.default:active:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (mix (shade (@selected_bg_color, 1.0), @bg_color, 0.3)),
+ to (mix (shade (@selected_bg_color, 1.1), @bg_color, 0.3)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (mix (shade (@selected_bg_color, 0.7), @bg_color, 0.3)),
+ to (mix (shade (@selected_bg_color, 0.7), @bg_color, 0.3)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (mix (shade (@selected_bg_color, 0.95), @bg_color, 0.3)),
+ to (mix (shade (@selected_bg_color, 1.05), @bg_color, 0.3)));
+}
+
+.button.default:insensitive {
+ -unico-glow-radius: 0;
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@button_insensitive_bg_color, 1.08)),
+ to (shade (@button_insensitive_bg_color, 1.0)));
+}
+
+/****************
+ * cell and row *
+ ****************/
+.cell {
+ border-radius: 0;
+ border-width: 0;
+}
+
+.cell:selected {
+}
+
+row:hover {
+}
+
+row:insensitive {
+}
+
+row:selected:focused {
+}
+
+row:selected {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 1.06)),
+ to (shade (@selected_bg_color, 0.94)));
+ border-top-color: shade (@selected_bg_color, 0.88);
+ border-style: solid;
+ border-width: 1 0 0 0;
+}
+
+/*******************
+ * check and radio *
+ *******************/
+.check row:selected,
+.radio row:selected,
+.check,
+.check row,
+.radio,
+.radio row {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@base_color, 0.96)),
+ to (@base_color));
+ border-top-color: shade (@bg_color, 0.64);
+ border-right-color: shade (@bg_color, 0.76);
+ border-bottom-color: shade (@bg_color, 0.82);
+ border-left-color: shade (@bg_color, 0.76);
+ border-style: solid;
+ border-width: 1;
+
+ -unico-border-gradient: none;
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (shade (@bg_color, 0.05), 0.06)),
+ to (alpha (shade (@bg_color, 0.05), 0.03)));
+ -unico-inner-stroke-width: 1;
+}
+
+.check,
+.check row {
+ border-radius: 3;
+}
+
+.radio,
+.radio row {
+ border-radius: 10;
+}
+
+.check:active,
+.check row:selected:active,
+.check row:selected:focused:active,
+.notebook .check:active,
+.notebook .radio:active,
+.radio:active,
+.radio row:selected:active,
+.radio row:selected:focused:active {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 1.2)),
+ color-stop (0.5, shade (@selected_bg_color, 1.0)),
+ to (shade (@selected_bg_color, 0.9)));
+
+ -unico-bullet-color: shade (@selected_bg_color, 0.535);
+ -unico-bullet-outline-color: shade (@selected_bg_color, 1.2);
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 0.7)),
+ to (shade (@selected_bg_color, 0.7)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 1.3)),
+ to (shade (@selected_bg_color, 1.06)));
+ -unico-outer-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (shade (@bg_color, 0.05), 0.02)),
+ to (alpha (shade (@bg_color, 0.05), 0.06)));
+ -unico-outer-stroke-width: 1;
+}
+
+.check:active:hover,
+.check row:selected:active:hover,
+.check row:selected:focused:active:hover,
+.notebook .check:active:hover,
+.notebook .radio:active:hover,
+.radio:active:hover,
+.radio row:selected:active:hover,
+.radio row:selected:focused:active:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 1.26)),
+ color-stop (0.5, shade (@selected_bg_color, 1.05)),
+ to (shade (@selected_bg_color, 0.95)));
+
+ -unico-bullet-color: shade (@selected_bg_color, 0.56);
+ -unico-bullet-outline-color: shade (@selected_bg_color, 1.26);
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 0.74)),
+ to (shade (@selected_bg_color, 0.74)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 1.37)),
+ to (shade (@selected_bg_color, 1.12)));
+}
+
+.check row:selected,
+.check row:selected:active,
+.check row:selected:focused,
+.check row:selected:focused:active,
+.radio row:selected,
+.radio row:selected:active,
+.radio row:selected:focused,
+.radio row:selected:focused:active {
+ -unico-outer-stroke-color: @transparent;
+ -unico-outer-stroke-gradient: none;
+}
+
+.check:insensitive,
+.radio:insensitive {
+ background-color: shade (@bg_color, 0.96);
+ background-image: none;
+}
+
+.check:insensitive:active,
+.radio:insensitive:active {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.96)),
+ to (shade (@bg_color, 0.9)));
+
+ -unico-bullet-color: shade (@bg_color, 0.6);
+ -unico-bullet-outline-color: shade (@bg_color, 1.0);
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.8)),
+ to (shade (@bg_color, 0.7)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.0)),
+ to (shade (@bg_color, 0.94)));
+}
+
+/*****************
+ * column-header *
+ *****************/
+column-header .button,
+column-header .button:active,
+.notebook column-header .button,
+.notebook column-header .button:active {
+ border-radius: 0;
+ border-width: 0 1 1 0;
+
+ -unico-focus-border-radius: 0;
+ -unico-focus-border-color: @transparent;
+ -unico-focus-fill-color: alpha (@selected_bg_color, 0.2);
+ -unico-focus-outer-stroke-color: @transparent;
+
+ -unico-glow-radius: 0;
+ -unico-outer-stroke-width: 0;
+}
+
+column-header .button,
+.notebook column-header .button {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.08)),
+ to (shade (@bg_color, 0.92)));
+
+ text-shadow: 0 1 alpha (shade (@bg_color, 1.25), 0.4);
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.8)),
+ to (shade (@bg_color, 0.76)));
+ -unico-glow-color: shade (@bg_color, 1.02);
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.16)),
+ to (shade (@bg_color, 0.99)));
+}
+
+column-header .button:hover,
+.notebook column-header .button:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.13)),
+ to (shade (@bg_color, 0.97)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.84)),
+ to (shade (@bg_color, 0.75)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.21)),
+ to (shade (@bg_color, 1.04)));
+}
+
+column-header:nth-child(last) .button {
+ border-width: 0 0 1 0;
+}
+
+/******************
+ * combobox entry *
+ ******************/
+.primary-toolbar GtkComboBox.combobox-entry .entry,
+.primary-toolbar GtkComboBox.combobox-entry .entry:active,
+.primary-toolbar GtkComboBox.combobox-entry .entry:focused,
+.primary-toolbar GtkComboBox.combobox-entry .entry:insensitive,
+GtkComboBox.combobox-entry .entry,
+GtkComboBox.combobox-entry .entry:active,
+GtkComboBox.combobox-entry .entry:focused,
+GtkComboBox.combobox-entry .entry:insensitive {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-width: 1 0 1 1;
+
+ -unico-outer-stroke-width: 1 0 1 1;
+}
+
+.primary-toolbar GtkComboBox.combobox-entry .button,
+.primary-toolbar GtkComboBox.combobox-entry .button:hover,
+.primary-toolbar GtkComboBox.combobox-entry .button:active,
+.primary-toolbar GtkComboBox.combobox-entry .button:insensitive,
+GtkComboBox.combobox-entry .button,
+GtkComboBox.combobox-entry .button:hover,
+GtkComboBox.combobox-entry .button:active,
+GtkComboBox.combobox-entry .button:insensitive {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ border-width: 1 1 1 1;
+
+ -unico-outer-stroke-width: 1 1 1 0;
+}
+
+GtkComboBox.combobox-entry .button,
+GtkComboBox.combobox-entry .button:hover,
+GtkComboBox.combobox-entry .button:active,
+GtkComboBox.combobox-entry .button:insensitive {
+ border-top-color: shade (@bg_color, 0.64);
+ border-right-color: shade (@bg_color, 0.8);
+ border-bottom-color: shade (@bg_color, 0.86);
+ border-left-color: shade (@bg_color, 0.76);
+}
+
+/*********
+ * entry *
+ *********/
+.entry {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@base_color, 0.96)),
+ to (@base_color));
+ border-top-color: shade (@bg_color, 0.64);
+ border-right-color: shade (@bg_color, 0.76);
+ border-bottom-color: shade (@bg_color, 0.82);
+ border-left-color: shade (@bg_color, 0.76);
+ border-radius: 3;
+ border-style: solid;
+
+ -unico-border-gradient: none;
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (shade (@bg_color, 0.05), 0.04)),
+ to (alpha (shade (@bg_color, 0.05), 0.02)));
+ -unico-inner-stroke-width: 1;
+}
+
+.entry:selected,
+.entry:selected:focused {
+ background-color: @selected_bg_color;
+
+ color: @selected_fg_color;
+}
+
+.entry:focused {
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 0.75)),
+ to (shade (@selected_bg_color, 0.8)));
+ -unico-inner-stroke-color: alpha (@selected_bg_color, 0.3);
+ -unico-inner-stroke-gradient: none;
+}
+
+.entry:insensitive {
+ background-color: shade (@bg_color, 0.96);
+ background-image: none;
+
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (shade (@bg_color, 0.05), 0.04)),
+ to (alpha (shade (@bg_color, 0.05), 0.02)));
+}
+
+.primary-toolbar .toolbar .entry.progressbar,
+.primary-toolbar.toolbar .entry.progressbar,
+.entry.progressbar {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 0.8)),
+ color-stop (0.1, shade (@selected_bg_color, 0.9)),
+ to (shade (@selected_bg_color, 1.1)));
+ border-radius: 3;
+ border-width: 0;
+
+ color: @selected_fg_color;
+
+ -unico-outer-stroke-width: 0;
+}
+
+/************
+ * expander *
+ ************/
+.expander {
+ color: @fg_color;
+}
+
+/*********
+ * frame *
+ *********/
+.frame {
+ border-radius: 3;
+
+ -unico-outer-stroke-width: 0;
+}
+
+/************
+ * iconview *
+ ************/
+GtkIconView.view.cell:selected,
+GtkIconView.view.cell:selected:focused {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 1.0)),
+ to (shade (@selected_bg_color, 0.9)));
+ border-radius: 4;
+ border-style: solid;
+ border-width: 1;
+
+ color: @selected_fg_color;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 0.7)),
+ to (shade (@selected_bg_color, 0.7)));
+ -unico-glow-radius: 8;
+ -unico-glow-color: shade (@selected_bg_color, 1.3);
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 1.2)),
+ to (shade (@selected_bg_color, 1.08)));
+ -unico-inner-stroke-width: 1;
+}
+
+.rubberband {
+ background-color: alpha (@selected_bg_color, 0.35);
+ border-color: @selected_bg_color;
+ border-radius: 0;
+ border-style: solid;
+ border-width: 1;
+}
+
+/***********
+ * infobar *
+ ***********/
+.info {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@info_bg_color, 1.04)),
+ to (shade (@info_bg_color, 0.96)));
+ border-style: solid;
+ border-width: 1;
+
+ color: @info_fg_color;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@info_bg_color, 0.8)),
+ to (shade (@info_bg_color, 0.75)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@info_bg_color, 1.1)),
+ to (shade (@info_bg_color, 1.04)));
+ -unico-inner-stroke-width: 1;
+}
+
+.warning {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@warning_bg_color, 1.04)),
+ to (shade (@warning_bg_color, 0.96)));
+ border-style: solid;
+ border-width: 1;
+
+ color: @warning_fg_color;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@warning_bg_color, 0.8)),
+ to (shade (@warning_bg_color, 0.75)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@warning_bg_color, 1.1)),
+ to (shade (@warning_bg_color, 1.04)));
+ -unico-inner-stroke-width: 1;
+}
+
+.question {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@question_bg_color, 1.04)),
+ to (shade (@question_bg_color, 0.96)));
+ border-style: solid;
+ border-width: 1;
+
+ color: @question_fg_color;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@question_bg_color, 0.8)),
+ to (shade (@question_bg_color, 0.75)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@question_bg_color, 1.1)),
+ to (shade (@question_bg_color, 1.04)));
+ -unico-inner-stroke-width: 1;
+}
+
+.error {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@error_bg_color, 1.04)),
+ to (shade (@error_bg_color, 0.96)));
+ border-style: solid;
+ border-width: 1;
+
+ color: @error_fg_color;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@error_bg_color, 0.8)),
+ to (shade (@error_bg_color, 0.75)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@error_bg_color, 1.1)),
+ to (shade (@error_bg_color, 1.04)));
+ -unico-inner-stroke-width: 1;
+}
+
+/********
+ * menu *
+ ********/
+.menu {
+ background-color: shade (@dark_bg_color, 1.08);
+ background-image: none;
+ border-bottom-color: shade (@dark_bg_color, 0.96);
+ border-left-color: shade (@dark_bg_color, 0.8);
+ border-right-color: shade (@dark_bg_color, 0.8);
+ border-top-color: shade (@dark_bg_color, 0.96);
+ border-style: solid;
+ padding: 0;
+
+ color: @dark_fg_color;
+
+ -unico-inner-stroke-color: shade (@dark_bg_color, 1.18);
+ -unico-inner-stroke-gradient: none;
+ -unico-inner-stroke-width: 1 1 0 1;
+}
+
+.menu:selected {
+ background-color: @selected_bg_color;
+}
+
+.menu.button:hover,
+.menu.button:active,
+.menu.button:active:insensitive,
+.menu.button:insensitive,
+.menu.button {
+ background-color: shade (@dark_bg_color, 1.08);
+ background-image: none;
+ border-radius: 0;
+ border-style: none;
+ border-width: 1;
+
+ -unico-border-gradient: none;
+ -unico-glow-radius: 0;
+ -unico-inner-stroke-width: 0;
+ -unico-outer-stroke-width: 0;
+}
+
+/***********
+ * menubar *
+ ***********/
+.menubar {
+ -GtkWidget-window-dragging: true;
+
+ background-color: @dark_bg_color;
+ background-image: none;
+ border-width: 0;
+
+ color: @dark_fg_color;
+ text-shadow: 0 -1 shade (@dark_bg_color, 0.6);
+
+ -unico-border-gradient: none;
+}
+
+/***************
+ * menubaritem *
+ ***************/
+.menubar.menuitem,
+.menubar .menuitem {
+ border-radius: 4 4 0 0;
+ border-width: 1 1 0 1;
+}
+
+.menubar.menuitem:hover,
+.menubar .menuitem *:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.38)),
+ to (shade (@dark_bg_color, 1.11)));
+
+ color: shade (@dark_fg_color, 1.1);
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.88)),
+ to (shade (@dark_bg_color, 0.9)));
+ -unico-glow-radius: 0;
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.5)),
+ to (shade (@dark_bg_color, 1.15)));
+ -unico-inner-stroke-width: 1;
+}
+
+/************
+ * menuitem *
+ ************/
+.menuitem {
+ border-radius: 0;
+ border-style: solid;
+ border-width: 1;
+ padding: 2;
+
+ color: @dark_fg_color;
+
+ -unico-inner-stroke-width: 1;
+}
+
+.menuitem:hover,
+.menuitem *:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 1.1)),
+ to (shade (@selected_bg_color, 0.9)));
+
+ color: @selected_fg_color;
+
+ -unico-bullet-color: @dark_fg_color;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 0.7)),
+ to (shade (@selected_bg_color, 0.7)));
+ -unico-glow-color: shade (@selected_bg_color, 1.1);
+ -unico-glow-radius: 6;
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 1.2)),
+ to (shade (@selected_bg_color, 1.0)));
+}
+
+.menuitem:insensitive,
+.menuitem *:insensitive {
+ color: mix (@dark_fg_color, @dark_bg_color, 0.5);
+ text-shadow: 0 -1 shade (@dark_bg_color, 0.6);
+}
+
+.menuitem.check:active,
+.menuitem.radio:active {
+ color: @dark_fg_color;
+
+ -unico-bullet-color: @dark_fg_color;
+}
+
+.menuitem.check:active:hover,
+.menuitem.radio:active:hover {
+ color: @selected_fg_color;
+
+ -unico-bullet-color: @selected_fg_color;
+}
+
+.menuitem GtkCalendar,
+.menuitem GtkCalendar.button,
+.menuitem GtkCalendar.header,
+.menuitem GtkCalendar.view {
+ background-color: @dark_bg_color;
+ background-image: none;
+ border-radius: 0;
+ border-style: solid;
+ border-width: 0;
+ padding: 0;
+
+ color: @dark_fg_color;
+}
+
+.menuitem GtkCalendar {
+ background-color: shade (@dark_bg_color, 1.3);
+ background-image: none;
+}
+
+.menuitem .entry {
+ background-color: shade (@dark_bg_color, 1.3);
+ background-image: none;
+
+ color: @dark_fg_color;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.75)),
+ to (shade (@dark_bg_color, 0.9)));
+ -unico-outer-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.98)),
+ to (shade (@dark_bg_color, 1.1)));;
+}
+
+.menuitem GtkScale.trough {
+ background-color: @dark_bg_color;
+ background-image: none;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.75)),
+ to (shade (@dark_bg_color, 1.15)));
+}
+
+.menuitem .accelerator {
+ color: alpha (@dark_fg_color, 0.5);
+}
+
+.menuitem .accelerator:hover {
+ color: alpha (@selected_fg_color, 0.8);
+}
+
+.menuitem .accelerator:insensitive {
+ color: alpha (mix (@dark_fg_color, @dark_bg_color, 0.5), 0.5);
+ text-shadow: 0 -1 shade (@dark_bg_color, 0.7);
+}
+
+/************
+ * notebook *
+ ************/
+.notebook {
+ background-color: shade (@bg_color, 1.02);
+ background-image: none;
+ border-radius: 3;
+ padding: 3;
+
+ -unico-inner-stroke-color: alpha (shade (@bg_color, 1.26), 0.3);
+ -unico-inner-stroke-gradient: none;
+}
+
+.notebook tab {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.97)),
+ color-stop (0.80, shade (@bg_color, 0.95)),
+ to (shade (@bg_color, 0.92)));
+ padding: 2 1 0 1;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.86)),
+ to (shade (@bg_color, 0.84)));
+ -unico-inner-stroke-color: alpha (shade (@bg_color, 1.26), 0.34);
+ -unico-inner-stroke-gradient: none;
+ -unico-inner-stroke-width: 1;
+ -unico-outer-stroke-color: @transparent;
+ -unico-outer-stroke-gradient: none;
+ -unico-outer-stroke-width: 1;
+}
+
+.notebook tab:active {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.1)),
+ to (shade (@bg_color, 1.02)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.84)),
+ to (shade (@bg_color, 0.8)));
+}
+
+.notebook tab .button {
+ padding: 0;
+}
+
+/******************
+ * pane separator *
+ ******************/
+.sidebar .pane-separator,
+.pane-separator {
+ background-color: @transparent;
+ border-color: shade (@bg_color, 0.84);
+
+ -unico-border-gradient: none;
+ -unico-inner-stroke-color: shade (@bg_color, 1.1);
+ -unico-inner-stroke-gradient: none;
+ -unico-inner-stroke-width: 1;
+}
+
+/*************************
+ * progressbar and scale *
+ *************************/
+GtkScale,
+GtkProgressBar {
+ border-radius: 8;
+ border-width: 1;
+ padding: 0;
+}
+
+.progressbar,
+.progressbar row,
+.progressbar row:hover,
+.progressbar row:selected,
+.progressbar row:selected:focused {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 1.13)),
+ to (shade (@selected_bg_color, 0.9)));
+ border-width: 1;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 0.75)),
+ to (shade (@selected_bg_color, 0.75)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 1.22)),
+ to (shade (@selected_bg_color, 1.0)));
+ -unico-inner-stroke-width: 1;
+ -unico-outer-stroke-color: @transparent;
+ -unico-outer-stroke-gradient: none;
+ -unico-outer-stroke-width: 1;
+}
+
+.progressbar.vertical {
+ background-image: -gtk-gradient (linear, left top, right top,
+ from (shade (@selected_bg_color, 1.13)),
+ to (shade (@selected_bg_color, 0.9)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, right top,
+ from (shade (@selected_bg_color, 0.75)),
+ to (shade (@selected_bg_color, 0.75)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, right top,
+ from (shade (@selected_bg_color, 1.22)),
+ to (shade (@selected_bg_color, 1.0)));
+}
+
+.trough,
+.trough row,
+.trough row:hover,
+.trough row:selected,
+.trough row:selected:focused {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.92)),
+ to (shade (@bg_color, 0.96)));
+ border-width: 1;
+
+ color: @text_color;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.75)),
+ to (shade (@bg_color, 1.05)));
+ -unico-outer-stroke-width: 0;
+}
+
+.trough.vertical {
+ background-image: -gtk-gradient (linear, left top, right top,
+ from (shade (@bg_color, 0.92)),
+ to (shade (@bg_color, 0.96)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, right top,
+ from (shade (@bg_color, 0.75)),
+ to (shade (@bg_color, 1.05)));
+}
+
+GtkScale {
+ -GtkRange-slider-width: 22;
+ -GtkRange-trough-border: 1;
+ -GtkScale-slider-length: 14;
+
+ -unico-glow-radius: 0;
+}
+
+GtkScale.vertical {
+ -GtkScale-slider-length: 13;
+}
+
+GtkScale.slider {
+ background-image: url("assets/slider.png");
+}
+
+GtkScale.slider:hover {
+ background-image: url("assets/slider_prelight.png");
+}
+
+GtkScale.slider.vertical {
+ background-image: url("assets/slider_vertical.png");
+}
+
+GtkScale.slider.vertical:hover {
+ background-image: url("assets/slider_prelight_vertical.png");
+}
+
+GtkScale.mark {
+ border-color: shade (@bg_color, 0.8);
+}
+
+/*************
+ * scrollbar *
+ *************/
+.scrollbar {
+ -GtkScrollbar-has-backward-stepper: 0;
+ -GtkScrollbar-has-forward-stepper: 0;
+ -GtkRange-slider-width: 13;
+
+ border-radius: 20;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.74)),
+ to (shade (@bg_color, 0.74)));
+}
+
+.scrollbar.trough,
+.scrollbar.trough.vertical {
+ background-image: -gtk-gradient (linear, left top, right top,
+ from (shade (@bg_color, 0.9)),
+ to (shade (@bg_color, 0.95)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.74)),
+ to (shade (@bg_color, 0.74)));
+}
+
+.scrollbar.trough.horizontal {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.9)),
+ to (shade (@bg_color, 0.95)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.74)),
+ to (shade (@bg_color, 0.74)));
+}
+
+.scrollbar.slider,
+.scrollbar.slider:hover,
+.scrollbar.button,
+.scrollbar.slider.vertical,
+.scrollbar.slider.vertical:hover,
+.scrollbar.button.vertical {
+ background-image: -gtk-gradient (linear, left top, right top,
+ from (shade (@bg_color, 1.08)),
+ to (shade (@bg_color, 0.92)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, right top,
+ from (shade (@bg_color, 0.74)),
+ to (shade (@bg_color, 0.74)));
+ -unico-centroid-texture: url("assets/scrollbar_handle_vertical.png");
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, right top,
+ from (shade (@bg_color, 1.2)),
+ to (shade (@bg_color, 1.0)));
+ -unico-inner-stroke-width: 1;
+}
+
+.scrollbar.slider.horizontal,
+.scrollbar.slider.horizontal:hover,
+.scrollbar.button.horizontal {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.08)),
+ to (shade (@bg_color, 0.92)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.74)),
+ to (shade (@bg_color, 0.74)));
+ -unico-centroid-texture: url("assets/scrollbar_handle.png");
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.16)),
+ to (shade (@bg_color, 1.0)));
+}
+
+.scrollbar.button,
+.scrollbar.button:insensitive {
+ -unico-outer-stroke-width: 0;
+}
+
+/* overlay scrollbar */
+OsThumb:selected,
+OsScrollbar:selected {
+ background-color: @selected_bg_color;
+}
+
+OsThumb:active,
+OsScrollbar:active {
+ background-color: shade (@bg_color, 0.6);
+}
+
+OsThumb:insensitive,
+OsScrollbar:insensitive {
+ background-color: shade (@bg_color, 0.85);
+}
+
+/*******************
+ * scrolled window *
+ *******************/
+GtkScrolledWindow.frame {
+ border-top-color: shade (@bg_color, 0.84);
+ border-right-color: shade (@bg_color, 0.76);
+ border-bottom-color: shade (@bg_color, 0.86);
+ border-left-color: shade (@bg_color, 0.76);
+ border-radius: 0;
+ border-style: solid;
+
+ -unico-border-gradient: none;
+ -unico-inner-stroke-width: 0;
+ -unico-outer-stroke-width: 0;
+}
+
+/*************
+ * separator *
+ *************/
+.separator {
+ border-color: shade (@bg_color, 0.86);
+ border-style: solid;
+
+ -unico-border-gradient: none;
+ -unico-inner-stroke-color: alpha (shade (@bg_color, 1.26), 0.6);
+ -unico-inner-stroke-gradient: none;
+}
+
+.button .separator,
+.button.separator {
+ border-color: shade (@button_bg_color, 0.84);
+
+ -unico-inner-stroke-color: alpha (shade (@button_bg_color, 1.26), 0.5);
+ -unico-inner-stroke-gradient: none;
+}
+
+.notebook .button .separator,
+.notebook .button.separator {
+ border-color: shade (@bg_color, 0.9);
+
+ -unico-inner-stroke-color: alpha (shade (@bg_color, 1.26), 0.6);
+ -unico-inner-stroke-gradient: none;
+}
+
+.button .separator:insensitive,
+.button.separator:insensitive {
+ border-color: shade (@button_insensitive_bg_color, 0.9);
+
+ -unico-inner-stroke-color: alpha (shade (@button_insensitive_bg_color, 1.26), 0.6);
+ -unico-inner-stroke-gradient: none;
+}
+
+.notebook .button .separator,
+.notebook .button.separator {
+ border-color: shade (@bg_color, 0.84);
+
+ -unico-inner-stroke-color: alpha (shade (@bg_color, 1.26), 0.5);
+ -unico-inner-stroke-gradient: none;
+}
+
+.menuitem.separator {
+ -GtkMenuItem-horizontal-padding: 0;
+
+ border-color: shade (@dark_bg_color, 0.96);
+
+ -unico-inner-stroke-color: alpha (shade (@dark_bg_color, 1.26), 0.5);
+}
+
+/***********
+ * sidebar *
+ ***********/
+.sidebar,
+.sidebar .view {
+}
+
+.sidebar row:selected {
+ text-shadow: 0 1 shade (@selected_bg_color, 0.7);
+}
+
+.sidebar .frame {
+ border-width: 0;
+}
+
+/**************
+ * spinbutton *
+ **************/
+.spinbutton.button:active,
+.spinbutton.button:insensitive,
+.notebook .spinbutton.button:active,
+.notebook .spinbutton.button:insensitive,
+.spinbutton.button,
+.notebook .spinbutton.button {
+ -unico-outer-stroke-width: 1 1 1 0;
+}
+
+.spinbutton.button,
+.notebook .spinbutton.button {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.1)),
+ to (shade (@bg_color, 0.9)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.65)),
+ to (shade (@bg_color, 0.7)));
+}
+
+.spinbutton,
+.spinbutton:hover {
+ color: @fg_color;
+}
+
+/***********
+ * spinner *
+ ***********/
+.menu.spinner,
+.primary-toolbar .toolbar .spinner,
+.primary-toolbar.toolbar .spinner {
+ color: @selected_bg_color;
+}
+
+/*************
+ * statusbar *
+ *************/
+GtkStatusbar {
+}
+
+/**********
+ * switch *
+ **********/
+GtkSwitch {
+ border-radius: 4;
+ padding: 0;
+
+ -unico-focus-border-radius: 4;
+ -unico-focus-border-color: alpha (@selected_bg_color, 0.3);
+ -unico-focus-fill-color: @transparent;
+}
+
+GtkSwitch.trough {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.83)),
+ to (shade (@bg_color, 0.89)));
+
+ color: @fg_color;
+ text-shadow: 0 1 alpha (shade (@bg_color, 1.25), 0.5);
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.6)),
+ to (shade (@bg_color, 0.65)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.78)),
+ to (shade (@bg_color, 0.86)));
+ -unico-inner-stroke-width: 1;
+}
+
+GtkSwitch.trough:active {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 0.93)),
+ to (shade (@selected_bg_color, 0.99)));
+
+ color: @selected_fg_color;
+ text-shadow: 0 -1 shade (@selected_bg_color, 0.7);
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 0.7)),
+ to (shade (@selected_bg_color, 0.76)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 0.86)),
+ to (shade (@selected_bg_color, 0.94)));
+}
+
+GtkSwitch.trough:insensitive {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.93)),
+ to (shade (@bg_color, 0.99)));
+
+ color: shade (@bg_color, 0.6);
+ text-shadow: 0 1 alpha (shade (@bg_color, 1.25), 0.5);
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.7)),
+ to (shade (@bg_color, 0.75)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.88)),
+ to (shade (@bg_color, 0.965)));
+}
+
+GtkSwitch.slider {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.1)),
+ to (shade (@bg_color, 0.9)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.65)),
+ to (shade (@bg_color, 0.6)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.2)),
+ to (shade (@bg_color, 0.96)));
+ -unico-inner-stroke-width: 1;
+ -unico-outer-stroke-width: 0;
+}
+
+GtkSwitch.slider:insensitive {
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.7)),
+ to (shade (@bg_color, 0.75)));
+}
+
+/***********
+ * toolbar *
+ ***********/
+.toolbar {
+ border-style: none;
+}
+
+/* primary-toolbar */
+.primary-toolbar .toolbar,
+.primary-toolbar.toolbar {
+ -GtkWidget-window-dragging: true;
+
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.96)),
+ to (shade (@dark_bg_color, 1.4)));
+ border-bottom-color: shade (@dark_bg_color, 1.1);
+ border-top-color: shade (@dark_bg_color, 1.1);
+ border-style: solid;
+ border-width: 1 0 1 0;
+ padding: 2;
+
+ color: @dark_fg_color;
+ text-shadow: 0 -1 shade (@dark_bg_color, 0.7);
+
+ -unico-border-gradient: none;
+ -unico-inner-stroke-gradient: none;
+ -unico-inner-stroke-top-color: shade (@dark_bg_color, 0.94);
+ -unico-inner-stroke-width: 1 0 0 0;
+}
+
+.primary-toolbar .toolbar :insensitive,
+.primary-toolbar.toolbar :insensitive {
+ text-shadow: 0 -1 shade (@dark_bg_color, 0.7);
+}
+
+.primary-toolbar .toolbar GtkComboBox,
+.primary-toolbar.toolbar GtkComboBox,
+.primary-toolbar .toolbar .button,
+.primary-toolbar.toolbar .button {
+ background-color: @transparent;
+ background-image: none;
+ border-radius: 3;
+ border-width: 0;
+
+ color: @dark_fg_color;
+ text-shadow: 0 -1 shade (@dark_bg_color, 0.7);
+
+ transition: none;
+
+ -unico-focus-border-radius: 4;
+ -unico-focus-border-color: alpha (@selected_bg_color, 0.5);
+ -unico-focus-fill-color: alpha (@selected_bg_color, 0.2);
+ -unico-focus-outer-stroke-color: @transparent;
+
+ -unico-inner-stroke-width: 0;
+ -unico-outer-stroke-width: 0;
+}
+
+.primary-toolbar .toolbar .raised .button,
+.primary-toolbar.toolbar .raised .button,
+.primary-toolbar .toolbar .raised.button,
+.primary-toolbar.toolbar .raised.button,
+.primary-toolbar .toolbar .button:hover,
+.primary-toolbar.toolbar .button:hover,
+.primary-toolbar .toolbar .button:active,
+.primary-toolbar.toolbar .button:active,
+.primary-toolbar .toolbar .button:insensitive,
+.primary-toolbar.toolbar .button:insensitive {
+ border-width: 1;
+
+ -unico-focus-border-radius: 3;
+ -unico-focus-fill-color: @transparent;
+ -unico-focus-border-color: @transparent;
+ -unico-focus-outer-stroke-color: alpha (@selected_bg_color, 0.5);
+
+ -unico-inner-stroke-width: 1;
+ -unico-outer-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (shade (@dark_bg_color, 1.2), 0.25)),
+ to (alpha (shade (@dark_bg_color, 1.4), 0.75)));
+ -unico-outer-stroke-width: 1;
+}
+
+.primary-toolbar GtkComboBox.combobox-entry .button {
+ -unico-inner-stroke-width: 1;
+ -unico-outer-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (shade (@dark_bg_color, 1.2), 0.25)),
+ to (alpha (shade (@dark_bg_color, 1.4), 0.75)));
+}
+
+.primary-toolbar GtkComboBox.combobox-entry .button,
+.primary-toolbar .toolbar .raised .button,
+.primary-toolbar.toolbar .raised .button,
+.primary-toolbar .toolbar .raised.button,
+.primary-toolbar.toolbar .raised.button,
+.primary-toolbar .toolbar .button:hover,
+.primary-toolbar.toolbar .button:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.1)),
+ to (shade (@dark_bg_color, 0.94)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.9)),
+ to (shade (@dark_bg_color, 0.87)));
+ -unico-glow-color: shade (@dark_bg_color, 1.08);
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.18)),
+ to (shade (@dark_bg_color, 1.08)));
+}
+
+.primary-toolbar .toolbar .button:active,
+.primary-toolbar.toolbar .button:active {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.9)),
+ to (shade (@dark_bg_color, 0.95)));
+
+ text-shadow: 0 -1 shade (@dark_bg_color, 0.6);
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.75)),
+ to (shade (@dark_bg_color, 0.85)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.88)),
+ to (shade (@dark_bg_color, 0.9)))
+}
+
+.primary-toolbar .toolbar .button:active:hover,
+.primary-toolbar.toolbar .button:active:hover {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.95)),
+ to (shade (@dark_bg_color, 1.0)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.75)),
+ to (shade (@dark_bg_color, 0.85)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.93)),
+ to (shade (@dark_bg_color, 0.94)))
+}
+
+.primary-toolbar .toolbar .button:active:insensitive,
+.primary-toolbar.toolbar .button:active:insensitive,
+.primary-toolbar .toolbar .button:insensitive,
+.primary-toolbar.toolbar .button:insensitive {
+ text-shadow: none;
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.85)),
+ to (shade (@dark_bg_color, 0.95)));
+ -unico-glow-radius: 0;
+ -unico-outer-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (shade (@dark_bg_color, 1.2), 0.18)),
+ to (alpha (shade (@dark_bg_color, 1.4), 0.5)));
+}
+
+.primary-toolbar .toolbar .button:insensitive,
+.primary-toolbar.toolbar .button:insensitive {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.01)),
+ to (shade (@dark_bg_color, 0.99)));
+
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 1.1)),
+ to (shade (@dark_bg_color, 1.04)));
+}
+
+.primary-toolbar .toolbar .button:active:insensitive,
+.primary-toolbar.toolbar .button:active:insensitive {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.94)),
+ to (shade (@dark_bg_color, 1.02)));
+
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.92)),
+ to (shade (@dark_bg_color, 1.0)));
+}
+
+.primary-toolbar .toolbar .entry,
+.primary-toolbar.toolbar .entry,
+.primary-toolbar .toolbar .entry:active,
+.primary-toolbar.toolbar .entry:active,
+.primary-toolbar .toolbar .entry:focused,
+.primary-toolbar.toolbar .entry:focused {
+ border-radius: 3;
+
+ color: @text_color;
+
+ -unico-outer-stroke-width: 1;
+ -unico-outer-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (shade (@dark_bg_color, 1.2), 0.25)),
+ to (alpha (shade (@dark_bg_color, 1.4), 0.75)));
+}
+
+.primary-toolbar .toolbar .entry,
+.primary-toolbar.toolbar .entry {
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@dark_bg_color, 0.75)),
+ to (shade (@dark_bg_color, 0.95)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (shade (@bg_color, 0.05), 0.16)),
+ to (alpha (shade (@bg_color, 0.05), 0.08)));
+}
+
+.primary-toolbar .toolbar .entry:insensitive,
+.primary-toolbar.toolbar .entry:insensitive {
+ -unico-outer-stroke-width: 1;
+ -unico-outer-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (shade (@dark_bg_color, 1.2), 0.18)),
+ to (alpha (shade (@dark_bg_color, 1.4), 0.5)));
+}
+
+.primary-toolbar .toolbar .entry:focused,
+.primary-toolbar.toolbar .entry:focused {
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@selected_bg_color, 0.75)),
+ to (shade (@selected_bg_color, 0.8)));
+ -unico-inner-stroke-color: alpha (@selected_bg_color, 0.2);
+ -unico-inner-stroke-gradient: none;
+}
+
+.primary-toolbar .toolbar GtkSeparatorToolItem,
+.primary-toolbar.toolbar GtkSeparatorToolItem,
+.primary-toolbar .toolbar .separator,
+.primary-toolbar.toolbar .separator,
+.primary-toolbar .toolbar .separator:insensitive,
+.primary-toolbar.toolbar .separator:insensitive {
+ border-color: alpha (shade (@dark_bg_color, 0.94), 0.5);
+ border-style: solid;
+
+ -unico-border-gradient: none;
+ -unico-inner-stroke-color: alpha (shade (@dark_bg_color, 1.5), 0.4);
+ -unico-inner-stroke-gradient: none;
+}
+
+/* inline-toolbar */
+.inline-toolbar.toolbar {
+ -GtkToolbar-button-relief: normal;
+
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (#f2f1ef, 0.93)),
+ color-stop (0.08, #f2f1ef),
+ to (#ffffff));
+ border-radius: 0;
+ border-style: solid;
+ border-width: 1;
+ padding: 3 4 4 4;
+}
+
+.inline-toolbar.toolbar:nth-child(last) {
+ border-bottom-color: shade (@bg_color, 0.76);
+ border-color: shade (@bg_color, 0.8);
+ border-radius: 0 0 3 3;
+ border-width: 0 1 1 1;
+}
+
+.inline-toolbar.toolbar .button {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.12)),
+ to (shade (@bg_color, 0.88)));
+ border-radius: 0;
+ border-style: solid;
+ border-width: 1 0 1 1;
+ padding: 1;
+
+ icon-shadow: 0 1 shade (@bg_color, 1.16);
+
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.16)),
+ to (shade (@bg_color, 0.98)));
+ -unico-outer-stroke-width: 1 0 1 0;
+}
+
+.inline-toolbar.toolbar .button *:active,
+.inline-toolbar.toolbar .button *:insensitive,
+.inline-toolbar.toolbar GtkToolButton .button:active,
+.inline-toolbar.toolbar GtkToolButton .button:insensitive {
+ -unico-outer-stroke-width: 1 0 1 0;
+ -unico-outer-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (alpha (shade (@bg_color, 0.05), 0.02)),
+ to (alpha (shade (@bg_color, 0.05), 0.06)));
+}
+
+.inline-toolbar.toolbar .button *:insensitive,
+.inline-toolbar.toolbar GtkToolButton .button:insensitive {
+ background-image: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.02)),
+ to (shade (@bg_color, 0.98)));
+
+ -unico-border-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 0.85)),
+ to (shade (@bg_color, 0.8)));
+ -unico-inner-stroke-gradient: -gtk-gradient (linear, left top, left bottom,
+ from (shade (@bg_color, 1.16)),
+ to (shade (@bg_color, 1.0)));
+}
+
+.inline-toolbar.toolbar .button:nth-child(first),
+.inline-toolbar.toolbar GtkToolButton:nth-child(first) .button {
+ border-radius: 3 0 0 3;
+
+ -unico-outer-stroke-width: 1 0 1 1;
+}
+
+.inline-toolbar.toolbar .button:nth-child(last),
+.inline-toolbar.toolbar GtkToolButton:nth-child(last) .button {
+ border-radius: 0 3 3 0;
+ border-width: 1;
+
+ -unico-outer-stroke-width: 1 1 1 0;
+}
+
+/***********
+ * tooltip *
+ ***********/
+.tooltip {
+ border-color: @tooltip_bg_color;
+}
+
+/************
+ * treeview *
+ ************/
+GtkTreeView .entry {
+ background-image: none;
+ border-radius: 0;
+
+ -unico-inner-stroke-gradient: none;
+ -unico-inner-stroke-width: 1;
+}
+
+/************
+ * viewport *
+ ************/
+GtkViewport.frame {
+ border-width: 0;
+
+ -unico-inner-stroke-width: 0;
+}
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/gtk.css b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/gtk.css
new file mode 100644
index 00000000..8c28389c
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/gtk.css
@@ -0,0 +1,34 @@
+/* default color scheme */
+@define-color bg_color #f2f1f0;
+@define-color fg_color #4c4c4c;
+@define-color base_color #ffffff;
+@define-color text_color #3C3C3C;
+@define-color selected_bg_color #f07746;
+@define-color selected_fg_color #ffffff;
+@define-color tooltip_bg_color #f5f5b5;
+@define-color tooltip_fg_color #000000;
+
+/* misc colors used by gtk+ */
+@define-color info_fg_color rgb (181, 171, 156);
+@define-color info_bg_color rgb (252, 252, 189);
+@define-color warning_fg_color rgb (173, 120, 41);
+@define-color warning_bg_color rgb (250, 173, 61);
+@define-color question_fg_color rgb (97, 122, 214);
+@define-color question_bg_color rgb (138, 173, 212);
+@define-color error_fg_color rgb (166, 38, 38);
+@define-color error_bg_color rgb (237, 54, 54);
+@define-color link_color #4a90d9;
+@define-color error_color #cc0000;
+
+/* theme common colors */
+@define-color button_bg_color shade (#cdcdcd, 1.06);
+@define-color button_insensitive_bg_color mix (@button_bg_color, @bg_color, 0.6);
+@define-color dark_bg_color #3c3b37;
+@define-color dark_fg_color #dfdbd2;
+@define-color transparent rgba (0, 0, 0, 0);
+
+@import url("gtk-widgets.css");
+@import url("apps/gnome-panel.css");
+@import url("apps/gnome-terminal.css");
+@import url("apps/nautilus.css");
+@import url("apps/unity.css");
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/settings.ini b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/settings.ini
new file mode 100644
index 00000000..ab8f3b00
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/gtk-3.0/settings.ini
@@ -0,0 +1,3 @@
+[Settings]
+gtk-color-scheme = "base_color:#ffffff\nbg_color:#f2f1f0\ntooltip_bg_color:#f5f5b5\nselected_bg_color:#f07746\ntext_color:#3C3C3C\nfg_color:#4c4c4c\ntooltip_fg_color:#000000\nselected_fg_color:#ffffff\nlink_color:#DD4814\nbg_color_dark:#3c3b37\nfg_color_dark:#dfdbd2"
+gtk-auto-mnemonics = 1
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/index.theme b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/index.theme
new file mode 100644
index 00000000..105dee69
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/index.theme
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Type=X-GNOME-Metatheme
+Name=Ambiance
+Comment=Ubuntu Ambiance theme
+Encoding=UTF-8
+
+[X-GNOME-Metatheme]
+GtkTheme=Ambiance
+MetacityTheme=Ambiance
+IconTheme=ubuntu-mono-dark
+CursorTheme=DMZ-White
+ButtonLayout=close,minimize,maximize:
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close.png
new file mode 100644
index 00000000..9ef84eaf
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_focused_normal.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_focused_normal.png
new file mode 100644
index 00000000..9ef84eaf
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_focused_normal.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_focused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_focused_prelight.png
new file mode 100644
index 00000000..9e09161a
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_focused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_focused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_focused_pressed.png
new file mode 100644
index 00000000..04431b94
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_focused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused.png
new file mode 100644
index 00000000..9be481d6
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused_over.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused_over.png
new file mode 100644
index 00000000..63004d48
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused_over.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused_prelight.png
new file mode 100644
index 00000000..6732780f
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused_pressed.png
new file mode 100644
index 00000000..c5f120f3
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/close_unfocused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize.png
new file mode 100644
index 00000000..d3833110
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_focused_normal.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_focused_normal.png
new file mode 100644
index 00000000..d3833110
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_focused_normal.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_focused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_focused_prelight.png
new file mode 100644
index 00000000..fc97526f
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_focused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_focused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_focused_pressed.png
new file mode 100644
index 00000000..2e667f27
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_focused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused.png
new file mode 100644
index 00000000..6a9fd7fe
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused_over.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused_over.png
new file mode 100644
index 00000000..274c1831
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused_over.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused_prelight.png
new file mode 100644
index 00000000..fc97526f
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused_pressed.png
new file mode 100644
index 00000000..378d4a77
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/maximize_unfocused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/menu.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/menu.png
new file mode 100644
index 00000000..7d2fff78
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/menu.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/menu_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/menu_prelight.png
new file mode 100644
index 00000000..efd98ccd
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/menu_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/metacity-theme-1.xml b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/metacity-theme-1.xml
new file mode 100644
index 00000000..cb2cb5f3
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/metacity-theme-1.xml
@@ -0,0 +1,558 @@
+<?xml version="1.0"?>
+
+<metacity_theme>
+<info>
+ <name>Ambiance</name>
+ <author>Kenneth Wimer, James Schriver, Andrea Cimitan</author>
+ <copyright>Canonical Ltd.</copyright>
+ <date>June, 2011</date>
+ <description>Metacity theme</description>
+</info>
+
+<!-- general window layout -->
+<frame_geometry name="frame_geometry_normal" title_scale="medium" rounded_top_left="true" rounded_top_right="true" rounded_bottom_left="false" rounded_bottom_right="false">
+ <distance name="left_width" value="1"/>
+ <distance name="right_width" value="1"/>
+ <distance name="bottom_height" value="1"/>
+ <distance name="left_titlebar_edge" value="10"/>
+ <distance name="right_titlebar_edge" value="10"/>
+ <distance name="button_width" value="18"/>
+ <distance name="button_height" value="20"/>
+ <distance name="title_vertical_pad" value="12"/>
+ <border name="title_border" left="2" right="2" top="0" bottom="0"/>
+ <border name="button_border" left="0" right="0" top="1" bottom="1"/>
+</frame_geometry>
+
+<frame_geometry name="frame_geometry_abnormal" title_scale="medium" rounded_top_left="false" rounded_top_right="false">
+ <distance name="left_width" value="0"/>
+ <distance name="right_width" value="0"/>
+ <distance name="bottom_height" value="0"/>
+ <distance name="left_titlebar_edge" value="10"/>
+ <distance name="right_titlebar_edge" value="10"/>
+ <distance name="button_width" value="18"/>
+ <distance name="button_height" value="20"/>
+ <distance name="title_vertical_pad" value="2"/>
+ <border name="title_border" left="2" right="2" top="0" bottom="0"/>
+ <border name="button_border" left="0" right="0" top="1" bottom="1"/>
+</frame_geometry>
+
+<frame_geometry name="geometry_maximized" rounded_top_left="false" rounded_top_right="false" rounded_bottom_left="false" rounded_bottom_right="false">
+ <distance name="left_width" value="0"/>
+ <distance name="right_width" value="0"/>
+ <distance name="bottom_height" value="0"/>
+ <distance name="left_titlebar_edge" value="10"/>
+ <distance name="right_titlebar_edge" value="10"/>
+ <distance name="button_width" value="18"/>
+ <distance name="button_height" value="20"/>
+ <distance name="title_vertical_pad" value="12"/>
+ <border name="title_border" left="2" right="2" top="0" bottom="0"/>
+ <border name="button_border" left="0" right="0" top="1" bottom="1"/>
+</frame_geometry>
+
+<frame_geometry name="border" has_title="false">
+ <distance name="left_width" value="3"/>
+ <distance name="right_width" value="3"/>
+ <distance name="bottom_height" value="3"/>
+ <distance name="left_titlebar_edge" value="0"/>
+ <distance name="right_titlebar_edge" value="0"/>
+ <distance name="button_width" value="0"/>
+ <distance name="button_height" value="0"/>
+ <distance name="title_vertical_pad" value="3"/>
+ <border name="title_border" left="0" right="0" top="0" bottom="0"/>
+ <border name="button_border" left="0" right="0" top="0" bottom="0"/>
+</frame_geometry>
+
+<!-- window titles -->
+
+<draw_ops name="draw_title_text_normal">
+ <title color="#333" x="10" y="(((height - title_height) / 2) `max` 0)+1"/>
+ <title color="#333" x="10" y="(((height - title_height) / 2) `max` 0)-1"/>
+ <title color="#333" x="9" y="(((height - title_height) / 2) `max` 0)"/>
+ <title color="#333" x="11" y="(((height - title_height) / 2) `max` 0)"/>
+ <title color="#dfdbd2" x="10" y="(((height - title_height) / 2) `max` 0)"/>
+</draw_ops>
+
+<draw_ops name="draw_title_text_unfocused">
+ <title color="#333" x="10" y="(((height - title_height) / 2) `max` 0)+1"/>
+ <title color="#333" x="10" y="(((height - title_height) / 2) `max` 0)-1"/>
+ <title color="#333" x="9" y="(((height - title_height) / 2) `max` 0)"/>
+ <title color="#333" x="11" y="(((height - title_height) / 2) `max` 0)"/>
+ <title color="#807d78" x="10" y="(((height - title_height) / 2) `max` 0)"/>
+</draw_ops>
+
+<draw_ops name="draw_title">
+ <!-- frame and gradient -->
+ <rectangle color="#3c3b37" filled="false" x="0" y="0" width="width-1" height="top_height"/>
+ <gradient type="vertical" x="1" y="1" width="width-2" height="top_height-1">
+ <color value="#474642" />
+ <color value="#474642" />
+ <color value="#474642" />
+ <color value="#3c3b37" />
+ <color value="#3c3b37" />
+ <color value="#3c3b37" />
+ </gradient>
+ <!-- top line -->
+ <gradient type="horizontal" x="0" y="1" width="width" height="1">
+ <color value="shade/#474642/1.1" />
+ <color value="shade/#474642/1.4" />
+ <color value="shade/#474642/1.1" />
+ </gradient>
+ <!-- left arch -->
+ <!-- <arc color="shade/#474642/1.1" x="0" y="1" width="9" height="7" start_angle="270" extent_angle="90" />
+ <arc color="#3c3b37" x="0" y="0" width="9" height="9" start_angle="270" extent_angle="90" /> -->
+ <line color="#3c3b37" x1="0" x2="4" y1="1" y2="1"/>
+ <line color="#3c3b37" x1="0" x2="2" y1="2" y2="2"/>
+ <line color="#3c3b37" x1="0" x2="1" y1="3" y2="3"/>
+ <line color="#3c3b37" x1="0" x2="1" y1="4" y2="4"/>
+ <!-- right arch -->
+ <!-- <arc color="shade/#474642/1.1" x="width-10" y="1" width="9" height="7" start_angle="0" extent_angle="90" />
+ <arc color="#3c3b37" x="width-10" y="0" width="9" height="9" start_angle="0" extent_angle="90" /> -->
+ <line color="#3c3b37" x1="width-5" x2="width" y1="1" y2="1"/>
+ <line color="#3c3b37" x1="width-3" x2="width" y1="2" y2="2"/>
+ <line color="#3c3b37" x1="width-2" x2="width" y1="3" y2="3"/>
+ <line color="#3c3b37" x1="width-2" x2="width" y1="4" y2="4"/>
+</draw_ops>
+
+<draw_ops name="draw_title_utility">
+ <include name="draw_title" />
+ <line color="shade/#3c3b37/0.88" x1="0" x2="width" y1="height-1" y2="height-1"/>
+</draw_ops>
+
+<draw_ops name="draw_title_unfocused">
+ <!-- frame and gradient -->
+ <rectangle color="#3c3b37" filled="false" x="0" y="0" width="width-1" height="top_height"/>
+ <gradient type="vertical" x="1" y="1" width="width-2" height="top_height-1">
+ <color value="shade/#474642/0.92" />
+ <color value="shade/#474642/0.92" />
+ <color value="shade/#474642/0.92" />
+ <color value="#3c3b37" />
+ <color value="#3c3b37" />
+ <color value="#3c3b37" />
+ </gradient>
+ <!-- top line -->
+ <line color="#474642" x1="0" x2="width" y1="1" y2="1"/>
+ <!-- left arch -->
+ <!-- <arc color="shade/#474642/0.98" x="0" y="1" width="9" height="7" start_angle="270" extent_angle="90" />
+ <arc color="#3c3b37" x="0" y="0" width="9" height="9" start_angle="270" extent_angle="90" /> -->
+ <line color="#3c3b37" x1="0" x2="4" y1="1" y2="1"/>
+ <line color="#3c3b37" x1="0" x2="2" y1="2" y2="2"/>
+ <line color="#3c3b37" x1="0" x2="1" y1="3" y2="3"/>
+ <line color="#3c3b37" x1="0" x2="1" y1="4" y2="4"/>
+ <!-- right arch -->
+ <!-- <arc color="shade/#474642/0.98" x="width-10" y="1" width="9" height="7" start_angle="0" extent_angle="90" />
+ <arc color="#3c3b37" x="width-10" y="0" width="9" height="9" start_angle="0" extent_angle="90" /> -->
+ <line color="#3c3b37" x1="width-5" x2="width" y1="1" y2="1"/>
+ <line color="#3c3b37" x1="width-3" x2="width" y1="2" y2="2"/>
+ <line color="#3c3b37" x1="width-2" x2="width" y1="3" y2="3"/>
+ <line color="#3c3b37" x1="width-2" x2="width" y1="4" y2="4"/>
+</draw_ops>
+
+<draw_ops name="draw_title_utility_unfocused">
+ <include name="draw_title_unfocused" />
+ <line color="shade/#3c3b37/0.88" x1="0" x2="width" y1="height-1" y2="height-1"/>
+</draw_ops>
+
+<draw_ops name="draw_title_maximized">
+ <!-- frame and gradient -->
+ <line color="#3c3b37" x1="0" x2="width" y1="0" y2="0"/>
+ <gradient type="vertical" x="0" y="1" width="width" height="top_height-1">
+ <color value="shade/#474642/0.98" />
+ <color value="shade/#474642/0.98" />
+ <color value="shade/#474642/0.98" />
+ <color value="#3c3b37" />
+ <color value="#3c3b37" />
+ <color value="#3c3b37" />
+ </gradient>
+ <!-- top line -->
+ <gradient type="horizontal" x="0" y="1" width="width" height="1">
+ <color value="shade/#474642/1.08" />
+ <color value="shade/#474642/1.38" />
+ <color value="shade/#474642/1.08" />
+ </gradient>
+</draw_ops>
+
+<draw_ops name="draw_title_maximized_unfocused">
+ <!-- frame and gradient -->
+ <line color="#3c3b37" x1="0" x2="width" y1="0" y2="0"/>
+ <gradient type="vertical" x="0" y="1" width="width" height="top_height-1">
+ <color value="shade/#474642/0.9" />
+ <color value="shade/#474642/0.9" />
+ <color value="shade/#474642/0.9" />
+ <color value="#3c3b37" />
+ <color value="#3c3b37" />
+ <color value="#3c3b37" />
+ </gradient>
+ <!-- top line -->
+ <line color="shade/#474642/0.96" x1="0" x2="width" y1="1" y2="1"/>
+</draw_ops>
+
+<!-- window frames -->
+
+<draw_ops name="draw_frame">
+ <rectangle color="shade/gtk:bg[NORMAL]/0.7" filled="true" x="0" y="0" width="width" height="height"/>
+ <gradient type="vertical" x="0" y="0" width="width" height="80">
+ <color value="#3c3b37" />
+ <color value="#3c3b37" />
+ <color value="shade/gtk:bg[NORMAL]/0.7" />
+ </gradient>
+</draw_ops>
+
+<draw_ops name="draw_frame_utility">
+ <rectangle color="shade/gtk:bg[NORMAL]/0.7" filled="true" x="0" y="0" width="width" height="height"/>
+</draw_ops>
+
+<draw_ops name="bottom_edge">
+ <line color="shade/gtk:bg[NORMAL]/0.7" x1="0" x2="width" y1="height-1" y2="height-1"/>
+</draw_ops>
+
+<draw_ops name="border">
+ <line color="shade/gtk:bg[NORMAL]/0.88" x1="1" y1="height - 2" x2="width - 2" y2="height - 2"/>
+ <line color="shade/gtk:bg[NORMAL]/0.88" x1="width - 2" y1="1" x2="width - 2" y2="height - 2"/>
+ <line color="shade/gtk:bg[NORMAL]/1.4" x1="1" y1="1" x2="width - 2" y2="1"/>
+ <line color="shade/gtk:bg[NORMAL]/1.4" x1="1" y1="1" x2="1" y2="height - 2"/>
+ <rectangle color="shade/gtk:bg[NORMAL]/0.25" filled="false" x="0" y="0" width="width - 1" height="height - 1"/>
+</draw_ops>
+
+<!-- buttons -->
+
+<!-- button trough left -->
+<draw_ops name="left_left_background_focused_normal">
+ <image filename="trough_left.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="left_left_background_focused_pressed">
+ <image filename="trough_left.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="left_middle_background_focused_normal">
+ <image filename="trough_middle.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="left_middle_background_focused_pressed">
+ <image filename="trough_middle.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="left_right_background_focused_normal">
+ <image filename="trough_right.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="left_right_background_focused_pressed">
+ <image filename="trough_right.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="left_left_background_unfocused_normal">
+ <image filename="trough_left.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="left_left_background_unfocused_pressed">
+ <image filename="trough_left.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="left_middle_background_unfocused_normal">
+ <image filename="trough_middle.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="left_middle_background_unfocused_pressed">
+ <image filename="trough_middle.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="left_right_background_unfocused_normal">
+ <image filename="trough_right.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="left_right_background_unfocused_pressed">
+ <image filename="trough_right.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+
+<!-- button trough right -->
+<draw_ops name="right_left_background_focused_normal">
+ <image filename="trough_left.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="right_left_background_focused_pressed">
+ <image filename="trough_left.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="right_middle_background_focused_normal">
+ <image filename="trough_middle.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="right_middle_background_focused_pressed">
+ <image filename="trough_middle.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="right_right_background_focused_normal">
+ <image filename="trough_right.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="right_right_background_focused_pressed">
+ <image filename="trough_right.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="right_left_background_unfocused_normal">
+ <image filename="trough_left.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="right_left_background_unfocused_pressed">
+ <image filename="trough_left.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="right_middle_background_unfocused_normal">
+ <image filename="trough_middle.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="right_middle_background_unfocused_pressed">
+ <image filename="trough_middle.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="right_right_background_unfocused_normal">
+ <image filename="trough_right.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="right_right_background_unfocused_pressed">
+ <image filename="trough_right.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+
+<!-- button prelightlays -->
+<draw_ops name="menu_focused_normal">
+ <image filename="menu.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="menu_focused_prelight">
+ <image filename="menu_prelight.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="menu_unfocused_normal">
+ <image filename="menu.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="menu_unfocused_prelight">
+ <image filename="menu_prelight.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="minimize_focused_normal">
+ <image filename="minimize_focused_normal.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="minimize_focused_prelight">
+ <image filename="minimize_focused_prelight.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="minimize_focused_pressed">
+ <image filename="minimize_focused_pressed.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="minimize_unfocused_normal">
+ <image filename="minimize_unfocused.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="minimize_unfocused_prelight">
+ <image filename="minimize_unfocused_prelight.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="minimize_unfocused_pressed">
+ <image filename="minimize.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="maximize_focused_normal">
+ <image filename="maximize_focused_normal.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="maximize_focused_prelight">
+ <image filename="maximize_focused_prelight.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="maximize_focused_pressed">
+ <image filename="maximize_focused_pressed.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="maximize_unfocused_normal">
+ <image filename="maximize_unfocused.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="maximize_unfocused_prelight">
+ <image filename="maximize_unfocused_prelight.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="maximize_unfocused_pressed">
+ <image filename="maximize.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="unmaximize_focused_normal">
+ <image filename="unmaximize_focused_normal.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="unmaximize_focused_prelight">
+ <image filename="unmaximize_focused_prelight.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="unmaximize_focused_pressed">
+ <image filename="unmaximize_focused_pressed.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="unmaximize_unfocused_normal">
+ <image filename="unmaximize_unfocused.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="unmaximize_unfocused_prelight">
+ <image filename="unmaximize_unfocused_prelight.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="unmaximize_unfocused_pressed">
+ <image filename="unmaximize.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="close_focused_normal">
+ <image filename="close_focused_normal.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="close_focused_prelight">
+ <image filename="close_focused_prelight.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="close_focused_pressed">
+ <image filename="close_focused_pressed.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="close_unfocused_normal">
+ <image filename="close_unfocused.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="close_unfocused_prelight">
+ <image filename="close_unfocused_prelight.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+<draw_ops name="close_unfocused_pressed">
+ <image filename="close.png" x="0" y="1" width="object_width" height="object_height"/>
+</draw_ops>
+
+<!-- frame style -->
+<frame_style name="normal_focused" geometry="frame_geometry_normal">
+ <piece position="title" draw_ops="draw_title_text_normal"/>
+ <piece position="titlebar" draw_ops="draw_title"/>
+ <piece position="left_edge" draw_ops="draw_frame"/>
+ <piece position="right_edge" draw_ops="draw_frame"/>
+ <piece position="bottom_edge" draw_ops="bottom_edge"/>
+ <button function="left_left_background" state="normal" draw_ops="left_left_background_focused_normal"/>
+ <button function="left_middle_background" state="normal" draw_ops="left_middle_background_focused_normal"/>
+ <button function="left_right_background" state="normal" draw_ops="left_right_background_focused_normal"/>
+ <button function="left_left_background" state="prelight" draw_ops="left_left_background_focused_normal"/>
+ <button function="left_middle_background" state="prelight" draw_ops="left_middle_background_focused_normal"/>
+ <button function="left_right_background" state="prelight" draw_ops="left_right_background_focused_normal"/>
+ <button function="left_left_background" state="pressed" draw_ops="left_left_background_focused_pressed"/>
+ <button function="left_middle_background" state="pressed" draw_ops="left_middle_background_focused_pressed"/>
+ <button function="left_right_background" state="pressed" draw_ops="left_right_background_focused_pressed"/>
+ <button function="right_left_background" state="normal" draw_ops="right_left_background_focused_normal"/>
+ <button function="right_middle_background" state="normal" draw_ops="right_middle_background_focused_normal"/>
+ <button function="right_right_background" state="normal" draw_ops="right_right_background_focused_normal"/>
+ <button function="right_left_background" state="prelight" draw_ops="right_left_background_focused_normal"/>
+ <button function="right_middle_background" state="prelight" draw_ops="right_middle_background_focused_normal"/>
+ <button function="right_right_background" state="prelight" draw_ops="right_right_background_focused_normal"/>
+ <button function="right_left_background" state="pressed" draw_ops="right_left_background_focused_pressed"/>
+ <button function="right_middle_background" state="pressed" draw_ops="right_middle_background_focused_pressed"/>
+ <button function="right_right_background" state="pressed" draw_ops="right_right_background_focused_pressed"/>
+ <button function="menu" state="normal" draw_ops="menu_focused_normal"/>
+ <button function="menu" state="prelight" draw_ops="menu_focused_prelight"/>
+ <button function="menu" state="pressed" draw_ops="menu_focused_normal"/>
+ <button function="minimize" state="normal" draw_ops="minimize_focused_normal"/>
+ <button function="minimize" state="prelight" draw_ops="minimize_focused_prelight"/>
+ <button function="minimize" state="pressed" draw_ops="minimize_focused_pressed"/>
+ <button function="maximize" state="normal" draw_ops="maximize_focused_normal"/>
+ <button function="maximize" state="prelight" draw_ops="maximize_focused_prelight"/>
+ <button function="maximize" state="pressed" draw_ops="maximize_focused_pressed"/>
+ <button function="close" state="normal" draw_ops="close_focused_normal"/>
+ <button function="close" state="prelight" draw_ops="close_focused_prelight"/>
+ <button function="close" state="pressed" draw_ops="close_focused_pressed"/>
+ <shadow radius="8.0" opacity="0.75" color="#abde4f" x_offset="1" y_offset="4"/>
+ <padding left="7" right="7" bottom="7"/>
+</frame_style>
+
+<frame_style name="normal_unfocused" geometry="frame_geometry_normal">
+ <piece position="title" draw_ops="draw_title_text_unfocused"/>
+ <piece position="titlebar" draw_ops="draw_title_unfocused"/>
+ <piece position="left_edge" draw_ops="draw_frame"/>
+ <piece position="right_edge" draw_ops="draw_frame"/>
+ <piece position="bottom_edge" draw_ops="bottom_edge"/>
+ <button function="left_left_background" state="normal" draw_ops="left_left_background_unfocused_normal"/>
+ <button function="left_middle_background" state="normal" draw_ops="left_middle_background_unfocused_normal"/>
+ <button function="left_right_background" state="normal" draw_ops="left_right_background_unfocused_normal"/>
+ <button function="left_left_background" state="prelight" draw_ops="left_left_background_unfocused_normal"/>
+ <button function="left_middle_background" state="prelight" draw_ops="left_middle_background_unfocused_normal"/>
+ <button function="left_right_background" state="prelight" draw_ops="left_right_background_unfocused_normal"/>
+ <button function="left_left_background" state="pressed" draw_ops="left_left_background_unfocused_pressed"/>
+ <button function="left_middle_background" state="pressed" draw_ops="left_middle_background_unfocused_pressed"/>
+ <button function="left_right_background" state="pressed" draw_ops="left_right_background_unfocused_pressed"/>
+ <button function="right_left_background" state="normal" draw_ops="right_left_background_unfocused_normal"/>
+ <button function="right_middle_background" state="normal" draw_ops="right_middle_background_unfocused_normal"/>
+ <button function="right_right_background" state="normal" draw_ops="right_right_background_unfocused_normal"/>
+ <button function="right_left_background" state="prelight" draw_ops="right_left_background_unfocused_normal"/>
+ <button function="right_middle_background" state="prelight" draw_ops="right_middle_background_unfocused_normal"/>
+ <button function="right_right_background" state="prelight" draw_ops="right_right_background_unfocused_normal"/>
+ <button function="right_left_background" state="pressed" draw_ops="right_left_background_unfocused_pressed"/>
+ <button function="right_middle_background" state="pressed" draw_ops="right_middle_background_unfocused_pressed"/>
+ <button function="right_right_background" state="pressed" draw_ops="right_right_background_unfocused_pressed"/>
+ <button function="menu" state="normal" draw_ops="menu_unfocused_normal"/>
+ <button function="menu" state="prelight" draw_ops="menu_unfocused_prelight"/>
+ <button function="menu" state="pressed" draw_ops="menu_unfocused_normal"/>
+ <button function="minimize" state="normal" draw_ops="minimize_unfocused_normal"/>
+ <button function="minimize" state="prelight" draw_ops="minimize_unfocused_prelight"/>
+ <button function="minimize" state="pressed" draw_ops="minimize_unfocused_pressed"/>
+ <button function="maximize" state="normal" draw_ops="maximize_unfocused_normal"/>
+ <button function="maximize" state="prelight" draw_ops="maximize_unfocused_prelight"/>
+ <button function="maximize" state="pressed" draw_ops="maximize_unfocused_pressed"/>
+ <button function="close" state="normal" draw_ops="close_unfocused_normal"/>
+ <button function="close" state="prelight" draw_ops="close_unfocused_prelight"/>
+ <button function="close" state="pressed" draw_ops="close_unfocused_pressed"/>
+ <shadow radius="8.0" opacity="0.5" color="#abde4f" x_offset="1" y_offset="4"/>
+ <padding left="7" right="7" bottom="7"/>
+</frame_style>
+
+<frame_style name="maximized_focused" geometry="geometry_maximized" parent="normal_focused">
+ <piece position="title" draw_ops="draw_title_text_normal"/>
+ <piece position="titlebar" draw_ops="draw_title_maximized"/>
+ <button function="maximize" state="normal" draw_ops="unmaximize_focused_normal"/>
+ <button function="maximize" state="prelight" draw_ops="unmaximize_focused_prelight"/>
+ <button function="maximize" state="pressed" draw_ops="unmaximize_focused_pressed"/>
+ <shadow radius="0.0" opacity="0.0" color="#000000" x_offset="0" y_offset="0"/>
+ <padding left="0" right="0" bottom="0"/>
+</frame_style>
+
+<frame_style name="maximized_unfocused" geometry="geometry_maximized" parent="normal_unfocused">
+ <piece position="title" draw_ops="draw_title_text_unfocused"/>
+ <piece position="titlebar" draw_ops="draw_title_maximized_unfocused"/>
+ <button function="maximize" state="normal" draw_ops="unmaximize_unfocused_normal"/>
+ <button function="maximize" state="prelight" draw_ops="unmaximize_unfocused_prelight"/>
+ <button function="maximize" state="pressed" draw_ops="unmaximize_unfocused_pressed"/>
+ <shadow radius="0.0" opacity="0.0" color="#000000" x_offset="0" y_offset="0"/>
+ <padding left="0" right="0" bottom="0"/>
+</frame_style>
+
+<frame_style name="utility_focused" parent="normal_focused">
+ <piece position="title" draw_ops="draw_title_text_normal"/>
+ <piece position="titlebar" draw_ops="draw_title_utility"/>
+ <piece position="left_edge" draw_ops="draw_frame_utility"/>
+ <piece position="right_edge" draw_ops="draw_frame_utility"/>
+ <button function="menu" state="normal" draw_ops="menu_focused_normal"/>
+ <button function="menu" state="prelight" draw_ops="menu_focused_prelight"/>
+ <button function="menu" state="pressed" draw_ops="menu_focused_normal"/>
+ <button function="close" state="normal" draw_ops="close_focused_normal"/>
+ <button function="close" state="prelight" draw_ops="close_focused_prelight"/>
+ <button function="close" state="pressed" draw_ops="close_focused_pressed"/>
+ <shadow radius="8.0" opacity="0.3" color="#abde4f" x_offset="1" y_offset="1"/>
+ <padding left="2" right="2" bottom="2"/>
+</frame_style>
+
+<frame_style name="utility_unfocused" parent="normal_unfocused">
+ <piece position="title" draw_ops="draw_title_text_unfocused"/>
+ <piece position="titlebar" draw_ops="draw_title_utility_unfocused"/>
+ <piece position="left_edge" draw_ops="draw_frame_utility"/>
+ <piece position="right_edge" draw_ops="draw_frame_utility"/>
+ <button function="menu" state="normal" draw_ops="menu_unfocused_normal"/>
+ <button function="menu" state="prelight" draw_ops="menu_unfocused_prelight"/>
+ <button function="menu" state="pressed" draw_ops="menu_focused_normal"/>
+ <button function="close" state="normal" draw_ops="close_unfocused_normal"/>
+ <button function="close" state="prelight" draw_ops="close_unfocused_prelight"/>
+ <button function="close" state="pressed" draw_ops="close_unfocused_pressed"/>
+ <shadow radius="8.0" opacity="0.3" color="#abde4f" x_offset="1" y_offset="1"/>
+ <padding left="2" right="2" bottom="2"/>
+</frame_style>
+
+<frame_style name="border" geometry="border" parent="normal_focused">
+ <piece position="title" draw_ops="draw_title"/>
+ <piece position="titlebar" draw_ops="draw_title_unfocused"/>
+</frame_style>
+
+<!-- style set -->
+<frame_style_set name="normal">
+ <frame focus="yes" state="normal" resize="both" style="normal_focused"/>
+ <frame focus="no" state="normal" resize="both" style="normal_unfocused"/>
+ <frame focus="yes" state="maximized" style="maximized_focused"/>
+ <frame focus="no" state="maximized" style="maximized_unfocused"/>
+ <frame focus="yes" state="shaded" style="normal_focused"/><!-- todo -->
+ <frame focus="no" state="shaded" style="normal_unfocused"/><!-- todo -->
+ <frame focus="yes" state="maximized_and_shaded" style="maximized_focused"/><!-- todo -->
+ <frame focus="no" state="maximized_and_shaded" style="maximized_unfocused"/><!-- todo -->
+</frame_style_set>
+
+<frame_style_set name="utility">
+ <frame focus="yes" state="normal" resize="both" style="utility_focused"/>
+ <frame focus="no" state="normal" resize="both" style="utility_unfocused"/>
+ <frame focus="yes" state="maximized" style="maximized_focused"/>
+ <frame focus="no" state="maximized" style="normal_focused"/>
+ <frame focus="yes" state="shaded" style="normal_focused"/><!-- todo -->
+ <frame focus="no" state="shaded" style="normal_unfocused"/><!-- todo -->
+ <frame focus="yes" state="maximized_and_shaded" style="maximized_focused"/><!-- todo -->
+ <frame focus="no" state="maximized_and_shaded" style="maximized_unfocused"/><!-- todo -->
+</frame_style_set>
+
+<frame_style_set name="border">
+ <frame focus="yes" state="normal" resize="both" style="border"/>
+ <frame focus="no" state="normal" resize="both" style="border"/>
+ <frame focus="yes" state="maximized" style="maximized_focused"/>
+ <frame focus="no" state="maximized" style="normal_focused"/>
+ <frame focus="yes" state="shaded" style="normal_focused"/><!-- todo -->
+ <frame focus="no" state="shaded" style="normal_unfocused"/><!-- todo -->
+ <frame focus="yes" state="maximized_and_shaded" style="maximized_focused"/><!-- todo -->
+ <frame focus="no" state="maximized_and_shaded" style="maximized_unfocused"/><!-- todo -->
+</frame_style_set>
+
+<!-- window -->
+<window type="normal" style_set="normal"/>
+<window type="dialog" style_set="utility"/>
+<window type="modal_dialog" style_set="utility"/>
+<window type="menu" style_set="utility"/>
+<window type="utility" style_set="utility"/>
+<window type="border" style_set="border"/>
+
+</metacity_theme>
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize.png
new file mode 100644
index 00000000..c15844e3
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_focused_normal.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_focused_normal.png
new file mode 100644
index 00000000..c15844e3
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_focused_normal.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_focused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_focused_prelight.png
new file mode 100644
index 00000000..96c0492a
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_focused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_focused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_focused_pressed.png
new file mode 100644
index 00000000..c8b69ee2
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_focused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused.png
new file mode 100644
index 00000000..a1f34902
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused_over.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused_over.png
new file mode 100644
index 00000000..ab03287b
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused_over.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused_prelight.png
new file mode 100644
index 00000000..96c0492a
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused_pressed.png
new file mode 100644
index 00000000..c8b69ee2
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/minimize_unfocused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/trough_left.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/trough_left.png
new file mode 100644
index 00000000..0c462416
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/trough_left.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/trough_middle.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/trough_middle.png
new file mode 100644
index 00000000..bbb3a0c4
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/trough_middle.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/trough_right.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/trough_right.png
new file mode 100644
index 00000000..90bca45b
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/trough_right.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize.png
new file mode 100644
index 00000000..44170155
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_focused_normal.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_focused_normal.png
new file mode 100644
index 00000000..44170155
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_focused_normal.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_focused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_focused_prelight.png
new file mode 100644
index 00000000..2d79bf56
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_focused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_focused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_focused_pressed.png
new file mode 100644
index 00000000..dff681fc
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_focused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused.png
new file mode 100644
index 00000000..f2c85846
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused_over.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused_over.png
new file mode 100644
index 00000000..a5c7093a
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused_over.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused_prelight.png
new file mode 100644
index 00000000..2d79bf56
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused_pressed.png
new file mode 100644
index 00000000..dff681fc
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/metacity-1/unmaximize_unfocused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close.png
new file mode 100644
index 00000000..72e3b9cb
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_focused_normal.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_focused_normal.png
new file mode 100644
index 00000000..72e3b9cb
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_focused_normal.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_focused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_focused_prelight.png
new file mode 100644
index 00000000..5768c54c
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_focused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_focused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_focused_pressed.png
new file mode 100644
index 00000000..590a7c31
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_focused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_unfocused.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_unfocused.png
new file mode 100644
index 00000000..03eb5a69
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_unfocused.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_unfocused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_unfocused_prelight.png
new file mode 100644
index 00000000..6e5ec3d9
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_unfocused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_unfocused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_unfocused_pressed.png
new file mode 100644
index 00000000..d8c52f10
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/close_unfocused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize.png
new file mode 100644
index 00000000..ae1d896b
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_focused_normal.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_focused_normal.png
new file mode 100644
index 00000000..ae1d896b
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_focused_normal.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_focused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_focused_prelight.png
new file mode 100644
index 00000000..af33732b
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_focused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_focused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_focused_pressed.png
new file mode 100644
index 00000000..4e07a0cb
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_focused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_unfocused.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_unfocused.png
new file mode 100644
index 00000000..7a67f2fe
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_unfocused.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_unfocused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_unfocused_prelight.png
new file mode 100644
index 00000000..3601d729
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_unfocused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_unfocused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_unfocused_pressed.png
new file mode 100644
index 00000000..c70e49bb
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/maximize_unfocused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize.png
new file mode 100644
index 00000000..c5d7d21c
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_focused_normal.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_focused_normal.png
new file mode 100644
index 00000000..c5d7d21c
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_focused_normal.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_focused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_focused_prelight.png
new file mode 100644
index 00000000..6aa77c07
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_focused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_focused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_focused_pressed.png
new file mode 100644
index 00000000..13b1b064
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_focused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_unfocused.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_unfocused.png
new file mode 100644
index 00000000..ab9cfa82
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_unfocused.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_unfocused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_unfocused_prelight.png
new file mode 100644
index 00000000..6aa77c07
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_unfocused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_unfocused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_unfocused_pressed.png
new file mode 100644
index 00000000..13b1b064
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/minimize_unfocused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize.png
new file mode 100644
index 00000000..45e915ef
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_focused_normal.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_focused_normal.png
new file mode 100644
index 00000000..45e915ef
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_focused_normal.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_focused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_focused_prelight.png
new file mode 100644
index 00000000..8c9d888f
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_focused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_focused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_focused_pressed.png
new file mode 100644
index 00000000..240b9249
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_focused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_unfocused.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_unfocused.png
new file mode 100644
index 00000000..d06a8452
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_unfocused.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_unfocused_prelight.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_unfocused_prelight.png
new file mode 100644
index 00000000..8c9d888f
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_unfocused_prelight.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_unfocused_pressed.png b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_unfocused_pressed.png
new file mode 100644
index 00000000..240b9249
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/data/usr/share/themes/Ambiance/unity/unmaximize_unfocused_pressed.png
Binary files differ
diff --git a/core/modules/ldm-gtk-greeter/module.build b/core/modules/ldm-gtk-greeter/module.build
new file mode 100644
index 00000000..27e5a592
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/module.build
@@ -0,0 +1,34 @@
+#tool/distro specific functions for fetching, building and installing dependencies
+
+fetch_source () {
+ download_untar "$URL" "src/"
+}
+
+build () {
+ cd "src/$VERSION"
+ pinfo "Running configure"
+ ./configure --prefix="/" --datarootdir="/usr/share" || perror "failed."
+ pinfo "Running make"
+ make || perror "failed."
+ pinfo "Running make install"
+ DESTDIR="${MODULE_BUILD_DIR}" make install || perror "failed."
+
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+
+ cd -
+}
+
+post_copy() {
+ gdk-pixbuf-query-loaders > "${TARGET_BUILD_DIR}/usr/lib/${ARCH_TRIPLET}/gdk-pixbuf-2.0/2.10.0/loaders.cache" || perror "pixbuf-query-loaders failed."
+ mkdir -p "${TARGET_BUILD_DIR}/etc/pango" || perror "Making etc/pango failed."
+ pango-querymodules > "${TARGET_BUILD_DIR}/etc/pango/pango.modules" || perror "pango-querymodules failed."
+ gtk-update-icon-cache-3.0 "${TARGET_BUILD_DIR}/usr/share/icons/hicolor/" || perror "update-icon-cache-3.0 failed."
+ update-mime-database "${TARGET_BUILD_DIR}/usr/share/mime" || perror "update-mime-database failed."
+ mkdir -p "${TARGET_BUILD_DIR}/var/lib"
+ cp -r "/var/lib/polkit-1" "${TARGET_BUILD_DIR}/var/lib/" || perror "Copying -r /var/lib/polkit-1 to '${TARGET_BUILD_DIR}/var/lib/' failed."
+}
+
diff --git a/core/modules/ldm-gtk-greeter/module.conf b/core/modules/ldm-gtk-greeter/module.conf
new file mode 100644
index 00000000..e9349002
--- /dev/null
+++ b/core/modules/ldm-gtk-greeter/module.conf
@@ -0,0 +1,9 @@
+VERSION=lightdm-gtk-greeter-1.3.1
+URL=https://launchpad.net/lightdm-gtk-greeter/1.4/1.3.1/+download/lightdm-gtk-greeter-1.3.1.tar.gz
+REQUIRED_INSTALLED_PACKAGES="gtk+-3.0 liblightdm-gobject-1-dev libgdk-pixbuf2.0-0 libpango1.0-0 librsvg2-common shared-mime-info gnome-themes-standard"
+REQUIRED_CONTENT_PACKAGES="libgdk-pixbuf2.0-0 libpango1.0-0 librsvg2-common shared-mime-info gnome-themes-standard"
+REQUIRED_BINARIES="lightdm-gtk-greeter"
+REQUIRED_DIRECTORIES="/usr/lib /usr/share/lightdm-gtk-greeter /usr/share/mime /usr/share/xgreeters /usr/share/icons /usr/share/themes /etc /usr/bin"
+REQUIRED_FILES="/etc/lightdm/lightdm-gtk-greeter.conf"
+REQUIRED_MODULES="ldm"
+
diff --git a/core/modules/ldm/TODO b/core/modules/ldm/TODO
new file mode 100644
index 00000000..6203c18f
--- /dev/null
+++ b/core/modules/ldm/TODO
@@ -0,0 +1 @@
+update to new config scheme
diff --git a/core/modules/ldm/data/etc/systemd/system/graphical.target.wants/lightdm.service b/core/modules/ldm/data/etc/systemd/system/graphical.target.wants/lightdm.service
new file mode 120000
index 00000000..c7aaa65a
--- /dev/null
+++ b/core/modules/ldm/data/etc/systemd/system/graphical.target.wants/lightdm.service
@@ -0,0 +1 @@
+../lightdm.service \ No newline at end of file
diff --git a/core/modules/ldm/data/etc/systemd/system/lightdm.service b/core/modules/ldm/data/etc/systemd/system/lightdm.service
new file mode 100644
index 00000000..99911bff
--- /dev/null
+++ b/core/modules/ldm/data/etc/systemd/system/lightdm.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=LightDM Display Manager
+Requires=dev-tty7.device
+After=dev-tty7.device systemd-user-sessions.service
+
+[Service]
+ExecStart=/sbin/lightdm
+
+[Install]
+WantedBy=graphical.target
diff --git a/core/modules/ldm/module.build b/core/modules/ldm/module.build
new file mode 100644
index 00000000..e88f0b08
--- /dev/null
+++ b/core/modules/ldm/module.build
@@ -0,0 +1,34 @@
+#tool/distro specific functions for fetching, building and installing dependencies
+
+fetch_source () {
+ download_untar "$URL" "src/"
+}
+
+build () {
+ cd "src/$VERSION"
+ pinfo "Running configure"
+ ./configure --prefix="/" --datarootdir="/usr/share" || perror "failed."
+ pinfo "Running make"
+ make || perror "failed."
+ pinfo "Running make install"
+ DESTDIR="${MODULE_BUILD_DIR}" make install || perror "failed."
+
+ COPYLIST="list_dpkg_output"
+
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+
+ cd -
+}
+
+post_copy() {
+ mkdir -p "${TARGET_BUILD_DIR}/var/lib/lightdm"
+ touch "${TARGET_BUILD_DIR}/var/lib/lightdm/.Xauthority" || perror "Cannot touch '${TARGET_BUILD_DIR}/var/lib/lightdm/.Xauthority'"
+ local LDMUID=$(add_user "lightdm")
+ local LDMGID=$(add_group "lightdm")
+ pinfo "lightdm user and group is $LDMUID $LDMGID"
+ chown -R "${LDMUID}:${LDMGID}" "${TARGET_BUILD_DIR}/var/lib/lightdm/" || perror "chowning '${TARGET_BUILD_DIR}/var/lib/lightdm/' failed."
+}
+
diff --git a/core/modules/ldm/module.conf b/core/modules/ldm/module.conf
new file mode 100644
index 00000000..74ab9450
--- /dev/null
+++ b/core/modules/ldm/module.conf
@@ -0,0 +1,8 @@
+VERSION=lightdm-1.4.0
+URL=https://launchpad.net/lightdm/1.4/1.4.0/+download/lightdm-1.4.0.tar.gz
+REQUIRED_INSTALLED_PACKAGES="libpam-dev itstool liblightdm-gobject-1-dev"
+REQUIRED_CONTENT_PACKAGES=""
+REQUIRED_BINARIES="dm-tool lightdm lightdm-set-defaults gdmflexiserver lightdm-guest-session-wrapper lightdm-set-defaults"
+REQUIRED_DIRECTORIES="/etc /lib"
+REQUIRED_FILES=""
+
diff --git a/core/modules/ncp/module.build b/core/modules/ncp/module.build
new file mode 100644
index 00000000..d8250512
--- /dev/null
+++ b/core/modules/ncp/module.build
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+fetch_source() {
+
+ # Distribution switch: Ubuntu 14.04 dropped packages ncpfs and libncp:
+ if [[ "$SYS_DISTRIBUTION" == "ubuntu" && "$SYS_VERSION" == "14.04" ]]; then
+ for file in $REQUIRED_DOWNLOAD_URLS; do
+ local package="$(basename $file)"
+ pinfo "Downloading and installing package $package ..."
+ download_if_empty "$file" "src/$package"
+ dpkg -i "src/$package" || perror "Could not install package $package."
+ done
+ fi
+}
+
+build() {
+ local COPYLIST="$MODULE_BUILD_DIR/list_packet_files"
+ # TODO: Hack for SUSE: Ignore file (/var/lib/nfs/state) that does not exist :(
+ list_packet_files | grep -v '/var/lib/nfs/state' | sort -u > "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST")" "${MODULE_BUILD_DIR}"
+
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/ncp/module.conf b/core/modules/ncp/module.conf
new file mode 100644
index 00000000..4ed03cdc
--- /dev/null
+++ b/core/modules/ncp/module.conf
@@ -0,0 +1,8 @@
+REQUIRED_BINARIES="
+"
+REQUIRED_LIBRARIES="
+"
+REQUIRED_DIRECTORIES="
+"
+REQUIRED_SYSTEM_FILES="
+"
diff --git a/core/modules/ncp/module.conf.debian b/core/modules/ncp/module.conf.debian
new file mode 100644
index 00000000..fad69af5
--- /dev/null
+++ b/core/modules/ncp/module.conf.debian
@@ -0,0 +1,26 @@
+REQUIRED_INSTALLED_PACKAGES="
+ ncpfs
+ libncp
+"
+REQUIRED_CONTENT_PACKAGES="
+ ncpfs
+ libncp
+"
+REQUIRED_BINARIES+="
+ nwmsg
+ ncpmount
+ ncpumount
+ mount.ncp
+ mount.ncpfs
+"
+REQUIRED_DIRECTORIES+="
+ /usr
+"
+
+# For Debian 8: Both packages were dropped from official repos. Do not change the
+# order, as these packages will be installed via dpkg and depend on each other.
+REQUIRED_DOWNLOAD_URLS="
+ ftp.acc.umu.se/mirror/cdimage/snapshot/Debian/pool/main/n/ncpfs/libpam-ncp_2.2.6-9_amd64.deb
+ ftp.acc.umu.se/mirror/cdimage/snapshot/Debian/pool/main/n/ncpfs/libncp_2.2.6-9_amd64.deb
+ ftp.acc.umu.se/mirror/cdimage/snapshot/Debian/pool/main/n/ncpfs/ncpfs_2.2.6-9_amd64.deb
+"
diff --git a/core/modules/ncp/module.conf.ubuntu b/core/modules/ncp/module.conf.ubuntu
new file mode 100644
index 00000000..c1914103
--- /dev/null
+++ b/core/modules/ncp/module.conf.ubuntu
@@ -0,0 +1,17 @@
+REQUIRED_INSTALLED_PACKAGES="
+ ncpfs
+"
+REQUIRED_CONTENT_PACKAGES="
+ libncp
+ ncpfs
+"
+REQUIRED_BINARIES+="
+ nwmsg
+ ncpmount
+ ncpumount
+ mount.ncp
+ mount.ncpfs
+"
+REQUIRED_DIRECTORIES+="
+ /usr
+"
diff --git a/core/modules/ncp/module.conf.ubuntu.14 b/core/modules/ncp/module.conf.ubuntu.14
new file mode 100644
index 00000000..acb2f629
--- /dev/null
+++ b/core/modules/ncp/module.conf.ubuntu.14
@@ -0,0 +1,24 @@
+REQUIRED_INSTALLED_PACKAGES="
+"
+REQUIRED_CONTENT_PACKAGES="
+ libncp
+ ncpfs
+"
+REQUIRED_BINARIES+="
+ nwmsg
+ ncpmount
+ ncpumount
+ mount.ncp
+ mount.ncpfs
+"
+REQUIRED_DIRECTORIES+="
+ /usr
+"
+
+# For Ubuntu 14.04: Both packages were dropped from official repos. Do not change the
+# order, as these packages will be installed via dpkg and depend on each other.
+REQUIRED_DOWNLOAD_URLS="
+ de.archive.ubuntu.com/ubuntu/pool/universe/n/ncpfs/libncp_2.2.6-9ubuntu1_amd64.deb
+ de.archive.ubuntu.com/ubuntu/pool/universe/n/ncpfs/libpam-ncp_2.2.6-9ubuntu1_amd64.deb
+ de.archive.ubuntu.com/ubuntu/pool/universe/n/ncpfs/ncpfs_2.2.6-9ubuntu1_amd64.deb
+"
diff --git a/core/modules/netpoint-lightdm/data/etc/lightdm/lightdm.conf b/core/modules/netpoint-lightdm/data/etc/lightdm/lightdm.conf
new file mode 100644
index 00000000..3e78eb50
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/etc/lightdm/lightdm.conf
@@ -0,0 +1,164 @@
+#
+# General configuration
+#
+# start-default-seat = True to always start one seat if none are defined in the configuration
+# greeter-user = User to run greeter as
+# minimum-display-number = Minimum display number to use for X servers
+# minimum-vt = First VT to run displays on
+# lock-memory = True to prevent memory from being paged to disk
+# user-authority-in-system-dir = True if session authority should be in the system location
+# guest-account-script = Script to be run to setup guest account
+# logind-check-graphical = True to on start seats that are marked as graphical by logind
+# log-directory = Directory to log information to
+# run-directory = Directory to put running state in
+# cache-directory = Directory to cache to
+# sessions-directory = Directory to find sessions
+# remote-sessions-directory = Directory to find remote sessions
+# greeters-directory = Directory to find greeters
+#
+[LightDM]
+#start-default-seat=true
+#greeter-user=lightdm
+#minimum-display-number=0
+minimum-vt=1
+#lock-memory=true
+#user-authority-in-system-dir=false
+guest-account-script=/usr/local/bin/guest-account
+#logind-check-graphical=false
+#log-directory=/var/log/lightdm
+run-directory=/run/lightdm
+#cache-directory=/var/cache/lightdm
+#sessions-directory=/usr/share/lightdm/sessions:/usr/share/xsessions
+#remote-sessions-directory=/usr/share/lightdm/remote-sessions
+
+greeters-directory=/usr/local/share/xgreeters:/usr/share/lightdm/greeters:/usr/share/xgreeters
+
+#
+# Seat defaults
+#
+# type = Seat type (xlocal, xremote)
+# pam-service = PAM service to use for login
+# pam-autologin-service = PAM service to use for autologin
+# pam-greeter-service = PAM service to use for greeters
+# xserver-command = X server command to run (can also contain arguments e.g. X -special-option)
+# xserver-layout = Layout to pass to X server
+# xserver-config = Config file to pass to X server
+# xserver-allow-tcp = True if TCP/IP connections are allowed to this X server
+# xserver-share = True if the X server is shared for both greeter and session
+# xserver-hostname = Hostname of X server (only for type=xremote)
+# xserver-display-number = Display number of X server (only for type=xremote)
+# xdmcp-manager = XDMCP manager to connect to (implies xserver-allow-tcp=true)
+# xdmcp-port = XDMCP UDP/IP port to communicate on
+# xdmcp-key = Authentication key to use for XDM-AUTHENTICATION-1 (stored in keys.conf)
+# unity-compositor-command = Unity compositor command to run (can also contain arguments e.g. unity-system-compositor -special-option)
+# unity-compositor-timeout = Number of seconds to wait for compositor to start
+# greeter-session = example-greeter
+# greeter-hide-users = True to hide the user list
+# greeter-allow-guest = True if the greeter should show a guest login option
+# greeter-show-manual-login = True if the greeter should offer a manual login option
+# greeter-show-remote-login = True if the greeter should offer a remote login option
+# user-session = Session to load for users
+# allow-user-switching = True if allowed to switch users
+# allow-guest = True if guest login is allowed
+# guest-session = Session to load for guests (overrides user-session)
+# session-wrapper = Wrapper script to run session with
+# greeter-wrapper = Wrapper script to run greeter with
+# guest-wrapper = Wrapper script to run guest sessions with
+# display-setup-script = Script to run when starting a greeter session (runs as root)
+# display-stopped-script = Script to run after stopping the display server (runs as root)
+# greeter-setup-script = Script to run when starting a greeter (runs as root)
+# session-setup-script = Script to run when starting a user session (runs as root)
+# session-cleanup-script = Script to run when quitting a user session (runs as root)
+# autologin-guest = True to log in as guest by default
+# autologin-user = User to log in with by default (overrides autologin-guest)
+# autologin-user-timeout = Number of seconds to wait before loading default user
+# autologin-session = Session to load for automatic login (overrides user-session)
+# autologin-in-background = True if autologin session should not be immediately activated
+# exit-on-failure = True if the daemon should exit if this seat fails
+#
+[SeatDefaults]
+#type=xlocal
+#pam-service=lightdm
+#pam-autologin-service=lightdm-autologin
+#pam-greeter-service=lightdm-greeter
+#xserver-command=X
+#xserver-layout=
+#xserver-config=
+#xserver-allow-tcp=false
+#xserver-share=true
+#xserver-hostname=
+#xserver-display-number=
+#xdmcp-manager=
+#xdmcp-port=177
+#xdmcp-key=
+#unity-compositor-command=unity-system-compositor
+#unity-compositor-timeout=60
+
+greeter-session=netpoint
+
+greeter-hide-users=false
+greeter-allow-guest=true
+#greeter-show-manual-login=false
+#greeter-show-remote-login=true
+#user-session=default
+#allow-user-switching=true
+allow-guest=true
+
+guest-session=/usr/bin/icewm
+
+# Keine Ahnung session-wrapper=/etc/lightdm/Xsession
+
+#greeter-wrapper=
+guest-wrapper=/usr/local/bin/guest-session
+#display-setup-script=
+#display-stopped-script=
+#greeter-setup-script=
+session-setup-script=/usr/local/bin/guest-setup
+session-cleanup-script=/usr/local/bin/guest-cleanup
+#autologin-guest=true
+#autologin-user=
+#autologin-user-timeout=0
+#autologin-in-background=false
+#autologin-session=UNIMPLEMENTED
+#exit-on-failure=false
+
+#
+# Seat configuration
+#
+# Each seat must start with "Seat:".
+# Uses settings from [SeatDefaults], any of these can be overriden by setting them in this section.
+#
+#[Seat:0]
+
+#
+# XDMCP Server configuration
+#
+# enabled = True if XDMCP connections should be allowed
+# port = UDP/IP port to listen for connections on
+# key = Authentication key to use for XDM-AUTHENTICATION-1 or blank to not use authentication (stored in keys.conf)
+#
+# The authentication key is a 56 bit DES key specified in hex as 0xnnnnnnnnnnnnnn. Alternatively
+# it can be a word and the first 7 characters are used as the key.
+#
+[XDMCPServer]
+#enabled=false
+#port=177
+#key=
+
+#
+# VNC Server configuration
+#
+# enabled = True if VNC connections should be allowed
+# command = Command to run Xvnc server with
+# port = TCP/IP port to listen for connections on
+# width = Width of display to use
+# height = Height of display to use
+# depth = Color depth of display to use
+#
+[VNCServer]
+#enabled=false
+#command=Xvnc
+#port=5900
+#width=1024
+#height=768
+#depth=8
diff --git a/core/modules/netpoint-lightdm/data/etc/sysconfig/displaymanager b/core/modules/netpoint-lightdm/data/etc/sysconfig/displaymanager
new file mode 100644
index 00000000..9a64a124
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/etc/sysconfig/displaymanager
@@ -0,0 +1,113 @@
+## Path: Desktop/Display manager
+## Type: string(Xorg)
+## Default: "Xorg"
+#
+DISPLAYMANAGER_XSERVER="Xorg"
+## Path: Desktop/Display manager
+## Description: settings to generate a proper displaymanager config
+
+## Type: string(kdm,xdm,gdm,wdm,entrance,console,lightdm,sddm)
+## Default: ""
+#
+# Here you can set the default Display manager (kdm/xdm/gdm/wdm/entrance/console).
+# all changes in this file require a restart of the displaymanager
+#
+# DISPLAYMANAGER="kdm"
+DISPLAYMANAGER="lightdm"
+
+## Type: yesno
+## Default: no
+#
+# Allow remote access (XDMCP) to your display manager (xdm/kdm/gdm). Please note
+# that a modified kdm or xdm configuration, e.g. by KDE control center
+# will not be changed. For gdm, values will be updated after change.
+# XDMCP service should run only on trusted networks and you have to disable
+# firewall for interfaces, where you want to provide this service.
+#
+DISPLAYMANAGER_REMOTE_ACCESS="no"
+
+## Type: yesno
+## Default: no
+#
+# Allow remote access of the user root to your display manager. Note
+# that root can never login if DISPLAYMANAGER_SHUTDOWN is "auto" and
+# System/Security/Permissions/PERMISSION_SECURITY is "paranoid"
+#
+DISPLAYMANAGER_ROOT_LOGIN_REMOTE="no"
+
+## Type: yesno
+## Default: yes
+#
+# Let the displaymanager start a local Xserver.
+# Set to "no" for remote-access only.
+# Set to "no" on architectures without any Xserver (e.g. s390/s390x).
+#
+DISPLAYMANAGER_STARTS_XSERVER="yes"
+
+## Type: yesno
+## Default: no
+#
+# TCP port 6000 of Xserver. When set to "no" (default) Xserver is
+# started with "-nolisten tcp". Only set this to "yes" if you really
+# need to. Remote X service should run only on trusted networks and
+# you have to disable firewall for interfaces, where you want to
+# provide this service. Use ssh X11 port forwarding whenever possible.
+#
+DISPLAYMANAGER_XSERVER_TCP_PORT_6000_OPEN="no"
+
+## Type: string
+## Default:
+#
+# Define the user whom should get logged in without request. If string
+# is empty, display standard login dialog.
+#
+DISPLAYMANAGER_AUTOLOGIN=""
+
+## Type: yesno
+## Default: no
+#
+# Allow all users to login without password, but ask for the user, if
+# DISPLAYMANAGER_AUTOLOGIN is empty.
+#
+DISPLAYMANAGER_PASSWORD_LESS_LOGIN="no"
+
+## Type: yesno
+## Default: no
+#
+# Display a combobox for Active Directory domains.
+#
+DISPLAYMANAGER_AD_INTEGRATION="no"
+
+## Type: list(root,all,none,auto)
+## Default: auto
+#
+# Determine who will be able to shutdown or reboot the system in kdm. Valid
+# values are: "root" (only root can shutdown), "all" (everybody can shutdown),
+# "none" (nobody can shutdown from displaymanager), "auto" (follow
+# System/Security/Permissions/PERMISSION_SECURITY to decide: "easy local" is
+# equal to "all", everything else is equal to "root"). gdm respects the
+# PolicyKit settings for ConsoleKit. Shutdown configuration can be done via
+# the polkit-default-privs mechanism.
+#
+DISPLAYMANAGER_SHUTDOWN="auto"
+## Path: Desktop/Display manager
+## Description: settings to generate a proper displaymanager config
+## Config: kdm
+
+## Type: string
+## Default:
+#
+# Defines extra Server Arguments given to the kdm display manager when
+# starting a local display. Useful to override e.g. the -dpi setting.
+#
+DISPLAYMANAGER_KDM_LOCALARGS=""
+
+## Type: yesno
+## Default: yes
+#
+# Allow local access of the user root to your display manager. Note
+# that root can never login if DISPLAYMANAGER_SHUTDOWN is "auto" and
+# System/Security/Permissions/PERMISSION_SECURITY is "paranoid".
+# This settings currently works only with KDM.
+#
+DISPLAYMANAGER_ROOT_LOGIN_LOCAL="yes"
diff --git a/core/modules/netpoint-lightdm/data/etc/sysconfig/windowmanager b/core/modules/netpoint-lightdm/data/etc/sysconfig/windowmanager
new file mode 100644
index 00000000..12120320
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/etc/sysconfig/windowmanager
@@ -0,0 +1,51 @@
+## Type: string
+## Default:
+## Path: Desktop
+## Description: default mouse cursor theme
+#
+# Name of mouse cursor theme for X11. Possible themes can be found
+# in /usr/share/icons/
+#
+X_MOUSE_CURSOR="DMZ"
+## Path: Desktop/Window manager
+## Description:
+## Type: string(gnome,kde4,kde,lxde,xfce,twm,icewm)
+## Default: kde4
+## Config: profiles,kde,susewm
+#
+# Here you can set the default window manager (kde, fvwm, ...)
+# changes here require at least a re-login
+# DEFAULT_WM="kde-plasma"
+DEFAULT_WM="xfce"
+
+## Type: yesno
+## Default: yes
+#
+# install the SuSE extension for new users
+# (theme and additional functions)
+#
+INSTALL_DESKTOP_EXTENSIONS="yes"
+## Path: Desktop
+## Description: prepare global sycoca database for faster first startup
+## Type: list(yes,initial,no)
+## Default: initial
+#
+# building a global sycoca database, which can be used at first user
+# login in KDE
+#
+KDE_BUILD_GLOBAL_SYCOCA="initial"
+
+## Type: yesno
+## Default: yes
+#
+# To disable IPv6 support within KDE. It might solve large timeouts due to
+# broken servers which claim to have IPv6 support, but do not respond.
+#
+KDE_USE_IPV6="yes"
+
+## Type: yesno
+## Default: yes
+#
+# IDN support can get disabled to avoid DNS phishing for example.
+#
+KDE_USE_IDN="yes"
diff --git a/core/modules/netpoint-lightdm/data/usr/local/bin/guest-account b/core/modules/netpoint-lightdm/data/usr/local/bin/guest-account
new file mode 100644
index 00000000..3eed0efc
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/usr/local/bin/guest-account
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+echo "demo"
diff --git a/core/modules/netpoint-lightdm/data/usr/local/bin/guest-cleanup b/core/modules/netpoint-lightdm/data/usr/local/bin/guest-cleanup
new file mode 100755
index 00000000..32179cec
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/usr/local/bin/guest-cleanup
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+IPTABLES=$(/usr/bin/which iptables)
+
+"$IPTABLES" -F
+"$IPTABLES" -P INPUT ACCEPT
+"$IPTABLES" -P FORWARD ACCEPT
+"$IPTABLES" -P OUTPUT ACCEPT
diff --git a/core/modules/netpoint-lightdm/data/usr/local/bin/guest-session b/core/modules/netpoint-lightdm/data/usr/local/bin/guest-session
new file mode 100755
index 00000000..2c22a68c
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/usr/local/bin/guest-session
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+exec /usr/bin/icewm &
+# exec /usr/bin/firefox
diff --git a/core/modules/netpoint-lightdm/data/usr/local/bin/guest-setup b/core/modules/netpoint-lightdm/data/usr/local/bin/guest-setup
new file mode 100755
index 00000000..cb6791fc
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/usr/local/bin/guest-setup
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+IPTABLES=$(/usr/bin/which iptables)
+
+# reset
+"$IPTABLES" -F INPUT
+"$IPTABLES" -F FORWARD
+"$IPTABLES" -F OUTPUT
+
+if [ "x${USER}" = "xdemo" ]; then
+ # filter out the internetz
+ "$IPTABLES" -P INPUT DROP
+ "$IPTABLES" -P FORWARD DROP
+ "$IPTABLES" -P OUTPUT DROP
+
+ # block internetz
+ "$IPTABLES" -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+ "$IPTABLES" -A OUTPUT -d 132.230.0.0/16 -j ACCEPT
+ "$IPTABLES" -A OUTPUT -d 10.0.0.0/8 -j ACCEPT
+else
+ "$IPTABLES" -P INPUT ACCEPT
+ "$IPTABLES" -P FORWARD ACCEPT
+ "$IPTABLES" -P OUTPUT ACCEPT
+
+fi
diff --git a/core/modules/netpoint-lightdm/data/usr/local/bin/netpoint.py b/core/modules/netpoint-lightdm/data/usr/local/bin/netpoint.py
new file mode 100755
index 00000000..635fb03f
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/usr/local/bin/netpoint.py
@@ -0,0 +1,215 @@
+#!/usr/bin/python
+#
+# Author: Matt Fischer <matthew.fischer@canonical.com>
+# Copyright (C) 2012 Canonical, Ltd
+#
+# 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 Software
+# Foundation, either version 3 of the License, or (at your option) any later
+# version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+# license.
+#
+# This code is based on the LightDM GTK Greeter which was written by:
+# Robert Ancell <robert.ancell@canonical.com>
+
+# required packages:
+# liblightdm-gobject-1-0
+# gir1.2-lightdm-1
+# python-gobject
+# gir1.2-glib-2.0
+# gir1.2-gtk-3.0
+
+from gi.repository import GObject
+from gi.repository import GLib
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository.GdkPixbuf import InterpType
+from gi.repository import LightDM
+import sys
+
+greeter = None
+
+main = None
+split = None
+
+guest_box = None
+guest_text = None
+guest_button = None
+guest_image = None
+
+login_box = None
+login_text = None
+user_box = None
+user_text = None
+user_username = None
+pass_box = None
+pass_text = None
+pass_password = None
+
+prompt_box = None
+prompt_label = None
+prompt_entry = None
+message_label = None
+
+# This Gtk signal is called when the user hits enter after entering a
+# username/password or clicks the login button. Since we re-purposed
+# the text entry box, we have 3 possible cases to handle here.
+# 1) the user is already authenticated, if for example, they don't have
+# a password set.
+# 2) The username has been passed into LightDM and now we need to pass
+# the password
+# 3) The username has been entered, but not passed in. We pass it in
+# and start the authentication process.
+def login_cb(widget):
+ print >> sys.stderr, "login_cb"
+ if greeter.get_is_authenticated():
+ print >> sys.stderr, "user is already authenticated, starting session"
+ #start_session()
+ elif greeter.get_in_authentication():
+ print >> sys.stderr, "username was passed in already, send password to LightDM"
+ print >> sys.stderr, greeter.get_authentication_user()
+ greeter.respond(pass_password.get_text())
+ else:
+ print >> sys.stderr, "Initial entry of username, send it to LightDM"
+ greeter.authenticate(user_username.get_text())
+
+def guest_cb(widget):
+ print >> sys.stderr, "guest_cb"
+ if greeter.get_has_guest_account_hint():
+ print >> sys.stderr, "Guest accounts supported"
+ greeter.authenticate_as_guest()
+ else:
+ print >> sys.stderr, "Guest accounts not supported"
+
+
+# Gtk Signal Handlers
+handlers = {
+ "login_cb": login_cb,
+ "guest_cb": guest_cb
+}
+
+# The show_prompt callback is oddly named, but when you get this
+# callback you are supposed to send the password to LightDM next. In
+# our example, we re-purpose the prompt and ask the user for the
+# password which is then sent the next time the user hits the Login
+# button or presses enter.
+def show_prompt_cb(greeter, text, promptType):
+ print >> sys.stderr, "Prompt type: " + str(promptType)
+ print >> sys.stderr, "Text: " + str(text)
+ # if this is a password prompt, we want to hide the characters
+ if promptType == LightDM.PromptType.SECRET:
+ pass_password.set_visibility(False)
+ else:
+ pass_password.set_visibility(True)
+ greeter.respond(pass_password.get_text())
+
+
+# If LightDM sends a message back to the greeter, for example, "Login
+# failed" or "invalid password" we display it in our message box.
+def show_message_cb(text, message_type):
+ print >> sys.stderr, "In show_message"
+ print >> sys.stderr, text
+ message_label.set_text(text)
+ message_label.show()
+
+# Callback for after we send LightDM the password, this method
+# has to handle a successful login, in which case we start the session
+# or a failed login, in which case we tell the user
+def authentication_complete_cb(greeter):
+ if greeter.get_is_authenticated():
+ # For our simple example we always start Unity-2d. The LightDM
+ # API has ways to query available sessions, please see the docs.
+ if not greeter.start_session_sync("xfce"):
+ print >> sys.stderr, "Failed to start session"
+ else:
+ print >> sys.stderr, "Login failed"
+ message_label.set_text("LOGIN FAILED")
+ message_label.show()
+
+if __name__ == '__main__':
+ print >> sys.stderr, "Starting up..."
+ main_loop = GObject.MainLoop ()
+ builder = Gtk.Builder()
+ greeter = LightDM.Greeter()
+ styler = Gtk.CssProvider()
+ css = open('/usr/local/share/lightdm/netpoint.css', 'r')
+
+ css_data = css.read()
+ css.close()
+ styler.load_from_data(css_data)
+ Gtk.StyleContext.add_provider_for_screen(
+ Gdk.Screen.get_default(),
+ styler,
+ Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
+ )
+
+ # connect signal handlers to LightDM
+ greeter.connect ("authentication-complete", authentication_complete_cb)
+ greeter.connect ("show-message", show_message_cb)
+ greeter.connect ("show-prompt", show_prompt_cb)
+
+ # connect builder and widgets
+ # you probably really want to put your .UI file somewhere else
+ builder.add_from_file("/usr/local/share/lightdm/netpoint.glade")
+
+ main = builder.get_object("main")
+ split = builder.get_object("split")
+ sep = builder.get_object("sep")
+ message_label = builder.get_object("message_label")
+ print >> sys.stderr, message_label
+ guest_box = builder.get_object("guest_box")
+
+ guest_outer_box = builder.get_object("guest_outer_box")
+ guest_internal_box = builder.get_object("guest_internal_box")
+ guest_text = builder.get_object("guest_text")
+ guest_button = builder.get_object("guest_button")
+ guest_image = builder.get_object("guest_image")
+ login_image = builder.get_object("login_image")
+ #pixbuf = guest_image.get_pixbuf()
+ #pixbuf = pixbuf.scale_simple(pixbuf.get_width() * 0.7, pixbuf.get_height() * 0.7, InterpType.HYPER)
+ #guest_image.set_from_pixbuf(pixbuf)
+ #pixbuf = login_image.get_pixbuf()
+ #pixbuf = pixbuf.scale_simple(pixbuf.get_width() * 0.7, pixbuf.get_height() * 0.7, InterpType.HYPER)
+ #login_image.set_from_pixbuf(pixbuf)
+
+ login_box = builder.get_object("login_box")
+ login_text = builder.get_object("login_text")
+
+ user_box = builder.get_object("user_box")
+ user_text = builder.get_object("user_text")
+ user_username = builder.get_object("user_username")
+
+ pass_box = builder.get_object("pass_box")
+ pass_text = builder.get_object("pass_text")
+ pass_password = builder.get_object("pass_password")
+
+ # connect signals to Gtk UI
+ builder.connect_signals(handlers)
+
+ # connect to greeter
+ greeter.connect_sync()
+
+ message_label.hide()
+
+ # setup the GUI
+ main.set_decorated(True)
+ main.get_root_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.ARROW))
+ main.show()
+ guest_text.show()
+ guest_button.show()
+ login_text.show()
+ user_text.show()
+ user_username.grab_focus()
+ user_username.show()
+ pass_text.show()
+ pass_password.set_sensitive(True)
+ pass_password.set_visibility(False)
+ pass_password.show()
+
+ # fullscreen it
+ main.resize(Gdk.Screen.width(), Gdk.Screen.height())
+
+ #print >> sys.stderr, guest_box.get_height()
+ #print >> sys.stderr, guest_box.get_width()
+ main_loop.run ()
diff --git a/core/modules/netpoint-lightdm/data/usr/local/share/lightdm/ff-google-smaller.png b/core/modules/netpoint-lightdm/data/usr/local/share/lightdm/ff-google-smaller.png
new file mode 100644
index 00000000..f3b81c32
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/usr/local/share/lightdm/ff-google-smaller.png
Binary files differ
diff --git a/core/modules/netpoint-lightdm/data/usr/local/share/lightdm/ff-rz-smaller.png b/core/modules/netpoint-lightdm/data/usr/local/share/lightdm/ff-rz-smaller.png
new file mode 100644
index 00000000..f6e4703d
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/usr/local/share/lightdm/ff-rz-smaller.png
Binary files differ
diff --git a/core/modules/netpoint-lightdm/data/usr/local/share/lightdm/netpoint.css b/core/modules/netpoint-lightdm/data/usr/local/share/lightdm/netpoint.css
new file mode 100644
index 00000000..7f1f80af
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/usr/local/share/lightdm/netpoint.css
@@ -0,0 +1,16 @@
+#main {
+ background-color: white;
+}
+#sep {
+ -GtkWidget-wide-separators: 1;
+ -GtkWidget-separator-width: 5;
+ border-style: solid;
+ border-width: 2px;
+ color: grey;
+}
+#title {
+ border-top-style: solid;
+ border-bottom-style: double;
+ border-width: 3px;
+ border-color: grey;
+}
diff --git a/core/modules/netpoint-lightdm/data/usr/local/share/lightdm/netpoint.glade b/core/modules/netpoint-lightdm/data/usr/local/share/lightdm/netpoint.glade
new file mode 100644
index 00000000..e2e47416
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/usr/local/share/lightdm/netpoint.glade
@@ -0,0 +1,365 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
+<interface>
+ <requires lib="gtk+" version="3.12"/>
+ <object class="GtkWindow" id="main">
+ <property name="name">main</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="window_position">center-always</property>
+ <property name="default_width">800</property>
+ <property name="default_height">600</property>
+ <property name="decorated">False</property>
+ <property name="gravity">center</property>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="name">title</property>
+ <property name="height_request">100</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Netpoint 0.1</property>
+ <attributes>
+ <attribute name="font-desc" value="Sans Bold 18"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">False</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkSeparator" id="separator1">
+ <property name="name">sep</property>
+ <property name="width_request">10</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">False</property>
+ <property name="row_homogeneous">True</property>
+ <child>
+ <object class="GtkBox" id="guest_box">
+ <property name="name">guestbox</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">False</property>
+ <property name="vexpand">False</property>
+ <property name="orientation">vertical</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkBox" id="box4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="guest_text">
+ <property name="height_request">100</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">False</property>
+ <property name="label" translatable="yes">Uni-interner Browser</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="font-desc" value="Sans Bold 14"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">False</property>
+ <property name="vexpand">False</property>
+ <property name="label" translatable="yes">Im Gastmodus können Sie nur auf universitätsinterne Webseiten zugreifen.</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="width_chars">0</property>
+ <property name="max_width_chars">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="guest_button">
+ <property name="label" translatable="yes">Surfen als Gast</property>
+ <property name="use_action_appearance">False</property>
+ <property name="related_action"/>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <signal name="clicked" handler="guest_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="guest_image">
+ <property name="name">guest_image</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">10</property>
+ <property name="margin_right">10</property>
+ <property name="margin_top">10</property>
+ <property name="margin_bottom">10</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="pixbuf">ff-rz-smaller.png</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="row_homogeneous">True</property>
+ <child>
+ <object class="GtkBox" id="box3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkBox" id="box5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="login_text">
+ <property name="height_request">100</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">False</property>
+ <property name="label" translatable="yes">Internet Browser</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="font-desc" value="Sans Bold 14"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="login_info">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="vexpand">False</property>
+ <property name="label" translatable="yes">Melden Sie sich mit Ihrem RZ-Konto, um auch im Internet zu surfen.</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="width_chars">0</property>
+ <property name="max_width_chars">30</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="row_spacing">3</property>
+ <property name="column_spacing">3</property>
+ <child>
+ <object class="GtkEntry" id="pass_password">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="progress_pulse_step">0</property>
+ <signal name="activate" handler="login_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="pass_text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Passwort:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="user_text">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Username:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="user_username">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <signal name="activate" handler="login_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="message_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" comments="This is a placeholder string and will be replaced with a message from PAM">[message]</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="login_image">
+ <property name="name">login_image</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">10</property>
+ <property name="margin_right">10</property>
+ <property name="margin_top">10</property>
+ <property name="margin_bottom">10</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="pixbuf">ff-google-smaller.png</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/core/modules/netpoint-lightdm/data/usr/local/share/xgreeters/netpoint.desktop b/core/modules/netpoint-lightdm/data/usr/local/share/xgreeters/netpoint.desktop
new file mode 100644
index 00000000..f03cf498
--- /dev/null
+++ b/core/modules/netpoint-lightdm/data/usr/local/share/xgreeters/netpoint.desktop
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Name=Netpoint Grita
+Comment=Netpoint Grita
+Exec=/usr/local/bin/netpoint.py
+Type=Application
diff --git a/core/modules/netpoint-lightdm/module.build b/core/modules/netpoint-lightdm/module.build
new file mode 100644
index 00000000..0c891489
--- /dev/null
+++ b/core/modules/netpoint-lightdm/module.build
@@ -0,0 +1,15 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/netpoint-lightdm/module.conf b/core/modules/netpoint-lightdm/module.conf
new file mode 100644
index 00000000..0cd03752
--- /dev/null
+++ b/core/modules/netpoint-lightdm/module.conf
@@ -0,0 +1,3 @@
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/netpoint-lightdm/module.conf.opensuse.13.2 b/core/modules/netpoint-lightdm/module.conf.opensuse.13.2
new file mode 100644
index 00000000..d62f9063
--- /dev/null
+++ b/core/modules/netpoint-lightdm/module.conf.opensuse.13.2
@@ -0,0 +1,36 @@
+REQUIRED_INSTALLED_PACKAGES="
+ lightdm
+ lightdm-gtk-greeter
+ lightdm-gobject-devel
+ typelib-1_0-LightDM-1
+ liblightdm-gobject-1-0
+ python-gobject
+ icewm-lite
+ icewm-default
+ python-base
+ python-gobject2
+"
+
+REQUIRED_CONTENT_PACKAGES="
+ lightdm
+ lightdm-gtk-greeter
+ lightdm-gobject-devel
+ typelib-1_0-LightDM-1
+ liblightdm-gobject-1-0
+ python-gobject
+ icewm-lite
+ icewm-default
+ python-base
+ python-gobject2
+"
+
+REQUIRED_BINARIES+="
+ icewm
+ lightdm
+ python
+ lightdm-gtk-greeter
+"
+
+REQUIRED_DIRECTORIES+="
+ /usr/lib64/python2.7
+"
diff --git a/core/modules/nscd/data/etc/nscd.conf b/core/modules/nscd/data/etc/nscd.conf
new file mode 100644
index 00000000..8eac1354
--- /dev/null
+++ b/core/modules/nscd/data/etc/nscd.conf
@@ -0,0 +1,80 @@
+#
+# /etc/nscd.conf
+#
+# An example Name Service Cache config file. This file is needed by nscd.
+#
+# Legal entries are:
+#
+# logfile <file>
+# debug-level <level>
+# threads <initial #threads to use>
+# max-threads <maximum #threads to use>
+# server-user <user to run server as instead of root>
+# server-user is ignored if nscd is started with -S parameters
+# stat-user <user who is allowed to request statistics>
+# reload-count unlimited|<number>
+# paranoia <yes|no>
+# restart-interval <time in seconds>
+#
+# enable-cache <service> <yes|no>
+# positive-time-to-live <service> <time in seconds>
+# negative-time-to-live <service> <time in seconds>
+# suggested-size <service> <prime number>
+# check-files <service> <yes|no>
+# persistent <service> <yes|no>
+# shared <service> <yes|no>
+# max-db-size <service> <number bytes>
+# auto-propagate <service> <yes|no>
+#
+# Currently supported cache names (services): passwd, group, hosts, services
+#
+
+
+# logfile /var/log/nscd.log
+# threads 4
+# max-threads 32
+# server-user nobody
+# stat-user somebody
+ debug-level 0
+# reload-count 5
+ paranoia no
+# restart-interval 3600
+
+ enable-cache passwd no
+ positive-time-to-live passwd 600
+ negative-time-to-live passwd 20
+ suggested-size passwd 211
+ check-files passwd yes
+ persistent passwd yes
+ shared passwd yes
+ max-db-size passwd 33554432
+ auto-propagate passwd yes
+
+ enable-cache group no
+ positive-time-to-live group 3600
+ negative-time-to-live group 60
+ suggested-size group 211
+ check-files group yes
+ persistent group yes
+ shared group yes
+ max-db-size group 33554432
+ auto-propagate group yes
+
+ enable-cache hosts yes
+ positive-time-to-live hosts 1800
+ negative-time-to-live hosts 20
+ suggested-size hosts 211
+ check-files hosts yes
+ persistent hosts yes
+ shared hosts yes
+ max-db-size hosts 33554432
+
+ enable-cache services no
+ positive-time-to-live services 28800
+ negative-time-to-live services 20
+ suggested-size services 211
+ check-files services yes
+ persistent services yes
+ shared services yes
+ max-db-size services 33554432
+
diff --git a/core/modules/nscd/data/etc/systemd/system/basic.target.wants/nscd.service b/core/modules/nscd/data/etc/systemd/system/basic.target.wants/nscd.service
new file mode 120000
index 00000000..70066631
--- /dev/null
+++ b/core/modules/nscd/data/etc/systemd/system/basic.target.wants/nscd.service
@@ -0,0 +1 @@
+../nscd.service \ No newline at end of file
diff --git a/core/modules/nscd/data/etc/systemd/system/nscd.service b/core/modules/nscd/data/etc/systemd/system/nscd.service
new file mode 100644
index 00000000..730d9e9d
--- /dev/null
+++ b/core/modules/nscd/data/etc/systemd/system/nscd.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Name Service Cache Daemon
+DefaultDependencies=no
+After=sysinit.target
+Before=shutdown.target
+
+[Service]
+ExecStart=/usr/sbin/nscd -d
+ExecStop=/usr/sbin/nscd --shutdown
+Restart=always
+StandardOutput=null
+
+[Install]
+WantedBy=basic.target
+Also=nscd.socket
diff --git a/core/modules/nscd/data/etc/tmpfiles.d/nscd.conf b/core/modules/nscd/data/etc/tmpfiles.d/nscd.conf
new file mode 100644
index 00000000..ba48981d
--- /dev/null
+++ b/core/modules/nscd/data/etc/tmpfiles.d/nscd.conf
@@ -0,0 +1 @@
+d /var/run/nscd 0755 root root
diff --git a/core/modules/nscd/module.build b/core/modules/nscd/module.build
new file mode 100644
index 00000000..bd189b66
--- /dev/null
+++ b/core/modules/nscd/module.build
@@ -0,0 +1,17 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+
+ return 0
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/nscd/module.conf b/core/modules/nscd/module.conf
new file mode 100644
index 00000000..74af4cfb
--- /dev/null
+++ b/core/modules/nscd/module.conf
@@ -0,0 +1,3 @@
+REQUIRED_BINARIES="
+ nscd
+"
diff --git a/core/modules/nscd/module.conf.centos b/core/modules/nscd/module.conf.centos
new file mode 100644
index 00000000..4a61cc19
--- /dev/null
+++ b/core/modules/nscd/module.conf.centos
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nscd
+"
+REQUIRED_CONTENT_PACKAGES="
+ nscd
+"
diff --git a/core/modules/nscd/module.conf.debian b/core/modules/nscd/module.conf.debian
new file mode 100644
index 00000000..4a61cc19
--- /dev/null
+++ b/core/modules/nscd/module.conf.debian
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nscd
+"
+REQUIRED_CONTENT_PACKAGES="
+ nscd
+"
diff --git a/core/modules/nscd/module.conf.fedora b/core/modules/nscd/module.conf.fedora
new file mode 100644
index 00000000..4a61cc19
--- /dev/null
+++ b/core/modules/nscd/module.conf.fedora
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nscd
+"
+REQUIRED_CONTENT_PACKAGES="
+ nscd
+"
diff --git a/core/modules/nscd/module.conf.opensuse b/core/modules/nscd/module.conf.opensuse
new file mode 100644
index 00000000..4a61cc19
--- /dev/null
+++ b/core/modules/nscd/module.conf.opensuse
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nscd
+"
+REQUIRED_CONTENT_PACKAGES="
+ nscd
+"
diff --git a/core/modules/nscd/module.conf.ubuntu b/core/modules/nscd/module.conf.ubuntu
new file mode 100644
index 00000000..4a61cc19
--- /dev/null
+++ b/core/modules/nscd/module.conf.ubuntu
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nscd
+"
+REQUIRED_CONTENT_PACKAGES="
+ nscd
+"
diff --git a/core/modules/nslcd/module.build b/core/modules/nslcd/module.build
new file mode 100644
index 00000000..76fa2bed
--- /dev/null
+++ b/core/modules/nslcd/module.build
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+fetch_source() {
+ if [ -n "$REQUIRED_NSS_LDAPD_URL" ]; then
+ pinfo "Downloading $REQUIRED_NSS_LDAPD_URL ..."
+ download_untar "$REQUIRED_NSS_LDAPD_URL" "src/"
+ fi
+}
+
+build() {
+
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+
+ # OpenSuSE 13.1 has no 'nss-pam-ldapd'. Let's compile
+ if [ -n "$REQUIRED_NSS_LDAPD_URL" ]; then
+ cd "${MODULE_WORK_DIR}/src/$REQUIRED_NSS_LDAPD_VERSION"
+ pinfo "compiling pam-nss-ldapd for openSuse 13.1 ..."
+ ./configure || perror "openSuse 13.1 - pam-nss-ldapd: ./configure failed."
+ make DESTDIR="${MODULE_BUILD_DIR}" install || perror "openSuse 13.1 - pam-nss-ldapd: make install to ${MODULE_BUILD_DIR} failed."
+ cd "$MODULE_BUILD_DIR"
+ local NSLCD_PATH=$(find . -executable -name "nslcd") # Not in path, so we 'find' below MODULE_BUILD_DIR
+ else
+ cd "$MODULE_BUILD_DIR"
+ local NSLCD_PATH=$(which nslcd)
+ fi
+ [[ $REQUIRED_BINARIES = *nslcd* ]] && [ -z "$NSLCD_PATH" ] && perror "Could not 'which nslcd'"
+
+
+ # Build nslcd service file
+ mkdir -p "${MODULE_BUILD_DIR}/etc/systemd/system"
+ sed "s,%PATH%,${NSLCD_PATH},g" "${MODULE_DIR}/templates/nslcd-systemd.service" > "${MODULE_BUILD_DIR}/etc/systemd/system/nslcd.service" || perror "Could not fill nslcd.service template"
+
+ return 0
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/nslcd/module.conf b/core/modules/nslcd/module.conf
new file mode 100644
index 00000000..7dae2ba1
--- /dev/null
+++ b/core/modules/nslcd/module.conf
@@ -0,0 +1,6 @@
+REQUIRED_BINARIES="
+ nslcd
+"
+REQUIRED_FILES="
+ /etc/systemd/system/nslcd.service
+"
diff --git a/core/modules/nslcd/module.conf.debian b/core/modules/nslcd/module.conf.debian
new file mode 100644
index 00000000..3d83fc81
--- /dev/null
+++ b/core/modules/nslcd/module.conf.debian
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nslcd
+"
+REQUIRED_CONTENT_PACKAGES="
+ nslcd
+"
diff --git a/core/modules/nslcd/module.conf.ubuntu b/core/modules/nslcd/module.conf.ubuntu
new file mode 100644
index 00000000..3d83fc81
--- /dev/null
+++ b/core/modules/nslcd/module.conf.ubuntu
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nslcd
+"
+REQUIRED_CONTENT_PACKAGES="
+ nslcd
+"
diff --git a/core/modules/nslcd/templates/nslcd-systemd.service b/core/modules/nslcd/templates/nslcd-systemd.service
new file mode 100644
index 00000000..540e67cd
--- /dev/null
+++ b/core/modules/nslcd/templates/nslcd-systemd.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Naming services LDAP client daemon
+After=network.target
+
+[Service]
+Type=forking
+PIDFile=/var/run/nslcd/nslcd.pid
+ExecStart=%PATH%
diff --git a/core/modules/nvidia_kernel/module.build b/core/modules/nvidia_kernel/module.build
new file mode 100644
index 00000000..b091eab2
--- /dev/null
+++ b/core/modules/nvidia_kernel/module.build
@@ -0,0 +1,56 @@
+fetch_source() {
+ mkdir -p src 2>/dev/null
+ cd src || perror "Could not change into src directory."
+ download "$REQUIRED_URL"
+}
+
+build() {
+ local ROOTUPPERDIR="$MODULE_DIR/rootupper"
+
+ local NVIDIA="$MODULE_WORK_DIR/src/$REQUIRED_NVIDIA"
+ local NVIDIAEXTRACTDIR="$ROOTUPPERDIR/NVIDIA"
+
+ [ -d "$NVIDIAEXTRACTDIR" ] && rm -rf "$NVIDIAEXTRACTDIR"
+ pinfo "Unpacking NVidia archive ($NVIDIA) ..."
+ sh "$NVIDIA" --extract-only --target "$NVIDIAEXTRACTDIR" || perror "Could not extract $NVIDIA to $NVIDIAEXTRACTDIR."
+
+ pinfo "Ready to chroot - compiling may take some time."
+ pdebug "--- chroot ---------------------------------------------------------------------"
+ pdebug "- -"
+ pdebug "- Notice: This may take a while! -"
+ pdebug "- -"
+ pdebug "- Please keep note the Nvidia installer _will_ complain about -"
+ pdebug "- several warnings and errors. It will do this in any case. -"
+ pdebug "- -"
+ pdebug "- This does _not_ mean the kernel module compilation was unsuccessful! -"
+ pdebug "- -"
+ pdebug "--------------------------------------------------------------------------------"
+
+
+ chroot_run "$ROOTUPPERDIR" <<-EOF
+ /NVIDIA/nvidia-installer --no-nouveau-check --no-network --no-backup --no-rpms --no-runlevel-check --no-distro-scripts --no-cc-version-check --no-x-check --no-precompiled-interface --silent --kernel-source-path /"$KERNEL_HEADERS_DIR" # Do the work!
+ # fake success since the installer will exit with an error due to the module not loading properly.
+ exit 0
+ EOF
+ pinfo "chroot terminated."
+
+ local file
+ local RESULT
+ local NVIDIA_MODULES="$MODULE_BUILD_DIR/lib/modules/nvidia/"
+ mkdir -p "$NVIDIA_MODULES"
+ pinfo "Copying kernel modules..."
+ for file in nvidia.ko nvidia-uvm.ko nvidia-modeset.ko; do
+ RESULT=$(find "$ROOTUPPERDIR/NVIDIA/kernel" -name "$file" | head -n 1)
+ [ -z "$RESULT" ] && perror "Could not find built module $file in ./NVIDIA/kernel"
+ pinfo "Fetching ${file}..."
+ strip -g "$RESULT" || pwarning "Could not strip $file"
+ cp "$RESULT" "$NVIDIA_MODULES" || perror "Could not copy $file"
+ done
+
+ rm -rf "$MODULE_BUILD_DIR/NVIDIA"
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/nvidia_kernel/module.conf b/core/modules/nvidia_kernel/module.conf
new file mode 100644
index 00000000..d04051b9
--- /dev/null
+++ b/core/modules/nvidia_kernel/module.conf
@@ -0,0 +1,10 @@
+REQUIRED_VERSION="358.16"
+REQUIRED_NVIDIA="NVIDIA-Linux-x86_64-$REQUIRED_VERSION.run"
+REQUIRED_URL="http://download.nvidia.com/XFree86/Linux-x86_64/$REQUIRED_VERSION/$REQUIRED_NVIDIA"
+
+REQUIRED_DIRECTORIES="
+ /lib/modules/nvidia
+"
+REQUIRED_MODULES="
+ kernel
+"
diff --git a/core/modules/nvidia_libs/data/addon-init b/core/modules/nvidia_libs/data/addon-init
new file mode 100755
index 00000000..061bff6b
--- /dev/null
+++ b/core/modules/nvidia_libs/data/addon-init
@@ -0,0 +1,10 @@
+#!/bin/ash
+
+[ -e "/opt/openslx/etc/nvidia.whiteout" ] || exit 66
+
+while read line; do
+ rm -f -- "$line"
+done < "/opt/openslx/etc/nvidia.whiteout"
+
+exit 0
+
diff --git a/core/modules/nvidia_libs/module.build b/core/modules/nvidia_libs/module.build
new file mode 100644
index 00000000..7f8a9444
--- /dev/null
+++ b/core/modules/nvidia_libs/module.build
@@ -0,0 +1,56 @@
+fetch_source() {
+ mkdir -p src
+ cd src || perror "Could not change into src directory."
+ download "$REQUIRED_URL"
+}
+
+build() {
+ local KERNELSRCDIR="$MODULE_WORK_DIR/../kernel/ksrc" # kernel sources
+ local NVIDIA="$MODULE_WORK_DIR/src/$REQUIRED_NVIDIA"
+ local NVIDIAEXTRACTDIR="$MODULE_BUILD_DIR/NVIDIA"
+
+ pdebug "Unpacking NVidia-Installer ..."
+ [ -d "$NVIDIAEXTRACTDIR" ] && rm -rf "$NVIDIAEXTRACTDIR"
+ sh "$NVIDIA" --extract-only --target "$NVIDIAEXTRACTDIR" || perror "Could not extract $NVIDIA to $NVIDIAEXTRACTDIR."
+
+ pinfo "Ready to chroot - may take some time."
+ pdebug "--- chroot ---------------------------------------------------------------------"
+ pdebug "- -"
+ pdebug "- Notice: This may take a while! -"
+ pdebug "- -"
+ pdebug "- Please keep note the Nvidia installer _will_ complain about -"
+ pdebug "- several warnings and errors. It will do this in any case. -"
+ pdebug "- -"
+ pdebug "- This does _not_ mean the library module compilation was unsuccessful! -"
+ pdebug "- -"
+ pdebug "--------------------------------------------------------------------------------"
+
+ chroot_run "${MODULE_BUILD_DIR}" <<-EOF
+ /NVIDIA/nvidia-installer --no-nouveau-check --no-network --no-backup --no-rpms --no-runlevel-check --no-distro-scripts --no-cc-version-check --no-x-check --no-precompiled-interface --silent --no-kernel-module
+ EOF
+ pinfo "chroot terminated, cleaning up"
+
+ # move whiteout list to its /opt/openslx/etc/nvidia.whiteout
+ if [ -e "${MODULE_BUILD_DIR}/overlay.whiteout.list" ]; then
+ mkdir -p "${MODULE_BUILD_DIR}/opt/openslx/etc"
+ mv "${MODULE_BUILD_DIR}/overlay.whiteout.list" "${MODULE_BUILD_DIR}/opt/openslx/etc/nvidia.whiteout"
+ fi
+
+ #pdebug "Handling whiteouts ..."
+ #local WHITEOUT_LIST="${MODULE_BUILD_DIR}/opt/openslx/etc/nvidia.whiteout"
+ #rm -f -- "$WHOUTEOUT_LIST"
+ #mkdir -p "$(dirname "$WHITEOUT_LIST")" || perror "Could not create $(dirname "$WHITEOUT_LIST")"
+ #pdebug "Searching for overlayfs-whiteouts ..."
+ #for WHITEOUT in $(find "$MODULE_BUILD_DIR" -lname "(overlay-whiteout)"); do
+# pdebug "Whiteout found: $WHITEOUT"
+# echo "/./${WHITEOUT#$MODULE_BUILD_DIR}" >> "$WHITEOUT_LIST"
+# rm -f -- "$WHITEOUT" || perror "Could not delete whiteout $WHITEOUT!"
+# done
+
+ rm -rf "$MODULE_BUILD_DIR/NVIDIA"
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/nvidia_libs/module.conf b/core/modules/nvidia_libs/module.conf
new file mode 100644
index 00000000..a2f017ca
--- /dev/null
+++ b/core/modules/nvidia_libs/module.conf
@@ -0,0 +1,17 @@
+REQUIRED_VERSION="358.16"
+REQUIRED_NVIDIA="NVIDIA-Linux-x86_64-$REQUIRED_VERSION.run"
+REQUIRED_URL="http://download.nvidia.com/XFree86/Linux-x86_64/$REQUIRED_VERSION/$REQUIRED_NVIDIA"
+
+REQUIRED_FILES="
+ /etc/OpenCL/vendors/nvidia.icd
+ /usr/share/nvidia/nvidia-application-profiles-$REQUIRED_VERSION-rc
+ /usr/share/applications/nvidia-settings.desktop
+ /opt/openslx/etc/nvidia.whiteout
+"
+
+REQUIRED_DIRECTORIES="
+ /usr/bin
+ /usr/lib
+ /var/lib/nvidia
+"
+
diff --git a/core/modules/nvidia_libs/module.conf.ubuntu b/core/modules/nvidia_libs/module.conf.ubuntu
new file mode 100644
index 00000000..d9f9ee1a
--- /dev/null
+++ b/core/modules/nvidia_libs/module.conf.ubuntu
@@ -0,0 +1,14 @@
+# libvdpau: While nvidia delivers a linvdpau within it's driver package, nvidia
+# itself recommends using a distribution package if available. So, here we go.
+
+REQUIRED_CONTENT_PACKAGES="
+ libvdpau1
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ libvdpau1
+"
+REQUIRED_SYSTEM_FILES+="
+ /sbin/ldconfig.real
+"
+
diff --git a/core/modules/openbox/data/etc/xdg/openbox/menu.xml b/core/modules/openbox/data/etc/xdg/openbox/menu.xml
new file mode 100644
index 00000000..866969f6
--- /dev/null
+++ b/core/modules/openbox/data/etc/xdg/openbox/menu.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<openbox_menu xmlns="http://openbox.org/"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://openbox.org/
+ file:///usr/share/openbox/menu.xsd">
+
+<menu id="root-menu" label="Openbox 3">
+ <item label="Terminal">
+ <action name="Execute"><execute>xterm</execute></action>
+ </item>
+ <item label="VM Chooser">
+ <action name="Execute"><execute>vmchooser -c /etc/openslx/vmchooser/vmchooser.conf</execute></action>
+ </item>
+ <!-- This requires the presence of the 'menu' package to work -->
+ <menu id="/Debian" />
+ <separator />
+ <menu id="client-list-menu" />
+ <separator />
+ <item label="Restart">
+ <action name="Restart" />
+ </item>
+ <separator />
+ <item label="Exit">
+ <action name="Exit" />
+ </item>
+</menu>
+
+</openbox_menu>
diff --git a/core/modules/openbox/data/etc/xdg/openbox/rc.xml b/core/modules/openbox/data/etc/xdg/openbox/rc.xml
new file mode 100644
index 00000000..6498a7ff
--- /dev/null
+++ b/core/modules/openbox/data/etc/xdg/openbox/rc.xml
@@ -0,0 +1,756 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Do not edit this file, it will be overwritten on install.
+ Copy the file to $HOME/.config/openbox/ instead. -->
+
+<openbox_config xmlns="http://openbox.org/3.4/rc"
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+
+<resistance>
+ <strength>10</strength>
+ <screen_edge_strength>20</screen_edge_strength>
+</resistance>
+
+<focus>
+ <focusNew>yes</focusNew>
+ <!-- always try to focus new windows when they appear. other rules do
+ apply -->
+ <followMouse>no</followMouse>
+ <!-- move focus to a window when you move the mouse into it -->
+ <focusLast>yes</focusLast>
+ <!-- focus the last used window when changing desktops, instead of the one
+ under the mouse pointer. when followMouse is enabled -->
+ <underMouse>no</underMouse>
+ <!-- move focus under the mouse, even when the mouse is not moving -->
+ <focusDelay>200</focusDelay>
+ <!-- when followMouse is enabled, the mouse must be inside the window for
+ this many milliseconds (1000 = 1 sec) before moving focus to it -->
+ <raiseOnFocus>no</raiseOnFocus>
+ <!-- when followMouse is enabled, and a window is given focus by moving the
+ mouse into it, also raise the window -->
+</focus>
+
+<placement>
+ <policy>Smart</policy>
+ <!-- 'Smart' or 'UnderMouse' -->
+ <center>yes</center>
+ <!-- whether to place windows in the center of the free area found or
+ the top left corner -->
+ <monitor>Primary</monitor>
+ <!-- with Smart placement on a multi-monitor system, try to place new windows
+ on: 'Any' - any monitor, 'Mouse' - where the mouse is, 'Active' - where
+ the active window is, 'Primary' - only on the primary monitor -->
+ <primaryMonitor>1</primaryMonitor>
+ <!-- The monitor where Openbox should place popup dialogs such as the
+ focus cycling popup, or the desktop switch popup. It can be an index
+ from 1, specifying a particular monitor. Or it can be one of the
+ following: 'Mouse' - where the mouse is, or
+ 'Active' - where the active window is -->
+</placement>
+
+<theme>
+ <name>Clearlooks</name>
+ <titleLayout>NLIMC</titleLayout>
+ <!--
+ available characters are NDSLIMC, each can occur at most once.
+ N: window icon
+ L: window label (AKA title).
+ I: iconify
+ M: maximize
+ C: close
+ S: shade (roll up/down)
+ D: omnipresent (on all desktops).
+ -->
+ <keepBorder>yes</keepBorder>
+ <animateIconify>yes</animateIconify>
+ <font place="ActiveWindow">
+ <name>sans</name>
+ <size>8</size>
+ <!-- font size in points -->
+ <weight>bold</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="InactiveWindow">
+ <name>sans</name>
+ <size>8</size>
+ <!-- font size in points -->
+ <weight>bold</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="MenuHeader">
+ <name>sans</name>
+ <size>9</size>
+ <!-- font size in points -->
+ <weight>normal</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="MenuItem">
+ <name>sans</name>
+ <size>9</size>
+ <!-- font size in points -->
+ <weight>normal</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="ActiveOnScreenDisplay">
+ <name>sans</name>
+ <size>9</size>
+ <!-- font size in points -->
+ <weight>bold</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="InactiveOnScreenDisplay">
+ <name>sans</name>
+ <size>9</size>
+ <!-- font size in points -->
+ <weight>bold</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+</theme>
+
+<desktops>
+ <!-- this stuff is only used at startup, pagers allow you to change them
+ during a session
+
+ these are default values to use when other ones are not already set
+ by other applications, or saved in your session
+
+ use obconf if you want to change these without having to log out
+ and back in -->
+ <number>4</number>
+ <firstdesk>1</firstdesk>
+ <names>
+ <!-- set names up here if you want to, like this:
+ <name>desktop 1</name>
+ <name>desktop 2</name>
+ -->
+ </names>
+ <popupTime>875</popupTime>
+ <!-- The number of milliseconds to show the popup for when switching
+ desktops. Set this to 0 to disable the popup. -->
+</desktops>
+
+<resize>
+ <drawContents>yes</drawContents>
+ <popupShow>Nonpixel</popupShow>
+ <!-- 'Always', 'Never', or 'Nonpixel' (xterms and such) -->
+ <popupPosition>Center</popupPosition>
+ <!-- 'Center', 'Top', or 'Fixed' -->
+ <popupFixedPosition>
+ <!-- these are used if popupPosition is set to 'Fixed' -->
+
+ <x>10</x>
+ <!-- positive number for distance from left edge, negative number for
+ distance from right edge, or 'Center' -->
+ <y>10</y>
+ <!-- positive number for distance from top edge, negative number for
+ distance from bottom edge, or 'Center' -->
+ </popupFixedPosition>
+</resize>
+
+<!-- You can reserve a portion of your screen where windows will not cover when
+ they are maximized, or when they are initially placed.
+ Many programs reserve space automatically, but you can use this in other
+ cases. -->
+<margins>
+ <top>0</top>
+ <bottom>0</bottom>
+ <left>0</left>
+ <right>0</right>
+</margins>
+
+<dock>
+ <position>TopLeft</position>
+ <!-- (Top|Bottom)(Left|Right|)|Top|Bottom|Left|Right|Floating -->
+ <floatingX>0</floatingX>
+ <floatingY>0</floatingY>
+ <noStrut>no</noStrut>
+ <stacking>Above</stacking>
+ <!-- 'Above', 'Normal', or 'Below' -->
+ <direction>Vertical</direction>
+ <!-- 'Vertical' or 'Horizontal' -->
+ <autoHide>no</autoHide>
+ <hideDelay>300</hideDelay>
+ <!-- in milliseconds (1000 = 1 second) -->
+ <showDelay>300</showDelay>
+ <!-- in milliseconds (1000 = 1 second) -->
+ <moveButton>Middle</moveButton>
+ <!-- 'Left', 'Middle', 'Right' -->
+</dock>
+
+<keyboard>
+ <chainQuitKey>C-g</chainQuitKey>
+
+ <!-- Keybindings for desktop switching -->
+ <keybind key="C-A-Left">
+ <action name="GoToDesktop"><to>left</to><wrap>no</wrap></action>
+ </keybind>
+ <keybind key="C-A-Right">
+ <action name="GoToDesktop"><to>right</to><wrap>no</wrap></action>
+ </keybind>
+ <keybind key="C-A-Up">
+ <action name="GoToDesktop"><to>up</to><wrap>no</wrap></action>
+ </keybind>
+ <keybind key="C-A-Down">
+ <action name="GoToDesktop"><to>down</to><wrap>no</wrap></action>
+ </keybind>
+ <keybind key="S-A-Left">
+ <action name="SendToDesktop"><to>left</to><wrap>no</wrap></action>
+ </keybind>
+ <keybind key="S-A-Right">
+ <action name="SendToDesktop"><to>right</to><wrap>no</wrap></action>
+ </keybind>
+ <keybind key="S-A-Up">
+ <action name="SendToDesktop"><to>up</to><wrap>no</wrap></action>
+ </keybind>
+ <keybind key="S-A-Down">
+ <action name="SendToDesktop"><to>down</to><wrap>no</wrap></action>
+ </keybind>
+ <keybind key="W-F1">
+ <action name="GoToDesktop"><to>1</to></action>
+ </keybind>
+ <keybind key="W-F2">
+ <action name="GoToDesktop"><to>2</to></action>
+ </keybind>
+ <keybind key="W-F3">
+ <action name="GoToDesktop"><to>3</to></action>
+ </keybind>
+ <keybind key="W-F4">
+ <action name="GoToDesktop"><to>4</to></action>
+ </keybind>
+ <keybind key="W-d">
+ <action name="ToggleShowDesktop"/>
+ </keybind>
+
+ <!-- Keybindings for windows -->
+ <keybind key="A-F4">
+ <action name="Close"/>
+ </keybind>
+ <keybind key="A-Escape">
+ <action name="Lower"/>
+ <action name="FocusToBottom"/>
+ <action name="Unfocus"/>
+ </keybind>
+ <keybind key="A-space">
+ <action name="ShowMenu"><menu>client-menu</menu></action>
+ </keybind>
+ <!-- Take a screenshot of the current window with gnome-screenshot when Alt+Print are pressed -->
+ <keybind key="A-Print">
+ <action name="Execute"><command>gnome-screenshot -w</command></action>
+ </keybind>
+
+ <!-- Keybindings for window switching -->
+ <keybind key="A-Tab">
+ <action name="NextWindow">
+ <finalactions>
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </finalactions>
+ </action>
+ </keybind>
+ <keybind key="A-S-Tab">
+ <action name="PreviousWindow">
+ <finalactions>
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </finalactions>
+ </action>
+ </keybind>
+ <keybind key="C-A-Tab">
+ <action name="NextWindow">
+ <panels>yes</panels><desktop>yes</desktop>
+ <finalactions>
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </finalactions>
+ </action>
+ </keybind>
+
+ <!-- Keybindings for window switching with the arrow keys -->
+ <keybind key="W-S-Right">
+ <action name="DirectionalCycleWindows">
+ <direction>right</direction>
+ </action>
+ </keybind>
+ <keybind key="W-S-Left">
+ <action name="DirectionalCycleWindows">
+ <direction>left</direction>
+ </action>
+ </keybind>
+ <keybind key="W-S-Up">
+ <action name="DirectionalCycleWindows">
+ <direction>up</direction>
+ </action>
+ </keybind>
+ <keybind key="W-S-Down">
+ <action name="DirectionalCycleWindows">
+ <direction>down</direction>
+ </action>
+ </keybind>
+
+ <!-- Keybindings for running applications -->
+ <keybind key="W-e">
+ <action name="Execute">
+ <startupnotify>
+ <enabled>true</enabled>
+ <name>Konqueror</name>
+ </startupnotify>
+ <command>kfmclient openProfile filemanagement</command>
+ </action>
+ </keybind>
+ <!-- Launch gnome-screenshot when Print is pressed -->
+ <keybind key="Print">
+ <action name="Execute"><command>gnome-screenshot</command></action>
+ </keybind>
+</keyboard>
+
+<mouse>
+ <dragThreshold>1</dragThreshold>
+ <!-- number of pixels the mouse must move before a drag begins -->
+ <doubleClickTime>500</doubleClickTime>
+ <!-- in milliseconds (1000 = 1 second) -->
+ <screenEdgeWarpTime>400</screenEdgeWarpTime>
+ <!-- Time before changing desktops when the pointer touches the edge of the
+ screen while moving a window, in milliseconds (1000 = 1 second).
+ Set this to 0 to disable warping -->
+ <screenEdgeWarpMouse>false</screenEdgeWarpMouse>
+ <!-- Set this to TRUE to move the mouse pointer across the desktop when
+ switching due to hitting the edge of the screen -->
+
+ <context name="Frame">
+ <mousebind button="A-Left" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ </mousebind>
+ <mousebind button="A-Left" action="Click">
+ <action name="Unshade"/>
+ </mousebind>
+ <mousebind button="A-Left" action="Drag">
+ <action name="Move"/>
+ </mousebind>
+
+ <mousebind button="A-Right" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </mousebind>
+ <mousebind button="A-Right" action="Drag">
+ <action name="Resize"/>
+ </mousebind>
+
+ <mousebind button="A-Middle" action="Press">
+ <action name="Lower"/>
+ <action name="FocusToBottom"/>
+ <action name="Unfocus"/>
+ </mousebind>
+
+ <mousebind button="A-Up" action="Click">
+ <action name="GoToDesktop"><to>previous</to></action>
+ </mousebind>
+ <mousebind button="A-Down" action="Click">
+ <action name="GoToDesktop"><to>next</to></action>
+ </mousebind>
+ <mousebind button="C-A-Up" action="Click">
+ <action name="GoToDesktop"><to>previous</to></action>
+ </mousebind>
+ <mousebind button="C-A-Down" action="Click">
+ <action name="GoToDesktop"><to>next</to></action>
+ </mousebind>
+ <mousebind button="A-S-Up" action="Click">
+ <action name="SendToDesktop"><to>previous</to></action>
+ </mousebind>
+ <mousebind button="A-S-Down" action="Click">
+ <action name="SendToDesktop"><to>next</to></action>
+ </mousebind>
+ </context>
+
+ <context name="Titlebar">
+ <mousebind button="Left" action="Drag">
+ <action name="Move"/>
+ </mousebind>
+ <mousebind button="Left" action="DoubleClick">
+ <action name="ToggleMaximize"/>
+ </mousebind>
+
+ <mousebind button="Up" action="Click">
+ <action name="if">
+ <shaded>no</shaded>
+ <then>
+ <action name="Shade"/>
+ <action name="FocusToBottom"/>
+ <action name="Unfocus"/>
+ <action name="Lower"/>
+ </then>
+ </action>
+ </mousebind>
+ <mousebind button="Down" action="Click">
+ <action name="if">
+ <shaded>yes</shaded>
+ <then>
+ <action name="Unshade"/>
+ <action name="Raise"/>
+ </then>
+ </action>
+ </mousebind>
+ </context>
+
+ <context name="Titlebar Top Right Bottom Left TLCorner TRCorner BRCorner BLCorner">
+ <mousebind button="Left" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </mousebind>
+
+ <mousebind button="Middle" action="Press">
+ <action name="Lower"/>
+ <action name="FocusToBottom"/>
+ <action name="Unfocus"/>
+ </mousebind>
+
+ <mousebind button="Right" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="ShowMenu"><menu>client-menu</menu></action>
+ </mousebind>
+ </context>
+
+ <context name="Top">
+ <mousebind button="Left" action="Drag">
+ <action name="Resize"><edge>top</edge></action>
+ </mousebind>
+ </context>
+
+ <context name="Left">
+ <mousebind button="Left" action="Drag">
+ <action name="Resize"><edge>left</edge></action>
+ </mousebind>
+ </context>
+
+ <context name="Right">
+ <mousebind button="Left" action="Drag">
+ <action name="Resize"><edge>right</edge></action>
+ </mousebind>
+ </context>
+
+ <context name="Bottom">
+ <mousebind button="Left" action="Drag">
+ <action name="Resize"><edge>bottom</edge></action>
+ </mousebind>
+
+ <mousebind button="Right" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="ShowMenu"><menu>client-menu</menu></action>
+ </mousebind>
+ </context>
+
+ <context name="TRCorner BRCorner TLCorner BLCorner">
+ <mousebind button="Left" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </mousebind>
+ <mousebind button="Left" action="Drag">
+ <action name="Resize"/>
+ </mousebind>
+ </context>
+
+ <context name="Client">
+ <mousebind button="Left" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ </mousebind>
+ <mousebind button="Middle" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ </mousebind>
+ <mousebind button="Right" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ </mousebind>
+ </context>
+
+ <context name="Icon">
+ <mousebind button="Left" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ <action name="ShowMenu"><menu>client-menu</menu></action>
+ </mousebind>
+ <mousebind button="Right" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="ShowMenu"><menu>client-menu</menu></action>
+ </mousebind>
+ </context>
+
+ <context name="AllDesktops">
+ <mousebind button="Left" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </mousebind>
+ <mousebind button="Left" action="Click">
+ <action name="ToggleOmnipresent"/>
+ </mousebind>
+ </context>
+
+ <context name="Shade">
+ <mousebind button="Left" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ </mousebind>
+ <mousebind button="Left" action="Click">
+ <action name="ToggleShade"/>
+ </mousebind>
+ </context>
+
+ <context name="Iconify">
+ <mousebind button="Left" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ </mousebind>
+ <mousebind button="Left" action="Click">
+ <action name="Iconify"/>
+ </mousebind>
+ </context>
+
+ <context name="Maximize">
+ <mousebind button="Left" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </mousebind>
+ <mousebind button="Middle" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </mousebind>
+ <mousebind button="Right" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </mousebind>
+ <mousebind button="Left" action="Click">
+ <action name="ToggleMaximize"/>
+ </mousebind>
+ <mousebind button="Middle" action="Click">
+ <action name="ToggleMaximize"><direction>vertical</direction></action>
+ </mousebind>
+ <mousebind button="Right" action="Click">
+ <action name="ToggleMaximize"><direction>horizontal</direction></action>
+ </mousebind>
+ </context>
+
+ <context name="Close">
+ <mousebind button="Left" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </mousebind>
+ <mousebind button="Left" action="Click">
+ <action name="Close"/>
+ </mousebind>
+ </context>
+
+ <context name="Desktop">
+ <mousebind button="Up" action="Click">
+ <action name="GoToDesktop"><to>previous</to></action>
+ </mousebind>
+ <mousebind button="Down" action="Click">
+ <action name="GoToDesktop"><to>next</to></action>
+ </mousebind>
+
+ <mousebind button="A-Up" action="Click">
+ <action name="GoToDesktop"><to>previous</to></action>
+ </mousebind>
+ <mousebind button="A-Down" action="Click">
+ <action name="GoToDesktop"><to>next</to></action>
+ </mousebind>
+ <mousebind button="C-A-Up" action="Click">
+ <action name="GoToDesktop"><to>previous</to></action>
+ </mousebind>
+ <mousebind button="C-A-Down" action="Click">
+ <action name="GoToDesktop"><to>next</to></action>
+ </mousebind>
+
+ <mousebind button="Left" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ </mousebind>
+ <mousebind button="Right" action="Press">
+ <action name="Focus"/>
+ <action name="Raise"/>
+ </mousebind>
+ </context>
+
+ <context name="Root">
+ <!-- Menus -->
+ <mousebind button="Middle" action="Press">
+ <action name="ShowMenu"><menu>client-list-combined-menu</menu></action>
+ </mousebind>
+ <mousebind button="Right" action="Press">
+ <action name="ShowMenu"><menu>root-menu</menu></action>
+ </mousebind>
+ </context>
+
+ <context name="MoveResize">
+ <mousebind button="Up" action="Click">
+ <action name="GoToDesktop"><to>previous</to></action>
+ </mousebind>
+ <mousebind button="Down" action="Click">
+ <action name="GoToDesktop"><to>next</to></action>
+ </mousebind>
+ <mousebind button="A-Up" action="Click">
+ <action name="GoToDesktop"><to>previous</to></action>
+ </mousebind>
+ <mousebind button="A-Down" action="Click">
+ <action name="GoToDesktop"><to>next</to></action>
+ </mousebind>
+ </context>
+</mouse>
+
+<menu>
+ <!-- You can specify more than one menu file in here and they are all loaded,
+ just don't make menu ids clash or, well, it'll be kind of pointless -->
+
+ <!-- default menu file (or custom one in $HOME/.config/openbox/) -->
+ <!-- system menu files on Debian systems -->
+ <file>/var/lib/openbox/debian-menu.xml</file>
+ <file>menu.xml</file>
+ <hideDelay>200</hideDelay>
+ <!-- if a press-release lasts longer than this setting (in milliseconds), the
+ menu is hidden again -->
+ <middle>no</middle>
+ <!-- center submenus vertically about the parent entry -->
+ <submenuShowDelay>100</submenuShowDelay>
+ <!-- time to delay before showing a submenu after hovering over the parent
+ entry.
+ if this is a negative value, then the delay is infinite and the
+ submenu will not be shown until it is clicked on -->
+ <submenuHideDelay>400</submenuHideDelay>
+ <!-- time to delay before hiding a submenu when selecting another
+ entry in parent menu
+ if this is a negative value, then the delay is infinite and the
+ submenu will not be hidden until a different submenu is opened -->
+ <showIcons>yes</showIcons>
+ <!-- controls if icons appear in the client-list-(combined-)menu -->
+ <manageDesktops>yes</manageDesktops>
+ <!-- show the manage desktops section in the client-list-(combined-)menu -->
+</menu>
+
+<applications>
+<!--
+ # this is an example with comments through out. use these to make your
+ # own rules, but without the comments of course.
+ # you may use one or more of the name/class/role/title/type rules to specify
+ # windows to match
+
+ <application name="the window's _OB_APP_NAME property (see obxprop)"
+ class="the window's _OB_APP_CLASS property (see obxprop)"
+ groupname="the window's _OB_APP_GROUP_NAME property (see obxprop)"
+ groupclass="the window's _OB_APP_GROUP_CLASS property (see obxprop)"
+ role="the window's _OB_APP_ROLE property (see obxprop)"
+ title="the window's _OB_APP_TITLE property (see obxprop)"
+ type="the window's _OB_APP_TYPE property (see obxprob)..
+ (if unspecified, then it is 'dialog' for child windows)">
+ # you may set only one of name/class/role/title/type, or you may use more
+ # than one together to restrict your matches.
+
+ # the name, class, role, and title use simple wildcard matching such as those
+ # used by a shell. you can use * to match any characters and ? to match
+ # any single character.
+
+ # the type is one of: normal, dialog, splash, utility, menu, toolbar, dock,
+ # or desktop
+
+ # when multiple rules match a window, they will all be applied, in the
+ # order that they appear in this list
+
+
+ # each rule element can be left out or set to 'default' to specify to not
+ # change that attribute of the window
+
+ <decor>yes</decor>
+ # enable or disable window decorations
+
+ <shade>no</shade>
+ # make the window shaded when it appears, or not
+
+ <position force="no">
+ # the position is only used if both an x and y coordinate are provided
+ # (and not set to 'default')
+ # when force is "yes", then the window will be placed here even if it
+ # says you want it placed elsewhere. this is to override buggy
+ # applications who refuse to behave
+ <x>center</x>
+ # a number like 50, or 'center' to center on screen. use a negative number
+ # to start from the right (or bottom for <y>), ie -50 is 50 pixels from
+ # the right edge (or bottom). use 'default' to specify using value
+ # provided by the application, or chosen by openbox, instead.
+ <y>200</y>
+ <monitor>1</monitor>
+ # specifies the monitor in a xinerama setup.
+ # 1 is the first head, or 'mouse' for wherever the mouse is
+ </position>
+
+ <size>
+ # the size to make the window.
+ <width>20</width>
+ # a number like 20, or 'default' to use the size given by the application.
+ # you can use fractions such as 1/2 or percentages such as 75% in which
+ # case the value is relative to the size of the monitor that the window
+ # appears on.
+ <height>30%</height>
+ </size>
+
+ <focus>yes</focus>
+ # if the window should try be given focus when it appears. if this is set
+ # to yes it doesn't guarantee the window will be given focus. some
+ # restrictions may apply, but Openbox will try to
+
+ <desktop>1</desktop>
+ # 1 is the first desktop, 'all' for all desktops
+
+ <layer>normal</layer>
+ # 'above', 'normal', or 'below'
+
+ <iconic>no</iconic>
+ # make the window iconified when it appears, or not
+
+ <skip_pager>no</skip_pager>
+ # asks to not be shown in pagers
+
+ <skip_taskbar>no</skip_taskbar>
+ # asks to not be shown in taskbars. window cycling actions will also
+ # skip past such windows
+
+ <fullscreen>yes</fullscreen>
+ # make the window in fullscreen mode when it appears
+
+ <maximized>true</maximized>
+ # 'Horizontal', 'Vertical' or boolean (yes/no)
+ </application>
+
+ # end of the example
+-->
+<application role="browser">
+<maximized>yes</maximized>
+</application>
+</applications>
+
+</openbox_config>
diff --git a/core/modules/openbox/data/etc/xdg/openbox/rc.xml.safe b/core/modules/openbox/data/etc/xdg/openbox/rc.xml.safe
new file mode 100644
index 00000000..fb392461
--- /dev/null
+++ b/core/modules/openbox/data/etc/xdg/openbox/rc.xml.safe
@@ -0,0 +1,426 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Do not edit this file, it will be overwritten on install.
+ Copy the file to $HOME/.config/openbox/ instead. -->
+
+<openbox_config xmlns="http://openbox.org/3.4/rc"
+ xmlns:xi="http://www.w3.org/2001/XInclude">
+
+<resistance>
+ <strength>10</strength>
+ <screen_edge_strength>20</screen_edge_strength>
+</resistance>
+
+<focus>
+ <focusNew>yes</focusNew>
+ <!-- always try to focus new windows when they appear. other rules do
+ apply -->
+ <followMouse>no</followMouse>
+ <!-- move focus to a window when you move the mouse into it -->
+ <focusLast>yes</focusLast>
+ <!-- focus the last used window when changing desktops, instead of the one
+ under the mouse pointer. when followMouse is enabled -->
+ <underMouse>no</underMouse>
+ <!-- move focus under the mouse, even when the mouse is not moving -->
+ <focusDelay>200</focusDelay>
+ <!-- when followMouse is enabled, the mouse must be inside the window for
+ this many milliseconds (1000 = 1 sec) before moving focus to it -->
+ <raiseOnFocus>no</raiseOnFocus>
+ <!-- when followMouse is enabled, and a window is given focus by moving the
+ mouse into it, also raise the window -->
+</focus>
+
+<placement>
+ <policy>Smart</policy>
+ <!-- 'Smart' or 'UnderMouse' -->
+ <center>yes</center>
+ <!-- whether to place windows in the center of the free area found or
+ the top left corner -->
+ <monitor>Primary</monitor>
+ <!-- with Smart placement on a multi-monitor system, try to place new windows
+ on: 'Any' - any monitor, 'Mouse' - where the mouse is, 'Active' - where
+ the active window is, 'Primary' - only on the primary monitor -->
+ <primaryMonitor>1</primaryMonitor>
+ <!-- The monitor where Openbox should place popup dialogs such as the
+ focus cycling popup, or the desktop switch popup. It can be an index
+ from 1, specifying a particular monitor. Or it can be one of the
+ following: 'Mouse' - where the mouse is, or
+ 'Active' - where the active window is -->
+</placement>
+
+<theme>
+ <name>Clearlooks</name>
+ <titleLayout>NLIMC</titleLayout>
+ <!--
+ available characters are NDSLIMC, each can occur at most once.
+ N: window icon
+ L: window label (AKA title).
+ I: iconify
+ M: maximize
+ C: close
+ S: shade (roll up/down)
+ D: omnipresent (on all desktops).
+ -->
+ <keepBorder>yes</keepBorder>
+ <animateIconify>yes</animateIconify>
+ <font place="ActiveWindow">
+ <name>sans</name>
+ <size>8</size>
+ <!-- font size in points -->
+ <weight>bold</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="InactiveWindow">
+ <name>sans</name>
+ <size>8</size>
+ <!-- font size in points -->
+ <weight>bold</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="MenuHeader">
+ <name>sans</name>
+ <size>9</size>
+ <!-- font size in points -->
+ <weight>normal</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="MenuItem">
+ <name>sans</name>
+ <size>9</size>
+ <!-- font size in points -->
+ <weight>normal</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="ActiveOnScreenDisplay">
+ <name>sans</name>
+ <size>9</size>
+ <!-- font size in points -->
+ <weight>bold</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+ <font place="InactiveOnScreenDisplay">
+ <name>sans</name>
+ <size>9</size>
+ <!-- font size in points -->
+ <weight>bold</weight>
+ <!-- 'bold' or 'normal' -->
+ <slant>normal</slant>
+ <!-- 'italic' or 'normal' -->
+ </font>
+</theme>
+
+<desktops>
+ <!-- this stuff is only used at startup, pagers allow you to change them
+ during a session
+
+ these are default values to use when other ones are not already set
+ by other applications, or saved in your session
+
+ use obconf if you want to change these without having to log out
+ and back in -->
+ <number>1</number>
+ <firstdesk>1</firstdesk>
+ <names>
+ <!-- set names up here if you want to, like this:
+ <name>desktop 1</name>
+ <name>desktop 2</name>
+ -->
+ </names>
+ <popupTime>875</popupTime>
+ <!-- The number of milliseconds to show the popup for when switching
+ desktops. Set this to 0 to disable the popup. -->
+</desktops>
+
+<resize>
+ <drawContents>yes</drawContents>
+ <popupShow>Nonpixel</popupShow>
+ <!-- 'Always', 'Never', or 'Nonpixel' (xterms and such) -->
+ <popupPosition>Center</popupPosition>
+ <!-- 'Center', 'Top', or 'Fixed' -->
+ <popupFixedPosition>
+ <!-- these are used if popupPosition is set to 'Fixed' -->
+
+ <x>10</x>
+ <!-- positive number for distance from left edge, negative number for
+ distance from right edge, or 'Center' -->
+ <y>10</y>
+ <!-- positive number for distance from top edge, negative number for
+ distance from bottom edge, or 'Center' -->
+ </popupFixedPosition>
+</resize>
+
+<!-- You can reserve a portion of your screen where windows will not cover when
+ they are maximized, or when they are initially placed.
+ Many programs reserve space automatically, but you can use this in other
+ cases. -->
+<margins>
+ <top>0</top>
+ <bottom>0</bottom>
+ <left>0</left>
+ <right>0</right>
+</margins>
+
+<dock>
+ <position>TopLeft</position>
+ <!-- (Top|Bottom)(Left|Right|)|Top|Bottom|Left|Right|Floating -->
+ <floatingX>0</floatingX>
+ <floatingY>0</floatingY>
+ <noStrut>no</noStrut>
+ <stacking>Above</stacking>
+ <!-- 'Above', 'Normal', or 'Below' -->
+ <direction>Vertical</direction>
+ <!-- 'Vertical' or 'Horizontal' -->
+ <autoHide>no</autoHide>
+ <hideDelay>300</hideDelay>
+ <!-- in milliseconds (1000 = 1 second) -->
+ <showDelay>300</showDelay>
+ <!-- in milliseconds (1000 = 1 second) -->
+ <moveButton>Middle</moveButton>
+ <!-- 'Left', 'Middle', 'Right' -->
+</dock>
+
+<keyboard>
+ <chainQuitKey>C-g</chainQuitKey>
+ <!-- Take a screenshot of the current window with gnome-screenshot when Alt+Print are pressed -->
+ <!-- Keybindings for window switching -->
+ <keybind key="A-Tab">
+ <action name="NextWindow">
+ <finalactions>
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </finalactions>
+ </action>
+ </keybind>
+ <keybind key="A-S-Tab">
+ <action name="PreviousWindow">
+ <finalactions>
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </finalactions>
+ </action>
+ </keybind>
+ <keybind key="C-A-Tab">
+ <action name="NextWindow">
+ <panels>yes</panels><desktop>yes</desktop>
+ <finalactions>
+ <action name="Focus"/>
+ <action name="Raise"/>
+ <action name="Unshade"/>
+ </finalactions>
+ </action>
+ </keybind>
+
+ <!-- Keybindings for running applications -->
+</keyboard>
+
+<mouse>
+ <dragThreshold>1</dragThreshold>
+ <!-- number of pixels the mouse must move before a drag begins -->
+ <doubleClickTime>500</doubleClickTime>
+ <!-- in milliseconds (1000 = 1 second) -->
+ <screenEdgeWarpTime>400</screenEdgeWarpTime>
+ <!-- Time before changing desktops when the pointer touches the edge of the
+ screen while moving a window, in milliseconds (1000 = 1 second).
+ Set this to 0 to disable warping -->
+ <screenEdgeWarpMouse>false</screenEdgeWarpMouse>
+ <!-- Set this to TRUE to move the mouse pointer across the desktop when
+ switching due to hitting the edge of the screen -->
+
+ <context name="Frame">
+ </context>
+
+ <context name="Titlebar">
+ </context>
+
+ <context name="Titlebar Top Right Bottom Left TLCorner TRCorner BRCorner BLCorner">
+ </context>
+
+ <context name="Top">
+ </context>
+
+ <context name="Left">
+ </context>
+
+ <context name="Right">
+ </context>
+
+ <context name="Bottom">
+ </context>
+
+ <context name="TRCorner BRCorner TLCorner BLCorner">
+ </context>
+
+ <context name="Client">
+ </context>
+
+ <context name="Icon">
+ </context>
+
+ <context name="AllDesktops">
+ </context>
+
+ <context name="Shade">
+ </context>
+
+ <context name="Iconify">
+ </context>
+
+ <context name="Maximize">
+ </context>
+
+ <context name="Close">
+ </context>
+
+ <context name="Desktop">
+ </context>
+
+ <context name="Root">
+ </context>
+
+ <context name="MoveResize">
+ </context>
+</mouse>
+
+<menu>
+ <!-- You can specify more than one menu file in here and they are all loaded,
+ just don't make menu ids clash or, well, it'll be kind of pointless -->
+
+ <!-- default menu file (or custom one in $HOME/.config/openbox/) -->
+ <!-- system menu files on Debian systems -->
+ <file>/var/lib/openbox/debian-menu.xml</file>
+ <file>menu.xml</file>
+ <hideDelay>200</hideDelay>
+ <!-- if a press-release lasts longer than this setting (in milliseconds), the
+ menu is hidden again -->
+ <middle>no</middle>
+ <!-- center submenus vertically about the parent entry -->
+ <submenuShowDelay>100</submenuShowDelay>
+ <!-- time to delay before showing a submenu after hovering over the parent
+ entry.
+ if this is a negative value, then the delay is infinite and the
+ submenu will not be shown until it is clicked on -->
+ <submenuHideDelay>400</submenuHideDelay>
+ <!-- time to delay before hiding a submenu when selecting another
+ entry in parent menu
+ if this is a negative value, then the delay is infinite and the
+ submenu will not be hidden until a different submenu is opened -->
+ <showIcons>yes</showIcons>
+ <!-- controls if icons appear in the client-list-(combined-)menu -->
+ <manageDesktops>yes</manageDesktops>
+ <!-- show the manage desktops section in the client-list-(combined-)menu -->
+</menu>
+
+<applications>
+<!--
+ # this is an example with comments through out. use these to make your
+ # own rules, but without the comments of course.
+ # you may use one or more of the name/class/role/title/type rules to specify
+ # windows to match
+
+ <application name="the window's _OB_APP_NAME property (see obxprop)"
+ class="the window's _OB_APP_CLASS property (see obxprop)"
+ groupname="the window's _OB_APP_GROUP_NAME property (see obxprop)"
+ groupclass="the window's _OB_APP_GROUP_CLASS property (see obxprop)"
+ role="the window's _OB_APP_ROLE property (see obxprop)"
+ title="the window's _OB_APP_TITLE property (see obxprop)"
+ type="the window's _OB_APP_TYPE property (see obxprob)..
+ (if unspecified, then it is 'dialog' for child windows)">
+ # you may set only one of name/class/role/title/type, or you may use more
+ # than one together to restrict your matches.
+
+ # the name, class, role, and title use simple wildcard matching such as those
+ # used by a shell. you can use * to match any characters and ? to match
+ # any single character.
+
+ # the type is one of: normal, dialog, splash, utility, menu, toolbar, dock,
+ # or desktop
+
+ # when multiple rules match a window, they will all be applied, in the
+ # order that they appear in this list
+
+
+ # each rule element can be left out or set to 'default' to specify to not
+ # change that attribute of the window
+
+ <decor>yes</decor>
+ # enable or disable window decorations
+
+ <shade>no</shade>
+ # make the window shaded when it appears, or not
+
+ <position force="no">
+ # the position is only used if both an x and y coordinate are provided
+ # (and not set to 'default')
+ # when force is "yes", then the window will be placed here even if it
+ # says you want it placed elsewhere. this is to override buggy
+ # applications who refuse to behave
+ <x>center</x>
+ # a number like 50, or 'center' to center on screen. use a negative number
+ # to start from the right (or bottom for <y>), ie -50 is 50 pixels from
+ # the right edge (or bottom). use 'default' to specify using value
+ # provided by the application, or chosen by openbox, instead.
+ <y>200</y>
+ <monitor>1</monitor>
+ # specifies the monitor in a xinerama setup.
+ # 1 is the first head, or 'mouse' for wherever the mouse is
+ </position>
+
+ <size>
+ # the size to make the window.
+ <width>20</width>
+ # a number like 20, or 'default' to use the size given by the application.
+ # you can use fractions such as 1/2 or percentages such as 75% in which
+ # case the value is relative to the size of the monitor that the window
+ # appears on.
+ <height>30%</height>
+ </size>
+
+ <focus>yes</focus>
+ # if the window should try be given focus when it appears. if this is set
+ # to yes it doesn't guarantee the window will be given focus. some
+ # restrictions may apply, but Openbox will try to
+
+ <desktop>1</desktop>
+ # 1 is the first desktop, 'all' for all desktops
+
+ <layer>normal</layer>
+ # 'above', 'normal', or 'below'
+
+ <iconic>no</iconic>
+ # make the window iconified when it appears, or not
+
+ <skip_pager>no</skip_pager>
+ # asks to not be shown in pagers
+
+ <skip_taskbar>no</skip_taskbar>
+ # asks to not be shown in taskbars. window cycling actions will also
+ # skip past such windows
+
+ <fullscreen>yes</fullscreen>
+ # make the window in fullscreen mode when it appears
+
+ <maximized>true</maximized>
+ # 'Horizontal', 'Vertical' or boolean (yes/no)
+ </application>
+
+ # end of the example
+-->
+<application role="browser">
+<maximized>yes</maximized>
+<decor>no</decor>
+</application>
+</applications>
+
+</openbox_config>
diff --git a/core/modules/openbox/data/usr/share/icons/hicolor/48x48/apps/openbox.png b/core/modules/openbox/data/usr/share/icons/hicolor/48x48/apps/openbox.png
new file mode 100644
index 00000000..70d1f074
--- /dev/null
+++ b/core/modules/openbox/data/usr/share/icons/hicolor/48x48/apps/openbox.png
Binary files differ
diff --git a/core/modules/openbox/data/usr/share/xsessions/openbox.desktop b/core/modules/openbox/data/usr/share/xsessions/openbox.desktop
new file mode 100644
index 00000000..359d4f7e
--- /dev/null
+++ b/core/modules/openbox/data/usr/share/xsessions/openbox.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Linux 4: Openbox
+Comment=Log in using the Openbox window manager (without a session manager)
+Comment[pt_BR]=Use esta sessãpara executar o Openbox como o seu ambiente de trabalho
+Exec=/usr/bin/openbox --startup /usr/bin/xterm
+TryExec=/usr/bin/openbox
+Icon=/usr/share/icons/hicolor/48x48/apps/openbox.png
+Type=XSession
diff --git a/core/modules/openbox/module.build b/core/modules/openbox/module.build
new file mode 100644
index 00000000..0cd6aaad
--- /dev/null
+++ b/core/modules/openbox/module.build
@@ -0,0 +1,36 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ # FIXME: Hack: openSUSE's rpm -ql lilsts non-existant pango.modules, which makes
+ # tarcopy fail. We probably can't fix that, so remove it using grep....
+ tarcopy "$(cat "$COPYLIST" | grep -v 'pango\.modules$' | sort -u)" "${MODULE_BUILD_DIR}"
+
+ return 0
+}
+
+post_copy() {
+ [ ! -d "$TARGET_BUILD_DIR/etc/pango" ] && mkdir -p "$TARGET_BUILD_DIR/etc/pango"
+
+ # little Workaround, as under e.g. 64bit Suse the binary is called
+ # pango-querymodules-64, not pango-querymodules.
+ which pango-querymodules 2>/dev/null 1>&2
+ ERR=$?
+ if [[ "$ERR" -eq 0 ]]; then
+ PANGO_QUERYMODULES_ARCH=pango-querymodules
+ else
+ which pango-querymodules-64 2>/dev/null 1>&2
+ ERR=$?
+ if [[ "$ERR" -eq 0 ]]; then
+ PANGO_QUERYMODULES_ARCH=pango-querymodules-64
+ else
+ perror "Could not find either pango-querymodules or pango-querymodules-64!"
+ fi
+ fi
+ $PANGO_QUERYMODULES_ARCH > "$TARGET_BUILD_DIR/etc/pango/pango.modules"
+}
diff --git a/core/modules/openbox/module.conf b/core/modules/openbox/module.conf
new file mode 100644
index 00000000..8a816b97
--- /dev/null
+++ b/core/modules/openbox/module.conf
@@ -0,0 +1,11 @@
+REQUIRED_BINARIES="
+ openbox
+ openbox-session
+"
+REQUIRED_FILES="
+ /usr/share/xsessions/openbox.desktop
+"
+REQUIRED_DIRECTORIES="
+ /etc
+ /usr/share/themes/Clearlooks
+"
diff --git a/core/modules/openbox/module.conf.debian b/core/modules/openbox/module.conf.debian
new file mode 100644
index 00000000..b10bd40d
--- /dev/null
+++ b/core/modules/openbox/module.conf.debian
@@ -0,0 +1,15 @@
+REQUIRED_INSTALLED_PACKAGES="
+ openbox
+ libpango1.0-0
+ libpango1.0-dev
+ libdbus-1-dev
+"
+REQUIRED_CONTENT_PACKAGES="
+ openbox
+ libpango1.0-0
+ libpango1.0-dev
+ libdbus-1-dev
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib
+"
diff --git a/core/modules/openbox/module.conf.fedora b/core/modules/openbox/module.conf.fedora
new file mode 100644
index 00000000..f919f3b3
--- /dev/null
+++ b/core/modules/openbox/module.conf.fedora
@@ -0,0 +1,11 @@
+REQUIRED_INSTALLED_PACKAGES="
+ openbox
+ pango
+"
+REQUIRED_CONTENT_PACKAGES="
+ openbox
+ pango
+"
+REQUIRED_DIRECTORIES+="
+ /usr/$LIB64
+"
diff --git a/core/modules/openbox/module.conf.opensuse b/core/modules/openbox/module.conf.opensuse
new file mode 100644
index 00000000..c06a89b2
--- /dev/null
+++ b/core/modules/openbox/module.conf.opensuse
@@ -0,0 +1,13 @@
+REQUIRED_INSTALLED_PACKAGES="
+ openbox
+ libpango-1_0-0
+ pango-tools
+"
+REQUIRED_CONTENT_PACKAGES="
+ openbox
+ libpango-1_0-0
+ pango-tools
+"
+REQUIRED_DIRECTORIES+="
+ /usr/$LIB64
+"
diff --git a/core/modules/openbox/module.conf.ubuntu b/core/modules/openbox/module.conf.ubuntu
new file mode 100644
index 00000000..b10bd40d
--- /dev/null
+++ b/core/modules/openbox/module.conf.ubuntu
@@ -0,0 +1,15 @@
+REQUIRED_INSTALLED_PACKAGES="
+ openbox
+ libpango1.0-0
+ libpango1.0-dev
+ libdbus-1-dev
+"
+REQUIRED_CONTENT_PACKAGES="
+ openbox
+ libpango1.0-0
+ libpango1.0-dev
+ libdbus-1-dev
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib
+"
diff --git a/core/modules/openbox/module.conf.zypper b/core/modules/openbox/module.conf.zypper
new file mode 100644
index 00000000..1d0b68c5
--- /dev/null
+++ b/core/modules/openbox/module.conf.zypper
@@ -0,0 +1,11 @@
+REQUIRED_INSTALLED_PACKAGES=" openbox
+ libpango-1_0-0"
+REQUIRED_CONTENT_PACKAGES=" openbox
+ libpango-1_0-0"
+REQUIRED_BINARIES=" openbox
+ openbox-session"
+REQUIRED_FILES=" /usr/share/xsessions/openbox.desktop"
+REQUIRED_DIRECTORIES=" /etc
+ /usr/$LIB64
+ /usr/share/themes/Clearlooks"
+
diff --git a/core/modules/openstack/README b/core/modules/openstack/README
new file mode 100644
index 00000000..ce373f20
--- /dev/null
+++ b/core/modules/openstack/README
@@ -0,0 +1,25 @@
+Hier die Installationsschritte für 14.04:
+
+apt-get install -y neutron-common neutron-plugin-ml2 neutron-plugin-openvswitch-agent nova-compute-kvm python-guestfs python-mysqldb
+
+* System konfigurieren:
+dpkg-statoverride --update --add root root 0644 /boot/vmlinuz-$(uname -r)
+
+add to: /etc/sysctl.conf
+net.ipv4.conf.all.rp_filter=0
+net.ipv4.conf.default.rp_filter=0
+
+sysctl -p
+
+ovs-vsctl add-br br-int
+
+Configs:
+/etc/nova/api-paste.ini
+/etc/nova/nova.conf
+/etc/nova/nova-compute.conf
+
+/etc/neutron/api-paste.ini
+/etc/neutron/neutron.conf
+/etc/neutron/plugin/
+
+Ich denke die configs packen wir in die config.tgz
diff --git a/core/modules/openstack/module.build b/core/modules/openstack/module.build
new file mode 100644
index 00000000..97e93235
--- /dev/null
+++ b/core/modules/openstack/module.build
@@ -0,0 +1,11 @@
+fetch_source() {
+ :
+}
+
+build() {
+ :
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/openstack/module.conf b/core/modules/openstack/module.conf
new file mode 100644
index 00000000..0cd03752
--- /dev/null
+++ b/core/modules/openstack/module.conf
@@ -0,0 +1,3 @@
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/openstack/module.conf.ubuntu.14 b/core/modules/openstack/module.conf.ubuntu.14
new file mode 100644
index 00000000..7c24b4a9
--- /dev/null
+++ b/core/modules/openstack/module.conf.ubuntu.14
@@ -0,0 +1,9 @@
+REQUIRED_INSTALLED_PACKAGES="
+ neutron-common
+ neutron-plugin-ml2
+ neutron-plugin-openvswitch-agent
+ nova-compute-kvm
+ python-guestfs
+ python-mysqldb
+"
+REQUIRED_CONTENT_PACKAGES="$REQUIRED_INSTALLED_PACKAGES"
diff --git a/core/modules/pam-common-share/data/opt/openslx/scripts/pam_script_mount_common_share b/core/modules/pam-common-share/data/opt/openslx/scripts/pam_script_mount_common_share
new file mode 100644
index 00000000..670943f4
--- /dev/null
+++ b/core/modules/pam-common-share/data/opt/openslx/scripts/pam_script_mount_common_share
@@ -0,0 +1,183 @@
+###################################################################
+#
+# This script is a part of the pam_script_auth script
+# and is not stand-alone!
+#
+# It will try to mount the common shares specified in the
+# variables of the global slx config '/opt/openslx/config'.
+# An arbitrary number of shares may be given. Every share
+# requires following bundle of variables:
+#
+#
+# SLX_SHARE_<id>_AUTH_TYPE [guest|user|pam]
+# SLX_SHARE_<id>_AUTH_USER <username>
+# SLX_SHARE_<id>_AUTH_PASS <password>
+# SLX_SHARE_<id>_PERM [ro|rw]
+# SLX_SHARE_<id>_PATH <path_to_share>
+#
+# Note: <id> is the identifier of the share.
+#
+# Example:
+# SLX_SHARE_0_PATH='//windows.server/sharename'
+# SLX_SHARE_0_AUTH_TYPE='user'
+# SLX_SHARE_0_AUTH_USER='shareuser'
+# SLX_SHARE_0_AUTH_PASS='sharepass'
+# SLX_SHARE_0_PERM='rw'
+#
+# Note: If AUTH_TYPE is set to 'pam' or 'guest', then
+# there is no need to specify AUTH_USER or AUTH_PASS
+# as it is obviously not needed.
+#
+###################################################################
+#
+# Internal helper function to mount a share
+# usage: mount_share <auth_type> <auth_user> <auth_password> <permissions> <path> <share_number>
+mount_share() {
+ # since we are (hopefully) the only one using this function, we know we need excatly 6 args
+ [ $# -ne 6 ] && { slxlog "pam-share-args" "Wrong number of arguments given! Need 6, $# given."; return; }
+
+ # lets check if we have our variables
+ local SHARE_AUTH_TYPE="$1"
+ local SHARE_AUTH_USER="$2"
+ local SHARE_AUTH_PASS="$3"
+ local SHARE_PERM="$4"
+ local SHARE_PATH="$5"
+ local SHARE_NUM="$6"
+
+ # unless specified otherwise, mount the share read-only
+ [ "x${SHARE_PERM}" != "xrw" ] && SHARE_PERM='ro'
+
+ # all good: now we can mount depending on the type
+ # supports: cifs?/nfs?
+ if [ "${SHARE_PATH:0:2}" = "//" ]; then
+ # '//' prefixed, assume windows share
+ # prepare common mount options for either authentication type
+ MOUNT_OPTS="-t cifs -o nounix,uid=${USER_UID},gid=${USER_GID},forceuid,forcegid,nobrl,noacl,$SHARE_PERM"
+
+ # now construct the mount options depending on the type of the share.
+ if [ "${SHARE_AUTH_TYPE}" = "guest" ]; then
+ MOUNT_OPTS="${MOUNT_OPTS},guest,file_mode=0777,dir_mode=0777"
+ elif [ "${SHARE_AUTH_TYPE}" = "pam" ]; then
+ export USER="${PAM_USER}"
+ export PASSWD="${PAM_AUTHTOK}"
+ MOUNT_OPTS="${MOUNT_OPTS},sec=ntlm,file_mode=0700,dir_mode=0700"
+ elif [ "${SHARE_AUTH_TYPE}" = "user" ]; then
+ # check if credentials are set
+ [ ! -z "${SHARE_AUTH_USER}" ] || \
+ { slxlog "pam-share-noauthuser" "Share${SHARE_NUM}: No variable 'SLX_SHARE_${SHARE_NUM}_AUTH_USER' found in config!"; return; }
+ # now export them to the env
+ export USER="${SHARE_AUTH_USER}"
+ export PASSWD="${SHARE_AUTH_PASS}"
+ MOUNT_OPTS="${MOUNT_OPTS},sec=ntlm,file_mode=0700,dir_mode=0700"
+ else
+ slxlog "pam-share-auth" "Share${SHARE_NUM}: Auth type '${SHARE_AUTH_TYPE}' not supported."
+ return;
+ fi
+ else
+ # for now assume NFS-Share, start build options string with default options for all shares
+ MOUNT_OPTS="-t nfs -o async,nolock"
+
+ # TODO: here we will have to evaluate options of NFS-shares
+
+ # unless specified otherwise, mount the share read-only
+ [ "x${SHARE_PERM}" != "xrw" ] && SHARE_PERM='ro'
+ MOUNT_OPTS="${MOUNT_OPTS},${SHARE_PERM}"
+ fi
+
+ ############################################################################
+ #
+ # Following code is independent of the type of share.
+ # The variable MOUNT_OPTS should have been set correctly
+ # up to this point.
+ #
+ ############################################################################
+
+ # we just mount it to the directory with the same name as the
+ # last directory in the path name of the share
+ # e.g. //windows.net/lehrpool -> ${COMMON_SHARE_MOUNT_POINT}/lehrpool
+ local TARGET_DIR="${COMMON_SHARE_MOUNT_POINT}/$(basename ${SHARE_PATH})"
+ # it exists, so let's create ${COMMON_SHARE_MOUNT_POINT}/lehrpool_${SHARE_NUM}
+ [ -d "${TARGET_DIR}" ] && TARGET_DIR="${TARGET_DIR}_${SHARE_NUM}"
+
+ # at this point is TARGET_DIR pointing to the right directory.
+ mkdir -p "${TARGET_DIR}" || \
+ { slxlog "pam-share-mkdirfail" "Share${SHARE_NUM}: Could not create directory '${TARGET_DIR}'. Skipping share."; return; }
+
+ # flag for failure
+ SIGNAL=$(mktemp)
+ rm -f -- "${SIGNAL}"
+ # output of command
+ MOUNT_OUTPUT=$(mktemp)
+ # now try to mount it
+ ( mount ${MOUNT_OPTS} "${SHARE_PATH}" "${TARGET_DIR}" > "${MOUNT_OUTPUT}" 2>&1 || touch "${SIGNAL}" ) &
+ MOUNT_PID=$!
+ for COUNTER in 1 1 2 4; do
+ kill -0 "${MOUNT_PID}" 2>/dev/null || break
+ sleep "${COUNTER}"
+ done
+
+ # check for failures
+ if [ -e "${SIGNAL}" ]; then
+ slxlog "pam-share-mount" "Mount of '${SHARE_PATH}' to '${TARGET_DIR}' failed. (Args: ${MOUNT_OPTS}" "${MOUNT_OUTPUT}"
+ rm -f -- "${SIGNAL}"
+ elif kill -9 "${MOUNT_PID}" 2>/dev/null; then
+ slxlog "pam-share-mount" "Mount of '${SHARE_PATH}' to '${TARGET_DIR}' timed out. (Args: ${MOUNT_OPTS}" "${MOUNT_OUTPUT}"
+ fi
+ ( sleep 2; rm -f -- "${MOUNT_OUTPUT}" ) &
+
+ # always unset credentials
+ unset USER
+ unset PASSWD
+}
+
+############################################################################
+#
+# MAIN LOGIC OVER ALL SHARES
+#
+############################################################################
+# at this point we need the slx config to do anything
+[ -e "/opt/openslx/config" ] || \
+ { slxlog "pam-share-noconfig" "File '/opt/openslx/config' not found."; return; }
+
+# we have it as we should, source it
+. /opt/openslx/config || \
+ { slxlog "pam-share-sourceconfig" "Could not source '/opt/openslx/config'."; return; }
+
+#
+#
+#
+# Since many shares can be specified, we need to identify how many we have first.
+# We just go over all SLX_SHARE_* variables and check for those ending in _PATH.
+# So e.g. for SLX_SHARE_0_PATH=<path> the SHARE variable would be equal to 'SLX_SHARE_0_PATH'
+# For each of those, a share was specified and we will try to mount it.
+for SHARE in $(grep -E '^SLX_SHARE_[0-9]+_PATH=.*$' /opt/openslx/config); do
+ # first let's check if we have already mounted it and skip if it is
+ # TODO: this should be good enough? stronger checks?
+ if mount | grep -q "$(echo ${SHARE} | awk -F '=' '{print $2}' | tr -d \'\")"; then
+ # already mounted, just skip
+ # this should not happen anyway, since the pam_script_auth script also exits
+ # if the temporary home user directory is already mounted...
+ continue
+ fi
+ # ok so we have the full declaration command in $SHARE,
+ # let's extract the number of the share.
+ # i.e. SLX_SHARE_0_PATH -> share number 0
+ # first just cut everything after '='
+ SHARE_ID="$(echo $SHARE | awk -F '=' '{print $1}')"
+ # now strip the leading SLX_SHARE_
+ SHARE_ID=${SHARE_ID#SLX_SHARE_}
+ # now remove the trailing _PATH
+ SHARE_ID=${SHARE_ID%_PATH}
+ # now it should be a number, TODO accept more than numbers? Doesn't really matter...
+ # this check is mostly to be sure that the variable splitting worked as it should
+ # ugly cause we need to be ash compatible ...
+ if ! echo "${SHARE_ID}" | grep -q -E '^[0-9]+$'; then
+ continue
+ fi
+
+ # now do try to mount the share using the helper function defined on the top of this script
+ eval mount_share \""\$SLX_SHARE_${SHARE_ID}_AUTH_TYPE"\" \""\$SLX_SHARE_${SHARE_ID}_AUTH_USER"\" \""\$SLX_SHARE_${SHARE_ID}_AUTH_PASS"\" \""\$SLX_SHARE_${SHARE_ID}_PERM"\" \""\$SLX_SHARE_${SHARE_ID}_PATH"\" \""$SHARE_ID"\"
+ ## unset USER and PASSWD just in case mount_share returned due to an error.
+ unset USER
+ unset PASSWD
+done
diff --git a/core/modules/pam-common-share/module.build b/core/modules/pam-common-share/module.build
new file mode 100644
index 00000000..62d96224
--- /dev/null
+++ b/core/modules/pam-common-share/module.build
@@ -0,0 +1,11 @@
+fetch_source() {
+ :
+}
+
+build() {
+ pinfo "Static module, nothing to build."
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/pam-common-share/module.conf b/core/modules/pam-common-share/module.conf
new file mode 100644
index 00000000..0cd03752
--- /dev/null
+++ b/core/modules/pam-common-share/module.conf
@@ -0,0 +1,3 @@
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/pam/TODO b/core/modules/pam/TODO
new file mode 100644
index 00000000..6f95e62d
--- /dev/null
+++ b/core/modules/pam/TODO
@@ -0,0 +1 @@
+suse krb5 mount home dirs
diff --git a/core/modules/pam/data/etc/pam-script/pam_script_auth b/core/modules/pam/data/etc/pam-script/pam_script_auth
new file mode 120000
index 00000000..319fba0e
--- /dev/null
+++ b/core/modules/pam/data/etc/pam-script/pam_script_auth
@@ -0,0 +1 @@
+/opt/openslx/scripts/pam_script_auth \ No newline at end of file
diff --git a/core/modules/pam/data/etc/pam-script/pam_script_ses_close b/core/modules/pam/data/etc/pam-script/pam_script_ses_close
new file mode 120000
index 00000000..f3682056
--- /dev/null
+++ b/core/modules/pam/data/etc/pam-script/pam_script_ses_close
@@ -0,0 +1 @@
+/opt/openslx/scripts/pam_script_ses_close \ No newline at end of file
diff --git a/core/modules/pam/data/etc/pam-script/pam_script_ses_open b/core/modules/pam/data/etc/pam-script/pam_script_ses_open
new file mode 120000
index 00000000..4f5598e5
--- /dev/null
+++ b/core/modules/pam/data/etc/pam-script/pam_script_ses_open
@@ -0,0 +1 @@
+/opt/openslx/scripts/pam_script_ses_open \ No newline at end of file
diff --git a/core/modules/pam/data/etc/pam.d/common-account b/core/modules/pam/data/etc/pam.d/common-account
new file mode 100644
index 00000000..4c464871
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/common-account
@@ -0,0 +1,25 @@
+#
+# /etc/pam.d/common-account - authorization settings common to all services
+#
+# This file is included from other service-specific PAM config files,
+# and should contain a list of the authorization modules that define
+# the central access policy for use on the system. The default is to
+# only deny service to users whose accounts are expired in /etc/shadow.
+#
+# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
+# To take advantage of this, it is recommended that you configure any
+# local modules either before or after the default block, and use
+# pam-auth-update to manage selection of other modules. See
+# pam-auth-update(8) for details.
+#
+
+# here are the per-package modules (the "Primary" block)
+account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
+# here's the fallback if no module succeeds
+account requisite pam_deny.so
+# prime the stack with a positive return value if there isn't one already;
+# this avoids us returning an error just because nothing sets a success code
+# since the modules above will each just jump around
+account required pam_permit.so
+# and here are more per-package modules (the "Additional" block)
+# end of pam-auth-update config
diff --git a/core/modules/pam/data/etc/pam.d/common-auth b/core/modules/pam/data/etc/pam.d/common-auth
new file mode 100644
index 00000000..752b810d
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/common-auth
@@ -0,0 +1,25 @@
+#
+# /etc/pam.d/common-auth - authentication settings common to all services
+#
+# This file is included from other service-specific PAM config files,
+# and should contain a list of the authentication modules that define
+# the central authentication scheme for use on the system
+# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the
+# traditional Unix authentication mechanisms.
+#
+# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
+# To take advantage of this, it is recommended that you configure any
+# local modules either before or after the default block, and use
+# pam-auth-update to manage selection of other modules. See
+# pam-auth-update(8) for details.
+
+# here are the per-package modules (the "Primary" block)
+auth [success=1 default=ignore] pam_unix.so
+# here's the fallback if no module succeeds
+auth requisite pam_deny.so
+# prime the stack with a positive return value if there isn't one already;
+# this avoids us returning an error just because nothing sets a success code
+# since the modules above will each just jump around
+auth required pam_permit.so
+# and here are more per-package modules (the "Additional" block)
+# end of pam-auth-update config
diff --git a/core/modules/pam/data/etc/pam.d/common-password b/core/modules/pam/data/etc/pam.d/common-password
new file mode 100644
index 00000000..cb8c7b71
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/common-password
@@ -0,0 +1,33 @@
+#
+# /etc/pam.d/common-password - password-related modules common to all services
+#
+# This file is included from other service-specific PAM config files,
+# and should contain a list of modules that define the services to be
+# used to change user passwords. The default is pam_unix.
+
+# Explanation of pam_unix options:
+#
+# The "sha512" option enables salted SHA512 passwords. Without this option,
+# the default is Unix crypt. Prior releases used the option "md5".
+#
+# The "obscure" option replaces the old `OBSCURE_CHECKS_ENAB' option in
+# login.defs.
+#
+# See the pam_unix manpage for other options.
+
+# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
+# To take advantage of this, it is recommended that you configure any
+# local modules either before or after the default block, and use
+# pam-auth-update to manage selection of other modules. See
+# pam-auth-update(8) for details.
+
+# here are the per-package modules (the "Primary" block)
+password [success=1 default=ignore] pam_unix.so obscure sha512
+# here's the fallback if no module succeeds
+password requisite pam_deny.so
+# prime the stack with a positive return value if there isn't one already;
+# this avoids us returning an error just because nothing sets a success code
+# since the modules above will each just jump around
+password required pam_permit.so
+# and here are more per-package modules (the "Additional" block)
+# end of pam-auth-update config
diff --git a/core/modules/pam/data/etc/pam.d/common-session b/core/modules/pam/data/etc/pam.d/common-session
new file mode 100644
index 00000000..1a3ca2d1
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/common-session
@@ -0,0 +1,33 @@
+#
+# /etc/pam.d/common-session - session-related modules common to all services
+#
+# This file is included from other service-specific PAM config files,
+# and should contain a list of modules that define tasks to be performed
+# at the start and end of sessions of *any* kind (both interactive and
+# non-interactive).
+#
+# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
+# To take advantage of this, it is recommended that you configure any
+# local modules either before or after the default block, and use
+# pam-auth-update to manage selection of other modules. See
+# pam-auth-update(8) for details.
+
+# here are the per-package modules (the "Primary" block)
+session [default=1] pam_permit.so
+# here's the fallback if no module succeeds
+session requisite pam_deny.so
+# prime the stack with a positive return value if there isn't one already;
+# this avoids us returning an error just because nothing sets a success code
+# since the modules above will each just jump around
+session required pam_permit.so
+# The pam_umask module will set the umask according to the system default in
+# /etc/login.defs and user settings, solving the problem of different
+# umask settings with different shells, display managers, remote sessions etc.
+# See "man pam_umask".
+session optional pam_umask.so
+# and here are more per-package modules (the "Additional" block)
+session required pam_systemd.so
+session optional pam_env.so readenv=1
+session optional pam_env.so readenv=1 envfile=/etc/default/locale
+session optional pam_mkhomedir.so skel=/etc/skel umask=0022
+# end of pam-auth-update config
diff --git a/core/modules/pam/data/etc/pam.d/common-session-noninteractive b/core/modules/pam/data/etc/pam.d/common-session-noninteractive
new file mode 100644
index 00000000..5e0fe3f8
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/common-session-noninteractive
@@ -0,0 +1,31 @@
+#
+# /etc/pam.d/common-session-noninteractive - session-related modules
+# common to all non-interactive services
+#
+# This file is included from other service-specific PAM config files,
+# and should contain a list of modules that define tasks to be performed
+# at the start and end of all non-interactive sessions.
+#
+# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
+# To take advantage of this, it is recommended that you configure any
+# local modules either before or after the default block, and use
+# pam-auth-update to manage selection of other modules. See
+# pam-auth-update(8) for details.
+
+# here are the per-package modules (the "Primary" block)
+session [default=1] pam_permit.so
+# here's the fallback if no module succeeds
+session requisite pam_deny.so
+# prime the stack with a positive return value if there isn't one already;
+# this avoids us returning an error just because nothing sets a success code
+# since the modules above will each just jump around
+session required pam_permit.so
+# The pam_umask module will set the umask according to the system default in
+# /etc/login.defs and user settings, solving the problem of different
+# umask settings with different shells, display managers, remote sessions etc.
+# See "man pam_umask".
+session optional pam_umask.so
+# and here are more per-package modules (the "Additional" block)
+session [success=1 default=ignore] pam_succeed_if.so service in sudo quiet use_uid
+session required pam_unix.so
+# end of pam-auth-update config
diff --git a/core/modules/pam/data/etc/pam.d/kdm b/core/modules/pam/data/etc/pam.d/kdm
new file mode 100644
index 00000000..e6a4ec9b
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/kdm
@@ -0,0 +1,10 @@
+#
+# /etc/pam.d/kdm - specify the PAM behaviour of kdm
+#
+auth required pam_nologin.so
+auth required pam_env.so readenv=1
+auth required pam_env.so readenv=1 envfile=/etc/default/locale
+auth include common-auth
+account include common-account
+password include common-password
+session include common-session
diff --git a/core/modules/pam/data/etc/pam.d/kdm-np b/core/modules/pam/data/etc/pam.d/kdm-np
new file mode 100644
index 00000000..dc10e5b5
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/kdm-np
@@ -0,0 +1,11 @@
+#
+# /etc/pam.d/kdm-np - specify the PAM behaviour of kdm for passwordless logins
+#
+auth required pam_nologin.so
+auth required pam_env.so readenv=1
+auth required pam_env.so readenv=1 envfile=/etc/default/locale
+session required pam_limits.so
+account include common-account
+password include common-password
+session include common-session
+auth required pam_permit.so
diff --git a/core/modules/pam/data/etc/pam.d/login b/core/modules/pam/data/etc/pam.d/login
new file mode 100644
index 00000000..1065f351
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/login
@@ -0,0 +1,101 @@
+#
+# The PAM configuration file for the Shadow `login' service
+#
+
+# Enforce a minimal delay in case of failure (in microseconds).
+# (Replaces the `FAIL_DELAY' setting from login.defs)
+# Note that other modules may require another minimal delay. (for example,
+# to disable any delay, you should add the nodelay option to pam_unix)
+auth optional pam_faildelay.so delay=3000000
+
+# Outputs an issue file prior to each login prompt (Replaces the
+# ISSUE_FILE option from login.defs). Uncomment for use
+# auth required pam_issue.so issue=/etc/issue
+
+# Disallows root logins except on tty's listed in /etc/securetty
+# (Replaces the `CONSOLE' setting from login.defs)
+#
+# With the default control of this module:
+# [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die]
+# root will not be prompted for a password on insecure lines.
+# if an invalid username is entered, a password is prompted (but login
+# will eventually be rejected)
+#
+# You can change it to a "requisite" module if you think root may mis-type
+# her login and should not be prompted for a password in that case. But
+# this will leave the system as vulnerable to user enumeration attacks.
+#
+# You can change it to a "required" module if you think it permits to
+# guess valid user names of your system (invalid user names are considered
+# as possibly being root on insecure lines), but root passwords may be
+# communicated over insecure lines.
+auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
+
+# Disallows other than root logins when /etc/nologin exists
+# (Replaces the `NOLOGINS_FILE' option from login.defs)
+auth requisite pam_nologin.so
+
+# SELinux needs to be the first session rule. This ensures that any
+# lingering context has been cleared. Without out this it is possible
+# that a module could execute code in the wrong domain.
+# When the module is present, "required" would be sufficient (When SELinux
+# is disabled, this returns success.)
+# OpenSLX: Not Needed?
+#session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
+
+# This module parses environment configuration file(s)
+# and also allows you to use an extended config
+# file /etc/security/pam_env.conf.
+#
+# parsing /etc/environment needs "readenv=1"
+session required pam_env.so readenv=1
+# locale variables are also kept into /etc/default/locale in etch
+# reading this file *in addition to /etc/environment* does not hurt
+session required pam_env.so readenv=1 envfile=/etc/default/locale
+
+# Standard Un*x authentication.
+auth include common-auth
+
+# TODO do we need this?
+# This allows certain extra groups to be granted to a user
+# based on things like time of day, tty, service, and user.
+# Please edit /etc/security/group.conf to fit your needs
+# (Replaces the `CONSOLE_GROUPS' option in login.defs)
+#auth optional pam_group.so
+
+# Uncomment and edit /etc/security/time.conf if you need to set
+# time restrainst on logins.
+# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs
+# as well as /etc/porttime)
+# account requisite pam_time.so
+
+# Uncomment and edit /etc/security/access.conf if you need to
+# set access limits.
+# (Replaces /etc/login.access file)
+# account required pam_access.so
+
+# TODO do we need this?
+# Sets up user limits according to /etc/security/limits.conf
+# (Replaces the use of /etc/limits in old login)
+#session required pam_limits.so
+
+# TODO check if this is needed
+# Prints the last login info upon succesful login
+# (Replaces the `LASTLOG_ENAB' option from login.defs)
+session optional pam_lastlog.so
+
+# Prints the motd upon succesful login
+# (Replaces the `MOTD_FILE' option in login.defs)
+session optional pam_motd.so
+
+# Standard Un*x account and session
+account include common-account
+session include common-session
+password include common-password
+
+# SELinux needs to intervene at login time to ensure that the process
+# starts in the proper default security context. Only sessions which are
+# intended to run in the user's context should be run after this.
+session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
+# When the module is present, "required" would be sufficient (When SELinux
+# is disabled, this returns success.)
diff --git a/core/modules/pam/data/etc/pam.d/other b/core/modules/pam/data/etc/pam.d/other
new file mode 100644
index 00000000..840eb77f
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/other
@@ -0,0 +1,10 @@
+#%PAM-1.0
+auth required pam_warn.so
+auth required pam_deny.so
+account required pam_warn.so
+account required pam_deny.so
+password required pam_warn.so
+password required pam_deny.so
+session required pam_warn.so
+session required pam_deny.so
+
diff --git a/core/modules/pam/data/etc/pam.d/passwd b/core/modules/pam/data/etc/pam.d/passwd
new file mode 100644
index 00000000..32eaa3c6
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/passwd
@@ -0,0 +1,6 @@
+#
+# The PAM configuration file for the Shadow `passwd' service
+#
+
+password include common-password
+
diff --git a/core/modules/pam/data/etc/pam.d/sshd b/core/modules/pam/data/etc/pam.d/sshd
new file mode 100644
index 00000000..8954d639
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/sshd
@@ -0,0 +1,41 @@
+# PAM configuration for the Secure Shell service
+
+# Read environment variables from /etc/environment and
+# /etc/security/pam_env.conf.
+auth required pam_env.so # [1]
+# In Debian 4.0 (etch), locale-related environment variables were moved to
+# /etc/default/locale, so read that as well.
+auth required pam_env.so envfile=/etc/default/locale
+
+# Standard Un*x authentication.
+auth include common-auth
+
+# Disallow non-root logins when /etc/nologin exists.
+account required pam_nologin.so
+
+# Uncomment and edit /etc/security/access.conf if you need to set complex
+# access limits that are hard to express in sshd_config.
+# account required pam_access.so
+
+# Standard Un*x authorization.
+account include common-account
+
+# Standard Un*x session setup and teardown.
+session include common-session
+
+# Print the message of the day upon successful login.
+session optional pam_motd.so # [1]
+
+# TODO do we need this?
+# Print the status of the user's mailbox upon successful login.
+#session optional pam_mail.so standard noenv # [1]
+
+# TODO do we need this?
+# Set up user limits from /etc/security/limits.conf.
+#session required pam_limits.so
+
+# Set up SELinux capabilities (need modified pam)
+# session required pam_selinux.so multiple
+
+# Standard Un*x password updating.
+password include common-password
diff --git a/core/modules/pam/data/etc/pam.d/vmware-authd b/core/modules/pam/data/etc/pam.d/vmware-authd
new file mode 100644
index 00000000..1f9b60f9
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/vmware-authd
@@ -0,0 +1,6 @@
+#%PAM-1.0
+auth include common-auth
+account include common-account
+password include common-password
+session include common-session
+
diff --git a/core/modules/pam/data/etc/pam.d/xdm b/core/modules/pam/data/etc/pam.d/xdm
new file mode 100644
index 00000000..d21651db
--- /dev/null
+++ b/core/modules/pam/data/etc/pam.d/xdm
@@ -0,0 +1,6 @@
+#%PAM-1.0
+auth include common-auth
+account include common-account
+password include common-password
+session required pam_loginuid.so
+session include common-session
diff --git a/core/modules/pam/data/etc/security/pam_env.conf b/core/modules/pam/data/etc/security/pam_env.conf
new file mode 100644
index 00000000..d0ba35c2
--- /dev/null
+++ b/core/modules/pam/data/etc/security/pam_env.conf
@@ -0,0 +1,73 @@
+#
+# This is the configuration file for pam_env, a PAM module to load in
+# a configurable list of environment variables for a
+#
+# The original idea for this came from Andrew G. Morgan ...
+#<quote>
+# Mmm. Perhaps you might like to write a pam_env module that reads a
+# default environment from a file? I can see that as REALLY
+# useful... Note it would be an "auth" module that returns PAM_IGNORE
+# for the auth part and sets the environment returning PAM_SUCCESS in
+# the setcred function...
+#</quote>
+#
+# What I wanted was the REMOTEHOST variable set, purely for selfish
+# reasons, and AGM didn't want it added to the SimpleApps login
+# program (which is where I added the patch). So, my first concern is
+# that variable, from there there are numerous others that might/would
+# be useful to be set: NNTPSERVER, LESS, PATH, PAGER, MANPAGER .....
+#
+# Of course, these are a different kind of variable than REMOTEHOST in
+# that they are things that are likely to be configured by
+# administrators rather than set by logging in, how to treat them both
+# in the same config file?
+#
+# Here is my idea:
+#
+# Each line starts with the variable name, there are then two possible
+# options for each variable DEFAULT and OVERRIDE.
+# DEFAULT allows and administrator to set the value of the
+# variable to some default value, if none is supplied then the empty
+# string is assumed. The OVERRIDE option tells pam_env that it should
+# enter in its value (overriding the default value) if there is one
+# to use. OVERRIDE is not used, "" is assumed and no override will be
+# done.
+#
+# VARIABLE [DEFAULT=[value]] [OVERRIDE=[value]]
+#
+# (Possibly non-existent) environment variables may be used in values
+# using the ${string} syntax and (possibly non-existent) PAM_ITEMs may
+# be used in values using the @{string} syntax. Both the $ and @
+# characters can be backslash escaped to be used as literal values
+# values can be delimited with "", escaped " not supported.
+# Note that many environment variables that you would like to use
+# may not be set by the time the module is called.
+# For example, HOME is used below several times, but
+# many PAM applications don't make it available by the time you need it.
+#
+#
+# First, some special variables
+#
+# Set the REMOTEHOST variable for any hosts that are remote, default
+# to "localhost" rather than not being set at all
+#REMOTEHOST DEFAULT=localhost OVERRIDE=@{PAM_RHOST}
+#
+# Set the DISPLAY variable if it seems reasonable
+#DISPLAY DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
+#
+#
+# Now some simple variables
+#
+#PAGER DEFAULT=less
+#MANPAGER DEFAULT=less
+#LESS DEFAULT="M q e h15 z23 b80"
+#NNTPSERVER DEFAULT=localhost
+#PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
+#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
+#
+# silly examples of escaped variables, just to show how they work.
+#
+#DOLLAR DEFAULT=\$
+#DOLLARDOLLAR DEFAULT= OVERRIDE=\$${DOLLAR}
+#DOLLARPLUS DEFAULT=\${REMOTEHOST}${REMOTEHOST}
+#ATSIGN DEFAULT="" OVERRIDE=\@
diff --git a/core/modules/pam/data/etc/tmpfiles.d/pipefs.conf b/core/modules/pam/data/etc/tmpfiles.d/pipefs.conf
new file mode 100644
index 00000000..44e0924c
--- /dev/null
+++ b/core/modules/pam/data/etc/tmpfiles.d/pipefs.conf
@@ -0,0 +1,2 @@
+d /var/run/rpc_pipefs 0755 root root
+
diff --git a/core/modules/pam/data/opt/openslx/scripts/pam_script_auth b/core/modules/pam/data/opt/openslx/scripts/pam_script_auth
new file mode 100755
index 00000000..0fe73cbd
--- /dev/null
+++ b/core/modules/pam/data/opt/openslx/scripts/pam_script_auth
@@ -0,0 +1,146 @@
+#!/bin/ash
+
+# Needed as pam_script clears PATH
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+
+# check if the script runs as root
+[ "x$(whoami)" != "xroot" ] && exit 0
+
+PASSWD=$(getent passwd "$PAM_USER")
+USER_NAME=$(echo "$PASSWD" | awk -F ':' '{print $1}')
+USER_UID=$(echo "$PASSWD" | awk -F ':' '{print $3}')
+USER_GID=$(echo "$PASSWD" | awk -F ':' '{print $4}')
+USER_HOME=$(echo "$PASSWD" | awk -F ':' '{print $6}')
+[ -n "$USER_NAME" ] && PAM_USER="$USER_NAME"
+[ -z "$USER_UID" ] && USER_UID=$(id -u "$PAM_USER")
+[ -z "$USER_GID" ] && USER_GID=$(id -g "$PAM_USER")
+[ -z "$USER_HOME" ] && USER_HOME="/home/$PAM_USER"
+if [ -z "$USER_UID" -o -z "$USER_GID" ]; then
+ slxlog "pam-get-ids" "Could not determine UID or GID for user '$PAM_USER'."
+ exit 1
+fi
+
+# The user's non-persistent home directory mount point, which should be their linux home
+TEMP_HOME_DIR="$USER_HOME"
+
+# check if PAM_USER is root and skip if it is the case
+[ "x${PAM_USER}" == "xroot" ] && exit 0
+
+###############################################################################
+#
+# Preparations for volatile /home/<user>
+#
+#
+# check if we already mounted the home directory
+if ! mount | grep -q -F " ${TEMP_HOME_DIR} "; then
+ # no home, lets create it
+ if ! mkdir -p "${TEMP_HOME_DIR}"; then
+ slxlog "pam-global-mktemphome" "Could not create '${TEMP_HOME_DIR}'."
+ exit 1
+ fi
+ # now make it a tmpfs
+ if ! mount -t tmpfs -o mode=700,size=1024m tmpfs "${TEMP_HOME_DIR}"; then
+ slxlog "pam-global-tmpfstemphome" "Could not make a tmpfs on ${TEMP_HOME_DIR}"
+ exit 1
+ fi
+fi
+
+###############################################################################
+#
+# Preparations for /home/<user>/PERSISTENT
+#
+#
+# Script to be sourced to mount the user's persistent home
+PERSISTENT_MOUNT_SCRIPT="/opt/openslx/scripts/pam_script_mount_persistent"
+# Script to be run in the user's context iff the persistent home could be mounted successfully
+PERSISTENT_MOUNT_USER_SCRIPT="/opt/openslx/scripts/pam_script_mount_persistent_user"
+# The user's persistent home directory mount point
+PERSISTENT_HOME_DIR="${TEMP_HOME_DIR}/PERSISTENT"
+
+# now lets see if we have a persistent directory mount script, and it's not already mounted
+if [ -e "${PERSISTENT_MOUNT_SCRIPT}" ] && ! mount | grep -q -F " ${PERSISTENT_HOME_DIR} "; then
+ # seems we should try to mount...
+ # create the PERSISTENT directory and give to user
+ if ! mkdir -p "${PERSISTENT_HOME_DIR}"; then
+ slxlog "pam-global-mkpersistent" "Could not create '${PERSISTENT_HOME_DIR}'."
+ elif ! chown "${USER_UID}:${USER_GID}" "${TEMP_HOME_DIR}"; then
+ slxlog "pam-global-chpersistent" "Could not chown '${TEMP_HOME_DIR}' to '${PAM_USER}'."
+ else
+ # everything seems ok, call mount script
+ . "${PERSISTENT_MOUNT_SCRIPT}" \
+ || slxlog "pam-global-sourcepersistent" "Could not source '${PERSISTENT_MOUNT_SCRIPT}'."
+ if [ -n "${REAL_ACCOUNT}" ]; then
+ echo "${REAL_ACCOUNT}" > "${TEMP_HOME_DIR}/.account"
+ chmod 0644 "${TEMP_HOME_DIR}/.account"
+ fi
+ fi
+fi # end "mount-home-script-exists"
+
+
+# Just try to delete the persistent dir. If the mount was successful, it will not work
+# If it was not successful, it will be removed so the user doesn't think he can store
+# anything in there
+rmdir "${PERSISTENT_HOME_DIR}" 2> /dev/null
+
+# Write warning message to tmpfs home
+if [ -d "${PERSISTENT_HOME_DIR}" ]; then
+ # create a WARNING.txt for the user with hint to PERSISTENT
+ cat > "${TEMP_HOME_DIR}/WARNING.txt" <<EOF
+ATTENTION: This is the non-persistent home directory!
+Files saved here will be lost on shutdown.
+Your real home is under ${PERSISTENT_HOME_DIR}
+Please save your files there.
+EOF
+else
+ # create a WARNING.txt for the user, no PERSISTENT :-(
+ cat > "${TEMP_HOME_DIR}/WARNING.txt" <<EOF
+ATTENTION: This is a non-persistent home directory!
+Files saved here will be lost on shutdown.
+Please save your files on a USB drive or upload them
+to some web service.
+EOF
+fi
+chown "${USER_UID}" "${TEMP_HOME_DIR}/WARNING.txt"
+
+###############################################################################
+#
+# Preparations for /home/<user>/SHARE
+#
+#
+# Script to be sourced to mount the common share folder
+COMMON_SHARE_MOUNT_SCRIPT="/opt/openslx/scripts/pam_script_mount_common_share"
+# User specific mount point for the common share
+COMMON_SHARE_MOUNT_POINT="${TEMP_HOME_DIR}/SHARE"
+
+# check for common share mount script, exit if we don't have one
+if [ -e "${COMMON_SHARE_MOUNT_SCRIPT}" ] && ! mount | grep -q -F " ${COMMON_SHARE_MOUNT_POINT} "; then
+ # create the SHARE directory
+ if ! mkdir -p "${COMMON_SHARE_MOUNT_POINT}"; then
+ slxlog "pam-global-mkshare" "Could not create '${COMMON_SHARE_MOUNT_POINT}'."
+ elif ! chown "${USER_UID}:${USER_GID}" "${COMMON_SHARE_MOUNT_POINT}"; then
+ slxlog "pam-global-chshare" "Could not chown '${COMMON_SHARE_MOUNT_POINT}' to '${PAM_USER}'."
+ else
+ COMMON_SHARE_MOUNT_POINT="${COMMON_SHARE_MOUNT_POINT}" \
+ PAM_USER="${PAM_USER}" \
+ PAM_AUTHTOK="${PAM_AUTHTOK}" \
+ USER_UID="${USER_UID}" \
+ USER_GID="${USER_GID}" \
+ /bin/ash "${COMMON_SHARE_MOUNT_SCRIPT}" \
+ || slxlog "pam-global-sourceshare" "Could not execute '${COMMON_SHARE_MOUNT_SCRIPT}'."
+ fi
+fi
+# Just try to delete the common share dir. If the mount was successful, it will not work
+rmdir "${COMMON_SHARE_MOUNT_POINT}" 2> /dev/null
+
+#
+# source the stuff in pam_script_auth.d, if it exists
+#
+if [ -d "/opt/openslx/scripts/pam_script_auth.d" ]; then
+ for HOOK in $(ls "/opt/openslx/scripts/pam_script_auth.d"); do
+ # source it, in case of failure do nothing since these scripts are non-critical
+ . "/opt/openslx/scripts/pam_script_auth.d/$HOOK" || slxlog "pam-source-hooks" "Could not source '$HOOK'."
+ done
+fi
+
+exit 0
+
diff --git a/core/modules/pam/data/opt/openslx/scripts/pam_script_ses_close b/core/modules/pam/data/opt/openslx/scripts/pam_script_ses_close
new file mode 100755
index 00000000..cd35a86b
--- /dev/null
+++ b/core/modules/pam/data/opt/openslx/scripts/pam_script_ses_close
@@ -0,0 +1,83 @@
+#!/bin/ash
+
+# Needed as pam_script clears PATH
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+
+# can only work if script is run as root
+[ "x$(whoami)" = "xroot" ] || exit 0
+
+# NSA needs to know
+if [ "x$PAM_SERVICE" != "xsu" -a "x$PAM_SERVICE" != "xsudo" ]; then
+ . /opt/openslx/config
+ if [ "x$SLX_REMOTE_LOG_SESSIONS" = "xyes" -o "x$PAM_USER" = "xroot" ]; then
+ slxlog "session-close" "$PAM_USER logged out on $PAM_TTY"
+ elif [ "x$SLX_REMOTE_LOG_SESSIONS" = "xanonymous" ]; then
+ slxlog "session-close" "User logged out on $PAM_TTY"
+ fi
+fi
+
+# source hooks if there are any
+if [ -d "/opt/openslx/scripts/pam_script_ses_close.d" ]; then
+ for HOOK in $(ls "/opt/openslx/scripts/pam_script_ses_close.d"); do
+ # failure is non-critical
+ . "/opt/openslx/scripts/pam_script_ses_close.d/$HOOK" || slxlog "pam-sesclose-hooks" "Could not source '$HOOK'."
+ done
+fi
+
+# do not kill all root processes :)
+[ "x${PAM_USER}" = "xroot" ] && exit 0
+
+# Async block: Check if user has no session open anymore, if not
+# kill any remaining processes belonging to the user and unmount
+# everything at $USERHOME and below.
+{
+ sleep 2 # Give things some time
+ # Use who (utmp) to determine sessions by the user. loginctl might be nicer, but
+ # a simple show-user $USER will also include detached sessions (eg. screen) which
+ # makes this quite pointless. This needs to be investigated some day.
+ SESSIONCOUNT=$(who | grep "^${PAM_USER}\\b" | wc -l)
+ if [ "$SESSIONCOUNT" = "0" ]; then
+
+ # last session, close all ghost user processes
+ pkill -u "${PAM_USER}"
+
+ # check if user's processes are still running
+ for TIMEOUT in 1 1 2 FAIL; do
+ if ! ps -o pid,s -u "$PAM_USER" -U "$PAM_USER" | grep -q -v -E "PID|Z"; then
+ # nothing running anymore
+ break
+ fi
+ if [ "$TIMEOUT" = "FAIL" ]; then
+ # still something running, send SIGKILL
+ pkill -9 -u "${PAM_USER}"
+ else
+ # give some time
+ sleep "${TIMEOUT}"
+ fi
+ done
+
+ fi
+
+ # just to be sure we check again, since the pkilling above might have taken some time...
+ SESSIONCOUNT=$(who | grep "^${PAM_USER}\\b" | wc -l)
+ if [ "$SESSIONCOUNT" = "0" ]; then
+
+ # unmount the home directory structure
+ USER_HOME=$(getent passwd "$PAM_USER" | awk -F ':' '{print $6}')
+ if [ -n "$USER_HOME" ]; then
+ for TIMEOUT in 0 0 2 2 FAIL; do
+ OK=yes
+ for dir in $(cat /proc/mounts | awk '{print $2}' | grep -e "^${USER_HOME}\$" -e "^${USER_HOME}/.*\$"); do
+ umount "$dir" || OK=no
+ done
+ [ "$TIMEOUT" = "FAIL" -o "$OK" = "yes" ] && break
+ sleep "$TIMEOUT"
+ done
+ fi
+
+ fi
+
+} &
+
+exit 0
+
diff --git a/core/modules/pam/data/opt/openslx/scripts/pam_script_ses_open b/core/modules/pam/data/opt/openslx/scripts/pam_script_ses_open
new file mode 100755
index 00000000..8ab34708
--- /dev/null
+++ b/core/modules/pam/data/opt/openslx/scripts/pam_script_ses_open
@@ -0,0 +1,25 @@
+#!/bin/ash
+
+# Needed as pam_script clears PATH
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+
+# NSA needs to know
+if [ "x$PAM_SERVICE" != "xsu" -a "x$PAM_SERVICE" != "xsudo" ]; then
+ . /opt/openslx/config
+ if [ "x$SLX_REMOTE_LOG_SESSIONS" = "xyes" -o "x$PAM_USER" = "xroot" ]; then
+ slxlog "session-open" "$PAM_USER logged in on $PAM_TTY"
+ elif [ "x$SLX_REMOTE_LOG_SESSIONS" = "xanonymous" ]; then
+ slxlog "session-open" "User logged in on $PAM_TTY"
+ fi
+fi
+
+# source the stuff in pam_script_ses_open.d, if it exists
+if [ -d "/opt/openslx/scripts/pam_script_ses_open.d" ]; then
+ for HOOK in $(ls "/opt/openslx/scripts/pam_script_ses_open.d"); do
+ # source it, in case of failure do nothing since these scripts are non-critical
+ . "/opt/openslx/scripts/pam_script_ses_open.d/$HOOK" || slxlog "pam-source-hooks" "Could not source '$HOOK'."
+ done
+fi
+
+exit 0
+
diff --git a/core/modules/pam/module.build b/core/modules/pam/module.build
new file mode 100644
index 00000000..6682e4a2
--- /dev/null
+++ b/core/modules/pam/module.build
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+fetch_source() {
+ # get pam-script source
+ download_untar "$REQUIRED_PAM_SCRIPT_URL" "src/"
+ # Distribution switch: openSuse 13.1 has no package nss-ldap:
+ if [ -n "$REQUIRED_NSS_LDAPD_URL" ]; then
+ pinfo "Downloading $REQUIRED_NSS_LDAPD_URL ..."
+ download_untar "$REQUIRED_NSS_LDAPD_URL" "src/"
+ fi
+ # Distribution switch: Ubuntu 14.04 dropped packages ncpfs and libncp:
+ if [[ "$SYS_DISTRIBUTION" == "ubuntu" && "$SYS_VERSION" == "14.04" ]]; then
+ for file in $REQUIRED_DOWNLOAD_URLS; do
+ local package="$(basename $file)"
+ pinfo "Downloading and installing package $package ..."
+ download_if_empty "$file" "src/$package"
+ dpkg -i "src/$package" || perror "Could not install package $package."
+ done
+ fi
+}
+
+build() {
+ mkdir -p "$MODULE_BUILD_DIR/opt/openslx/bin"
+ gcc -o "$MODULE_BUILD_DIR/opt/openslx/bin/sslconnect" "$MODULE_DIR/sslconnect.c" -lssl -lcrypto -O3 || perror "Could not compile sslconnect.c"
+ local COPYLIST="$MODULE_BUILD_DIR/list_packet_files"
+ # TODO: Hack for SUSE: Ignore file (/var/lib/nfs/state) that does not exist :(
+ list_packet_files | grep -v '/var/lib/nfs/state' | sort -u > "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST")" "${MODULE_BUILD_DIR}"
+
+ # build pam-script separatly since we use a source tarball
+
+ # HACK: find pam_unix.so in MODULE_BUILD_DIR to see where to put pam_script at
+ cd "${MODULE_WORK_DIR}/src/pam-script-${REQUIRED_PAM_SCRIPT_VERSION}" || perror "Could not cd to ${MODULE_WORK_DIR}/src/pam-script-${REQUIRED_PAM_SCRIPT_VERSION}."
+ ./configure --prefix=/ --sysconfdir=/etc/pam-script --libdir="$SYS_PAM_MODULES_PATH" || perror "pam-script: ./configure failed."
+ make DESTDIR="${MODULE_BUILD_DIR}" install || perror "pam-script: make install to ${MODULE_BUILD_DIR} failed."
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/pam/module.conf b/core/modules/pam/module.conf
new file mode 100644
index 00000000..4e2e01a1
--- /dev/null
+++ b/core/modules/pam/module.conf
@@ -0,0 +1,22 @@
+REQUIRED_BINARIES="
+ ldapsearch
+ rpc.gssd
+ rpc.idmapd
+ sslconnect
+"
+REQUIRED_LIBRARIES="
+ nsswitch
+ static
+ umich_ldap
+ libnfsidmap
+ pam_script
+"
+REQUIRED_DIRECTORIES="
+ /etc/security
+"
+REQUIRED_SYSTEM_FILES="
+ /etc/login.defs
+ /etc/securetty
+"
+REQUIRED_PAM_SCRIPT_VERSION="1.1.6"
+REQUIRED_PAM_SCRIPT_URL="http://downloads.sourceforge.net/project/pam-script/pam-script-${REQUIRED_PAM_SCRIPT_VERSION}.tar.gz"
diff --git a/core/modules/pam/module.conf.centos b/core/modules/pam/module.conf.centos
new file mode 100644
index 00000000..5dadea53
--- /dev/null
+++ b/core/modules/pam/module.conf.centos
@@ -0,0 +1,36 @@
+# erase generic conf settings
+REQUIRED_BINARIES=""
+REQUIRED_FILES=""
+REQUIRED_INSTALLED_PACKAGES="
+ pam
+ pam-devel
+ pam_krb5
+ libnfsidmap
+ nss-mdns
+ openssl-devel
+ nfs-utils
+ glibc
+"
+REQUIRED_CONTENT_PACKAGES="
+ pam
+ pam-devel
+ pam_krb5
+ libnfsidmap
+ nss-mdns
+ nfs-utils
+ glibc
+"
+REQUIRED_LIBRARIES+="
+ libnss_compat
+ libnss_db
+ libnss_dns
+ libnss_files
+ libnss_nis
+"
+REQUIRED_DIRECTORIES+="
+ /$LIB64
+"
+REQUIRED_SYSTEM_FILES+="
+ $SYS_PAM_MODULES_PATH
+"
+
diff --git a/core/modules/pam/module.conf.debian b/core/modules/pam/module.conf.debian
new file mode 100644
index 00000000..e6661476
--- /dev/null
+++ b/core/modules/pam/module.conf.debian
@@ -0,0 +1,57 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libpam-ldap
+ libnss-ldapd
+ libpam-ck-connector
+ libpam-cap
+ krb5-user
+ krb5-config
+ libpam-krb5
+ libssl-dev
+ ldap-utils
+ libnfsidmap2
+ nfs-common
+ libpam0g-dev
+ ncpfs
+"
+REQUIRED_CONTENT_PACKAGES="
+ libpam0g
+ libpam-modules
+ libpam-ck-connector
+ libpam-cap
+ libldap-2.4-2
+ libpam-ldapd
+ libnss-ldapd
+ krb5-user
+ krb5-config
+ libpam-krb5
+ ldap-utils
+ libnfsidmap2
+ nfs-common
+ ncpfs
+"
+REQUIRED_BINARIES+="
+ nwmsg
+ ncpmount
+ ncpumount
+ mount.ncp
+ mount.ncpfs
+"
+REQUIRED_DIRECTORIES+="
+ /lib
+ /usr/lib
+"
+REQUIRED_SYSTEM_FILES+="
+ /etc/pam.conf
+ /etc/default/locale
+ /lib/security
+ /lib/${ARCH_TRIPLET}/security
+ /sbin/mkhomedir_helper
+"
+
+# For Debian 8: Both packages were dropped from official repos. Do not change the
+# order, as these packages will be installed via dpkg and depend on each other.
+REQUIRED_DOWNLOAD_URLS="
+ ftp.acc.umu.se/mirror/cdimage/snapshot/Debian/pool/main/n/ncpfs/libpam-ncp_2.2.6-9_amd64.deb
+ ftp.acc.umu.se/mirror/cdimage/snapshot/Debian/pool/main/n/ncpfs/libncp_2.2.6-9_amd64.deb
+ ftp.acc.umu.se/mirror/cdimage/snapshot/Debian/pool/main/n/ncpfs/ncpfs_2.2.6-9_amd64.deb
+"
diff --git a/core/modules/pam/module.conf.fedora b/core/modules/pam/module.conf.fedora
new file mode 100644
index 00000000..b2eb3421
--- /dev/null
+++ b/core/modules/pam/module.conf.fedora
@@ -0,0 +1,42 @@
+REQUIRED_NSS_LDAPD_VERSION="nss-pam-ldapd-0.8.13"
+REQUIRED_NSS_LDAPD_URL="http://arthurdejong.org/nss-pam-ldapd/${REQUIRED_NSS_LDAPD_VERSION}.tar.gz"
+
+REQUIRED_INSTALLED_PACKAGES="
+ pam
+ pam_krb5
+ pam-devel
+ nss-mdns
+ libnfsidmap
+ openssl-devel
+ openldap-clients
+ nfs-utils
+ glibc
+ pam-devel
+ openldap-devel
+ krb5-devel
+"
+REQUIRED_CONTENT_PACKAGES="
+ pam
+ pam_krb5
+ pam-devel
+ nss-mdns
+ libnfsidmap
+ openldap-clients
+ nfs-utils
+ glibc
+"
+REQUIRED_LIBRARIES+="
+ libnss_compat
+ libnss_db
+ libnss_dns
+ libnss_files
+ libnss_nis
+"
+REQUIRED_DIRECTORIES+="
+ /$LIB64
+ /usr/$LIB64
+"
+REQUIRED_SYSTEM_FILES+="
+ /$LIB64/security
+"
+
diff --git a/core/modules/pam/module.conf.opensuse b/core/modules/pam/module.conf.opensuse
new file mode 100644
index 00000000..dfc50e1e
--- /dev/null
+++ b/core/modules/pam/module.conf.opensuse
@@ -0,0 +1,44 @@
+REQUIRED_INSTALLED_PACKAGES="
+ pam
+ pam_krb5
+ pam-devel
+ nss-pam-ldapd
+ nss-mdns
+ pam-modules
+ libopenssl-devel
+ openldap2-client
+ nfsidmap
+ nfs-client
+ glibc
+ pam-devel
+"
+REQUIRED_CONTENT_PACKAGES="
+ pam
+ pam_krb5
+ pam-devel
+ pam-modules
+ nss-pam-ldapd
+ nss-mdns
+ openldap2-client
+ nfsidmap
+ nfs-client
+ glibc
+"
+REQUIRED_BINARIES+="
+ mkhomedir_helper
+"
+REQUIRED_LIBRARIES+="
+ libnss_compat
+ libnss_db
+ libnss_dns
+ libnss_files
+ libnss_nis
+"
+REQUIRED_DIRECTORIES+="
+ /$LIB64
+ /usr/$LIB64
+"
+REQUIRED_SYSTEM_FILES+="
+ /$LIB64/security
+"
+
diff --git a/core/modules/pam/module.conf.opensuse.13.1 b/core/modules/pam/module.conf.opensuse.13.1
new file mode 100644
index 00000000..d4435999
--- /dev/null
+++ b/core/modules/pam/module.conf.opensuse.13.1
@@ -0,0 +1,48 @@
+REQUIRED_NSS_LDAPD_VERSION="nss-pam-ldapd-0.8.13"
+REQUIRED_NSS_LDAPD_URL="http://arthurdejong.org/nss-pam-ldapd/$REQUIRED_NSS_LDAPD_VERSION.tar.gz"
+
+REQUIRED_BINARIES+="
+ mkhomedir_helper
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ pam
+ pam_krb5
+ pam-devel
+ pam-modules
+ nss-mdns
+ libopenssl-devel
+ openldap2-client
+ nfsidmap
+ nfs-client
+ glibc
+ pam-devel
+ openldap2-devel
+ krb5-devel
+"
+REQUIRED_CONTENT_PACKAGES="
+ pam
+ pam_krb5
+ pam-devel
+ pam-modules
+ nss-mdns
+ openldap2-client
+ nfsidmap
+ nfs-client
+ glibc
+"
+REQUIRED_LIBRARIES+="
+ libnss_compat
+ libnss_db
+ libnss_dns
+ libnss_files
+ libnss_nis
+"
+REQUIRED_DIRECTORIES+="
+ /$LIB64
+ /usr/$LIB64
+"
+REQUIRED_SYSTEM_FILES+="
+ /$LIB64/security
+"
+
diff --git a/core/modules/pam/module.conf.opensuse.13.2 b/core/modules/pam/module.conf.opensuse.13.2
new file mode 100644
index 00000000..d4435999
--- /dev/null
+++ b/core/modules/pam/module.conf.opensuse.13.2
@@ -0,0 +1,48 @@
+REQUIRED_NSS_LDAPD_VERSION="nss-pam-ldapd-0.8.13"
+REQUIRED_NSS_LDAPD_URL="http://arthurdejong.org/nss-pam-ldapd/$REQUIRED_NSS_LDAPD_VERSION.tar.gz"
+
+REQUIRED_BINARIES+="
+ mkhomedir_helper
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ pam
+ pam_krb5
+ pam-devel
+ pam-modules
+ nss-mdns
+ libopenssl-devel
+ openldap2-client
+ nfsidmap
+ nfs-client
+ glibc
+ pam-devel
+ openldap2-devel
+ krb5-devel
+"
+REQUIRED_CONTENT_PACKAGES="
+ pam
+ pam_krb5
+ pam-devel
+ pam-modules
+ nss-mdns
+ openldap2-client
+ nfsidmap
+ nfs-client
+ glibc
+"
+REQUIRED_LIBRARIES+="
+ libnss_compat
+ libnss_db
+ libnss_dns
+ libnss_files
+ libnss_nis
+"
+REQUIRED_DIRECTORIES+="
+ /$LIB64
+ /usr/$LIB64
+"
+REQUIRED_SYSTEM_FILES+="
+ /$LIB64/security
+"
+
diff --git a/core/modules/pam/module.conf.ubuntu b/core/modules/pam/module.conf.ubuntu
new file mode 100644
index 00000000..d675116c
--- /dev/null
+++ b/core/modules/pam/module.conf.ubuntu
@@ -0,0 +1,47 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libpam-ldap
+ libnss-ldapd
+ krb5-user
+ krb5-config
+ libpam-krb5
+ libssl-dev
+ ldap-utils
+ libnfsidmap2
+ nfs-common
+ libpam0g-dev
+ ncpfs
+ cifs-utils
+"
+REQUIRED_CONTENT_PACKAGES="
+ libpam0g
+ libpam-modules
+ libpam-cap
+ libldap-2.4-2
+ libpam-ldap
+ libnss-ldapd
+ krb5-user
+ krb5-config
+ libpam-krb5
+ ldap-utils
+ libnfsidmap2
+ nfs-common
+ ncpfs
+ cifs-utils
+"
+REQUIRED_BINARIES+="
+ nwmsg
+ ncpmount
+ ncpumount
+ mount.ncp
+ mount.ncpfs
+ mount.cifs
+"
+REQUIRED_DIRECTORIES+="
+ $SYS_PAM_MODULES_PATH
+ /lib
+ /usr/lib
+"
+REQUIRED_SYSTEM_FILES+="
+ /etc/pam.conf
+ /etc/default/locale
+"
diff --git a/core/modules/pam/module.conf.ubuntu.14 b/core/modules/pam/module.conf.ubuntu.14
new file mode 100644
index 00000000..64ead96a
--- /dev/null
+++ b/core/modules/pam/module.conf.ubuntu.14
@@ -0,0 +1,41 @@
+# TODO fix and re-add ncp support !
+REQUIRED_INSTALLED_PACKAGES="
+ libpam-ldap
+ libnss-ldapd
+ krb5-user
+ krb5-config
+ libpam-krb5
+ libssl-dev
+ ldap-utils
+ libnfsidmap2
+ nfs-common
+ libpam0g-dev
+ cifs-utils
+"
+REQUIRED_CONTENT_PACKAGES="
+ libpam0g
+ libpam-modules
+ libpam-cap
+ libldap-2.4-2
+ libpam-ldap
+ libnss-ldapd
+ krb5-user
+ krb5-config
+ libpam-krb5
+ ldap-utils
+ libnfsidmap2
+ nfs-common
+ cifs-utils
+"
+REQUIRED_BINARIES+="
+ mount.cifs
+"
+REQUIRED_DIRECTORIES+="
+ $SYS_PAM_MODULES_PATH
+ /lib
+ /usr/lib
+"
+REQUIRED_SYSTEM_FILES+="
+ /etc/pam.conf
+ /etc/default/locale
+"
diff --git a/core/modules/pam/module.conf.ubuntu.16 b/core/modules/pam/module.conf.ubuntu.16
new file mode 100644
index 00000000..c82d905a
--- /dev/null
+++ b/core/modules/pam/module.conf.ubuntu.16
@@ -0,0 +1,42 @@
+# TODO fix and re-add ncp support !
+REQUIRED_INSTALLED_PACKAGES="
+ libpam-ldap
+ libpam-cap
+ libnss-ldapd
+ krb5-user
+ krb5-config
+ libpam-krb5
+ libssl-dev
+ ldap-utils
+ libnfsidmap2
+ nfs-common
+ libpam0g-dev
+ cifs-utils
+"
+REQUIRED_CONTENT_PACKAGES="
+ libpam0g
+ libpam-modules
+ libpam-cap
+ libldap-2.4-2
+ libpam-ldap
+ libnss-ldapd
+ krb5-user
+ krb5-config
+ libpam-krb5
+ ldap-utils
+ libnfsidmap2
+ nfs-common
+ cifs-utils
+"
+REQUIRED_BINARIES+="
+ mount.cifs
+"
+REQUIRED_DIRECTORIES+="
+ $SYS_PAM_MODULES_PATH
+ /lib
+ /usr/lib
+"
+REQUIRED_SYSTEM_FILES+="
+ /etc/pam.conf
+ /etc/default/locale
+"
diff --git a/core/modules/pam/sslconnect.c b/core/modules/pam/sslconnect.c
new file mode 100644
index 00000000..af43093c
--- /dev/null
+++ b/core/modules/pam/sslconnect.c
@@ -0,0 +1,201 @@
+/************************
+ * sslconnect 0.2
+ * Last Change: 2013-06-17
+ * C Implementation by Simon Rettberg
+ * Original sslconnect 0.1 was written in perl by Martin Walter
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <netdb.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <openssl/bio.h>
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+
+/* Init libs and data strctures */
+void init();
+/* print error report of something failed */
+void ssl_error();
+/* connect via ssl */
+SSL* ssl_connect(char * host, uint16_t port, uint16_t local_port, SSL_CTX ** ctx);
+/* read from ssl connection */
+ssize_t ssl_read(SSL * bio, char * buffer, ssize_t length);
+/* write to ssl connection */
+int ssl_write(SSL * bio, char * buffer, ssize_t length);
+
+int main(int argc, char ** argv);
+
+void init()
+{
+ SSL_load_error_strings();
+ SSL_library_init();
+ OpenSSL_add_all_algorithms();
+}
+
+void ssl_error(char* message)
+{
+ fprintf(stderr, message);
+ fprintf(stderr, "\n%s\n", ERR_error_string(ERR_get_error(), NULL));
+ fprintf(stderr, "Details: %s\n", ERR_reason_error_string(ERR_get_error()));
+ ERR_print_errors_fp(stderr);
+}
+
+SSL* ssl_connect(char * host, uint16_t port, uint16_t local_port, SSL_CTX ** ctx)
+{
+ int ret = 0;
+ /* create socket. needs to be done manually in order to bind to local port */
+ int fd = socket(AF_INET, SOCK_STREAM, 0);
+ if (fd < 0) {
+ fprintf(stderr, "Could not create socket.\n");
+ return NULL;
+ }
+
+ struct sockaddr_in sa_dest, sa_local;
+ memset(&sa_local, 0, sizeof(sa_local));
+ memset(&sa_dest, 0, sizeof(sa_dest));
+
+ sa_local.sin_family = AF_INET;
+ sa_local.sin_port = htons(local_port);
+ ret = bind(fd, (struct sockaddr *)&sa_local, sizeof(struct sockaddr));
+ if (ret == -1) {
+ fprintf(stderr, "Could not bind local socket to 0.0.0.0:%d (%d)\n", (int)local_port, (int)errno);
+ close(fd);
+ return NULL;
+ }
+
+ sa_dest.sin_family = AF_INET;
+ sa_dest.sin_port = htons(port);
+ struct hostent * rec;
+ rec = gethostbyname(host);
+ if (rec == NULL) {
+ fprintf(stderr, "Error: Invalid host: %s\n", host);
+ return NULL;
+ }
+ memcpy(&(sa_dest.sin_addr), rec->h_addr, sizeof(struct in_addr));
+
+ ret = connect(fd, (struct sockaddr *)&sa_dest, sizeof(struct sockaddr));
+ if (ret == -1) {
+ fprintf(stderr, "Could not connect to %s:%d (%d)\n", host, (int)port, (int)errno);
+ close(fd);
+ return NULL;
+ }
+
+ /* openssl part */
+ SSL * ssl;
+
+ /* Set up the SSL pointers */
+ *ctx = SSL_CTX_new(SSLv23_client_method());
+ ssl = SSL_new(*ctx);
+ SSL_set_fd(ssl, fd);
+ ret = SSL_connect(ssl);
+
+ if (ret <= 0) {
+ ssl_error("Unable to SSL_connect");
+ return NULL;
+ }
+
+ SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
+
+ return ssl;
+}
+
+ssize_t ssl_read(SSL * ssl, char * buffer, ssize_t length)
+{
+ ssize_t ret = -1;
+ int retries = 10;
+
+ while (ret < 0 && --retries > 0) {
+
+ ret = SSL_read(ssl, buffer, length);
+ if (ret >= 0) {
+ return ret;
+ }
+
+ ssl_error("SSL_read failed");
+ return -1;
+
+ }
+
+ return -1;
+}
+
+int ssl_write(SSL * ssl, char * buffer, ssize_t length)
+{
+ ssize_t ret = -1;
+ int retries = 10;
+
+ while (ret < 0 && --retries > 0) {
+
+ ret = SSL_write(ssl, buffer, length);
+ if (ret >= 0) {
+ return ret;
+ }
+
+ ssl_error("SSL_write failed");
+ return -1;
+
+ }
+
+ return -1;
+}
+
+#define READBUF 5000
+int main(int argc, char ** argv)
+{
+ if (argc < 2) {
+ fprintf(stderr, "Usage: %s host:port\n", argv[0]);
+ return 1;
+ }
+
+ init();
+
+ char buffer[READBUF];
+ SSL_CTX * ctx = NULL;
+ SSL * ssl;
+ ssize_t len;
+ size_t ret;
+ char * pos;
+ int port, lport;
+ pos = strchr(argv[1], ':');
+ if (pos == NULL) {
+ fprintf(stderr, "Error: No Port given.\n");
+ return 5;
+ }
+ port = atoi(pos+1);
+ *pos = '\0';
+
+ lport = rand() % 800 + 95;
+
+ ssl = ssl_connect(argv[1], (uint16_t)port, (uint16_t)lport, &ctx);
+ if (ssl == NULL) {
+ return 2;
+ }
+
+ ssl_write(ssl, "", 0);
+ for (;;) {
+ len = ssl_read(ssl, buffer, READBUF);
+ if (len <= 0) {
+ break;
+ }
+ ret = fwrite(buffer, 1, len, stdout);
+ if (ret != len) {
+ fprintf(stderr, "Error: fwrite could not write all received data to stdout.\n");
+ return 3;
+ }
+ }
+
+ if (len < 0) {
+ return 4;
+ }
+
+ return 0;
+}
+
diff --git a/core/modules/plymouth/data/etc/systemd/system/plymouth-quit.service b/core/modules/plymouth/data/etc/systemd/system/plymouth-quit.service
new file mode 100644
index 00000000..0ed4fa49
--- /dev/null
+++ b/core/modules/plymouth/data/etc/systemd/system/plymouth-quit.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Terminate Plymouth Boot Screen
+Before=display-manager.service
+After=systemd-user-sessions.service
+
+[Service]
+ExecStart=-/bin/plymouth quit
+Type=oneshot
+TimeoutSec=20
diff --git a/core/modules/plymouth/data/etc/tmpfiles.d/plymouth.conf b/core/modules/plymouth/data/etc/tmpfiles.d/plymouth.conf
new file mode 100644
index 00000000..9dfffcbe
--- /dev/null
+++ b/core/modules/plymouth/data/etc/tmpfiles.d/plymouth.conf
@@ -0,0 +1,2 @@
+d /var/run/plymouth 0755 root root
+
diff --git a/core/modules/plymouth/module.build b/core/modules/plymouth/module.build
new file mode 100644
index 00000000..67b7734e
--- /dev/null
+++ b/core/modules/plymouth/module.build
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+fetch_source() {
+ download_untar "$REQUIRED_URL" "src/"
+}
+
+build() {
+ cd "src/$REQUIRED_VERSION"
+ pinfo "Running configure"
+ ./configure --enable-systemd-integration --disable-gtk --disable-static --prefix="$REQUIRED_PREFIX"|| perror "failed."
+ pinfo "Running make"
+ make || perror "failed"
+ pinfo "Running make install"
+ DESTDIR="${MODULE_BUILD_DIR}" make install || perror "failed"
+ cd -
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/plymouth/module.conf b/core/modules/plymouth/module.conf
new file mode 100644
index 00000000..d8827529
--- /dev/null
+++ b/core/modules/plymouth/module.conf
@@ -0,0 +1,15 @@
+REQUIRED_VERSION="plymouth-0.8.6.1"
+REQUIRED_URL="http://www.freedesktop.org/software/plymouth/releases/${REQUIRED_VERSION}.tar.bz2"
+REQUIRED_PREFIX="/usr"
+REQUIRED_BINARIES="
+ plymouth
+ plymouthd
+"
+REQUIRED_DIRECTORIES="
+ $REQUIRED_PREFIX/bin
+ $REQUIRED_PREFIX/etc
+ $REQUIRED_PREFIX/lib
+ $REQUIRED_PREFIX/sbin
+ $REQUIRED_PREFIX/var/lib
+ $REQUIRED_PREFIX/var/spool
+"
diff --git a/core/modules/plymouth/module.conf.debian b/core/modules/plymouth/module.conf.debian
new file mode 100644
index 00000000..0c6e00a4
--- /dev/null
+++ b/core/modules/plymouth/module.conf.debian
@@ -0,0 +1,7 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libpng-dev
+ libpango1.0-dev
+ libcairo-dev
+ libgtk2.0-dev
+ libdrm-dev
+"
diff --git a/core/modules/plymouth/module.conf.opensuse b/core/modules/plymouth/module.conf.opensuse
new file mode 100644
index 00000000..034af2ad
--- /dev/null
+++ b/core/modules/plymouth/module.conf.opensuse
@@ -0,0 +1,7 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libpng12-devel
+ pango-devel
+ cairo-devel
+ gtk2-devel
+ libdrm-devel
+"
diff --git a/core/modules/plymouth/module.conf.ubuntu b/core/modules/plymouth/module.conf.ubuntu
new file mode 100644
index 00000000..0c6e00a4
--- /dev/null
+++ b/core/modules/plymouth/module.conf.ubuntu
@@ -0,0 +1,7 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libpng-dev
+ libpango1.0-dev
+ libcairo-dev
+ libgtk2.0-dev
+ libdrm-dev
+"
diff --git a/core/modules/polkit/data/etc/systemd/system/basic.target.wants/polkit.service b/core/modules/polkit/data/etc/systemd/system/basic.target.wants/polkit.service
new file mode 120000
index 00000000..b766f9ab
--- /dev/null
+++ b/core/modules/polkit/data/etc/systemd/system/basic.target.wants/polkit.service
@@ -0,0 +1 @@
+../polkit.service \ No newline at end of file
diff --git a/core/modules/polkit/module.build b/core/modules/polkit/module.build
new file mode 100644
index 00000000..26b11370
--- /dev/null
+++ b/core/modules/polkit/module.build
@@ -0,0 +1,25 @@
+#tool/distro specific functions for fetching, building and installing dependencies
+
+
+fetch_source () {
+ pinfo "Extracting from running system..."
+}
+
+build () {
+ local COPYLIST="$MODULE_WORK_DIR/list_dpkg_output"
+ list_packet_files > "$COPYLIST"
+ [ -n "$REQUIRED_DIR_STRUCT" ] && find $REQUIRED_DIR_STRUCT -type d >> "$COPYLIST"
+ tarcopy "$(cat "${COPYLIST}" | sort -u)" "${MODULE_BUILD_DIR}"
+ local POLPATH=$(find "$MODULE_BUILD_DIR" -name polkitd -executable | head -n 1)
+ POLPATH="/${POLPATH#$MODULE_BUILD_DIR}"
+ mkdir -p "$MODULE_BUILD_DIR/etc/systemd/system" "$MODULE_BUILD_DIR/usr/share/dbus-1/system-services" "$MODULE_BUILD_DIR/var/lib/polkit"
+ sed "s,%POLKITD%,${POLPATH},g" "${MODULE_DIR}/templates/systemd.service" > "$MODULE_BUILD_DIR/etc/systemd/system/polkit.service" || perror "Could not generate polkit.service for systemd"
+ sed "s,%POLKITD%,${POLPATH},g" "${MODULE_DIR}/templates/dbus.service" > "$MODULE_BUILD_DIR/usr/share/dbus-1/system-services/org.freedesktop.PolicyKit1.service" || perror "Could not generate polkit.service for dbus"
+}
+
+post_copy() {
+ #Add Polkit User/Group/Shadow to Stage3.2, required on opensuse
+ pinfo "Adding polkitd user to target system..."
+ add_user "polkitd"
+}
+
diff --git a/core/modules/polkit/module.conf b/core/modules/polkit/module.conf
new file mode 100644
index 00000000..97d4b892
--- /dev/null
+++ b/core/modules/polkit/module.conf
@@ -0,0 +1,13 @@
+REQUIRED_DIRECTORIES="
+ /etc/pam.d
+ /etc/polkit-1
+ /usr/bin
+ /usr/share/polkit-1
+ /etc/dbus-1/system.d
+"
+REQUIRED_FILES="
+ /usr/share/dbus-1/system-services/org.freedesktop.PolicyKit1.service
+ /etc/systemd/system/polkit.service
+"
+REQUIRED_LIBRARIES="libmozjs185"
+
diff --git a/core/modules/polkit/module.conf.debian b/core/modules/polkit/module.conf.debian
new file mode 100644
index 00000000..5684a504
--- /dev/null
+++ b/core/modules/polkit/module.conf.debian
@@ -0,0 +1,19 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libmozjs185-1.0
+ policykit-1
+"
+REQUIRED_CONTENT_PACKAGES="
+ libmozjs185-1.0
+ policykit-1
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/policykit-1
+ /usr/lib/${ARCH_TRIPLET}/polkit-1
+ /var/lib/polkit-1
+"
+# Module specific: Root of dirstructs we need directly from system
+REQUIRED_DIR_STRUCT="
+ /var/lib/polkit-1
+ /etc/polkit-1
+"
+
diff --git a/core/modules/polkit/module.conf.fedora b/core/modules/polkit/module.conf.fedora
new file mode 100644
index 00000000..3d4d965d
--- /dev/null
+++ b/core/modules/polkit/module.conf.fedora
@@ -0,0 +1,12 @@
+REQUIRED_INSTALLED_PACKAGES="
+ js-1.8.5
+"
+REQUIRED_CONTENT_PACKAGES="
+ js-1.8.5
+ polkit
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/polkit-1
+ /var/lib/polkit
+"
+
diff --git a/core/modules/polkit/module.conf.opensuse b/core/modules/polkit/module.conf.opensuse
new file mode 100644
index 00000000..e7c1f369
--- /dev/null
+++ b/core/modules/polkit/module.conf.opensuse
@@ -0,0 +1,12 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libmozjs185-1_0
+"
+REQUIRED_CONTENT_PACKAGES="
+ libmozjs185-1_0
+ polkit
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/polkit-1
+ /var/lib/polkit
+"
+
diff --git a/core/modules/polkit/module.conf.ubuntu b/core/modules/polkit/module.conf.ubuntu
new file mode 100644
index 00000000..eb2f88d1
--- /dev/null
+++ b/core/modules/polkit/module.conf.ubuntu
@@ -0,0 +1,19 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libmozjs185-1.0
+"
+REQUIRED_CONTENT_PACKAGES="
+ libmozjs185-1.0
+ policykit-1
+ policykit-desktop-privileges
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/policykit-1
+ /usr${ARCH_LIB_DIR}/polkit-1
+ /var/lib/polkit-1
+"
+# Module specific: Root of dirstructs we need directly from system
+REQUIRED_DIR_STRUCT="
+ /var/lib/polkit-1
+ /etc/polkit-1
+"
+
diff --git a/core/modules/polkit/templates/dbus.service b/core/modules/polkit/templates/dbus.service
new file mode 100644
index 00000000..c9ee6c8b
--- /dev/null
+++ b/core/modules/polkit/templates/dbus.service
@@ -0,0 +1,6 @@
+[D-BUS Service]
+Name=org.freedesktop.PolicyKit1
+Exec=%POLKITD% --no-debug
+User=root
+SystemdService=polkit.service
+
diff --git a/core/modules/polkit/templates/systemd.service b/core/modules/polkit/templates/systemd.service
new file mode 100644
index 00000000..747fd7eb
--- /dev/null
+++ b/core/modules/polkit/templates/systemd.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=the cancer that is called PolKit
+
+[Service]
+Type=dbus
+BusName=org.freedesktop.PolicyKit1
+ExecStart=%POLKITD% --no-debug
+
diff --git a/core/modules/printergui/data/etc/systemd/system/network.target.wants/printergui.service b/core/modules/printergui/data/etc/systemd/system/network.target.wants/printergui.service
new file mode 120000
index 00000000..40453c80
--- /dev/null
+++ b/core/modules/printergui/data/etc/systemd/system/network.target.wants/printergui.service
@@ -0,0 +1 @@
+../printergui.service \ No newline at end of file
diff --git a/core/modules/printergui/data/etc/systemd/system/printergui.service b/core/modules/printergui/data/etc/systemd/system/printergui.service
new file mode 100644
index 00000000..8b00514c
--- /dev/null
+++ b/core/modules/printergui/data/etc/systemd/system/printergui.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Printergui - bwLehrpool printing system
+Requires=network.target graphical.target
+After=network.target
+Before=cups.service
+
+[Service]
+ExecStart=/opt/openslx/scripts/systemd-printergui_preparation
diff --git a/core/modules/printergui/data/opt/openslx/iptables/rules.d/50-lpd-redirect-and-fw b/core/modules/printergui/data/opt/openslx/iptables/rules.d/50-lpd-redirect-and-fw
new file mode 100755
index 00000000..c0b724a2
--- /dev/null
+++ b/core/modules/printergui/data/opt/openslx/iptables/rules.d/50-lpd-redirect-and-fw
@@ -0,0 +1,8 @@
+#!/bin/ash
+
+# Close from outside
+iptables -A INPUT -i br0 -p tcp --dport 515 -j DROP
+iptables -A INPUT -i br0 -p tcp --dport 5515 -j DROP
+# Redirect from VM to lpd
+iptables -t nat -A PREROUTING -s 192.168.0.0/16 -p tcp --dport 515 -j REDIRECT --to-port 5515
+
diff --git a/core/modules/printergui/data/opt/openslx/scripts/run-virt_print b/core/modules/printergui/data/opt/openslx/scripts/run-virt_print
new file mode 100755
index 00000000..ba352778
--- /dev/null
+++ b/core/modules/printergui/data/opt/openslx/scripts/run-virt_print
@@ -0,0 +1,67 @@
+#!/bin/ash
+
+# Called with $1=USERNAME $2=PRINTFILE
+
+USER="$1"
+FILE="$2"
+PRINTERGUI="/opt/openslx/cups/printergui"
+
+errlog () {
+ FD=0
+ [ -t 1 ] && FD=1
+ [ -t 2 ] && FD=2
+ if [ $FD -ne 0 ]; then
+ echo "$2" >&$FD
+ elif [ $# -gt 2 ]; then
+ slxlog "$1" "$2" "$3"
+ sleep 1
+ else
+ slxlog "$1" "$2"
+ fi
+ $PRINTERGUI --error "$2" &
+}
+
+if [ $# -ne 2 ]; then
+ # Bad usage
+ errlog "printergui-call" "Error: Wrong number of arguments (got $#) ($@)"
+ exit 1
+fi
+
+if [ ! -r "$FILE" ]; then
+ errlog "printergui-file" "Error: File '$FILE' not readable"
+ exit 1
+fi
+
+if [ ! -s "$FILE" ]; then
+ errlog "printergui-file" "Error: File '$FILE' is empty"
+ exit 1
+fi
+
+# Some basic error checking if we have ghostscript available
+if which gs 2>/dev/null; then
+ ERRLOG=$(mktemp)
+ [ -z "$ERRLOG" ] && ERRLOG="/tmp/tmp-$RANDOM-$$-$(whoami)"
+ gs -sDEVICE=nullpage -dNOPAUSE -dBATCH "$FILE" 2>"$ERRLOG"
+ RET=$?
+ if [ $RET -ne 0 ]; then
+ errlog "printergui-validate" "Error: Ghostscript choked on input file" "$ERRLOG"
+ rm -f -- "$ERRLOG"
+ exit 1
+ fi
+ rm -f -- "$ERRLOG"
+else
+ errlog "printergui-nogs" "Warning: Cannot validate file prior to printing: gs binary not found"
+fi
+
+# Try to print
+$PRINTERGUI "$USER" "$FILE"
+RET=$?
+if [ $RET -ne 0 -a $RET -ne 143 ]; then # SIGTERM results in 143, is sent by printpwgui
+ errlog "printergui-exec" "Error: printergui execution failed with exit code $RET"
+fi
+
+sleep 1
+rm -f -- "$FILE"
+
+exit $RET
+
diff --git a/core/modules/printergui/data/opt/openslx/scripts/systemd-printergui_preparation b/core/modules/printergui/data/opt/openslx/scripts/systemd-printergui_preparation
new file mode 100755
index 00000000..33a861e6
--- /dev/null
+++ b/core/modules/printergui/data/opt/openslx/scripts/systemd-printergui_preparation
@@ -0,0 +1,20 @@
+#!/bin/ash
+
+ERR=0
+SRCDIR=/usr/lib/cups/backend
+DESTDIR=/opt/openslx/cups/backend
+PRINTPWGUI=/opt/openslx/cups/printpwgui
+
+if [ ! -d "$DESTDIR" ]; then
+ mkdir -p "$DESTDIR" || exit 1
+fi
+
+mv "$SRCDIR"/* "$DESTDIR"
+
+cd "$SRCDIR"
+for i in "$DESTDIR"/*; do
+ ln -sf "$PRINTPWGUI" $(basename "$i")
+done
+
+exit 0
+
diff --git a/core/modules/printergui/module.build b/core/modules/printergui/module.build
new file mode 100644
index 00000000..a6f3ab17
--- /dev/null
+++ b/core/modules/printergui/module.build
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+fetch_source() {
+ git clone "${REQUIRED_GIT}" src
+ cd src
+ git checkout "$REQUIRED_COMMIT"
+ cd ..
+}
+
+build() {
+ local SRCDIR="${MODULE_WORK_DIR}/src/"
+ local DESTDIR="$MODULE_BUILD_DIR/opt/openslx/cups"
+
+ # first activate qt 4
+ activate_qt 4
+
+ mkdir -p "$DESTDIR"
+ cd "$DESTDIR" || perror "Could not cd to $DESTDIR!"
+ pinfo "Running cmake"
+ cmake "$SRCDIR/" || perror "'cmake' failed (e.g. not installed)."
+ pinfo "Running make"
+ make || perror "'make' failed."
+ chmod 0700 "$DESTDIR/printpwgui" # So picky cupsd won't drop privileges to lp
+
+}
+post_copy() {
+ :
+}
+
diff --git a/core/modules/printergui/module.conf b/core/modules/printergui/module.conf
new file mode 100644
index 00000000..39e64b16
--- /dev/null
+++ b/core/modules/printergui/module.conf
@@ -0,0 +1,7 @@
+REQUIRED_GIT="git://git.openslx.org/openslx-ng/printergui.git"
+REQUIRED_COMMIT="HEAD"
+REQUIRED_BINARIES="
+ printergui
+ printpwgui
+"
+
diff --git a/core/modules/printergui/module.conf.debian b/core/modules/printergui/module.conf.debian
new file mode 100644
index 00000000..54123003
--- /dev/null
+++ b/core/modules/printergui/module.conf.debian
@@ -0,0 +1,7 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libcups2-dev
+ libqt4-dev
+"
+REQUIRED_CONTENT_PACKAGES="
+ libcups2-dev
+"
diff --git a/core/modules/printergui/module.conf.fedora b/core/modules/printergui/module.conf.fedora
new file mode 100644
index 00000000..f1f55014
--- /dev/null
+++ b/core/modules/printergui/module.conf.fedora
@@ -0,0 +1,5 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cups-devel
+ qt-devel
+"
+
diff --git a/core/modules/printergui/module.conf.opensuse b/core/modules/printergui/module.conf.opensuse
new file mode 100644
index 00000000..478d0a71
--- /dev/null
+++ b/core/modules/printergui/module.conf.opensuse
@@ -0,0 +1,5 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cups-devel
+ libqt4-devel
+"
+
diff --git a/core/modules/printergui/module.conf.ubuntu b/core/modules/printergui/module.conf.ubuntu
new file mode 100644
index 00000000..73c89910
--- /dev/null
+++ b/core/modules/printergui/module.conf.ubuntu
@@ -0,0 +1,5 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libcups2-dev
+ libqt4-dev
+"
+
diff --git a/core/modules/pvs2/data/opt/openslx/scripts/setup-pvsmgr b/core/modules/pvs2/data/opt/openslx/scripts/setup-pvsmgr
new file mode 100755
index 00000000..dedb0995
--- /dev/null
+++ b/core/modules/pvs2/data/opt/openslx/scripts/setup-pvsmgr
@@ -0,0 +1,4 @@
+#!/bin/ash
+
+openbox &
+exec /opt/openslx/bin/pvsmgr
diff --git a/core/modules/pvs2/data/opt/openslx/vmchooser/sessionstart.d/50-PVSclient b/core/modules/pvs2/data/opt/openslx/vmchooser/sessionstart.d/50-PVSclient
new file mode 100755
index 00000000..0ad739e0
--- /dev/null
+++ b/core/modules/pvs2/data/opt/openslx/vmchooser/sessionstart.d/50-PVSclient
@@ -0,0 +1,26 @@
+#!/bin/ash
+
+# SESSION_TYPE can be either 'VSESSION' or 'XSESSION' - currently not evaluated
+
+# detect session command of the PVS-Manager session by looking at the xsession file
+PVSMGR_SESSION_CMD=
+PVSMGR_XSESSION_FILE="pvs2mgr.desktop"
+# the second directory should not be needed, but lets be compatible with the old crap......
+for DIR in "/usr/share/xsessions" "/opt/openslx/xsessions/"; do
+ if [ -f "${DIR}/${PVSMGR_XSESSION_FILE}" ]; then
+ # extract the exact command string
+ PVSMGR_SESSION_CMD="$(grep -E "^Exec=.*$" "${DIR}/${PVSMGR_XSESSION_FILE}" |cut -c 6-)"
+ break
+ fi
+done
+if [ -n "${PVSMGR_SESSION_CMD}" ]; then
+ # do not start pvsclient if we are running the pvs manager session
+ [ "x${SESSION_CMD}" == "x${PVSMGR_SESSION_CMD}" ] && exit 0
+fi
+# If the ENV var PVS has been set by vmchooser start pvsclient
+if [ -n "$PVS_AUTO_CONNECT" -a "$PVS_AUTO_CONNECT" == "TRUE" ]; then
+ pvsclient --auto &
+else
+ pvsclient &
+fi
+exit 0
diff --git a/core/modules/pvs2/data/usr/share/xsessions/pvs2mgr.desktop b/core/modules/pvs2/data/usr/share/xsessions/pvs2mgr.desktop
new file mode 100755
index 00000000..3cd1be2c
--- /dev/null
+++ b/core/modules/pvs2/data/usr/share/xsessions/pvs2mgr.desktop
@@ -0,0 +1,7 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=PVS Steuerkonsole
+Exec=/opt/openslx/scripts/setup-pvsmgr
+TryExec=/opt/openslx/bin/pvsmgr
+Icon=
+Type=Application
diff --git a/core/modules/pvs2/module.build b/core/modules/pvs2/module.build
new file mode 100644
index 00000000..b7ccfa47
--- /dev/null
+++ b/core/modules/pvs2/module.build
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+fetch_source() {
+ git clone "${REQUIRED_GIT}" src
+}
+
+build() {
+
+ local SRCDIR="${MODULE_WORK_DIR}/src/"
+ local BUILDDIR="$SRCDIR/build/"
+ local DESTDIR="$MODULE_BUILD_DIR/opt/openslx/bin"
+
+ # first activate qt 4
+ activate_qt 4
+
+ mkdir -p "$DESTDIR" || perror "Could not mkdir $DESTDIR!"
+ mkdir -p "$BUILDDIR" || perror "Could not mkdir $BUILDDIR!"
+ cd "$BUILDDIR" || perror "Could not cd to $BUILDDIR!"
+
+ pinfo "Running cmake"
+ cmake .. || perror "'cmake ..' failed."
+ pinfo "Running make"
+ make || perror "'make' failed."
+ mv pvsmgr pvsclient $DESTDIR
+ cd - > /dev/null
+
+ # needed for copying REQUIRED_CONTENT_PACKAGES to build/
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+}
+post_copy() {
+ :
+}
diff --git a/core/modules/pvs2/module.conf b/core/modules/pvs2/module.conf
new file mode 100644
index 00000000..9ef50afd
--- /dev/null
+++ b/core/modules/pvs2/module.conf
@@ -0,0 +1,13 @@
+REQUIRED_GIT="git://git.openslx.org/pvs2.git"
+REQUIRED_BINARIES="
+ pvsmgr
+ pvsclient
+"
+REQUIRED_LIBRARIES="
+"
+REQUIRED_SYSTEM_FILES="
+"
+REQUIRED_MODULES="
+ x11vnc
+"
+# TODO add libraries
diff --git a/core/modules/pvs2/module.conf.debian b/core/modules/pvs2/module.conf.debian
new file mode 100644
index 00000000..f031a225
--- /dev/null
+++ b/core/modules/pvs2/module.conf.debian
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+libqt4-dev
+libvncserver-dev
+"
+REQUIRED_CONTENT_PACKAGES="
+"
diff --git a/core/modules/pvs2/module.conf.fedora b/core/modules/pvs2/module.conf.fedora
new file mode 100644
index 00000000..6d2cd0f6
--- /dev/null
+++ b/core/modules/pvs2/module.conf.fedora
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ qt-devel
+ libvncserver-devel
+"
+REQUIRED_CONTENT_PACKAGES="
+"
diff --git a/core/modules/pvs2/module.conf.opensuse b/core/modules/pvs2/module.conf.opensuse
new file mode 100644
index 00000000..aedc0d96
--- /dev/null
+++ b/core/modules/pvs2/module.conf.opensuse
@@ -0,0 +1,14 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libqt4-devel
+ LibVNCServer-devel
+"
+
+REQUIRED_CONTENT_PACKAGES="
+ libqt4
+"
+
+REQUIRED_DIRECTORIES="
+ /usr/$LIB64/
+"
+
+# libqt4-svg
diff --git a/core/modules/pvs2/module.conf.ubuntu b/core/modules/pvs2/module.conf.ubuntu
new file mode 100644
index 00000000..4dcf2794
--- /dev/null
+++ b/core/modules/pvs2/module.conf.ubuntu
@@ -0,0 +1,11 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libqt4-dev
+ libvncserver-dev
+"
+REQUIRED_CONTENT_PACKAGES="
+ libqt4-svg
+ libqtgui4
+"
+REQUIRED_DIRECTORIES="
+ /usr/lib/
+"
diff --git a/core/modules/qemukvm/data/addon-init b/core/modules/qemukvm/data/addon-init
new file mode 100755
index 00000000..cccc1e8a
--- /dev/null
+++ b/core/modules/qemukvm/data/addon-init
@@ -0,0 +1,8 @@
+#!/bin/ash
+
+systemctl daemon-reload
+systemctl start qemukvm.service
+
+# this seems to be necessary due to the misbehaviour of udevd
+# in view of the undetected ENV dev_type
+systemctl restart systemd-udevd
diff --git a/core/modules/qemukvm/data/etc/systemd/system/graphical.target.wants/qemukvm.service b/core/modules/qemukvm/data/etc/systemd/system/graphical.target.wants/qemukvm.service
new file mode 120000
index 00000000..89d8afbf
--- /dev/null
+++ b/core/modules/qemukvm/data/etc/systemd/system/graphical.target.wants/qemukvm.service
@@ -0,0 +1 @@
+../qemukvm.service \ No newline at end of file
diff --git a/core/modules/qemukvm/data/etc/systemd/system/qemukvm.service b/core/modules/qemukvm/data/etc/systemd/system/qemukvm.service
new file mode 100644
index 00000000..8faf5d06
--- /dev/null
+++ b/core/modules/qemukvm/data/etc/systemd/system/qemukvm.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Sets up the virtual box environment
+Requires=vmchooser.service
+After=vmchooser.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-qemukvm_env start
diff --git a/core/modules/qemukvm/data/opt/openslx/scripts/systemd-qemukvm_env b/core/modules/qemukvm/data/opt/openslx/scripts/systemd-qemukvm_env
new file mode 100644
index 00000000..e19ae1ee
--- /dev/null
+++ b/core/modules/qemukvm/data/opt/openslx/scripts/systemd-qemukvm_env
@@ -0,0 +1,33 @@
+#!/bin/ash
+# -----------------------------------------------------------------------------
+# Copyright (c) 2013 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# systemd-qemukvm_env
+# - This is the preparation script for the configuration of Linux Qemu/KVM.
+################################################################################
+
+
+modprobe kvm
+modprobe kvm_amd
+modprobe kvm_intel
+
+# check for Linux kvm modules (if required at all)
+
+lsmod |grep kvm || slxlog "qemukvm-modules" "Cannot find any kvm kernel module(s)"
+
+cat >> /etc/sudoers << EOF
+# allow to start and stop kvm services / load-/unload kvm modules
+ALL ALL=NOPASSWD: /opt/openslx/sbin/tunctl -t kvmnet*
+ALL ALL=NOPASSWD: /opt/openslx/sbin/tunctl -d kvmnet*
+ALL ALL=NOPASSWD: /opt/openslx/sbin/brctl addif br0 kvmnet*
+ALL ALL=NOPASSWD: /opt/openslx/bin/ip link set dev kvmnet* *
+EOF
+
diff --git a/core/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include b/core/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include
new file mode 100644
index 00000000..29360159
--- /dev/null
+++ b/core/modules/qemukvm/data/opt/openslx/vmchooser/qemukvm/run-virt.include
@@ -0,0 +1,245 @@
+# -----------------------------------------------------------------------------
+# Copyright (c) 2009..2013 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# run-virt.include
+# - Include script for running the QEMU/Linux KVM virtual machine on an
+# OpenSLX client via the run-virt.sh or run-vmgrid.sh
+################################################################################
+
+################################################################################
+### Script functions
+################################################################################
+
+setup_if ()
+{
+ kvmdev=$1
+ hostdev=$2
+ sudo /opt/openslx/rootfs/sbin/tunctl -t ${kvmdev} -u ${USER} >/dev/null 2>&1
+ sudo /opt/openslx/rootfs/bin/ip link set dev ${kvmdev} up
+ sudo /opt/openslx/rootfs/usr/sbin/brctl addif ${hostdev} ${kvmdev}
+}
+
+################################################################################
+### Declaration of default variables
+################################################################################
+
+VMCHOOSERQK="/opt/openslx/vmchooser/${self}"
+# create TMPDIR for all users
+mkdir -m 1777 /tmp/${self} 2>/dev/null
+# TMPDIR
+QKTMPDIR="/tmp/${self}/${USER}/${VM_ID}"
+# define dirs and files which can be removed after exit, be carefull!
+RMDIRS="${QKTMPDIR}"
+rm -rf ${RMDIRS} 2>/dev/null
+mkdir -m 1777 -p ${QKTMPDIR} 2>/dev/null
+# vmpath is the path to the vm, here an image (img|qcow*|vmdk)
+diskfile=${vmpath}
+
+# check the file type
+if echo ${imgname} | grep -iE "img|qcow|vmdk" >/dev/null 2>&1; then
+ imgtype=$(echo ${imgname##*.} | tr "[a-z]" "[A-Z]")
+else
+ writelog "${imgname} is not a valid image type (img|qcow*|vmdk), exiting!"
+ exit 1
+fi
+
+# set the emulator/virtualization options for various operating systems
+sound="es1370"
+case "${vmostype}" in
+ beos*)
+ VIRTCMDOPTS="qemu-system-i386 -machine accel=tcg"
+ sound="sb16"
+ if [ "${totalmem}" -ge "1000" ]; then
+ forcemem=512
+ else
+ forcemem=256
+ fi
+ ;;
+ win3*|win*3*|Win*3*)
+ VIRTCMDOPTS="qemu-system-i386 -machine accel=tcg"
+ sound="sb16"
+ forcemem=32
+ ;;
+ win95*|Win*95)
+ VIRTCMDOPTS="qemu-system-i386 -machine accel=tcg"
+ forcemem=96
+ ;;
+ win98)
+ VIRTCMDOPTS="qemu-system-i386 -machine accel=tcg"
+ forcemem=256
+ ;;
+ winme*|windowsme*)
+ VIRTCMDOPTS="qemu-system-i386 -machine accel=tcg"
+ sound="ac97"
+ forcemem=384
+ ;;
+ winxp*64|windowsxp*64)
+ VIRTCMDOPTS="qemu-system-x86_64 -machine accel=kvm"
+ sound="ac97"
+ ;;
+esac
+
+# hot keys ALT+CTRL+SHIFT (does not work properly!?)
+#VIRTCMDOPTS="${VIRTCMDOPTS} -alt-grab"
+
+# display name, remove blanks because of cmdline problems
+displayname=$(echo ${displayname} | sed -e "s, ,-,g;s,(,[,g;s,),],g")
+VIRTCMDOPTS="${VIRTCMDOPTS} -name ${displayname}"
+
+writelog "Directories:"
+writelog "\tTMPDIR:\t\t\t$QKTMPDIR"
+writelog "Diskimage:"
+writelog "\tDisk type:\t\t$imgtype"
+writelog "\tDisk file:\t\t$diskfile"
+
+################################################################################
+### Hardware checks
+################################################################################
+
+# memory part equal to vmware plugin
+# percentage of memory to use for virtualbox in standard case
+if [ -n "${forcemem}" ]; then
+ mem="${forcemem}"
+else
+ permem=30
+ if [ "${totalmem}" -ge "1600" ]; then
+ permem=40
+ fi
+# # check if /tmp is on harddisk
+# if grep -qe "/dev/.* /tmp " /proc/mounts ; then
+# permem=60
+# id44="1"
+# #if [ "${totalmem}" -ge "2500" ]; then
+# #permem=40
+# #rmdir ${snapshotdir}
+# #snapshotdirold=${snapshotdir}
+# #snapshotdir=/dev/shm/${self}/${USER}/${VM_ID}
+# #mkdir -p ${snapshotdir}
+# #ln -sf ${snapshotdir} ${snapshotdirold}
+# #fi
+# fi
+ mem=$(expr ${totalmem} / 100 \* ${permem})
+ if [ "${id44}" = "1" ]; then
+ memhost=$(expr ${totalmem} - ${mem})
+ else
+ memhost=$(expr ${totalmem} - ${mem} - ${mem})
+ fi
+ # static first
+ permem=50
+ mem=$(expr ${totalmem} / 100 \* ${permem})
+ if [ "${mem}" -lt "256" ] || [ "${memhost}" -lt "256" ]; then
+ writelog "Memory out of range: ${mem} MB (guest) / ${memhost} MB (host)!"
+ writelog "Min. 256 MB for host and guest!"
+ exit 1
+ fi
+fi
+
+VIRTCMDOPTS="${VIRTCMDOPTS} -m ${mem}"
+
+# network adaptor alternatives: rtl8139, pcnet, e1000
+network_card=${network_card:=pcnet}
+VIRTCMDOPTS="${VIRTCMDOPTS} -net nic,macaddr=${macaddr},model=${network_card}"
+
+# define network kind and configure the interfaces
+case "${network_kind}" in
+ bridge*)
+ VIRTCMDOPTS="${VIRTCMDOPTS} -net tap,ifname=kvmnet0${VM_ID}"
+ setup_if kvmnet0${VM_ID} br0
+ POSTRUN="sudo /opt/openslx/rootfs/sbin/tunctl -d kvmnet0${VM_ID}"
+ ;;
+ nat)
+ VIRTCMDOPTS="${VIRTCMDOPTS} -net tap,ifname=kvmnet1${VM_ID}"
+ setup_if kvmnet1${VM_ID} nat1
+ POSTRUN="sudo /opt/openslx/rootfs/sbin/tunctl -d kvmnet1${VM_ID}"
+ ;;
+ host*)
+ VIRTCMDOPTS="${VIRTCMDOPTS} -net tap,ifname=kvmnet2${VM_ID}"
+ setup_if kvmnet2${VM_ID} vsw2
+ POSTRUN="sudo /opt/openslx/rootfs/sbin/tunctl -d kvmnet2${VM_ID}"
+ ;;
+ *)
+ network_kind="user"
+ VIRTCMDOPTS="${VIRTCMDOPTS} -net user"
+ ;;
+esac
+
+# translate boot, use if set else set to HardDisk
+if [ -n "${boot}" ]; then
+ case ${boot} in
+ n*) # usually support for a,c,d,n, stands for Floppy, HD, CD-ROM, Network
+ boot="n"
+ # TODO: does not work yet, can be removed if tap1 solution better
+ if [ "${network_kind}" = "user" ] && [ -n "${virtualbox_tftpdir}" ]; then
+ VIRTCMDOPTS="${VIRTCMDOPTS},tftp=${virtualbox_tftpdir}"
+ fi
+ ;;
+ # later maybe c|disk|hd*|sd*) for HD and d|cd*) for CD-ROM
+ *)
+ boot="c"
+ ;;
+ esac
+else
+ boot="c"
+fi
+
+# external GUI port
+vncport="590${VM_ID}"
+
+# ide is expected default, test for the virtual disk image type should
+# be done while creating the runscripts ...
+ide="TRUE"
+hddrv="ide"
+
+# special feature for real and virtual floppy disks
+[ -n "${floppy_0}" ] && VIRTCMDOPTS="${VIRTCMDOPTS} -fda ${floppy_0}"
+VIRTCMDOPTS="${VIRTCMDOPTS} -fdb /opt/openslx/vmchooser/data/loopimg/fd.img"
+
+# add optical drive if available
+[ -n "${cdrom_0}" ] && VIRTCMDOPTS="${VIRTCMDOPTS} -cdrom ${cdrom_0}"
+
+# audio
+VIRTCMDOPTS="${VIRTCMDOPTS} -soundhw ${sound}"
+
+# serial
+[ "x${serial}" == "xttyS0" ] && VIRTCMDOPTS="${VIRTCMDOPTS} -serial /dev/ttyS0"
+
+writelog "Virtual Hardware:"
+writelog "\tGuest RAM:\t\t${mem} MB"
+# echo nur wenn memhost gesetzt
+[ -n "${memhost}" ] && writelog "\tHost RAM:\t\t${memhost} MB"
+writelog "\tMAC address:\t\t$macaddr"
+writelog "\tNetwork card:\t\t${network_card}"
+writelog "\tNetwork kind:\t\t${network_kind}"
+writelog "\tCD-ROM1:\t${cdrom0}"
+#writelog "\tCD-ROM2:\t${cdrom1}"
+writelog "\tFloppy_A:\t${floppy_0}"
+writelog "\tFloppy_B:\t/opt/openslx/vmchooser/data/loopimg/fd.img"
+#writelog "\tShared Folders 'home':\t/home/${USER}"
+
+################################################################################
+### finally set env for run-virt.sh
+################################################################################
+
+# using snapshots
+VIRTCMDOPTS="${VIRTCMDOPTS} -snapshot"
+
+# TODO: boot als var, -boot n, tftp...
+VIRTCMDOPTS="${VIRTCMDOPTS} -boot c"
+
+# set headless mode
+# define first, you do not want VIRTCMDOPTS from graphical start
+VIRTCMDHL=${VIRTCMD}
+VIRTCMDOPTSHL="${VIRTCMDOPTS} -nographic ${diskfile}"
+
+# graphical start
+# vga std/cirrus/vmware?
+#VIRTCMDOPTS="${VIRTCMDOPTS} -vga std -full-screen ${diskfile}"
+VIRTCMDOPTS="${VIRTCMDOPTS} ${diskfile}"
diff --git a/core/modules/qemukvm/module.build b/core/modules/qemukvm/module.build
new file mode 100644
index 00000000..6d8ad7be
--- /dev/null
+++ b/core/modules/qemukvm/module.build
@@ -0,0 +1,16 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+ list_packet_files >> "$COPYLIST"
+
+
+ tarcopy "$(cat "${COPYLIST}" | sort -u)" "${MODULE_BUILD_DIR}"
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/qemukvm/module.conf b/core/modules/qemukvm/module.conf
new file mode 100644
index 00000000..32df73a5
--- /dev/null
+++ b/core/modules/qemukvm/module.conf
@@ -0,0 +1,11 @@
+REQUIRED_DIRECTORIES="
+ /etc
+ /lib
+ /usr/bin
+ /usr/sbin
+ /usr/lib
+ /usr/share/lintian
+ /usr/share/qemu
+ /usr/share/seabios
+ /usr/share/vgabios
+"
diff --git a/core/modules/qemukvm/module.conf.ubuntu b/core/modules/qemukvm/module.conf.ubuntu
new file mode 100644
index 00000000..d0fdc5f3
--- /dev/null
+++ b/core/modules/qemukvm/module.conf.ubuntu
@@ -0,0 +1,37 @@
+REQUIRED_INSTALLED_PACKAGES="
+ qemu
+ qemu-kvm
+"
+
+REQUIRED_CONTENT_PACKAGES="
+ qemu
+ qemu-kvm
+ ipxe-qemu
+ qemu-keymaps
+ qemu-system
+ qemu-system-arm
+ qemu-system-common
+ qemu-system-mips
+ qemu-system-misc
+ qemu-system-ppc
+ qemu-system-sparc
+ qemu-system-x86
+ qemu-user
+ qemu-utils
+ seabios
+ vgabios
+ cpu-checker
+ kvm-ipxe
+ libaio1
+ libboost-thread1.49.0
+ libfdt1
+ librados2
+ librbd1
+ libsdl1.2debian
+ libseccomp1
+ libspice-server1
+ libxen-4.2
+ libxenstore3.0
+ msr-tools
+ sharutils
+"
diff --git a/core/modules/redsocks/data/etc/redsocks.conf b/core/modules/redsocks/data/etc/redsocks.conf
new file mode 100644
index 00000000..db3a7f2a
--- /dev/null
+++ b/core/modules/redsocks/data/etc/redsocks.conf
@@ -0,0 +1,56 @@
+base {
+ // debug: connection progress & client list on SIGUSR1
+ log_debug = off;
+
+ // info: start and end of client session
+ log_info = off;
+
+ /* possible `log' values are:
+ * stderr
+ * "file:/path/to/file"
+ * syslog:FACILITY facility is any of "daemon", "local0"..."local7"
+ */
+ log = "file:/run/redsocks/redsocks.log";
+
+ // detach from console
+ daemon = on;
+
+ /* Change uid, gid and root directory, these options require root
+ * privilegies on startup.
+ * Note, your chroot may requre /etc/localtime if you write log to syslog.
+ * Log is opened before chroot & uid changing.
+ */
+ // user = nobody;
+ // group = nogroup;
+ // chroot = "/var/chroot";
+
+ /* possible `redirector' values are:
+ * iptables - for Linux
+ * ipf - for FreeBSD
+ * pf - for OpenBSD
+ * generic - some generic redirector that MAY work
+ */
+ redirector = iptables;
+}
+
+redsocks {
+ /* `local_ip' defaults to 127.0.0.1 for security reasons,
+ * use 0.0.0.0 if you want to listen on every interface.
+ * `local_*' are used as port to redirect to.
+ */
+ local_ip = 0.0.0.0;
+ local_port = 12345;
+
+ // `ip' and `port' are IP and tcp-port of proxy-server
+ ip = %%PROXY_IP%%;
+ port = %%PROXY_PORT%%;
+
+
+ // known types: socks4, socks5, http-connect, http-relay
+ // type = http-connect;
+ type = %%PROXY_TYPE%%;
+
+ // login = "foobar";
+ // password = "baz";
+}
+
diff --git a/core/modules/redsocks/data/etc/systemd/system/basic.target.wants/setup-proxy.service b/core/modules/redsocks/data/etc/systemd/system/basic.target.wants/setup-proxy.service
new file mode 120000
index 00000000..0da8d078
--- /dev/null
+++ b/core/modules/redsocks/data/etc/systemd/system/basic.target.wants/setup-proxy.service
@@ -0,0 +1 @@
+../setup-proxy.service \ No newline at end of file
diff --git a/core/modules/redsocks/data/etc/systemd/system/redsocks.service b/core/modules/redsocks/data/etc/systemd/system/redsocks.service
new file mode 100644
index 00000000..929c24ab
--- /dev/null
+++ b/core/modules/redsocks/data/etc/systemd/system/redsocks.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Transparent redirector of any TCP connection to proxy using your firewall
+DefaultDependencies=no
+
+[Service]
+Type=forking
+User=redsocks
+PIDFile=/run/redsocks/redsocks.pid
+ExecStart=/sbin/redsocks -c /etc/redsocks.conf -p /run/redsocks/redsocks.pid
+ExecStopPost=/opt/openslx/bin/rm -f /run/redsocks/redsocks.pid
+ExecStopPost=/opt/openslx/bin/rm -f /opt/openslx/iptables/rules.d/10-redoscks-proxy
+Restart=on-abort
diff --git a/core/modules/redsocks/data/etc/systemd/system/setup-proxy.service b/core/modules/redsocks/data/etc/systemd/system/setup-proxy.service
new file mode 100644
index 00000000..54052425
--- /dev/null
+++ b/core/modules/redsocks/data/etc/systemd/system/setup-proxy.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Proxy setup detection
+Before=shutdown.target
+DefaultDependencies=no
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-setup_proxy
+RemainAfterExit=yes
diff --git a/core/modules/redsocks/data/opt/openslx/scripts/systemd-setup_proxy b/core/modules/redsocks/data/opt/openslx/scripts/systemd-setup_proxy
new file mode 100755
index 00000000..97ef8225
--- /dev/null
+++ b/core/modules/redsocks/data/opt/openslx/scripts/systemd-setup_proxy
@@ -0,0 +1,65 @@
+#!/bin/bash
+# Needs full bash
+
+for wait in 1 1 2 3 4 6 8 10 end; do
+ grep '^#_RCONFIG_TAG$' /opt/openslx/config > /dev/null && echo "Config found!" && break
+ [ "$wait" == "end" ] && echo "Giving up!" && exit 1
+ echo "No config yet..."
+ sleep $wait
+done
+
+. /opt/openslx/config || echo "Error sourcing config for setup_proxy"
+
+[ -z "$SLX_PROXY_MODE" -o "x$SLX_PROXY_MODE" == "xoff" ] && echo "proxy mode disabled." && exit 0
+
+PROXY=off
+if [ "$SLX_PROXY_MODE" == "on" ]; then
+ PROXY=on
+elif [ "$SLX_PROXY_MODE" == "auto" -a -n "$SLX_PXE_CLIENT_IP" ]; then
+ # auto detection: check if it is actually needed
+ RET=$(curl -m 2 -s http://www.google.de/ | grep -o google | wc -l)
+ if [ $RET -lt 20 ]; then
+ sleep 4
+ RET=$(curl -m 5 -s http://www.google.de/ | grep -o google | wc -l)
+ fi
+ [ $RET -gt 20 ] && echo "Auto detect: Internet is reachable without proxy." && exit 0
+ PROXY=on
+fi
+
+[ "$PROXY" == "off" ] && echo "Proxy mode not required." && exit 0
+echo "Setting up transparent proxying via $SLX_PROXY_IP"
+
+sed -i "s/%%PROXY_IP%%/$SLX_PROXY_IP/g;s/%%PROXY_PORT%%/$SLX_PROXY_PORT/g;s/%%PROXY_TYPE%%/$SLX_PROXY_TYPE/g" /etc/redsocks.conf
+
+mkdir -p /run/redsocks
+chown redsocks:redsocks /run/redsocks
+systemctl start redsocks
+
+cat > "/opt/openslx/iptables/rules.d/10-redoscks-proxy" <<HEREDOCBROWN
+#!/bin/ash
+. /opt/openslx/config
+
+iptables -t nat -N REDSOCKS 2>/dev/null
+iptables -t nat -F REDSOCKS
+iptables -t nat -A REDSOCKS -d "\$SLX_PROXY_IP" -j RETURN
+iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
+iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
+iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
+iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
+iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
+iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
+iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
+iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
+if [ -n "\$SLX_PROXY_BLACKLIST" ]; then
+ for ADDR in \$SLX_PROXY_BLACKLIST; do
+ iptables -t nat -A REDSOCKS -d "\$ADDR" -j RETURN
+ done
+fi
+iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-port 12345
+iptables -t nat -A PREROUTING -i nat1 -p tcp -j REDSOCKS
+iptables -t nat -A OUTPUT -o br0 -p tcp -j REDSOCKS
+#iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
+iptables -A INPUT -i br0 -p tcp --dport 12345 -j DROP
+HEREDOCBROWN
+chmod +x "/opt/openslx/iptables/rules.d/10-redoscks-proxy"
+
diff --git a/core/modules/redsocks/module.build b/core/modules/redsocks/module.build
new file mode 100644
index 00000000..8c5c4e84
--- /dev/null
+++ b/core/modules/redsocks/module.build
@@ -0,0 +1,24 @@
+#tool/distro specific functions for fetching, building and installing dependencies
+
+
+fetch_source () {
+ mkdir -p src
+ cd src || perror "Could not cd to src"
+ if [ ! -d "redsocks" ]; then
+ git clone "$REQUIRED_GIT" "redsocks" || perror "Could not clone redoscks from github"
+ fi
+ cd redsocks || perror "Could not cd to src/redsocks"
+ git checkout "$REQUIRED_REVISION" || perror "Could not checkout revision $REQUIRED_REVISION"
+}
+
+build () {
+ cd "$MODULE_WORK_DIR/src/redsocks" || perror "src/redsocks not found"
+ make || perror "make failed."
+ mkdir -p "$MODULE_BUILD_DIR/sbin"
+ cp "redsocks" "$MODULE_BUILD_DIR/sbin/" || perror "Could not copy redsocks binary to build dir"
+}
+
+post_copy() {
+ add_user redsocks
+}
+
diff --git a/core/modules/redsocks/module.conf b/core/modules/redsocks/module.conf
new file mode 100644
index 00000000..62c15c70
--- /dev/null
+++ b/core/modules/redsocks/module.conf
@@ -0,0 +1,6 @@
+REQUIRED_GIT="git://github.com/darkk/redsocks.git"
+REQUIRED_REVISION="2e3f648809e27cc19cb7a8702f19b553a7ef9a81"
+REQUIRED_BINARIES="
+ redsocks
+"
+
diff --git a/core/modules/redsocks/module.conf.debian b/core/modules/redsocks/module.conf.debian
new file mode 100644
index 00000000..da41b04e
--- /dev/null
+++ b/core/modules/redsocks/module.conf.debian
@@ -0,0 +1,3 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libevent-dev
+"
diff --git a/core/modules/redsocks/module.conf.fedora b/core/modules/redsocks/module.conf.fedora
new file mode 100644
index 00000000..fcc0fb45
--- /dev/null
+++ b/core/modules/redsocks/module.conf.fedora
@@ -0,0 +1,3 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libevent-devel
+"
diff --git a/core/modules/redsocks/module.conf.opensuse b/core/modules/redsocks/module.conf.opensuse
new file mode 100644
index 00000000..fcc0fb45
--- /dev/null
+++ b/core/modules/redsocks/module.conf.opensuse
@@ -0,0 +1,3 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libevent-devel
+"
diff --git a/core/modules/redsocks/module.conf.ubuntu b/core/modules/redsocks/module.conf.ubuntu
new file mode 100644
index 00000000..da41b04e
--- /dev/null
+++ b/core/modules/redsocks/module.conf.ubuntu
@@ -0,0 +1,3 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libevent-dev
+"
diff --git a/core/modules/rsyslogd/data/etc/rsyslog.conf b/core/modules/rsyslogd/data/etc/rsyslog.conf
new file mode 100644
index 00000000..65b4db88
--- /dev/null
+++ b/core/modules/rsyslogd/data/etc/rsyslog.conf
@@ -0,0 +1,84 @@
+# /etc/rsyslog.conf Configuration file for rsyslogd.
+#
+# For more information see
+# /usr/share/doc/rsyslog/html/rsyslog_conf.html
+#
+# First some standard logfiles. Log by facility.
+#
+
+$ModLoad imuxsock # provides support for local system logging
+$ModLoad imklog # provides kernel logging support (previously done by rklogd)
+$ModLoad immark
+$MarkMessagePeriod 3600
+$RepeatedMsgReduction on
+
+
+if ( \
+ /* kernel up to warning except of firewall */ \
+ ($syslogfacility-text == 'kern') and \
+ ($syslogseverity <= 4 /* warning */ ) and not \
+ ($msg contains 'IN=' and $msg contains 'OUT=') \
+ ) or ( \
+ /* up to errors except of facility authpriv */ \
+ ($syslogseverity <= 3 /* errors */ ) and not \
+ ($syslogfacility-text == 'authpriv') \
+ ) \
+then /dev/tty10
+
+
+
+auth,authpriv.* /var/log/auth.log
+*.*;auth,authpriv.none -/var/log/syslog
+#cron.* /var/log/cron.log
+daemon.* -/var/log/daemon.log
+kern.* -/var/log/kern.log
+lpr.* -/var/log/lpr.log
+mail.* -/var/log/mail.log
+user.* -/var/log/user.log
+#
+# Logging for the mail system. Split it up so that
+# it is easy to write scripts to parse these files.
+#
+mail.info -/var/log/mail.info
+mail.warn -/var/log/mail.warn
+mail.err /var/log/mail.err
+#
+# Logging for INN news system
+#
+news.crit /var/log/news/news.crit
+news.err /var/log/news/news.err
+news.notice -/var/log/news/news.notice
+#
+# Some `catch-all' logfiles.
+#
+*.=debug;\
+ auth,authpriv.none;\
+ news.none;mail.none -/var/log/debug
+*.=info;*.=notice;*.=warn;\
+ auth,authpriv.none;\
+ cron,daemon.none;\
+ mail,news.none -/var/log/messages
+#
+# Emergencies are sent to everybody logged in.
+#
+*.emerg *
+#
+# I like to have messages displayed on the console, but only on a virtual
+# console I usually leave idle.
+#
+#daemon,mail.*;\
+# news.=crit;news.=err;news.=notice;\
+# *.=debug;*.=info;\
+# *.=notice;*.=warn /dev/tty8
+# The named pipe /dev/xconsole is for the `xconsole' utility. To use it,
+# you must invoke `xconsole' with the `-file' option:
+#
+# $ xconsole -file /dev/xconsole [...]
+#
+# NOTE: adjust the list below, or you'll go crazy if you have a reasonably
+# busy site..
+#
+daemon.*;mail.*;\
+ news.err;\
+ *.=debug;*.=info;\
+ *.=notice;*.=warn |/dev/tty11
diff --git a/core/modules/rsyslogd/module.build b/core/modules/rsyslogd/module.build
new file mode 100644
index 00000000..c35d07b7
--- /dev/null
+++ b/core/modules/rsyslogd/module.build
@@ -0,0 +1,34 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+
+ return 0
+}
+
+post_copy() {
+
+
+ # pwd = module's build dir
+ mkdir -p "${TARGET_BUILD_DIR}"/var/spool/rsyslog
+
+ local RSL="$(find /usr/lib/ /lib/ -name rsyslog.service | head -1)"
+ [ -z "$RSL" -o ! -e "$RSL" ] && perror "rsyslog.service not found on vorlage"
+ [ ! -d "$TARGET_BUILD_DIR/etc/systemd/system" ] && mkdir -p "$TARGET_BUILD_DIR/etc/systemd/system"
+ cp -L "$RSL" "$TARGET_BUILD_DIR/etc/systemd/system/"
+ sed -i 's/\/bin\/systemctl/-\/usr\/bin\/systemctl/g' "${TARGET_BUILD_DIR}"/etc/systemd/system/rsyslog.service
+ sed -i 's/^Before=udev/#&/' "${TARGET_BUILD_DIR}"/etc/systemd/system/rsyslog.service
+
+ # activate the service
+ ln -sf rsyslog.service "${TARGET_BUILD_DIR}"/etc/systemd/system/syslog.service
+ [ ! -d "${TARGET_BUILD_DIR}"/etc/systemd/system/basic.target.wants ] && mkdir -p "${TARGET_BUILD_DIR}"/etc/systemd/system/basic.target.wants
+ ln -sf ../syslog.service "${TARGET_BUILD_DIR}"/etc/systemd/system/basic.target.wants/syslog.service
+ # TODO: more checks
+ sed -i.bak '/^After\=var-run.mount/d;/^Requires\=var-run.mount/d;/^Before\=syslog.target/d' "$TARGET_BUILD_DIR/etc/systemd/system/rsyslog.service"
+}
diff --git a/core/modules/rsyslogd/module.conf b/core/modules/rsyslogd/module.conf
new file mode 100644
index 00000000..207f0a1d
--- /dev/null
+++ b/core/modules/rsyslogd/module.conf
@@ -0,0 +1,9 @@
+REQUIRED_BINARIES="
+ rsyslogd
+"
+REQUIRED_FILES="
+ /etc/rsyslog.conf
+"
+REQUIRED_DIRECTORIES="
+ /usr/$LIB64/rsyslog
+"
diff --git a/core/modules/rsyslogd/module.conf.centos b/core/modules/rsyslogd/module.conf.centos
new file mode 100644
index 00000000..6f3cb891
--- /dev/null
+++ b/core/modules/rsyslogd/module.conf.centos
@@ -0,0 +1,3 @@
+REQUIRED_CONTENT_PACKAGES="
+ rsyslog
+"
diff --git a/core/modules/rsyslogd/module.conf.debian b/core/modules/rsyslogd/module.conf.debian
new file mode 100644
index 00000000..6f3cb891
--- /dev/null
+++ b/core/modules/rsyslogd/module.conf.debian
@@ -0,0 +1,3 @@
+REQUIRED_CONTENT_PACKAGES="
+ rsyslog
+"
diff --git a/core/modules/rsyslogd/module.conf.fedora b/core/modules/rsyslogd/module.conf.fedora
new file mode 100644
index 00000000..6f3cb891
--- /dev/null
+++ b/core/modules/rsyslogd/module.conf.fedora
@@ -0,0 +1,3 @@
+REQUIRED_CONTENT_PACKAGES="
+ rsyslog
+"
diff --git a/core/modules/rsyslogd/module.conf.opensuse b/core/modules/rsyslogd/module.conf.opensuse
new file mode 100644
index 00000000..6d7a3c99
--- /dev/null
+++ b/core/modules/rsyslogd/module.conf.opensuse
@@ -0,0 +1,6 @@
+REQUIRED_CONTENT_PACKAGES="
+ rsyslog
+"
+REQUIRED_BINARIES+="
+ rsyslog-service-prepare
+"
diff --git a/core/modules/rsyslogd/module.conf.opensuse.13.2 b/core/modules/rsyslogd/module.conf.opensuse.13.2
new file mode 100644
index 00000000..b1d7fd03
--- /dev/null
+++ b/core/modules/rsyslogd/module.conf.opensuse.13.2
@@ -0,0 +1,9 @@
+REQUIRED_CONTENT_PACKAGES="
+ rsyslog
+"
+REQUIRED_INSTALLED_PACKAGES="
+ rsyslog
+"
+REQUIRED_BINARIES+="
+ rsyslog-service-prepare
+"
diff --git a/core/modules/rsyslogd/module.conf.ubuntu b/core/modules/rsyslogd/module.conf.ubuntu
new file mode 100644
index 00000000..ac8df362
--- /dev/null
+++ b/core/modules/rsyslogd/module.conf.ubuntu
@@ -0,0 +1,4 @@
+REQUIRED_CONTENT_PACKAGES="
+ rsyslog
+"
+
diff --git a/core/modules/run-virt/compile b/core/modules/run-virt/compile
new file mode 100755
index 00000000..4db15686
--- /dev/null
+++ b/core/modules/run-virt/compile
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+rm -- winres.exe
+i686-w64-mingw32-gcc -std=c99 -Os -Wl,--subsystem,windows -o winres.exe winres.c -lole32 -luuid -lgdi32 #-lws2_32
+strip winres.exe && echo "Successfully created winres.exe"
diff --git a/core/modules/run-virt/data/etc/systemd/system/graphical.target.wants/run-virt-env.service b/core/modules/run-virt/data/etc/systemd/system/graphical.target.wants/run-virt-env.service
new file mode 120000
index 00000000..c47218eb
--- /dev/null
+++ b/core/modules/run-virt/data/etc/systemd/system/graphical.target.wants/run-virt-env.service
@@ -0,0 +1 @@
+../run-virt-env.service \ No newline at end of file
diff --git a/core/modules/run-virt/data/etc/systemd/system/mount-vm-store.service b/core/modules/run-virt/data/etc/systemd/system/mount-vm-store.service
new file mode 100644
index 00000000..ff801963
--- /dev/null
+++ b/core/modules/run-virt/data/etc/systemd/system/mount-vm-store.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Mount VM store per NFS
+After=network.target
+Requires=network.target
+DefaultDependencies=no
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-mount_vm_store
+RemainAfterExit=yes
diff --git a/core/modules/run-virt/data/etc/systemd/system/network.target.wants/mount-vm-store.service b/core/modules/run-virt/data/etc/systemd/system/network.target.wants/mount-vm-store.service
new file mode 120000
index 00000000..d6a88c27
--- /dev/null
+++ b/core/modules/run-virt/data/etc/systemd/system/network.target.wants/mount-vm-store.service
@@ -0,0 +1 @@
+../mount-vm-store.service \ No newline at end of file
diff --git a/core/modules/run-virt/data/etc/systemd/system/run-virt-env.service b/core/modules/run-virt/data/etc/systemd/system/run-virt-env.service
new file mode 100644
index 00000000..fee3e1c6
--- /dev/null
+++ b/core/modules/run-virt/data/etc/systemd/system/run-virt-env.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Sets up the virtualization environment
+Wants=graphical.target
+Before=graphical.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-run_virt_env
diff --git a/core/modules/run-virt/data/opt/openslx/bin/clc.bash b/core/modules/run-virt/data/opt/openslx/bin/clc.bash
new file mode 100755
index 00000000..ee198c51
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/bin/clc.bash
@@ -0,0 +1,307 @@
+#!/bin/bash
+# Needs full bash
+
+# region header
+
+# Copyright Torben Sickert 16.12.2012
+
+# License
+# This library written by Torben Sickert stand under a creative commons
+# naming 3.0 unported license.
+# see http://creativecommons.org/licenses/by/3.0/deed.de
+
+# vim: set tabstop=4 shiftwidth=4 expandtab:
+# vim: foldmethod=marker foldmarker=region,endregion:
+
+# Dependencies:
+
+# vmware or virtualbox
+
+# Notes:
+
+# USE "sudo bin/vmware-vmx --new-sn JJ237-G52E2-08X0C-C3306-0WCQ1"
+# To activate wmware workstation!
+
+# Abbreviation for "createLinkedClone".
+__NAME__='clc'
+
+# endregion
+
+# Provides the main module scope.
+function clc() {
+
+# region configuration
+
+ # region private properties
+
+ # region command line arguments
+
+ local _VERBOSE='no'
+ local _SUPPORTED_HYPERVISOR=('VMware' 'virtualBox')
+ # NOTE: This value will be determined automatically. If no hypervisor
+ # could be detected this value will be used as default.
+ # The first value from supported Machines is taken as default.
+ local _HYPERVISOR="$_SUPPORTED_HYPERVISOR"
+ local _PERSISTENT_SHORT_DESCRIPTION_SUFFIX=' --persistent--'
+
+ # endregion
+
+ local _STANDARD_OUTPUT=/dev/null
+ local _ERROR_OUTPUT=/dev/null
+ local _BASIC_IMAGE_CONFIGURATION_FILE_PATH=''
+ local _TARGET_PATH=''
+ local _CREATE_PERSISTENT_CONFIG='no'
+
+ # endregion
+
+# endregion
+
+# region functions
+
+ # region command line interface
+
+ # Prints a description about how to use this program.
+ function clcPrintUsageMessage() {
+ cat << EOF
+ $__NAME__ Generates a linked clone from given machine description file in
+ given target location.
+EOF
+ return $?
+ }
+
+ # Prints a description about how to use this program by providing examples.
+ function clcPrintUsageExamples() {
+ cat << EOF
+ # Getting a help message.
+ >>> $0 --help
+
+ # Creating a linked clone.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/
+
+ # Creating a linked clone in verbose mode.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose
+
+ # Creating a linked clone in verbose mode with debugging output.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose --debug
+
+ # Creating a linked clone in verbose mode with debugging output.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ -v -d
+EOF
+ return $?
+ }
+
+ # Prints descriptions about each available command line option.
+ function clcPrintCommandLineOptionDescriptions() {
+ # NOTE; All letters are used for short options.
+ cat << EOF
+ -h --help Shows this help message.
+
+ -v --verbose Tells you what is going on (default: "$_VERBOSE").
+
+ -d --debug Gives you any output from all tools which are used
+ (default: "$_DEBUG").
+
+ -c --create-persistent-config If set an xml file for persistent openslx
+ boot will be created (default: "$_CREATE_PERSISTENT_CONFIG").
+EOF
+ return $?
+ }
+
+ # Provides a help message for this module.
+ function clcPrintHelpMessage() {
+ echo -e \
+ "\nUsage: $0 BASIC_IMAGE_CONFIGURATION_FILE_PATH TARGET_PATH [options]\n" && \
+ clcPrintUsageMessage "$@" && \
+ echo -e '\nExamples:\n' && \
+ clcPrintUsageExamples "$@" && \
+ echo -e '\nOption descriptions:\n' && \
+ clcPrintCommandLineOptionDescriptions "$@" && \
+ echo && \
+ return $?
+ }
+
+ # Provides the command line interface and interactive questions.
+ function clcCommandLineInterface() {
+ while true; do
+ case "$1" in
+ -h|--help)
+ shift
+ clcPrintHelpMessage "$0"
+ exit 0
+ ;;
+ -v|--verbose)
+ shift
+ _VERBOSE='yes'
+ ;;
+ -d|--debug)
+ shift
+ _DEBUG='yes'
+ _STANDARD_OUTPUT=/dev/stdout
+ _ERROR_OUTPUT=/dev/stderr
+ ;;
+ -c|--create-persistent-config)
+ shift
+ _CREATE_PERSISTENT_CONFIG='yes'
+ ;;
+
+ '')
+ shift
+ break 2
+ ;;
+ *)
+ if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]]; then
+ _BASIC_IMAGE_CONFIGURATION_FILE_PATH="$1"
+ elif [[ ! "$_TARGET_PATH" ]]; then
+ _TARGET_PATH="$1"
+ else
+ clcLog 'critical' \
+ "Given argument: \"$1\" is not available." '\n'
+ clcPrintHelpMessage "$0"
+ return 1
+ fi
+ shift
+ ;;
+ esac
+ done
+ if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]] || \
+ [[ ! "$_TARGET_PATH" ]]; then
+ clcLog 'critical' \
+ "You have to provide a basic image configuration file and a destination path."
+ clcPrintHelpMessage "$0"
+ return 1
+ fi
+ local supportedVirtualMachine
+ for supportedVirtualMachine in ${_SUPPORTED_HYPERVISOR[*]}; do
+ if [[ "$(clcGetXMLValue 'virtualMachine' | \
+ grep --ignore-case "$supportedVirtualMachine")" ]]; then
+ _HYPERVISOR="$supportedVirtualMachine"
+ clcLog 'debug' "Detected \"$_HYPERVISOR\" as hypervisor."
+ break
+ fi
+ done
+ clcLog 'info' "Using \"$_HYPERVISOR\" as hypervisor." && \
+ return $?
+ }
+
+ # Grabs a value from currently loaded xml file.
+ function clcGetXMLValue() {
+ grep --ignore-case --only-matching "<$1 param=.*" \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" | awk -F '"' '{ print $2 }'
+ return $?
+ }
+
+ # Handles logging messages. Returns non zero and exit on log level error to
+ # support chaining the message into toolchain.
+ function clcLog() {
+ local loggingType='info'
+ local message="$1"
+ if [ "$2" ]; then
+ loggingType="$1"
+ message="$2"
+ fi
+ if [ "$_VERBOSE" == 'yes' ] || [ "$loggingType" == 'error' ] || \
+ [ "$loggingType" == 'critical' ]; then
+ if [ "$3" ]; then
+ echo -e -n "$3"
+ fi
+ echo -e "${loggingType}: $message"
+ fi
+ if [ "$loggingType" == 'error' ]; then
+ exit 1
+ fi
+ }
+
+ # endregion
+
+ # region tools
+
+ # Returns the minimal vmx vmware configuration file content to create a
+ # snapshot.
+ function clcGetTemporaryVMXContent() {
+ cat << EOF
+.encoding = "UTF-8"
+config.version = "8"
+virtualHW.version = "7"
+ide0:0.present = "TRUE"
+ide0:0.fileName = "$1"
+displayName = ""
+EOF
+ return $?
+ }
+
+ # Creates a snapshot from VMware generated virtual machine.
+ function clcCreateVMwareSnapshot() {
+ local temporaryConfigurationPath="$(mktemp --directory)/" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ local temporaryConfigurationFilePath="$(mktemp --suffix '.vmx')" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcGetTemporaryVMXContent "/var/lib/virt/vmware/$(clcGetXMLValue 'image_name')" \
+ 1>"$temporaryConfigurationFilePath" 2>"$_ERROR_OUTPUT" && \
+ mv "$temporaryConfigurationFilePath" "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Needed files generated in \"$temporaryConfigurationPath\" generated." && \
+ vmrun snapshot "$temporaryConfigurationPath"*.vmx \
+ persistentUserSnapshot 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ mv "$temporaryConfigurationPath"*.vmdk "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ local result=$?
+ if [[ "$_DEBUG" == 'no' ]]; then
+ rm --recursive "$temporaryConfigurationPath" 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT"
+ fi
+ return $result
+ }
+
+ # Creates a snapshot from virtualBox generated virtual machine.
+ function clcCreateVirtualBoxSnapshot() {
+ local temporaryConfigurationPath="$(mktemp --directory)" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ VBoxManage clonevm TODO ->(VMNAME) --snapshot base --options link \\
+ --basefolder "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ mv "${temporaryConfigurationPath}/Snapshots/"*.vmdk "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ rm --recursive "$temporaryConfigurationPath" 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ return $?
+ }
+
+ # Creates a persistent version of given config file.
+ function clcCreatePersistentConfig() {
+ cp "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" "$_TARGET_PATH" && \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ sed --in-place --regexp-extended \
+ "s/(< *short_description[^>]*param=\"[^\"]*)(\")/\\1$_PERSISTENT_SHORT_DESCRIPTION_SUFFIX\\2/g" \
+ "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ return $?
+ }
+
+ # endregion
+
+# endregion
+
+# region controller
+
+ clcCommandLineInterface "$@" || return $?
+ if [[ "$_CREATE_PERSISTENT_CONFIG" == 'yes' ]]; then
+ clcCreatePersistentConfig || \
+ clcLog 'error' 'Creating persitent config failed.'
+ else
+ "clcCreate${_HYPERVISOR}Snapshot" || \
+ clcLog 'error' 'Creating Linked Clone failed.'
+ fi
+ clcLog 'Program has successfully finished.' && \
+ return $?
+
+# endregion
+
+}
+
+# region footer
+
+if [[ "$0" == *"${__NAME__}.bash" ]]; then
+ "$__NAME__" "$@"
+fi
+
+# endregion
diff --git a/core/modules/run-virt/data/opt/openslx/iptables/rules.d/50-virt-nat1-masquerading b/core/modules/run-virt/data/opt/openslx/iptables/rules.d/50-virt-nat1-masquerading
new file mode 100755
index 00000000..b0909760
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/iptables/rules.d/50-virt-nat1-masquerading
@@ -0,0 +1,3 @@
+#!/bin/ash
+
+iptables -t nat -A POSTROUTING -o br0 -s 192.168.101.0/24 -j MASQUERADE
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc
new file mode 100644
index 00000000..8286bbaa
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/check_lpd.inc
@@ -0,0 +1,11 @@
+############################################
+# Include: Checking whether lpd is running #
+############################################
+
+# Check if tcpsvd is running. Do this down here so we do not check
+# immediately after trying to spawn it, as this could result in
+# success even if it's not really working.
+
+if ! kill -0 "$PID_LPD"; then
+ slxlog "virt-lpd" "Could not start tcpsvd/lpd for virtual machine session"
+fi
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_needed_files.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_needed_files.inc
new file mode 100644
index 00000000..fbb0bc70
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_needed_files.inc
@@ -0,0 +1,53 @@
+#################################################################
+# Include: Check for important files used by vmchooser_run-virt #
+#################################################################
+
+# WARNING: This is perhaps vestigial!
+
+filecheck() {
+ filecheck=$(LANG=us ls -lh ${diskfile} 2>&1)
+ writelog "Filecheck:\n${filecheck}\n"
+ noimage=$(echo ${filecheck} | grep -i "no such file or directory" | wc -l)
+ rightsfile=${diskfile}
+
+ # check if link
+ if [ -L "${diskfile}" ]; then
+ # take link target
+ rightsfile=$(ls -lh ${diskfile} 2>&1 | awk -F '-> *' '{print $2}')
+ rightsfile=${vmdir}/${rightsfile}
+ filecheck=$(LANG=us ls -lh ${rightsfile} 2>&1)
+ fi
+
+ # does file exist
+ if [ "${noimage}" -ge "1" ]; then
+ writelog "Virtual Machine Image Problem:\c "
+ writelog "\tThe image you've specified doesn't exist."
+ writelog "Filecheck says:\c "
+ writelog "\t\t${diskfile}:\n\t\t\tNo such file or directory"
+ writelog "Hint:\c "
+ writelog "\t\t\tCompare spelling of the image with your options.\n"
+ exit 1
+ fi
+ # readable by calling user
+ if ! [ -r "${diskfile}" >/dev/null 2>&1 \
+ -o -r "${diskfile}" >/dev/null 2>&1 ]; then
+ writelog "Vmware Image Problem:\c "
+ writelog "\tThe image you've specified has wrong rights."
+ writelog "Filecheck says:\t\t$(echo ${filecheck} \
+ | awk '{print $1" "$3" "$4}') ${rightsfile}"
+ writelog "Hint:\t\t\tChange rights with: chmod a+r ${rightsfile}\n"
+ exit 1
+ fi
+
+ # writable (for persistent-mode)?
+ if ! [ -w "${diskfile}" >/dev/null 2>&1 \
+ -o -w "${diskfile}" >/dev/null 2>&1 ] \
+ && [ "${np}" = "independent-persistent" ]; then
+ writelog "Vmware Image Problem:\c "
+ writelog "\tThe image you have specified has wrong rights."
+ writelog "Filecheck says:\t\t$(echo ${filecheck} \
+ | awk '{print $1" "$3" "$4}') ${rightsfile}"
+ writelog "Hint:\t\t\tUse nonpersistent-mode or change rights to rw\n"
+ exit 1
+ fi
+}
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_xml_sanity_legacy.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_xml_sanity_legacy.inc
new file mode 100644
index 00000000..d331e1af
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/check_runvirt_xml_sanity_legacy.inc
@@ -0,0 +1,23 @@
+#######################################################
+# Include: check xml file for sanity (legacy, old way #
+#######################################################
+
+# test if the xml file is valid
+if ! [ -r "${xmlfile}" ]; then
+ writelog "${xmlfile} not a readable XML file!"
+ slxlog "virt-nonreadable-xml" "XML file not readable: $xmlfile"
+ exit 1
+fi
+
+# test if XML file
+if ! grep -q '<?xml' "${xmlfile}"; then
+ writelog "Submitted configuration file ${xmlfile} seems to have wrong XML format"
+ slxlog "virt-invalid-xml" "Malformed XML file: $xmlfile" "$xmlfile"
+ exit 1
+fi
+
+# check for running in graphical environment otherwise no much use here
+if [ -z "$DISPLAY" ]; then
+ echo -e "\n\tStart only within a graphical desktop!\n"
+ exit 1
+fi
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc
new file mode 100644
index 00000000..11a21832
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/detect_legacy.inc
@@ -0,0 +1,33 @@
+########################################################
+# Include: Detect, whether runvirt runs in legacy mode #
+########################################################
+
+# Legacy mode: As runvirt has been before.
+# New mode: uuid in xml _and_ vmx given via http.
+
+writelog "Detecting current/legacy mode ..."
+
+# First, let's try to extract an imguuid from xmlfile:
+IMGUUID=$(grep -io '<uuid param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+
+writelog "IMGUUID extracted: $IMGUUID"
+
+if [ ! -n "$IMGUUID" ]; then # Keine uuid: Abbruch, Legacy
+ writelog "Could not extract an uuid param from ${xmlfile}. Triggering legacy mode."
+ LEGACY=: # No uuid; legacy.
+else
+ # Now getting template file:
+ if wget -O "$TMPDIR/$IMGUUID" "${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID}" 1>&2 2>/dev/null; then
+ writelog "wget ${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID} successful."
+ writelog "Triggering current (non-legacy) mode."
+ LEGACY= # both strings set: no legacy.
+ if [ ! -s "$TMPDIR/$IMGUUID" ]; then
+ LEGACY= # no legacy: server sent 0 byte file.
+ writelog "Server sent zero byte virtual machine description file. Retriggering legacy mode."
+ fi
+ else
+ writelog "wget ${SLX_VMCHOOSER_BASE_URL}/lecture/${IMGUUID}. Triggering legacy mode."
+ LEGACY=:
+ fi
+fi
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc
new file mode 100644
index 00000000..c3c6f7b3
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_dir_legacy.inc
@@ -0,0 +1,50 @@
+#########################################################
+# Include: Get xml file and directory (legacy, old way) #
+#########################################################
+
+## Added for persistent support.
+diskmode='nonpersistent'
+if [[ "$(grep --extended-regexp \
+ '< *short_description *param=".+ --persistent--"' "$1")" ]]; then
+ diskmode='persistent'
+ imageFilePath="$(grep -io '<image_path param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')"
+ [ -z "$imageFilePath" ] && imageFilePath="$(grep -io '<image_name param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')"
+ originalXMLFilePath="$(grep -io '<original_xml_file_path param=.*"' "$1" \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')"
+ originalImageFileName="$(grep -io '<image_name param=.*"' \
+ "$originalXMLFilePath" | sed -e "s/&.*;/; /g" | awk -F '"' \
+ '{ print $2 }')"
+ originalVMDKFilePath="$(dirname \
+ "$originalXMLFilePath")/${originalImageFileName}"
+ # Added to workaround path prefix coming from temporary generated xml file
+ # by vmchooser.
+ if [[ "$(grep --extended-regexp '^/tmp/tmp\.[^\/]+/' <<< \
+ "$imageFilePath")" ]]; then
+ imageFilePath=$(sed -r 's/^\/?tmp\/[^\/]+\///g' \
+ <<< "$imageFilePath")
+ sed -ir \
+ "s/(<image_name param=\")[^\"]*(\")/\\1$(sed -e \
+ 's/\\/\\\\/g' -e 's/\//\\\//g' -e \
+ 's/&/\\\&/g' <<< "$imageFilePath")\\2/g" "$1"
+ fi
+ # Create linked clone if not exists.
+ if [ ! -f "$imageFilePath" ]; then
+ mkdir -p "$(dirname "$imageFilePath")" && \
+ bash "$(dirname "$0")/vmchooser-clc" "$originalXMLFilePath" \
+ "$imageFilePath" --debug --verbose &>"${LOGFILE}"
+ fi
+fi
+
+# absolute or relative path?
+xmlfile=$1
+if ls "${xmlfile}" 2>/dev/null | grep '/' >/dev/null 2>&1; then
+ xmlpath=$(dirname "${xmlfile}")
+ xmlfile=$(basename "${xmlfile}")
+else
+ xmlpath=${vmchooser_xmlpath}
+fi
+# full path
+xmlfile="${xmlpath}/${xmlfile%.xml}.xml"
+
+DO_PROFILE="$(grep -c -E -i '<\s*profile\s*param="?(true|yes)"?' "$xmlfile")"
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc
new file mode 100644
index 00000000..b7ed648c
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables.inc
@@ -0,0 +1,103 @@
+###########################################
+# Include: Set hardware related variables #
+###########################################
+
+writelog "Starting configuration..."
+writelog "\tLogfile:\t\t${LOGFILE}"
+writelog "\t/tmp info:\t\t$(df -h | grep " /tmp$" | awk '{print $2}') \c"
+writelog "$(grep "/tmp " /proc/mounts | awk '{print $1" "$2" "$3" "$4}')"
+writelog "\tVM XML dir:\t\t$(dirname "${xmlfile}")"
+writelog "\tXML file:\t\t${xmlfile}"
+writelog "Enable 3D:\t\t${enable3d}"
+writelog "VM config:"
+
+# # Name of the virt image
+imgname=$(grep -io '<image_path param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+imgrelpath=$(grep -io '<image_name param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+# [ -z "$imgname" ] && imgname="${imgrelpath}"
+imgrelpath=${imgrelpath#/mnt/vmstore/}
+
+writelog "Virtual image file name: $imgname"
+
+# Imagename w/ full path
+if echo "${imgname}" | grep -q '^/'; then
+ imgpath="$(dirname "${imgname}")"
+ imgname="$(basename "${imgname}")"
+ vmpath="${imgpath}/${imgname}"
+ # If old vmchooser binary stuff
+ # We do not need folder name as it is already included by vmchooser
+elif echo "${xmlfile}" | grep -q '^/tmp/'; then
+ vmpath="$imgname"
+ imgname="$(basename "${imgname}")"
+ ## Added for persistent support.
+else
+ # Else use same path as xml
+ imgpath="${xmlpath}"
+ vmpath="${imgpath}/${imgname}"
+fi
+
+# If ${vm_name} not defined use ${xmlfile}
+vm_name="${vm_name:-${xmlfile%.xml}}"
+
+# Define vm_shortname since vm_name can be very long
+vm_shortname="$(basename "${xmlfile%.xml}" | sed -e "s, ,-,g")"
+
+# vm_name = displayname, define for old scripts
+displayname="${vm_name}"
+
+# image is for the following virtual machine
+xmlvirt=$(grep -o 'virtualmachine param=.*"' "${xmlfile}" \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
+
+# choose the proper virtualization/emulator plugin
+[ "x${xmlvirt}" != "x" -a "x${xmlvirt}" != "xqemukvm" -a "x${xmlvirt}" != "xvirtualbox" -a "x${xmlvirt}" != "xvmware" ] && xmlvirt="emufe"
+
+# Extracting OS type (vmostype) from xml file. We don't care here whether vmostype is empty, as then
+# it will yield the default entries later on.
+vmostype=$(grep -io '<os param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+
+# make a guess from the filename extension if ${xmlvirt} is empty
+# (not set within the XML file)
+# TODO: implement possibility to submit own configuration files
+if [ -z "${xmlvirt}" ] && [ -n "${additional_config}" ]; then
+ writelog "No virtual machine parameter defined in ${xmlfile}"
+ writelog "Trying to guess VM...\c"
+ case "$(cat ${additional_config} | tr \"[A-Z]\" \"[a-z]\")" in
+ *config.version*|*virtualhw.version*|*independent-nonpersistent*|*vmdk*)
+ xmlvirt="vmware"
+ ;;
+ *innotek*|*virtualbox*)
+ xmlvirt="virtualbox"
+ ;;
+ *qemu*|*kvm*)
+ xmlvirt="qemukvm"
+ ;;
+ *)
+ xmlvirt="none"
+ ;;
+ esac
+ elif [ -z "${xmlvirt}" ]; then
+ case "$(echo ${imgname##*.} | tr \"[A-Z]\" \"[a-z]\")" in
+ vmdk)
+ xmlvirt="vmware"
+ ;;
+ vbox|vdi)
+ xmlvirt="virtualbox"
+ ;;
+ qcow*)
+ xmlvirt="qemukvm"
+ ;;
+ *)
+ xmlvirt="emufe"
+ ;;
+ esac
+ writelog "result:\t${xmlvirt}"
+fi
+
+# Set redirects to 0, see vmgrid if you want to define some
+redirects=0
+
+writelog "\tVirtualization:\t\t$xmlvirt"
+writelog "\tVM name:\t\t$vm_name"
+writelog "\tVM short name:\t\t$vm_shortname"
+writelog "\tVM OS:\t\t$vmostype"
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables_legacy.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables_legacy.inc
new file mode 100644
index 00000000..3fdc06d2
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/get_xml_file_variables_legacy.inc
@@ -0,0 +1,120 @@
+###########################################
+# Include: Set hardware related variables #
+###########################################
+
+writelog "Starting configuration..."
+writelog "\tLogfile:\t\t${LOGFILE}"
+writelog "\t/tmp info:\t\t$(df -h | grep " /tmp$" | awk '{print $2}') \c"
+writelog "$(grep "/tmp " /proc/mounts | awk '{print $1" "$2" "$3" "$4}')"
+writelog "\tVM XML dir:\t\t$(dirname "${xmlfile}")"
+writelog "\tXML file:\t\t${xmlfile}"
+writelog "Enable 3D:\t\t${enable3d}"
+writelog "VM config:"
+
+# Name of the virt image
+imgname=$(grep -io '<image_path param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+imgrelpath=$(grep -io '<image_name param=.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+[ -z "$imgname" ] && imgname="${imgrelpath}"
+imgrelpath=${imgrelpath#/mnt/vmstore/}
+
+## Added for persistent support.
+if [[ "$userBranchFilePath" ]]; then
+ imgname="$userBranchFilePath"
+fi
+
+# Imagename w/ full path
+if echo "${imgname}" | grep -q '^/'; then
+ imgpath="$(dirname "${imgname}")"
+ imgname="$(basename "${imgname}")"
+ vmpath="${imgpath}/${imgname}"
+ # If old vmchooser binary stuff
+ # We do not need folder name as it is already included by vmchooser
+elif echo "${xmlfile}" | grep -q '^/tmp/'; then
+ vmpath="$imgname"
+ imgname="$(basename "${imgname}")"
+ ## Added for persistent support.
+elif [[ "$userBranchFilePath" ]]; then
+ vmpath="$userBranchFilePath"
+else
+ # Else use same path as xml
+ imgpath="${xmlpath}"
+ vmpath="${imgpath}/${imgname}"
+fi
+
+# Name of the virt machine, sed because of Windows formatting
+vm_name=$(grep -o 'short_description param=.*"' "${xmlfile}" \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
+
+# If ${vm_name} not defined use ${xmlfile}
+vm_name="${vm_name:-${xmlfile%.xml}}"
+
+# Define vm_shortname since vm_name can be very long
+vm_shortname="$(basename "${xmlfile%.xml}" | sed -e "s, ,-,g")"
+
+# vm_name = displayname, define for old scripts
+displayname="${vm_name}"
+
+# image is for the following virtual machine
+xmlvirt=$(grep -o 'virtualmachine param=.*"' "${xmlfile}" \
+ | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
+
+# choose the proper virtualization/emulator plugin
+[ "x${xmlvirt}" != "x" -a "x${xmlvirt}" != "xqemukvm" -a "x${xmlvirt}" != "xvirtualbox" -a "x${xmlvirt}" != "xvmware" ] && xmlvirt="emufe"
+
+# make a guess from the filename extension if ${xmlvirt} is empty
+# (not set within the XML file)
+# TODO: implement possibility to submit own configuration files
+if [ -z "${xmlvirt}" ] && [ -n "${additional_config}" ]; then
+ writelog "No virtual machine parameter defined in ${xmlfile}"
+ writelog "Trying to guess VM...\c"
+ case "$(cat ${additional_config} | tr \"[A-Z]\" \"[a-z]\")" in
+ *config.version*|*virtualhw.version*|*independent-nonpersistent*|*vmdk*)
+ xmlvirt="vmware"
+ ;;
+ *innotek*|*virtualbox*)
+ xmlvirt="virtualbox"
+ ;;
+ *qemu*|*kvm*)
+ xmlvirt="qemukvm"
+ ;;
+ *)
+ xmlvirt="none"
+ ;;
+ esac
+ elif [ -z "${xmlvirt}" ]; then
+ case "$(echo ${imgname##*.} | tr \"[A-Z]\" \"[a-z]\")" in
+ vmdk)
+ xmlvirt="vmware"
+ ;;
+ vbox|vdi)
+ xmlvirt="virtualbox"
+ ;;
+ qcow*)
+ xmlvirt="qemukvm"
+ ;;
+ *)
+ xmlvirt="emufe"
+ ;;
+ esac
+ writelog "result:\t${xmlvirt}"
+fi
+
+# Definition of the client system
+vmostype=$(grep -io '<os param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }' | tr "[A-Z]" "[a-z]")
+
+# Definition of the networking the client system is connected to
+network_kind=$(grep -io '<network param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }' | tr "[A-Z]" "[a-z]")
+network_card=$(grep -io '<netcard param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }'| tr "[A-Z]" "[a-z]")
+override_hddtype=$(grep -io '<hddtype param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }'| tr "[A-Z]" "[a-z]")
+
+# Set redirects to 0, see vmgrid if you want to define some
+redirects=0
+
+# Serial/parallel ports defined (e.g. "ttyS0" or "autodetect")
+serial=$(grep -io '<serialport param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }')
+parallel=$(grep -io '<parport param=.*"' "${xmlfile}" | awk -F '"' '{ print $2 }')
+
+writelog "\tVirtualization:\t\t$xmlvirt"
+writelog "\tVM name:\t\t$vm_name"
+writelog "\tVM short name:\t\t$vm_shortname"
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/print_runvirt_console_logo.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/print_runvirt_console_logo.inc
new file mode 100644
index 00000000..649cf956
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/print_runvirt_console_logo.inc
@@ -0,0 +1,12 @@
+#######################################
+# Include: Print Logo for console use #
+#######################################
+
+cat <<EOL
+ __ __
+ .----.--.--.-----.___.--.--.|__|.----.| |_
+ | _| | | |___| | || || _|| _|
+ |__| |_____|__|__| \___/ |__||__| |____|
+ OpenSLX virtual machine environment preparation script ...
+
+EOL
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables.inc
new file mode 100644
index 00000000..400c1bf4
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables.inc
@@ -0,0 +1,88 @@
+###########################################
+# Include: Set hardware related variables #
+###########################################
+
+# take last two digits of current pid...
+VM_ID=$(expr substr $$ $(expr ${#$} - 1) 2)
+
+# Make sure cpu_cores is not empty
+cpu_cores=${cpu_cores:-"1"}
+
+# Amount of memory for the VM. Be generous if diff is written to HDD
+if mount | grep -q '^/dev/sd.*on.*/tmp'; then
+ reserve=20
+ min=768
+ max=1536
+else
+ reserve=65
+ min=768
+ max=8192
+fi
+
+# Calculate absulute amount of RAM that should stay available to the host
+reserve="$[ ( $totalmem * $reserve ) / 100 ]"
+# Respect some upper and lower bounds for the host amount
+[ "$reserve" -lt "$min" ] && reserve="$min"
+[ "$reserve" -gt "$max" ] && reserve="$max"
+
+# Get a result which can be divided by 4
+mem="$[ ( ( $totalmem - $reserve ) / 4 ) * 4 ]"
+if [ -n "$mainvirtmem" ]; then
+ forcemem="$[ "$mainvirtmem" / 4 * 4 ]"
+ mem="$forcemem"
+fi
+hostmem="$[ $totalmem - $mem ]"
+
+# TODO: We should only generate the suffix here (last 3 octets) as the first 3 are
+# dependant on the virtualizer/emulator. Check if any run-virt.include still relies on
+# $macguestpart/$macaddr. If so, fix it to use its specific first 3 bytes
+# and append $macaddrssuffix
+macguestpart="00:50:56:${VM_ID}"
+machostpart=$(echo "${hostmacaddr}" | awk -F ":" '{print $(NF-1)":"$NF}')
+macaddr=$(echo "${macguestpart}:${machostpart}" | tr "[a-z]" "[A-Z]")
+macaddrsuffix=$(echo "${VM_ID}:${machostpart}" | tr "[a-z]" "[A-Z]")
+
+if ! echo "$macaddrsuffix" | grep -q -E '^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$'; then
+ slxlog "virt-mac" "Could not properly generate mac address suffix (got $macaddrsuffix)"
+fi
+
+# Virtual fd/cd/dvd and drive devices, floppy b: for configuration
+# if $floppy_0 from virtualization.conf set then fdtest="TRUE"
+fdtest=${floppy_0:+"TRUE"}
+# if $fdtest not set floppy0="FALSE", else "TRUE"
+floppy0=${fdtest:-"FALSE"}
+floppy1="TRUE"
+floppy1name="$VMCHOOSER_DIR/data/loopimg/fd.img"
+# if $cdrom_0 from virtualization.conf set then cdtest="TRUE"
+cdtest=${cdrom_0:+"TRUE"}
+# if $cdtest not set cdrom0="FALSE", else "TRUE"
+cdrom0=${cdtest:-"FALSE"}
+# if $cdrom_1 from virtualization.conf set then cdtest="TRUE"
+cdtest=${cdrom_1:+"TRUE"}
+# if $cdtest not set cdrom1="FALSE", else "TRUE"
+cdrom1=${cdtest:-"FALSE"}
+# IDE is expected default, test for the virtual disk image type should
+# be done while creating the runscripts ...
+# TODO enable SCSI support instead of just disabling it.
+ide="TRUE"
+scsi="FALSE"
+hddrv="ide"
+audio="true"
+remotedesktopport="590${VM_ID}"
+
+# Enable 3D
+enable3d=$(grep -i -o "<enable3d param=.*" "${xmlfile}" | awk -F '"' '{print $2}' | rv_clean_string)
+
+# Add rw share for home dir
+homesharepath="${HOME}/PERSISTENT"
+homesharename="home"
+
+# Add common share
+commonsharepath="${HOME}/SHARE"
+commonsharename="share"
+
+# Set hostname: using original hostname and adding string
+hostname="virt-$(hostname)"
+
+writelog "\tVM Hostname:\t\t$hostname"
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables_legacy.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables_legacy.inc
new file mode 100644
index 00000000..0da5e2be
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_hardware_variables_legacy.inc
@@ -0,0 +1,89 @@
+###########################################
+# Include: Set hardware related variables #
+###########################################
+
+# take last two digits of current pid...
+VM_ID=$(expr substr $$ $(expr ${#$} - 1) 2)
+
+# Make sure cpu_cores is not empty
+cpu_cores=${cpu_cores:-"1"}
+
+# Amount of memory for the VM. Be generous if diff is written to HDD
+if mount | grep -q '^/dev/sd.*on.*/tmp'; then
+ reserve=20
+ min=768
+ max=1536
+else
+ reserve=65
+ min=768
+ max=8192
+fi
+
+# Calculate absulute amount of RAM that should stay available to the host
+reserve="$[ ( $totalmem * $reserve ) / 100 ]"
+# Respect some upper and lower bounds for the host amount
+[ "$reserve" -lt "$min" ] && reserve="$min"
+[ "$reserve" -gt "$max" ] && reserve="$max"
+
+# Get a result which can be divided by 4
+mem="$[ ( ( $totalmem - $reserve ) / 4 ) * 4 ]"
+if [ -n "$mainvirtmem" ]; then
+ forcemem="$[ "$mainvirtmem" / 4 * 4 ]"
+ mem="$forcemem"
+fi
+hostmem="$[ $totalmem - $mem ]"
+
+# TODO: We should only generate the suffix here (last 3 octets) as the first 3 are
+# dependant on the virtualizer/emulator. Check if any run-virt.include still relies on
+# $macguestpart/$macaddr. If so, fix it to use its specific first 3 bytes
+# and append $macaddrssuffix
+macguestpart="00:50:56:${VM_ID}"
+machostpart=$(echo "${hostmacaddr}" | awk -F ":" '{print $(NF-1)":"$NF}')
+macaddr=$(echo "${macguestpart}:${machostpart}" | tr "[a-z]" "[A-Z]")
+macaddrsuffix=$(echo "${VM_ID}:${machostpart}" | tr "[a-z]" "[A-Z]")
+
+if ! echo "$macaddrsuffix" | grep -q -E '^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$'; then
+ slxlog "virt-mac" "Could not properly generate mac address suffix (got $macaddrsuffix)"
+fi
+
+# Virtual fd/cd/dvd and drive devices, floppy b: for configuration
+# if $floppy_0 from virtualization.conf set then fdtest="TRUE"
+fdtest=${floppy_0:+"TRUE"}
+# if $fdtest not set floppy0="FALSE", else "TRUE"
+floppy0=${fdtest:-"FALSE"}
+floppy1="TRUE"
+floppy1name="$VMCHOOSER_DIR/data/loopimg/fd.img"
+# if $cdrom_0 from virtualization.conf set then cdtest="TRUE"
+cdtest=${cdrom_0:+"TRUE"}
+# if $cdtest not set cdrom0="FALSE", else "TRUE"
+cdrom0=${cdtest:-"FALSE"}
+# if $cdrom_1 from virtualization.conf set then cdtest="TRUE"
+cdtest=${cdrom_1:+"TRUE"}
+# if $cdtest not set cdrom1="FALSE", else "TRUE"
+cdrom1=${cdtest:-"FALSE"}
+# IDE is expected default, test for the virtual disk image type should
+# be done while creating the runscripts ...
+# TODO enable SCSI support instead of just disabling it.
+ide="TRUE"
+scsi="FALSE"
+hddrv="ide"
+audio="true"
+remotedesktopport="590${VM_ID}"
+
+
+# Enable 3D
+enable3d=$(grep -i -o "<enable3d param=.*" "${xmlfile}" | awk -F '"' '{print $2}' | rv_clean_string)
+
+# Add rw share for home dir
+homesharepath="${HOME}/PERSISTENT"
+homesharename="home"
+
+# Add common share
+commonsharepath="${HOME}/SHARE"
+commonsharename="share"
+
+# Set hostname: using original hostname and adding string
+hostname="virt-$(hostname)"
+
+writelog "\tVM Hostname:\t\t$hostname"
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_variables.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_variables.inc
new file mode 100644
index 00000000..5215eb2d
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/set_runvirt_variables.inc
@@ -0,0 +1,21 @@
+######################################################
+# Include: Declaration of run-virt default variables #
+######################################################
+
+VMCHOOSER_DIR="/opt/openslx/vmchooser"
+VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config"
+LOGFILE="/var/log/openslx/run-virt.${USER}.$$.log"
+USER="$(whoami)"
+TMPDIR="/tmp/virt/${USER}/$$"
+
+readonly VMCHOOSER_DIR VMCHOOSER_CONF_DIR LOGFILE TMPDIR USER
+
+# include general configuration from vmchooser
+[ -f "$VMCHOOSER_CONF_DIR/vmchooser.conf" ] && . "$VMCHOOSER_CONF_DIR/vmchooser.conf"
+# load general virtualization information
+[ -f "$VMCHOOSER_CONF_DIR/virtualization.conf" ] && . "$VMCHOOSER_CONF_DIR/virtualization.conf"
+# Load general openslx config
+[ -f "/opt/openslx/config" ] && . "/opt/openslx/config"
+# Create temp dir
+mkdir -p "$TMPDIR" # TODO error out if failed
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc
new file mode 100644
index 00000000..dd408b22
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_image_access.inc
@@ -0,0 +1,71 @@
+###########################################################
+# Include: Setup dnbd for image access, nfs/cifs fallback #
+###########################################################
+
+writelog "Now in setup_image_access.inc ..."
+
+# Try to use dnbd3 to access the image
+unset vm_diskfile
+unset vm_revision
+unset dnbd3_fuse_mount_point
+unset dnbd3_tmplog
+if ! which dnbd3-fuse; then
+ writelog "Can't use dnbd3 as dnbd3-fuse binary is not in PATH"
+elif [ -z "$SLX_DNBD3_SERVERS" ] || [ "x$SLX_VM_DNBD3" != "xyes" ]; then
+ writelog "Can't use dnbd3 as no servers are given in config, or SLX_VM_DNBD3 is not set to yes"
+else
+ # Mount path for images mounted with dnbd3-fuse
+ dnbd3_fuse_mount_point="$TMPDIR/dnbd3fuse.mnt"
+ mkdir -p "${dnbd3_fuse_mount_point}"
+ # start dnbd3-fuse in subshell
+ dnbd3_tmplog="$TMPDIR/dnbd3fuse.log"
+ dnbd3_exitflag="$TMPDIR/dnbd3exit$RANDOM"
+ rm -f -- "$dnbd3_exitflag"
+ (
+ dnbd3-fuse -f -o allow_other,max_readahead=262144 -h "$SLX_DNBD3_SERVERS" -i "${imgrelpath}" "${dnbd3_fuse_mount_point}" > "$dnbd3_tmplog" 2>&1
+ RET=$?
+ touch "$dnbd3_exitflag"
+ if [ "$RET" != "0" ]; then
+ writelog "dnbd3-fuse stopped working (Exit code $RET)"
+ slxlog "virt-dnbd3-fuse" "dnbd3-fuse stopped/refused serving '${imgrelpath}' from '${SLX_DNBD3_SERVERS}' with error code: $RET" "${dnbd3_tmplog}"
+ fi
+ sleep 2
+ rm -f -- "$dnbd3_tmplog" "$dnbd3_exitflag"
+ ) &
+ # give it a bit of time
+ usleep 250000
+ # check if we have the image
+ for TIMEOUT in 0.5 1 1 OUT; do
+ if [ -r "${dnbd3_fuse_mount_point}/img" ]; then
+ vm_revision="$(grep -m 1 "^Revision:" "${dnbd3_fuse_mount_point}/status" | cut -d" " -f2)"
+ vm_diskfile="${dnbd3_fuse_mount_point}/img"
+ writelog "DNBD3: $imgrelpath on $vm_diskfile with rid $vm_revision"
+ vmpath="$vm_diskfile"
+ break
+ fi
+ [ "$TIMEOUT" = "OUT" -o -e "$dnbd3_exitflag" ] && break
+ sleep "$TIMEOUT"
+ done
+
+ if [ -z "$vm_diskfile" ]; then
+ slxlog "virt-dnbd3" "No dnbd3 server for ${imgrelpath} found, trying NFS/CIFS..." "$dnbd3_tmplog"
+ writelog "No working dnbd3 server found :-("
+ fi
+fi
+
+# $vm_diskfile will be empty if dnbd3 is not used or failed. Let's try to fall back to NFS/CIFS via file system
+if [ -z "$vm_diskfile" ]; then
+ new_vmpath=$(ls "${vmpath}.r"* | grep -E -o '\.r[0-9]+$' | grep -o -E '[0-9]+' | sort -n | tail -n 1)
+ [ -n "$new_vmpath" ] && vmpath="${vmpath}.r${new_vmpath}"
+ vm_diskfile="$vmpath"
+fi
+
+# Check if virtual machine container file exists
+if ! [ -e "${vmpath}" ]; then
+ slxlog "virt-image-missing" "VM image $vmpath not found!"
+ writelog "Virtual machine image ${vmpath} not found!"
+ cleanexit 1
+fi
+
+writelog "Virtual machine disk file: $vm_diskfile"
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_printer_lpd.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_printer_lpd.inc
new file mode 100644
index 00000000..ee0b2c70
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_printer_lpd.inc
@@ -0,0 +1,33 @@
+#####################################
+# Include: Setup printer daemon LPD #
+#####################################
+
+QUEUE="STANDARD" # This has to match the queue you configured in your VM
+SPOOLDIR=
+
+### Disabled: 100megs is not enough, some jobs are HUGE, try to use temp which should be on disk
+## Try using user's tmpfs home first, as it gets wiped on logout
+#if [ -n "${HOME}" ] && [ -w "${HOME}" ]; then
+# SPOOLDIR="${HOME}/.spool"
+# mkdir -p "${SPOOLDIR}/${QUEUE}"
+#fi
+# If failed, try to fall back to /tmp
+
+if [ -z "${SPOOLDIR}" ] || [ ! -w "${SPOOLDIR}/${QUEUE}" ]; then
+ SPOOLDIR="${TMPDIR}/printergui-${RANDOM}"
+ rm -rf -- "${SPOOLDIR}"
+ if ! mkdir -p "${SPOOLDIR}/${QUEUE}"; then
+ slxlog "virt-spooldir" "Could not create spool directory ($SPOOLDIR) for $USER - printing will not work!"
+ # TODO: Warn user
+ fi
+ chmod 0700 "${SPOOLDIR}/${QUEUE}"
+fi
+
+# Start the lpdaemon listening on the given port
+# TODO: externalize with something like runvirt.d (other parts might benefit from that too)
+tcpsvd -E 192.168.101.1 5515 \
+ lpd "$SPOOLDIR" \
+ ash -c "/opt/openslx/scripts/run-virt_print '${USER}' \"${SPOOLDIR}/${QUEUE}/\$DATAFILE\"" &
+
+# PID to kill the process
+PID_LPD="$!"
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc
new file mode 100644
index 00000000..201c0ff5
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_sound.inc
@@ -0,0 +1,64 @@
+########################
+# Include: Setup sound #
+########################
+# 8086:1e20: Sound card in bwPX4
+
+writelog "Starting sound setup ..."
+
+if lspci -n | grep -E -i '8086:1e20( |$)'; then
+ VOL="100%" # bwPC 4: Speaker too quiet :-(
+else
+ VOL="85%"
+fi
+
+if true; then
+ # detecting which card is to be used
+ writelog "Detecting which sound card to use ..."
+ PROC="/proc/asound/cards"
+ if [ ! -r "$PROC" ]; then
+ writelog "'${PROC}' not found or not readable."
+ SOUND_CARD_INDEX=0
+ SOUND_CARD_COUNT=1
+ else
+ # Try to filter HDMI cards first
+ SOUND_CARD_INDEX=$(grep -v -i 'HDMI' "${PROC}" | grep -E -o '^[[:space:]]{0,2}[0-9]+[[:space:]]+' | head -n 1)
+ # If empty, try again with all
+ [ -z "${SOUND_CARD_INDEX}" ] && SOUND_CARD_INDEX=$(cat "${PROC}" | grep -E -o '^[[:space:]]{0,2}[0-9]+[[:space:]]+' | head -n 1)
+ if [ -z "${SOUND_CARD_INDEX}" ]; then
+ writelog "No sound card found."
+ SOUND_CARD_INDEX=0
+ fi
+ SOUND_CARD_COUNT=$(grep -E '^[[:space:]]{0,2}[0-9]+[[:space:]]+' "${PROC}" | wc -l)
+ fi
+
+ SOUND_CARD_INDEX="$(grep -E -o '[0-9]+' <<<$SOUND_CARD_INDEX)"
+ writelog "Detected sound card index is: $SOUND_CARD_INDEX"
+ writelog "Sound card count: $SOUND_CARD_COUNT"
+
+ # Adjust sound volume (playback)... Random mixer names we have encountered during testing
+ writelog "Setting up volume..."
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Master' "$VOL" unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'PCM' "$VOL" unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'CD' "$VOL" unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Headphone' "$VOL" unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Front' "$VOL" unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Speaker' "$VOL" unmute
+ # Recording. It seems that (most) devices need the volume set to 0, so you
+ # don't hear your own mic input, but should be unmuted. Also on some cards,
+ # you need to set the cap option on the mic you want to use, while other cards
+ # will just ignore that option.
+ # Plus, most cards have a Capture mixer, which needs to be set to cap too, and
+ # have its volume turned up. (There'll probably be some cards that need yet
+ # another setup, but this works for now on 4 tested cards)
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Rear Mic Boost' "50%" cap unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Rear Mic' "0%" cap unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Front Mic Boost' "50%" cap unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Front Mic' "0%" cap unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Mic Boost' "50%" cap unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Mic' "0%" cap unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Capture' "100%" cap unmute
+ amixer -q -c "$SOUND_CARD_INDEX" sset 'Input Source' 'Front Mic' # Let's hope nobody uses rear mic...
+ # fix random static noise when starting vmplayer when module snd_pcsp (not pcspkr) is loaded
+ amixer -q -c pcsp sset Master "0%" mute
+ writelog "Done setting up volume."
+fi >> "${LOGFILE}" 2>&1
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_virtual_floppy.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_virtual_floppy.inc
new file mode 100644
index 00000000..4b8e10aa
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_virtual_floppy.inc
@@ -0,0 +1,21 @@
+##############################################
+# Include: Setup virtual floppy for drive b: #
+##############################################
+
+# Copy guest configuration (with added information) config.xml to be accessed
+# via virtual floppy
+cp "$xmlfile" "$VMCHOOSER_DIR/fd-loop/config.xml"
+
+# Add another file with resolution information
+xrandr | grep -o -E 'connected\s*(primary)?\s*[0-9]+x[0-9]+\+0\+0' | grep -o -E '[0-9]+x[0-9]+' | head -n 1 > "$VMCHOOSER_DIR/fd-loop/hostres.txt"
+
+# Add our magic openslx binary that sets the correct guest resolution
+cp "$VMCHOOSER_DIR/data/openslx.exe" "$VMCHOOSER_DIR/fd-loop/"
+cp "$VMCHOOSER_DIR/data/SHARELWS.BAT" "$VMCHOOSER_DIR/fd-loop/"
+rm "$VMCHOOSER_DIR/fd-loop/SHARELW.CFG"
+
+for SHARE in $(grep -o -E '^SLX_SHARE_.*_PATH' /opt/openslx/config); do
+ eval "echo -n \$${SHARE} | /opt/openslx/bin/tr '/' '\' " >> "$VMCHOOSER_DIR/fd-loop/SHARELW.CFG"
+ #eval echo -n " \$${SHARE%PATH}AUTH_PASS /user:\$${SHARE%PATH}AUTH_USER" >> "$VMCHOOSER_DIR/fd-loop/SHARELW.CFG"
+ echo -e '\r\n' >> "$VMCHOOSER_DIR/fd-loop/SHARELW.CFG"
+done
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_vm_hypervisor.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_vm_hypervisor.inc
new file mode 100644
index 00000000..b7bb8f01
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/setup_vm_hypervisor.inc
@@ -0,0 +1,19 @@
+##########################################################################
+# Include: Setup virtual machine hypervisor via vm-specific include file #
+##########################################################################
+
+# Get all virtual machine specific stuff from the respective include file
+if [ ! -e "$VMCHOOSER_DIR/$xmlvirt/run-virt.include" ] ; then
+ # TODO: Tell user
+ slxlog "virt-plugin-missing" "Could not find run-virt.include for $xmlvirt ($VMCHOOSER_DIR/$xmlvirt/run-virt.include)"
+ writelog "Failed because of missing ${xmlvirt} plugin."
+ cleanexit 1
+fi
+
+ self="${xmlvirt}"
+
+# Now including the hypervisor specific include file:
+if ! source "$VMCHOOSER_DIR/$xmlvirt/run-virt.include"; then
+ slxlog "virt-plugin-error" "run-virt.include for $xmlvirt could not be sourced (contains syntax errors?)" "$xmlvirt"
+ writelog "Erroneous run-virt.include for $xmlvirt"
+fi
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/start_pvs.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/start_pvs.inc
new file mode 100644
index 00000000..90cd237b
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/start_pvs.inc
@@ -0,0 +1,11 @@
+#######################################################
+# Include: Starting PVS (Pool Video switch) if wanted #
+#######################################################
+
+# if [ -e /etc/xdg/autostart/pvsgui.desktop ]; then
+# /usr/local/bin/pvsgui -p 2 -b >/dev/null 2>&1 &
+# fi
+
+if [[ "$DO_PROFILE" -ge "1" ]]; then
+ wget "http://132.230.8.113/profile/do.php?action=start" &
+fi
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/start_windowmanager.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/start_windowmanager.inc
new file mode 100644
index 00000000..940f4ff3
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/start_windowmanager.inc
@@ -0,0 +1,20 @@
+####################################################
+# Include: Start windowmanager for easier handling #
+####################################################
+
+# Some problems may arise with windows opening in background when
+# using eg. vmware without a window manager.
+
+for dm in openbox kwin xfwm4 metacity blackbox twm fvwm2 ; do
+ if which $dm >/dev/null 2>&1 ; then
+ if [ "$dm" = "fvwm2" ] ; then
+ echo "EdgeScroll 0 0" > ${redodir}/fvwm
+ writelog "Starting fvwm2."
+ fvwm2 -f ${redodir}/fvwm >/dev/null 2>&1 &
+ else
+ writelog "Starting ${dm}."
+ $dm >/dev/null 2>&1 &
+ fi
+ break
+ fi
+done
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/usb_detector.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/usb_detector.inc
new file mode 100644
index 00000000..9769c81d
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/usb_detector.inc
@@ -0,0 +1,77 @@
+# Helper function that will scan /dev/bus/usb for devices matching specific classes
+# and then output the corresponding device ids. This can be used for selective
+# handover of devices to a virtual machine
+
+declare -rg PASSTHROUGH_USB_DEVICES="2 0:5 0:6 0:7 0:14 0:16 0:17"
+
+# $1: expression to fill with device information.
+# valid placeholders are:
+# %VENDOR% - device vendor id
+# %PRODUCT% - device product id
+# $2-n: device classes to include in output
+get_usb_devices_int() {
+ [ -z "$TMPDIR" ] && TMPDIR="/tmp"
+ local EXP=$1
+ shift
+ if [ -z "$EXP" ]; then
+ writelog --quiet "No ouput expression template passed to get_usb_devices"
+ cleanexit 1
+ fi
+ if [ $# -eq 0 ]; then
+ writelog --quiet "No device classes given to get_usb_devices"
+ cleanexit 1
+ fi
+ local MATCH=';'
+ while [ $# -gt 0 ]; do
+ MATCH+="$1;"
+ [[ "$1" != *:* ]] && MATCH+="0:$1;"
+ shift
+ done
+ local dev=
+ local key value trailing
+ trailing=
+ local tmp="${TMPDIR}/lsusb.$$.$RANDOM"
+ for dev in /dev/bus/usb/*/*; do
+ if ! lsusb -D "$dev" > "$tmp" 2>/dev/null; then
+ writelog --quiet "Cannot lsusb $dev"
+ continue
+ fi
+ local DC=
+ local OK=
+ local VENDOR=
+ local PRODUCT=
+ while read -r key value trailing || [ -n "$key" ]; do
+ if [[ "$key" == "idVendor" ]]; then
+ [[ "$value" == 0x* ]] && VENDOR="${value:2}"
+ elif [[ "$key" == "idProduct" ]]; then
+ [[ "$value" == 0x* ]] && PRODUCT="${value:2}"
+ elif [ -z "$DC" ]; then
+ # No bDeviceClass seen yet
+ if [[ "$key" == "bDeviceClass" ]]; then
+ DC="$value"
+ [[ "$MATCH" == *";${DC};"* ]] && OK=yo
+ fi
+ else
+ # #DeviceClass is generic, look at sub class
+ if [[ "$key" == "bInterfaceClass" ]]; then
+ [[ "$MATCH" == *";${DC}:${value};"* ]] && OK=yo
+ fi
+ fi
+ if [ -n "$OK" -a -n "$VENDOR" -a -n "$PRODUCT" ]; then
+ echo "$EXP" | sed "s/%VENDOR%/${VENDOR}/g;s/%PRODUCT%/${PRODUCT}/g"
+ break
+ fi
+ done < "$tmp"
+ done
+ rm -f -- "$tmp"
+}
+
+get_usb_devices() {
+ if which lsusb 2>/dev/null >&2 && lsusb --help 2>&1 | grep -q -- '-D' 2>/dev/null; then
+ [ $# -eq 1 ] && set -- "$1" $PASSTHROUGH_USB_DEVICES # no quotes here!
+ get_usb_devices_int "$@" | sort -u
+ else
+ writelog --quiet "Cannot scan usb bus: lsusb not found or doesn't support -D"
+ fi
+}
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/includes/vmchooser_runvirt_functions.inc b/core/modules/run-virt/data/opt/openslx/scripts/includes/vmchooser_runvirt_functions.inc
new file mode 100644
index 00000000..1f09b3d2
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/includes/vmchooser_runvirt_functions.inc
@@ -0,0 +1,48 @@
+#######################################################
+# Include: Set functions needed by vmchooser-run_virt #
+#######################################################
+
+# function to write to stdout and logfile
+writelog() {
+ local DATE=$(date +%Y-%m-%d-%H-%M-%S)
+ # write to stdout?
+ if [ "x$1" = "x--quiet" ]; then
+ shift
+ else
+ echo -e "$DATE: $@"
+ fi
+ # log into file
+ echo -e "$DATE: $@" >> "${LOGFILE}"
+}
+
+# Clean exit will be called at the end of vmchooser-run_virt
+cleanexit() {
+ sleep 1
+ # Ummount dnbd3-fuse
+ if [ -n "$dnbd3_fuse_mount_point" ] && [ -e "$dnbd3_fuse_mount_point/img" ]; then
+ for timeout in 1 1 1 FAIL; do
+ fusermount -u "$dnbd3_fuse_mount_point" && break
+ writelog "dnbd3 still busy...."
+ [ "$timeout" = "FAIL" ] && break
+ sleep "$timeout"
+ done
+ fi
+ # Kill LPD
+ [ -n "${PID_LPD}" ] && kill "${PID_LPD}"
+
+ # If we're not in debug mode, remove all temporary files
+ if [ -n "${TMPDIR}" -a -z "$SLX_DEBUG" ]; then
+ rm -rf -- "${TMPDIR}"
+ fi
+
+ [ $# -gt 0 ] && exit "$1"
+ exit 129 # No exit code was given :/
+}
+
+rv_clean_string() {
+ if [ "$#" -ge 1 ]; then
+ echo "$@" | tr '[A-Z]' '[a-z]' | tr -d -c '[a-z0-9\-]'
+ else
+ tr '[A-Z]' '[a-z]' | tr -d -c '[a-z0-9\-]'
+ fi
+}
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store b/core/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store
new file mode 100755
index 00000000..9d478918
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/systemd-mount_vm_store
@@ -0,0 +1,39 @@
+#!/bin/ash
+
+. /opt/openslx/config || exit 1
+
+[ -z "$SLX_VM_NFS" ] && exit 0
+
+# create target directory
+mkdir -p /mnt/vmstore
+
+OUTFILE=$(mktemp)
+
+# check if it is a CIFS-share or NFS-share
+# no bash, so this is a bit ugly...
+if [ "${SLX_VM_NFS#//}" = "${SLX_VM_NFS}" ]; then
+ # doesn't start with '//' -> assume NFS
+ /opt/openslx/bin/timeout -t 10 -s 9 mount -v -t nfs -o ro,async,nolock "$SLX_VM_NFS" /mnt/vmstore
+ RET=$?
+else
+ # starts with '//' -> assume CIFS
+ export USER="$SLX_VM_NFS_USER"
+ export PASSWD="$SLX_VM_NFS_PASSWD"
+ /opt/openslx/bin/timeout -t 10 -s 9 mount -v -t cifs -o ro,file_mode=0644,dir_mode=0755,uid=0,gid=0,forceuid,forcegid,sec=ntlm,nounix "$SLX_VM_NFS" /mnt/vmstore
+ unset USER
+ unset PASSWD
+ RET=$?
+fi > "$OUTFILE" 2>&1
+
+if [ $RET -ne 0 ]; then
+ if [ -s "$OUTFILE" ]; then
+ slxlog "mount-vmstore-fail" "Mounting '$SLX_VM_NFS' failed. VMs will not boot." "$OUTFILE"
+ sleep 1
+ else
+ slxlog "mount-vmstore-fail" "Mounting '$SLX_VM_NFS' failed. VMs will not boot."
+ fi
+fi
+
+rm -f -- "$OUTFILE"
+exit $RET
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env b/core/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env
new file mode 100755
index 00000000..b8236600
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/systemd-run_virt_env
@@ -0,0 +1,184 @@
+#!/bin/ash
+# -----------------------------------------------------------------------------
+# Copyright (c) 2007..2013 - RZ Uni FR
+# Copyright (c) 2007..2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# systemd-vmchooser_env
+# - This is the preparation script for the configuration of the virtuali-
+# zation tools used later on.
+################################################################################
+
+################################################################################
+### Define default dirs / get configs
+################################################################################
+
+export PATH=$PATH:/opt/openslx/bin:/opt/openslx/sbin
+
+# source config file with vars (e.g. ipaddr, macaddr, hostname)
+. /opt/openslx/config
+
+# from plugins/vmchooser/XX_vmchooser.sh
+VMCHOOSER_DIR="/opt/openslx/vmchooser"
+VMCHOOSER_CONF_DIR="$VMCHOOSER_DIR/config"
+
+mkdir -p "${VMCHOOSER_DIR}/data/loopimg"
+mkdir -p "${VMCHOOSER_DIR}/fd-loop" -m 1777
+
+# mount a clean tempfs (bug in UnionFS prevents loopmount to work)
+grep -qE "unionfs |aufs " /proc/mounts && \
+ mount -n -o size=1500k -t tmpfs vm-loopimg "${VMCHOOSER_DIR}/data/loopimg"
+
+# create an empty floppy image of 1.44 MByte size
+dd "if=/dev/zero" "of=${VMCHOOSER_DIR}/data/loopimg/fd.img" count=2880 bs=512 2>/dev/null
+chmod 0777 "${VMCHOOSER_DIR}/data/loopimg/fd.img"
+
+# use dos formatter copied into stage3
+mkdosfs "${VMCHOOSER_DIR}/data/loopimg/fd.img"
+mount -n -t msdos -o loop,umask=000 "${VMCHOOSER_DIR}/data/loopimg/fd.img" "${VMCHOOSER_DIR}/fd-loop"
+
+#pvs integration
+#if [ $vmchooser_pvs -ne 0 ]; then
+# sed -i /usr/share/xsessions/default.desktop \
+# -e "s,vmchooser$,vmchooser --pvs,"
+#fi
+
+# setup more scratch space for virtual machines, if configured
+mkdir -p /tmp/virt /var/log/samba /run/samba
+
+chmod a+rwxt /tmp/virt
+
+# enable normal users to setup the extended virtual machine redo file space
+# and image source via network block device (NBD only at the moment)
+# allow to start/stop samba on virtual devices (latter one ignores multiple
+# independent daemons)
+
+#cat >> /mnt/etc/sudoers << EOF
+# allow to start and stop the special /tmp redo file space (RAM + NBD/NFS server RAID)
+#ALL ALL=NOPASSWD: /sbin/losetup /dev/loop*
+#ALL ALL=NOPASSWD: /sbin/mdadm -C /dev/md0 -l linear --raid-devices=2 /dev/loop* /dev/*
+#ALL ALL=NOPASSWD: /opt/openslx/rootfs/usr/sbin/nbd-client * * /dev/nbd*
+# allow to configure and start/stop samba services
+#ALL ALL=NOPASSWD: /opt/openslx/rootfs/bin/sed -i /etc/*/smb.conf -e *
+#ALL ALL=NOPASSWD: /usr/sbin/nmbd -s /etc/*/smb.conf
+#ALL ALL=NOPASSWD: /usr/sbin/smbd -s /etc/*/smb.conf
+#ALL ALL=NOPASSWD: /opt/openslx/rootfs/usr/bin/killall nmbd smbd
+#EOF
+
+################################################################################
+### Determine hardware configuration
+################################################################################
+
+# estimate free mem
+mem_free=$(grep -i "^memfree:" /proc/meminfo | awk '{print $2}')
+mem_cached=$(grep -i "^cached:" /proc/meminfo | awk '{print $2}')
+mem_swapcached=$(grep -i "^swapcached:" /proc/meminfo | awk '{print $2}')
+[ -z "$mem_free" ] && mem_free="2048000"
+[ -z "$mem_cached" ] && mem_cached="0"
+[ -z "$mem_swapcached" ] && mem_swapcached="0"
+totalmem="$(expr $(expr $mem_free + $mem_cached + $mem_swapcached) / 1024)"
+echo "totalmem=${totalmem}" > "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+
+# determine number of cpu cores
+CPU_CORES=$(grep '^processor.*:' /proc/cpuinfo | wc -l)
+if [ "${CPU_CORES}" -gt "1" 2>/dev/null ]; then
+ echo "cpu_cores=${CPU_CORES}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+else
+ echo 'cpu_cores=1' >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+fi
+
+# general machine architecture (32/64bit)
+echo "host_arch=$(uname -m)" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+
+# check for VT enabled CPU
+if grep -q '^flags.*\<vmx\>' "/proc/cpuinfo"; then
+ echo "vtflag=1" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ echo 'kvm_module="kvm_intel"' >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ elif grep -q '^flags.*\<svm\>' "/proc/cpuinfo"; then
+ echo "vtflag=1" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ echo 'kvm_module="kvm_amd"' >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ else
+ echo "vtflag=0" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+fi
+
+# write mac
+if [ -n "$SLX_PXE_MAC" ]; then
+ echo "hostmacaddr=${SLX_PXE_MAC}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+else ## Fallback:
+ echo "hostmacaddr=$(ip a | grep ether | grep -o -E -i '([0-9a-f]{2}:){5}[0-9a-f]{2}' | head -n 1)" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+fi
+# read in ip address
+echo "hostip=${SLX_PXE_CLIENT_IP}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+# hostname
+echo "hostname=\"$(hostname -s)\"" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+
+# get further hw information and check for traces of available optical and floppy drives
+j=0
+for cdrom in $(dmesg|grep -i "Attached scsi CD-ROM sr" | sed "s,.*Attached scsi CD-ROM ,,"); do
+ echo "cdrom_$j=/dev/${cdrom}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ j=$(expr $j + 1)
+done
+
+j=0
+for floppy in $(dmesg|grep -i "Floppy drive"|sed "s,.*(s): ,,;s, is .*,,"); do
+ echo "floppy_$j=/dev/${floppy}" >> "${VMCHOOSER_CONF_DIR}/virtualization.conf"
+ j=$(expr $j + 1)
+done
+
+################################################################################
+### Setup VM networking
+################################################################################
+
+# there will be three types of network interfaces for virtual machines available
+# all will be configured for every type of virtualization tool
+# a) br0 is the direct host bridge into the local LAN (br0 already exists)
+# vmnet0 for VMware
+# vboxnet0 for VirtualBox
+# kvmnet0* for Qemu/KVM
+# b) nat1 is an internal bridge which "NATes" into the local LAN (with DHCP)
+# vmnet1 for VMware
+# vboxnet1 for VirtualBox
+# kvmnet1* for Qemu/KVM
+# c) vsw2 is an internal host bridge to connect software defined LANs to
+# vmnet2 for VMware
+# vboxnet2 for VirtualBox
+# kvmnet2* for Qemu/KVM
+
+# creating and configuring nat0
+# 192.168.101.0/24 is vm nat. If you ever change this there are a couple of other files
+# where you'd need to make changes, so think twice before doing so. ;)
+brctl addbr nat1
+ip link set dev nat1 up
+ip addr add 192.168.101.1/24 dev nat1
+echo "1" >/proc/sys/net/ipv4/conf/nat1/forwarding
+echo "1" >/proc/sys/net/ipv4/conf/br0/forwarding 2>/dev/null
+# iptables masquerade rule is now inserted by /opt/openslx/iptables/rules.d/50-virt-nat1-masquerading
+### iptables -t nat -A POSTROUTING -o br0 -s 192.168.0.0/16 -j MASQUERADE
+
+for wait in 1 1 2 2 3 end; do
+ grep '^SLX_DNS' "/opt/openslx/config" > /dev/null && break
+ [ "$wait" == "end" ] && echo "No DNS config found, using google dns" && break
+ echo "Waiting for DNS config.."
+ sleep "$wait"
+done
+
+# read the DNS configuration and configure the udhcpd
+[ -z "${SLX_DNS}" ] && SLX_DNS="8.8.8.8"
+sed -i "s,DNSSERVER,${SLX_DNS},;s,DOMAIN,${SLX_NET_DOMAIN}," \
+ /opt/openslx/vmchooser/config/udhcpd-nat1.conf
+
+mkdir -p /var/lib/udhcpd
+udhcpd -S /opt/openslx/vmchooser/config/udhcpd-nat1.conf
+
+# creating and configuring vsw2
+brctl addbr vsw2
+ip link set dev vsw2 up
+echo "1" >/proc/sys/net/ipv4/conf/vsw2/forwarding
+
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-clc b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-clc
new file mode 100755
index 00000000..337dee44
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-clc
@@ -0,0 +1,475 @@
+#!/bin/bash
+
+# region header
+
+# vim: set tabstop=4 shiftwidth=4 expandtab:
+# vim: foldmethod=marker foldmarker=region,endregion:
+
+ # region dependencies:
+
+# VMware Player - Runs a virtual machine.
+# VMware Workstation - Runs, edits, creates virtual machines for business
+# usage.
+# VirtualBox ver. 4+ - Plays, creates, edits virtual machines.
+# bash ver. 4+ - A sh-compatible command line interpreter.
+# cat - Concatenate and prints file contents.
+# echo - Prints chars.
+# grep - Prints lines which matches a given regular expression
+# pattern.
+# sed - Stream-editor for filtering and transformation text.
+# mktemp - Creates temporary files and folders.
+# dirname - Extracts the last element from a given file path.
+# mv - moves and renames file objects.
+# rm - Removes files and folders.
+# cp - Copies files and folders.
+# sleep - Delays program calls.
+# readlink - Print resolved symbolic links or canonical file names.
+
+ # endregion
+
+# Abbreviation for "createLinkedClone".
+__NAME__='vmchooser-clc'
+
+# endregion
+
+# Provides the main module scope.
+function vmchooser-clc() {
+
+# region configuration
+
+ # region private properties
+
+ # region command line arguments
+
+ local _VERBOSE='no'
+ # NOTE: You should write upper case first letters to support valid
+ # camel case method names to handle given hypervisor.
+ local _SUPPORTED_HYPERVISOR=('VMware' 'VirtualBox')
+ # NOTE: This value will be determined automatically. If no hypervisor
+ # could be detected this value will be used as default.
+ # The first value from supported Machines is taken as default.
+ local _HYPERVISOR="$_SUPPORTED_HYPERVISOR"
+ local _PERSISTENT_SHORT_DESCRIPTION_SUFFIX=' --persistent--'
+ local _PERSISTENT_CONFIG_TARGET=''
+ local _BASIC_IMAGE_CONFIGURATION_FILE_PATH=''
+ local _TARGET_PATH=''
+ local _VIRTUAL_BOX_SNAPSHOT_NAME='persistentUserSnapshot'
+
+ # endregion
+
+ local _STANDARD_OUTPUT=/dev/null
+ local _ERROR_OUTPUT=/dev/null
+ local _VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH='/tmp/clcVirtualBoxSnapshotUUID'
+
+ # endregion
+
+# endregion
+
+# region functions
+
+ # region command line interface
+
+ # Prints a description about how to use this program.
+ function clcPrintUsageMessage() {
+ cat << EOF
+ $__NAME__ Generates a linked clone from given machine description file in
+ given target location.
+EOF
+ return $?
+ }
+
+ # Prints a description about how to use this program by providing examples.
+ function clcPrintUsageExamples() {
+ cat << EOF
+ # Getting a help message.
+ >>> $0 --help
+
+ # Creating a linked clone.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/
+
+ # Creating a linked clone configuration file.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ -c
+
+ # Creating a linked clone in verbose mode.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose
+
+ # Creating a linked clone in verbose mode with debugging output.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ --verbose --debug
+
+ # Creating a linked clone in verbose mode with debugging output.
+ >>> $0 /path/to/config.xml ~/.persistentLinkedClones/ -v -d
+EOF
+ return $?
+ }
+
+ # Prints descriptions about each available command line option.
+ function clcPrintCommandLineOptionDescriptions() {
+ # NOTE; All letters are used for short options.
+ cat << EOF
+ -h --help Shows this help message.
+
+ -v --verbose Tells you what is going on (default: "$_VERBOSE").
+
+ -d --debug Gives you any output from all tools which are used
+ (default: "$_DEBUG").
+
+ -c --create-persistent-config PERSISTENT_IMAGE_FILE_PATH If set an xml file
+ for persistent openslx boot will be created referencing to given
+ persistent image path (default: "$_PERSISTENT_CONFIG_TARGET").
+
+ -v --virtualbox-snapshot-name NAME Provide a name for newly created
+ snapshots. (default: "$_VIRTUAL_BOX_SNAPSHOT_NAME").
+
+ -u --virtualbox-snapshot-uuid-file-path PATH Provide a file path where to
+ save the newly generated snapshot uuid (default: \
+ "$_VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH").
+EOF
+ return $?
+ }
+
+ # Provides a help message for this module.
+ function clcPrintHelpMessage() {
+ echo -e \
+ "\nUsage: $0 BASIC_IMAGE_CONFIGURATION_FILE_PATH TARGET_PATH [options]\n" && \
+ clcPrintUsageMessage "$@" && \
+ echo -e '\nExamples:\n' && \
+ clcPrintUsageExamples "$@" && \
+ echo -e '\nOption descriptions:\n' && \
+ clcPrintCommandLineOptionDescriptions "$@" && \
+ echo && \
+ return $?
+ }
+
+ # Provides the command line interface and interactive questions.
+ function clcCommandLineInterface() {
+ while true; do
+ case "$1" in
+ -h|--help)
+ shift
+ clcPrintHelpMessage "$0"
+ exit 0
+ ;;
+ -v|--verbose)
+ shift
+ _VERBOSE='yes'
+ ;;
+ -d|--debug)
+ shift
+ _DEBUG='yes'
+ _STANDARD_OUTPUT=/dev/stdout
+ _ERROR_OUTPUT=/dev/stderr
+ ;;
+ -c|--create-persistent-config)
+ shift
+ _PERSISTENT_CONFIG_TARGET="$1"
+ shift
+ ;;
+ -v|--virtualbox-snapshot-name)
+ shift
+ _VIRTUAL_BOX_SNAPSHOT_NAME="$1"
+ shift
+ ;;
+ -u|--virtualbox-snapshot-uuid-file-path)
+ shift
+ _VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH="$1"
+ shift
+ ;;
+
+ '')
+ shift
+ break 2
+ ;;
+ *)
+ if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]]; then
+ _BASIC_IMAGE_CONFIGURATION_FILE_PATH="$1"
+ elif [[ ! "$_TARGET_PATH" ]]; then
+ _TARGET_PATH="$1"
+ else
+ clcLog 'critical' \
+ "Given argument: \"$1\" is not available." '\n'
+ clcPrintHelpMessage "$0"
+ return 1
+ fi
+ shift
+ ;;
+ esac
+ done
+ if [[ ! "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" ]] || \
+ [[ ! "$_TARGET_PATH" ]]; then
+ clcLog 'critical' \
+ "You have to provide a basic image configuration file and a destination path."
+ clcPrintHelpMessage "$0"
+ return 1
+ fi
+ local supportedVirtualMachine
+ for supportedVirtualMachine in ${_SUPPORTED_HYPERVISOR[*]}; do
+ if [[ "$(clcGetXMLValue 'virtualMachine' | \
+ grep --ignore-case "$supportedVirtualMachine")" ]]; then
+ _HYPERVISOR="$supportedVirtualMachine"
+ clcLog 'debug' "Detected \"$_HYPERVISOR\" as hypervisor."
+ break
+ fi
+ done
+ clcLog 'info' "Using \"$_HYPERVISOR\" as hypervisor." && \
+ return $?
+ }
+
+ # Grabs a value from currently loaded xml file.
+ function clcGetXMLValue() {
+ grep --ignore-case --only-matching "<$1 param=.*" \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" | awk -F '"' '{ print $2 }'
+ return $?
+ }
+
+ # Handles logging messages. Returns non zero and exit on log level error to
+ # support chaining the message into toolchain.
+ function clcLog() {
+ local loggingType='info'
+ local message="$1"
+ if [ "$2" ]; then
+ loggingType="$1"
+ message="$2"
+ fi
+ if [ "$_VERBOSE" == 'yes' ] || [ "$loggingType" == 'error' ] || \
+ [ "$loggingType" == 'critical' ]; then
+ if [ "$3" ]; then
+ echo -e -n "$3"
+ fi
+ echo -e "${loggingType}: $message"
+ fi
+ if [ "$loggingType" == 'error' ]; then
+ exit 1
+ fi
+ }
+
+ # endregion
+
+ # region tools
+
+ # Returns the minimal vmx vmware configuration file content to create a
+ # snapshot.
+ function clcGetTemporaryVMXContent() {
+ cat << EOF
+.encoding = "UTF-8"
+config.version = "8"
+virtualHW.version = "7"
+ide0:0.present = "TRUE"
+ide0:0.fileName = "$1"
+displayName = ""
+EOF
+ return $?
+ }
+
+ # This functions escapes every special meaning character for a sed
+ # replacement.
+ #
+ # Examples:
+ #
+ # >>> sed "s/myInputString/$(clcValidateSEDReplacement '\hans/peter&klaus')/g"
+ function clcValidateSEDReplacement() {
+## bash
+## sed --expression 's/\\/\\\\/g' --expression 's/\//\\\//g' \
+## --expression 's/&/\\\&/g' <<< "$1"
+ sed -e 's/\\/\\\\/g' -e 's/\//\\\//g' -e 's/&/\\\&/g' <<< "$1"
+##
+ return $?
+ }
+
+ # endregion
+
+ # region main tasks
+
+ # Creates a snapshot from VMware generated virtual machine.
+ function clcCreateVMwareSnapshot() {
+ local temporaryConfigurationPath="$(mktemp --directory)/" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ local temporaryConfigurationFilePath="$(mktemp --suffix '.vmx')" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Generate a temporary virtual machine configuration file \"$temporaryConfigurationFilePath\"." && \
+ clcGetTemporaryVMXContent "$(dirname \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")/$(clcGetXMLValue \
+ 'image_name')" 1>"$temporaryConfigurationFilePath" \
+ 2>"$_ERROR_OUTPUT" && \
+ mv "$temporaryConfigurationFilePath" "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Needed temporary files generated in \"$temporaryConfigurationPath\" generated." && \
+ vmrun snapshot "$temporaryConfigurationPath"*.vmx \
+ persistentUserSnapshot 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ mv "$temporaryConfigurationPath"*.vmdk "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ local result=$?
+ if [[ "$_DEBUG" == 'no' ]]; then
+## bash rm --recursive "$temporaryConfigurationPath" \
+ rm -r "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ fi
+ return $result
+ }
+
+ # Creates a snapshot from virtualBox generated virtual machine.
+ function clcCreateVirtualBoxSnapshot() {
+ local temporaryConfigurationPath="$(mktemp --directory)/" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+## bash
+## (cp --recursive ~/.VirtualBox/ \
+## "${temporaryConfigurationPath}virtualBoxBackup" \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" || \
+## mkdir --parents \
+## "${temporaryConfigurationPath}virtualBoxBackup" \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT") && \
+ (cp -r ~/.VirtualBox/ \
+ "${temporaryConfigurationPath}virtualBoxBackup" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" || \
+ mkdir -p "${temporaryConfigurationPath}virtualBoxBackup" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT") && \
+##
+ # VBoxManage version to create snapshots.
+ clcLog 'Create a temporary virtual machine.' && \
+ # NOTE: Virtualbox needs 5 at leas 5 seconds to register that it has
+ # a new configuration directory.
+ sleep 5 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ VBoxManage createvm --name tmp --basefolder \
+ "$temporaryConfigurationPath" --register 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Create a temporary virtual ide controller.' && \
+ VBoxManage storagectl tmp --name tmp --add ide 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Attach given virtual disk image to temporary virtual machine.' && \
+ VBoxManage storageattach tmp --storagectl tmp --port 0 --device 0 \
+ --type hdd --medium "$(dirname \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")/$(clcGetXMLValue \
+ 'image_name')" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Needed temporary files generated in \"$temporaryConfigurationPath\" generated." && \
+ clcLog "Take a snapshot with name or uuid \"$_VIRTUAL_BOX_SNAPSHOT_NAME\"." && \
+ VBoxManage snapshot tmp take "$_VIRTUAL_BOX_SNAPSHOT_NAME" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+## bash
+## local virtualBoxSnapshotUUID="$(basename \
+## "${temporaryConfigurationPath}tmp/Snapshots/"*.vdi | sed \
+## --regexp-extended 's/\{(.+)\}\..+/\1/g')" \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ local virtualBoxSnapshotUUID="$(basename \
+ "${temporaryConfigurationPath}tmp/Snapshots/"*.vdi | sed \
+ -r 's/\{(.+)\}\..+/\1/g')" 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+##
+ echo "$virtualBoxSnapshotUUID" \
+ 1>"$_VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH" 2>"$_ERROR_OUTPUT" && \
+ clcLog "Created snapshot uuid is \"$virtualBoxSnapshotUUID\" (uuid saved to \"$_VIRTUAL_BOX_SNAPSHOT_UUID_FILE_PATH\")." && \
+ clcLog "Copy result to given target path \"$_TARGET_PATH\"." && \
+ cp "${temporaryConfigurationPath}tmp/Snapshots/"*.vdi "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ # NOTE: Isn't possible because virtualbox tries to consolidate with
+ # readonly basic image.
+ #VBoxManage snapshot tmp delete "$_VIRTUAL_BOX_SNAPSHOT_NAME" \
+ # 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ # NOTE: Isn't possible because virtual box has child images registered.
+ #VBoxManage closemedium disk "$(dirname \
+ # "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")/$(clcGetXMLValue \
+ # 'image_name')" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Detach given virtual disk image from temporary created virtual machine.' && \
+ VBoxManage storageattach tmp --storagectl tmp --port 0 --device 0 \
+ --medium none 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Remove virtual dummy harddisk.' && \
+ VBoxManage storagectl tmp --name tmp --remove \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Unregister temporary created virtual machine.' && \
+ VBoxManage unregistervm tmp 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Restore virtualbox home directory.' && \
+## bash
+## rm --recursive --force ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" \
+## 2>"$_ERROR_OUTPUT" && \
+## cp --recursive "${temporaryConfigurationPath}virtualBoxBackup/" \
+## ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+## rm --recursive --force "$temporaryConfigurationPath" && \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ rm -rf ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+ cp -r "${temporaryConfigurationPath}virtualBoxBackup/" \
+ ~/.VirtualBox/ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ rm -rf "$temporaryConfigurationPath" && \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+##
+ # NOTE: Virtualbox needs at least 5 seconds to register that it has
+ # a new configuration directory.
+ sleep 5 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT"
+ local result=$?
+ if [[ "$_DEBUG" == 'no' ]]; then
+## bash rm --recursive "$temporaryConfigurationPath" \
+ rm -r "$temporaryConfigurationPath" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" || \
+ return $?
+ fi
+ return $result
+ }
+
+ # Creates a persistent version of given configuration file.
+ function clcCreatePersistentConfig() {
+ clcLog "Create a persistent configuration file version from \"$_BASIC_IMAGE_CONFIGURATION_FILE_PATH\" in \"$_TARGET_PATH\"." && \
+ cp "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH" "$_TARGET_PATH" && \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Edit short description.' && \
+## bash sed --in-place --regexp-extended \
+ sed -i -r \
+ "s/(< *short_description[^>]*param=\"[^\"]*)(\")/\\1$_PERSISTENT_SHORT_DESCRIPTION_SUFFIX\\2/g" \
+ "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Append "original_xml_file_path" tag.' && \
+## bash
+## sed --in-place --regexp-extended \
+## "s/^([ \\t]*)(< *persistent[^>]+param=\"[^\"]+\"[^>]*>)/\\1\\2\\n\\1<original_xml_file_path param=\"$(clcValidateSEDReplacement \
+## "$(readlink --canonicalize \
+## "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")")\"\/>/g" \
+## "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ sed -i -r \
+ "s/^([ \\t]*)(< *persistent[^>]+param=\"[^\"]+\"[^>]*>)/\\1\\2\\n\\1<original_xml_file_path param=\"$(clcValidateSEDReplacement \
+ "$(readlink -f \
+ "$_BASIC_IMAGE_CONFIGURATION_FILE_PATH")")\"\/>/g" \
+ "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+##
+ clcLog 'Edit image file path.' && \
+## bash sed --in-place --regexp-extended \
+ sed -i -r \
+ "s/(< *image_name[^>]*param=\")[^\"]*(\")/\\1$(clcValidateSEDReplacement \
+ "$_PERSISTENT_CONFIG_TARGET")\\2/g" "$_TARGET_PATH" \
+ 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ clcLog 'Convert configuration file from windows style line endings to unix line endings.' && \
+## bash
+## sed --in-place --regexp-extended 's/\r//g' "$_TARGET_PATH" \
+## 1>"$_STANDARD_OUTPUT" 2>"$_ERROR_OUTPUT" && \
+ sed -i -r 's/\r//g' "$_TARGET_PATH" 1>"$_STANDARD_OUTPUT" \
+ 2>"$_ERROR_OUTPUT" && \
+##
+ return $?
+ }
+
+ # endregion
+
+# endregion
+
+# region controller
+
+ clcCommandLineInterface "$@" || return $?
+ if [[ "$_PERSISTENT_CONFIG_TARGET" ]]; then
+ clcCreatePersistentConfig || \
+ clcLog 'error' 'Creating persistent configuration file failed.'
+ else
+ "clcCreate${_HYPERVISOR}Snapshot" || \
+ clcLog 'error' 'Creating Linked Clone failed.'
+ fi
+ clcLog 'Program has successfully finished.' && \
+ return $?
+
+# endregion
+
+}
+
+# region footer
+
+if [[ "$0" == *"${__NAME__}" ]]; then
+ "$__NAME__" "$@"
+fi
+
+# endregion
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt
new file mode 100755
index 00000000..1e591389
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-run_virt
@@ -0,0 +1,116 @@
+#!/bin/bash
+# Full bash required
+# -----------------------------------------------------------------------------
+# Copyright (c) 2007..2010 - RZ Uni FR
+# Copyright (c) 2007..2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# run-virt.sh
+# - This is the generic wrapper for the several virtualization solutions.
+# The idea is to setup a set of variables used by at least two different
+# tools and then include the specific plugin which configures the speci-
+# fied virtualization tool.
+################################################################################
+
+RUNVIRTINCLUDEDIR=/opt/openslx/scripts/includes
+xmlfile="$1"
+
+# Functions needed by vmchooser-run_virt (writelog(), cleanexit(), rv_clean_string())
+source ${RUNVIRTINCLUDEDIR}/vmchooser_runvirt_functions.inc && trap 'trap "" SIGINT SIGTERM; cleanexit' SIGINT SIGTERM
+# Define default dirs / get configs
+source ${RUNVIRTINCLUDEDIR}/set_runvirt_variables.inc
+# Function to detect whether we can use the new way (vmx via http) or the old way (legacy):
+source ${RUNVIRTINCLUDEDIR}/detect_legacy.inc # This yields LEGACY, IMGUUID, IMGVMX
+# For scanning for certain usb classes
+source "${RUNVIRTINCLUDEDIR}/usb_detector.inc"
+
+if [ "$LEGACY" ]; then
+ # check for important files used (filecheck()) - vestigial?
+ source ${RUNVIRTINCLUDEDIR}/check_runvirt_needed_files.inc
+ # Get XML file and dir, legacy (old way)
+ source ${RUNVIRTINCLUDEDIR}/get_xml_file_dir_legacy.inc # xmlfile=$1
+ # xml file sanity checks, legacy
+ source ${RUNVIRTINCLUDEDIR}/check_runvirt_xml_sanity_legacy.inc
+ # print console logo
+ source ${RUNVIRTINCLUDEDIR}/print_runvirt_console_logo.inc
+ # Read needed variables from XML file
+ source ${RUNVIRTINCLUDEDIR}/get_xml_file_variables_legacy.inc
+ # Declaration of hardware relatedt variables
+ source ${RUNVIRTINCLUDEDIR}/set_runvirt_hardware_variables_legacy.inc
+ # Sound setup the rest of the environment and run the configured vm
+ source ${RUNVIRTINCLUDEDIR}/setup_sound.inc
+ # Start printer daemon
+ source ${RUNVIRTINCLUDEDIR}/setup_printer_lpd.inc
+ # Setup virtual floppy b: for windows guests with config.xml, openslx.exe etc.
+ source ${RUNVIRTINCLUDEDIR}/setup_virtual_floppy.inc
+ # Try to use dnbd3 to access the image, nfs/cifs fallback
+ source ${RUNVIRTINCLUDEDIR}/setup_image_access.inc
+ # Get all virtual machine specific stuff from the respective include file
+ source ${RUNVIRTINCLUDEDIR}/setup_vm_hypervisor.inc
+ # start a windowmanager for easier handling
+ source ${RUNVIRTINCLUDEDIR}/start_windowmanager.inc
+ # Start poolvideoswitch if DO_PROFILE has been set (WARNING: fixed IP!)
+ source ${RUNVIRTINCLUDEDIR}/start_pvs.inc
+ # Check if tcpsvd is running. Do not check immediately after spawning,
+ # as this could result in success even if it's not really working.
+ source ${RUNVIRTINCLUDEDIR}/check_lpd.inc
+else
+ # check for important files used (filecheck()) - vestigial?
+ # This include does not currently work. TODO.
+ # source ${RUNVIRTINCLUDEDIR}/check_runvirt_needed_files.inc && filecheck
+
+ # Read needed variables from XML file
+ source ${RUNVIRTINCLUDEDIR}/get_xml_file_variables.inc
+
+ # Sound setup the rest of the environment and run the configured vm
+ source ${RUNVIRTINCLUDEDIR}/setup_sound.inc
+
+ # Declaration of hardware relatedt variables
+ source ${RUNVIRTINCLUDEDIR}/set_runvirt_hardware_variables.inc
+
+ # Start printer daemon
+ source ${RUNVIRTINCLUDEDIR}/setup_printer_lpd.inc
+
+ # Setup virtual floppy b: for windows guests with config.xml, openslx.exe etc.
+ source ${RUNVIRTINCLUDEDIR}/setup_virtual_floppy.inc
+
+ # Get all virtual machine specific stuff from the respective include file
+ source ${RUNVIRTINCLUDEDIR}/setup_image_access.inc
+
+ # start a windowmanager for easier handling
+ source ${RUNVIRTINCLUDEDIR}/setup_vm_hypervisor.inc
+
+ # Try to use dnbd3 to access the image, nfs/cifs fallback
+ source ${RUNVIRTINCLUDEDIR}/start_windowmanager.inc
+
+ # Start poolvideoswitch if DO_PROFILE has been set (WARNING: fixed IP!)
+ source ${RUNVIRTINCLUDEDIR}/start_pvs.inc
+
+ # Check if tcpsvd is running. Do not check immediately after spawning,
+ # as this could result in success even if it's not really working.
+ source ${RUNVIRTINCLUDEDIR}/check_lpd.inc
+
+fi
+
+# This will start the VM
+writelog "VM command: eval ${VIRTCMD} ${VIRTCMDOPTS}"
+
+# Transported from vmware-runvirt include
+sync
+
+eval ${VIRTCMD} ${VIRTCMDOPTS}
+writelog "Bye."
+
+# Postrun for commands after virtualization finishes
+if [ -n "${POSTRUN}" ]; then
+ eval ${POSTRUN} >/dev/null 2>&1
+fi
+
+cleanexit 0
diff --git a/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-xml_filter b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-xml_filter
new file mode 100755
index 00000000..5fd8acc5
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/scripts/vmchooser-xml_filter
@@ -0,0 +1,74 @@
+#!/bin/bash
+# Probably needs bash somewhere
+# -----------------------------------------------------------------------------
+# Copyright (c) 2007..2009 - RZ Uni FR
+# Copyright (c) 2007..2011 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# xmlfilter.sh
+# - This script is invoked by the vmchooser tool. It simply filters xml-
+# files (taking the path to these files in $1). You might modify it in any
+# way to match your needs, e.g. ask some database instead. You can re-
+# implement it in any other programming language too. You simply have to
+# return a list of proper xml files to be interpreted by the vmchooser
+# binary). Please check for vmchooser.sh too ...
+# -----------------------------------------------------------------------------
+
+# This script .
+#
+# currently:
+# - filter for slxgrp (which comes from /etc/machine-setup)
+#
+
+# include default directories
+. /opt/openslx/config
+
+if [ -f "${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser/vmchooser.conf" ]; then
+ . "${OPENSLX_DEFAULT_CONFDIR}/plugins/vmchooser/vmchooser.conf"
+fi
+
+function handlePersistentVM() {
+ if grep --extended-regexp -q "<persistent param=\"(|.+:)$USER(|:.+)\"" "$1"; then
+ # If this virtual machine is useable as persistent version for current
+ # user we provide an additional persistent version.
+ # TODO: This evil black magic needs to be rewritten some day (by someone who understands it)
+ local originalImagePath=$(grep -io '<image_name param=.*"' "$1" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+ local imageName=$(basename "$originalImagePath")
+ eval export SLX_VM_PERSISTENT_PATH="${SLX_VM_PERSISTENT_PATH}" && \
+ local imagePath="${SLX_VM_PERSISTENT_PATH}${imageName}"
+ local persistentConfigVersionFilePath="$(mktemp --directory)/$(basename "$1")"
+ local vmchooserFilePath="$(dirname "$0")/vmchooser-clc"
+ if [ ! -f "$vmchooserFilePath" ]; then
+ vmchooserFilePath='/opt/openslx/scripts/vmchooser-clc'
+ fi
+ "$vmchooserFilePath" "$1" "$persistentConfigVersionFilePath" \
+ --create-persistent-config "$imagePath" && \
+ echo "$persistentConfigVersionFilePath"
+ fi
+}
+
+for FILE in $(find -L "$1" -iname "*.xml"); do
+ # filter all xmls which aren't set active
+ grep -i -q "<active param=.*true.*" "$FILE" || continue
+ # HACK: filter all virtualbox images, as vbox is not ready yet
+ grep -i -q "<virtualmachine param=.*virtualbox.*" "$FILE" && continue
+ if [ -n "${SLX_VM_POOL_FILTER}" ]; then
+ # filter all xmls with pool-param not equal to vmchooser::env
+ if [ $(grep "<pools param=\"${SLX_VM_POOL_FILTER}\"" "$FILE" | wc -l) -eq 1 ]; then
+ handlePersistentVM "$FILE"
+ echo "$FILE"
+ fi
+ else
+ handlePersistentVM "$FILE"
+ # if there is no pool set, just take all available xmls
+ echo "$FILE"
+ fi
+done
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/config/smb.conf b/core/modules/run-virt/data/opt/openslx/vmchooser/config/smb.conf
new file mode 100644
index 00000000..d8966f71
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/config/smb.conf
@@ -0,0 +1,38 @@
+# -----------------------------------------------------------------------------
+# Copyright (c) 2009..2013 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# smb.conf
+# - basic samba configuration file for OpenSLX host-internal networking
+################################################################################
+[global]
+ workgroup = OPENSLX
+ netbios name = HOMESERVER
+ security = SHARE
+ server string = Home and Print Provider
+ bind interfaces only = Yes
+ interfaces = nat1
+ pid directory = /run/samba
+
+[userhome]
+ comment = Home Directory of USER
+ path = /home/USER/PERSISTENT
+ create mask = 0700
+ guest ok = No
+ read only = No
+
+[scratch]
+ comment = Host System Temp Folder
+ path = /tmp
+ create mask = 0700
+ guest ok = Yes
+ read only = No
+ browseable = Yes
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf b/core/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf
new file mode 100644
index 00000000..bca1397c
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/config/udhcpd-nat1.conf
@@ -0,0 +1,54 @@
+# Copyright (c) 2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# udhcpd.conf
+# - This is the udhcpd configuration file servicing the nat1 interface for
+# the various virtualization services. DNSSERVER and DOMAIN are replaced
+# before deamon start in systemd script.
+################################################################################
+
+# start and end of the IP lease block
+start 192.168.101.20
+end 192.168.101.100
+max_leases 80
+
+# interface that udhcpd will use
+interface nat1
+
+# how long an offered address is reserved (leased) in seconds
+offer_time 6000
+
+# location of the leases file
+lease_file /var/lib/udhcpd/udhcpd-nat1.leases
+
+# location of the pid file
+pidfile /var/run/udhcpd-nat1.pid
+
+option dns DNSSERVER
+option subnet 255.255.255.0
+option router 192.168.101.1
+option wins 192.168.101.10
+option domain DOMAIN virtual.site
+option lprsrv 192.168.101.1
+#option ntpsrv NTPSERVER
+
+# additional options known to udhcpd not used in OpenSLX at the moment
+#subnet #timezone
+#router #timesvr
+#namesvr #dns
+#logsvr #cookiesvr
+#lprsvr #bootsize
+#domain #swapsvr
+#rootpath #ipttl
+#mtu #broadcast
+#wins #lease
+#ntpsrv #tftp
+#bootfile #wpad
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/config/vmchooser.conf b/core/modules/run-virt/data/opt/openslx/vmchooser/config/vmchooser.conf
new file mode 100644
index 00000000..b4355880
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/config/vmchooser.conf
@@ -0,0 +1,4 @@
+theme=bwlehrpool
+pvs=0
+base=/mnt/vmstore
+
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/SHARELWS.BAT b/core/modules/run-virt/data/opt/openslx/vmchooser/data/SHARELWS.BAT
new file mode 100644
index 00000000..01838705
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/SHARELWS.BAT
@@ -0,0 +1,40 @@
+@echo off
+
+setlocal EnableDelayedExpansion
+
+rem Kein sleep oder timeout bis Win7, also einen
+rem haesslichen Hack (Zeitverz. ca. 5 sec)
+rem Sinn der Verzoegerung: Mitunter (1/3) wird
+rem sonst das erste Netzlaufwerk nicht eingehaengt
+
+@ping -n 5 localhost> nul
+
+rem Konfigdatei auslesen und erstmal in Feld:
+set n=0
+for /f %%i in (b:\sharelw.cfg) do (
+ set array[!n!]=%%i
+ set /A n+=1
+)
+
+rem Aufruf für net use erzeugen:
+set "i=0"
+for %%b in (K L M N O P Q R S T U V W X Y Z) do (
+ if defined array[!i!] (
+ call set aufruf[!i!]=%%b: %%array[!i!]%%
+ set /A "i+=1"
+ ) else (
+ goto :Schleifenende
+ )
+)
+:Schleifenende
+
+rem net use-Aufrufe
+set "i=0"
+:Ausdrucken
+if defined aufruf[!i!] (
+ call net use %%aufruf[!i!]%%
+ set /a "i+=1"
+ GOTO :Ausdrucken
+)
+
+exit /B
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/bootpgm.exe b/core/modules/run-virt/data/opt/openslx/vmchooser/data/bootpgm.exe
new file mode 100644
index 00000000..88f89418
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/bootpgm.exe
Binary files differ
diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe b/core/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe
new file mode 100755
index 00000000..114a0dc0
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/vmchooser/data/openslx.exe
Binary files differ
diff --git a/core/modules/run-virt/data/opt/openslx/xsessions/default.desktop b/core/modules/run-virt/data/opt/openslx/xsessions/default.desktop
new file mode 100755
index 00000000..9d3a472d
--- /dev/null
+++ b/core/modules/run-virt/data/opt/openslx/xsessions/default.desktop
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=virtual machine chooser (default)
+Name[de]=Virtuelle Maschine auswählen
+Comment=This session starts the vm session chooser
+Comment[de]=Diese Sitzung startet das Auswahlmenü für die vorhandenen Sitzungen
+Exec=/opt/openslx/bin/vmchooser -c /opt/openslx/vmchooser/config/vmchooser.conf
+TryExec=/opt/openslx/bin/vmchooser
+Icon=
+Type=Application
diff --git a/core/modules/run-virt/module.build b/core/modules/run-virt/module.build
new file mode 100644
index 00000000..26762bca
--- /dev/null
+++ b/core/modules/run-virt/module.build
@@ -0,0 +1,16 @@
+
+fetch_source () {
+ :
+}
+
+build () {
+ local COPYLIST="list_dpkg_output"
+ rm -f -- "$COPYLIST"
+ list_packet_files > "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/run-virt/module.conf b/core/modules/run-virt/module.conf
new file mode 100644
index 00000000..bd24ba58
--- /dev/null
+++ b/core/modules/run-virt/module.conf
@@ -0,0 +1,4 @@
+REQUIRED_BINARIES="
+ lsusb
+"
+
diff --git a/core/modules/run-virt/module.conf.ubuntu b/core/modules/run-virt/module.conf.ubuntu
new file mode 100644
index 00000000..b285210b
--- /dev/null
+++ b/core/modules/run-virt/module.conf.ubuntu
@@ -0,0 +1,7 @@
+REQUIRED_INSTALLED_PACKAGES="
+ usbutils
+"
+REQUIRED_CONTENT_PACKAGES="
+ usbutils
+"
+
diff --git a/core/modules/run-virt/winres.c b/core/modules/run-virt/winres.c
new file mode 100644
index 00000000..c9065c03
--- /dev/null
+++ b/core/modules/run-virt/winres.c
@@ -0,0 +1,169 @@
+#define NTDDI_VERSION NTDDI_VISTA
+#define WINVER 0x0602
+#define _WIN32_WINNT 0x0602
+//#include <winsock2.h>
+#include <windows.h>
+#include <mmdeviceapi.h>
+#include <endpointvolume.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <initguid.h>
+
+DEFINE_GUID(ID_IAudioEndpointVolume, 0x5CDF2C82, 0x841E, 0x4546, 0x97, 0x22, 0x0C, 0xF7, 0x40, 0x78, 0x22, 0x9A);
+DEFINE_GUID(ID_IMMDeviceEnumerator, 0xa95664d2, 0x9614, 0x4f35, 0xa7,0x46, 0xde,0x8d,0xb6,0x36,0x17,0xe6);
+DEFINE_GUID(ID_MMDeviceEnumerator, 0xBCDE0395, 0xE52F, 0x467C, 0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E);
+
+static int setResolution();
+static int muteSound();
+static int setShutdownText();
+
+static void CALLBACK resetShutdown(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
+{
+ setShutdownText();
+}
+
+int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
+{
+ int ret;
+ /*
+ // Part 1: Auf UDP Paket vom Host warten, mit Anweisungen zur Auflösung
+ WSADATA wsa;
+ WSAStartup(MAKEWORD(2, 0), &wsa);
+ if (ret != 0) return 1;
+ SOCKET s = socket(PF_INET, SOCK_DGRAM, 0);
+ if (s == INVALID_SOCKET) return 2;
+ SOCKADDR_IN local, remote;
+ local.sin_family = AF_INET;
+ local.sin_port = htons(2013);
+ local.sin_addr.s_addr = ADDR_ANY;
+ ret = bind(s, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
+ if (ret == SOCKET_ERROR) return 3;
+ for (;;) {
+ recvfrom(s,
+ }
+ */
+ OSVERSIONINFO version;
+ version.dwOSVersionInfoSize = sizeof(version);
+ BOOL retVer = GetVersionEx(&version);
+ // Set resolution to what HOSTRES.TXT says
+ setResolution();
+ // Mute sound by default
+ if (retVer && version.dwMajorVersion >= 6)
+ muteSound();
+ // Disable screen saver as it might give the false impression that the session is securely locked
+ SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
+ // Disable standby and idle-mode (this is a VM!)
+ if (version.dwMajorVersion >= 6) { // Vista+
+ SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED | ES_AWAYMODE_REQUIRED);
+ } else { // XP/2003
+ SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);
+ }
+ // Shutdown button label
+ if (retVer && version.dwMajorVersion == 6 && version.dwMinorVersion == 1) {
+ // Only on Windows 7
+ char buffer[100];
+ // Repeatedly set caption
+ UINT_PTR tRet = SetTimer(NULL, 0, 5000, (TIMERPROC)&resetShutdown);
+ if (tRet == 0) {
+ snprintf(buffer, 100, "Could not create timer: %d", (int)tRet);
+ MessageBoxA(0, buffer, "SetTimer", 0);
+ return 0;
+ }
+ // Message pump
+ MSG Msg;
+ while(GetMessage(&Msg, NULL, 0, 0) > 0) {
+ TranslateMessage(&Msg);
+ DispatchMessage(&Msg);
+ }
+ }
+ return 0;
+}
+
+static int setResolution()
+{
+ int ret, i;
+ int width, height;
+ // Quicker way: use config file in floppy
+ FILE *h = fopen("B:\\hostres.txt", "rb");
+ if (h == NULL) return 4;
+ char data[200] = "";
+ fread(data, 200, 1, h);
+ char *x = strchr(data, 'x');
+ if (x == NULL) return 5;
+ *x++ = '\0';
+ width = atoi(data);
+ height = atoi(x);
+ fclose(h);
+ // Part 2: Auflösung setzen und verabschieden
+ DEVMODE mode;
+ int query = 1337;
+ for (i = 0; i < 6; ++i) {
+ memset(&mode, 0, sizeof(mode));
+ mode.dmSize = sizeof(mode);
+ // MSDN recommends to fill the struct first by querying....
+ query = EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &mode);
+ // Then set our own desired mode
+ mode.dmPelsWidth = width;
+ mode.dmPelsHeight = height;
+ mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
+ ret = ChangeDisplaySettings(&mode , (i < 3 ? CDS_GLOBAL : 0) | (i < 2 ? CDS_UPDATEREGISTRY : 0));
+ if (ret == DISP_CHANGE_SUCCESSFUL) break;
+ Sleep(1000);
+ }
+ if (ret != DISP_CHANGE_SUCCESSFUL) {
+ char err[200];
+ snprintf(err, 200,
+ "Fehler beim Setzen der Aufloesung: %d (soll: 0) / %d ( soll: !0)\r\n"
+ "Zielaufloesung: %d * %d", ret, query, width, height);
+ MessageBoxA(0, err, "OpenSLX", 0);
+ }
+ return 0;
+}
+
+static int muteSound()
+{
+ CoInitialize(NULL);
+ IMMDeviceEnumerator *deviceEnumerator = NULL;
+ HRESULT hr = CoCreateInstance(&ID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &ID_IMMDeviceEnumerator, (LPVOID *)&deviceEnumerator);
+ if (hr != S_OK) {
+ MessageBoxA(0, "CoCreateInstance failed. Cannot mute.", "OpenSLX", 0);
+ return 1;
+ }
+ //deviceEnumerator->lpVtbl->AddRef(deviceEnumerator);
+ IMMDevice *defaultDevice = NULL;
+ hr = deviceEnumerator->lpVtbl->GetDefaultAudioEndpoint(deviceEnumerator, eRender, eConsole, &defaultDevice);
+ if (hr != S_OK) {
+ MessageBoxA(0, "GetDefaultAudioEndpoint failed. Cannot mute.", "OpenSLX", 0);
+ return 2;
+ }
+ //defaultDevice->lpVtbl->AddRef(defaultDevice);
+ //deviceEnumerator->lpVtbl->Release(deviceEnumerator);
+ IAudioEndpointVolume *endpointVolume = NULL;
+ hr = defaultDevice->lpVtbl->Activate(defaultDevice, &ID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
+ if (hr != S_OK) {
+ MessageBoxA(0, "IMMDevice::Activate() failed. Cannot mute.", "OpenSLX", 0);
+ return 3;
+ }
+ //endpointVolume->lpVtbl->AddRef(endpointVolume);
+ //defaultDevice->lpVtbl->Release(defaultDevice);
+ float targetVolume = 1;
+ endpointVolume->lpVtbl->SetMasterVolumeLevelScalar(endpointVolume, targetVolume, NULL);
+ endpointVolume->lpVtbl->SetMute(endpointVolume, TRUE, NULL);
+ //endpointVolume->lpVtbl->Release(endpointVolume);
+ //CoUninitialize();
+ return 0;
+}
+
+static int setShutdownText()
+{
+ HWND hMenu = FindWindowA("DV2ControlHost", NULL);
+ if (hMenu == NULL) return 1;
+ HWND hPane = FindWindowExA(hMenu, NULL, "DesktopLogoffPane", NULL);
+ if (hMenu == NULL) return 2;
+ HWND hButton = FindWindowExA(hPane, NULL, "Button", NULL);
+ if (hButton == NULL) return 3;
+ if (SendMessage(hButton, WM_SETTEXT, 0, (LPARAM)"Abmelden") != TRUE) return 4;
+ return 0;
+}
+
diff --git a/core/modules/safe-mode/data/etc/systemd/system/exam.service b/core/modules/safe-mode/data/etc/systemd/system/exam.service
new file mode 100644
index 00000000..be0809b4
--- /dev/null
+++ b/core/modules/safe-mode/data/etc/systemd/system/exam.service
@@ -0,0 +1,7 @@
+[Unit]
+Description=Sets up safe mode (no magic keys, no tty switch, no openbox menu)
+DefaultDependencies=no
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-safe_mode
diff --git a/core/modules/safe-mode/data/opt/openslx/scripts/systemd-safe_mode b/core/modules/safe-mode/data/opt/openslx/scripts/systemd-safe_mode
new file mode 100755
index 00000000..ebcee099
--- /dev/null
+++ b/core/modules/safe-mode/data/opt/openslx/scripts/systemd-safe_mode
@@ -0,0 +1,24 @@
+#!/bin/ash
+
+disable_tty_switch() {
+ cat <<EOF > /etc/X11/xorg.conf.d/50-no-tty.conf
+Section "ServerFlags"
+ Option "DontVTSwitch" "true"
+EndSection
+EOF
+}
+
+disable_openbox_menu() {
+ [ ! -e "/etc/xdg/openbox/rc.xml.safe" ] && \
+ echo "No rc.xml.safe template found." && return 1
+ cp "/etc/xdg/openbox/rc.xml" "/root/rc.xml.unsafe"
+ cp "/etc/xdg/openbox/rc.xml.safe" "/etc/xdg/openbox/rc.xml"
+}
+
+disable_magic_keys() {
+ echo 0 > /proc/sys/kernel/sysrq
+}
+
+disable_tty_switch
+disable_openbox_menu
+disable_magic_keys
diff --git a/core/modules/safe-mode/module.build b/core/modules/safe-mode/module.build
new file mode 100644
index 00000000..86b1fd00
--- /dev/null
+++ b/core/modules/safe-mode/module.build
@@ -0,0 +1,12 @@
+# fake module simply copying its data/ files
+fetch_source() {
+ :
+}
+
+build() {
+ :
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/safe-mode/module.conf b/core/modules/safe-mode/module.conf
new file mode 100644
index 00000000..0cd03752
--- /dev/null
+++ b/core/modules/safe-mode/module.conf
@@ -0,0 +1,3 @@
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/samba/module.build b/core/modules/samba/module.build
new file mode 100644
index 00000000..a0a60831
--- /dev/null
+++ b/core/modules/samba/module.build
@@ -0,0 +1,26 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ if [ "x$PACKET_MANAGER" == "xzypper" ]; then
+ if [ $(zypper lr | grep -ci filesystems) -eq 0 ]; then
+ zypper addrepo http://download.opensuse.org/repositories/filesystems/openSUSE_${SYS_VERSION} Filesystems
+ pinfo "Repository added: OpenSuse Build filesystems"
+ fi
+ # Ubuntu writes to /etc, Suse does not:
+ mkdir "$MODULE_BUILD_DIR"/etc/
+ cp /usr/share/doc/packages/smbnetfs/smbnetfs.conf "$MODULE_BUILD_DIR"/etc/
+ fi
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+ return 0
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/samba/module.conf b/core/modules/samba/module.conf
new file mode 100644
index 00000000..00063187
--- /dev/null
+++ b/core/modules/samba/module.conf
@@ -0,0 +1,24 @@
+REQUIRED_BINARIES="
+ smbd
+ nmbd
+ smbclient
+ winbindd
+ smbnetfs
+ fusermount
+ keyctl
+ request-key
+ key.dns_resolver
+"
+REQUIRED_FILES="
+ /etc/smbnetfs.conf
+ /etc/request-key.conf
+ /etc/request-key.d
+"
+# TODO dont copy all the binaries, strip the list down.
+REQUIRED_DIRECTORIES="
+ /usr/bin
+"
+# TODO check if the /var/lib/samba/*.tdg can be generated by mltk.
+REQUIRED_SYSTEM_FILES="
+ /var/lib/samba
+"
diff --git a/core/modules/samba/module.conf.opensuse b/core/modules/samba/module.conf.opensuse
new file mode 100644
index 00000000..fd06e50a
--- /dev/null
+++ b/core/modules/samba/module.conf.opensuse
@@ -0,0 +1,24 @@
+REQUIRED_INSTALLED_PACKAGES="
+ samba
+ samba-client
+ samba-winbind
+ krb5-client
+ cifs-utils
+ smbnetfs
+ fuse
+ keyutils
+"
+REQUIRED_CONTENT_PACKAGES="
+ samba
+ samba-client
+ samba-winbind
+ krb5-client
+ cifs-utils
+ smbnetfs
+ fuse
+ keyutils
+"
+
+# This is just a list for grep excludes used in samba.build opensuse branch
+# Please use pipe symbol and backslash (\|) as separator as being used in grep
+REQUIRED_PACKET_FILES_BLACKLIST="/etc/samba/smbpasswd\|/ding/dong"
diff --git a/core/modules/samba/module.conf.ubuntu b/core/modules/samba/module.conf.ubuntu
new file mode 100644
index 00000000..20bb46ba
--- /dev/null
+++ b/core/modules/samba/module.conf.ubuntu
@@ -0,0 +1,20 @@
+REQUIRED_INSTALLED_PACKAGES="
+ samba
+ smbclient
+ winbind
+ krb5-user
+ cifs-utils
+ smbnetfs
+ fuse
+ keyutils
+"
+REQUIRED_CONTENT_PACKAGES="
+ samba
+ smbclient
+ winbind
+ krb5-user
+ cifs-utils
+ smbnetfs
+ fuse
+ keyutils
+"
diff --git a/core/modules/smartctl/data/etc/cron.d/openslx-smartctl b/core/modules/smartctl/data/etc/cron.d/openslx-smartctl
new file mode 100644
index 00000000..a895e8db
--- /dev/null
+++ b/core/modules/smartctl/data/etc/cron.d/openslx-smartctl
@@ -0,0 +1,8 @@
+# Check smart values at night. If the machine gets shut down at night,
+# this will not trigger, but we check it once on boot anyways.
+
+SHELL=/bin/ash
+PATH=/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin
+
+4 4 * * * root /opt/openslx/scripts/systemd-smartctl
+
diff --git a/core/modules/smartctl/data/etc/systemd/system/basic.target.wants/smartctl.service b/core/modules/smartctl/data/etc/systemd/system/basic.target.wants/smartctl.service
new file mode 120000
index 00000000..b0849c0c
--- /dev/null
+++ b/core/modules/smartctl/data/etc/systemd/system/basic.target.wants/smartctl.service
@@ -0,0 +1 @@
+../smartctl.service \ No newline at end of file
diff --git a/core/modules/smartctl/data/etc/systemd/system/smartctl.service b/core/modules/smartctl/data/etc/systemd/system/smartctl.service
new file mode 100644
index 00000000..ab268cbc
--- /dev/null
+++ b/core/modules/smartctl/data/etc/systemd/system/smartctl.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Check HDD health status
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-smartctl
+
diff --git a/core/modules/smartctl/data/opt/openslx/scripts/systemd-smartctl b/core/modules/smartctl/data/opt/openslx/scripts/systemd-smartctl
new file mode 100755
index 00000000..1eef0a23
--- /dev/null
+++ b/core/modules/smartctl/data/opt/openslx/scripts/systemd-smartctl
@@ -0,0 +1,33 @@
+#!/bin/ash
+
+# Check Reallocated_Sector_Ct and Spin_Retry_Count of local disk(s)
+
+. /opt/openslx/config
+
+[ -z "$SLX_SMARTCTL_MIN_REALLOC" ] && SLX_SMARTCTL_MIN_REALLOC=0
+FILES=
+
+for dev in /dev/sd?; do
+ FILE=$(mktemp)
+ FILES="$FILES $FILE"
+ smartctl -H -A -f "brief" "$dev" > "$FILE" || continue # should we report devices where smartctl doesn't work?
+ # parse
+ OVERALL=$(grep -o "test result: .*$" "$FILE" | cut -c 14-)
+ [ "x$OVERALL" = "xPASSED" ] && OVERALL=""
+ REALLOC=$(grep "^ *5 " "$FILE" | awk '{print $8}')
+ SPINRETRY_VAL=$(grep "^ *10 " "$FILE" | awk '{print $4}')
+ SPINRETRY_THR=$(grep "^ *10 " "$FILE" | awk '{print $6}')
+ # report if applicable
+ if [ -n "$OVERALL" ]; then
+ slxlog "smartctl-fail" "Failed HDD: $dev reports health as $OVERALL" "$FILE"
+ fi
+ if [ -n "$REALLOC" ] && [ "$REALLOC" -gt "$SLX_SMARTCTL_MIN_REALLOC" ]; then
+ slxlog "smartctl-realloc" "Failing HDD: $dev has $REALLOC reallocated sectors!" "$FILE"
+ fi
+ if [ -n "$SPINRETRY_VAL" ] && [ "$SPINRETRY_VAL" -le "$SPINRETRY_THR" ]; then
+ slxlog "smartctl-spinretry" "Failing HDD: $dev has bad spin retry count! ($SPINRETRY_VAL/$SPINRETRY_THR)" "$FILE"
+ fi
+done
+sleep 2 # give slxlog a little time, as it's running async
+[ -n "$FILES" ] && rm -f -- $FILES # list, no ""
+
diff --git a/core/modules/smartctl/module.build b/core/modules/smartctl/module.build
new file mode 100644
index 00000000..435a7b10
--- /dev/null
+++ b/core/modules/smartctl/module.build
@@ -0,0 +1,13 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ list_packet_files > "$COPYLIST"
+ tarcopy "$(cat "${COPYLIST}" | sort -u)" "${MODULE_BUILD_DIR}"
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/smartctl/module.conf b/core/modules/smartctl/module.conf
new file mode 100644
index 00000000..9ea1ed03
--- /dev/null
+++ b/core/modules/smartctl/module.conf
@@ -0,0 +1,5 @@
+REQUIRED_BINARIES="
+ smartctl
+"
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/smartctl/module.conf.centos b/core/modules/smartctl/module.conf.centos
new file mode 100644
index 00000000..d699f2f0
--- /dev/null
+++ b/core/modules/smartctl/module.conf.centos
@@ -0,0 +1,6 @@
+REQUIRED_CONTENT_PACKAGES="
+ smartmontools
+"
+REQUIRED_INSTALLED_PACKAGES="
+ smartmontools
+"
diff --git a/core/modules/smartctl/module.conf.debian b/core/modules/smartctl/module.conf.debian
new file mode 100644
index 00000000..d699f2f0
--- /dev/null
+++ b/core/modules/smartctl/module.conf.debian
@@ -0,0 +1,6 @@
+REQUIRED_CONTENT_PACKAGES="
+ smartmontools
+"
+REQUIRED_INSTALLED_PACKAGES="
+ smartmontools
+"
diff --git a/core/modules/smartctl/module.conf.fedora b/core/modules/smartctl/module.conf.fedora
new file mode 100644
index 00000000..d699f2f0
--- /dev/null
+++ b/core/modules/smartctl/module.conf.fedora
@@ -0,0 +1,6 @@
+REQUIRED_CONTENT_PACKAGES="
+ smartmontools
+"
+REQUIRED_INSTALLED_PACKAGES="
+ smartmontools
+"
diff --git a/core/modules/smartctl/module.conf.opensuse b/core/modules/smartctl/module.conf.opensuse
new file mode 100644
index 00000000..d699f2f0
--- /dev/null
+++ b/core/modules/smartctl/module.conf.opensuse
@@ -0,0 +1,6 @@
+REQUIRED_CONTENT_PACKAGES="
+ smartmontools
+"
+REQUIRED_INSTALLED_PACKAGES="
+ smartmontools
+"
diff --git a/core/modules/smartctl/module.conf.ubuntu b/core/modules/smartctl/module.conf.ubuntu
new file mode 100644
index 00000000..d699f2f0
--- /dev/null
+++ b/core/modules/smartctl/module.conf.ubuntu
@@ -0,0 +1,6 @@
+REQUIRED_CONTENT_PACKAGES="
+ smartmontools
+"
+REQUIRED_INSTALLED_PACKAGES="
+ smartmontools
+"
diff --git a/core/modules/smbclient/data/etc/tmpfiles.d/ensure-smbconf-exists.conf b/core/modules/smbclient/data/etc/tmpfiles.d/ensure-smbconf-exists.conf
new file mode 100644
index 00000000..f893eb71
--- /dev/null
+++ b/core/modules/smbclient/data/etc/tmpfiles.d/ensure-smbconf-exists.conf
@@ -0,0 +1,4 @@
+# smbspool for some reason insists on reading this file, even if it is empty, otherwise it will bail out
+d /etc/samba 0755 root root -
+f /etc/samba/smb.conf 0644 root root -
+
diff --git a/core/modules/smbclient/module.build b/core/modules/smbclient/module.build
new file mode 100644
index 00000000..ec2c80fe
--- /dev/null
+++ b/core/modules/smbclient/module.build
@@ -0,0 +1,21 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+
+ mkdir -p "${MODULE_BUILD_DIR}/usr/lib/cups/backend" || perror "Could not create '${MODULE_BUILD_DIR}/usr/lib/cups/backend'"
+ local BIN_LOCATION="$(which smbspool)"
+ if [ ! -z "${BIN_LOCATION}" -a -e "${BIN_LOCATION}" ]; then
+ ln -sf "${BIN_LOCATION}" "${MODULE_BUILD_DIR}/usr/lib/cups/backend/smb"
+ fi
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/smbclient/module.conf b/core/modules/smbclient/module.conf
new file mode 100644
index 00000000..460c57b5
--- /dev/null
+++ b/core/modules/smbclient/module.conf
@@ -0,0 +1,10 @@
+REQUIRED_BINARIES="
+ smbspool
+ smbcacls
+ rpcclient
+ smbcquotas
+ smbget
+ smbclient
+ smbtree
+ smbtar
+"
diff --git a/core/modules/smbclient/module.conf.debian b/core/modules/smbclient/module.conf.debian
new file mode 100644
index 00000000..4b33f4bd
--- /dev/null
+++ b/core/modules/smbclient/module.conf.debian
@@ -0,0 +1,9 @@
+REQUIRED_INSTALLED_PACKAGES="
+ smbclient
+"
+REQUIRED_CONTENT_PACKAGES="
+ smbclient
+"
+REQUIRED_FILES="
+ /usr/lib/cups/backend/smb
+"
diff --git a/core/modules/smbclient/module.conf.fedora b/core/modules/smbclient/module.conf.fedora
new file mode 100644
index 00000000..f524d100
--- /dev/null
+++ b/core/modules/smbclient/module.conf.fedora
@@ -0,0 +1,9 @@
+REQUIRED_INSTALLED_PACKAGES="
+ samba-client
+"
+REQUIRED_CONTENT_PACKAGES="
+ samba-client
+"
+REQUIRED_FILES="
+ /usr/lib/cups/backend/smb
+"
diff --git a/core/modules/smbclient/module.conf.opensuse b/core/modules/smbclient/module.conf.opensuse
new file mode 100644
index 00000000..f524d100
--- /dev/null
+++ b/core/modules/smbclient/module.conf.opensuse
@@ -0,0 +1,9 @@
+REQUIRED_INSTALLED_PACKAGES="
+ samba-client
+"
+REQUIRED_CONTENT_PACKAGES="
+ samba-client
+"
+REQUIRED_FILES="
+ /usr/lib/cups/backend/smb
+"
diff --git a/core/modules/smbclient/module.conf.ubuntu b/core/modules/smbclient/module.conf.ubuntu
new file mode 100644
index 00000000..4b33f4bd
--- /dev/null
+++ b/core/modules/smbclient/module.conf.ubuntu
@@ -0,0 +1,9 @@
+REQUIRED_INSTALLED_PACKAGES="
+ smbclient
+"
+REQUIRED_CONTENT_PACKAGES="
+ smbclient
+"
+REQUIRED_FILES="
+ /usr/lib/cups/backend/smb
+"
diff --git a/core/modules/splash-openslx/README b/core/modules/splash-openslx/README
new file mode 100644
index 00000000..6e186aa2
--- /dev/null
+++ b/core/modules/splash-openslx/README
@@ -0,0 +1,6 @@
+Howto:
+To display the splash screen, you need to add this
+module to your stage31 obviously, and also add
+vga=current quiet splash
+to your KCL. Feel free to copy this module
+and replace the splash.ppm with your own.
diff --git a/core/modules/splash-openslx/data/etc/splash.ppm.gz b/core/modules/splash-openslx/data/etc/splash.ppm.gz
new file mode 100644
index 00000000..d30d44e2
--- /dev/null
+++ b/core/modules/splash-openslx/data/etc/splash.ppm.gz
Binary files differ
diff --git a/core/modules/splash-openslx/module.build b/core/modules/splash-openslx/module.build
new file mode 100644
index 00000000..ccb7c4e1
--- /dev/null
+++ b/core/modules/splash-openslx/module.build
@@ -0,0 +1,13 @@
+
+fetch_source () {
+ :
+}
+
+build () {
+ :
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/splash-openslx/module.conf b/core/modules/splash-openslx/module.conf
new file mode 100644
index 00000000..6778a258
--- /dev/null
+++ b/core/modules/splash-openslx/module.conf
@@ -0,0 +1 @@
+# (void)
diff --git a/core/modules/ssh-auth-keys/data/etc/systemd/system/basic.target.wants/ssh-auth-keys.service b/core/modules/ssh-auth-keys/data/etc/systemd/system/basic.target.wants/ssh-auth-keys.service
new file mode 120000
index 00000000..2bddb0ca
--- /dev/null
+++ b/core/modules/ssh-auth-keys/data/etc/systemd/system/basic.target.wants/ssh-auth-keys.service
@@ -0,0 +1 @@
+../ssh-auth-keys.service \ No newline at end of file
diff --git a/core/modules/ssh-auth-keys/data/etc/systemd/system/ssh-auth-keys.service b/core/modules/ssh-auth-keys/data/etc/systemd/system/ssh-auth-keys.service
new file mode 100644
index 00000000..20a7b8f9
--- /dev/null
+++ b/core/modules/ssh-auth-keys/data/etc/systemd/system/ssh-auth-keys.service
@@ -0,0 +1,7 @@
+[Unit]
+Description=Enable SSH keys in authorized_keys.d/ folder
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-ssh_auth_keys
diff --git a/core/modules/ssh-auth-keys/data/opt/openslx/scripts/systemd-ssh_auth_keys b/core/modules/ssh-auth-keys/data/opt/openslx/scripts/systemd-ssh_auth_keys
new file mode 100755
index 00000000..9a64b83a
--- /dev/null
+++ b/core/modules/ssh-auth-keys/data/opt/openslx/scripts/systemd-ssh_auth_keys
@@ -0,0 +1,20 @@
+#!/bin/ash
+
+AUTH_KEYS_DIR="/root/.ssh/authorized_keys.d/"
+AUTH_KEYS_FILE="/root/.ssh/authorized_keys"
+
+# do we even have the directory?
+[ ! -d "$AUTH_KEYS_DIR" ] && echo "No such directory: $AUTH_KEYS_DIR" && exit 0
+
+mkdir -m 700 $(dirname "$AUTH_KEYS_FILE") 2>/dev/null
+
+# ok, lets cat them in the real file
+for KEY in "$AUTH_KEYS_DIR"/* ; do
+ if ! cat $KEY >> "$AUTH_KEYS_FILE" ; then
+ echo "Could not add '$KEY' to '$AUTH_KEYS_FILE'"
+ exit 1
+ fi
+done
+
+# all done, all good
+exit 0
diff --git a/core/modules/ssh-auth-keys/module.build b/core/modules/ssh-auth-keys/module.build
new file mode 100644
index 00000000..97e93235
--- /dev/null
+++ b/core/modules/ssh-auth-keys/module.build
@@ -0,0 +1,11 @@
+fetch_source() {
+ :
+}
+
+build() {
+ :
+}
+
+post_copy() {
+ :
+}
diff --git a/core/modules/ssh-auth-keys/module.conf b/core/modules/ssh-auth-keys/module.conf
new file mode 100644
index 00000000..0cd03752
--- /dev/null
+++ b/core/modules/ssh-auth-keys/module.conf
@@ -0,0 +1,3 @@
+REQUIRED_BINARIES=""
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/sshd/TODO b/core/modules/sshd/TODO
new file mode 100644
index 00000000..b4e0a9c1
--- /dev/null
+++ b/core/modules/sshd/TODO
@@ -0,0 +1,3 @@
+make mltk install sshd if its not installed
+
+Distros: Ubuntu, Suse, soon Arch!
diff --git a/core/modules/sshd/data/etc/issue.net b/core/modules/sshd/data/etc/issue.net
new file mode 100644
index 00000000..7dfbddb5
--- /dev/null
+++ b/core/modules/sshd/data/etc/issue.net
@@ -0,0 +1,6 @@
+++++++++++++++++++++++++++++++++++++++
++ +
++ MiniLinux SSH Session +
++ +
+++++++++++++++++++++++++++++++++++++++
+
diff --git a/core/modules/sshd/data/etc/ssh/ssh_host_dsa_key b/core/modules/sshd/data/etc/ssh/ssh_host_dsa_key
new file mode 100644
index 00000000..0132fe84
--- /dev/null
+++ b/core/modules/sshd/data/etc/ssh/ssh_host_dsa_key
@@ -0,0 +1,12 @@
+-----BEGIN DSA PRIVATE KEY-----
+MIIBugIBAAKBgQDu6vk2uFnUyKt9/In9Rtkq+2zqwd8slm90NUt6JBXyjYsIJwRp
+hxRG1sFDho3ogog5hlt+y+UuNPc5QchT/e3O71zt2XbrfK2irr4XBJILuup95AGe
+iW/gzMIUD4an8I58yYM9rXhTzvIMwri7jM6EKlCUytafVTdMICVH78Y97QIVAJ9a
+Cs8Gxy91XMoHK3zcHutQcIF3AoGAV6p2ISW0pAE+2GbeKUDvraCNXDG37JaMCjZr
+S+NB3cN/vJwjy0fPI6CB5o6GcgFhB0cxdgCb60lV8Qz76clx4ZJId8PVxeKp4vSw
+kHdSbcRlBpRbe/YJY8ja/ITkvmeiEMncTQByo1t2VXDqHbvgQsllIqbbRWl0B2yV
+WO4Uw4gCgYAFCgiy2Ncal0KhsHAJV5dP4imeyd49lONI488RO18wiODhCzGtkbvV
+pL/saDZWkm3pUhJ9J0qalIZaJGG0WO6GHiQC5CzH21GF9RgsoNjrMl3gzuZB9FxB
+4cg8UyZ2QCqXlRusOCIiZhBdIZzDkK6HlQMMtFGEGg/c9yNgxkPAzQIULLxfDTNh
+8Ouz5BhfKWJrZ0XGUsA=
+-----END DSA PRIVATE KEY-----
diff --git a/core/modules/sshd/data/etc/ssh/ssh_host_dsa_key.pub b/core/modules/sshd/data/etc/ssh/ssh_host_dsa_key.pub
new file mode 100644
index 00000000..97af5cb0
--- /dev/null
+++ b/core/modules/sshd/data/etc/ssh/ssh_host_dsa_key.pub
@@ -0,0 +1 @@
+ssh-dss AAAAB3NzaC1kc3MAAACBAO7q+Ta4WdTIq338if1G2Sr7bOrB3yyWb3Q1S3okFfKNiwgnBGmHFEbWwUOGjeiCiDmGW37L5S409zlByFP97c7vXO3Zdut8raKuvhcEkgu66n3kAZ6Jb+DMwhQPhqfwjnzJgz2teFPO8gzCuLuMzoQqUJTK1p9VN0wgJUfvxj3tAAAAFQCfWgrPBscvdVzKByt83B7rUHCBdwAAAIBXqnYhJbSkAT7YZt4pQO+toI1cMbfslowKNmtL40Hdw3+8nCPLR88joIHmjoZyAWEHRzF2AJvrSVXxDPvpyXHhkkh3w9XF4qni9LCQd1JtxGUGlFt79gljyNr8hOS+Z6IQydxNAHKjW3ZVcOodu+BCyWUipttFaXQHbJVY7hTDiAAAAIAFCgiy2Ncal0KhsHAJV5dP4imeyd49lONI488RO18wiODhCzGtkbvVpL/saDZWkm3pUhJ9J0qalIZaJGG0WO6GHiQC5CzH21GF9RgsoNjrMl3gzuZB9FxB4cg8UyZ2QCqXlRusOCIiZhBdIZzDkK6HlQMMtFGEGg/c9yNgxkPAzQ== root@stp
diff --git a/core/modules/sshd/data/etc/ssh/ssh_host_ecdsa_key b/core/modules/sshd/data/etc/ssh/ssh_host_ecdsa_key
new file mode 100644
index 00000000..1fea2717
--- /dev/null
+++ b/core/modules/sshd/data/etc/ssh/ssh_host_ecdsa_key
@@ -0,0 +1,6 @@
+-----BEGIN EC PRIVATE KEY-----
+MIGkAgEBBDDwyXBE0s5I7Cci/by2EInEyHyIvfC6IB5U8XF5eZUDlVMxkgBYK0sm
+r3Lyuy4XR3CgBwYFK4EEACKhZANiAATwyn0SyUKavp9CfPiv9IRSu8ICK1HekDMf
+lB4AIOObT1CMEROVfwh6ur1w980426YSZW+j+bQN5RQVDF7njcsD0eiSeJj8HVrR
+3PDpreZJMZVV2mLNYZxuE0kx9ILK12I=
+-----END EC PRIVATE KEY-----
diff --git a/core/modules/sshd/data/etc/ssh/ssh_host_ecdsa_key.pub b/core/modules/sshd/data/etc/ssh/ssh_host_ecdsa_key.pub
new file mode 100644
index 00000000..0ef413ba
--- /dev/null
+++ b/core/modules/sshd/data/etc/ssh/ssh_host_ecdsa_key.pub
@@ -0,0 +1 @@
+ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBPDKfRLJQpq+n0J8+K/0hFK7wgIrUd6QMx+UHgAg45tPUIwRE5V/CHq6vXD3zTjbphJlb6P5tA3lFBUMXueNywPR6JJ4mPwdWtHc8Omt5kkxlVXaYs1hnG4TSTH0gsrXYg== root@stp
diff --git a/core/modules/sshd/data/etc/ssh/ssh_host_rsa_key b/core/modules/sshd/data/etc/ssh/ssh_host_rsa_key
new file mode 100644
index 00000000..b37b5a74
--- /dev/null
+++ b/core/modules/sshd/data/etc/ssh/ssh_host_rsa_key
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQC4QG0lNN4NewU8nTxNr/dpF4FGRrVifIDOgTVcfJluYt3c1mfJ
+tA2/ujwJ9jUV196P7UJ4QsAlpwd6SlKlxQ/tCTF2Zi2tjNtypIuSwBysxBM0BTRr
+L/ntwET2vqdA1wRRRVDMl+l3B3YI1aJBUYqyM72v/yK/jbJiS5hZLp9TXwIDAQAB
+AoGAXEGuJPYexWM20Q3t9vxIBrAFQ9n90o2CtWPPAztEXBhW/M/CciWcyMaIb3h/
+RiurvidPpAXQTkofHWV/ko9klDLDAOTsJE+mir61izvdPHqZH13ZJyI+GUN4bQ0a
+1hV415OPsiks1jBL+J5sD1dvFZU4nOOeFbIZcmCf/Z5DIlECQQDke7DdNiiy2zls
+C1GrCbj0R85h1ZmwZ4GytVkxlik+Ids2aeskxDba5wlEUZutVyGlQuUe6Zm4r2eI
+Vq7/47VnAkEAznELdXCd6zYynGz8RYY4zMtLvu+oWePLKX/6P/egkfkloaB13Ohr
+yEd//V+cnobL9g5ed5Ggt4WF4AhcvKn/SQJBAJDO1AlfievRhVM02U3Nm6s211aq
+Sf3DnC/nP+BtizYVvxl9h8qFkT6rrvPdxQzXbDuRaiVtaD/k63k9dyw25YECQBfF
+GGarUuOUV/t+6QUwUTXzaoNPoPjIq8nZfH0FDC4Cm/yiNy/6av6ijPAlpCj0qGNq
+gCIQWIsJCsMi81qd0FECQQCfu6wSDszVseas0CAcxjP4MU5lVr6/L8//ZUn9TDJM
+WSQelziGbnbsIXq7owCVDxROJ770IqOL4OQZDw5R8Swd
+-----END RSA PRIVATE KEY-----
diff --git a/core/modules/sshd/data/etc/ssh/ssh_host_rsa_key.pub b/core/modules/sshd/data/etc/ssh/ssh_host_rsa_key.pub
new file mode 100644
index 00000000..e6fd0588
--- /dev/null
+++ b/core/modules/sshd/data/etc/ssh/ssh_host_rsa_key.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC4QG0lNN4NewU8nTxNr/dpF4FGRrVifIDOgTVcfJluYt3c1mfJtA2/ujwJ9jUV196P7UJ4QsAlpwd6SlKlxQ/tCTF2Zi2tjNtypIuSwBysxBM0BTRrL/ntwET2vqdA1wRRRVDMl+l3B3YI1aJBUYqyM72v/yK/jbJiS5hZLp9TXw== root@stp
diff --git a/core/modules/sshd/data/etc/ssh/sshd_config b/core/modules/sshd/data/etc/ssh/sshd_config
new file mode 100644
index 00000000..3b7d65a6
--- /dev/null
+++ b/core/modules/sshd/data/etc/ssh/sshd_config
@@ -0,0 +1,92 @@
+# Package generated configuration file
+# See the sshd_config(5) manpage for details
+
+# What ports, IPs and protocols we listen for
+Port 22
+# Use these options to restrict which interfaces/protocols sshd will bind to
+#ListenAddress ::
+#ListenAddress 0.0.0.0
+Protocol 2
+# HostKeys for protocol version 2
+HostKey /etc/ssh/ssh_host_rsa_key
+HostKey /etc/ssh/ssh_host_dsa_key
+HostKey /etc/ssh/ssh_host_ecdsa_key
+#Privilege Separation is turned on for security
+UsePrivilegeSeparation yes
+
+# Lifetime and size of ephemeral version 1 server key
+KeyRegenerationInterval 3600
+ServerKeyBits 768
+
+# Logging
+SyslogFacility AUTH
+LogLevel INFO
+
+# Authentication:
+LoginGraceTime 30
+PermitRootLogin yes
+StrictModes yes
+
+RSAAuthentication yes
+PubkeyAuthentication yes
+AuthorizedKeysFile %h/.ssh/authorized_keys
+
+# Don't read the user's ~/.rhosts and ~/.shosts files
+IgnoreRhosts yes
+# For this to work you will also need host keys in /etc/ssh_known_hosts
+RhostsRSAAuthentication no
+# similar for protocol version 2
+HostbasedAuthentication no
+# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
+#IgnoreUserKnownHosts yes
+
+# To enable empty passwords, change to yes (NOT RECOMMENDED)
+PermitEmptyPasswords no
+
+# Change to yes to enable challenge-response passwords (beware issues with
+# some PAM modules and threads)
+ChallengeResponseAuthentication no
+
+# Change to no to disable tunnelled clear text passwords
+#PasswordAuthentication yes
+
+# Kerberos options
+#KerberosAuthentication no
+#KerberosGetAFSToken no
+#KerberosOrLocalPasswd yes
+#KerberosTicketCleanup yes
+
+# GSSAPI options
+#GSSAPIAuthentication no
+#GSSAPICleanupCredentials yes
+
+X11Forwarding yes
+X11DisplayOffset 10
+PrintMotd no
+PrintLastLog yes
+TCPKeepAlive yes
+#UseLogin no
+
+#MaxStartups 10:30:60
+Banner /etc/issue.net
+
+# Allow client to pass locale environment variables
+AcceptEnv LANG LC_*
+
+Subsystem sftp /usr/lib/openssh/sftp-server
+
+# Set this to 'yes' to enable PAM authentication, account processing,
+# and session processing. If this is enabled, PAM authentication will
+# be allowed through the ChallengeResponseAuthentication and
+# PasswordAuthentication. Depending on your PAM configuration,
+# PAM authentication via ChallengeResponseAuthentication may bypass
+# the setting of "PermitRootLogin without-password".
+# If you just want the PAM account and session checks to run without
+# PAM authentication, then enable this but set PasswordAuthentication
+# and ChallengeResponseAuthentication to 'no'.
+UsePAM yes
+
+# OpenSLX
+DenyUsers demo
+UseDNS no
+
diff --git a/core/modules/sshd/data/etc/systemd/system/sshd.service b/core/modules/sshd/data/etc/systemd/system/sshd.service
new file mode 100644
index 00000000..fc711808
--- /dev/null
+++ b/core/modules/sshd/data/etc/systemd/system/sshd.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=OpenSSH Daemon
+
+[Service]
+ExecStart=/usr/sbin/sshd -D
+ExecReload=/bin/kill -HUP $MAINPID
+KillMode=process
+Restart=always
diff --git a/core/modules/sshd/data/etc/tmpfiles.d/sshd.conf b/core/modules/sshd/data/etc/tmpfiles.d/sshd.conf
new file mode 100644
index 00000000..ffb34ca6
--- /dev/null
+++ b/core/modules/sshd/data/etc/tmpfiles.d/sshd.conf
@@ -0,0 +1,3 @@
+d /var/run/sshd 0755 root root
+d /var/empty/sshd 0755 root root
+
diff --git a/core/modules/sshd/module.build b/core/modules/sshd/module.build
new file mode 100644
index 00000000..ebf42c12
--- /dev/null
+++ b/core/modules/sshd/module.build
@@ -0,0 +1,20 @@
+fetch_source() {
+ :
+}
+
+build() {
+
+ local BIN_LOCATION="$(which sshd)"
+ [ ! -z "${BIN_LOCATION}" ] && BIN_LOCATION=$(readlink -f "$BIN_LOCATION")
+ if [ ! -z "${BIN_LOCATION}" -a -e "${BIN_LOCATION}" ]; then
+ tarcopy "${BIN_LOCATION}" "${MODULE_BUILD_DIR}"
+ else
+ perror "'sshd' not found on the system! Please install it."
+ fi
+}
+
+post_copy() {
+ mkdir -p "${TARGET_BUILD_DIR}/var/lib/empty" # suse
+
+ chmod go-rwx "${TARGET_BUILD_DIR}/etc/ssh/"* # no space, " before *
+}
diff --git a/core/modules/sshd/module.conf b/core/modules/sshd/module.conf
new file mode 100644
index 00000000..25793c72
--- /dev/null
+++ b/core/modules/sshd/module.conf
@@ -0,0 +1,3 @@
+REQUIRED_BINARIES="sshd"
+REQUIRED_LIBRARIES=""
+REQUIRED_DIRECTORIES=""
diff --git a/core/modules/sssd/module.build b/core/modules/sssd/module.build
new file mode 100644
index 00000000..041fd5bd
--- /dev/null
+++ b/core/modules/sssd/module.build
@@ -0,0 +1,33 @@
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+
+ local SSSD_PATH="$(which sssd)"
+ [ -z "$SSSD_PATH" ] && perror "'sssd' not found on this system. Should have been installed! Something is wrong..."
+
+ # Build nslcd service file
+ mkdir -p "${MODULE_BUILD_DIR}/etc/systemd/system"
+ sed "s,%PATH%,${SSSD_PATH},g" "${MODULE_DIR}/templates/sssd-systemd.service" > "${MODULE_BUILD_DIR}/etc/systemd/system/sssd.service" || perror "Could not fill sssd.service template"
+
+ # openSuse sssd does not start when /etc/sssd/sssd.conf is not root:root 600!
+ if [ "$SYS_DISTRIBUTION" == "opensuse" -a "$SYS_VERSION" == "13.2" ]; then
+ sed -i 's#ExecStart#ExecStartPre=/opt/openslx/bin/chmod 600 /etc/sssd/sssd.conf\nExecStart#g' \
+ "${MODULE_BUILD_DIR}/etc/systemd/system/sssd.service"
+ fi
+
+ return 0
+}
+
+post_copy() {
+ mkdir -p "${TARGET_BUILD_DIR}/var/log/sssd"
+ for DIR in mc pubconf/krb5.include.d db pipes/private; do
+ mkdir -p "${TARGET_BUILD_DIR}/var/lib/sss/$DIR"
+ done
+}
diff --git a/core/modules/sssd/module.conf b/core/modules/sssd/module.conf
new file mode 100644
index 00000000..6e4df94e
--- /dev/null
+++ b/core/modules/sssd/module.conf
@@ -0,0 +1,18 @@
+REQUIRED_BINARIES="
+ sssd
+"
+REQUIRED_FILES="
+ /etc/default/sssd
+ /etc/systemd/system/sssd.service
+"
+# lib/ is needed to fetch lib/x86..../security/pam_sss.so module
+# could do it using the SYS_PAM_MODULE_PATH, but using that in the
+# module.conf seems hacky...
+#
+# usr/lib is needed to get the ldb modules, e.g.:
+# usr/lib/x86_64-linux-gnu/ldb/modules/ldb/ldap.so
+#
+REQUIRED_DIRECTORIES="
+ /lib
+ /usr/lib
+"
diff --git a/core/modules/sssd/module.conf.opensuse.13.2 b/core/modules/sssd/module.conf.opensuse.13.2
new file mode 100644
index 00000000..6fafc652
--- /dev/null
+++ b/core/modules/sssd/module.conf.opensuse.13.2
@@ -0,0 +1,23 @@
+REQUIRED_FILES="
+ /etc/sssd
+ /etc/systemd/system/sssd.service
+"
+
+REQUIRED_DIRECTORIES="
+ /$LIB64
+ /usr/lib
+ /usr/lib64
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ sssd
+ sssd-ldap
+ libldb1
+ libsss_nss_idmap0
+"
+REQUIRED_CONTENT_PACKAGES="
+ sssd
+ sssd-ldap
+ libldb1
+ libsss_nss_idmap0
+"
diff --git a/core/modules/sssd/module.conf.ubuntu b/core/modules/sssd/module.conf.ubuntu
new file mode 100644
index 00000000..5a8e4fa4
--- /dev/null
+++ b/core/modules/sssd/module.conf.ubuntu
@@ -0,0 +1,14 @@
+REQUIRED_INSTALLED_PACKAGES="
+ sssd-common
+ sssd-ldap
+ libldb1
+ libnss-sss
+ libpam-sss
+"
+REQUIRED_CONTENT_PACKAGES="
+ sssd-common
+ sssd-ldap
+ libldb1
+ libnss-sss
+ libpam-sss
+"
diff --git a/core/modules/sssd/templates/sssd-systemd.service b/core/modules/sssd/templates/sssd-systemd.service
new file mode 100644
index 00000000..9132d64a
--- /dev/null
+++ b/core/modules/sssd/templates/sssd-systemd.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=System Security Services Daemon
+# SSSD will not be started until syslog is
+After=syslog.target
+
+[Service]
+EnvironmentFile=-/etc/sysconfig/sssd
+ExecStart=%PATH% -D -f
+# These two should be used with traditional UNIX forking daemons
+# consult systemd.service(5) for more details
+Type=forking
+PIDFile=/var/run/sssd.pid
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target
diff --git a/core/modules/swiss/data/etc/X11/xorg.conf.d/90-keytable.conf b/core/modules/swiss/data/etc/X11/xorg.conf.d/90-keytable.conf
new file mode 100644
index 00000000..6a3e0fd3
--- /dev/null
+++ b/core/modules/swiss/data/etc/X11/xorg.conf.d/90-keytable.conf
@@ -0,0 +1,5 @@
+Section "InputClass"
+ Identifier "LocalKeyboard"
+ MatchIsKeyboard "on"
+ Option "XkbLayout" "ch"
+EndSection
diff --git a/core/modules/swiss/data/etc/default/locale b/core/modules/swiss/data/etc/default/locale
new file mode 100644
index 00000000..b7569b66
--- /dev/null
+++ b/core/modules/swiss/data/etc/default/locale
@@ -0,0 +1 @@
+LANG="ch_DE.UTF-8"
diff --git a/core/modules/swiss/data/etc/systemd/system/basic.target.wants/load-swiss-keymap.service b/core/modules/swiss/data/etc/systemd/system/basic.target.wants/load-swiss-keymap.service
new file mode 100644
index 00000000..0d46d95a
--- /dev/null
+++ b/core/modules/swiss/data/etc/systemd/system/basic.target.wants/load-swiss-keymap.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Setup swiss keyboard layout
+DefaultDependencies=no
+After=sysinit.target
+Before=shutdown.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-load_swiss_keymaps
diff --git a/core/modules/swiss/data/etc/systemd/system/load-swiss-keymap.service b/core/modules/swiss/data/etc/systemd/system/load-swiss-keymap.service
new file mode 100644
index 00000000..0d46d95a
--- /dev/null
+++ b/core/modules/swiss/data/etc/systemd/system/load-swiss-keymap.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Setup swiss keyboard layout
+DefaultDependencies=no
+After=sysinit.target
+Before=shutdown.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-load_swiss_keymaps
diff --git a/core/modules/swiss/data/opt/openslx/keymaps/compose.inc b/core/modules/swiss/data/opt/openslx/keymaps/compose.inc
new file mode 100644
index 00000000..c86d2dab
--- /dev/null
+++ b/core/modules/swiss/data/opt/openslx/keymaps/compose.inc
@@ -0,0 +1,8 @@
+# We map the PrintScreen key (useless) and Alt+AltGr to the Compose key...
+# A really useful thing not found on normal keyboards. :/
+#
+# (c) 2001 Bernhard Rosenkränzer <bero@arklinux.org>
+
+keycode 99 = Compose # SysRq/PrintScrn
+keycode 100 = AltGr
+alt keycode 100 = Compose
diff --git a/core/modules/swiss/data/opt/openslx/keymaps/german_qwertz_compose_keyboard_translation.map b/core/modules/swiss/data/opt/openslx/keymaps/german_qwertz_compose_keyboard_translation.map
new file mode 100644
index 00000000..9d0c73d0
--- /dev/null
+++ b/core/modules/swiss/data/opt/openslx/keymaps/german_qwertz_compose_keyboard_translation.map
@@ -0,0 +1,967 @@
+keymaps 0-2,4-6,8-10,12
+keycode 1 = Escape Escape
+ alt keycode 1 = Meta_Escape
+ shift alt keycode 1 = Meta_Escape
+keycode 2 = one exclam
+ alt keycode 2 = Meta_one
+ shift alt keycode 2 = Meta_exclam
+keycode 3 = two quotedbl twosuperior nul
+ alt keycode 3 = Meta_two
+ shift alt keycode 3 = Meta_quotedbl
+ control alt keycode 3 = Meta_nul
+keycode 4 = three section threesuperior Escape
+ alt keycode 4 = Meta_three
+ control alt keycode 4 = Meta_Escape
+keycode 5 = four dollar
+ alt keycode 5 = Meta_four
+ shift alt keycode 5 = Meta_dollar
+keycode 6 = five percent
+ alt keycode 6 = Meta_five
+ shift alt keycode 6 = Meta_percent
+keycode 7 = six ampersand
+ control keycode 7 = Control_asciicircum
+ alt keycode 7 = Meta_six
+ shift alt keycode 7 = Meta_ampersand
+keycode 8 = seven slash braceleft
+ alt keycode 8 = Meta_seven
+ shift alt keycode 8 = Meta_slash
+ altgr alt keycode 8 = Meta_braceleft
+keycode 9 = eight parenleft bracketleft
+ alt keycode 9 = Meta_eight
+ shift alt keycode 9 = Meta_parenleft
+ altgr alt keycode 9 = Meta_bracketleft
+keycode 10 = nine parenright bracketright
+ altgr control keycode 10 = Control_bracketright
+ alt keycode 10 = Meta_nine
+ shift alt keycode 10 = Meta_parenright
+ altgr alt keycode 10 = Meta_bracketright
+keycode 11 = zero equal braceright
+ alt keycode 11 = Meta_zero
+ shift alt keycode 11 = Meta_equal
+ altgr alt keycode 11 = Meta_braceright
+keycode 12 = ssharp question backslash
+ altgr control keycode 12 = Control_backslash
+ shift alt keycode 12 = Meta_question
+ altgr alt keycode 12 = Meta_backslash
+keycode 13 = apostrophe grave
+ alt keycode 13 = 0x08b4
+ shift alt keycode 13 = Meta_grave
+keycode 14 = Delete Delete
+ alt keycode 14 = Meta_Delete
+ shift alt keycode 14 = Meta_Delete
+keycode 15 = Tab Meta_Tab
+ alt keycode 15 = Meta_Tab
+keycode 16 = +q +Q at Control_q Control_q nul Meta_q Meta_Q Meta_at Meta_Control_q
+keycode 17 = w
+keycode 18 = +e +E currency Control_e Control_e Control_e Meta_e Meta_E Meta_e Meta_Control_e
+keycode 19 = r
+keycode 20 = t
+keycode 21 = z
+keycode 22 = u
+keycode 23 = i
+keycode 24 = o
+keycode 25 = p
+keycode 26 = +udiaeresis +Udiaeresis
+keycode 27 = plus asterisk asciitilde
+ alt keycode 27 = Meta_plus
+ shift alt keycode 27 = Meta_asterisk
+keycode 28 = Return
+ alt keycode 28 = Meta_Control_m
+keycode 29 = Control
+keycode 30 = a
+keycode 31 = s
+keycode 32 = d
+keycode 33 = f
+keycode 34 = g
+keycode 35 = h
+keycode 36 = j
+keycode 37 = k
+keycode 38 = l
+keycode 39 = +odiaeresis +Odiaeresis
+keycode 40 = +adiaeresis +Adiaeresis
+keycode 41 = asciicircum degree Meta_asciicircum Control_asciicircum
+ control alt keycode 41 = Meta_Control_asciicircum
+keycode 42 = Shift
+keycode 43 = numbersign apostrophe
+ alt keycode 43 = Meta_numbersign
+ shift alt keycode 43 = Meta_apostrophe
+keycode 44 = y
+keycode 45 = x
+keycode 46 = +c +C cent Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_Control_c
+keycode 47 = v
+keycode 48 = b
+keycode 49 = n
+keycode 50 = +m +M mu Control_m Control_m Control_m Meta_m Meta_M Meta_m Meta_Control_m
+keycode 51 = comma semicolon
+ alt keycode 51 = Meta_comma
+ shift alt keycode 51 = Meta_semicolon
+keycode 52 = period colon
+ alt keycode 52 = Meta_period
+ shift alt keycode 52 = Meta_colon
+keycode 53 = minus underscore Meta_minus
+ shift control keycode 53 = Control_underscore
+ alt keycode 53 = Meta_minus
+ shift alt keycode 53 = Meta_underscore
+keycode 54 = Shift
+keycode 55 = KP_Multiply
+ altgr keycode 55 = Hex_C
+keycode 56 = Alt
+keycode 57 = space space Meta_space nul
+ alt keycode 57 = Meta_space
+ shift alt keycode 57 = Meta_space
+ control alt keycode 57 = Meta_nul
+keycode 58 = Caps_Lock
+keycode 59 = F1 F13 Console_13 F25
+ alt keycode 59 = Console_1
+ control alt keycode 59 = Console_1
+keycode 60 = F2 F14 Console_14 F26
+ alt keycode 60 = Console_2
+ control alt keycode 60 = Console_2
+keycode 61 = F3 F15 Console_15 F27
+ alt keycode 61 = Console_3
+ control alt keycode 61 = Console_3
+keycode 62 = F4 F16 Console_16 F28
+ alt keycode 62 = Console_4
+ control alt keycode 62 = Console_4
+keycode 63 = F5 F17 Console_17 F29
+ alt keycode 63 = Console_5
+ control alt keycode 63 = Console_5
+keycode 64 = F6 F18 Console_18 F30
+ alt keycode 64 = Console_6
+ control alt keycode 64 = Console_6
+keycode 65 = F7 F19 Console_19 F31
+ alt keycode 65 = Console_7
+ control alt keycode 65 = Console_7
+keycode 66 = F8 F20 Console_20 F32
+ alt keycode 66 = Console_8
+ control alt keycode 66 = Console_8
+keycode 67 = F9 F21 Console_21 F33
+ alt keycode 67 = Console_9
+ control alt keycode 67 = Console_9
+keycode 68 = F10 F22 Console_22 F34
+ alt keycode 68 = Console_10
+ control alt keycode 68 = Console_10
+keycode 69 = Num_Lock
+ altgr keycode 69 = Hex_A
+keycode 70 = Scroll_Lock Show_Memory Show_Registers Show_State
+ alt keycode 70 = Scroll_Lock
+keycode 71 = KP_7
+ altgr keycode 71 = Hex_7
+ alt keycode 71 = Ascii_7
+keycode 72 = KP_8
+ altgr keycode 72 = Hex_8
+ alt keycode 72 = Ascii_8
+keycode 73 = KP_9
+ altgr keycode 73 = Hex_9
+ alt keycode 73 = Ascii_9
+keycode 74 = KP_Subtract
+ altgr keycode 74 = Hex_D
+keycode 75 = KP_4
+ altgr keycode 75 = Hex_4
+ alt keycode 75 = Ascii_4
+keycode 76 = KP_5
+ altgr keycode 76 = Hex_5
+ alt keycode 76 = Ascii_5
+keycode 77 = KP_6
+ altgr keycode 77 = Hex_6
+ alt keycode 77 = Ascii_6
+keycode 78 = KP_Add
+ altgr keycode 78 = Hex_E
+keycode 79 = KP_1
+ altgr keycode 79 = Hex_1
+ alt keycode 79 = Ascii_1
+keycode 80 = KP_2
+ altgr keycode 80 = Hex_2
+ alt keycode 80 = Ascii_2
+keycode 81 = KP_3
+ altgr keycode 81 = Hex_3
+ alt keycode 81 = Ascii_3
+keycode 82 = KP_0
+ altgr keycode 82 = Hex_0
+ alt keycode 82 = Ascii_0
+keycode 83 = KP_Comma
+ altgr control keycode 83 = Boot
+ control alt keycode 83 = Boot
+keycode 84 = Last_Console
+keycode 85 =
+keycode 86 = less greater bar
+ alt keycode 86 = Meta_less
+ shift alt keycode 86 = Meta_greater
+ altgr alt keycode 86 = Meta_bar
+keycode 87 = F11 F23 Console_23 F35
+ alt keycode 87 = Console_11
+ control alt keycode 87 = Console_11
+keycode 88 = F12 F24 Console_24 F36
+ alt keycode 88 = Console_12
+ control alt keycode 88 = Console_12
+keycode 89 =
+keycode 90 =
+keycode 91 =
+keycode 92 =
+keycode 93 =
+keycode 94 =
+keycode 95 =
+keycode 96 = KP_Enter
+ altgr keycode 96 = Hex_F
+keycode 97 = Control
+keycode 98 = KP_Divide
+ altgr keycode 98 = Hex_B
+keycode 99 = Compose
+ control keycode 99 = Control_backslash
+ alt keycode 99 = Control_backslash
+ control alt keycode 99 = Meta_Control_backslash
+keycode 100 = AltGr
+ alt keycode 100 = Compose
+keycode 101 = Break
+keycode 102 = Find
+keycode 103 = Up
+ alt keycode 103 = KeyboardSignal
+keycode 104 = Prior
+ shift keycode 104 = Scroll_Backward
+keycode 105 = Left
+ alt keycode 105 = Decr_Console
+keycode 106 = Right
+ alt keycode 106 = Incr_Console
+keycode 107 = Select
+keycode 108 = Down
+keycode 109 = Next
+ shift keycode 109 = Scroll_Forward
+keycode 110 = Insert
+keycode 111 = Remove
+ altgr control keycode 111 = Boot
+ control alt keycode 111 = Boot
+keycode 112 = Macro
+ altgr control keycode 112 = VoidSymbol
+ shift alt keycode 112 = VoidSymbol
+ altgr alt keycode 112 = VoidSymbol
+keycode 113 = F13
+ altgr control keycode 113 = VoidSymbol
+ shift alt keycode 113 = VoidSymbol
+ altgr alt keycode 113 = VoidSymbol
+keycode 114 = F14
+ altgr control keycode 114 = VoidSymbol
+ shift alt keycode 114 = VoidSymbol
+ altgr alt keycode 114 = VoidSymbol
+keycode 115 = Help
+ altgr control keycode 115 = VoidSymbol
+ shift alt keycode 115 = VoidSymbol
+ altgr alt keycode 115 = VoidSymbol
+keycode 116 = Do
+ altgr control keycode 116 = VoidSymbol
+ shift alt keycode 116 = VoidSymbol
+ altgr alt keycode 116 = VoidSymbol
+keycode 117 = F17
+ altgr control keycode 117 = VoidSymbol
+ shift alt keycode 117 = VoidSymbol
+ altgr alt keycode 117 = VoidSymbol
+keycode 118 = KP_MinPlus
+ altgr control keycode 118 = VoidSymbol
+ shift alt keycode 118 = VoidSymbol
+ altgr alt keycode 118 = VoidSymbol
+keycode 119 = Pause
+keycode 120 =
+keycode 121 =
+keycode 122 =
+keycode 123 =
+keycode 124 =
+keycode 125 =
+keycode 126 =
+keycode 127 =
+keycode 128 = nul
+ altgr control keycode 128 = VoidSymbol
+ shift alt keycode 128 = VoidSymbol
+ altgr alt keycode 128 = VoidSymbol
+keycode 129 = nul
+ altgr control keycode 129 = VoidSymbol
+ shift alt keycode 129 = VoidSymbol
+ altgr alt keycode 129 = VoidSymbol
+keycode 130 = nul
+ altgr control keycode 130 = VoidSymbol
+ shift alt keycode 130 = VoidSymbol
+ altgr alt keycode 130 = VoidSymbol
+keycode 131 = nul
+ altgr control keycode 131 = VoidSymbol
+ shift alt keycode 131 = VoidSymbol
+ altgr alt keycode 131 = VoidSymbol
+keycode 132 = nul
+ altgr control keycode 132 = VoidSymbol
+ shift alt keycode 132 = VoidSymbol
+ altgr alt keycode 132 = VoidSymbol
+keycode 133 = nul
+ altgr control keycode 133 = VoidSymbol
+ shift alt keycode 133 = VoidSymbol
+ altgr alt keycode 133 = VoidSymbol
+keycode 134 = nul
+ altgr control keycode 134 = VoidSymbol
+ shift alt keycode 134 = VoidSymbol
+ altgr alt keycode 134 = VoidSymbol
+keycode 135 = nul
+ altgr control keycode 135 = VoidSymbol
+ shift alt keycode 135 = VoidSymbol
+ altgr alt keycode 135 = VoidSymbol
+keycode 136 = nul
+ altgr control keycode 136 = VoidSymbol
+ shift alt keycode 136 = VoidSymbol
+ altgr alt keycode 136 = VoidSymbol
+keycode 137 = nul
+ altgr control keycode 137 = VoidSymbol
+ shift alt keycode 137 = VoidSymbol
+ altgr alt keycode 137 = VoidSymbol
+keycode 138 = nul
+ altgr control keycode 138 = VoidSymbol
+ shift alt keycode 138 = VoidSymbol
+ altgr alt keycode 138 = VoidSymbol
+keycode 139 = nul
+ altgr control keycode 139 = VoidSymbol
+ shift alt keycode 139 = VoidSymbol
+ altgr alt keycode 139 = VoidSymbol
+keycode 140 = nul
+ altgr control keycode 140 = VoidSymbol
+ shift alt keycode 140 = VoidSymbol
+ altgr alt keycode 140 = VoidSymbol
+keycode 141 = nul
+ altgr control keycode 141 = VoidSymbol
+ shift alt keycode 141 = VoidSymbol
+ altgr alt keycode 141 = VoidSymbol
+keycode 142 = nul
+ altgr control keycode 142 = VoidSymbol
+ shift alt keycode 142 = VoidSymbol
+ altgr alt keycode 142 = VoidSymbol
+keycode 143 = nul
+ altgr control keycode 143 = VoidSymbol
+ shift alt keycode 143 = VoidSymbol
+ altgr alt keycode 143 = VoidSymbol
+keycode 144 = nul
+ altgr control keycode 144 = VoidSymbol
+ shift alt keycode 144 = VoidSymbol
+ altgr alt keycode 144 = VoidSymbol
+keycode 145 = nul
+ altgr control keycode 145 = VoidSymbol
+ shift alt keycode 145 = VoidSymbol
+ altgr alt keycode 145 = VoidSymbol
+keycode 146 = nul
+ altgr control keycode 146 = VoidSymbol
+ shift alt keycode 146 = VoidSymbol
+ altgr alt keycode 146 = VoidSymbol
+keycode 147 = nul
+ altgr control keycode 147 = VoidSymbol
+ shift alt keycode 147 = VoidSymbol
+ altgr alt keycode 147 = VoidSymbol
+keycode 148 = nul
+ altgr control keycode 148 = VoidSymbol
+ shift alt keycode 148 = VoidSymbol
+ altgr alt keycode 148 = VoidSymbol
+keycode 149 = nul
+ altgr control keycode 149 = VoidSymbol
+ shift alt keycode 149 = VoidSymbol
+ altgr alt keycode 149 = VoidSymbol
+keycode 150 = nul
+ altgr control keycode 150 = VoidSymbol
+ shift alt keycode 150 = VoidSymbol
+ altgr alt keycode 150 = VoidSymbol
+keycode 151 = nul
+ altgr control keycode 151 = VoidSymbol
+ shift alt keycode 151 = VoidSymbol
+ altgr alt keycode 151 = VoidSymbol
+keycode 152 = nul
+ altgr control keycode 152 = VoidSymbol
+ shift alt keycode 152 = VoidSymbol
+ altgr alt keycode 152 = VoidSymbol
+keycode 153 = nul
+ altgr control keycode 153 = VoidSymbol
+ shift alt keycode 153 = VoidSymbol
+ altgr alt keycode 153 = VoidSymbol
+keycode 154 = nul
+ altgr control keycode 154 = VoidSymbol
+ shift alt keycode 154 = VoidSymbol
+ altgr alt keycode 154 = VoidSymbol
+keycode 155 = nul
+ altgr control keycode 155 = VoidSymbol
+ shift alt keycode 155 = VoidSymbol
+ altgr alt keycode 155 = VoidSymbol
+keycode 156 = nul
+ altgr control keycode 156 = VoidSymbol
+ shift alt keycode 156 = VoidSymbol
+ altgr alt keycode 156 = VoidSymbol
+keycode 157 = nul
+ altgr control keycode 157 = VoidSymbol
+ shift alt keycode 157 = VoidSymbol
+ altgr alt keycode 157 = VoidSymbol
+keycode 158 = nul
+ altgr control keycode 158 = VoidSymbol
+ shift alt keycode 158 = VoidSymbol
+ altgr alt keycode 158 = VoidSymbol
+keycode 159 = nul
+ altgr control keycode 159 = VoidSymbol
+ shift alt keycode 159 = VoidSymbol
+ altgr alt keycode 159 = VoidSymbol
+keycode 160 = nul
+ altgr control keycode 160 = VoidSymbol
+ shift alt keycode 160 = VoidSymbol
+ altgr alt keycode 160 = VoidSymbol
+keycode 161 = nul
+ altgr control keycode 161 = VoidSymbol
+ shift alt keycode 161 = VoidSymbol
+ altgr alt keycode 161 = VoidSymbol
+keycode 162 = nul
+ altgr control keycode 162 = VoidSymbol
+ shift alt keycode 162 = VoidSymbol
+ altgr alt keycode 162 = VoidSymbol
+keycode 163 = nul
+ altgr control keycode 163 = VoidSymbol
+ shift alt keycode 163 = VoidSymbol
+ altgr alt keycode 163 = VoidSymbol
+keycode 164 = nul
+ altgr control keycode 164 = VoidSymbol
+ shift alt keycode 164 = VoidSymbol
+ altgr alt keycode 164 = VoidSymbol
+keycode 165 = nul
+ altgr control keycode 165 = VoidSymbol
+ shift alt keycode 165 = VoidSymbol
+ altgr alt keycode 165 = VoidSymbol
+keycode 166 = nul
+ altgr control keycode 166 = VoidSymbol
+ shift alt keycode 166 = VoidSymbol
+ altgr alt keycode 166 = VoidSymbol
+keycode 167 = nul
+ altgr control keycode 167 = VoidSymbol
+ shift alt keycode 167 = VoidSymbol
+ altgr alt keycode 167 = VoidSymbol
+keycode 168 = nul
+ altgr control keycode 168 = VoidSymbol
+ shift alt keycode 168 = VoidSymbol
+ altgr alt keycode 168 = VoidSymbol
+keycode 169 = nul
+ altgr control keycode 169 = VoidSymbol
+ shift alt keycode 169 = VoidSymbol
+ altgr alt keycode 169 = VoidSymbol
+keycode 170 = nul
+ altgr control keycode 170 = VoidSymbol
+ shift alt keycode 170 = VoidSymbol
+ altgr alt keycode 170 = VoidSymbol
+keycode 171 = nul
+ altgr control keycode 171 = VoidSymbol
+ shift alt keycode 171 = VoidSymbol
+ altgr alt keycode 171 = VoidSymbol
+keycode 172 = nul
+ altgr control keycode 172 = VoidSymbol
+ shift alt keycode 172 = VoidSymbol
+ altgr alt keycode 172 = VoidSymbol
+keycode 173 = nul
+ altgr control keycode 173 = VoidSymbol
+ shift alt keycode 173 = VoidSymbol
+ altgr alt keycode 173 = VoidSymbol
+keycode 174 = nul
+ altgr control keycode 174 = VoidSymbol
+ shift alt keycode 174 = VoidSymbol
+ altgr alt keycode 174 = VoidSymbol
+keycode 175 = nul
+ altgr control keycode 175 = VoidSymbol
+ shift alt keycode 175 = VoidSymbol
+ altgr alt keycode 175 = VoidSymbol
+keycode 176 = nul
+ altgr control keycode 176 = VoidSymbol
+ shift alt keycode 176 = VoidSymbol
+ altgr alt keycode 176 = VoidSymbol
+keycode 177 = nul
+ altgr control keycode 177 = VoidSymbol
+ shift alt keycode 177 = VoidSymbol
+ altgr alt keycode 177 = VoidSymbol
+keycode 178 = nul
+ altgr control keycode 178 = VoidSymbol
+ shift alt keycode 178 = VoidSymbol
+ altgr alt keycode 178 = VoidSymbol
+keycode 179 = nul
+ altgr control keycode 179 = VoidSymbol
+ shift alt keycode 179 = VoidSymbol
+ altgr alt keycode 179 = VoidSymbol
+keycode 180 = nul
+ altgr control keycode 180 = VoidSymbol
+ shift alt keycode 180 = VoidSymbol
+ altgr alt keycode 180 = VoidSymbol
+keycode 181 = nul
+ altgr control keycode 181 = VoidSymbol
+ shift alt keycode 181 = VoidSymbol
+ altgr alt keycode 181 = VoidSymbol
+keycode 182 = nul
+ altgr control keycode 182 = VoidSymbol
+ shift alt keycode 182 = VoidSymbol
+ altgr alt keycode 182 = VoidSymbol
+keycode 183 = nul
+ altgr control keycode 183 = VoidSymbol
+ shift alt keycode 183 = VoidSymbol
+ altgr alt keycode 183 = VoidSymbol
+keycode 184 = nul
+ altgr control keycode 184 = VoidSymbol
+ shift alt keycode 184 = VoidSymbol
+ altgr alt keycode 184 = VoidSymbol
+keycode 185 = nul
+ altgr control keycode 185 = VoidSymbol
+ shift alt keycode 185 = VoidSymbol
+ altgr alt keycode 185 = VoidSymbol
+keycode 186 = nul
+ altgr control keycode 186 = VoidSymbol
+ shift alt keycode 186 = VoidSymbol
+ altgr alt keycode 186 = VoidSymbol
+keycode 187 = nul
+ altgr control keycode 187 = VoidSymbol
+ shift alt keycode 187 = VoidSymbol
+ altgr alt keycode 187 = VoidSymbol
+keycode 188 = nul
+ altgr control keycode 188 = VoidSymbol
+ shift alt keycode 188 = VoidSymbol
+ altgr alt keycode 188 = VoidSymbol
+keycode 189 = nul
+ altgr control keycode 189 = VoidSymbol
+ shift alt keycode 189 = VoidSymbol
+ altgr alt keycode 189 = VoidSymbol
+keycode 190 = nul
+ altgr control keycode 190 = VoidSymbol
+ shift alt keycode 190 = VoidSymbol
+ altgr alt keycode 190 = VoidSymbol
+keycode 191 = nul
+ altgr control keycode 191 = VoidSymbol
+ shift alt keycode 191 = VoidSymbol
+ altgr alt keycode 191 = VoidSymbol
+keycode 192 = nul
+ altgr control keycode 192 = VoidSymbol
+ shift alt keycode 192 = VoidSymbol
+ altgr alt keycode 192 = VoidSymbol
+keycode 193 = nul
+ altgr control keycode 193 = VoidSymbol
+ shift alt keycode 193 = VoidSymbol
+ altgr alt keycode 193 = VoidSymbol
+keycode 194 = nul
+ altgr control keycode 194 = VoidSymbol
+ shift alt keycode 194 = VoidSymbol
+ altgr alt keycode 194 = VoidSymbol
+keycode 195 = nul
+ altgr control keycode 195 = VoidSymbol
+ shift alt keycode 195 = VoidSymbol
+ altgr alt keycode 195 = VoidSymbol
+keycode 196 = nul
+ altgr control keycode 196 = VoidSymbol
+ shift alt keycode 196 = VoidSymbol
+ altgr alt keycode 196 = VoidSymbol
+keycode 197 = nul
+ altgr control keycode 197 = VoidSymbol
+ shift alt keycode 197 = VoidSymbol
+ altgr alt keycode 197 = VoidSymbol
+keycode 198 = nul
+ altgr control keycode 198 = VoidSymbol
+ shift alt keycode 198 = VoidSymbol
+ altgr alt keycode 198 = VoidSymbol
+keycode 199 = nul
+ altgr control keycode 199 = VoidSymbol
+ shift alt keycode 199 = VoidSymbol
+ altgr alt keycode 199 = VoidSymbol
+keycode 200 = nul
+ altgr control keycode 200 = VoidSymbol
+ shift alt keycode 200 = VoidSymbol
+ altgr alt keycode 200 = VoidSymbol
+keycode 201 = nul
+ altgr control keycode 201 = VoidSymbol
+ shift alt keycode 201 = VoidSymbol
+ altgr alt keycode 201 = VoidSymbol
+keycode 202 = nul
+ altgr control keycode 202 = VoidSymbol
+ shift alt keycode 202 = VoidSymbol
+ altgr alt keycode 202 = VoidSymbol
+keycode 203 = nul
+ altgr control keycode 203 = VoidSymbol
+ shift alt keycode 203 = VoidSymbol
+ altgr alt keycode 203 = VoidSymbol
+keycode 204 = nul
+ altgr control keycode 204 = VoidSymbol
+ shift alt keycode 204 = VoidSymbol
+ altgr alt keycode 204 = VoidSymbol
+keycode 205 = nul
+ altgr control keycode 205 = VoidSymbol
+ shift alt keycode 205 = VoidSymbol
+ altgr alt keycode 205 = VoidSymbol
+keycode 206 = nul
+ altgr control keycode 206 = VoidSymbol
+ shift alt keycode 206 = VoidSymbol
+ altgr alt keycode 206 = VoidSymbol
+keycode 207 = nul
+ altgr control keycode 207 = VoidSymbol
+ shift alt keycode 207 = VoidSymbol
+ altgr alt keycode 207 = VoidSymbol
+keycode 208 = nul
+ altgr control keycode 208 = VoidSymbol
+ shift alt keycode 208 = VoidSymbol
+ altgr alt keycode 208 = VoidSymbol
+keycode 209 = nul
+ altgr control keycode 209 = VoidSymbol
+ shift alt keycode 209 = VoidSymbol
+ altgr alt keycode 209 = VoidSymbol
+keycode 210 = nul
+ altgr control keycode 210 = VoidSymbol
+ shift alt keycode 210 = VoidSymbol
+ altgr alt keycode 210 = VoidSymbol
+keycode 211 = nul
+ altgr control keycode 211 = VoidSymbol
+ shift alt keycode 211 = VoidSymbol
+ altgr alt keycode 211 = VoidSymbol
+keycode 212 = nul
+ altgr control keycode 212 = VoidSymbol
+ shift alt keycode 212 = VoidSymbol
+ altgr alt keycode 212 = VoidSymbol
+keycode 213 = nul
+ altgr control keycode 213 = VoidSymbol
+ shift alt keycode 213 = VoidSymbol
+ altgr alt keycode 213 = VoidSymbol
+keycode 214 = nul
+ altgr control keycode 214 = VoidSymbol
+ shift alt keycode 214 = VoidSymbol
+ altgr alt keycode 214 = VoidSymbol
+keycode 215 = nul
+ altgr control keycode 215 = VoidSymbol
+ shift alt keycode 215 = VoidSymbol
+ altgr alt keycode 215 = VoidSymbol
+keycode 216 = nul
+ altgr control keycode 216 = VoidSymbol
+ shift alt keycode 216 = VoidSymbol
+ altgr alt keycode 216 = VoidSymbol
+keycode 217 = nul
+ altgr control keycode 217 = VoidSymbol
+ shift alt keycode 217 = VoidSymbol
+ altgr alt keycode 217 = VoidSymbol
+keycode 218 = nul
+ altgr control keycode 218 = VoidSymbol
+ shift alt keycode 218 = VoidSymbol
+ altgr alt keycode 218 = VoidSymbol
+keycode 219 = nul
+ altgr control keycode 219 = VoidSymbol
+ shift alt keycode 219 = VoidSymbol
+ altgr alt keycode 219 = VoidSymbol
+keycode 220 = nul
+ altgr control keycode 220 = VoidSymbol
+ shift alt keycode 220 = VoidSymbol
+ altgr alt keycode 220 = VoidSymbol
+keycode 221 = nul
+ altgr control keycode 221 = VoidSymbol
+ shift alt keycode 221 = VoidSymbol
+ altgr alt keycode 221 = VoidSymbol
+keycode 222 = nul
+ altgr control keycode 222 = VoidSymbol
+ shift alt keycode 222 = VoidSymbol
+ altgr alt keycode 222 = VoidSymbol
+keycode 223 = nul
+ altgr control keycode 223 = VoidSymbol
+ shift alt keycode 223 = VoidSymbol
+ altgr alt keycode 223 = VoidSymbol
+keycode 224 = nul
+ altgr control keycode 224 = VoidSymbol
+ shift alt keycode 224 = VoidSymbol
+ altgr alt keycode 224 = VoidSymbol
+keycode 225 = nul
+ altgr control keycode 225 = VoidSymbol
+ shift alt keycode 225 = VoidSymbol
+ altgr alt keycode 225 = VoidSymbol
+keycode 226 = nul
+ altgr control keycode 226 = VoidSymbol
+ shift alt keycode 226 = VoidSymbol
+ altgr alt keycode 226 = VoidSymbol
+keycode 227 = nul
+ altgr control keycode 227 = VoidSymbol
+ shift alt keycode 227 = VoidSymbol
+ altgr alt keycode 227 = VoidSymbol
+keycode 228 = nul
+ altgr control keycode 228 = VoidSymbol
+ shift alt keycode 228 = VoidSymbol
+ altgr alt keycode 228 = VoidSymbol
+keycode 229 = nul
+ altgr control keycode 229 = VoidSymbol
+ shift alt keycode 229 = VoidSymbol
+ altgr alt keycode 229 = VoidSymbol
+keycode 230 = nul
+ altgr control keycode 230 = VoidSymbol
+ shift alt keycode 230 = VoidSymbol
+ altgr alt keycode 230 = VoidSymbol
+keycode 231 = nul
+ altgr control keycode 231 = VoidSymbol
+ shift alt keycode 231 = VoidSymbol
+ altgr alt keycode 231 = VoidSymbol
+keycode 232 = nul
+ altgr control keycode 232 = VoidSymbol
+ shift alt keycode 232 = VoidSymbol
+ altgr alt keycode 232 = VoidSymbol
+keycode 233 = nul
+ altgr control keycode 233 = VoidSymbol
+ shift alt keycode 233 = VoidSymbol
+ altgr alt keycode 233 = VoidSymbol
+keycode 234 = nul
+ altgr control keycode 234 = VoidSymbol
+ shift alt keycode 234 = VoidSymbol
+ altgr alt keycode 234 = VoidSymbol
+keycode 235 = nul
+ altgr control keycode 235 = VoidSymbol
+ shift alt keycode 235 = VoidSymbol
+ altgr alt keycode 235 = VoidSymbol
+keycode 236 = nul
+ altgr control keycode 236 = VoidSymbol
+ shift alt keycode 236 = VoidSymbol
+ altgr alt keycode 236 = VoidSymbol
+keycode 237 = nul
+ altgr control keycode 237 = VoidSymbol
+ shift alt keycode 237 = VoidSymbol
+ altgr alt keycode 237 = VoidSymbol
+keycode 238 = nul
+ altgr control keycode 238 = VoidSymbol
+ shift alt keycode 238 = VoidSymbol
+ altgr alt keycode 238 = VoidSymbol
+keycode 239 = nul
+ altgr control keycode 239 = VoidSymbol
+ shift alt keycode 239 = VoidSymbol
+ altgr alt keycode 239 = VoidSymbol
+keycode 240 = nul
+ altgr control keycode 240 = VoidSymbol
+ shift alt keycode 240 = VoidSymbol
+ altgr alt keycode 240 = VoidSymbol
+keycode 241 = nul
+ altgr control keycode 241 = VoidSymbol
+ shift alt keycode 241 = VoidSymbol
+ altgr alt keycode 241 = VoidSymbol
+keycode 242 = nul
+ altgr control keycode 242 = VoidSymbol
+ shift alt keycode 242 = VoidSymbol
+ altgr alt keycode 242 = VoidSymbol
+keycode 243 = nul
+ altgr control keycode 243 = VoidSymbol
+ shift alt keycode 243 = VoidSymbol
+ altgr alt keycode 243 = VoidSymbol
+keycode 244 = nul
+ altgr control keycode 244 = VoidSymbol
+ shift alt keycode 244 = VoidSymbol
+ altgr alt keycode 244 = VoidSymbol
+keycode 245 = nul
+ altgr control keycode 245 = VoidSymbol
+ shift alt keycode 245 = VoidSymbol
+ altgr alt keycode 245 = VoidSymbol
+keycode 246 = nul
+ altgr control keycode 246 = VoidSymbol
+ shift alt keycode 246 = VoidSymbol
+ altgr alt keycode 246 = VoidSymbol
+keycode 247 = nul
+ altgr control keycode 247 = VoidSymbol
+ shift alt keycode 247 = VoidSymbol
+ altgr alt keycode 247 = VoidSymbol
+keycode 248 = nul
+ altgr control keycode 248 = VoidSymbol
+ shift alt keycode 248 = VoidSymbol
+ altgr alt keycode 248 = VoidSymbol
+keycode 249 = nul
+ altgr control keycode 249 = VoidSymbol
+ shift alt keycode 249 = VoidSymbol
+ altgr alt keycode 249 = VoidSymbol
+keycode 250 = nul
+ altgr control keycode 250 = VoidSymbol
+ shift alt keycode 250 = VoidSymbol
+ altgr alt keycode 250 = VoidSymbol
+keycode 251 = nul
+ altgr control keycode 251 = VoidSymbol
+ shift alt keycode 251 = VoidSymbol
+ altgr alt keycode 251 = VoidSymbol
+keycode 252 = nul
+ altgr control keycode 252 = VoidSymbol
+ shift alt keycode 252 = VoidSymbol
+ altgr alt keycode 252 = VoidSymbol
+keycode 253 = nul
+ altgr control keycode 253 = VoidSymbol
+ shift alt keycode 253 = VoidSymbol
+ altgr alt keycode 253 = VoidSymbol
+keycode 254 = nul
+ altgr control keycode 254 = VoidSymbol
+ shift alt keycode 254 = VoidSymbol
+ altgr alt keycode 254 = VoidSymbol
+keycode 255 = nul
+ altgr control keycode 255 = VoidSymbol
+ shift alt keycode 255 = VoidSymbol
+ altgr alt keycode 255 = VoidSymbol
+string F1 = "\033[[A"
+string F2 = "\033[[B"
+string F3 = "\033[[C"
+string F4 = "\033[[D"
+string F5 = "\033[[E"
+string F6 = "\033[17~"
+string F7 = "\033[18~"
+string F8 = "\033[19~"
+string F9 = "\033[20~"
+string F10 = "\033[21~"
+string F11 = "\033[23~"
+string F12 = "\033[24~"
+string F13 = "\033[25~"
+string F14 = "\033[26~"
+string F15 = "\033[28~"
+string F16 = "\033[29~"
+string F17 = "\033[31~"
+string F18 = "\033[32~"
+string F19 = "\033[33~"
+string F20 = "\033[34~"
+string Find = "\033[1~"
+string Insert = "\033[2~"
+string Remove = "\033[3~"
+string Select = "\033[4~"
+string Prior = "\033[5~"
+string Next = "\033[6~"
+string Macro = "\033[M"
+string Pause = "\033[P"
+compose '`' 'A' to U+00c0
+compose '`' 'a' to U+00e0
+compose '\'' 'A' to U+00c1
+compose '\'' 'a' to U+00e1
+compose '^' 'A' to U+00c2
+compose '^' 'a' to U+00e2
+compose '~' 'A' to U+00c3
+compose '~' 'a' to U+00e3
+compose '"' 'A' to U+00c4
+compose '"' 'a' to U+00e4
+compose '-' 'a' to U+00aa
+compose '-' 'A' to U+00aa
+compose 'O' 'A' to U+00c5
+compose 'o' 'a' to U+00e5
+compose '0' 'A' to U+00c5
+compose '0' 'a' to U+00e5
+compose 'A' 'A' to U+00c5
+compose 'a' 'a' to U+00e5
+compose '°' 'A' to U+00c5
+compose '°' 'a' to U+00e5
+compose 'A' 'E' to U+00c6
+compose 'a' 'e' to U+00e6
+compose ',' 'C' to U+00c7
+compose ',' 'c' to U+00e7
+compose '^' 'C' to U+00c7
+compose '^' 'c' to U+00e7
+compose '`' 'E' to U+00c8
+compose '`' 'e' to U+00e8
+compose '\'' 'E' to U+00c9
+compose '\'' 'e' to U+00e9
+compose '^' 'E' to U+00ca
+compose '^' 'e' to U+00ea
+compose '"' 'E' to U+00cb
+compose '"' 'e' to U+00eb
+compose '`' 'I' to U+00cc
+compose '`' 'i' to U+00ec
+compose '\'' 'I' to U+00cd
+compose '\'' 'i' to U+00ed
+compose '^' 'I' to U+00ce
+compose '^' 'i' to U+00ee
+compose '"' 'I' to U+00cf
+compose '"' 'i' to U+00ef
+compose '-' 'D' to U+00d0
+compose '-' 'd' to U+00f0
+compose '^' 'D' to U+00d0
+compose '^' 'd' to U+00f0
+compose '~' 'N' to U+00d1
+compose '~' 'n' to U+00f1
+compose '^' 'N' to U+00d1
+compose '^' 'n' to U+00f1
+compose '`' 'O' to U+00d2
+compose '`' 'o' to U+00f2
+compose '\'' 'O' to U+00d3
+compose '\'' 'o' to U+00f3
+compose '^' 'O' to U+00d4
+compose '^' 'o' to U+00f4
+compose '~' 'O' to U+00d5
+compose '~' 'o' to U+00f5
+compose '"' 'O' to U+00d6
+compose '"' 'o' to U+00f6
+compose '/' 'O' to U+00d8
+compose '/' 'o' to U+00f8
+compose '-' 'o' to U+00ba
+compose '-' 'O' to U+00ba
+compose '`' 'U' to U+00d9
+compose '`' 'u' to U+00f9
+compose '\'' 'U' to U+00da
+compose '\'' 'u' to U+00fa
+compose '^' 'U' to U+00db
+compose '^' 'u' to U+00fb
+compose '"' 'U' to U+00dc
+compose '"' 'u' to U+00fc
+compose '\'' 'Y' to U+00dd
+compose '\'' 'y' to U+00fd
+compose 'T' 'H' to U+00de
+compose 't' 'h' to U+00fe
+compose 's' 's' to U+00df
+compose '"' 'y' to U+00ff
+compose 's' 'z' to U+00df
+compose 'n' 'n' to U+00f1
+compose 'n' 'h' to U+00f1
+compose 'N' 'Y' to U+00d1
+compose 'N' 'N' to U+00d1
+compose 'N' 'H' to U+00d1
+compose 'N' 'y' to U+00d1
+compose 'N' 'n' to U+00d1
+compose 'N' 'h' to U+00d1
+compose '-' 'L' to U+00a3
+compose '<' '<' to U+00ab
+compose '>' '>' to U+00bb
+compose '?' '?' to U+00bf
+compose '^' '?' to U+00bf
+compose '!' '!' to U+00a1
+compose '^' '!' to U+00a1
+compose '^' '1' to U+00b9
+compose '^' '2' to U+00b2
+compose '^' '3' to U+00b3
+compose '+' '-' to U+00b1
+compose 'c' '=' to U+00a2
+compose 'c' '/' to U+00a2
+compose '/' 'c' to U+00a2
+compose '-' 'c' to U+00a2
+compose '-' 'C' to U+00a2
+compose '|' 'c' to U+00a2
+compose '|' 'C' to U+00a2
+compose 'L' '=' to U+00a3
+compose '-' 'L' to U+00a3
+compose '-' 'l' to U+00a3
+compose '^' '*' to U+00d7
+compose '^' 'x' to U+00d7
+compose 'x' 'x' to U+00d7
+compose '^' '.' to U+00b7
+compose '.' '.' to U+00b7
+compose '^' '/' to U+00f7
+compose '^' ':' to U+00f7
+compose '-' ':' to U+00f7
+compose ':' '-' to U+00f7
+compose 'Y' '=' to U+00a5
+compose '=' 'Y' to U+00a5
+compose '-' 'Y' to U+00a5
+compose '-' 'l' to U+00a5
+compose '(' 'c' to U+00a9
+compose '"' 'c' to U+00a9
+compose 'O' 'C' to U+00a9
+compose '(' 'C' to U+00a9
+compose 'C' ')' to U+00a9
+compose '-' 'a' to U+00aa
+compose '-' 'A' to U+00aa
+compose '-' 'o' to U+00ba
+compose '-' 'O' to U+00ba
+compose '(' 'r' to U+00ae
+compose '"' 'r' to U+00ae
+compose 'O' 'R' to U+00ae
+compose '(' 'R' to U+00ae
+compose 'R' ')' to U+00ae
+compose 'm' 'u' to U+00b5
+compose 'P' 'P' to U+00b6
+compose '1' '4' to U+00bc
+compose '1' '2' to U+00bd
+compose '3' '4' to U+00be
+compose 'e' '=' to U+00a4
+compose '-' 'e' to U+00a4
+compose '-' 'E' to U+00a4
+compose '=' 'E' to U+00a4
+compose 'v' 'S' to U+00a6
+compose '^' 'S' to U+00a6
+compose 'v' 's' to U+00a8
+compose '^' 's' to U+00a8
+compose 'v' 'Z' to U+00b4
+compose '^' 'Z' to U+00b4
+compose 'v' 'z' to U+00b8
+compose '^' 'z' to U+00b8
+compose 'O' 'E' to U+00bc
+compose 'O' 'e' to U+00bc
+compose 'o' 'e' to U+00bd
+compose '"' 'Y' to U+00be
+compose 'i' 'j' to U+00ff
+compose 'I' 'J' to U+00be
diff --git a/core/modules/swiss/data/opt/openslx/keymaps/german_qwertz_keyboard_translation.map b/core/modules/swiss/data/opt/openslx/keymaps/german_qwertz_keyboard_translation.map
new file mode 100644
index 00000000..d5069876
--- /dev/null
+++ b/core/modules/swiss/data/opt/openslx/keymaps/german_qwertz_keyboard_translation.map
@@ -0,0 +1,809 @@
+keymaps 0-2,4-6,8-10,12
+keycode 1 = Escape Escape
+ alt keycode 1 = Meta_Escape
+ shift alt keycode 1 = Meta_Escape
+keycode 2 = one exclam
+ alt keycode 2 = Meta_one
+ shift alt keycode 2 = Meta_exclam
+keycode 3 = two quotedbl twosuperior nul
+ alt keycode 3 = Meta_two
+ shift alt keycode 3 = Meta_quotedbl
+ control alt keycode 3 = Meta_nul
+keycode 4 = three section threesuperior Escape
+ alt keycode 4 = Meta_three
+ control alt keycode 4 = Meta_Escape
+keycode 5 = four dollar
+ alt keycode 5 = Meta_four
+ shift alt keycode 5 = Meta_dollar
+keycode 6 = five percent
+ alt keycode 6 = Meta_five
+ shift alt keycode 6 = Meta_percent
+keycode 7 = six ampersand
+ control keycode 7 = Control_asciicircum
+ alt keycode 7 = Meta_six
+ shift alt keycode 7 = Meta_ampersand
+keycode 8 = seven slash braceleft
+ alt keycode 8 = Meta_seven
+ shift alt keycode 8 = Meta_slash
+ altgr alt keycode 8 = Meta_braceleft
+keycode 9 = eight parenleft bracketleft
+ alt keycode 9 = Meta_eight
+ shift alt keycode 9 = Meta_parenleft
+ altgr alt keycode 9 = Meta_bracketleft
+keycode 10 = nine parenright bracketright
+ altgr control keycode 10 = Control_bracketright
+ alt keycode 10 = Meta_nine
+ shift alt keycode 10 = Meta_parenright
+ altgr alt keycode 10 = Meta_bracketright
+keycode 11 = zero equal braceright
+ alt keycode 11 = Meta_zero
+ shift alt keycode 11 = Meta_equal
+ altgr alt keycode 11 = Meta_braceright
+keycode 12 = ssharp question backslash
+ altgr control keycode 12 = Control_backslash
+ shift alt keycode 12 = Meta_question
+ altgr alt keycode 12 = Meta_backslash
+keycode 13 = apostrophe grave
+ alt keycode 13 = 0x08b4
+ shift alt keycode 13 = Meta_grave
+keycode 14 = Delete Delete
+ alt keycode 14 = Meta_Delete
+ shift alt keycode 14 = Meta_Delete
+keycode 15 = Tab Meta_Tab
+ alt keycode 15 = Meta_Tab
+keycode 16 = +q +Q at Control_q Control_q nul Meta_q Meta_Q Meta_at Meta_Control_q
+keycode 17 = w
+keycode 18 = +e +E currency Control_e Control_e Control_e Meta_e Meta_E Meta_e Meta_Control_e
+keycode 19 = r
+keycode 20 = t
+keycode 21 = z
+keycode 22 = u
+keycode 23 = i
+keycode 24 = o
+keycode 25 = p
+keycode 26 = +udiaeresis +Udiaeresis
+keycode 27 = plus asterisk asciitilde
+ alt keycode 27 = Meta_plus
+ shift alt keycode 27 = Meta_asterisk
+keycode 28 = Return
+ alt keycode 28 = Meta_Control_m
+keycode 29 = Control
+keycode 30 = a
+keycode 31 = s
+keycode 32 = d
+keycode 33 = f
+keycode 34 = g
+keycode 35 = h
+keycode 36 = j
+keycode 37 = k
+keycode 38 = l
+keycode 39 = +odiaeresis +Odiaeresis
+keycode 40 = +adiaeresis +Adiaeresis
+keycode 41 = asciicircum degree Meta_asciicircum Control_asciicircum
+ control alt keycode 41 = Meta_Control_asciicircum
+keycode 42 = Shift
+keycode 43 = numbersign apostrophe
+ alt keycode 43 = Meta_numbersign
+ shift alt keycode 43 = Meta_apostrophe
+keycode 44 = y
+keycode 45 = x
+keycode 46 = +c +C cent Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_Control_c
+keycode 47 = v
+keycode 48 = b
+keycode 49 = n
+keycode 50 = +m +M mu Control_m Control_m Control_m Meta_m Meta_M Meta_m Meta_Control_m
+keycode 51 = comma semicolon
+ alt keycode 51 = Meta_comma
+ shift alt keycode 51 = Meta_semicolon
+keycode 52 = period colon
+ alt keycode 52 = Meta_period
+ shift alt keycode 52 = Meta_colon
+keycode 53 = minus underscore Meta_minus
+ shift control keycode 53 = Control_underscore
+ alt keycode 53 = Meta_minus
+ shift alt keycode 53 = Meta_underscore
+keycode 54 = Shift
+keycode 55 = KP_Multiply
+ altgr keycode 55 = Hex_C
+keycode 56 = Alt
+keycode 57 = space space Meta_space nul
+ alt keycode 57 = Meta_space
+ shift alt keycode 57 = Meta_space
+ control alt keycode 57 = Meta_nul
+keycode 58 = Caps_Lock
+keycode 59 = F1 F13 Console_13 F25
+ alt keycode 59 = Console_1
+ control alt keycode 59 = Console_1
+keycode 60 = F2 F14 Console_14 F26
+ alt keycode 60 = Console_2
+ control alt keycode 60 = Console_2
+keycode 61 = F3 F15 Console_15 F27
+ alt keycode 61 = Console_3
+ control alt keycode 61 = Console_3
+keycode 62 = F4 F16 Console_16 F28
+ alt keycode 62 = Console_4
+ control alt keycode 62 = Console_4
+keycode 63 = F5 F17 Console_17 F29
+ alt keycode 63 = Console_5
+ control alt keycode 63 = Console_5
+keycode 64 = F6 F18 Console_18 F30
+ alt keycode 64 = Console_6
+ control alt keycode 64 = Console_6
+keycode 65 = F7 F19 Console_19 F31
+ alt keycode 65 = Console_7
+ control alt keycode 65 = Console_7
+keycode 66 = F8 F20 Console_20 F32
+ alt keycode 66 = Console_8
+ control alt keycode 66 = Console_8
+keycode 67 = F9 F21 Console_21 F33
+ alt keycode 67 = Console_9
+ control alt keycode 67 = Console_9
+keycode 68 = F10 F22 Console_22 F34
+ alt keycode 68 = Console_10
+ control alt keycode 68 = Console_10
+keycode 69 = Num_Lock
+ altgr keycode 69 = Hex_A
+keycode 70 = Scroll_Lock Show_Memory Show_Registers Show_State
+ alt keycode 70 = Scroll_Lock
+keycode 71 = KP_7
+ altgr keycode 71 = Hex_7
+ alt keycode 71 = Ascii_7
+keycode 72 = KP_8
+ altgr keycode 72 = Hex_8
+ alt keycode 72 = Ascii_8
+keycode 73 = KP_9
+ altgr keycode 73 = Hex_9
+ alt keycode 73 = Ascii_9
+keycode 74 = KP_Subtract
+ altgr keycode 74 = Hex_D
+keycode 75 = KP_4
+ altgr keycode 75 = Hex_4
+ alt keycode 75 = Ascii_4
+keycode 76 = KP_5
+ altgr keycode 76 = Hex_5
+ alt keycode 76 = Ascii_5
+keycode 77 = KP_6
+ altgr keycode 77 = Hex_6
+ alt keycode 77 = Ascii_6
+keycode 78 = KP_Add
+ altgr keycode 78 = Hex_E
+keycode 79 = KP_1
+ altgr keycode 79 = Hex_1
+ alt keycode 79 = Ascii_1
+keycode 80 = KP_2
+ altgr keycode 80 = Hex_2
+ alt keycode 80 = Ascii_2
+keycode 81 = KP_3
+ altgr keycode 81 = Hex_3
+ alt keycode 81 = Ascii_3
+keycode 82 = KP_0
+ altgr keycode 82 = Hex_0
+ alt keycode 82 = Ascii_0
+keycode 83 = KP_Comma
+ altgr control keycode 83 = Boot
+ control alt keycode 83 = Boot
+keycode 84 = Last_Console
+keycode 85 =
+keycode 86 = less greater bar
+ alt keycode 86 = Meta_less
+ shift alt keycode 86 = Meta_greater
+ altgr alt keycode 86 = Meta_bar
+keycode 87 = F11 F23 Console_23 F35
+ alt keycode 87 = Console_11
+ control alt keycode 87 = Console_11
+keycode 88 = F12 F24 Console_24 F36
+ alt keycode 88 = Console_12
+ control alt keycode 88 = Console_12
+keycode 89 =
+keycode 90 =
+keycode 91 =
+keycode 92 =
+keycode 93 =
+keycode 94 =
+keycode 95 =
+keycode 96 = KP_Enter
+ altgr keycode 96 = Hex_F
+keycode 97 = Control
+keycode 98 = KP_Divide
+ altgr keycode 98 = Hex_B
+keycode 99 = Compose
+ control keycode 99 = Control_backslash
+ alt keycode 99 = Control_backslash
+ control alt keycode 99 = Meta_Control_backslash
+keycode 100 = AltGr
+ alt keycode 100 = Compose
+keycode 101 = Break
+keycode 102 = Find
+keycode 103 = Up
+ alt keycode 103 = KeyboardSignal
+keycode 104 = Prior
+ shift keycode 104 = Scroll_Backward
+keycode 105 = Left
+ alt keycode 105 = Decr_Console
+keycode 106 = Right
+ alt keycode 106 = Incr_Console
+keycode 107 = Select
+keycode 108 = Down
+keycode 109 = Next
+ shift keycode 109 = Scroll_Forward
+keycode 110 = Insert
+keycode 111 = Remove
+ altgr control keycode 111 = Boot
+ control alt keycode 111 = Boot
+keycode 112 = Macro
+ altgr control keycode 112 = VoidSymbol
+ shift alt keycode 112 = VoidSymbol
+ altgr alt keycode 112 = VoidSymbol
+keycode 113 = F13
+ altgr control keycode 113 = VoidSymbol
+ shift alt keycode 113 = VoidSymbol
+ altgr alt keycode 113 = VoidSymbol
+keycode 114 = F14
+ altgr control keycode 114 = VoidSymbol
+ shift alt keycode 114 = VoidSymbol
+ altgr alt keycode 114 = VoidSymbol
+keycode 115 = Help
+ altgr control keycode 115 = VoidSymbol
+ shift alt keycode 115 = VoidSymbol
+ altgr alt keycode 115 = VoidSymbol
+keycode 116 = Do
+ altgr control keycode 116 = VoidSymbol
+ shift alt keycode 116 = VoidSymbol
+ altgr alt keycode 116 = VoidSymbol
+keycode 117 = F17
+ altgr control keycode 117 = VoidSymbol
+ shift alt keycode 117 = VoidSymbol
+ altgr alt keycode 117 = VoidSymbol
+keycode 118 = KP_MinPlus
+ altgr control keycode 118 = VoidSymbol
+ shift alt keycode 118 = VoidSymbol
+ altgr alt keycode 118 = VoidSymbol
+keycode 119 = Pause
+keycode 120 =
+keycode 121 =
+keycode 122 =
+keycode 123 =
+keycode 124 =
+keycode 125 =
+keycode 126 =
+keycode 127 =
+keycode 128 = nul
+ altgr control keycode 128 = VoidSymbol
+ shift alt keycode 128 = VoidSymbol
+ altgr alt keycode 128 = VoidSymbol
+keycode 129 = nul
+ altgr control keycode 129 = VoidSymbol
+ shift alt keycode 129 = VoidSymbol
+ altgr alt keycode 129 = VoidSymbol
+keycode 130 = nul
+ altgr control keycode 130 = VoidSymbol
+ shift alt keycode 130 = VoidSymbol
+ altgr alt keycode 130 = VoidSymbol
+keycode 131 = nul
+ altgr control keycode 131 = VoidSymbol
+ shift alt keycode 131 = VoidSymbol
+ altgr alt keycode 131 = VoidSymbol
+keycode 132 = nul
+ altgr control keycode 132 = VoidSymbol
+ shift alt keycode 132 = VoidSymbol
+ altgr alt keycode 132 = VoidSymbol
+keycode 133 = nul
+ altgr control keycode 133 = VoidSymbol
+ shift alt keycode 133 = VoidSymbol
+ altgr alt keycode 133 = VoidSymbol
+keycode 134 = nul
+ altgr control keycode 134 = VoidSymbol
+ shift alt keycode 134 = VoidSymbol
+ altgr alt keycode 134 = VoidSymbol
+keycode 135 = nul
+ altgr control keycode 135 = VoidSymbol
+ shift alt keycode 135 = VoidSymbol
+ altgr alt keycode 135 = VoidSymbol
+keycode 136 = nul
+ altgr control keycode 136 = VoidSymbol
+ shift alt keycode 136 = VoidSymbol
+ altgr alt keycode 136 = VoidSymbol
+keycode 137 = nul
+ altgr control keycode 137 = VoidSymbol
+ shift alt keycode 137 = VoidSymbol
+ altgr alt keycode 137 = VoidSymbol
+keycode 138 = nul
+ altgr control keycode 138 = VoidSymbol
+ shift alt keycode 138 = VoidSymbol
+ altgr alt keycode 138 = VoidSymbol
+keycode 139 = nul
+ altgr control keycode 139 = VoidSymbol
+ shift alt keycode 139 = VoidSymbol
+ altgr alt keycode 139 = VoidSymbol
+keycode 140 = nul
+ altgr control keycode 140 = VoidSymbol
+ shift alt keycode 140 = VoidSymbol
+ altgr alt keycode 140 = VoidSymbol
+keycode 141 = nul
+ altgr control keycode 141 = VoidSymbol
+ shift alt keycode 141 = VoidSymbol
+ altgr alt keycode 141 = VoidSymbol
+keycode 142 = nul
+ altgr control keycode 142 = VoidSymbol
+ shift alt keycode 142 = VoidSymbol
+ altgr alt keycode 142 = VoidSymbol
+keycode 143 = nul
+ altgr control keycode 143 = VoidSymbol
+ shift alt keycode 143 = VoidSymbol
+ altgr alt keycode 143 = VoidSymbol
+keycode 144 = nul
+ altgr control keycode 144 = VoidSymbol
+ shift alt keycode 144 = VoidSymbol
+ altgr alt keycode 144 = VoidSymbol
+keycode 145 = nul
+ altgr control keycode 145 = VoidSymbol
+ shift alt keycode 145 = VoidSymbol
+ altgr alt keycode 145 = VoidSymbol
+keycode 146 = nul
+ altgr control keycode 146 = VoidSymbol
+ shift alt keycode 146 = VoidSymbol
+ altgr alt keycode 146 = VoidSymbol
+keycode 147 = nul
+ altgr control keycode 147 = VoidSymbol
+ shift alt keycode 147 = VoidSymbol
+ altgr alt keycode 147 = VoidSymbol
+keycode 148 = nul
+ altgr control keycode 148 = VoidSymbol
+ shift alt keycode 148 = VoidSymbol
+ altgr alt keycode 148 = VoidSymbol
+keycode 149 = nul
+ altgr control keycode 149 = VoidSymbol
+ shift alt keycode 149 = VoidSymbol
+ altgr alt keycode 149 = VoidSymbol
+keycode 150 = nul
+ altgr control keycode 150 = VoidSymbol
+ shift alt keycode 150 = VoidSymbol
+ altgr alt keycode 150 = VoidSymbol
+keycode 151 = nul
+ altgr control keycode 151 = VoidSymbol
+ shift alt keycode 151 = VoidSymbol
+ altgr alt keycode 151 = VoidSymbol
+keycode 152 = nul
+ altgr control keycode 152 = VoidSymbol
+ shift alt keycode 152 = VoidSymbol
+ altgr alt keycode 152 = VoidSymbol
+keycode 153 = nul
+ altgr control keycode 153 = VoidSymbol
+ shift alt keycode 153 = VoidSymbol
+ altgr alt keycode 153 = VoidSymbol
+keycode 154 = nul
+ altgr control keycode 154 = VoidSymbol
+ shift alt keycode 154 = VoidSymbol
+ altgr alt keycode 154 = VoidSymbol
+keycode 155 = nul
+ altgr control keycode 155 = VoidSymbol
+ shift alt keycode 155 = VoidSymbol
+ altgr alt keycode 155 = VoidSymbol
+keycode 156 = nul
+ altgr control keycode 156 = VoidSymbol
+ shift alt keycode 156 = VoidSymbol
+ altgr alt keycode 156 = VoidSymbol
+keycode 157 = nul
+ altgr control keycode 157 = VoidSymbol
+ shift alt keycode 157 = VoidSymbol
+ altgr alt keycode 157 = VoidSymbol
+keycode 158 = nul
+ altgr control keycode 158 = VoidSymbol
+ shift alt keycode 158 = VoidSymbol
+ altgr alt keycode 158 = VoidSymbol
+keycode 159 = nul
+ altgr control keycode 159 = VoidSymbol
+ shift alt keycode 159 = VoidSymbol
+ altgr alt keycode 159 = VoidSymbol
+keycode 160 = nul
+ altgr control keycode 160 = VoidSymbol
+ shift alt keycode 160 = VoidSymbol
+ altgr alt keycode 160 = VoidSymbol
+keycode 161 = nul
+ altgr control keycode 161 = VoidSymbol
+ shift alt keycode 161 = VoidSymbol
+ altgr alt keycode 161 = VoidSymbol
+keycode 162 = nul
+ altgr control keycode 162 = VoidSymbol
+ shift alt keycode 162 = VoidSymbol
+ altgr alt keycode 162 = VoidSymbol
+keycode 163 = nul
+ altgr control keycode 163 = VoidSymbol
+ shift alt keycode 163 = VoidSymbol
+ altgr alt keycode 163 = VoidSymbol
+keycode 164 = nul
+ altgr control keycode 164 = VoidSymbol
+ shift alt keycode 164 = VoidSymbol
+ altgr alt keycode 164 = VoidSymbol
+keycode 165 = nul
+ altgr control keycode 165 = VoidSymbol
+ shift alt keycode 165 = VoidSymbol
+ altgr alt keycode 165 = VoidSymbol
+keycode 166 = nul
+ altgr control keycode 166 = VoidSymbol
+ shift alt keycode 166 = VoidSymbol
+ altgr alt keycode 166 = VoidSymbol
+keycode 167 = nul
+ altgr control keycode 167 = VoidSymbol
+ shift alt keycode 167 = VoidSymbol
+ altgr alt keycode 167 = VoidSymbol
+keycode 168 = nul
+ altgr control keycode 168 = VoidSymbol
+ shift alt keycode 168 = VoidSymbol
+ altgr alt keycode 168 = VoidSymbol
+keycode 169 = nul
+ altgr control keycode 169 = VoidSymbol
+ shift alt keycode 169 = VoidSymbol
+ altgr alt keycode 169 = VoidSymbol
+keycode 170 = nul
+ altgr control keycode 170 = VoidSymbol
+ shift alt keycode 170 = VoidSymbol
+ altgr alt keycode 170 = VoidSymbol
+keycode 171 = nul
+ altgr control keycode 171 = VoidSymbol
+ shift alt keycode 171 = VoidSymbol
+ altgr alt keycode 171 = VoidSymbol
+keycode 172 = nul
+ altgr control keycode 172 = VoidSymbol
+ shift alt keycode 172 = VoidSymbol
+ altgr alt keycode 172 = VoidSymbol
+keycode 173 = nul
+ altgr control keycode 173 = VoidSymbol
+ shift alt keycode 173 = VoidSymbol
+ altgr alt keycode 173 = VoidSymbol
+keycode 174 = nul
+ altgr control keycode 174 = VoidSymbol
+ shift alt keycode 174 = VoidSymbol
+ altgr alt keycode 174 = VoidSymbol
+keycode 175 = nul
+ altgr control keycode 175 = VoidSymbol
+ shift alt keycode 175 = VoidSymbol
+ altgr alt keycode 175 = VoidSymbol
+keycode 176 = nul
+ altgr control keycode 176 = VoidSymbol
+ shift alt keycode 176 = VoidSymbol
+ altgr alt keycode 176 = VoidSymbol
+keycode 177 = nul
+ altgr control keycode 177 = VoidSymbol
+ shift alt keycode 177 = VoidSymbol
+ altgr alt keycode 177 = VoidSymbol
+keycode 178 = nul
+ altgr control keycode 178 = VoidSymbol
+ shift alt keycode 178 = VoidSymbol
+ altgr alt keycode 178 = VoidSymbol
+keycode 179 = nul
+ altgr control keycode 179 = VoidSymbol
+ shift alt keycode 179 = VoidSymbol
+ altgr alt keycode 179 = VoidSymbol
+keycode 180 = nul
+ altgr control keycode 180 = VoidSymbol
+ shift alt keycode 180 = VoidSymbol
+ altgr alt keycode 180 = VoidSymbol
+keycode 181 = nul
+ altgr control keycode 181 = VoidSymbol
+ shift alt keycode 181 = VoidSymbol
+ altgr alt keycode 181 = VoidSymbol
+keycode 182 = nul
+ altgr control keycode 182 = VoidSymbol
+ shift alt keycode 182 = VoidSymbol
+ altgr alt keycode 182 = VoidSymbol
+keycode 183 = nul
+ altgr control keycode 183 = VoidSymbol
+ shift alt keycode 183 = VoidSymbol
+ altgr alt keycode 183 = VoidSymbol
+keycode 184 = nul
+ altgr control keycode 184 = VoidSymbol
+ shift alt keycode 184 = VoidSymbol
+ altgr alt keycode 184 = VoidSymbol
+keycode 185 = nul
+ altgr control keycode 185 = VoidSymbol
+ shift alt keycode 185 = VoidSymbol
+ altgr alt keycode 185 = VoidSymbol
+keycode 186 = nul
+ altgr control keycode 186 = VoidSymbol
+ shift alt keycode 186 = VoidSymbol
+ altgr alt keycode 186 = VoidSymbol
+keycode 187 = nul
+ altgr control keycode 187 = VoidSymbol
+ shift alt keycode 187 = VoidSymbol
+ altgr alt keycode 187 = VoidSymbol
+keycode 188 = nul
+ altgr control keycode 188 = VoidSymbol
+ shift alt keycode 188 = VoidSymbol
+ altgr alt keycode 188 = VoidSymbol
+keycode 189 = nul
+ altgr control keycode 189 = VoidSymbol
+ shift alt keycode 189 = VoidSymbol
+ altgr alt keycode 189 = VoidSymbol
+keycode 190 = nul
+ altgr control keycode 190 = VoidSymbol
+ shift alt keycode 190 = VoidSymbol
+ altgr alt keycode 190 = VoidSymbol
+keycode 191 = nul
+ altgr control keycode 191 = VoidSymbol
+ shift alt keycode 191 = VoidSymbol
+ altgr alt keycode 191 = VoidSymbol
+keycode 192 = nul
+ altgr control keycode 192 = VoidSymbol
+ shift alt keycode 192 = VoidSymbol
+ altgr alt keycode 192 = VoidSymbol
+keycode 193 = nul
+ altgr control keycode 193 = VoidSymbol
+ shift alt keycode 193 = VoidSymbol
+ altgr alt keycode 193 = VoidSymbol
+keycode 194 = nul
+ altgr control keycode 194 = VoidSymbol
+ shift alt keycode 194 = VoidSymbol
+ altgr alt keycode 194 = VoidSymbol
+keycode 195 = nul
+ altgr control keycode 195 = VoidSymbol
+ shift alt keycode 195 = VoidSymbol
+ altgr alt keycode 195 = VoidSymbol
+keycode 196 = nul
+ altgr control keycode 196 = VoidSymbol
+ shift alt keycode 196 = VoidSymbol
+ altgr alt keycode 196 = VoidSymbol
+keycode 197 = nul
+ altgr control keycode 197 = VoidSymbol
+ shift alt keycode 197 = VoidSymbol
+ altgr alt keycode 197 = VoidSymbol
+keycode 198 = nul
+ altgr control keycode 198 = VoidSymbol
+ shift alt keycode 198 = VoidSymbol
+ altgr alt keycode 198 = VoidSymbol
+keycode 199 = nul
+ altgr control keycode 199 = VoidSymbol
+ shift alt keycode 199 = VoidSymbol
+ altgr alt keycode 199 = VoidSymbol
+keycode 200 = nul
+ altgr control keycode 200 = VoidSymbol
+ shift alt keycode 200 = VoidSymbol
+ altgr alt keycode 200 = VoidSymbol
+keycode 201 = nul
+ altgr control keycode 201 = VoidSymbol
+ shift alt keycode 201 = VoidSymbol
+ altgr alt keycode 201 = VoidSymbol
+keycode 202 = nul
+ altgr control keycode 202 = VoidSymbol
+ shift alt keycode 202 = VoidSymbol
+ altgr alt keycode 202 = VoidSymbol
+keycode 203 = nul
+ altgr control keycode 203 = VoidSymbol
+ shift alt keycode 203 = VoidSymbol
+ altgr alt keycode 203 = VoidSymbol
+keycode 204 = nul
+ altgr control keycode 204 = VoidSymbol
+ shift alt keycode 204 = VoidSymbol
+ altgr alt keycode 204 = VoidSymbol
+keycode 205 = nul
+ altgr control keycode 205 = VoidSymbol
+ shift alt keycode 205 = VoidSymbol
+ altgr alt keycode 205 = VoidSymbol
+keycode 206 = nul
+ altgr control keycode 206 = VoidSymbol
+ shift alt keycode 206 = VoidSymbol
+ altgr alt keycode 206 = VoidSymbol
+keycode 207 = nul
+ altgr control keycode 207 = VoidSymbol
+ shift alt keycode 207 = VoidSymbol
+ altgr alt keycode 207 = VoidSymbol
+keycode 208 = nul
+ altgr control keycode 208 = VoidSymbol
+ shift alt keycode 208 = VoidSymbol
+ altgr alt keycode 208 = VoidSymbol
+keycode 209 = nul
+ altgr control keycode 209 = VoidSymbol
+ shift alt keycode 209 = VoidSymbol
+ altgr alt keycode 209 = VoidSymbol
+keycode 210 = nul
+ altgr control keycode 210 = VoidSymbol
+ shift alt keycode 210 = VoidSymbol
+ altgr alt keycode 210 = VoidSymbol
+keycode 211 = nul
+ altgr control keycode 211 = VoidSymbol
+ shift alt keycode 211 = VoidSymbol
+ altgr alt keycode 211 = VoidSymbol
+keycode 212 = nul
+ altgr control keycode 212 = VoidSymbol
+ shift alt keycode 212 = VoidSymbol
+ altgr alt keycode 212 = VoidSymbol
+keycode 213 = nul
+ altgr control keycode 213 = VoidSymbol
+ shift alt keycode 213 = VoidSymbol
+ altgr alt keycode 213 = VoidSymbol
+keycode 214 = nul
+ altgr control keycode 214 = VoidSymbol
+ shift alt keycode 214 = VoidSymbol
+ altgr alt keycode 214 = VoidSymbol
+keycode 215 = nul
+ altgr control keycode 215 = VoidSymbol
+ shift alt keycode 215 = VoidSymbol
+ altgr alt keycode 215 = VoidSymbol
+keycode 216 = nul
+ altgr control keycode 216 = VoidSymbol
+ shift alt keycode 216 = VoidSymbol
+ altgr alt keycode 216 = VoidSymbol
+keycode 217 = nul
+ altgr control keycode 217 = VoidSymbol
+ shift alt keycode 217 = VoidSymbol
+ altgr alt keycode 217 = VoidSymbol
+keycode 218 = nul
+ altgr control keycode 218 = VoidSymbol
+ shift alt keycode 218 = VoidSymbol
+ altgr alt keycode 218 = VoidSymbol
+keycode 219 = nul
+ altgr control keycode 219 = VoidSymbol
+ shift alt keycode 219 = VoidSymbol
+ altgr alt keycode 219 = VoidSymbol
+keycode 220 = nul
+ altgr control keycode 220 = VoidSymbol
+ shift alt keycode 220 = VoidSymbol
+ altgr alt keycode 220 = VoidSymbol
+keycode 221 = nul
+ altgr control keycode 221 = VoidSymbol
+ shift alt keycode 221 = VoidSymbol
+ altgr alt keycode 221 = VoidSymbol
+keycode 222 = nul
+ altgr control keycode 222 = VoidSymbol
+ shift alt keycode 222 = VoidSymbol
+ altgr alt keycode 222 = VoidSymbol
+keycode 223 = nul
+ altgr control keycode 223 = VoidSymbol
+ shift alt keycode 223 = VoidSymbol
+ altgr alt keycode 223 = VoidSymbol
+keycode 224 = nul
+ altgr control keycode 224 = VoidSymbol
+ shift alt keycode 224 = VoidSymbol
+ altgr alt keycode 224 = VoidSymbol
+keycode 225 = nul
+ altgr control keycode 225 = VoidSymbol
+ shift alt keycode 225 = VoidSymbol
+ altgr alt keycode 225 = VoidSymbol
+keycode 226 = nul
+ altgr control keycode 226 = VoidSymbol
+ shift alt keycode 226 = VoidSymbol
+ altgr alt keycode 226 = VoidSymbol
+keycode 227 = nul
+ altgr control keycode 227 = VoidSymbol
+ shift alt keycode 227 = VoidSymbol
+ altgr alt keycode 227 = VoidSymbol
+keycode 228 = nul
+ altgr control keycode 228 = VoidSymbol
+ shift alt keycode 228 = VoidSymbol
+ altgr alt keycode 228 = VoidSymbol
+keycode 229 = nul
+ altgr control keycode 229 = VoidSymbol
+ shift alt keycode 229 = VoidSymbol
+ altgr alt keycode 229 = VoidSymbol
+keycode 230 = nul
+ altgr control keycode 230 = VoidSymbol
+ shift alt keycode 230 = VoidSymbol
+ altgr alt keycode 230 = VoidSymbol
+keycode 231 = nul
+ altgr control keycode 231 = VoidSymbol
+ shift alt keycode 231 = VoidSymbol
+ altgr alt keycode 231 = VoidSymbol
+keycode 232 = nul
+ altgr control keycode 232 = VoidSymbol
+ shift alt keycode 232 = VoidSymbol
+ altgr alt keycode 232 = VoidSymbol
+keycode 233 = nul
+ altgr control keycode 233 = VoidSymbol
+ shift alt keycode 233 = VoidSymbol
+ altgr alt keycode 233 = VoidSymbol
+keycode 234 = nul
+ altgr control keycode 234 = VoidSymbol
+ shift alt keycode 234 = VoidSymbol
+ altgr alt keycode 234 = VoidSymbol
+keycode 235 = nul
+ altgr control keycode 235 = VoidSymbol
+ shift alt keycode 235 = VoidSymbol
+ altgr alt keycode 235 = VoidSymbol
+keycode 236 = nul
+ altgr control keycode 236 = VoidSymbol
+ shift alt keycode 236 = VoidSymbol
+ altgr alt keycode 236 = VoidSymbol
+keycode 237 = nul
+ altgr control keycode 237 = VoidSymbol
+ shift alt keycode 237 = VoidSymbol
+ altgr alt keycode 237 = VoidSymbol
+keycode 238 = nul
+ altgr control keycode 238 = VoidSymbol
+ shift alt keycode 238 = VoidSymbol
+ altgr alt keycode 238 = VoidSymbol
+keycode 239 = nul
+ altgr control keycode 239 = VoidSymbol
+ shift alt keycode 239 = VoidSymbol
+ altgr alt keycode 239 = VoidSymbol
+keycode 240 = nul
+ altgr control keycode 240 = VoidSymbol
+ shift alt keycode 240 = VoidSymbol
+ altgr alt keycode 240 = VoidSymbol
+keycode 241 = nul
+ altgr control keycode 241 = VoidSymbol
+ shift alt keycode 241 = VoidSymbol
+ altgr alt keycode 241 = VoidSymbol
+keycode 242 = nul
+ altgr control keycode 242 = VoidSymbol
+ shift alt keycode 242 = VoidSymbol
+ altgr alt keycode 242 = VoidSymbol
+keycode 243 = nul
+ altgr control keycode 243 = VoidSymbol
+ shift alt keycode 243 = VoidSymbol
+ altgr alt keycode 243 = VoidSymbol
+keycode 244 = nul
+ altgr control keycode 244 = VoidSymbol
+ shift alt keycode 244 = VoidSymbol
+ altgr alt keycode 244 = VoidSymbol
+keycode 245 = nul
+ altgr control keycode 245 = VoidSymbol
+ shift alt keycode 245 = VoidSymbol
+ altgr alt keycode 245 = VoidSymbol
+keycode 246 = nul
+ altgr control keycode 246 = VoidSymbol
+ shift alt keycode 246 = VoidSymbol
+ altgr alt keycode 246 = VoidSymbol
+keycode 247 = nul
+ altgr control keycode 247 = VoidSymbol
+ shift alt keycode 247 = VoidSymbol
+ altgr alt keycode 247 = VoidSymbol
+keycode 248 = nul
+ altgr control keycode 248 = VoidSymbol
+ shift alt keycode 248 = VoidSymbol
+ altgr alt keycode 248 = VoidSymbol
+keycode 249 = nul
+ altgr control keycode 249 = VoidSymbol
+ shift alt keycode 249 = VoidSymbol
+ altgr alt keycode 249 = VoidSymbol
+keycode 250 = nul
+ altgr control keycode 250 = VoidSymbol
+ shift alt keycode 250 = VoidSymbol
+ altgr alt keycode 250 = VoidSymbol
+keycode 251 = nul
+ altgr control keycode 251 = VoidSymbol
+ shift alt keycode 251 = VoidSymbol
+ altgr alt keycode 251 = VoidSymbol
+keycode 252 = nul
+ altgr control keycode 252 = VoidSymbol
+ shift alt keycode 252 = VoidSymbol
+ altgr alt keycode 252 = VoidSymbol
+keycode 253 = nul
+ altgr control keycode 253 = VoidSymbol
+ shift alt keycode 253 = VoidSymbol
+ altgr alt keycode 253 = VoidSymbol
+keycode 254 = nul
+ altgr control keycode 254 = VoidSymbol
+ shift alt keycode 254 = VoidSymbol
+ altgr alt keycode 254 = VoidSymbol
+keycode 255 = nul
+ altgr control keycode 255 = VoidSymbol
+ shift alt keycode 255 = VoidSymbol
+ altgr alt keycode 255 = VoidSymbol
+string F1 = "\033[[A"
+string F2 = "\033[[B"
+string F3 = "\033[[C"
+string F4 = "\033[[D"
+string F5 = "\033[[E"
+string F6 = "\033[17~"
+string F7 = "\033[18~"
+string F8 = "\033[19~"
+string F9 = "\033[20~"
+string F10 = "\033[21~"
+string F11 = "\033[23~"
+string F12 = "\033[24~"
+string F13 = "\033[25~"
+string F14 = "\033[26~"
+string F15 = "\033[28~"
+string F16 = "\033[29~"
+string F17 = "\033[31~"
+string F18 = "\033[32~"
+string F19 = "\033[33~"
+string F20 = "\033[34~"
+string Find = "\033[1~"
+string Insert = "\033[2~"
+string Remove = "\033[3~"
+string Select = "\033[4~"
+string Prior = "\033[5~"
+string Next = "\033[6~"
+string Macro = "\033[M"
+string Pause = "\033[P"
diff --git a/core/modules/swiss/data/opt/openslx/keymaps/linux-keys-bare.inc b/core/modules/swiss/data/opt/openslx/keymaps/linux-keys-bare.inc
new file mode 100644
index 00000000..64a4ee95
--- /dev/null
+++ b/core/modules/swiss/data/opt/openslx/keymaps/linux-keys-bare.inc
@@ -0,0 +1,163 @@
+# Linux-specific (and language-independent) keys
+#
+# This file describes function keys, console switching keys,
+# keypad, cursor keys, and SysRq, ScrollLock, Pause
+#
+# It does not use the AltGr modifier, so that the user can opt
+# to have both Alt keys produce the same effect.
+# As a consequence, the Hex_* keys are missing, as are
+# control altgr keycode 83 = Boot
+# control altgr keycode 111 = Boot
+#
+# One culture-specific item that will be overridden in many keymaps
+# is the KP_Period: many countries have a KP_Comma instead.
+#
+# One user-preference item will be the function of the Delete key.
+#
+# Old keyboards have 10 function keys, and keymaps have
+# sometimes used shift+F1 = F11, and sometimes shift+F1 = F13.
+# Here we assume an enhanced keyboard (with 12 function keys).
+#
+plain keycode 59 = F1
+plain keycode 60 = F2
+plain keycode 61 = F3
+plain keycode 62 = F4
+plain keycode 63 = F5
+plain keycode 64 = F6
+plain keycode 65 = F7
+plain keycode 66 = F8
+plain keycode 67 = F9
+plain keycode 68 = F10
+plain keycode 87 = F11
+plain keycode 88 = F12
+shift keycode 59 = F13
+shift keycode 60 = F14
+shift keycode 61 = F15
+shift keycode 62 = F16
+shift keycode 63 = F17
+shift keycode 64 = F18
+shift keycode 65 = F19
+shift keycode 66 = F20
+shift keycode 67 = F21
+shift keycode 68 = F22
+shift keycode 87 = F23
+shift keycode 88 = F24
+control keycode 59 = F25
+control keycode 60 = F26
+control keycode 61 = F27
+control keycode 62 = F28
+control keycode 63 = F29
+control keycode 64 = F30
+control keycode 65 = F31
+control keycode 66 = F32
+control keycode 67 = F33
+control keycode 68 = F34
+control keycode 87 = F35
+control keycode 88 = F36
+#
+# The canonical assignment for F37-F48 uses
+# control shift keycode 59 = F37
+# etc. If you want that, load linux-keys-extd.inc
+#
+# Both Alt+Fn and Control+Alt+Fn switch to Console n
+# (in order to please Linux / dosemu / X).
+# Here Consoles 1..12. For 13..24 load linux-keys-extd.inc
+#
+alt keycode 59 = Console_1
+alt keycode 60 = Console_2
+alt keycode 61 = Console_3
+alt keycode 62 = Console_4
+alt keycode 63 = Console_5
+alt keycode 64 = Console_6
+alt keycode 65 = Console_7
+alt keycode 66 = Console_8
+alt keycode 67 = Console_9
+alt keycode 68 = Console_10
+alt keycode 87 = Console_11
+alt keycode 88 = Console_12
+control alt keycode 59 = Console_1
+control alt keycode 60 = Console_2
+control alt keycode 61 = Console_3
+control alt keycode 62 = Console_4
+control alt keycode 63 = Console_5
+control alt keycode 64 = Console_6
+control alt keycode 65 = Console_7
+control alt keycode 66 = Console_8
+control alt keycode 67 = Console_9
+control alt keycode 68 = Console_10
+control alt keycode 87 = Console_11
+control alt keycode 88 = Console_12
+
+#
+# Keypad keys
+#
+keycode 69 = Num_Lock
+keycode 98 = KP_Divide
+keycode 55 = KP_Multiply
+keycode 74 = KP_Subtract
+keycode 78 = KP_Add
+keycode 96 = KP_Enter
+#
+keycode 71 = KP_7
+keycode 72 = KP_8
+keycode 73 = KP_9
+keycode 75 = KP_4
+keycode 76 = KP_5
+keycode 77 = KP_6
+keycode 79 = KP_1
+keycode 80 = KP_2
+keycode 81 = KP_3
+keycode 82 = KP_0
+#
+keycode 83 = KP_Period # or KP_Comma
+control alt keycode 83 = Boot
+#
+alt keycode 71 = Ascii_7
+alt keycode 72 = Ascii_8
+alt keycode 73 = Ascii_9
+alt keycode 75 = Ascii_4
+alt keycode 76 = Ascii_5
+alt keycode 77 = Ascii_6
+alt keycode 79 = Ascii_1
+alt keycode 80 = Ascii_2
+alt keycode 81 = Ascii_3
+alt keycode 82 = Ascii_0
+#
+# The four cursor keys
+#
+keycode 103 = Up
+keycode 105 = Left
+keycode 106 = Right
+keycode 108 = Down
+alt keycode 103 = KeyboardSignal
+alt keycode 105 = Decr_Console
+alt keycode 106 = Incr_Console
+#
+# The six edit keys
+#
+keycode 110 = Insert
+keycode 102 = Home # Find
+keycode 104 = PageUp # Prior
+keycode 111 = Remove
+keycode 107 = End # Select
+keycode 109 = PageDown # Next
+shift keycode 104 = Scroll_Backward
+shift keycode 109 = Scroll_Forward
+control alt keycode 111 = Boot
+#
+# The three system keys
+#
+keycode 84 = Last_Console # Alt+SysRq/PrintScrn
+#keycode 99 = VoidSymbol # SysRq/PrintScrn
+keycode 99 = Compose # SysRq/PrintScrn
+alt keycode 99 = Control_backslash
+control keycode 99 = Control_backslash
+
+plain keycode 70 = Scroll_Lock
+shift keycode 70 = Show_Memory
+control keycode 70 = Show_State
+alt keycode 70 = Show_Registers
+
+keycode 101 = Break # Ctrl+Break/Pause
+keycode 119 = Pause # Break/Pause
+
diff --git a/core/modules/swiss/data/opt/openslx/keymaps/linux-with-alt-and-altgr.inc b/core/modules/swiss/data/opt/openslx/keymaps/linux-with-alt-and-altgr.inc
new file mode 100644
index 00000000..71a959e7
--- /dev/null
+++ b/core/modules/swiss/data/opt/openslx/keymaps/linux-with-alt-and-altgr.inc
@@ -0,0 +1,29 @@
+include "linux-keys-bare"
+
+keycode 100 = AltGr
+alt keycode 100 = Compose
+
+altgr keycode 70 = Show_Registers
+alt keycode 70 = Scroll_Lock
+
+control altgr keycode 83 = Boot
+control altgr keycode 111 = Boot
+
+# Hex keypad keys (for giving a Unicode value in 4 hex digits)
+# Follow lt.map and assign Hex_A .. Hex_F to keypad border.
+altgr keycode 55 = Hex_C
+altgr keycode 69 = Hex_A
+altgr keycode 71 = Hex_7
+altgr keycode 72 = Hex_8
+altgr keycode 73 = Hex_9
+altgr keycode 74 = Hex_D
+altgr keycode 75 = Hex_4
+altgr keycode 76 = Hex_5
+altgr keycode 77 = Hex_6
+altgr keycode 78 = Hex_E
+altgr keycode 79 = Hex_1
+altgr keycode 80 = Hex_2
+altgr keycode 81 = Hex_3
+altgr keycode 82 = Hex_0
+altgr keycode 96 = Hex_F
+altgr keycode 98 = Hex_B
diff --git a/core/modules/swiss/data/opt/openslx/keymaps/qwertz-layout.inc b/core/modules/swiss/data/opt/openslx/keymaps/qwertz-layout.inc
new file mode 100644
index 00000000..07535dc7
--- /dev/null
+++ b/core/modules/swiss/data/opt/openslx/keymaps/qwertz-layout.inc
@@ -0,0 +1,31 @@
+# qwertz-layout
+keycode 16 = q
+keycode 17 = w
+keycode 18 = e
+keycode 19 = r
+keycode 20 = t
+keycode 21 = z
+keycode 22 = u
+keycode 23 = i
+keycode 24 = o
+keycode 25 = p
+#
+keycode 30 = a
+keycode 31 = s
+keycode 32 = d
+keycode 33 = f
+keycode 34 = g
+keycode 35 = h
+keycode 36 = j
+keycode 37 = k
+keycode 38 = l
+#
+keycode 44 = y
+keycode 45 = x
+keycode 46 = c
+keycode 47 = v
+keycode 48 = b
+keycode 49 = n
+keycode 50 = m
+#
+include "compose"
diff --git a/core/modules/swiss/data/opt/openslx/keymaps/qwertz_de_CH-latin1.map b/core/modules/swiss/data/opt/openslx/keymaps/qwertz_de_CH-latin1.map
new file mode 100644
index 00000000..598dc449
--- /dev/null
+++ b/core/modules/swiss/data/opt/openslx/keymaps/qwertz_de_CH-latin1.map
@@ -0,0 +1,16 @@
+# de_CH-latin1.map: Swiss German keymap
+# Due to Björn Jacke <bjacke@suse.de>
+
+include "qwertz_fr_CH-latin1.map"
+
+keycode 26 = udiaeresis egrave bracketleft
+ control keycode 26 = Escape
+ alt keycode 26 = Meta_bracketleft
+keycode 39 = odiaeresis eacute
+ alt keycode 39 = Meta_semicolon
+keycode 40 = adiaeresis agrave braceleft
+ control keycode 40 = Control_g
+ alt keycode 40 = Meta_apostrophe
+
+# corresponding keys in Swiss French have German umlauts and
+# French accented characters exchanged
diff --git a/core/modules/swiss/data/opt/openslx/keymaps/qwertz_fr_CH-latin1.map b/core/modules/swiss/data/opt/openslx/keymaps/qwertz_fr_CH-latin1.map
new file mode 100644
index 00000000..667464e8
--- /dev/null
+++ b/core/modules/swiss/data/opt/openslx/keymaps/qwertz_fr_CH-latin1.map
@@ -0,0 +1,86 @@
+# This used to be sf-latin1.map
+# Renamed because too many Fins thought this was for them.
+keymaps 0-2,4-6,8,12
+include "qwertz-layout"
+include "linux-with-alt-and-altgr"
+strings as usual
+
+keycode 1 = Escape Escape
+ alt keycode 1 = Meta_Escape
+keycode 2 = one plus bar
+ alt keycode 2 = Meta_one
+keycode 3 = two quotedbl at
+ control keycode 3 = nul
+ alt keycode 3 = Meta_two
+keycode 4 = three asterisk numbersign
+ control keycode 4 = Escape
+ alt keycode 4 = Meta_three
+keycode 5 = four ccedilla degree
+ control keycode 5 = Control_backslash
+ alt keycode 5 = Meta_four
+keycode 6 = five percent section
+ control keycode 6 = Control_bracketright
+ alt keycode 6 = Meta_five
+keycode 7 = six ampersand notsign
+ control keycode 7 = Control_asciicircum
+ alt keycode 7 = Meta_six
+keycode 8 = seven slash bar
+ control keycode 8 = Control_underscore
+ alt keycode 8 = Meta_seven
+keycode 9 = eight parenleft cent
+ control keycode 9 = Delete
+ alt keycode 9 = Meta_eight
+keycode 10 = nine parenright
+ alt keycode 10 = Meta_nine
+keycode 11 = zero equal
+ alt keycode 11 = Meta_zero
+keycode 12 = apostrophe question dead_acute
+ control keycode 12 = Control_underscore
+ alt keycode 12 = Meta_minus
+keycode 13 = dead_circumflex dead_grave dead_tilde
+ alt keycode 13 = Meta_equal
+keycode 14 = Delete Delete
+ alt keycode 14 = Meta_Delete
+keycode 15 = Tab Meta_Tab
+ alt keycode 15 = Meta_Tab
+keycode 26 = egrave udiaeresis bracketleft
+ control keycode 26 = Escape
+ alt keycode 26 = Meta_bracketleft
+keycode 27 = dead_diaeresis exclam bracketright
+ control keycode 27 = Control_bracketright
+ alt keycode 27 = Meta_bracketright
+keycode 28 = Return
+ alt keycode 28 = Meta_Control_m
+keycode 29 = Control
+keycode 39 = eacute odiaeresis
+ alt keycode 39 = Meta_semicolon
+keycode 40 = agrave adiaeresis braceleft
+ control keycode 40 = Control_g
+ alt keycode 40 = Meta_apostrophe
+keycode 41 = section degree
+ control keycode 41 = nul
+ alt keycode 41 = Meta_grave
+keycode 42 = Shift
+keycode 43 = dollar sterling braceright
+ control keycode 43 = Control_backslash
+ alt keycode 43 = Meta_backslash
+keycode 51 = comma semicolon
+ alt keycode 51 = Meta_comma
+keycode 52 = period colon
+ alt keycode 52 = Meta_period
+keycode 53 = minus underscore
+ control keycode 53 = Delete
+ alt keycode 53 = Meta_slash
+ shift control keycode 53 = Control_underscore
+keycode 54 = Shift
+keycode 56 = Alt
+keycode 57 = space space
+ control keycode 57 = nul
+ alt keycode 57 = Meta_space
+keycode 58 = Caps_Lock
+keycode 86 = less greater backslash
+ alt keycode 86 = Meta_less
+keycode 97 = Control
+# adapted to X11 keymap
+altgr keycode 18 = currency
+#altgr keycode 46 = cent
diff --git a/core/modules/swiss/data/opt/openslx/scripts/systemd-load_swiss_keymaps b/core/modules/swiss/data/opt/openslx/scripts/systemd-load_swiss_keymaps
new file mode 100755
index 00000000..aadb7a8b
--- /dev/null
+++ b/core/modules/swiss/data/opt/openslx/scripts/systemd-load_swiss_keymaps
@@ -0,0 +1,13 @@
+#!/bin/ash
+# Script serves as container script for a systemd-call due to the buggyness of several
+# loadkeys-implementations <= kbd (Linux keyboard tools) 1.15.3.
+# This bug can be detected through failure of the command pipe 'dumpkeys|loadkeys' yielding
+# the message "unknown keysym 'compose'.
+
+loadkeys /opt/openslx/keymaps/qwertz_de_CH-latin1.map # insert a keymap without compose lines
+ERR=$?
+
+# if at this point the second keymap insertion failed we pass the errorlevel to
+# systemd - we cannot do more at this point.
+exit $ERR
+
diff --git a/core/modules/swiss/module.build b/core/modules/swiss/module.build
new file mode 100644
index 00000000..6f9aa4aa
--- /dev/null
+++ b/core/modules/swiss/module.build
@@ -0,0 +1,55 @@
+fetch_source() {
+ :
+}
+
+build() {
+ CH_LOCALES="de_CH.UTF-8 fr_CH.UTF-8 it_CH.UTF-8"
+
+ # Debian-like
+ if [ -e "/etc/locale.gen" ] && ! grep -q -E '^\s*de_CH\.UTF-8' "/etc/locale.gen"; then
+ pinfo "Generating locales..."
+ echo 'de_CH.UTF-8 UTF-8' >> "/etc/locale.gen"
+ echo 'fr_CH.UTF-8 UTF-8' >> "/etc/locale.gen"
+ echo 'it_CH.UTF-8 UTF-8' >> "/etc/locale.gen"
+ locale-gen || perror "Could not generate locales (debian style)"
+ fi
+
+ # Ubuntu's version
+ if [ -d "/var/lib/locales/supported.d" ] && [ ! -d /usr/lib/locale/de_CH.utf8 ]; then
+ pinfo "Generating locales..."
+ grep -q -E -r '^\s*de_CH\.UTF-8' "/var/lib/locales/supported.d" || echo 'de_CH.UTF-8 UTF-8' >> "/var/lib/locales/supported.d/openslx"
+ locale-gen --no-archive --purge "de_CH.UTF-8" || perror "Could not generate locales (ubuntu style)"
+ fi
+ if [ -d "/var/lib/locales/supported.d" ] && [ ! -d /usr/lib/locale/fr_CH.utf8 ]; then
+ pinfo "Generating locales..."
+ grep -q -E -r '^\s*fr_CH\.UTF-8' "/var/lib/locales/supported.d" || echo 'fr_CH.UTF-8 UTF-8' >> "/var/lib/locales/supported.d/openslx"
+ locale-gen --no-archive "fr_CH.UTF-8" || perror "Could not generate locales (ubuntu style)"
+ fi
+ if [ -d "/var/lib/locales/supported.d" ] && [ ! -d /usr/lib/locale/it_CH.utf8 ]; then
+ pinfo "Generating locales..."
+ grep -q -E -r '^\s*it_CH\.UTF-8' "/var/lib/locales/supported.d" || echo 'it_CH.UTF-8 UTF-8' >> "/var/lib/locales/supported.d/openslx"
+ locale-gen --no-archive "it_CH.UTF-8" || perror "Could not generate locales (ubuntu style)"
+ fi
+
+
+ # Put everything we build or get from the system in build dir
+ local FILELIST="$MODULE_WORK_DIR/list_copy_build"
+ rm -f "$FILELIST"
+
+ # Copy required directories from source system to build dir
+ for FILE in ${REQUIRED_DIRECTORIES}; do
+ [ ! -d "${FILE}" ] && perror "Missing required directory $FILE"
+ echo ${FILE} >> "${FILELIST}"
+ done
+
+ # Done collecting file and directory names, copy everything
+ tarcopy "$(sort -u "$FILELIST")" "$MODULE_BUILD_DIR"
+
+}
+
+post_copy() {
+ for i in LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION; do
+ add_env $i de_CH.UTF-8 || perror "$i: add_env function failed."
+ done
+}
+
diff --git a/core/modules/swiss/module.conf b/core/modules/swiss/module.conf
new file mode 100644
index 00000000..e2f82123
--- /dev/null
+++ b/core/modules/swiss/module.conf
@@ -0,0 +1,5 @@
+REQUIRED_BINARIES=""
+REQUIRED_FILES=""
+REQUIRED_DIRECTORIES="
+ /usr/share/X11
+"
diff --git a/core/modules/swiss/module.conf.debian b/core/modules/swiss/module.conf.debian
new file mode 100644
index 00000000..a43faea2
--- /dev/null
+++ b/core/modules/swiss/module.conf.debian
@@ -0,0 +1,10 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libX11-data
+"
+REQUIRED_CONTENT_PACKAGES="
+ libX11-data
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/locale
+"
+
diff --git a/core/modules/swiss/module.conf.opensuse b/core/modules/swiss/module.conf.opensuse
new file mode 100644
index 00000000..1311ac97
--- /dev/null
+++ b/core/modules/swiss/module.conf.opensuse
@@ -0,0 +1,14 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libX11-data
+ glibc-locale
+"
+REQUIRED_CONTENT_PACKAGES="
+ libX11-data
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/locale/de_DE.utf8
+ /usr/lib/locale/de_CH.utf8
+"
+REQUIRED_BINARIES=""
+REQUIRED_FILES=""
+
diff --git a/core/modules/swiss/module.conf.scientific b/core/modules/swiss/module.conf.scientific
new file mode 100644
index 00000000..88ac0d27
--- /dev/null
+++ b/core/modules/swiss/module.conf.scientific
@@ -0,0 +1,8 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libX11-data
+ glibc-common
+"
+REQUIRED_CONTENT_PACKAGES="
+ libX11-data"
+REQUIRED_BINARIES=""
+REQUIRED_FILES=""
diff --git a/core/modules/swiss/module.conf.ubuntu b/core/modules/swiss/module.conf.ubuntu
new file mode 100644
index 00000000..69694914
--- /dev/null
+++ b/core/modules/swiss/module.conf.ubuntu
@@ -0,0 +1,17 @@
+REQUIRED_INSTALLED_PACKAGES="
+ libx11-data
+ language-pack-de
+ language-pack-fr
+ language-pack-it
+ language-pack-en
+"
+REQUIRED_CONTENT_PACKAGES="
+ libx11-data
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib/locale/C.UTF-8
+ /usr/lib/locale/de_CH.utf8
+ /usr/lib/locale/fr_CH.utf8
+ /usr/lib/locale/it_CH.utf8
+"
+
diff --git a/core/modules/systemd-distro/README b/core/modules/systemd-distro/README
new file mode 100644
index 00000000..f84283d8
--- /dev/null
+++ b/core/modules/systemd-distro/README
@@ -0,0 +1,12 @@
+To activate debug level, add to units under [Service] this line
+Environment=SYSTEMD_LOG_LEVEL=debug
+
+Note on systemd-versions: Some systemds below 204 (verified in
+systemd-195) seem to need libpci-dev (or the openSuse equivalent).
+
+
+Another note on our compiled systemd-udevd:
+So far it has not been possible to reach a fully functional udev
+system in view of the perceived systemd-udevd limitation about
+evaluating the variable ENV{DEVTYPE}=="usb_device" in udev rule
+scripts.
diff --git a/core/modules/systemd-distro/TODO b/core/modules/systemd-distro/TODO
new file mode 100644
index 00000000..4b17eb88
--- /dev/null
+++ b/core/modules/systemd-distro/TODO
@@ -0,0 +1,2 @@
+libkmod: libkmod gets installed systemwide at present. This should not
+ be the case.
diff --git a/core/modules/systemd-distro/data/etc/systemd/system.conf b/core/modules/systemd-distro/data/etc/systemd/system.conf
new file mode 100644
index 00000000..1c5bbc91
--- /dev/null
+++ b/core/modules/systemd-distro/data/etc/systemd/system.conf
@@ -0,0 +1,49 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+#
+# See systemd-system.conf(5) for details
+
+[Manager]
+LogLevel=debug
+#LogTarget=journal-or-kmsg
+#LogColor=yes
+#LogLocation=no
+#DumpCore=yes
+CrashShell=yes
+#ShowStatus=yes
+CrashChVT=1
+#CPUAffinity=1 2
+#JoinControllers=cpu,cpuacct net_cls,net_prio
+#RuntimeWatchdogSec=0
+#ShutdownWatchdogSec=10min
+#CapabilityBoundingSet=
+#SystemCallArchitectures=
+#TimerSlackNSec=
+#DefaultStandardOutput=journal
+#DefaultStandardError=inherit
+#DefaultTimeoutStartSec=90s
+#DefaultTimeoutStopSec=90s
+#DefaultRestartSec=100ms
+#DefaultStartLimitInterval=10s
+#DefaultStartLimitBurst=5
+DefaultEnvironment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+#DefaultLimitCPU=
+#DefaultLimitFSIZE=
+#DefaultLimitDATA=
+#DefaultLimitSTACK=
+#DefaultLimitCORE=
+#DefaultLimitRSS=
+#DefaultLimitNOFILE=
+#DefaultLimitAS=
+#DefaultLimitNPROC=
+#DefaultLimitMEMLOCK=
+#DefaultLimitLOCKS=
+#DefaultLimitSIGPENDING=
+#DefaultLimitMSGQUEUE=
+#DefaultLimitNICE=
+#DefaultLimitRTPRIO=
+#DefaultLimitRTTIME=
diff --git a/core/modules/systemd-distro/data/etc/systemd/system/network-interface@.service b/core/modules/systemd-distro/data/etc/systemd/system/network-interface@.service
new file mode 100644
index 00000000..ea9cc56e
--- /dev/null
+++ b/core/modules/systemd-distro/data/etc/systemd/system/network-interface@.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Brings interface %i up
+Wants=dhcpc@%i.service
+Before=dhcpc@%i.service
+
+[Service]
+Type=simple
+ExecStart=/opt/openslx/sbin/ip link set dev %I up
+
diff --git a/core/modules/systemd-distro/data/etc/systemd/system/systemd-halt.service b/core/modules/systemd-distro/data/etc/systemd/system/systemd-halt.service
new file mode 100644
index 00000000..95b4f284
--- /dev/null
+++ b/core/modules/systemd-distro/data/etc/systemd/system/systemd-halt.service
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Halt
+Documentation=man:systemd-halt.service(8)
+DefaultDependencies=no
+Requires=shutdown.target final.target
+After=shutdown.target final.target
+
+[Service]
+Type=oneshot
+ExecStartPre=-/bin/bash -c /opt/openslx/scripts/systemd-shutdown_prescript
+ExecStart=/usr/bin/systemctl --force halt
diff --git a/core/modules/systemd-distro/data/etc/systemd/system/systemd-poweroff.service b/core/modules/systemd-distro/data/etc/systemd/system/systemd-poweroff.service
new file mode 100644
index 00000000..8b96980e
--- /dev/null
+++ b/core/modules/systemd-distro/data/etc/systemd/system/systemd-poweroff.service
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Power-Off
+Documentation=man:systemd-halt.service(8)
+DefaultDependencies=no
+Requires=shutdown.target final.target
+After=shutdown.target final.target
+
+[Service]
+Type=oneshot
+ExecStartPre=-/bin/bash -c /opt/openslx/scripts/systemd-shutdown_prescript
+ExecStart=/usr/bin/systemctl --force poweroff
diff --git a/core/modules/systemd-distro/data/etc/systemd/system/systemd-reboot.service b/core/modules/systemd-distro/data/etc/systemd/system/systemd-reboot.service
new file mode 100644
index 00000000..be4d608c
--- /dev/null
+++ b/core/modules/systemd-distro/data/etc/systemd/system/systemd-reboot.service
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Reboot
+Documentation=man:systemd-halt.service(8)
+DefaultDependencies=no
+Requires=shutdown.target final.target
+After=shutdown.target final.target
+
+[Service]
+Type=oneshot
+ExecStartPre=-/bin/bash -c /opt/openslx/scripts/systemd-shutdown_prescript
+ExecStart=/usr/bin/systemctl --force reboot
diff --git a/core/modules/systemd-distro/data/opt/openslx/scripts/systemd-shutdown_prescript b/core/modules/systemd-distro/data/opt/openslx/scripts/systemd-shutdown_prescript
new file mode 100755
index 00000000..3b5d7f92
--- /dev/null
+++ b/core/modules/systemd-distro/data/opt/openslx/scripts/systemd-shutdown_prescript
@@ -0,0 +1,50 @@
+#!/bin/ash
+
+# This script gets called by ExecStartPre from the services
+# systemd-halt, systemd-poweroff, systemd-reboot. Pre-shutdown actions as
+# unmounting nfs shares etc. should go here.
+
+PATH=/bin:/usr/bin:/opt/openslx/bin
+
+# kill leftover processes
+
+umount_nfs_shares() {
+ for i in "$(mount | grep 'type nfs')"; do
+ share=$(echo "$i"|cut -f 3 -d " ")
+ echo "Unmounte nfs-Share $share ...."
+ umount "$share"
+ ERROR=$?
+ if [ $ERROR -eq 0 ]; then
+ echo "nfs-Share $share unmounted."
+ else
+ echo "Could not umount nfs share $share!"
+ ERRORLEVEL=1
+ fi
+ done
+}
+
+umount_samba_shares() {
+ for i in "$(mount | grep 'type cifs')"; do
+ share=$(echo $i|cut -f 3 -d " ")
+ echo "Unmounte cifs-Share $share ...."
+ umount "$share"
+ ERROR=$?
+ if [ $ERROR -eq 0 ]; then
+ echo "cifs-Share $share unmounted."
+ else
+ echo "Could not umount cifs share $share!"
+ ERRORLEVEL=1
+ fi
+ done
+}
+
+# Searching for nfs-shares in mtab:
+if [ $(echo /etc/mtab | cut -d " " -f 3 | grep -q nfs) ]; then
+ umount_nfs_shares
+fi
+
+# Searching for samba-shares:
+if [ $(echo /etc/mtab|cut -d " " -f 3 | grep -q cifs) ]; then
+ umount_samba_shares
+fi
+exit $ERRORLEVEL
diff --git a/core/modules/systemd-distro/data/sbin/halt b/core/modules/systemd-distro/data/sbin/halt
new file mode 100755
index 00000000..994bdf14
--- /dev/null
+++ b/core/modules/systemd-distro/data/sbin/halt
Binary files differ
diff --git a/core/modules/systemd-distro/data/sbin/init b/core/modules/systemd-distro/data/sbin/init
new file mode 100755
index 00000000..a18235ca
--- /dev/null
+++ b/core/modules/systemd-distro/data/sbin/init
Binary files differ
diff --git a/core/modules/systemd-distro/data/sbin/poweroff b/core/modules/systemd-distro/data/sbin/poweroff
new file mode 100755
index 00000000..994bdf14
--- /dev/null
+++ b/core/modules/systemd-distro/data/sbin/poweroff
Binary files differ
diff --git a/core/modules/systemd-distro/data/sbin/reboot b/core/modules/systemd-distro/data/sbin/reboot
new file mode 100755
index 00000000..994bdf14
--- /dev/null
+++ b/core/modules/systemd-distro/data/sbin/reboot
Binary files differ
diff --git a/core/modules/systemd-distro/data/sbin/runlevel b/core/modules/systemd-distro/data/sbin/runlevel
new file mode 100755
index 00000000..994bdf14
--- /dev/null
+++ b/core/modules/systemd-distro/data/sbin/runlevel
Binary files differ
diff --git a/core/modules/systemd-distro/data/sbin/shutdown b/core/modules/systemd-distro/data/sbin/shutdown
new file mode 100755
index 00000000..994bdf14
--- /dev/null
+++ b/core/modules/systemd-distro/data/sbin/shutdown
Binary files differ
diff --git a/core/modules/systemd-distro/data/sbin/telinit b/core/modules/systemd-distro/data/sbin/telinit
new file mode 100755
index 00000000..994bdf14
--- /dev/null
+++ b/core/modules/systemd-distro/data/sbin/telinit
Binary files differ
diff --git a/core/modules/systemd-distro/data/usr/lib/sysctl.d/50-default.conf b/core/modules/systemd-distro/data/usr/lib/sysctl.d/50-default.conf
new file mode 100644
index 00000000..6ece04ce
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/sysctl.d/50-default.conf
@@ -0,0 +1,39 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+# See sysctl.d(5) and core(5) for for details.
+
+# System Request functionality of the kernel (SYNC)
+kernel.sysrq = 1
+
+# Append the PID to the core filename
+kernel.core_uses_pid = 1
+
+# Source route verification
+net.ipv4.conf.all.rp_filter = 1
+# Do not accept source routing
+net.ipv4.conf.all.accept_source_route = 0
+# protection from the SYN flood attack
+net.ipv4.tcp_syncookies = 1
+# timestamps add a little overhead but are recommended for gbit links
+net.ipv4.tcp_timestamps = 1
+# ignore echo broadcast requests to prevent being part of smurf attacks
+net.ipv4.icmp_echo_ignore_broadcasts = 1
+# ignore bogus icmp errors
+net.ipv4.icmp_ignore_bogus_error_responses = 1
+# send redirects (not a router, disable it)
+net.ipv4.conf.all.send_redirects = 0
+# ICMP routing redirects (only secure)
+net.ipv4.conf.all.accept_redirects = 0
+net.ipv4.conf.all.secure_redirects = 1
+
+# Enable hard and soft link protection
+fs.protected_hardlinks = 1
+fs.protected_symlinks = 1
+
+# A little extra security for local exploits
+kernel.kptr_restrict = 1
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/autovt@.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/autovt@.service
new file mode 100644
index 00000000..2d2940e1
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/autovt@.service
@@ -0,0 +1,49 @@
+# This file is part of systemd.
+# Patched for OpenSLX
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Getty on %I
+Documentation=man:agetty(8) man:systemd-getty-generator(8)
+Documentation=http://0pointer.de/blog/projects/serial-console.html
+After=systemd-user-sessions.service
+After=rc-local.service
+
+# If additional gettys are spawned during boot then we should make
+# sure that this is synchronized before getty.target, even though
+# getty.target didn't actually pull it in.
+Before=getty.target
+IgnoreOnIsolate=yes
+
+# On systems without virtual consoles, don't start any getty. (Note
+# that serial gettys are covered by serial-getty@.service, not this
+# unit
+ConditionPathExists=/dev/tty0
+
+[Service]
+ExecStartPre=-/opt/openslx/bin/killall fbsplash
+# the VT is cleared by TTYVTDisallocate
+ExecStart=-/sbin/agetty --noclear %I 38400 linux
+Type=idle
+Restart=always
+RestartSec=0
+UtmpIdentifier=%I
+TTYPath=/dev/%I
+TTYReset=yes
+TTYVHangup=yes
+TTYVTDisallocate=no
+KillMode=process
+IgnoreSIGPIPE=no
+
+# Unset locale for the console getty since the console has problems
+# displaying some internationalized messages.
+Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=
+
+# Some login implementations ignore SIGTERM, so we send SIGHUP
+# instead, to ensure that login terminates cleanly.
+KillSignal=SIGHUP
+
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/basic.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/basic.target
new file mode 100644
index 00000000..6b9cfe4c
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/basic.target
@@ -0,0 +1,14 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Basic System
+Documentation=man:systemd.special(7)
+Requires=sysinit.target
+Wants=sockets.target timers.target paths.target
+After=sysinit.target sockets.target timers.target paths.target
+RefuseManualStart=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/bluetooth.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/bluetooth.target
new file mode 100644
index 00000000..dd4ae14c
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/bluetooth.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Bluetooth
+Documentation=man:systemd.special(7)
+StopWhenUnneeded=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/console-getty.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/console-getty.service
new file mode 100644
index 00000000..74a220e2
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/console-getty.service
@@ -0,0 +1,32 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Console Getty
+Documentation=man:agetty(8)
+After=systemd-user-sessions.service plymouth-quit-wait.service
+After=rc-local.service
+Before=getty.target
+
+[Service]
+ExecStart=-/sbin/agetty --noclear -s console 115200,38400,9600
+Type=idle
+Restart=always
+RestartSec=0
+UtmpIdentifier=cons
+TTYPath=/dev/console
+TTYReset=yes
+TTYVHangup=yes
+KillMode=process
+IgnoreSIGPIPE=no
+
+# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
+# terminates cleanly.
+KillSignal=SIGHUP
+
+[Install]
+WantedBy=getty.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/console-shell.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/console-shell.service
new file mode 100644
index 00000000..c1548299
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/console-shell.service
@@ -0,0 +1,32 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Console Shell
+Documentation=man:sulogin(8)
+After=systemd-user-sessions.service plymouth-quit-wait.service
+After=rc-local.service
+Before=getty.target
+
+[Service]
+Environment=HOME=/root
+WorkingDirectory=/root
+ExecStart=-/sbin/sulogin
+ExecStopPost=-/usr/bin/systemctl poweroff
+Type=idle
+StandardInput=tty-force
+StandardOutput=inherit
+StandardError=inherit
+KillMode=process
+IgnoreSIGPIPE=no
+
+# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
+# terminates cleanly.
+KillSignal=SIGHUP
+
+[Install]
+WantedBy=getty.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/ctrl-alt-del.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/ctrl-alt-del.target
new file mode 100644
index 00000000..dec8f567
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/ctrl-alt-del.target
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Reboot
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+Requires=systemd-reboot.service
+After=systemd-reboot.service
+AllowIsolate=yes
+
+[Install]
+Alias=ctrl-alt-del.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/dbus-org.freedesktop.login1.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/dbus-org.freedesktop.login1.service
new file mode 100644
index 00000000..71971e44
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/dbus-org.freedesktop.login1.service
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Login Service
+Documentation=man:systemd-logind.service(8) man:logind.conf(5)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/multiseat
+After=
+
+[Service]
+ExecStart=/usr/lib/systemd/systemd-logind
+Restart=always
+RestartSec=0
+BusName=org.freedesktop.login1
+CapabilityBoundingSet=CAP_AUDIT_CONTROL CAP_CHOWN CAP_KILL CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE CAP_FOWNER CAP_SYS_TTY_CONFIG
+
+# Increase the default a bit in order to allow many simultaneous
+# logins since we keep one fd open per session.
+LimitNOFILE=16384
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/debug-shell.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/debug-shell.service
new file mode 100644
index 00000000..4220d7c2
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/debug-shell.service
@@ -0,0 +1,33 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Early root shell on /dev/tty9 FOR DEBUGGING ONLY
+Documentation=man:sushell(8)
+DefaultDependencies=no
+IgnoreOnIsolate=yes
+
+[Service]
+Environment=TERM=linux
+ExecStart=/bin/ash
+Restart=always
+RestartSec=0
+StandardInput=tty
+TTYPath=/dev/tty9
+TTYReset=yes
+TTYVHangup=yes
+KillMode=process
+IgnoreSIGPIPE=no
+# bash ignores SIGTERM
+KillSignal=SIGHUP
+
+# Unset locale for the console getty since the console has problems
+# displaying some internationalized messages.
+Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=
+
+[Install]
+WantedBy=sysinit.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/default.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/default.target
new file mode 100644
index 00000000..65f2521d
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/default.target
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Graphical Interface
+Documentation=man:systemd.special(7)
+Requires=multi-user.target
+After=multi-user.target
+Conflicts=rescue.target
+Wants=display-manager.service
+AllowIsolate=yes
+
+[Install]
+Alias=default.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/dev-hugepages.mount b/core/modules/systemd-distro/data/usr/lib/systemd/system/dev-hugepages.mount
new file mode 100644
index 00000000..d711faed
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/dev-hugepages.mount
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Huge Pages File System
+Documentation=https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+Before=sysinit.target
+ConditionPathExists=/sys/kernel/mm/hugepages
+
+[Mount]
+What=hugetlbfs
+Where=/dev/hugepages
+Type=hugetlbfs
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/dev-mqueue.mount b/core/modules/systemd-distro/data/usr/lib/systemd/system/dev-mqueue.mount
new file mode 100644
index 00000000..5c11ca7d
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/dev-mqueue.mount
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=POSIX Message Queue File System
+Documentation=man:mq_overview(7)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+Before=sysinit.target
+ConditionPathExists=/proc/sys/fs/mqueue
+
+[Mount]
+What=mqueue
+Where=/dev/mqueue
+Type=mqueue
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/emergency.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/emergency.service
new file mode 100644
index 00000000..72fcff2d
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/emergency.service
@@ -0,0 +1,31 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Emergency Shell
+Documentation=man:sulogin(8)
+DefaultDependencies=no
+Conflicts=shutdown.target
+Before=shutdown.target
+
+[Service]
+Environment=HOME=/root
+WorkingDirectory=/root
+ExecStartPre=-/bin/plymouth quit
+ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" to try again\\nto boot into default mode.'
+ExecStart=-/sbin/sulogin
+ExecStopPost=/usr/bin/systemctl --fail --no-block default
+Type=idle
+StandardInput=tty-force
+StandardOutput=inherit
+StandardError=inherit
+KillMode=process
+IgnoreSIGPIPE=no
+
+# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
+# terminates cleanly.
+KillSignal=SIGHUP
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/emergency.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/emergency.target
new file mode 100644
index 00000000..0760d66f
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/emergency.target
@@ -0,0 +1,13 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Emergency Mode
+Documentation=man:systemd.special(7)
+Requires=emergency.service
+After=emergency.service
+AllowIsolate=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/final.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/final.target
new file mode 100644
index 00000000..c7cf18e0
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/final.target
@@ -0,0 +1,13 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Final Step
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+RefuseManualStart=yes
+After=shutdown.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/getty.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/getty.target
new file mode 100644
index 00000000..c33d4465
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/getty.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Login Prompts
+Documentation=man:systemd.special(7) man:systemd-getty-generator(8)
+Documentation=http://0pointer.de/blog/projects/serial-console.html
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/getty@.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/getty@.service
new file mode 100644
index 00000000..2d2940e1
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/getty@.service
@@ -0,0 +1,49 @@
+# This file is part of systemd.
+# Patched for OpenSLX
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Getty on %I
+Documentation=man:agetty(8) man:systemd-getty-generator(8)
+Documentation=http://0pointer.de/blog/projects/serial-console.html
+After=systemd-user-sessions.service
+After=rc-local.service
+
+# If additional gettys are spawned during boot then we should make
+# sure that this is synchronized before getty.target, even though
+# getty.target didn't actually pull it in.
+Before=getty.target
+IgnoreOnIsolate=yes
+
+# On systems without virtual consoles, don't start any getty. (Note
+# that serial gettys are covered by serial-getty@.service, not this
+# unit
+ConditionPathExists=/dev/tty0
+
+[Service]
+ExecStartPre=-/opt/openslx/bin/killall fbsplash
+# the VT is cleared by TTYVTDisallocate
+ExecStart=-/sbin/agetty --noclear %I 38400 linux
+Type=idle
+Restart=always
+RestartSec=0
+UtmpIdentifier=%I
+TTYPath=/dev/%I
+TTYReset=yes
+TTYVHangup=yes
+TTYVTDisallocate=no
+KillMode=process
+IgnoreSIGPIPE=no
+
+# Unset locale for the console getty since the console has problems
+# displaying some internationalized messages.
+Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=
+
+# Some login implementations ignore SIGTERM, so we send SIGHUP
+# instead, to ensure that login terminates cleanly.
+KillSignal=SIGHUP
+
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/graphical.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/graphical.target
new file mode 100644
index 00000000..65f2521d
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/graphical.target
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Graphical Interface
+Documentation=man:systemd.special(7)
+Requires=multi-user.target
+After=multi-user.target
+Conflicts=rescue.target
+Wants=display-manager.service
+AllowIsolate=yes
+
+[Install]
+Alias=default.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/halt-local.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/halt-local.service
new file mode 100644
index 00000000..e6243eeb
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/halt-local.service
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=/usr/sbin/halt.local Compatibility
+ConditionFileIsExecutable=/usr/sbin/halt.local
+DefaultDependencies=no
+After=shutdown.target
+Before=final.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/sbin/halt.local
+TimeoutSec=0
+StandardOutput=tty
+RemainAfterExit=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/halt.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/halt.target
new file mode 100644
index 00000000..a21d984b
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/halt.target
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Halt
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+Requires=systemd-halt.service
+After=systemd-halt.service
+AllowIsolate=yes
+
+[Install]
+Alias=ctrl-alt-del.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/hibernate.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/hibernate.target
new file mode 100644
index 00000000..143eb592
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/hibernate.target
@@ -0,0 +1,13 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Hibernate
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+BindsTo=systemd-hibernate.service
+After=systemd-hibernate.service
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/hybrid-sleep.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/hybrid-sleep.target
new file mode 100644
index 00000000..d2d34092
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/hybrid-sleep.target
@@ -0,0 +1,13 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Hybrid Suspend+Hibernate
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+BindsTo=systemd-hybrid-sleep.service
+After=systemd-hybrid-sleep.service
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/kexec.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/kexec.target
new file mode 100644
index 00000000..90795d0c
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/kexec.target
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Reboot via kexec
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+Requires=systemd-kexec.service
+After=systemd-kexec.service
+AllowIsolate=yes
+
+[Install]
+Alias=ctrl-alt-del.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target
new file mode 100644
index 00000000..998e0460
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Multi-User System
+Documentation=man:systemd.special(7)
+Requires=basic.target
+Conflicts=rescue.service rescue.target
+After=basic.target rescue.service rescue.target
+AllowIsolate=yes
+
+[Install]
+Alias=default.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target.wants/getty.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target.wants/getty.target
new file mode 100644
index 00000000..c33d4465
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target.wants/getty.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Login Prompts
+Documentation=man:systemd.special(7) man:systemd-getty-generator(8)
+Documentation=http://0pointer.de/blog/projects/serial-console.html
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target.wants/systemd-logind.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target.wants/systemd-logind.service
new file mode 100644
index 00000000..71971e44
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target.wants/systemd-logind.service
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Login Service
+Documentation=man:systemd-logind.service(8) man:logind.conf(5)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/multiseat
+After=
+
+[Service]
+ExecStart=/usr/lib/systemd/systemd-logind
+Restart=always
+RestartSec=0
+BusName=org.freedesktop.login1
+CapabilityBoundingSet=CAP_AUDIT_CONTROL CAP_CHOWN CAP_KILL CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE CAP_FOWNER CAP_SYS_TTY_CONFIG
+
+# Increase the default a bit in order to allow many simultaneous
+# logins since we keep one fd open per session.
+LimitNOFILE=16384
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target.wants/systemd-user-sessions.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target.wants/systemd-user-sessions.service
new file mode 100644
index 00000000..9226e3ea
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/multi-user.target.wants/systemd-user-sessions.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Permit User Sessions
+Documentation=man:systemd-user-sessions.service(8)
+After=
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-user-sessions start
+ExecStop=/usr/lib/systemd/systemd-user-sessions stop
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/network-online.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/network-online.target
new file mode 100644
index 00000000..a40c44c9
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/network-online.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Network is Online
+Documentation=man:systemd.special(7)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/network.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/network.target
new file mode 100644
index 00000000..4186c088
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/network.target
@@ -0,0 +1,14 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Network
+Documentation=man:systemd.special(7)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
+DefaultDependencies=no
+ConditionPathExists=/run/network/network-ready
+
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/paths.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/paths.target
new file mode 100644
index 00000000..25c7fd03
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/paths.target
@@ -0,0 +1,10 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Paths
+Documentation=man:systemd.special(7)
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/poweroff.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/poweroff.target
new file mode 100644
index 00000000..71871033
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/poweroff.target
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Power-Off
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+Requires=systemd-poweroff.service
+After=systemd-poweroff.service
+AllowIsolate=yes
+
+[Install]
+Alias=ctrl-alt-del.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/printer.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/printer.target
new file mode 100644
index 00000000..a6b86caa
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/printer.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Printer
+Documentation=man:systemd.special(7)
+StopWhenUnneeded=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.automount b/core/modules/systemd-distro/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.automount
new file mode 100644
index 00000000..6be38937
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.automount
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Arbitrary Executable File Formats File System Automount Point
+Documentation=https://www.kernel.org/doc/Documentation/binfmt_misc.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+Before=sysinit.target
+ConditionPathExists=/proc/sys/fs/binfmt_misc/
+ConditionPathIsReadWrite=/proc/sys/
+
+[Automount]
+Where=/proc/sys/fs/binfmt_misc
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.mount b/core/modules/systemd-distro/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.mount
new file mode 100644
index 00000000..8c7c3863
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.mount
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Arbitrary Executable File Formats File System
+Documentation=https://www.kernel.org/doc/Documentation/binfmt_misc.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+
+[Mount]
+What=binfmt_misc
+Where=/proc/sys/fs/binfmt_misc
+Type=binfmt_misc
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/rc-local.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/rc-local.service
new file mode 100644
index 00000000..cb9c1ba2
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/rc-local.service
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+# This unit gets pulled automatically into multi-user.target by
+# systemd-rc-local-generator if /etc/rc.local is executable.
+[Unit]
+Description=/etc/rc.local Compatibility
+ConditionFileIsExecutable=/etc/rc.local
+After=network.target
+
+[Service]
+Type=forking
+ExecStart=/etc/rc.local start
+TimeoutSec=0
+RemainAfterExit=yes
+SysVStartPriority=99
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/reboot.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/reboot.target
new file mode 100644
index 00000000..dec8f567
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/reboot.target
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Reboot
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+Requires=systemd-reboot.service
+After=systemd-reboot.service
+AllowIsolate=yes
+
+[Install]
+Alias=ctrl-alt-del.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/remote-fs.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/remote-fs.target
new file mode 100644
index 00000000..0821987d
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/remote-fs.target
@@ -0,0 +1,3 @@
+[Unit]
+Description=Remote File Systems Impostor
+
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/serial-getty@.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/serial-getty@.service
new file mode 100644
index 00000000..5f289500
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/serial-getty@.service
@@ -0,0 +1,36 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Serial Getty on %I
+Documentation=man:agetty(8) man:systemd-getty-generator(8)
+Documentation=http://0pointer.de/blog/projects/serial-console.html
+BindsTo=dev-%i.device
+After=dev-%i.device systemd-user-sessions.service plymouth-quit-wait.service
+After=rc-local.service
+
+# If additional gettys are spawned during boot then we should make
+# sure that this is synchronized before getty.target, even though
+# getty.target didn't actually pull it in.
+Before=getty.target
+IgnoreOnIsolate=yes
+
+[Service]
+ExecStart=-/sbin/agetty -s %I 115200,38400,9600 vt102
+Type=idle
+Restart=always
+RestartSec=0
+UtmpIdentifier=%I
+TTYPath=/dev/%I
+TTYReset=yes
+TTYVHangup=yes
+KillMode=process
+IgnoreSIGPIPE=no
+
+# Some login implementations ignore SIGTERM, so we send SIGHUP
+# instead, to ensure that login terminates cleanly.
+KillSignal=SIGHUP
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/shutdown.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/shutdown.target
new file mode 100644
index 00000000..73e302b8
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/shutdown.target
@@ -0,0 +1,12 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Shutdown
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+RefuseManualStart=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sigpwr.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/sigpwr.target
new file mode 100644
index 00000000..a52e7cff
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sigpwr.target
@@ -0,0 +1,10 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Power Failure
+Documentation=man:systemd.special(7)
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sleep.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/sleep.target
new file mode 100644
index 00000000..10c7c8d5
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sleep.target
@@ -0,0 +1,13 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Sleep
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+RefuseManualStart=yes
+StopWhenUnneeded=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/smartcard.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/smartcard.target
new file mode 100644
index 00000000..5fefe847
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/smartcard.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Smart Card
+Documentation=man:systemd.special(7)
+StopWhenUnneeded=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target
new file mode 100644
index 00000000..26ab065d
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target
@@ -0,0 +1,10 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Sockets
+Documentation=man:systemd.special(7)
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-journald.socket b/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-journald.socket
new file mode 100644
index 00000000..4f0619d2
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-journald.socket
@@ -0,0 +1,26 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Journal Socket
+Documentation=man:systemd-journald.service(8) man:journald.conf(5)
+DefaultDependencies=no
+Before=sockets.target
+
+# Mount and swap units need this. If this socket unit is removed by an
+# isolate request the mount and and swap units would be removed too,
+# hence let's exclude this from isolate requests.
+IgnoreOnIsolate=yes
+
+[Socket]
+ListenStream=/run/systemd/journal/stdout
+ListenDatagram=/run/systemd/journal/socket
+ListenDatagram=/dev/log
+SocketMode=0666
+PassCredentials=yes
+PassSecurity=yes
+ReceiveBuffer=8M
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-shutdownd.socket b/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-shutdownd.socket
new file mode 100644
index 00000000..9421ce8a
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-shutdownd.socket
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Delayed Shutdown Socket
+Documentation=man:systemd-shutdownd.service(8)
+DefaultDependencies=no
+Before=sockets.target
+
+[Socket]
+ListenDatagram=/run/systemd/shutdownd
+SocketMode=0600
+PassCredentials=yes
+PassSecurity=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-control.socket b/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-control.socket
new file mode 100644
index 00000000..ca17102d
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-control.socket
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=udev Control Socket
+Documentation=man:systemd-udevd.service(8) man:udev(7)
+DefaultDependencies=no
+Before=sockets.target
+ConditionCapability=CAP_MKNOD
+
+[Socket]
+Service=systemd-udevd.service
+ListenSequentialPacket=/run/udev/control
+SocketMode=0600
+PassCredentials=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-kernel.socket b/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-kernel.socket
new file mode 100644
index 00000000..4b8a5b0f
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-kernel.socket
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=udev Kernel Socket
+Documentation=man:systemd-udevd.service(8) man:udev(7)
+DefaultDependencies=no
+Before=sockets.target
+ConditionCapability=CAP_MKNOD
+
+[Socket]
+Service=systemd-udevd.service
+ReceiveBuffer=134217728
+ListenNetlink=kobject-uevent 1
+PassCredentials=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sound.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/sound.target
new file mode 100644
index 00000000..6699adec
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sound.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Sound Card
+Documentation=man:systemd.special(7)
+StopWhenUnneeded=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/suspend.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/suspend.target
new file mode 100644
index 00000000..f50cb226
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/suspend.target
@@ -0,0 +1,13 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Suspend
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+BindsTo=systemd-suspend.service
+After=systemd-suspend.service
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/swap.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/swap.target
new file mode 100644
index 00000000..23a7d0dc
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/swap.target
@@ -0,0 +1,10 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Swap
+Documentation=man:systemd.special(7)
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sys-fs-fuse-connections.mount b/core/modules/systemd-distro/data/usr/lib/systemd/system/sys-fs-fuse-connections.mount
new file mode 100644
index 00000000..ebd93e2c
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sys-fs-fuse-connections.mount
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=FUSE Control File System
+Documentation=https://www.kernel.org/doc/Documentation/filesystems/fuse.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+ConditionPathExists=/sys/fs/fuse/connections
+After=systemd-modules-load.service
+Before=sysinit.target
+
+[Mount]
+What=fusectl
+Where=/sys/fs/fuse/connections
+Type=fusectl
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sys-kernel-config.mount b/core/modules/systemd-distro/data/usr/lib/systemd/system/sys-kernel-config.mount
new file mode 100644
index 00000000..020101c0
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sys-kernel-config.mount
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Configuration File System
+Documentation=https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+ConditionPathExists=/sys/kernel/config
+After=systemd-modules-load.service
+Before=sysinit.target
+
+[Mount]
+What=configfs
+Where=/sys/kernel/config
+Type=configfs
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target
new file mode 100644
index 00000000..ec6fbefc
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target
@@ -0,0 +1,14 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=System Initialization
+Documentation=man:systemd.special(7)
+Conflicts=emergency.service emergency.target
+Wants= swap.target
+After= swap.target emergency.service emergency.target
+RefuseManualStart=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/dev-hugepages.mount b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/dev-hugepages.mount
new file mode 100644
index 00000000..d711faed
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/dev-hugepages.mount
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Huge Pages File System
+Documentation=https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+Before=sysinit.target
+ConditionPathExists=/sys/kernel/mm/hugepages
+
+[Mount]
+What=hugetlbfs
+Where=/dev/hugepages
+Type=hugetlbfs
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/dev-mqueue.mount b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/dev-mqueue.mount
new file mode 100644
index 00000000..5c11ca7d
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/dev-mqueue.mount
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=POSIX Message Queue File System
+Documentation=man:mq_overview(7)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+Before=sysinit.target
+ConditionPathExists=/proc/sys/fs/mqueue
+
+[Mount]
+What=mqueue
+Where=/dev/mqueue
+Type=mqueue
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/proc-sys-fs-binfmt_misc.automount b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/proc-sys-fs-binfmt_misc.automount
new file mode 100644
index 00000000..6be38937
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/proc-sys-fs-binfmt_misc.automount
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Arbitrary Executable File Formats File System Automount Point
+Documentation=https://www.kernel.org/doc/Documentation/binfmt_misc.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+Before=sysinit.target
+ConditionPathExists=/proc/sys/fs/binfmt_misc/
+ConditionPathIsReadWrite=/proc/sys/
+
+[Automount]
+Where=/proc/sys/fs/binfmt_misc
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/sys-fs-fuse-connections.mount b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/sys-fs-fuse-connections.mount
new file mode 100644
index 00000000..ebd93e2c
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/sys-fs-fuse-connections.mount
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=FUSE Control File System
+Documentation=https://www.kernel.org/doc/Documentation/filesystems/fuse.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+ConditionPathExists=/sys/fs/fuse/connections
+After=systemd-modules-load.service
+Before=sysinit.target
+
+[Mount]
+What=fusectl
+Where=/sys/fs/fuse/connections
+Type=fusectl
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/sys-kernel-config.mount b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/sys-kernel-config.mount
new file mode 100644
index 00000000..020101c0
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/sys-kernel-config.mount
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Configuration File System
+Documentation=https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+ConditionPathExists=/sys/kernel/config
+After=systemd-modules-load.service
+Before=sysinit.target
+
+[Mount]
+What=configfs
+Where=/sys/kernel/config
+Type=configfs
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-binfmt.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-binfmt.service
new file mode 100644
index 00000000..897cf4e5
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-binfmt.service
@@ -0,0 +1,26 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Set Up Additional Binary Formats
+Documentation=man:systemd-binfmt.service(8) man:binfmt.d(5)
+Documentation=https://www.kernel.org/doc/Documentation/binfmt_misc.txt
+DefaultDependencies=no
+Conflicts=shutdown.target
+After= proc-sys-fs-binfmt_misc.automount
+Before=sysinit.target shutdown.target
+ConditionPathIsReadWrite=/proc/sys/
+ConditionDirectoryNotEmpty=|/lib/binfmt.d
+ConditionDirectoryNotEmpty=|/usr/lib/binfmt.d
+ConditionDirectoryNotEmpty=|/usr/local/lib/binfmt.d
+ConditionDirectoryNotEmpty=|/etc/binfmt.d
+ConditionDirectoryNotEmpty=|/run/binfmt.d
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-binfmt
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-journald.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-journald.service
new file mode 100644
index 00000000..77b4bfe9
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-journald.service
@@ -0,0 +1,26 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Journal Service
+Documentation=man:systemd-journald.service(8) man:journald.conf(5)
+DefaultDependencies=no
+Requires=systemd-journald.socket
+After=systemd-journald.socket syslog.socket
+Before=sysinit.target
+
+[Service]
+ExecStart=/usr/lib/systemd/systemd-journald
+Restart=always
+RestartSec=0
+NotifyAccess=all
+StandardOutput=null
+CapabilityBoundingSet=CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_SYS_PTRACE CAP_SYSLOG CAP_AUDIT_CONTROL CAP_CHOWN CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID
+
+# Increase the default a bit in order to allow many simultaneous
+# services being run since we keep one fd open per service.
+LimitNOFILE=16384
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-modules-load.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-modules-load.service
new file mode 100644
index 00000000..3ff810f7
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-modules-load.service
@@ -0,0 +1,27 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Load Kernel Modules
+Documentation=man:systemd-modules-load.service(8) man:modules-load.d(5)
+DefaultDependencies=no
+Conflicts=shutdown.target
+After=
+Before=sysinit.target shutdown.target
+ConditionCapability=CAP_SYS_MODULE
+ConditionDirectoryNotEmpty=|/lib/modules-load.d
+ConditionDirectoryNotEmpty=|/usr/lib/modules-load.d
+ConditionDirectoryNotEmpty=|/usr/local/lib/modules-load.d
+ConditionDirectoryNotEmpty=|/etc/modules-load.d
+ConditionDirectoryNotEmpty=|/run/modules-load.d
+ConditionKernelCommandLine=|modules-load
+ConditionKernelCommandLine=|rd.modules-load
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-modules-load
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-sysctl.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-sysctl.service
new file mode 100644
index 00000000..46e2475e
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-sysctl.service
@@ -0,0 +1,26 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Apply Kernel Variables
+Documentation=man:systemd-sysctl.service(8) man:sysctl.d(5)
+DefaultDependencies=no
+Conflicts=shutdown.target
+After=
+Before=sysinit.target shutdown.target
+ConditionPathIsReadWrite=/proc/sys/
+ConditionPathExists=|/etc/sysctl.conf
+ConditionDirectoryNotEmpty=|/lib/sysctl.d
+ConditionDirectoryNotEmpty=|/usr/lib/sysctl.d
+ConditionDirectoryNotEmpty=|/usr/local/lib/sysctl.d
+ConditionDirectoryNotEmpty=|/etc/sysctl.d
+ConditionDirectoryNotEmpty=|/run/sysctl.d
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-sysctl
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup-dev.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup-dev.service
new file mode 100644
index 00000000..da1ee1f8
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup-dev.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Create static device nodes in /dev
+Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
+DefaultDependencies=no
+Before=sysinit.target systemd-udevd.service
+ConditionCapability=CAP_MKNOD
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/systemd-tmpfiles --prefix=/dev --create
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup.service
new file mode 100644
index 00000000..9e1a5650
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup.service
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Recreate Volatile Files and Directories
+Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
+DefaultDependencies=no
+Wants=
+After=
+Before=sysinit.target shutdown.target
+ConditionDirectoryNotEmpty=|/usr/lib/tmpfiles.d
+ConditionDirectoryNotEmpty=|/usr/local/lib/tmpfiles.d
+ConditionDirectoryNotEmpty=|/etc/tmpfiles.d
+ConditionDirectoryNotEmpty=|/run/tmpfiles.d
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udev-trigger.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udev-trigger.service
new file mode 100644
index 00000000..6b19c75d
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udev-trigger.service
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=udev Coldplug all Devices
+Documentation=man:udev(7) man:systemd-udevd.service(8)
+DefaultDependencies=no
+Wants=systemd-udevd.service systemd-udev-settle.service
+After=systemd-udevd-kernel.socket systemd-udevd-control.socket
+Before=sysinit.target systemd-udev-settle.service
+ConditionCapability=CAP_MKNOD
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/udevadm trigger --type=subsystems --action=add ; /usr/bin/udevadm trigger --type=devices --action=add
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udevd.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udevd.service
new file mode 100644
index 00000000..2c33ce53
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udevd.service
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=udev Kernel Device Manager
+Documentation=man:systemd-udevd.service(8) man:udev(7)
+DefaultDependencies=no
+Wants=systemd-udevd-control.socket systemd-udevd-kernel.socket
+After=systemd-udevd-control.socket systemd-udevd-kernel.socket
+Before=sysinit.target
+ConditionCapability=CAP_MKNOD
+
+[Service]
+Type=notify
+OOMScoreAdjust=-1000
+Sockets=systemd-udevd-control.socket systemd-udevd-kernel.socket
+Restart=always
+RestartSec=0
+ExecStart=/usr/lib/systemd/systemd-udevd
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-vconsole-setup.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-vconsole-setup.service
new file mode 100644
index 00000000..ce60c1bb
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/sysinit.target.wants/systemd-vconsole-setup.service
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Setup Virtual Console
+Documentation=man:systemd-vconsole-setup.service(8) man:vconsole.conf(5)
+DefaultDependencies=no
+Conflicts=shutdown.target
+After=
+Before=sysinit.target shutdown.target
+ConditionPathExists=/dev/tty0
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-vconsole-setup
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/syslog.socket b/core/modules/systemd-distro/data/usr/lib/systemd/system/syslog.socket
new file mode 100644
index 00000000..e6e9cf85
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/syslog.socket
@@ -0,0 +1,40 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Syslog Socket
+Documentation=man:systemd.special(7)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/syslog
+DefaultDependencies=no
+Before=sockets.target shutdown.target
+
+# Don't allow logging until the very end
+Conflicts=shutdown.target
+
+[Socket]
+ListenDatagram=/run/systemd/journal/syslog
+SocketMode=0666
+PassCredentials=yes
+PassSecurity=yes
+ReceiveBuffer=8M
+
+# The default syslog implementation should make syslog.service a
+# symlink to itself, so that this socket activates the right actual
+# syslog service.
+#
+# Examples:
+#
+# /etc/systemd/system/syslog.service -> /lib/systemd/system/rsyslog.service
+# /etc/systemd/system/syslog.service -> /lib/systemd/system/syslog-ng.service
+#
+# Best way to achieve that is by adding this to your unit file
+# (i.e. to rsyslog.service or syslog-ng.service):
+#
+# [Install]
+# Alias=syslog.service
+#
+# See http://www.freedesktop.org/wiki/Software/systemd/syslog for details.
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/system-update.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/system-update.target
new file mode 100644
index 00000000..b6008c8f
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/system-update.target
@@ -0,0 +1,16 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=System Update
+Documentation=http://freedesktop.org/wiki/Software/systemd/SystemUpdates
+Documentation=man:systemd.special(7) man:systemd-system-update-generator(8)
+Requires=sysinit.target
+Conflicts=shutdown.target
+After=sysinit.target
+Before=shutdown.target
+AllowIsolate=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-binfmt.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-binfmt.service
new file mode 100644
index 00000000..897cf4e5
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-binfmt.service
@@ -0,0 +1,26 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Set Up Additional Binary Formats
+Documentation=man:systemd-binfmt.service(8) man:binfmt.d(5)
+Documentation=https://www.kernel.org/doc/Documentation/binfmt_misc.txt
+DefaultDependencies=no
+Conflicts=shutdown.target
+After= proc-sys-fs-binfmt_misc.automount
+Before=sysinit.target shutdown.target
+ConditionPathIsReadWrite=/proc/sys/
+ConditionDirectoryNotEmpty=|/lib/binfmt.d
+ConditionDirectoryNotEmpty=|/usr/lib/binfmt.d
+ConditionDirectoryNotEmpty=|/usr/local/lib/binfmt.d
+ConditionDirectoryNotEmpty=|/etc/binfmt.d
+ConditionDirectoryNotEmpty=|/run/binfmt.d
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-binfmt
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-halt.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-halt.service
new file mode 100644
index 00000000..a13d67c6
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-halt.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Halt
+Documentation=man:systemd-halt.service(8)
+DefaultDependencies=no
+Requires=shutdown.target final.target
+After=shutdown.target final.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/systemctl --force halt
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-hibernate.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-hibernate.service
new file mode 100644
index 00000000..7f19e48f
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-hibernate.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Hibernate
+Documentation=man:systemd-suspend.service(8)
+DefaultDependencies=no
+Requires=sleep.target
+After=sleep.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/lib/systemd/systemd-sleep hibernate
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-hybrid-sleep.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-hybrid-sleep.service
new file mode 100644
index 00000000..7d627bfa
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-hybrid-sleep.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Hybrid Suspend+Hibernate
+Documentation=man:systemd-suspend.service(8)
+DefaultDependencies=no
+Requires=sleep.target
+After=sleep.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/lib/systemd/systemd-sleep hybrid-sleep
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-journald.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-journald.service
new file mode 100644
index 00000000..77b4bfe9
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-journald.service
@@ -0,0 +1,26 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Journal Service
+Documentation=man:systemd-journald.service(8) man:journald.conf(5)
+DefaultDependencies=no
+Requires=systemd-journald.socket
+After=systemd-journald.socket syslog.socket
+Before=sysinit.target
+
+[Service]
+ExecStart=/usr/lib/systemd/systemd-journald
+Restart=always
+RestartSec=0
+NotifyAccess=all
+StandardOutput=null
+CapabilityBoundingSet=CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_SYS_PTRACE CAP_SYSLOG CAP_AUDIT_CONTROL CAP_CHOWN CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID
+
+# Increase the default a bit in order to allow many simultaneous
+# services being run since we keep one fd open per service.
+LimitNOFILE=16384
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-journald.socket b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-journald.socket
new file mode 100644
index 00000000..4f0619d2
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-journald.socket
@@ -0,0 +1,26 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Journal Socket
+Documentation=man:systemd-journald.service(8) man:journald.conf(5)
+DefaultDependencies=no
+Before=sockets.target
+
+# Mount and swap units need this. If this socket unit is removed by an
+# isolate request the mount and and swap units would be removed too,
+# hence let's exclude this from isolate requests.
+IgnoreOnIsolate=yes
+
+[Socket]
+ListenStream=/run/systemd/journal/stdout
+ListenDatagram=/run/systemd/journal/socket
+ListenDatagram=/dev/log
+SocketMode=0666
+PassCredentials=yes
+PassSecurity=yes
+ReceiveBuffer=8M
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-logind.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-logind.service
new file mode 100644
index 00000000..71971e44
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-logind.service
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Login Service
+Documentation=man:systemd-logind.service(8) man:logind.conf(5)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/multiseat
+After=
+
+[Service]
+ExecStart=/usr/lib/systemd/systemd-logind
+Restart=always
+RestartSec=0
+BusName=org.freedesktop.login1
+CapabilityBoundingSet=CAP_AUDIT_CONTROL CAP_CHOWN CAP_KILL CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE CAP_FOWNER CAP_SYS_TTY_CONFIG
+
+# Increase the default a bit in order to allow many simultaneous
+# logins since we keep one fd open per session.
+LimitNOFILE=16384
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-modules-load.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-modules-load.service
new file mode 100644
index 00000000..3ff810f7
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-modules-load.service
@@ -0,0 +1,27 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Load Kernel Modules
+Documentation=man:systemd-modules-load.service(8) man:modules-load.d(5)
+DefaultDependencies=no
+Conflicts=shutdown.target
+After=
+Before=sysinit.target shutdown.target
+ConditionCapability=CAP_SYS_MODULE
+ConditionDirectoryNotEmpty=|/lib/modules-load.d
+ConditionDirectoryNotEmpty=|/usr/lib/modules-load.d
+ConditionDirectoryNotEmpty=|/usr/local/lib/modules-load.d
+ConditionDirectoryNotEmpty=|/etc/modules-load.d
+ConditionDirectoryNotEmpty=|/run/modules-load.d
+ConditionKernelCommandLine=|modules-load
+ConditionKernelCommandLine=|rd.modules-load
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-modules-load
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-nspawn@.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-nspawn@.service
new file mode 100644
index 00000000..f9f9aa65
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-nspawn@.service
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Container %i
+Documentation=man:systemd-nspawn(1)
+
+[Service]
+ExecStart=/usr/bin/systemd-nspawn -bjD /var/lib/container/%i
+ControlGroup=%R/machine/%i.nspawn cpu:/
+Type=notify
+
+[Install]
+Also=multi-user.target
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-poweroff.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-poweroff.service
new file mode 100644
index 00000000..eede0eab
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-poweroff.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Power-Off
+Documentation=man:systemd-halt.service(8)
+DefaultDependencies=no
+Requires=shutdown.target final.target
+After=shutdown.target final.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/systemctl --force poweroff
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-reboot.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-reboot.service
new file mode 100644
index 00000000..b2d27c8e
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-reboot.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Reboot
+Documentation=man:systemd-halt.service(8)
+DefaultDependencies=no
+Requires=shutdown.target final.target
+After=shutdown.target final.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/systemctl --force reboot
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-shutdownd.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-shutdownd.service
new file mode 100644
index 00000000..38c663de
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-shutdownd.service
@@ -0,0 +1,15 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Delayed Shutdown Service
+Documentation=man:systemd-shutdownd.service(8)
+DefaultDependencies=no
+
+[Service]
+ExecStart=/usr/lib/systemd/systemd-shutdownd
+NotifyAccess=all
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-shutdownd.socket b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-shutdownd.socket
new file mode 100644
index 00000000..9421ce8a
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-shutdownd.socket
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Delayed Shutdown Socket
+Documentation=man:systemd-shutdownd.service(8)
+DefaultDependencies=no
+Before=sockets.target
+
+[Socket]
+ListenDatagram=/run/systemd/shutdownd
+SocketMode=0600
+PassCredentials=yes
+PassSecurity=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-suspend.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-suspend.service
new file mode 100644
index 00000000..5d242edd
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-suspend.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Suspend
+Documentation=man:systemd-suspend.service(8)
+DefaultDependencies=no
+Requires=sleep.target
+After=sleep.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/lib/systemd/systemd-sleep suspend
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-sysctl.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-sysctl.service
new file mode 100644
index 00000000..46e2475e
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-sysctl.service
@@ -0,0 +1,26 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Apply Kernel Variables
+Documentation=man:systemd-sysctl.service(8) man:sysctl.d(5)
+DefaultDependencies=no
+Conflicts=shutdown.target
+After=
+Before=sysinit.target shutdown.target
+ConditionPathIsReadWrite=/proc/sys/
+ConditionPathExists=|/etc/sysctl.conf
+ConditionDirectoryNotEmpty=|/lib/sysctl.d
+ConditionDirectoryNotEmpty=|/usr/lib/sysctl.d
+ConditionDirectoryNotEmpty=|/usr/local/lib/sysctl.d
+ConditionDirectoryNotEmpty=|/etc/sysctl.d
+ConditionDirectoryNotEmpty=|/run/sysctl.d
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-sysctl
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-tmpfiles-setup-dev.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-tmpfiles-setup-dev.service
new file mode 100644
index 00000000..da1ee1f8
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-tmpfiles-setup-dev.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Create static device nodes in /dev
+Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
+DefaultDependencies=no
+Before=sysinit.target systemd-udevd.service
+ConditionCapability=CAP_MKNOD
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/systemd-tmpfiles --prefix=/dev --create
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-tmpfiles-setup.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-tmpfiles-setup.service
new file mode 100644
index 00000000..9e1a5650
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-tmpfiles-setup.service
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Recreate Volatile Files and Directories
+Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
+DefaultDependencies=no
+Wants=
+After=
+Before=sysinit.target shutdown.target
+ConditionDirectoryNotEmpty=|/usr/lib/tmpfiles.d
+ConditionDirectoryNotEmpty=|/usr/local/lib/tmpfiles.d
+ConditionDirectoryNotEmpty=|/etc/tmpfiles.d
+ConditionDirectoryNotEmpty=|/run/tmpfiles.d
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udev-settle.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udev-settle.service
new file mode 100644
index 00000000..146c6499
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udev-settle.service
@@ -0,0 +1,31 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+# This service can dynamically be pulled-in by legacy services which
+# cannot reliably cope with dynamic device configurations, and wrongfully
+# expect a populated /dev during bootup.
+
+[Unit]
+Description=udev Wait for Complete Device Initialization
+Documentation=man:udev(7) man:systemd-udevd.service(8)
+DefaultDependencies=no
+Wants=systemd-udevd.service
+After=systemd-udev-trigger.service
+Before=sysinit.target
+ConditionCapability=CAP_MKNOD
+
+[Service]
+Type=oneshot
+TimeoutSec=180
+RemainAfterExit=yes
+# Don't ask...
+ExecStart=/opt/openslx/bin/usleep 100000
+ExecStart=/usr/bin/udevadm settle --timeout=3
+ExecStart=/opt/openslx/bin/usleep 20000
+ExecStart=/usr/bin/udevadm settle --timeout=3
+ExecStart=/opt/openslx/bin/usleep 20000
+ExecStart=/usr/bin/udevadm settle --timeout=3
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udev-trigger.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udev-trigger.service
new file mode 100644
index 00000000..6b19c75d
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udev-trigger.service
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=udev Coldplug all Devices
+Documentation=man:udev(7) man:systemd-udevd.service(8)
+DefaultDependencies=no
+Wants=systemd-udevd.service systemd-udev-settle.service
+After=systemd-udevd-kernel.socket systemd-udevd-control.socket
+Before=sysinit.target systemd-udev-settle.service
+ConditionCapability=CAP_MKNOD
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/udevadm trigger --type=subsystems --action=add ; /usr/bin/udevadm trigger --type=devices --action=add
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udevd-control.socket b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udevd-control.socket
new file mode 100644
index 00000000..ca17102d
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udevd-control.socket
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=udev Control Socket
+Documentation=man:systemd-udevd.service(8) man:udev(7)
+DefaultDependencies=no
+Before=sockets.target
+ConditionCapability=CAP_MKNOD
+
+[Socket]
+Service=systemd-udevd.service
+ListenSequentialPacket=/run/udev/control
+SocketMode=0600
+PassCredentials=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udevd-kernel.socket b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udevd-kernel.socket
new file mode 100644
index 00000000..4b8a5b0f
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udevd-kernel.socket
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=udev Kernel Socket
+Documentation=man:systemd-udevd.service(8) man:udev(7)
+DefaultDependencies=no
+Before=sockets.target
+ConditionCapability=CAP_MKNOD
+
+[Socket]
+Service=systemd-udevd.service
+ReceiveBuffer=134217728
+ListenNetlink=kobject-uevent 1
+PassCredentials=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udevd.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udevd.service
new file mode 100644
index 00000000..2c33ce53
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-udevd.service
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=udev Kernel Device Manager
+Documentation=man:systemd-udevd.service(8) man:udev(7)
+DefaultDependencies=no
+Wants=systemd-udevd-control.socket systemd-udevd-kernel.socket
+After=systemd-udevd-control.socket systemd-udevd-kernel.socket
+Before=sysinit.target
+ConditionCapability=CAP_MKNOD
+
+[Service]
+Type=notify
+OOMScoreAdjust=-1000
+Sockets=systemd-udevd-control.socket systemd-udevd-kernel.socket
+Restart=always
+RestartSec=0
+ExecStart=/usr/lib/systemd/systemd-udevd
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-user-sessions.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-user-sessions.service
new file mode 100644
index 00000000..9226e3ea
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-user-sessions.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Permit User Sessions
+Documentation=man:systemd-user-sessions.service(8)
+After=
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-user-sessions start
+ExecStop=/usr/lib/systemd/systemd-user-sessions stop
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-vconsole-setup.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-vconsole-setup.service
new file mode 100644
index 00000000..ce60c1bb
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/systemd-vconsole-setup.service
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Setup Virtual Console
+Documentation=man:systemd-vconsole-setup.service(8) man:vconsole.conf(5)
+DefaultDependencies=no
+Conflicts=shutdown.target
+After=
+Before=sysinit.target shutdown.target
+ConditionPathExists=/dev/tty0
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-vconsole-setup
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/time-sync.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/time-sync.target
new file mode 100644
index 00000000..54078069
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/time-sync.target
@@ -0,0 +1,14 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+# This exists mostly for compatibility with SysV/LSB units, and
+# implementations lacking socket/bus activation.
+
+[Unit]
+Description=System Time Synchronized
+Documentation=man:systemd.special(7)
+RefuseManualStart=yes
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/timers.target b/core/modules/systemd-distro/data/usr/lib/systemd/system/timers.target
new file mode 100644
index 00000000..07fda3d9
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/timers.target
@@ -0,0 +1,10 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Timers
+Documentation=man:systemd.special(7)
diff --git a/core/modules/systemd-distro/data/usr/lib/systemd/system/user@.service b/core/modules/systemd-distro/data/usr/lib/systemd/system/user@.service
new file mode 100644
index 00000000..876c28c9
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/systemd/system/user@.service
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=User Manager for %u
+After=systemd-user-sessions.service
+
+[Service]
+User=%I
+PAMName=systemd-shared
+# in order to allow MEM_CG features to work, add "memory:/" here
+ControlGroup=%R/user/%U.user/shared cpu:/
+ControlGroupModify=yes
+Type=notify
+ExecStart=-/usr/lib/systemd/systemd --user
+Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%U/dbus/user_bus_socket
+
+[Install]
+Alias=user@%i.service
diff --git a/core/modules/systemd-distro/data/usr/lib/udev/rules.d/70-uaccess-floppy.rules b/core/modules/systemd-distro/data/usr/lib/udev/rules.d/70-uaccess-floppy.rules
new file mode 100644
index 00000000..113d288a
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/udev/rules.d/70-uaccess-floppy.rules
@@ -0,0 +1,8 @@
+ACTION=="remove", GOTO="floppy_extra_end"
+ENV{MAJOR}=="", GOTO="floppy_extra_end"
+
+# floppy devices
+SUBSYSTEM=="block", KERNEL=="fd[0-9]*", TAG+="uaccess"
+
+LABEL="floppy_extra_end"
+
diff --git a/core/modules/systemd-distro/data/usr/lib/udev/rules.d/99-systemd.rules b/core/modules/systemd-distro/data/usr/lib/udev/rules.d/99-systemd.rules
new file mode 100644
index 00000000..99cdf676
--- /dev/null
+++ b/core/modules/systemd-distro/data/usr/lib/udev/rules.d/99-systemd.rules
@@ -0,0 +1,56 @@
+# This file is part of systemd.
+#
+# systemd 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 Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+ACTION=="remove", GOTO="systemd_end"
+
+SUBSYSTEM=="tty", KERNEL=="tty[0-9]|tty1[0-2]", TAG+="systemd"
+SUBSYSTEM=="tty", KERNEL=="tty[a-zA-Z]*|hvc*|xvc*|hvsi*", TAG+="systemd"
+
+KERNEL=="vport*", TAG+="systemd"
+
+SUBSYSTEM=="block", KERNEL!="ram*|loop*", TAG+="systemd"
+SUBSYSTEM=="block", KERNEL!="ram*|loop*", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", ENV{SYSTEMD_READY}="0"
+
+# Ignore encrypted devices with no identified superblock on it, since
+# we are probably still calling mke2fs or mkswap on it.
+
+SUBSYSTEM=="block", KERNEL!="ram*|loop*", ENV{DM_UUID}=="CRYPT-*", ENV{ID_PART_TABLE_TYPE}=="", ENV{ID_FS_USAGE}=="", ENV{SYSTEMD_READY}="0"
+
+# We need a hardware independent way to identify network devices. We
+# use the /sys/subsystem path for this. Current vanilla kernels don't
+# actually support that hierarchy right now, however upcoming kernels
+# will. HAL and udev internally support /sys/subsystem already, hence
+# it should be safe to use this here, too. This is mostly just an
+# identification string for systemd, so whether the path actually is
+# accessible or not does not matter as long as it is unique and in the
+# filesystem namespace.
+#
+# http://git.kernel.org/?p=linux/hotplug/udev.git;a=blob;f=libudev/libudev-enumerate.c;h=da831449dcaf5e936a14409e8e68ab12d30a98e2;hb=HEAD#l742
+
+SUBSYSTEM=="net", KERNEL=="eth*", TAG=="openslxignore", GOTO="systemd_end"
+
+SUBSYSTEM=="net", KERNEL=="br0|eth*", TAG+="systemd", ENV{SYSTEMD_ALIAS}="/sys/subsystem/net/devices/$name", ENV{SYSTEMD_WANTS}="network-interface@$name.service"
+SUBSYSTEM=="bluetooth", TAG+="systemd", ENV{SYSTEMD_ALIAS}="/sys/subsystem/bluetooth/devices/%k"
+
+SUBSYSTEM=="bluetooth", TAG+="systemd", ENV{SYSTEMD_WANTS}="bluetooth.target"
+ENV{ID_SMARTCARD_READER}=="*?", TAG+="systemd", ENV{SYSTEMD_WANTS}="smartcard.target"
+SUBSYSTEM=="sound", KERNEL=="card*", TAG+="systemd", ENV{SYSTEMD_WANTS}="sound.target"
+
+SUBSYSTEM=="printer", TAG+="systemd", ENV{SYSTEMD_WANTS}="printer.target"
+SUBSYSTEM=="usb", KERNEL=="lp*", TAG+="systemd", ENV{SYSTEMD_WANTS}="printer.target"
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:0701??:*", TAG+="systemd", ENV{SYSTEMD_WANTS}="printer.target"
+
+# Apply sysctl variables to network devices (and only to those) as they appear.
+SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/usr/lib/systemd/systemd-sysctl --prefix=/proc/sys/net/ipv4/conf/$name --prefix=/proc/sys/net/ipv4/neigh/$name --prefix=/proc/sys/net/ipv6/conf/$name --prefix=/proc/sys/net/ipv6/neigh/$name"
+
+# Asynchronously mount file systems implemented by these modules as
+# soon as they are loaded.
+
+SUBSYSTEM=="module", KERNEL=="fuse", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="sys-fs-fuse-connections.mount"
+SUBSYSTEM=="module", KERNEL=="configfs", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="sys-kernel-config.mount"
+
+LABEL="systemd_end"
diff --git a/core/modules/systemd-distro/module.build b/core/modules/systemd-distro/module.build
new file mode 100644
index 00000000..fa29a75f
--- /dev/null
+++ b/core/modules/systemd-distro/module.build
@@ -0,0 +1,15 @@
+fetch_source () {
+ :
+}
+
+build () {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "$MODULE_BUILD_DIR"
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/systemd-distro/module.conf b/core/modules/systemd-distro/module.conf
new file mode 100644
index 00000000..f45351b7
--- /dev/null
+++ b/core/modules/systemd-distro/module.conf
@@ -0,0 +1,8 @@
+REQUIRED_DIRECTORIES="
+ /etc
+ /usr
+"
+REQUIRED_SYSTEM_FILES="
+ /usr/lib/tmpfiles.d
+ /etc/tmpfiles.d
+"
diff --git a/core/modules/systemd-distro/module.conf.centos b/core/modules/systemd-distro/module.conf.centos
new file mode 100644
index 00000000..856f60fa
--- /dev/null
+++ b/core/modules/systemd-distro/module.conf.centos
@@ -0,0 +1,7 @@
+REQUIRED_CONTENT_PACKAGES="
+ systemd
+ systemd-libs
+"
+REQUIRED_SYSTEM_FILES+="
+ /usr/lib/systemd/system
+"
diff --git a/core/modules/systemd-distro/module.conf.debian b/core/modules/systemd-distro/module.conf.debian
new file mode 100644
index 00000000..2768b51c
--- /dev/null
+++ b/core/modules/systemd-distro/module.conf.debian
@@ -0,0 +1,13 @@
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ dbus
+ pkg-config
+ libcap-dev
+ libudev-dev
+ libdbus-1-dev
+ xsltproc
+ libblkid-dev
+ libacl1-dev
+ libpam-dev
+"
diff --git a/core/modules/systemd-distro/module.conf.fedora b/core/modules/systemd-distro/module.conf.fedora
new file mode 100644
index 00000000..9232ea5f
--- /dev/null
+++ b/core/modules/systemd-distro/module.conf.fedora
@@ -0,0 +1,11 @@
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ libcap-devel
+ libudev-devel
+ dbus-devel
+ libxslt
+ libblkid-devel
+ libacl-devel
+ glib2-devel
+"
diff --git a/core/modules/systemd-distro/module.conf.opensuse b/core/modules/systemd-distro/module.conf.opensuse
new file mode 100644
index 00000000..965333c4
--- /dev/null
+++ b/core/modules/systemd-distro/module.conf.opensuse
@@ -0,0 +1,10 @@
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ libcap-devel
+ libudev-devel
+ dbus-1-devel
+ libxslt-tools
+ libblkid-devel
+ libacl-devel
+"
diff --git a/core/modules/systemd-distro/module.conf.scientific b/core/modules/systemd-distro/module.conf.scientific
new file mode 100644
index 00000000..54e62b96
--- /dev/null
+++ b/core/modules/systemd-distro/module.conf.scientific
@@ -0,0 +1,37 @@
+REQUIRED_VERSION="systemd-204"
+REQUIRED_URL="http://www.freedesktop.org/software/systemd/${REQUIRED_VERSION}.tar.xz"
+
+REQUIRED_LIBKMOD_VERSION="kmod-12"
+REQUIRED_LIBKMOD_URL="http://www.kernel.org/pub/linux/utils/kernel/kmod/${REQUIRED_LIBKMOD_VERSION}.tar.gz"
+
+REQUIRED_UTILLINUX_VERSION="util-linux-2.23"
+REQUIRED_UTILLINUX_URL="ftp://ftp.kernel.org/pub/linux/utils/util-linux/v${REQUIRED_UTILLINUX_VERSION}/util-linux-${REQUIRED_UTILLINUX_VERSION}.tar.xz"
+
+REQUIRED_M4_VERSION="m4-1.4.16"
+REQUIRED_M4_URL="ftp://ftp.gnu.org/gnu/m4/${REQUIRED_M4_VERSION}.tar.xz"
+
+REQUIRED_AUTOCONF_VERSION="autoconf-2.69"
+REQUIRED_AUTOCONF_URL="ftp://ftp.gnu.org/gnu/autoconf/${REQUIRED_AUTOCONF_VERSION}.tar.xz"
+
+REQUIRED_AUTOMAKE_VERSION="automake-1.13"
+REQUIRED_AUTOMAKE_URL="ftp://ftp.gnu.org/gnu/automake/${REQUIRED_AUTOMAKE_VERSION}.tar.xz"
+
+REQUIRED_DBUS_VERSION="dbus-1.6.8"
+REQUIRED_DBUS_URL="http://dbus.freedesktop.org/releases/dbus/${REQUIRED_DBUS_VERSION}.tar.gz"
+
+
+
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ pkgconfig
+ libcap-devel
+ libudev-devel
+ dbus-devel
+ libxslt
+ libblkid-devel
+ libacl-devel
+ pam-devel
+ glib2-devel
+ expat-devel
+"
diff --git a/core/modules/systemd-distro/module.conf.ubuntu b/core/modules/systemd-distro/module.conf.ubuntu
new file mode 100644
index 00000000..e5dff817
--- /dev/null
+++ b/core/modules/systemd-distro/module.conf.ubuntu
@@ -0,0 +1,12 @@
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ dbus
+ libcap-dev
+ libudev-dev
+ libdbus-1-dev
+ xsltproc
+ libblkid-dev
+ libacl1-dev
+ libpam-dev
+"
diff --git a/core/modules/systemd-distro/module.conf.ubuntu.14 b/core/modules/systemd-distro/module.conf.ubuntu.14
new file mode 100644
index 00000000..7b2f853c
--- /dev/null
+++ b/core/modules/systemd-distro/module.conf.ubuntu.14
@@ -0,0 +1,71 @@
+REQUIRED_VERSION="systemd-204"
+REQUIRED_URL="http://www.freedesktop.org/software/systemd/${REQUIRED_VERSION}.tar.xz"
+REQUIRED_LIBKMOD_VERSION="kmod-14"
+REQUIRED_LIBKMOD_URL="http://www.kernel.org/pub/linux/utils/kernel/kmod/${REQUIRED_LIBKMOD_VERSION}.tar.xz"
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ dbus
+ pkg-config
+ libcap-dev
+ libudev-dev
+ libdbus-1-dev
+ xsltproc
+ libblkid-dev
+ libacl1-dev
+ libpam-dev
+"
+REQUIRED_BINARIES="
+ journalctl
+ loginctl
+ systemctl
+ systemd-analyze
+ systemd-ask-password
+ systemd-cat
+ systemd-cgls
+ systemd-cgtop
+ systemd-delta
+ systemd-detect-virt
+ systemd-inhibit
+ systemd-machine-id-setup
+ systemd-notify
+ systemd-nspawn
+ systemd-stdio-bridge
+ systemd-tmpfiles
+ systemd-tty-ask-password-agent
+ udevadm
+ systemd
+ systemd-ac-power
+ systemd-binfmt
+ systemd-cgroups-agent
+ systemd-fsck
+ systemd-initctl
+ systemd-journald
+ systemd-logind
+ systemd-modules-load
+ systemd-multi-seat-x
+ systemd-random-seed
+ systemd-readahead
+ systemd-remount-fs
+ systemd-reply-password
+ systemd-shutdown
+ systemd-shutdownd
+ systemd-sleep
+ systemd-sysctl
+ systemd-udevd
+ systemd-update-utmp
+ systemd-user-sessions
+ systemd-vconsole-setup
+ systemd-fstab-generator
+ systemd-getty-generator
+ systemd-rc-local-generator
+ systemd-system-update-generator
+ accelerometer
+ ata_id
+ cdrom_id
+ collect
+ mtd_probe
+ scsi_id
+ v4l_id
+"
+REQUIRED_XATTR_PATCH="yes"
diff --git a/core/modules/systemd-distro/module.conf.ubuntu.16 b/core/modules/systemd-distro/module.conf.ubuntu.16
new file mode 100644
index 00000000..7b2f853c
--- /dev/null
+++ b/core/modules/systemd-distro/module.conf.ubuntu.16
@@ -0,0 +1,71 @@
+REQUIRED_VERSION="systemd-204"
+REQUIRED_URL="http://www.freedesktop.org/software/systemd/${REQUIRED_VERSION}.tar.xz"
+REQUIRED_LIBKMOD_VERSION="kmod-14"
+REQUIRED_LIBKMOD_URL="http://www.kernel.org/pub/linux/utils/kernel/kmod/${REQUIRED_LIBKMOD_VERSION}.tar.xz"
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ dbus
+ pkg-config
+ libcap-dev
+ libudev-dev
+ libdbus-1-dev
+ xsltproc
+ libblkid-dev
+ libacl1-dev
+ libpam-dev
+"
+REQUIRED_BINARIES="
+ journalctl
+ loginctl
+ systemctl
+ systemd-analyze
+ systemd-ask-password
+ systemd-cat
+ systemd-cgls
+ systemd-cgtop
+ systemd-delta
+ systemd-detect-virt
+ systemd-inhibit
+ systemd-machine-id-setup
+ systemd-notify
+ systemd-nspawn
+ systemd-stdio-bridge
+ systemd-tmpfiles
+ systemd-tty-ask-password-agent
+ udevadm
+ systemd
+ systemd-ac-power
+ systemd-binfmt
+ systemd-cgroups-agent
+ systemd-fsck
+ systemd-initctl
+ systemd-journald
+ systemd-logind
+ systemd-modules-load
+ systemd-multi-seat-x
+ systemd-random-seed
+ systemd-readahead
+ systemd-remount-fs
+ systemd-reply-password
+ systemd-shutdown
+ systemd-shutdownd
+ systemd-sleep
+ systemd-sysctl
+ systemd-udevd
+ systemd-update-utmp
+ systemd-user-sessions
+ systemd-vconsole-setup
+ systemd-fstab-generator
+ systemd-getty-generator
+ systemd-rc-local-generator
+ systemd-system-update-generator
+ accelerometer
+ ata_id
+ cdrom_id
+ collect
+ mtd_probe
+ scsi_id
+ v4l_id
+"
+REQUIRED_XATTR_PATCH="yes"
diff --git a/core/modules/systemd/README b/core/modules/systemd/README
new file mode 100644
index 00000000..f84283d8
--- /dev/null
+++ b/core/modules/systemd/README
@@ -0,0 +1,12 @@
+To activate debug level, add to units under [Service] this line
+Environment=SYSTEMD_LOG_LEVEL=debug
+
+Note on systemd-versions: Some systemds below 204 (verified in
+systemd-195) seem to need libpci-dev (or the openSuse equivalent).
+
+
+Another note on our compiled systemd-udevd:
+So far it has not been possible to reach a fully functional udev
+system in view of the perceived systemd-udevd limitation about
+evaluating the variable ENV{DEVTYPE}=="usb_device" in udev rule
+scripts.
diff --git a/core/modules/systemd/TODO b/core/modules/systemd/TODO
new file mode 100644
index 00000000..4b17eb88
--- /dev/null
+++ b/core/modules/systemd/TODO
@@ -0,0 +1,2 @@
+libkmod: libkmod gets installed systemwide at present. This should not
+ be the case.
diff --git a/core/modules/systemd/data/etc/systemd/system/network-interface@.service b/core/modules/systemd/data/etc/systemd/system/network-interface@.service
new file mode 100644
index 00000000..ea9cc56e
--- /dev/null
+++ b/core/modules/systemd/data/etc/systemd/system/network-interface@.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Brings interface %i up
+Wants=dhcpc@%i.service
+Before=dhcpc@%i.service
+
+[Service]
+Type=simple
+ExecStart=/opt/openslx/sbin/ip link set dev %I up
+
diff --git a/core/modules/systemd/data/etc/systemd/system/systemd-halt.service b/core/modules/systemd/data/etc/systemd/system/systemd-halt.service
new file mode 100644
index 00000000..95b4f284
--- /dev/null
+++ b/core/modules/systemd/data/etc/systemd/system/systemd-halt.service
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Halt
+Documentation=man:systemd-halt.service(8)
+DefaultDependencies=no
+Requires=shutdown.target final.target
+After=shutdown.target final.target
+
+[Service]
+Type=oneshot
+ExecStartPre=-/bin/bash -c /opt/openslx/scripts/systemd-shutdown_prescript
+ExecStart=/usr/bin/systemctl --force halt
diff --git a/core/modules/systemd/data/etc/systemd/system/systemd-poweroff.service b/core/modules/systemd/data/etc/systemd/system/systemd-poweroff.service
new file mode 100644
index 00000000..8b96980e
--- /dev/null
+++ b/core/modules/systemd/data/etc/systemd/system/systemd-poweroff.service
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Power-Off
+Documentation=man:systemd-halt.service(8)
+DefaultDependencies=no
+Requires=shutdown.target final.target
+After=shutdown.target final.target
+
+[Service]
+Type=oneshot
+ExecStartPre=-/bin/bash -c /opt/openslx/scripts/systemd-shutdown_prescript
+ExecStart=/usr/bin/systemctl --force poweroff
diff --git a/core/modules/systemd/data/etc/systemd/system/systemd-reboot.service b/core/modules/systemd/data/etc/systemd/system/systemd-reboot.service
new file mode 100644
index 00000000..be4d608c
--- /dev/null
+++ b/core/modules/systemd/data/etc/systemd/system/systemd-reboot.service
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Reboot
+Documentation=man:systemd-halt.service(8)
+DefaultDependencies=no
+Requires=shutdown.target final.target
+After=shutdown.target final.target
+
+[Service]
+Type=oneshot
+ExecStartPre=-/bin/bash -c /opt/openslx/scripts/systemd-shutdown_prescript
+ExecStart=/usr/bin/systemctl --force reboot
diff --git a/core/modules/systemd/data/opt/openslx/scripts/systemd-shutdown_prescript b/core/modules/systemd/data/opt/openslx/scripts/systemd-shutdown_prescript
new file mode 100755
index 00000000..3b5d7f92
--- /dev/null
+++ b/core/modules/systemd/data/opt/openslx/scripts/systemd-shutdown_prescript
@@ -0,0 +1,50 @@
+#!/bin/ash
+
+# This script gets called by ExecStartPre from the services
+# systemd-halt, systemd-poweroff, systemd-reboot. Pre-shutdown actions as
+# unmounting nfs shares etc. should go here.
+
+PATH=/bin:/usr/bin:/opt/openslx/bin
+
+# kill leftover processes
+
+umount_nfs_shares() {
+ for i in "$(mount | grep 'type nfs')"; do
+ share=$(echo "$i"|cut -f 3 -d " ")
+ echo "Unmounte nfs-Share $share ...."
+ umount "$share"
+ ERROR=$?
+ if [ $ERROR -eq 0 ]; then
+ echo "nfs-Share $share unmounted."
+ else
+ echo "Could not umount nfs share $share!"
+ ERRORLEVEL=1
+ fi
+ done
+}
+
+umount_samba_shares() {
+ for i in "$(mount | grep 'type cifs')"; do
+ share=$(echo $i|cut -f 3 -d " ")
+ echo "Unmounte cifs-Share $share ...."
+ umount "$share"
+ ERROR=$?
+ if [ $ERROR -eq 0 ]; then
+ echo "cifs-Share $share unmounted."
+ else
+ echo "Could not umount cifs share $share!"
+ ERRORLEVEL=1
+ fi
+ done
+}
+
+# Searching for nfs-shares in mtab:
+if [ $(echo /etc/mtab | cut -d " " -f 3 | grep -q nfs) ]; then
+ umount_nfs_shares
+fi
+
+# Searching for samba-shares:
+if [ $(echo /etc/mtab|cut -d " " -f 3 | grep -q cifs) ]; then
+ umount_samba_shares
+fi
+exit $ERRORLEVEL
diff --git a/core/modules/systemd/data/opt/openslx/scripts/tty-init b/core/modules/systemd/data/opt/openslx/scripts/tty-init
new file mode 100755
index 00000000..a157854d
--- /dev/null
+++ b/core/modules/systemd/data/opt/openslx/scripts/tty-init
@@ -0,0 +1,23 @@
+#!/bin/ash
+
+[ -c "/dev/$1" ] || exit 0
+
+exec > "/dev/$1"
+echo -en "\e]P0232323" #black
+echo -en "\e]P82B2B2B" #darkgrey
+echo -en "\e]P1D75F5F" #darkred
+echo -en "\e]P9E33636" #red
+echo -en "\e]P287AF5F" #darkgreen
+echo -en "\e]PA98E34D" #green
+echo -en "\e]P3D7AF87" #brown
+echo -en "\e]PBFFD75F" #yellow
+echo -en "\e]P48787AF" #darkblue
+echo -en "\e]PC7373C9" #blue
+echo -en "\e]P5BD53A5" #darkmagenta
+echo -en "\e]PDD633B2" #magenta
+echo -en "\e]P65FAFAF" #darkcyan
+echo -en "\e]PE44C9C9" #cyan
+echo -en "\e]P7E5E5E5" #lightgrey
+echo -en "\e]PFFFFFFF" #white
+echo -en '\033c' #clear
+
diff --git a/core/modules/systemd/data/sbin/halt b/core/modules/systemd/data/sbin/halt
new file mode 120000
index 00000000..5d9faf5d
--- /dev/null
+++ b/core/modules/systemd/data/sbin/halt
@@ -0,0 +1 @@
+/usr/bin/systemctl \ No newline at end of file
diff --git a/core/modules/systemd/data/sbin/init b/core/modules/systemd/data/sbin/init
new file mode 120000
index 00000000..60baf528
--- /dev/null
+++ b/core/modules/systemd/data/sbin/init
@@ -0,0 +1 @@
+/usr/lib/systemd/systemd \ No newline at end of file
diff --git a/core/modules/systemd/data/sbin/poweroff b/core/modules/systemd/data/sbin/poweroff
new file mode 120000
index 00000000..5d9faf5d
--- /dev/null
+++ b/core/modules/systemd/data/sbin/poweroff
@@ -0,0 +1 @@
+/usr/bin/systemctl \ No newline at end of file
diff --git a/core/modules/systemd/data/sbin/reboot b/core/modules/systemd/data/sbin/reboot
new file mode 120000
index 00000000..5d9faf5d
--- /dev/null
+++ b/core/modules/systemd/data/sbin/reboot
@@ -0,0 +1 @@
+/usr/bin/systemctl \ No newline at end of file
diff --git a/core/modules/systemd/data/sbin/runlevel b/core/modules/systemd/data/sbin/runlevel
new file mode 120000
index 00000000..5d9faf5d
--- /dev/null
+++ b/core/modules/systemd/data/sbin/runlevel
@@ -0,0 +1 @@
+/usr/bin/systemctl \ No newline at end of file
diff --git a/core/modules/systemd/data/sbin/shutdown b/core/modules/systemd/data/sbin/shutdown
new file mode 120000
index 00000000..5d9faf5d
--- /dev/null
+++ b/core/modules/systemd/data/sbin/shutdown
@@ -0,0 +1 @@
+/usr/bin/systemctl \ No newline at end of file
diff --git a/core/modules/systemd/data/sbin/telinit b/core/modules/systemd/data/sbin/telinit
new file mode 120000
index 00000000..5d9faf5d
--- /dev/null
+++ b/core/modules/systemd/data/sbin/telinit
@@ -0,0 +1 @@
+/usr/bin/systemctl \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/sysctl.d/50-default.conf b/core/modules/systemd/data/usr/lib/sysctl.d/50-default.conf
new file mode 100644
index 00000000..6ece04ce
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/sysctl.d/50-default.conf
@@ -0,0 +1,39 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+# See sysctl.d(5) and core(5) for for details.
+
+# System Request functionality of the kernel (SYNC)
+kernel.sysrq = 1
+
+# Append the PID to the core filename
+kernel.core_uses_pid = 1
+
+# Source route verification
+net.ipv4.conf.all.rp_filter = 1
+# Do not accept source routing
+net.ipv4.conf.all.accept_source_route = 0
+# protection from the SYN flood attack
+net.ipv4.tcp_syncookies = 1
+# timestamps add a little overhead but are recommended for gbit links
+net.ipv4.tcp_timestamps = 1
+# ignore echo broadcast requests to prevent being part of smurf attacks
+net.ipv4.icmp_echo_ignore_broadcasts = 1
+# ignore bogus icmp errors
+net.ipv4.icmp_ignore_bogus_error_responses = 1
+# send redirects (not a router, disable it)
+net.ipv4.conf.all.send_redirects = 0
+# ICMP routing redirects (only secure)
+net.ipv4.conf.all.accept_redirects = 0
+net.ipv4.conf.all.secure_redirects = 1
+
+# Enable hard and soft link protection
+fs.protected_hardlinks = 1
+fs.protected_symlinks = 1
+
+# A little extra security for local exploits
+kernel.kptr_restrict = 1
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/autovt@.service b/core/modules/systemd/data/usr/lib/systemd/system/autovt@.service
new file mode 120000
index 00000000..fe40e8fd
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/autovt@.service
@@ -0,0 +1 @@
+getty@.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/basic.target b/core/modules/systemd/data/usr/lib/systemd/system/basic.target
new file mode 100644
index 00000000..6b9cfe4c
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/basic.target
@@ -0,0 +1,14 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Basic System
+Documentation=man:systemd.special(7)
+Requires=sysinit.target
+Wants=sockets.target timers.target paths.target
+After=sysinit.target sockets.target timers.target paths.target
+RefuseManualStart=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/bluetooth.target b/core/modules/systemd/data/usr/lib/systemd/system/bluetooth.target
new file mode 100644
index 00000000..dd4ae14c
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/bluetooth.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Bluetooth
+Documentation=man:systemd.special(7)
+StopWhenUnneeded=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/console-getty.service b/core/modules/systemd/data/usr/lib/systemd/system/console-getty.service
new file mode 100644
index 00000000..74a220e2
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/console-getty.service
@@ -0,0 +1,32 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Console Getty
+Documentation=man:agetty(8)
+After=systemd-user-sessions.service plymouth-quit-wait.service
+After=rc-local.service
+Before=getty.target
+
+[Service]
+ExecStart=-/sbin/agetty --noclear -s console 115200,38400,9600
+Type=idle
+Restart=always
+RestartSec=0
+UtmpIdentifier=cons
+TTYPath=/dev/console
+TTYReset=yes
+TTYVHangup=yes
+KillMode=process
+IgnoreSIGPIPE=no
+
+# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
+# terminates cleanly.
+KillSignal=SIGHUP
+
+[Install]
+WantedBy=getty.target
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/console-shell.service b/core/modules/systemd/data/usr/lib/systemd/system/console-shell.service
new file mode 100644
index 00000000..c1548299
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/console-shell.service
@@ -0,0 +1,32 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Console Shell
+Documentation=man:sulogin(8)
+After=systemd-user-sessions.service plymouth-quit-wait.service
+After=rc-local.service
+Before=getty.target
+
+[Service]
+Environment=HOME=/root
+WorkingDirectory=/root
+ExecStart=-/sbin/sulogin
+ExecStopPost=-/usr/bin/systemctl poweroff
+Type=idle
+StandardInput=tty-force
+StandardOutput=inherit
+StandardError=inherit
+KillMode=process
+IgnoreSIGPIPE=no
+
+# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
+# terminates cleanly.
+KillSignal=SIGHUP
+
+[Install]
+WantedBy=getty.target
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/ctrl-alt-del.target b/core/modules/systemd/data/usr/lib/systemd/system/ctrl-alt-del.target
new file mode 120000
index 00000000..f2fde431
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/ctrl-alt-del.target
@@ -0,0 +1 @@
+reboot.target \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/dbus-org.freedesktop.login1.service b/core/modules/systemd/data/usr/lib/systemd/system/dbus-org.freedesktop.login1.service
new file mode 120000
index 00000000..d87318cc
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/dbus-org.freedesktop.login1.service
@@ -0,0 +1 @@
+systemd-logind.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/debug-shell.service b/core/modules/systemd/data/usr/lib/systemd/system/debug-shell.service
new file mode 100644
index 00000000..4220d7c2
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/debug-shell.service
@@ -0,0 +1,33 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Early root shell on /dev/tty9 FOR DEBUGGING ONLY
+Documentation=man:sushell(8)
+DefaultDependencies=no
+IgnoreOnIsolate=yes
+
+[Service]
+Environment=TERM=linux
+ExecStart=/bin/ash
+Restart=always
+RestartSec=0
+StandardInput=tty
+TTYPath=/dev/tty9
+TTYReset=yes
+TTYVHangup=yes
+KillMode=process
+IgnoreSIGPIPE=no
+# bash ignores SIGTERM
+KillSignal=SIGHUP
+
+# Unset locale for the console getty since the console has problems
+# displaying some internationalized messages.
+Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=
+
+[Install]
+WantedBy=sysinit.target
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/default.target b/core/modules/systemd/data/usr/lib/systemd/system/default.target
new file mode 120000
index 00000000..a0aae86a
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/default.target
@@ -0,0 +1 @@
+graphical.target \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/dev-hugepages.mount b/core/modules/systemd/data/usr/lib/systemd/system/dev-hugepages.mount
new file mode 100644
index 00000000..d711faed
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/dev-hugepages.mount
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Huge Pages File System
+Documentation=https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+Before=sysinit.target
+ConditionPathExists=/sys/kernel/mm/hugepages
+
+[Mount]
+What=hugetlbfs
+Where=/dev/hugepages
+Type=hugetlbfs
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/dev-mqueue.mount b/core/modules/systemd/data/usr/lib/systemd/system/dev-mqueue.mount
new file mode 100644
index 00000000..5c11ca7d
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/dev-mqueue.mount
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=POSIX Message Queue File System
+Documentation=man:mq_overview(7)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+Before=sysinit.target
+ConditionPathExists=/proc/sys/fs/mqueue
+
+[Mount]
+What=mqueue
+Where=/dev/mqueue
+Type=mqueue
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/emergency.service b/core/modules/systemd/data/usr/lib/systemd/system/emergency.service
new file mode 100644
index 00000000..72fcff2d
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/emergency.service
@@ -0,0 +1,31 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Emergency Shell
+Documentation=man:sulogin(8)
+DefaultDependencies=no
+Conflicts=shutdown.target
+Before=shutdown.target
+
+[Service]
+Environment=HOME=/root
+WorkingDirectory=/root
+ExecStartPre=-/bin/plymouth quit
+ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" to try again\\nto boot into default mode.'
+ExecStart=-/sbin/sulogin
+ExecStopPost=/usr/bin/systemctl --fail --no-block default
+Type=idle
+StandardInput=tty-force
+StandardOutput=inherit
+StandardError=inherit
+KillMode=process
+IgnoreSIGPIPE=no
+
+# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
+# terminates cleanly.
+KillSignal=SIGHUP
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/emergency.target b/core/modules/systemd/data/usr/lib/systemd/system/emergency.target
new file mode 100644
index 00000000..0760d66f
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/emergency.target
@@ -0,0 +1,13 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Emergency Mode
+Documentation=man:systemd.special(7)
+Requires=emergency.service
+After=emergency.service
+AllowIsolate=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/final.target b/core/modules/systemd/data/usr/lib/systemd/system/final.target
new file mode 100644
index 00000000..c7cf18e0
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/final.target
@@ -0,0 +1,13 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Final Step
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+RefuseManualStart=yes
+After=shutdown.target
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/getty.target b/core/modules/systemd/data/usr/lib/systemd/system/getty.target
new file mode 100644
index 00000000..c33d4465
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/getty.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Login Prompts
+Documentation=man:systemd.special(7) man:systemd-getty-generator(8)
+Documentation=http://0pointer.de/blog/projects/serial-console.html
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/getty@.service b/core/modules/systemd/data/usr/lib/systemd/system/getty@.service
new file mode 100644
index 00000000..5c1d1666
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/getty@.service
@@ -0,0 +1,50 @@
+# This file is part of systemd.
+# Patched for OpenSLX
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Getty on %I
+Documentation=man:agetty(8) man:systemd-getty-generator(8)
+Documentation=http://0pointer.de/blog/projects/serial-console.html
+After=systemd-user-sessions.service
+After=rc-local.service
+
+# If additional gettys are spawned during boot then we should make
+# sure that this is synchronized before getty.target, even though
+# getty.target didn't actually pull it in.
+Before=getty.target
+IgnoreOnIsolate=yes
+
+# On systems without virtual consoles, don't start any getty. (Note
+# that serial gettys are covered by serial-getty@.service, not this
+# unit
+ConditionPathExists=/dev/tty0
+
+[Service]
+ExecStartPre=-/opt/openslx/bin/killall fbsplash
+ExecStartPre=-/opt/openslx/scripts/tty-init %I
+# the VT is cleared by TTYVTDisallocate
+ExecStart=-/sbin/agetty %I 38400 linux
+Type=idle
+Restart=always
+RestartSec=0
+UtmpIdentifier=%I
+TTYPath=/dev/%I
+TTYReset=yes
+TTYVHangup=yes
+TTYVTDisallocate=no
+KillMode=process
+IgnoreSIGPIPE=no
+
+# Unset locale for the console getty since the console has problems
+# displaying some internationalized messages.
+Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=
+
+# Some login implementations ignore SIGTERM, so we send SIGHUP
+# instead, to ensure that login terminates cleanly.
+KillSignal=SIGHUP
+
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/graphical.target b/core/modules/systemd/data/usr/lib/systemd/system/graphical.target
new file mode 100644
index 00000000..65f2521d
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/graphical.target
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Graphical Interface
+Documentation=man:systemd.special(7)
+Requires=multi-user.target
+After=multi-user.target
+Conflicts=rescue.target
+Wants=display-manager.service
+AllowIsolate=yes
+
+[Install]
+Alias=default.target
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/halt-local.service b/core/modules/systemd/data/usr/lib/systemd/system/halt-local.service
new file mode 100644
index 00000000..e6243eeb
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/halt-local.service
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=/usr/sbin/halt.local Compatibility
+ConditionFileIsExecutable=/usr/sbin/halt.local
+DefaultDependencies=no
+After=shutdown.target
+Before=final.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/sbin/halt.local
+TimeoutSec=0
+StandardOutput=tty
+RemainAfterExit=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/halt.target b/core/modules/systemd/data/usr/lib/systemd/system/halt.target
new file mode 100644
index 00000000..a21d984b
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/halt.target
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Halt
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+Requires=systemd-halt.service
+After=systemd-halt.service
+AllowIsolate=yes
+
+[Install]
+Alias=ctrl-alt-del.target
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/hibernate.target b/core/modules/systemd/data/usr/lib/systemd/system/hibernate.target
new file mode 100644
index 00000000..143eb592
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/hibernate.target
@@ -0,0 +1,13 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Hibernate
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+BindsTo=systemd-hibernate.service
+After=systemd-hibernate.service
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/hybrid-sleep.target b/core/modules/systemd/data/usr/lib/systemd/system/hybrid-sleep.target
new file mode 100644
index 00000000..d2d34092
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/hybrid-sleep.target
@@ -0,0 +1,13 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Hybrid Suspend+Hibernate
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+BindsTo=systemd-hybrid-sleep.service
+After=systemd-hybrid-sleep.service
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/kexec.target b/core/modules/systemd/data/usr/lib/systemd/system/kexec.target
new file mode 100644
index 00000000..90795d0c
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/kexec.target
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Reboot via kexec
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+Requires=systemd-kexec.service
+After=systemd-kexec.service
+AllowIsolate=yes
+
+[Install]
+Alias=ctrl-alt-del.target
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/multi-user.target b/core/modules/systemd/data/usr/lib/systemd/system/multi-user.target
new file mode 100644
index 00000000..998e0460
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/multi-user.target
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Multi-User System
+Documentation=man:systemd.special(7)
+Requires=basic.target
+Conflicts=rescue.service rescue.target
+After=basic.target rescue.service rescue.target
+AllowIsolate=yes
+
+[Install]
+Alias=default.target
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/multi-user.target.wants/getty.target b/core/modules/systemd/data/usr/lib/systemd/system/multi-user.target.wants/getty.target
new file mode 120000
index 00000000..bdba1fe4
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/multi-user.target.wants/getty.target
@@ -0,0 +1 @@
+../getty.target \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/multi-user.target.wants/systemd-logind.service b/core/modules/systemd/data/usr/lib/systemd/system/multi-user.target.wants/systemd-logind.service
new file mode 120000
index 00000000..270a900e
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/multi-user.target.wants/systemd-logind.service
@@ -0,0 +1 @@
+../systemd-logind.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/multi-user.target.wants/systemd-user-sessions.service b/core/modules/systemd/data/usr/lib/systemd/system/multi-user.target.wants/systemd-user-sessions.service
new file mode 120000
index 00000000..f878b529
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/multi-user.target.wants/systemd-user-sessions.service
@@ -0,0 +1 @@
+../systemd-user-sessions.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/network-online.target b/core/modules/systemd/data/usr/lib/systemd/system/network-online.target
new file mode 100644
index 00000000..a40c44c9
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/network-online.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Network is Online
+Documentation=man:systemd.special(7)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/network.target b/core/modules/systemd/data/usr/lib/systemd/system/network.target
new file mode 100644
index 00000000..4186c088
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/network.target
@@ -0,0 +1,14 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Network
+Documentation=man:systemd.special(7)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
+DefaultDependencies=no
+ConditionPathExists=/run/network/network-ready
+
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/paths.target b/core/modules/systemd/data/usr/lib/systemd/system/paths.target
new file mode 100644
index 00000000..25c7fd03
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/paths.target
@@ -0,0 +1,10 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Paths
+Documentation=man:systemd.special(7)
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/poweroff.target b/core/modules/systemd/data/usr/lib/systemd/system/poweroff.target
new file mode 100644
index 00000000..71871033
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/poweroff.target
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Power-Off
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+Requires=systemd-poweroff.service
+After=systemd-poweroff.service
+AllowIsolate=yes
+
+[Install]
+Alias=ctrl-alt-del.target
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/printer.target b/core/modules/systemd/data/usr/lib/systemd/system/printer.target
new file mode 100644
index 00000000..a6b86caa
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/printer.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Printer
+Documentation=man:systemd.special(7)
+StopWhenUnneeded=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.automount b/core/modules/systemd/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.automount
new file mode 100644
index 00000000..6be38937
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.automount
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Arbitrary Executable File Formats File System Automount Point
+Documentation=https://www.kernel.org/doc/Documentation/binfmt_misc.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+Before=sysinit.target
+ConditionPathExists=/proc/sys/fs/binfmt_misc/
+ConditionPathIsReadWrite=/proc/sys/
+
+[Automount]
+Where=/proc/sys/fs/binfmt_misc
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.mount b/core/modules/systemd/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.mount
new file mode 100644
index 00000000..8c7c3863
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.mount
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Arbitrary Executable File Formats File System
+Documentation=https://www.kernel.org/doc/Documentation/binfmt_misc.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+
+[Mount]
+What=binfmt_misc
+Where=/proc/sys/fs/binfmt_misc
+Type=binfmt_misc
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/rc-local.service b/core/modules/systemd/data/usr/lib/systemd/system/rc-local.service
new file mode 100644
index 00000000..cb9c1ba2
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/rc-local.service
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+# This unit gets pulled automatically into multi-user.target by
+# systemd-rc-local-generator if /etc/rc.local is executable.
+[Unit]
+Description=/etc/rc.local Compatibility
+ConditionFileIsExecutable=/etc/rc.local
+After=network.target
+
+[Service]
+Type=forking
+ExecStart=/etc/rc.local start
+TimeoutSec=0
+RemainAfterExit=yes
+SysVStartPriority=99
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/reboot.target b/core/modules/systemd/data/usr/lib/systemd/system/reboot.target
new file mode 100644
index 00000000..dec8f567
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/reboot.target
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Reboot
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+Requires=systemd-reboot.service
+After=systemd-reboot.service
+AllowIsolate=yes
+
+[Install]
+Alias=ctrl-alt-del.target
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/remote-fs.target b/core/modules/systemd/data/usr/lib/systemd/system/remote-fs.target
new file mode 100644
index 00000000..0821987d
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/remote-fs.target
@@ -0,0 +1,3 @@
+[Unit]
+Description=Remote File Systems Impostor
+
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/serial-getty@.service b/core/modules/systemd/data/usr/lib/systemd/system/serial-getty@.service
new file mode 100644
index 00000000..5f289500
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/serial-getty@.service
@@ -0,0 +1,36 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Serial Getty on %I
+Documentation=man:agetty(8) man:systemd-getty-generator(8)
+Documentation=http://0pointer.de/blog/projects/serial-console.html
+BindsTo=dev-%i.device
+After=dev-%i.device systemd-user-sessions.service plymouth-quit-wait.service
+After=rc-local.service
+
+# If additional gettys are spawned during boot then we should make
+# sure that this is synchronized before getty.target, even though
+# getty.target didn't actually pull it in.
+Before=getty.target
+IgnoreOnIsolate=yes
+
+[Service]
+ExecStart=-/sbin/agetty -s %I 115200,38400,9600 vt102
+Type=idle
+Restart=always
+RestartSec=0
+UtmpIdentifier=%I
+TTYPath=/dev/%I
+TTYReset=yes
+TTYVHangup=yes
+KillMode=process
+IgnoreSIGPIPE=no
+
+# Some login implementations ignore SIGTERM, so we send SIGHUP
+# instead, to ensure that login terminates cleanly.
+KillSignal=SIGHUP
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/shutdown.target b/core/modules/systemd/data/usr/lib/systemd/system/shutdown.target
new file mode 100644
index 00000000..73e302b8
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/shutdown.target
@@ -0,0 +1,12 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Shutdown
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+RefuseManualStart=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sigpwr.target b/core/modules/systemd/data/usr/lib/systemd/system/sigpwr.target
new file mode 100644
index 00000000..a52e7cff
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sigpwr.target
@@ -0,0 +1,10 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Power Failure
+Documentation=man:systemd.special(7)
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sleep.target b/core/modules/systemd/data/usr/lib/systemd/system/sleep.target
new file mode 100644
index 00000000..10c7c8d5
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sleep.target
@@ -0,0 +1,13 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Sleep
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+RefuseManualStart=yes
+StopWhenUnneeded=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/smartcard.target b/core/modules/systemd/data/usr/lib/systemd/system/smartcard.target
new file mode 100644
index 00000000..5fefe847
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/smartcard.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Smart Card
+Documentation=man:systemd.special(7)
+StopWhenUnneeded=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sockets.target b/core/modules/systemd/data/usr/lib/systemd/system/sockets.target
new file mode 100644
index 00000000..26ab065d
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sockets.target
@@ -0,0 +1,10 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Sockets
+Documentation=man:systemd.special(7)
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-journald.socket b/core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-journald.socket
new file mode 120000
index 00000000..07ae46c4
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-journald.socket
@@ -0,0 +1 @@
+../systemd-journald.socket \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-shutdownd.socket b/core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-shutdownd.socket
new file mode 120000
index 00000000..aa23208d
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-shutdownd.socket
@@ -0,0 +1 @@
+../systemd-shutdownd.socket \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-control.socket b/core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-control.socket
new file mode 120000
index 00000000..4bc0e548
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-control.socket
@@ -0,0 +1 @@
+../systemd-udevd-control.socket \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-kernel.socket b/core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-kernel.socket
new file mode 120000
index 00000000..fab7990a
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sockets.target.wants/systemd-udevd-kernel.socket
@@ -0,0 +1 @@
+../systemd-udevd-kernel.socket \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sound.target b/core/modules/systemd/data/usr/lib/systemd/system/sound.target
new file mode 100644
index 00000000..6699adec
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sound.target
@@ -0,0 +1,11 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Sound Card
+Documentation=man:systemd.special(7)
+StopWhenUnneeded=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/suspend.target b/core/modules/systemd/data/usr/lib/systemd/system/suspend.target
new file mode 100644
index 00000000..f50cb226
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/suspend.target
@@ -0,0 +1,13 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Suspend
+Documentation=man:systemd.special(7)
+DefaultDependencies=no
+BindsTo=systemd-suspend.service
+After=systemd-suspend.service
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/swap.target b/core/modules/systemd/data/usr/lib/systemd/system/swap.target
new file mode 100644
index 00000000..23a7d0dc
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/swap.target
@@ -0,0 +1,10 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Swap
+Documentation=man:systemd.special(7)
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sys-fs-fuse-connections.mount b/core/modules/systemd/data/usr/lib/systemd/system/sys-fs-fuse-connections.mount
new file mode 100644
index 00000000..ebd93e2c
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sys-fs-fuse-connections.mount
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=FUSE Control File System
+Documentation=https://www.kernel.org/doc/Documentation/filesystems/fuse.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+ConditionPathExists=/sys/fs/fuse/connections
+After=systemd-modules-load.service
+Before=sysinit.target
+
+[Mount]
+What=fusectl
+Where=/sys/fs/fuse/connections
+Type=fusectl
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sys-kernel-config.mount b/core/modules/systemd/data/usr/lib/systemd/system/sys-kernel-config.mount
new file mode 100644
index 00000000..020101c0
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sys-kernel-config.mount
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Configuration File System
+Documentation=https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
+DefaultDependencies=no
+ConditionPathExists=/sys/kernel/config
+After=systemd-modules-load.service
+Before=sysinit.target
+
+[Mount]
+What=configfs
+Where=/sys/kernel/config
+Type=configfs
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target
new file mode 100644
index 00000000..ec6fbefc
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target
@@ -0,0 +1,14 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=System Initialization
+Documentation=man:systemd.special(7)
+Conflicts=emergency.service emergency.target
+Wants= swap.target
+After= swap.target emergency.service emergency.target
+RefuseManualStart=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/dev-hugepages.mount b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/dev-hugepages.mount
new file mode 120000
index 00000000..6a26137b
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/dev-hugepages.mount
@@ -0,0 +1 @@
+../dev-hugepages.mount \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/dev-mqueue.mount b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/dev-mqueue.mount
new file mode 120000
index 00000000..f0b9fbf4
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/dev-mqueue.mount
@@ -0,0 +1 @@
+../dev-mqueue.mount \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/proc-sys-fs-binfmt_misc.automount b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/proc-sys-fs-binfmt_misc.automount
new file mode 120000
index 00000000..0b7f61f0
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/proc-sys-fs-binfmt_misc.automount
@@ -0,0 +1 @@
+../proc-sys-fs-binfmt_misc.automount \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/sys-fs-fuse-connections.mount b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/sys-fs-fuse-connections.mount
new file mode 120000
index 00000000..85d20a2d
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/sys-fs-fuse-connections.mount
@@ -0,0 +1 @@
+../sys-fs-fuse-connections.mount \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/sys-kernel-config.mount b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/sys-kernel-config.mount
new file mode 120000
index 00000000..831a9479
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/sys-kernel-config.mount
@@ -0,0 +1 @@
+../sys-kernel-config.mount \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-binfmt.service b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-binfmt.service
new file mode 120000
index 00000000..07fbee12
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-binfmt.service
@@ -0,0 +1 @@
+../systemd-binfmt.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-journald.service b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-journald.service
new file mode 120000
index 00000000..e9057f7d
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-journald.service
@@ -0,0 +1 @@
+../systemd-journald.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-modules-load.service b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-modules-load.service
new file mode 120000
index 00000000..79337696
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-modules-load.service
@@ -0,0 +1 @@
+../systemd-modules-load.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-sysctl.service b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-sysctl.service
new file mode 120000
index 00000000..fb5fbf0c
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-sysctl.service
@@ -0,0 +1 @@
+../systemd-sysctl.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup-dev.service b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup-dev.service
new file mode 120000
index 00000000..0a5032ac
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup-dev.service
@@ -0,0 +1 @@
+../systemd-tmpfiles-setup-dev.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup.service b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup.service
new file mode 120000
index 00000000..12744a3e
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup.service
@@ -0,0 +1 @@
+../systemd-tmpfiles-setup.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udev-trigger.service b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udev-trigger.service
new file mode 120000
index 00000000..ff2ab9b3
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udev-trigger.service
@@ -0,0 +1 @@
+../systemd-udev-trigger.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udevd.service b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udevd.service
new file mode 120000
index 00000000..e64bac22
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-udevd.service
@@ -0,0 +1 @@
+../systemd-udevd.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-vconsole-setup.service b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-vconsole-setup.service
new file mode 120000
index 00000000..78347c39
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/sysinit.target.wants/systemd-vconsole-setup.service
@@ -0,0 +1 @@
+../systemd-vconsole-setup.service \ No newline at end of file
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/syslog.socket b/core/modules/systemd/data/usr/lib/systemd/system/syslog.socket
new file mode 100644
index 00000000..e6e9cf85
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/syslog.socket
@@ -0,0 +1,40 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Syslog Socket
+Documentation=man:systemd.special(7)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/syslog
+DefaultDependencies=no
+Before=sockets.target shutdown.target
+
+# Don't allow logging until the very end
+Conflicts=shutdown.target
+
+[Socket]
+ListenDatagram=/run/systemd/journal/syslog
+SocketMode=0666
+PassCredentials=yes
+PassSecurity=yes
+ReceiveBuffer=8M
+
+# The default syslog implementation should make syslog.service a
+# symlink to itself, so that this socket activates the right actual
+# syslog service.
+#
+# Examples:
+#
+# /etc/systemd/system/syslog.service -> /lib/systemd/system/rsyslog.service
+# /etc/systemd/system/syslog.service -> /lib/systemd/system/syslog-ng.service
+#
+# Best way to achieve that is by adding this to your unit file
+# (i.e. to rsyslog.service or syslog-ng.service):
+#
+# [Install]
+# Alias=syslog.service
+#
+# See http://www.freedesktop.org/wiki/Software/systemd/syslog for details.
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/system-update.target b/core/modules/systemd/data/usr/lib/systemd/system/system-update.target
new file mode 100644
index 00000000..b6008c8f
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/system-update.target
@@ -0,0 +1,16 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=System Update
+Documentation=http://freedesktop.org/wiki/Software/systemd/SystemUpdates
+Documentation=man:systemd.special(7) man:systemd-system-update-generator(8)
+Requires=sysinit.target
+Conflicts=shutdown.target
+After=sysinit.target
+Before=shutdown.target
+AllowIsolate=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-binfmt.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-binfmt.service
new file mode 100644
index 00000000..897cf4e5
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-binfmt.service
@@ -0,0 +1,26 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Set Up Additional Binary Formats
+Documentation=man:systemd-binfmt.service(8) man:binfmt.d(5)
+Documentation=https://www.kernel.org/doc/Documentation/binfmt_misc.txt
+DefaultDependencies=no
+Conflicts=shutdown.target
+After= proc-sys-fs-binfmt_misc.automount
+Before=sysinit.target shutdown.target
+ConditionPathIsReadWrite=/proc/sys/
+ConditionDirectoryNotEmpty=|/lib/binfmt.d
+ConditionDirectoryNotEmpty=|/usr/lib/binfmt.d
+ConditionDirectoryNotEmpty=|/usr/local/lib/binfmt.d
+ConditionDirectoryNotEmpty=|/etc/binfmt.d
+ConditionDirectoryNotEmpty=|/run/binfmt.d
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-binfmt
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-halt.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-halt.service
new file mode 100644
index 00000000..a13d67c6
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-halt.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Halt
+Documentation=man:systemd-halt.service(8)
+DefaultDependencies=no
+Requires=shutdown.target final.target
+After=shutdown.target final.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/systemctl --force halt
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-hibernate.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-hibernate.service
new file mode 100644
index 00000000..7f19e48f
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-hibernate.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Hibernate
+Documentation=man:systemd-suspend.service(8)
+DefaultDependencies=no
+Requires=sleep.target
+After=sleep.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/lib/systemd/systemd-sleep hibernate
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-hybrid-sleep.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-hybrid-sleep.service
new file mode 100644
index 00000000..7d627bfa
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-hybrid-sleep.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Hybrid Suspend+Hibernate
+Documentation=man:systemd-suspend.service(8)
+DefaultDependencies=no
+Requires=sleep.target
+After=sleep.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/lib/systemd/systemd-sleep hybrid-sleep
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-journald.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-journald.service
new file mode 100644
index 00000000..77b4bfe9
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-journald.service
@@ -0,0 +1,26 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Journal Service
+Documentation=man:systemd-journald.service(8) man:journald.conf(5)
+DefaultDependencies=no
+Requires=systemd-journald.socket
+After=systemd-journald.socket syslog.socket
+Before=sysinit.target
+
+[Service]
+ExecStart=/usr/lib/systemd/systemd-journald
+Restart=always
+RestartSec=0
+NotifyAccess=all
+StandardOutput=null
+CapabilityBoundingSet=CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_SYS_PTRACE CAP_SYSLOG CAP_AUDIT_CONTROL CAP_CHOWN CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID
+
+# Increase the default a bit in order to allow many simultaneous
+# services being run since we keep one fd open per service.
+LimitNOFILE=16384
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-journald.socket b/core/modules/systemd/data/usr/lib/systemd/system/systemd-journald.socket
new file mode 100644
index 00000000..4f0619d2
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-journald.socket
@@ -0,0 +1,26 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Journal Socket
+Documentation=man:systemd-journald.service(8) man:journald.conf(5)
+DefaultDependencies=no
+Before=sockets.target
+
+# Mount and swap units need this. If this socket unit is removed by an
+# isolate request the mount and and swap units would be removed too,
+# hence let's exclude this from isolate requests.
+IgnoreOnIsolate=yes
+
+[Socket]
+ListenStream=/run/systemd/journal/stdout
+ListenDatagram=/run/systemd/journal/socket
+ListenDatagram=/dev/log
+SocketMode=0666
+PassCredentials=yes
+PassSecurity=yes
+ReceiveBuffer=8M
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-logind.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-logind.service
new file mode 100644
index 00000000..71971e44
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-logind.service
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Login Service
+Documentation=man:systemd-logind.service(8) man:logind.conf(5)
+Documentation=http://www.freedesktop.org/wiki/Software/systemd/multiseat
+After=
+
+[Service]
+ExecStart=/usr/lib/systemd/systemd-logind
+Restart=always
+RestartSec=0
+BusName=org.freedesktop.login1
+CapabilityBoundingSet=CAP_AUDIT_CONTROL CAP_CHOWN CAP_KILL CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE CAP_FOWNER CAP_SYS_TTY_CONFIG
+
+# Increase the default a bit in order to allow many simultaneous
+# logins since we keep one fd open per session.
+LimitNOFILE=16384
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-modules-load.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-modules-load.service
new file mode 100644
index 00000000..3ff810f7
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-modules-load.service
@@ -0,0 +1,27 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Load Kernel Modules
+Documentation=man:systemd-modules-load.service(8) man:modules-load.d(5)
+DefaultDependencies=no
+Conflicts=shutdown.target
+After=
+Before=sysinit.target shutdown.target
+ConditionCapability=CAP_SYS_MODULE
+ConditionDirectoryNotEmpty=|/lib/modules-load.d
+ConditionDirectoryNotEmpty=|/usr/lib/modules-load.d
+ConditionDirectoryNotEmpty=|/usr/local/lib/modules-load.d
+ConditionDirectoryNotEmpty=|/etc/modules-load.d
+ConditionDirectoryNotEmpty=|/run/modules-load.d
+ConditionKernelCommandLine=|modules-load
+ConditionKernelCommandLine=|rd.modules-load
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-modules-load
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-nspawn@.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-nspawn@.service
new file mode 100644
index 00000000..f9f9aa65
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-nspawn@.service
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Container %i
+Documentation=man:systemd-nspawn(1)
+
+[Service]
+ExecStart=/usr/bin/systemd-nspawn -bjD /var/lib/container/%i
+ControlGroup=%R/machine/%i.nspawn cpu:/
+Type=notify
+
+[Install]
+Also=multi-user.target
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-poweroff.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-poweroff.service
new file mode 100644
index 00000000..eede0eab
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-poweroff.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Power-Off
+Documentation=man:systemd-halt.service(8)
+DefaultDependencies=no
+Requires=shutdown.target final.target
+After=shutdown.target final.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/systemctl --force poweroff
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-reboot.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-reboot.service
new file mode 100644
index 00000000..b2d27c8e
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-reboot.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Reboot
+Documentation=man:systemd-halt.service(8)
+DefaultDependencies=no
+Requires=shutdown.target final.target
+After=shutdown.target final.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/systemctl --force reboot
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-shutdownd.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-shutdownd.service
new file mode 100644
index 00000000..38c663de
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-shutdownd.service
@@ -0,0 +1,15 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Delayed Shutdown Service
+Documentation=man:systemd-shutdownd.service(8)
+DefaultDependencies=no
+
+[Service]
+ExecStart=/usr/lib/systemd/systemd-shutdownd
+NotifyAccess=all
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-shutdownd.socket b/core/modules/systemd/data/usr/lib/systemd/system/systemd-shutdownd.socket
new file mode 100644
index 00000000..9421ce8a
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-shutdownd.socket
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Delayed Shutdown Socket
+Documentation=man:systemd-shutdownd.service(8)
+DefaultDependencies=no
+Before=sockets.target
+
+[Socket]
+ListenDatagram=/run/systemd/shutdownd
+SocketMode=0600
+PassCredentials=yes
+PassSecurity=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-suspend.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-suspend.service
new file mode 100644
index 00000000..5d242edd
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-suspend.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Suspend
+Documentation=man:systemd-suspend.service(8)
+DefaultDependencies=no
+Requires=sleep.target
+After=sleep.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/lib/systemd/systemd-sleep suspend
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-sysctl.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-sysctl.service
new file mode 100644
index 00000000..46e2475e
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-sysctl.service
@@ -0,0 +1,26 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Apply Kernel Variables
+Documentation=man:systemd-sysctl.service(8) man:sysctl.d(5)
+DefaultDependencies=no
+Conflicts=shutdown.target
+After=
+Before=sysinit.target shutdown.target
+ConditionPathIsReadWrite=/proc/sys/
+ConditionPathExists=|/etc/sysctl.conf
+ConditionDirectoryNotEmpty=|/lib/sysctl.d
+ConditionDirectoryNotEmpty=|/usr/lib/sysctl.d
+ConditionDirectoryNotEmpty=|/usr/local/lib/sysctl.d
+ConditionDirectoryNotEmpty=|/etc/sysctl.d
+ConditionDirectoryNotEmpty=|/run/sysctl.d
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-sysctl
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-tmpfiles-setup-dev.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-tmpfiles-setup-dev.service
new file mode 100644
index 00000000..da1ee1f8
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-tmpfiles-setup-dev.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Create static device nodes in /dev
+Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
+DefaultDependencies=no
+Before=sysinit.target systemd-udevd.service
+ConditionCapability=CAP_MKNOD
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/systemd-tmpfiles --prefix=/dev --create
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-tmpfiles-setup.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-tmpfiles-setup.service
new file mode 100644
index 00000000..157a7451
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-tmpfiles-setup.service
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Recreate Volatile Files and Directories
+Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
+DefaultDependencies=no
+Wants=
+After=
+Before=sysinit.target shutdown.target
+ConditionDirectoryNotEmpty=|/usr/lib/tmpfiles.d
+ConditionDirectoryNotEmpty=|/usr/local/lib/tmpfiles.d
+ConditionDirectoryNotEmpty=|/etc/tmpfiles.d
+ConditionDirectoryNotEmpty=|/run/tmpfiles.d
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/systemd-tmpfiles --create --remove
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-udev-settle.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-udev-settle.service
new file mode 100644
index 00000000..146c6499
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-udev-settle.service
@@ -0,0 +1,31 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+# This service can dynamically be pulled-in by legacy services which
+# cannot reliably cope with dynamic device configurations, and wrongfully
+# expect a populated /dev during bootup.
+
+[Unit]
+Description=udev Wait for Complete Device Initialization
+Documentation=man:udev(7) man:systemd-udevd.service(8)
+DefaultDependencies=no
+Wants=systemd-udevd.service
+After=systemd-udev-trigger.service
+Before=sysinit.target
+ConditionCapability=CAP_MKNOD
+
+[Service]
+Type=oneshot
+TimeoutSec=180
+RemainAfterExit=yes
+# Don't ask...
+ExecStart=/opt/openslx/bin/usleep 100000
+ExecStart=/usr/bin/udevadm settle --timeout=3
+ExecStart=/opt/openslx/bin/usleep 20000
+ExecStart=/usr/bin/udevadm settle --timeout=3
+ExecStart=/opt/openslx/bin/usleep 20000
+ExecStart=/usr/bin/udevadm settle --timeout=3
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-udev-trigger.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-udev-trigger.service
new file mode 100644
index 00000000..6b19c75d
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-udev-trigger.service
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=udev Coldplug all Devices
+Documentation=man:udev(7) man:systemd-udevd.service(8)
+DefaultDependencies=no
+Wants=systemd-udevd.service systemd-udev-settle.service
+After=systemd-udevd-kernel.socket systemd-udevd-control.socket
+Before=sysinit.target systemd-udev-settle.service
+ConditionCapability=CAP_MKNOD
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/udevadm trigger --type=subsystems --action=add ; /usr/bin/udevadm trigger --type=devices --action=add
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-udevd-control.socket b/core/modules/systemd/data/usr/lib/systemd/system/systemd-udevd-control.socket
new file mode 100644
index 00000000..ca17102d
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-udevd-control.socket
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=udev Control Socket
+Documentation=man:systemd-udevd.service(8) man:udev(7)
+DefaultDependencies=no
+Before=sockets.target
+ConditionCapability=CAP_MKNOD
+
+[Socket]
+Service=systemd-udevd.service
+ListenSequentialPacket=/run/udev/control
+SocketMode=0600
+PassCredentials=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-udevd-kernel.socket b/core/modules/systemd/data/usr/lib/systemd/system/systemd-udevd-kernel.socket
new file mode 100644
index 00000000..4b8a5b0f
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-udevd-kernel.socket
@@ -0,0 +1,19 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=udev Kernel Socket
+Documentation=man:systemd-udevd.service(8) man:udev(7)
+DefaultDependencies=no
+Before=sockets.target
+ConditionCapability=CAP_MKNOD
+
+[Socket]
+Service=systemd-udevd.service
+ReceiveBuffer=134217728
+ListenNetlink=kobject-uevent 1
+PassCredentials=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-udevd.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-udevd.service
new file mode 100644
index 00000000..2c33ce53
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-udevd.service
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=udev Kernel Device Manager
+Documentation=man:systemd-udevd.service(8) man:udev(7)
+DefaultDependencies=no
+Wants=systemd-udevd-control.socket systemd-udevd-kernel.socket
+After=systemd-udevd-control.socket systemd-udevd-kernel.socket
+Before=sysinit.target
+ConditionCapability=CAP_MKNOD
+
+[Service]
+Type=notify
+OOMScoreAdjust=-1000
+Sockets=systemd-udevd-control.socket systemd-udevd-kernel.socket
+Restart=always
+RestartSec=0
+ExecStart=/usr/lib/systemd/systemd-udevd
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-user-sessions.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-user-sessions.service
new file mode 100644
index 00000000..9226e3ea
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-user-sessions.service
@@ -0,0 +1,17 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Permit User Sessions
+Documentation=man:systemd-user-sessions.service(8)
+After=
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-user-sessions start
+ExecStop=/usr/lib/systemd/systemd-user-sessions stop
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/systemd-vconsole-setup.service b/core/modules/systemd/data/usr/lib/systemd/system/systemd-vconsole-setup.service
new file mode 100644
index 00000000..ce60c1bb
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/systemd-vconsole-setup.service
@@ -0,0 +1,20 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Setup Virtual Console
+Documentation=man:systemd-vconsole-setup.service(8) man:vconsole.conf(5)
+DefaultDependencies=no
+Conflicts=shutdown.target
+After=
+Before=sysinit.target shutdown.target
+ConditionPathExists=/dev/tty0
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/lib/systemd/systemd-vconsole-setup
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/time-sync.target b/core/modules/systemd/data/usr/lib/systemd/system/time-sync.target
new file mode 100644
index 00000000..54078069
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/time-sync.target
@@ -0,0 +1,14 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+# This exists mostly for compatibility with SysV/LSB units, and
+# implementations lacking socket/bus activation.
+
+[Unit]
+Description=System Time Synchronized
+Documentation=man:systemd.special(7)
+RefuseManualStart=yes
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/timers.target b/core/modules/systemd/data/usr/lib/systemd/system/timers.target
new file mode 100644
index 00000000..07fda3d9
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/timers.target
@@ -0,0 +1,10 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Timers
+Documentation=man:systemd.special(7)
diff --git a/core/modules/systemd/data/usr/lib/systemd/system/user@.service b/core/modules/systemd/data/usr/lib/systemd/system/user@.service
new file mode 100644
index 00000000..876c28c9
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/systemd/system/user@.service
@@ -0,0 +1,23 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=User Manager for %u
+After=systemd-user-sessions.service
+
+[Service]
+User=%I
+PAMName=systemd-shared
+# in order to allow MEM_CG features to work, add "memory:/" here
+ControlGroup=%R/user/%U.user/shared cpu:/
+ControlGroupModify=yes
+Type=notify
+ExecStart=-/usr/lib/systemd/systemd --user
+Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%U/dbus/user_bus_socket
+
+[Install]
+Alias=user@%i.service
diff --git a/core/modules/systemd/data/usr/lib/tmpfiles.d/etc.conf b/core/modules/systemd/data/usr/lib/tmpfiles.d/etc.conf
new file mode 100644
index 00000000..943bfea3
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/tmpfiles.d/etc.conf
@@ -0,0 +1,14 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+# See tmpfiles.d(5) for details
+
+L /etc/os-release - - - - ../usr/lib/os-release
+L /etc/localtime - - - - ../usr/share/zoneinfo/UTC
+L+ /etc/mtab - - - - ../proc/self/mounts
+L! /etc/resolv.conf - - - - ../run/systemd/resolve/resolv.conf
+
diff --git a/core/modules/systemd/data/usr/lib/udev/rules.d/70-uaccess-floppy.rules b/core/modules/systemd/data/usr/lib/udev/rules.d/70-uaccess-floppy.rules
new file mode 100644
index 00000000..113d288a
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/udev/rules.d/70-uaccess-floppy.rules
@@ -0,0 +1,8 @@
+ACTION=="remove", GOTO="floppy_extra_end"
+ENV{MAJOR}=="", GOTO="floppy_extra_end"
+
+# floppy devices
+SUBSYSTEM=="block", KERNEL=="fd[0-9]*", TAG+="uaccess"
+
+LABEL="floppy_extra_end"
+
diff --git a/core/modules/systemd/data/usr/lib/udev/rules.d/99-systemd.rules b/core/modules/systemd/data/usr/lib/udev/rules.d/99-systemd.rules
new file mode 100644
index 00000000..99cdf676
--- /dev/null
+++ b/core/modules/systemd/data/usr/lib/udev/rules.d/99-systemd.rules
@@ -0,0 +1,56 @@
+# This file is part of systemd.
+#
+# systemd 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 Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+ACTION=="remove", GOTO="systemd_end"
+
+SUBSYSTEM=="tty", KERNEL=="tty[0-9]|tty1[0-2]", TAG+="systemd"
+SUBSYSTEM=="tty", KERNEL=="tty[a-zA-Z]*|hvc*|xvc*|hvsi*", TAG+="systemd"
+
+KERNEL=="vport*", TAG+="systemd"
+
+SUBSYSTEM=="block", KERNEL!="ram*|loop*", TAG+="systemd"
+SUBSYSTEM=="block", KERNEL!="ram*|loop*", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", ENV{SYSTEMD_READY}="0"
+
+# Ignore encrypted devices with no identified superblock on it, since
+# we are probably still calling mke2fs or mkswap on it.
+
+SUBSYSTEM=="block", KERNEL!="ram*|loop*", ENV{DM_UUID}=="CRYPT-*", ENV{ID_PART_TABLE_TYPE}=="", ENV{ID_FS_USAGE}=="", ENV{SYSTEMD_READY}="0"
+
+# We need a hardware independent way to identify network devices. We
+# use the /sys/subsystem path for this. Current vanilla kernels don't
+# actually support that hierarchy right now, however upcoming kernels
+# will. HAL and udev internally support /sys/subsystem already, hence
+# it should be safe to use this here, too. This is mostly just an
+# identification string for systemd, so whether the path actually is
+# accessible or not does not matter as long as it is unique and in the
+# filesystem namespace.
+#
+# http://git.kernel.org/?p=linux/hotplug/udev.git;a=blob;f=libudev/libudev-enumerate.c;h=da831449dcaf5e936a14409e8e68ab12d30a98e2;hb=HEAD#l742
+
+SUBSYSTEM=="net", KERNEL=="eth*", TAG=="openslxignore", GOTO="systemd_end"
+
+SUBSYSTEM=="net", KERNEL=="br0|eth*", TAG+="systemd", ENV{SYSTEMD_ALIAS}="/sys/subsystem/net/devices/$name", ENV{SYSTEMD_WANTS}="network-interface@$name.service"
+SUBSYSTEM=="bluetooth", TAG+="systemd", ENV{SYSTEMD_ALIAS}="/sys/subsystem/bluetooth/devices/%k"
+
+SUBSYSTEM=="bluetooth", TAG+="systemd", ENV{SYSTEMD_WANTS}="bluetooth.target"
+ENV{ID_SMARTCARD_READER}=="*?", TAG+="systemd", ENV{SYSTEMD_WANTS}="smartcard.target"
+SUBSYSTEM=="sound", KERNEL=="card*", TAG+="systemd", ENV{SYSTEMD_WANTS}="sound.target"
+
+SUBSYSTEM=="printer", TAG+="systemd", ENV{SYSTEMD_WANTS}="printer.target"
+SUBSYSTEM=="usb", KERNEL=="lp*", TAG+="systemd", ENV{SYSTEMD_WANTS}="printer.target"
+SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{ID_USB_INTERFACES}=="*:0701??:*", TAG+="systemd", ENV{SYSTEMD_WANTS}="printer.target"
+
+# Apply sysctl variables to network devices (and only to those) as they appear.
+SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/usr/lib/systemd/systemd-sysctl --prefix=/proc/sys/net/ipv4/conf/$name --prefix=/proc/sys/net/ipv4/neigh/$name --prefix=/proc/sys/net/ipv6/conf/$name --prefix=/proc/sys/net/ipv6/neigh/$name"
+
+# Asynchronously mount file systems implemented by these modules as
+# soon as they are loaded.
+
+SUBSYSTEM=="module", KERNEL=="fuse", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="sys-fs-fuse-connections.mount"
+SUBSYSTEM=="module", KERNEL=="configfs", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="sys-kernel-config.mount"
+
+LABEL="systemd_end"
diff --git a/core/modules/systemd/module.build b/core/modules/systemd/module.build
new file mode 100644
index 00000000..4cd8541f
--- /dev/null
+++ b/core/modules/systemd/module.build
@@ -0,0 +1,111 @@
+#tool/distro specific functions for fetching, building and installing dependencies
+
+fetch_source () {
+ # systemd
+ download_untar "$REQUIRED_URL" "src/"
+
+ # starting with systemd 212 a new way of setting global environment is supported
+ # meaning we don't have to apply the patch needed til that version.
+ # patch src/core/socket.c if activated in the config file
+ if [ "x$REQUIRED_XATTR_PATCH" = "xyes" ]; then
+ pinfo "Patching 'src/core/socket.c' ..."
+ # patch it
+ if [ -e "src/$REQUIRED_VERSION/src/core/socket.c" ]; then
+ sed -i 's/^#include <attr\/xattr.h>$/#include <sys\/xattr.h>\n#include <attr\/xattr.h>/g' "src/$REQUIRED_VERSION/src/core/socket.c" \
+ || perror "Could not patch 'src/$REQUIRED_VERSION/src/core/socket.c'"
+ else
+ perror "'src/$REQUIRED_VERSION/src/core/socket.c' does not exist."
+ fi
+ fi
+ # now check if the old fix needs to be applied
+ # NOTE: only for systemd-204
+ if [ "x${REQUIRED_VERSION#systemd-}" = "x204" ]; then
+ # Patch PATH, HOME, USER environment
+ # TODO: Newer systemd versions support DefaultEnvironment=xxx in /etc/systemd/system.conf
+ # However, there were lots of changes after systemd 204, so we didn't update yet
+ # See http://cgit.freedesktop.org/systemd/systemd/tree/NEWS for changes.
+ patch -p0 src/systemd-*/src/core/main.c < ${MODULE_DIR}/systemd-openslx.patch || perror "Failed to apply openslx systemd patch."
+ elif [ "x${REQUIRED_VERSION#systemd-}" = "x229" ]; then
+ patch -p0 src/systemd-*/src/basic/path-util.h < ${MODULE_DIR}/systemd-openslx-229.patch || perror "Failed to apply openslx systemd patch."
+ else
+ # TODO use the above hint for setting environmenet through /etc/systemd/system.conf
+ pinfo "Missing..."
+ fi
+
+ # libkmod
+ download_untar "$REQUIRED_LIBKMOD_URL" "src/"
+}
+
+build () {
+ #build libkmod
+ pinfo "Building libkmod"
+ cd "${MODULE_WORK_DIR}/src/$REQUIRED_LIBKMOD_VERSION"
+ ./configure || perror "./configure kmod failed."
+ make || perror "kmod make failed."
+ DESTDIR="${MODULE_BUILD_DIR}" make install || perror "kmod make install failed."
+ cd - &> /dev/null
+
+ #build systemd
+ pinfo "Building systemd"
+ cd "${MODULE_WORK_DIR}/src/$REQUIRED_VERSION"
+ pinfo "calling configure in ${MODULE_WORK_DIR}/src/$REQUIRED_VERSION"
+
+ # Save potentially pre-used paths/flages
+ OLDLDFLAGS="$LDFLAGS"
+ OLDCPPFLAGS="$CPPFLAGS"
+ OLDPKG_CONFIG_PATH="$PKG_CONFIG_PATH"
+ OLDLD_LIBRARY_PATH="$LD_LIBRARY_PATH"
+
+ export LDFLAGS="$LDFLAGS -L${MODULE_BUILD_DIR}/usr/lib"
+ export CPPFLAGS="-I${MODULE_BUILD_DIR}/usr/include"
+ export PKG_CONFIG_PATH="${MODULE_BUILD_DIR}/usr/lib64/pkgconfig:${MODULE_BUILD_DIR}/usr/lib/pkgconfig"
+ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${MODULE_BUILD_DIR}/usr/lib:${MODULE_BUILD_DIR}/usr/lib64"
+
+ [ ! -e "./configure" ] && ./autogen.sh
+
+ ./configure \
+ --disable-manpages \
+ --enable-split-usr \
+ --sysconfdir="/etc" \
+ --enable-gtk-doc-html=no \
+ --disable-nls \
+ --disable-microhttpd \
+ --disable-bootchart \
+ --disable-quotacheck \
+ --disable-hostnamed \
+ --disable-timedated \
+ --disable-localed \
+ --disable-coredump \
+ --disable-keymap \
+ --without-python \
+ --enable-blkid \
+ --enable-acl \
+ --enable-pam \
+ --enable-kmod \
+ --with-pamlibdir="$SYS_PAM_MODULES_PATH" \
+ || perror "configure failed."
+
+ pinfo "calling make"
+ make || perror "make failed."
+ pinfo "calling make install"
+ DESTDIR="${MODULE_BUILD_DIR}" make install || perror "make install failed."
+ cd - &> /dev/null
+
+ # Restore used flags/paths:
+ export LDFLAGS="$OLDLDFLAGS"
+ export CPPFLAGS="$OLDCPPFLAGS"
+ export PKG_CONFIG_PATH="$OLDPKG_CONFIG_PATH"
+ export LD_LIBRARY_PATH="$OLDLD_LIBRARY_PATH"
+}
+
+post_copy() {
+ #old agetty version doesn't support --noclear option in getty service
+ if [ "x$(dpkg -s util-linux | grep Version: | cut -d' ' -f2)" == "x2.19.1-2ubuntu3" ]; then
+ sed -i "s/ExecStart=-\/sbin\/agetty --noclear %I 38400 linux/ExecStart=-\/sbin\/agetty %I 38400 linux/g" "${TARGET_BUILD_DIR}/usr/lib/systemd/system/getty@.service"
+ fi
+ # eg. systemd expects /bin/less:
+ if [ "$SYS_DISTRIBUTION" == "opensuse" -a "$SYS_VERSION" == "13.2" ]; then
+ ln -s /usr/bin/less "$TARGET_BUILD_DIR/bin/less"
+ fi
+}
+
diff --git a/core/modules/systemd/module.conf b/core/modules/systemd/module.conf
new file mode 100644
index 00000000..1bc0165e
--- /dev/null
+++ b/core/modules/systemd/module.conf
@@ -0,0 +1,66 @@
+REQUIRED_VERSION="systemd-204"
+REQUIRED_URL="http://www.freedesktop.org/software/systemd/${REQUIRED_VERSION}.tar.xz"
+REQUIRED_LIBKMOD_VERSION="kmod-14"
+REQUIRED_LIBKMOD_URL="http://www.kernel.org/pub/linux/utils/kernel/kmod/${REQUIRED_LIBKMOD_VERSION}.tar.gz"
+REQUIRED_BINARIES="
+ journalctl
+ loginctl
+ systemctl
+ systemd-analyze
+ systemd-ask-password
+ systemd-cat
+ systemd-cgls
+ systemd-cgtop
+ systemd-delta
+ systemd-detect-virt
+ systemd-inhibit
+ systemd-machine-id-setup
+ systemd-notify
+ systemd-nspawn
+ systemd-stdio-bridge
+ systemd-tmpfiles
+ systemd-tty-ask-password-agent
+ udevadm
+ systemd
+ systemd-ac-power
+ systemd-binfmt
+ systemd-cgroups-agent
+ systemd-fsck
+ systemd-initctl
+ systemd-journald
+ systemd-logind
+ systemd-modules-load
+ systemd-multi-seat-x
+ systemd-random-seed
+ systemd-readahead
+ systemd-remount-fs
+ systemd-reply-password
+ systemd-shutdown
+ systemd-shutdownd
+ systemd-sleep
+ systemd-sysctl
+ systemd-timestamp
+ systemd-udevd
+ systemd-update-utmp
+ systemd-user-sessions
+ systemd-vconsole-setup
+ systemd-fstab-generator
+ systemd-getty-generator
+ systemd-rc-local-generator
+ systemd-system-update-generator
+ accelerometer
+ ata_id
+ cdrom_id
+ collect
+ mtd_probe
+ scsi_id
+ v4l_id"
+REQUIRED_DIRECTORIES="
+ $SYS_PAM_MODULES_PATH
+ /etc
+ /usr/include
+ /usr/share/dbus-1
+ /usr/share/polkit-1
+ /usr/lib/udev
+ /usr/lib/tmpfiles.d
+"
diff --git a/core/modules/systemd/module.conf.centos b/core/modules/systemd/module.conf.centos
new file mode 100644
index 00000000..9232ea5f
--- /dev/null
+++ b/core/modules/systemd/module.conf.centos
@@ -0,0 +1,11 @@
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ libcap-devel
+ libudev-devel
+ dbus-devel
+ libxslt
+ libblkid-devel
+ libacl-devel
+ glib2-devel
+"
diff --git a/core/modules/systemd/module.conf.debian b/core/modules/systemd/module.conf.debian
new file mode 100644
index 00000000..2768b51c
--- /dev/null
+++ b/core/modules/systemd/module.conf.debian
@@ -0,0 +1,13 @@
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ dbus
+ pkg-config
+ libcap-dev
+ libudev-dev
+ libdbus-1-dev
+ xsltproc
+ libblkid-dev
+ libacl1-dev
+ libpam-dev
+"
diff --git a/core/modules/systemd/module.conf.fedora b/core/modules/systemd/module.conf.fedora
new file mode 100644
index 00000000..9232ea5f
--- /dev/null
+++ b/core/modules/systemd/module.conf.fedora
@@ -0,0 +1,11 @@
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ libcap-devel
+ libudev-devel
+ dbus-devel
+ libxslt
+ libblkid-devel
+ libacl-devel
+ glib2-devel
+"
diff --git a/core/modules/systemd/module.conf.opensuse b/core/modules/systemd/module.conf.opensuse
new file mode 100644
index 00000000..965333c4
--- /dev/null
+++ b/core/modules/systemd/module.conf.opensuse
@@ -0,0 +1,10 @@
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ libcap-devel
+ libudev-devel
+ dbus-1-devel
+ libxslt-tools
+ libblkid-devel
+ libacl-devel
+"
diff --git a/core/modules/systemd/module.conf.scientific b/core/modules/systemd/module.conf.scientific
new file mode 100644
index 00000000..54e62b96
--- /dev/null
+++ b/core/modules/systemd/module.conf.scientific
@@ -0,0 +1,37 @@
+REQUIRED_VERSION="systemd-204"
+REQUIRED_URL="http://www.freedesktop.org/software/systemd/${REQUIRED_VERSION}.tar.xz"
+
+REQUIRED_LIBKMOD_VERSION="kmod-12"
+REQUIRED_LIBKMOD_URL="http://www.kernel.org/pub/linux/utils/kernel/kmod/${REQUIRED_LIBKMOD_VERSION}.tar.gz"
+
+REQUIRED_UTILLINUX_VERSION="util-linux-2.23"
+REQUIRED_UTILLINUX_URL="ftp://ftp.kernel.org/pub/linux/utils/util-linux/v${REQUIRED_UTILLINUX_VERSION}/util-linux-${REQUIRED_UTILLINUX_VERSION}.tar.xz"
+
+REQUIRED_M4_VERSION="m4-1.4.16"
+REQUIRED_M4_URL="ftp://ftp.gnu.org/gnu/m4/${REQUIRED_M4_VERSION}.tar.xz"
+
+REQUIRED_AUTOCONF_VERSION="autoconf-2.69"
+REQUIRED_AUTOCONF_URL="ftp://ftp.gnu.org/gnu/autoconf/${REQUIRED_AUTOCONF_VERSION}.tar.xz"
+
+REQUIRED_AUTOMAKE_VERSION="automake-1.13"
+REQUIRED_AUTOMAKE_URL="ftp://ftp.gnu.org/gnu/automake/${REQUIRED_AUTOMAKE_VERSION}.tar.xz"
+
+REQUIRED_DBUS_VERSION="dbus-1.6.8"
+REQUIRED_DBUS_URL="http://dbus.freedesktop.org/releases/dbus/${REQUIRED_DBUS_VERSION}.tar.gz"
+
+
+
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ pkgconfig
+ libcap-devel
+ libudev-devel
+ dbus-devel
+ libxslt
+ libblkid-devel
+ libacl-devel
+ pam-devel
+ glib2-devel
+ expat-devel
+"
diff --git a/core/modules/systemd/module.conf.ubuntu b/core/modules/systemd/module.conf.ubuntu
new file mode 100644
index 00000000..e5dff817
--- /dev/null
+++ b/core/modules/systemd/module.conf.ubuntu
@@ -0,0 +1,12 @@
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ dbus
+ libcap-dev
+ libudev-dev
+ libdbus-1-dev
+ xsltproc
+ libblkid-dev
+ libacl1-dev
+ libpam-dev
+"
diff --git a/core/modules/systemd/module.conf.ubuntu.14 b/core/modules/systemd/module.conf.ubuntu.14
new file mode 100644
index 00000000..7b2f853c
--- /dev/null
+++ b/core/modules/systemd/module.conf.ubuntu.14
@@ -0,0 +1,71 @@
+REQUIRED_VERSION="systemd-204"
+REQUIRED_URL="http://www.freedesktop.org/software/systemd/${REQUIRED_VERSION}.tar.xz"
+REQUIRED_LIBKMOD_VERSION="kmod-14"
+REQUIRED_LIBKMOD_URL="http://www.kernel.org/pub/linux/utils/kernel/kmod/${REQUIRED_LIBKMOD_VERSION}.tar.xz"
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ gperf
+ dbus
+ pkg-config
+ libcap-dev
+ libudev-dev
+ libdbus-1-dev
+ xsltproc
+ libblkid-dev
+ libacl1-dev
+ libpam-dev
+"
+REQUIRED_BINARIES="
+ journalctl
+ loginctl
+ systemctl
+ systemd-analyze
+ systemd-ask-password
+ systemd-cat
+ systemd-cgls
+ systemd-cgtop
+ systemd-delta
+ systemd-detect-virt
+ systemd-inhibit
+ systemd-machine-id-setup
+ systemd-notify
+ systemd-nspawn
+ systemd-stdio-bridge
+ systemd-tmpfiles
+ systemd-tty-ask-password-agent
+ udevadm
+ systemd
+ systemd-ac-power
+ systemd-binfmt
+ systemd-cgroups-agent
+ systemd-fsck
+ systemd-initctl
+ systemd-journald
+ systemd-logind
+ systemd-modules-load
+ systemd-multi-seat-x
+ systemd-random-seed
+ systemd-readahead
+ systemd-remount-fs
+ systemd-reply-password
+ systemd-shutdown
+ systemd-shutdownd
+ systemd-sleep
+ systemd-sysctl
+ systemd-udevd
+ systemd-update-utmp
+ systemd-user-sessions
+ systemd-vconsole-setup
+ systemd-fstab-generator
+ systemd-getty-generator
+ systemd-rc-local-generator
+ systemd-system-update-generator
+ accelerometer
+ ata_id
+ cdrom_id
+ collect
+ mtd_probe
+ scsi_id
+ v4l_id
+"
+REQUIRED_XATTR_PATCH="yes"
diff --git a/core/modules/systemd/module.conf.ubuntu.16 b/core/modules/systemd/module.conf.ubuntu.16
new file mode 100644
index 00000000..2b5221d6
--- /dev/null
+++ b/core/modules/systemd/module.conf.ubuntu.16
@@ -0,0 +1,95 @@
+REQUIRED_VERSION="systemd-229"
+REQUIRED_URL="http://www.freedesktop.org/software/systemd/${REQUIRED_VERSION}.tar.xz"
+REQUIRED_URL="https://github.com/systemd/systemd/archive/v229.tar.gz"
+REQUIRED_LIBKMOD_VERSION="kmod-22"
+REQUIRED_LIBKMOD_URL="http://www.kernel.org/pub/linux/utils/kernel/kmod/${REQUIRED_LIBKMOD_VERSION}.tar.xz"
+REQUIRED_INSTALLED_PACKAGES="
+ intltool
+ libtool
+ gperf
+ dbus
+ pkg-config
+ libcap-dev
+ libudev-dev
+ libdbus-1-dev
+ xsltproc
+ libblkid-dev
+ libacl1-dev
+ libpam-dev
+ libgtk2.0-dev
+ libmount-dev
+"
+REQUIRED_BINARIES="
+ journalctl
+ loginctl
+ systemctl
+ systemd-ac-power
+ systemd-activate
+ systemd-analyze
+ systemd-ask-password
+ systemd-backlight
+ systemd-binfmt
+ systemd-bus-proxyd
+ systemd-cat
+ systemd-cgls
+ systemd-cgroups-agent
+ systemd-cgtop
+ systemd-dbus1-generator
+ systemd-debug-generator
+ systemd-delta
+ systemd-detect-virt
+ systemd-escape
+ systemd-firstboot
+ systemd-fsck
+ systemd-fstab-generator
+ systemd-getty-generator
+ systemd-gpt-auto-generator
+ systemd-hibernate-resume
+ systemd-hibernate-resume-generator
+ systemd-hwdb
+ systemd-inhibit
+ systemd-initctl
+ systemd-journald
+ systemd-logind
+ systemd-machine-id-setup
+ systemd-machined
+ systemd-modules-load
+ systemd-networkd
+ systemd-networkd-wait-online
+ systemd-notify
+ systemd-nspawn
+ systemd-path
+ systemd-random-seed
+ systemd-rc-local-generator
+ systemd-remount-fs
+ systemd-reply-password
+ systemd-resolve
+ systemd-resolved
+ systemd-rfkill
+ systemd-run
+ systemd-shutdown
+ systemd-sleep
+ systemd-socket-proxyd
+ systemd-stdio-bridge
+ systemd-sysctl
+ systemd-system-update-generator
+ systemd-sysusers
+ systemd-sysv-generator
+ systemd-timesyncd
+ systemd-tmpfiles
+ systemd-tty-ask-password-agent
+ systemd-udevd
+ systemd-update-done
+ systemd-update-utmp
+ systemd-user-sessions
+ systemd-vconsole-setup
+ udevadm
+ systemd
+ ata_id
+ cdrom_id
+ collect
+ mtd_probe
+ scsi_id
+ v4l_id
+"
+REQUIRED_XATTR_PATCH="no"
diff --git a/core/modules/systemd/systemd-openslx-229.patch b/core/modules/systemd/systemd-openslx-229.patch
new file mode 100644
index 00000000..c0437a84
--- /dev/null
+++ b/core/modules/systemd/systemd-openslx-229.patch
@@ -0,0 +1,11 @@
+--- basic/path-util.h.orig 2016-04-20 07:41:33.425103517 +0200
++++ basic/path-util.h 2016-04-20 07:42:27.192454435 +0200
+@@ -26,7 +26,7 @@
+ #include "macro.h"
+ #include "time-util.h"
+
+-#define DEFAULT_PATH_NORMAL "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
++#define DEFAULT_PATH_NORMAL "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/openslx/sbin:/opt/openslx/bin"
+ #define DEFAULT_PATH_SPLIT_USR DEFAULT_PATH_NORMAL ":/sbin:/bin"
+
+ #ifdef HAVE_SPLIT_USR
diff --git a/core/modules/systemd/systemd-openslx.patch b/core/modules/systemd/systemd-openslx.patch
new file mode 100644
index 00000000..ef6cb542
--- /dev/null
+++ b/core/modules/systemd/systemd-openslx.patch
@@ -0,0 +1,26 @@
+--- core/main.c 2013-05-09 15:45:50.000000000 +0200
++++ core/main.c 2013-12-19 14:46:03.020362993 +0100
+@@ -1477,9 +1477,9 @@
+ /* Set up PATH unless it is already set */
+ setenv("PATH",
+ #ifdef HAVE_SPLIT_USR
+- "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
++ "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ":/opt/openslx/sbin:/opt/openslx/bin",
+ #else
+- "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin",
++ "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin" ":/opt/openslx/sbin:/opt/openslx/bin",
+ #endif
+ arg_running_as == SYSTEMD_SYSTEM);
+
+@@ -1513,6 +1513,11 @@
+ unsetenv("LISTEN_FDS");
+ unsetenv("LISTEN_PID");
+
++ /* OpenSLX: "Fix" libc/nss/nss_ldap deadlock
++ * when not using nscd */
++ setenv("HOME", "/", 1);
++ setenv("USER", "root", 1);
++
+ /* All other variables are left as is, so that clients
+ * can still read them via /proc/1/environ */
+ }
diff --git a/core/modules/udisks/data/usr/share/polkit-1/rules.d/10-drives.rules b/core/modules/udisks/data/usr/share/polkit-1/rules.d/10-drives.rules
new file mode 100644
index 00000000..72c4fb16
--- /dev/null
+++ b/core/modules/udisks/data/usr/share/polkit-1/rules.d/10-drives.rules
@@ -0,0 +1,6 @@
+polkit.addRule(function(action, subject) {
+ if (action.id.indexOf("org.freedesktop.udisks") == 0) {
+ return polkit.Result.YES;
+ }
+});
+
diff --git a/core/modules/udisks/module.build b/core/modules/udisks/module.build
new file mode 100644
index 00000000..fb68512c
--- /dev/null
+++ b/core/modules/udisks/module.build
@@ -0,0 +1,50 @@
+
+fetch_source () {
+ :
+}
+
+build () {
+ COPYLIST="list_dpkg_output"
+ rm -f "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "$MODULE_BUILD_DIR"
+ mkdir -p "$MODULE_BUILD_DIR/etc/systemd/system/basic.target.wants" "$MODULE_BUILD_DIR/usr/share/dbus-1/system-services"
+ local FOUND=no
+ local BINARY=$(find "$MODULE_BUILD_DIR" -name udisksd -executable | head -n 1)
+ [ -z "$BINARY" ] && BINARY=$(find "$MODULE_BUILD_DIR" -name udisks2d -executable | head -n 1)
+ [ -z "$BINARY" ] && BINARY=$(find "$MODULE_BUILD_DIR" -name udisksd2 -executable | head -n 1)
+ VER=none
+ if [ -n "$BINARY" ]; then
+ VER=udisks
+ [[ "$BINARY" == *udisks2* || -d "$MODULE_BUILD_DIR/usr/lib/udisks2" ]] && VER=udisks2
+ create_udisks_service "$VER" "$BINARY"
+ FOUND=yes
+ fi
+ if [ "$VER" != "udisks" ]; then
+ BINARY=$(find "$MODULE_BUILD_DIR" -name udisks-daemon -executable | head -n 1)
+ [ "$VER" == "none" -a -z "$BINARY" ] && perror "Could not determine the udisks(1/2) daemon binary from inspecting $MODULE_BUILD_DIR"
+ [ -n "$BINARY" ] && create_udisks_service "udisks" "$BINARY"
+ fi
+}
+
+post_copy () {
+ :
+}
+
+create_udisks_service () {
+ [ $# -ne 2 ] && perror "Call create_udisks_service with TWO params!"
+ local BINARY="/${2#$MODULE_BUILD_DIR}"
+ if [ "$1" == "udisks2" ]; then
+ # assume udisks v2
+ sed "s,%UDISKSD%,$BINARY,g" ${MODULE_DIR}/templates/udisks2.systemd.service > "$MODULE_BUILD_DIR/etc/systemd/system/udisks2.service" || perror "Error creating systemd service for udisks2 $BINARY"
+ sed "s,%UDISKSD%,$BINARY,g" ${MODULE_DIR}/templates/udisks2.dbus.service > "$MODULE_BUILD_DIR/usr/share/dbus-1/system-services/org.freedesktop.UDisks2.service" || perror "Error creating dbus service for udisks2"
+ ln -s "../udisks2.service" "$MODULE_BUILD_DIR/etc/systemd/system/basic.target.wants/udisks2.service"
+ else
+ # assume udisks v1
+ sed "s,%UDISKSD%,$BINARY,g" ${MODULE_DIR}/templates/udisks.systemd.service > "$MODULE_BUILD_DIR/etc/systemd/system/udisks.service" || perror "Error creating systemd service for udisks $BINARY"
+ sed "s,%UDISKSD%,$BINARY,g" ${MODULE_DIR}/templates/udisks.dbus.service > "$MODULE_BUILD_DIR/usr/share/dbus-1/system-services/org.freedesktop.UDisks.service" || perror "Error creating dbus service for udisks"
+ ln -s "../udisks.service" "$MODULE_BUILD_DIR/etc/systemd/system/basic.target.wants/udisks.service"
+ fi
+}
+
diff --git a/core/modules/udisks/module.conf b/core/modules/udisks/module.conf
new file mode 100644
index 00000000..8ef6f29c
--- /dev/null
+++ b/core/modules/udisks/module.conf
@@ -0,0 +1,14 @@
+# This module is a little special, as it's supposed to be compatible
+# with udisks 1 and 2. suse 12.3 and ubuntu 13.04 use udisks2, ubuntu 12.04
+# uses udisks1. The build script looks a little hacky
+REQUIRED_DIRECTORIES="
+ /etc/dbus-1
+ /usr/lib/udev/rules.d
+ /usr/share/dbus-1
+ /usr/share/polkit-1
+ /etc/systemd/system
+"
+REQUIRED_BINARIES="
+ udisksd
+"
+
diff --git a/core/modules/udisks/module.conf.debian b/core/modules/udisks/module.conf.debian
new file mode 100644
index 00000000..c32a5f24
--- /dev/null
+++ b/core/modules/udisks/module.conf.debian
@@ -0,0 +1,32 @@
+REQUIRED_INSTALLED_PACKAGES="
+ udisks
+"
+REQUIRED_CONTENT_PACKAGES="
+ udisks
+"
+# Override: Only udisks1 is available
+REQUIRED_BINARIES="
+ udisks-helper-linux-md-check
+ udisks-daemon
+ udisks-helper-change-luks-password
+ udisks-helper-create-partition-table
+ udisks-helper-mdadm-expand
+ udisks-helper-drive-benchmark
+ udisks-helper-drive-detach
+ udisks-helper-mkfs
+ udisks-helper-ata-smart-collect
+ udisks-helper-change-filesystem-label
+ udisks-helper-modify-partition
+ udisks-helper-delete-partition
+ udisks-helper-create-partition
+ udisks-helper-fstab-mounter
+ udisks-helper-linux-md-remove-component
+ udisks-helper-ata-smart-selftest
+ udisks-helper-drive-poll
+ udisks-dm-export
+ udisks-lvm-pv-export
+ udisks-part-id
+ udisks-probe-ata-smart
+ udisks-probe-sas-expander
+"
+
diff --git a/core/modules/udisks/module.conf.fedora b/core/modules/udisks/module.conf.fedora
new file mode 100644
index 00000000..abf12be7
--- /dev/null
+++ b/core/modules/udisks/module.conf.fedora
@@ -0,0 +1,7 @@
+REQUIRED_INSTALLED_PACKAGES="
+ udisks2
+"
+REQUIRED_CONTENT_PACKAGES="
+ udisks2
+"
+
diff --git a/core/modules/udisks/module.conf.opensuse b/core/modules/udisks/module.conf.opensuse
new file mode 100644
index 00000000..abf12be7
--- /dev/null
+++ b/core/modules/udisks/module.conf.opensuse
@@ -0,0 +1,7 @@
+REQUIRED_INSTALLED_PACKAGES="
+ udisks2
+"
+REQUIRED_CONTENT_PACKAGES="
+ udisks2
+"
+
diff --git a/core/modules/udisks/module.conf.ubuntu b/core/modules/udisks/module.conf.ubuntu
new file mode 100644
index 00000000..3d127619
--- /dev/null
+++ b/core/modules/udisks/module.conf.ubuntu
@@ -0,0 +1,34 @@
+REQUIRED_INSTALLED_PACKAGES="
+ udisks
+ udisks2
+"
+REQUIRED_CONTENT_PACKAGES="
+ udisks
+ udisks2
+"
+# Add these for udisks 1 (required by kde)
+REQUIRED_BINARIES+="
+ udisks-helper-linux-md-check
+ udisks-daemon
+ udisks-helper-change-luks-password
+ udisks-helper-create-partition-table
+ udisks-helper-mdadm-expand
+ udisks-helper-drive-benchmark
+ udisks-helper-drive-detach
+ udisks-helper-mkfs
+ udisks-helper-ata-smart-collect
+ udisks-helper-change-filesystem-label
+ udisks-helper-modify-partition
+ udisks-helper-delete-partition
+ udisks-helper-create-partition
+ udisks-helper-fstab-mounter
+ udisks-helper-linux-md-remove-component
+ udisks-helper-ata-smart-selftest
+ udisks-helper-drive-poll
+ udisks-dm-export
+ udisks-lvm-pv-export
+ udisks-part-id
+ udisks-probe-ata-smart
+ udisks-probe-sas-expander
+"
+
diff --git a/core/modules/udisks/module.conf.ubuntu.12 b/core/modules/udisks/module.conf.ubuntu.12
new file mode 100644
index 00000000..b962ec65
--- /dev/null
+++ b/core/modules/udisks/module.conf.ubuntu.12
@@ -0,0 +1,31 @@
+REQUIRED_INSTALLED_PACKAGES="
+ udisks
+"
+REQUIRED_CONTENT_PACKAGES="
+ udisks
+"
+REQUIRED_BINARIES="
+ udisks-helper-linux-md-check
+ udisks-daemon
+ udisks-helper-change-luks-password
+ udisks-helper-create-partition-table
+ udisks-helper-mdadm-expand
+ udisks-helper-drive-benchmark
+ udisks-helper-drive-detach
+ udisks-helper-mkfs
+ udisks-helper-ata-smart-collect
+ udisks-helper-change-filesystem-label
+ udisks-helper-modify-partition
+ udisks-helper-delete-partition
+ udisks-helper-create-partition
+ udisks-helper-fstab-mounter
+ udisks-helper-linux-md-remove-component
+ udisks-helper-ata-smart-selftest
+ udisks-helper-drive-poll
+ udisks-dm-export
+ udisks-lvm-pv-export
+ udisks-part-id
+ udisks-probe-ata-smart
+ udisks-probe-sas-expander
+"
+
diff --git a/core/modules/udisks/module.conf.ubuntu.14 b/core/modules/udisks/module.conf.ubuntu.14
new file mode 100644
index 00000000..9ec7f52f
--- /dev/null
+++ b/core/modules/udisks/module.conf.ubuntu.14
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ udisks2
+"
+REQUIRED_CONTENT_PACKAGES="
+ udisks2
+"
diff --git a/core/modules/udisks/module.conf.ubuntu.16 b/core/modules/udisks/module.conf.ubuntu.16
new file mode 100644
index 00000000..9ec7f52f
--- /dev/null
+++ b/core/modules/udisks/module.conf.ubuntu.16
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ udisks2
+"
+REQUIRED_CONTENT_PACKAGES="
+ udisks2
+"
diff --git a/core/modules/udisks/templates/udisks.dbus.service b/core/modules/udisks/templates/udisks.dbus.service
new file mode 100644
index 00000000..f48b064b
--- /dev/null
+++ b/core/modules/udisks/templates/udisks.dbus.service
@@ -0,0 +1,6 @@
+[D-BUS Service]
+Name=org.freedesktop.UDisks
+Exec=%UDISKSD% --no-debug
+User=root
+SystemdService=udisks.service
+
diff --git a/core/modules/udisks/templates/udisks.systemd.service b/core/modules/udisks/templates/udisks.systemd.service
new file mode 100644
index 00000000..d0c41438
--- /dev/null
+++ b/core/modules/udisks/templates/udisks.systemd.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Gnomes bloated 1000 dependency monster aka Disk Manager
+Documentation=man:udisks(8)
+
+[Service]
+Type=dbus
+BusName=org.freedesktop.UDisks
+ExecStart=%UDISKSD% --no-debug
+
diff --git a/core/modules/udisks/templates/udisks2.dbus.service b/core/modules/udisks/templates/udisks2.dbus.service
new file mode 100644
index 00000000..2761a67c
--- /dev/null
+++ b/core/modules/udisks/templates/udisks2.dbus.service
@@ -0,0 +1,6 @@
+[D-BUS Service]
+Name=org.freedesktop.UDisks2
+Exec=%UDISKSD% --no-debug
+User=root
+SystemdService=udisks2.service
+
diff --git a/core/modules/udisks/templates/udisks2.systemd.service b/core/modules/udisks/templates/udisks2.systemd.service
new file mode 100644
index 00000000..d96bd69f
--- /dev/null
+++ b/core/modules/udisks/templates/udisks2.systemd.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Gnomes bloated 1000 dependency monster aka Disk Manager 2
+Documentation=man:udisks(8)
+
+[Service]
+Type=dbus
+BusName=org.freedesktop.UDisks2
+ExecStart=%UDISKSD% --no-debug
+
diff --git a/core/modules/vbox/README b/core/modules/vbox/README
new file mode 100644
index 00000000..142bce5e
--- /dev/null
+++ b/core/modules/vbox/README
@@ -0,0 +1,30 @@
+Patched scripts:
+
+Some virtualbox script are patched to accomodate some changes in system
+environment: As openSLX uses predominantly busybox, paths to busybox exe-
+cutables (respective links) are inserted. These insertions are made at the
+end of paths, as sometimes there are system binaries predomninantly used,
+for example ps, as busybox ps does not offer needed options.
+
+This patched scripts include virtualbox and vboxmanage, originally links
+to VBox. Please note these patched scripts are unlinked, thus solitary,
+please note there is also a (linked) scripts named VBoxManage (note capitals).
+
+It is therefore recommended to use the lower case version (vboxmanage).
+
+
+systemd capabilites:
+
+The systemd-udevd compiled within the module systemd lacks a capability in
+the environment variable DEVTYPE at least in regard to USB devices, so an
+entry ENV{DEVTYPE}=="usb_device" in an udev rule file rule will not work.
+
+This applies to several versions, tested so far 195, 204, 206.
+In contrast to this a hand-copied distribution binary will work flawlessly
+within the openSLX biotope.
+
+It does not seem possible right now to circumvent this problem, as this kind
+of problem seems to be unknown even irc/systemd development group. So as a
+workaround the systemd-udevd will be restarted in addon-init. But the danger
+of losing queue messages needs to be kept in mind, and if a solution arises,
+the udevd restart line should be deleted.
diff --git a/core/modules/vbox/data/addon-init b/core/modules/vbox/data/addon-init
new file mode 100755
index 00000000..afeb8c62
--- /dev/null
+++ b/core/modules/vbox/data/addon-init
@@ -0,0 +1,17 @@
+#!/bin/ash
+
+addgroup vboxusers
+nscd -i group
+# Will be done by PAM now: addgroup demo vboxusers
+
+if grep -q usb_device /proc/devices; then
+ mkdir -p -m 0750 /dev/vboxusb 2>/dev/null
+ chown root:vboxusers /dev/vboxusb 2>/dev/null
+fi
+
+systemctl daemon-reload
+systemctl start vbox.service
+
+# this seems to be necessary due to the misbehaviour of udevd
+# in view of the undetected ENV dev_type
+systemctl restart systemd-udevd
diff --git a/core/modules/vbox/data/etc/systemd/system/graphical.target.wants/vbox.service b/core/modules/vbox/data/etc/systemd/system/graphical.target.wants/vbox.service
new file mode 120000
index 00000000..b8591bd1
--- /dev/null
+++ b/core/modules/vbox/data/etc/systemd/system/graphical.target.wants/vbox.service
@@ -0,0 +1 @@
+../vbox.service \ No newline at end of file
diff --git a/core/modules/vbox/data/etc/systemd/system/vbox.service b/core/modules/vbox/data/etc/systemd/system/vbox.service
new file mode 100644
index 00000000..ad7c5739
--- /dev/null
+++ b/core/modules/vbox/data/etc/systemd/system/vbox.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Sets up the virtual box environment
+Requires=vmchooser.service
+After=vmchooser.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-vbox_env start
diff --git a/core/modules/vbox/data/etc/udev/rules.d/60-vboxdrv.rules b/core/modules/vbox/data/etc/udev/rules.d/60-vboxdrv.rules
new file mode 100644
index 00000000..f2caa1cf
--- /dev/null
+++ b/core/modules/vbox/data/etc/udev/rules.d/60-vboxdrv.rules
@@ -0,0 +1,7 @@
+KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600"
+KERNEL=="vboxdrvu", NAME="vboxdrvu", OWNER="root", GROUP="root", MODE="0666"
+KERNEL=="vboxnetctl", NAME="vboxnetctl", OWNER="root", GROUP="root", MODE="0660"
+SUBSYSTEM=="usb_device", ACTION=="add", ENV{PATH}="/usr/bin:/bin:/usr/sbin:/sbin:/opt/openslx/bin:/opt/openslx/sbin", RUN+="/usr/share/virtualbox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass}"
+SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", ENV{PATH}="/usr/bin:/bin:/usr/sbin:/sbin:/opt/openslx/bin:/opt/openslx/sbin", RUN+="/usr/share/virtualbox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass}"
+SUBSYSTEM=="usb_device", ACTION=="remove", ENV{PATH}="/usr/bin:/bin:/usr/sbin:/sbin:/opt/openslx/bin:/opt/openslx/sbin", RUN+="/usr/share/virtualbox/VBoxCreateUSBNode.sh --remove $major $minor"
+SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", ENV{PATH}="/usr/bin:/bin:/usr/sbin:/sbin:/opt/openslx/bin:/opt/openslx/sbin", RUN+="/usr/share/virtualbox/VBoxCreateUSBNode.sh --remove $major $minor"
diff --git a/core/modules/vbox/data/opt/openslx/scripts/systemd-vbox_env b/core/modules/vbox/data/opt/openslx/scripts/systemd-vbox_env
new file mode 100755
index 00000000..a5a298ee
--- /dev/null
+++ b/core/modules/vbox/data/opt/openslx/scripts/systemd-vbox_env
@@ -0,0 +1,55 @@
+#!/bin/ash
+# -----------------------------------------------------------------------------
+# Copyright (c) 2007..2013 - RZ Uni FR
+# Copyright (c) 2007..2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# systemd-vbox_env
+# - This is the preparation script for the configuration of VirtualBox.
+################################################################################
+
+export PATH="$PATH":/opt/openslx/bin:/opt/openslx/sbin
+VBOX_CONF_DIR=/opt/openslx/etc/vbox
+VBOXMANAGE=$(which vboxmanage)
+
+# create required standard directories
+mkdir -p "/tmp/virt/virtualbox" -m 1777
+
+# load required Vbox modules
+for module in vboxdrv.ko vboxnetadp.ko vboxnetflt.ko vboxpci.ko ; do
+ insmod /lib/modules/vbox/${module} || slxlog "vbox-systemd" "Loading of ${module} failed."
+done
+
+# unload modules if proper systemd shutdown is provided
+#unload_modules () {
+# rmmod vboxpci vboxnetflt vboxnetadp vboxdrv
+#}
+
+# Should be done by udev rule - no mknod needed.
+# mknod -m 0660 /dev/vboxdrv c 10 59
+
+chown root:vboxusers /dev/vboxdrv
+chmod 666 /dev/vboxdrv
+chown root:vboxusers /dev/vboxdrvu
+chmod 666 /dev/vboxdrvu
+chown root:vboxusers /dev/vboxusb
+chmod 755 /dev/vboxusb
+
+# pretty dumb you can just create host-only interfaces, but not assign a specific
+# name/number
+vboxmanage hostonlyif create
+ip link set dev vboxnet0 up
+brctl addif br0 vboxnet0
+vboxmanage hostonlyif create
+ip link set dev vboxnet1 up
+brctl addif nat1 vboxnet1
+vboxmanage hostonlyif create
+ip link set dev vboxnet2 up
+brctl addif vsw2 vboxnet2
diff --git a/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/empty-diff.vdi.gz b/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/empty-diff.vdi.gz
new file mode 100644
index 00000000..c6abbd57
--- /dev/null
+++ b/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/empty-diff.vdi.gz
Binary files differ
diff --git a/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include b/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include
new file mode 100644
index 00000000..1f0b209a
--- /dev/null
+++ b/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/machine.include
@@ -0,0 +1,194 @@
+# -----------------------------------------------------------------------------
+# Copyright (c) 2010..2012 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# Include file (general template) for run-virt.include of the virtualbox plugin
+
+cat << EOF > "${machconfig}"
+<?xml version="1.0"?>
+<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.14-linux">
+ <Machine uuid="{${machineuuid}}" name="${vm_name}" OSType="${vmostype}">
+ <MediaRegistry>
+ <HardDisks>
+ <HardDisk uuid="{${diskuuid}}" location="${diskfile}" format="${imgfmt}" type="${imgtype}"/>
+ </HardDisks>
+ <FloppyImages/>
+ </MediaRegistry>
+<!--
+ <ExtraData>
+ <ExtraDataItem name="GUI/LastGuestSizeHint" value="1024,768"/>
+ <ExtraDataItem name="GUI/LastNormalWindowPosition" value="2393,123,1024,809"/>
+ </ExtraData>
+-->
+ <Hardware version="2">
+ <CPU count="${cpu_cores}" hotplug="false">
+ <HardwareVirtEx enabled="${enablevt}"/>
+ <HardwareVirtExNestedPaging enabled="${npaging}"/>
+ <HardwareVirtExVPID enabled="true"/>
+ <HardwareVirtExUX enabled="true"/>
+ <PAE enabled="true"/>
+ <LongMode enabled="false"/>
+ <HardwareVirtExLargePages enabled="false"/>
+ <HardwareVirtForce enabled="false"/>
+ </CPU>
+ <Memory RAMSize="${mem}" PageFusion="false"/>
+ <HID Pointing="USBTablet" Keyboard="PS2Keyboard"/>
+ <HPET enabled="false"/>
+ <Chipset type="ICH9"/>
+ <Boot>
+ <Order position="1" device="${boot}"/> <!-- HardDisk, DVD, Network, Floppy -->
+ <Order position="2" device="None"/>
+ <Order position="3" device="None"/>
+ <Order position="4" device="None"/>
+ </Boot>
+ <Display VRAMSize="${vram}" monitorCount="1" accelerate3D="${enable3d}" accelerate2DVideo="${enable2d}"/>
+
+<!-- <VideoCapture enabled="false" screens="18446744073709551615" horzRes="1024" vertRes="768" rate="512" fps="25"/> -->
+
+ <RemoteDisplay enabled="false" port="${vrdpport}" authType="Null" authTimeout="5000"/>
+ <BIOS>
+ <ACPI enabled="true"/>
+ <IOAPIC enabled="true"/>
+ <Logo fadeIn="false" fadeOut="false" displayTime="0"/>
+ <BootMenu mode="MessageAndMenu"/>
+ <TimeOffset value="0"/>
+ <PXEDebug enabled="false"/>
+ </BIOS>
+<!-- ehci ussw. noch prüfen! -->
+ <USB>
+ <Controllers>
+ <Controller name="OHCI" type="OHCI"/>
+ <Controller name="EHCI" type="EHCI"/>
+ </Controllers>
+ <DeviceFilters>
+ <DeviceFilter name="Leerfilter" active="true" remote="0"/>
+ </DeviceFilters>
+ </USB>
+ <Network>
+ <Adapter slot="0" enabled="true" MACAddress="${macaddr}" cable="true" speed="0" type="${vb_network_card}">
+ <${network_kind}/>
+ </Adapter>
+ <Adapter slot="1" enabled="false" MACAddress="${vdemacaddr}" cable="true" speed="0" type="${vb_network_card}">
+ <GenericInterface driver="VDE">
+ <Properties name="network" value="/tmp/vde-switch"/>
+ </GenericInterface>
+ </Adapter>
+ <Adapter slot="2" enabled="false" MACAddress="080027CB8CD8" cable="true" speed="0" type="82540EM" />
+ <Adapter slot="3" enabled="false" MACAddress="080027424034" cable="true" speed="0" type="82540EM" />
+ <Adapter slot="4" enabled="false" MACAddress="0800272CD0EA" cable="true" speed="0" type="82540EM" />
+ <Adapter slot="5" enabled="false" MACAddress="080027ED7227" cable="true" speed="0" type="82540EM" />
+ <Adapter slot="6" enabled="false" MACAddress="080027B77757" cable="true" speed="0" type="82540EM" />
+ <Adapter slot="7" enabled="false" MACAddress="0800272267D8" cable="true" speed="0" type="82540EM" />
+ <Adapter slot="8" enabled="false" MACAddress="080027573BF5" cable="true" speed="0" type="Am79C973" />
+ </Network>
+ <UART>
+ <Port slot="0" enabled="false" IOBase="0x3f8" IRQ="4" hostMode="Disconnected"/>
+ <Port slot="1" enabled="false" IOBase="0x2f8" IRQ="3" hostMode="Disconnected"/>
+ </UART>
+ <LPT>
+ <Port slot="0" enabled="false" IOBase="0x378" IRQ="7"/>
+ <Port slot="1" enabled="false" IOBase="0x378" IRQ="7"/>
+ </LPT>
+<!-- <AudioAdapter controller="${guestaudio}" driver="Pulse" enabled="true"/> -->
+ <AudioAdapter controller="${guestaudio}" driver="Alsa" enabled="${audio}"/>
+ <RTC localOrUTC="UTC"/>
+ <!-- should be configured depending on the chosen operating system -->
+ $sharelist
+<!-- <SharedFolders>
+ <SharedFolder name="${sharename}" hostPath="${sharepath}" writable="true"/>
+ <SharedFolder name="${homesharename}" hostPath="${homesharepath}" writable="true"/>
+ <SharedFolder name="${commonsharename}" hostPath="${commonsharepath}" writable="true"/>
+ </SharedFolders> -->
+<!-- <Clipboard mode="Disabled"/> -->
+ <Clipboard mode="Bidirectional"/>
+ <DragAndDrop mode="Disabled"/>
+ <IO>
+ <IoCache enabled="true" size="5"/>
+ <BandwidthGroups/>
+ </IO>
+ <HostPci>
+ <Devices/>
+ </HostPci>
+ <EmulatedUSB>
+ <CardReader enabled="false"/>
+ </EmulatedUSB>
+ <Guest memoryBalloonSize="0"/>
+ <GuestProperties>
+<!-- <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxControl.exe" value="4.3.26r98988" timestamp="1430324928738330000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxCredProv.dll" value="-" timestamp="1430324928808993000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxDisp.dll" value="4.3.26r98988" timestamp="1430324928752750000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxGINA.dll" value="-" timestamp="1430324928808417000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxGuest.sys" value="4.3.26r98988" timestamp="1430324928908144000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxHook.dll" value="4.3.26r98988" timestamp="1430324928750553000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxMMR.exe" value="-" timestamp="1430324928809525000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxMMRHook.dll" value="-" timestamp="1430324928809992000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxMRXNP.dll" value="4.3.26r98988" timestamp="1430324928777003000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxMouse.sys" value="4.3.26r98988" timestamp="1430324928909743000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxOGL.dll" value="4.3.26r98988" timestamp="1430324928901186000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxOGLarrayspu.dll" value="4.3.26r98988" timestamp="1430324928823307000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxOGLcrutil.dll" value="4.3.26r98988" timestamp="1430324928837623000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxOGLerrorspu.dll" value="4.3.26r98988" timestamp="1430324928846343000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxOGLfeedbackspu.dll" value="4.3.26r98988" timestamp="1430324928884750000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxOGLpackspu.dll" value="4.3.26r98988" timestamp="1430324928865359000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxOGLpassthroughspu.dll" value="4.3.26r98988" timestamp="1430324928872533000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxSF.sys" value="4.3.26r98988" timestamp="1430324928911340000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxService.exe" value="4.3.26r98988" timestamp="1430324928784233000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxTray.exe" value="4.3.26r98988" timestamp="1430324928807478000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Components/VBoxVideo.sys" value="4.3.26r98988" timestamp="1430324928913222000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/HostVerLastChecked" value="4.3.26" timestamp="1430324950071952000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/InstallDir" value="C:/Program Files/Oracle/VirtualBox_Guest_Additions" timestamp="1430324928718085000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Revision" value="98988" timestamp="1430324928712396000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/Version" value="4.3.26" timestamp="1430324928711533000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestAdd/VersionExt" value="4.3.26" timestamp="1430324928711988000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/MAC" value="080027CAF695" timestamp="1430324954369734000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/Status" value="Up" timestamp="1430324954369295000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/Broadcast" value="255.255.255.255" timestamp="1430324954368391000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/IP" value="10.0.2.15" timestamp="1430324954367074000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/0/V4/Netmask" value="255.255.255.0" timestamp="1430324954368890000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/Net/Count" value="1" timestamp="1430324984558751000" flags=""/>
+-->
+<!--
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/LoggedInUsers" value="1" timestamp="1430324933845802000" flags="TRANSIENT, TRANSRESET"/>
+-->
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/LoggedInUsersList" value="student" timestamp="1430324933844717000" flags="TRANSIENT, TRANSRESET"/>
+<!--
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/NoLoggedInUsers" value="false" timestamp="1430324933847595000" flags="TRANSIENT, TRANSRESET"/>
+-->
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/Product" value="Windows 7" timestamp="1430324928709396000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/Release" value="6.1.7601" timestamp="1430324928710175000" flags=""/>
+<!--
+ <GuestProperty name="/VirtualBox/GuestInfo/OS/ServicePack" value="1" timestamp="1430324928711029000" flags=""/>
+ <GuestProperty name="/VirtualBox/GuestInfo/User/student@student-PC/UsageState" value="Idle" timestamp="1430324979531817000" flags="TRANSIENT, TRANSRESET"/>
+ <GuestProperty name="/VirtualBox/HostInfo/GUI/LanguageID" value="de_DE" timestamp="1430324985485377000" flags=""/>
+-->
+ </GuestProperties>
+ </Hardware>
+ <StorageControllers>
+ <StorageController name="IDE" type="PIIX4" PortCount="2" useHostIOCache="true" Bootable="true">
+ <AttachedDevice type="HardDisk" port="0" device="0">
+ <Image uuid="${imageuuid}"/>
+ </AttachedDevice> <!-- PLEASE DO NOT REMOVE THIS COMMENT (HD)!!! -->
+ <AttachedDevice passthrough="false" type="DVD" port="0" device="1">
+ <HostDrive src="${cdrom_0}"/>
+<!-- <Image uuid="{849a61c7-ad64-4594-b0c8-fbe17dc3d2a6}"/> -->
+ </AttachedDevice> <!-- PLEASE DO NOT REMOVE THIS COMMENT (CD)!!! -->
+ </StorageController>
+ <StorageController name="Floppy Controller" type="I82078" PortCount="1">
+ <AttachedDevice type="Floppy" port="0" device="0">
+ </AttachedDevice>
+ <AttachedDevice type="Floppy" port="0" device="1">
+ <Image uuid="{288d5452-2dd3-44f2-bfc8-78e205a4fa87}"/>
+ </AttachedDevice>
+ </StorageController>
+ </StorageControllers>
+ </Machine>
+</VirtualBox>
+EOF
+
diff --git a/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include b/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include
new file mode 100755
index 00000000..1b116f32
--- /dev/null
+++ b/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/run-virt.include
@@ -0,0 +1,436 @@
+# -----------------------------------------------------------------------------
+# Copyright (c) 2009..2011 - RZ Uni Freiburg
+# Copyright (c) 2009..2013 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# run-virt.include
+# - component for virtualbox of the vmchooser plugin vmchooser-run_virt
+################################################################################
+
+################################################################################
+### declaration of default variables
+################################################################################
+
+VMCHOOSERVBOX="/opt/openslx/vmchooser/${self}"
+confdir="${TMPDIR}/vbox" # dir for configs
+export VBOX_USER_HOME=${confdir} # instead of $HOME/.VirtualBox
+# define dirs and files which can be removed after exit, be carefull!
+# TODO: Machanism not in use anymore. A better approach would be anyways to
+# Define a fixed directory which can be deleted recursively on exit. $TMPDIR
+# would be a start.
+#RMDIRS="${snapshotdir} ${confdir} /tmp/virt/.vbox-${USER}-ipc"
+# rm -rf ${RMDIRS} 2>/dev/null
+machfolder="${confdir}/Machines"
+# use vm_shortname for dir and config names since vm_name can be very long
+machconfig="${machfolder}/${vm_shortname}/${vm_shortname}.xml"
+diskfolder="${confdir}/HardDisks"
+snapshotdir=${machfolder}/${vm_shortname}/Snapshots
+mkdir -p ${diskfolder} ${snapshotdir} 2>/dev/null
+[ -z "${diskless}" ] && diskless=0 # check if diskless var empty?
+guestaudio="HDA" # default guest audio controller (SB16, AC97, HDA)
+vb_network_card="82540EM" # default guest network adaptor (Am79C970A, Am79C973, 82540EM)
+enable2d="true" # default setting for accelerated 2D grapics (OS dependent)
+vram="128" # set default graphics ram
+
+# configure our own rwimg, empty image which we provide
+if [ "${imgmode}" = "rwimg" ]; then
+ imgname="${vm_shortname}.vdi" # what is our rwimg called?
+ vmpath=${imgpath}/${imgname}
+ if ! [ -e "${vmpath}" ]; then
+ cat /opt/openslx/vmchooser/virtualbox/rwimg.vdi.gz | gunzip > "${vmpath}"
+ fi
+fi
+
+# link to image
+diskfile="${diskfolder}/${imgname}"
+[ ${diskless} -eq 0 ] && ln -sf ${vmpath} ${diskfile}
+
+# check the file type
+if echo ${imgname} | grep -qiE "vdi|vhd" && [ ${diskless} -eq 0 ]; then
+ imgfmt=$(echo ${imgname##*.} | tr "[a-z]" "[A-Z]")
+elif [ ${diskless} -eq 0 ]; then
+ writelog "${imgname} is not a valid image format (vdi|vhd), exiting!"
+ cleanexit 1
+fi
+
+npaging="false" # nested paging: Default: not enabled
+enablevt="false" # VT: Default: not enabled
+[ ${vtflag} -eq 0 ] && cpu_cores=1 # check for VT, if not available only 1 cpu supported
+[ ${vtflag} -eq 1 ] && enablevt="true"
+
+# Setting some default variables
+shfolders="TRUE"
+
+# set some base configuration depending on the guest operating system
+case "${vmostype}" in
+ win31*)
+ guestaudio="SB16"
+ vb_network_card="Am79C973"
+ vmostype="Windows31"
+ mem="32"
+ vram="16"
+ cpu_cores=1
+ enablevt="false"
+ shfolders="FALSE"
+ ;;
+ winnt*)
+ guestaudio="SB16"
+ vb_network_card="Am79C973"
+ vmostype="Windows31"
+ mem="32"
+ vram="16"
+ cpu_cores=1
+ enablevt="false"
+ shfolders="FALSE"
+ ;;
+ win95*)
+ vmostype="Windows95"
+ guestaudio="SB16"
+ vb_network_card="Am79C973"
+ mem="92"
+ vram="32"
+ cpu_cores=1
+ enablevt="false"
+ shfolders="FALSE"
+ ;;
+ win98*)
+ vmostype="Windows98"
+ guestaudio="SB16"
+ vb_network_card="Am79C973"
+ mem="256"
+ vram="64"
+ cpu_cores=1
+ shfolders="FALSE"
+ ;;
+ winme*)
+ vmostype="WindowsMe"
+ guestaudio="AC97"
+ vb_network_card="Am79C973"
+ mem="256"
+ vram="64"
+ cpu_cores=1
+ shfolders="FALSE"
+ ;;
+ winxp*|windowsxp*)
+ vmostype="WindowsXP"
+ guestaudio="AC97"
+ ;;
+ winvista*|windowsvista*)
+ vmostype="WindowsVista"
+ ;;
+ windows7*)
+ vmostype="Windows7"
+ ;;
+ windows8*)
+ vmostype="Windows8"
+ ;;
+ linux*|*ubuntu*|*suse*|debian*|*sci*)
+ if echo "${vmostype}" | grep -q "64"; then
+ vmostype="Linux26_64"
+ # check for vtflag
+ if [ ${vtflag} -ne 1 ]; then
+ writelog "You are trying to boot a 64 bit OS without a VT enabled CPU"
+ writelog "This is not supported, exiting!"
+ cleanexit 1
+ fi
+ # check if host is only 32 bit, then use only 1 cpu (only 1 supported)
+ if echo "${host_arch}" | grep -qE "i.86"; then
+ cpu_cores=1
+ fi
+ else
+ vmostype="Linux26"
+ fi
+ ;;
+ os2*)
+ mem="256"
+ vmostype="OS2eCS"
+ cpu_cores=1
+ enable2d="false"
+ ;;
+ macos*|MacOS*)
+ vmostype="MacOS"
+ enable2d="false"
+ ;;
+ *)
+ vmostype="Other"
+ enable2d="false"
+ ;;
+esac
+
+writelog "Directories:"
+writelog "\tConfig dir:\t\t$confdir"
+writelog "\tMachines dir:\t\t$machfolder"
+writelog "\tMachine config:\t\t$machconfig"
+[ ${diskless} -eq 0 ] && writelog "\tHardDisks dir:\t\t$diskfolder"
+
+################################################################################
+### Hardware checks
+################################################################################
+
+# remove ':' from MAC addr for vbox and generate a VDE (virtual device ethernet)
+# MAC addr from the first one (put in prefix 0DE)
+macaddr=$(echo ${macaddr} | sed 's/://g')
+vdemacaddr=$(echo ${macaddr} | sed 's/^..../00DE/g')
+
+machineuuid="00000000-0000-0000-0000-${macaddr}" # machine UUID, MAC addr part of it
+machineuuid=$(echo ${machineuuid} | tr "[A-Z]" "[a-z]") # cosmetical, since UUID in lower case
+# get UUID of VBox image, if not diskless
+[ ${diskless} -eq 0 ] && diskuuid=$(VBoxManage -q showvdiinfo ${diskfile} \
+ | grep UUID | grep -v "Parent UUID" | awk '{print $2}' \
+ | grep -v use ) # nec. for VBox >= 4
+
+imgtype="Immutable" # make disk immutable
+snapshotuuid="34f617be-192a-46b3-a8ae-bce1029e093f" # snapshot UUID is static
+imageuuid=${snapshotuuid} # imageuuid in machine.include, default snapshotuuid
+
+# check if rw image
+# remove disk and add rwimg if set
+if echo "${imgmode}" | grep -q rw; then
+ # lock existing?
+ if [ -e "${vmpath}.lock" ]; then
+ writelog "This rw image is already in use."
+ writelog "Found lock: ${vmpath}.lock, exiting!"
+ writelog "Remove lock if you are sure that this is not the case"
+ cleanexit 1
+ # image rw?
+ elif ! [ -w ${vmpath} ]; then
+ writelog "You defined mode rw, but image ${vmpath} is not rw! \c"
+ writelog "Please correct, exiting!"
+ cleanexit 1
+ fi
+ touch "${vmpath}.lock" # add lock
+ #RMDIRS="${RMDIRS} ${vmpath}.lock" # remove lock after VM stopped TODO See note at the top
+ imgtype="Normal"
+ imageuuid=${diskuuid} # replace image uuid in machine config
+elif [ ${diskless} -eq 0 ]; then
+ # use temp disk as snapshot
+ cat ${VMCHOOSERVBOX}/empty-diff.vdi.gz \
+ | gunzip > "${snapshotdir}/{${snapshotuuid}}.vdi"
+ # patch the disk file uuid into the snapshot vdi file
+ dd if=${diskfile} of="${snapshotdir}/{${snapshotuuid}}.vdi" seek=424 \
+ skip=392 bs=1 count=16 conv=notrunc
+fi
+
+# TODO: MEM muss noch angepasst werden. Maschine crasht wenn mehr als 50% MEM
+# memory part equal to vmware plugin
+# percentage of memory to use for virtualbox in standard case
+#if [ -n "${forcemem}" ]; then
+# mem="${forcemem}"
+#else
+# permem=30
+# if [ "${totalmem}" -ge "1600" ]; then
+# permem=40
+# fi
+# # check if /tmp is on harddisk
+# if grep -qe "/dev/.* /tmp " /proc/mounts ; then
+# permem=60
+# id44="1"
+# # Hack, if more than 2,5G RAM use 40% of Ram and write vmem into Ram as well
+# # (40% vmware | 40% confdir(vmem...) | 20% host
+# # VMplayer 2+ issue
+# # TODO: makes this sense for vbox?
+# #if [ "${totalmem}" -ge "2500" ]; then
+# #permem=40
+# #rmdir ${snapshotdir}
+# #snapshotdirold=${snapshotdir}
+# #snapshotdir=/dev/shm/${self}/${USER}/${VM_ID}
+# #mkdir -p ${snapshotdir}
+# #ln -sf ${snapshotdir} ${snapshotdirold}
+# #fi
+# fi
+# mem=$(expr ${totalmem} / 100 \* ${permem})
+# if [ "${id44}" = "1" ]; then
+# hostmem=$(expr ${totalmem} - ${mem})
+# else
+# hostmem=$(expr ${totalmem} - ${mem} - ${mem})
+# fi
+# #permem=40
+# #mem=$(expr ${totalmem} * ${permem})
+#fi
+
+# translate network cards
+case "${network_card}" in
+ e1000)
+ vb_network_card="82540EM"
+ ;;
+ virtio)
+ vb_network_card="virtio"
+ ;;
+ *)
+ network_card="pcnet"
+ vb_network_card="Am79C973"
+esac
+
+# translate network kinds (nat, bridged, host-only)
+case "${network_kind}" in
+ bridge*)
+ network_kind='HostOnlyInterface name="vboxnet0"'
+ ;;
+ host*)
+ network_kind='HostOnlyInterface name="vboxnet2"'
+ ;;
+ *)
+ network_kind='HostOnlyInterface name="vboxnet1"'
+esac
+
+# configure 3d settings
+case "${enable3d}" in
+ *true*|*yes*)
+ enable3d="true"
+ ;;
+ *)
+ enable3d="false"
+ ;;
+esac
+
+# translate boot, use if set else set to HardDisk
+# usually support for a,c,d,n, stands for Floppy, HD, CD-ROM, Network
+# support nfs and tftp as well
+case ${boot} in
+ n*|tftp)
+ boot="Network"
+ if [ "${network_kind}" = "NAT" ] && [ -n "${virtualbox_tftpdir}" ]; then
+ vm_name=${vm_shortname} # use vm_shortname to avoid Problems /w TFTP in NAT
+ mkdir -p ${confdir}/TFTP # link TFTP dir for NAT TFTP boots
+ if [ -e ${virtualbox_tftpdir}/pxelinux.0 ]; then
+ cp ${virtualbox_tftpdir}/pxelinux.0 ${confdir}/TFTP/${vm_name}.pxe
+ else
+ writelog "${virtualbox_tftpdir}/pxelinux.0 not found!"
+ writelog "Network boot won't work, exiting!"
+ cleanexit 1
+ fi
+ for i in $(ls ${virtualbox_tftpdir}); do
+ ln -sf ${virtualbox_tftpdir}/${i} ${confdir}/TFTP/${i}
+ done
+ fi
+ ;;
+ # later maybe c|disk|hd*|sd*) for HD and d|cd*) for CD-ROM
+ *)
+ boot="HardDisk"
+ ;;
+esac
+
+vrdpport=${remotedesktopport} # external GUI
+
+[ ${diskless} -eq 0 ] && writelog "\tSnapshots dir:\t\t$snapshotdir"
+writelog "Diskimage:"
+[ ${diskless} -eq 0 ] && writelog "\tDisk file:\t\t$diskfile"
+[ ${diskless} -eq 0 ] && writelog "\tDisk format:\t\t$imgfmt"
+[ ${diskless} -eq 0 ] && writelog "\tDisk type:\t\t$imgtype"
+ writelog "\tVMostype:\t\t$vmostype"
+ writelog "\tMachine UUID:\t\t$machineuuid"
+[ ${diskless} -eq 0 ] && writelog "\tDisk UUID:\t\t$diskuuid"
+writelog "Virtual Hardware:"
+writelog "\tCPU cores:\t\t${cpu_cores}\c"
+[ ${vtflag} -eq 0 ] && writelog ""
+[ ${vtflag} -eq 1 ] && writelog " (VT enabled CPU)"
+writelog "\tGuest RAM:\t\t${mem} MB"
+# echo nur wenn hostmem gesetzt
+[ -n "${hostmem}" ] && writelog "\tHost RAM:\t\t${hostmem} MB"
+writelog "\tMAC address:\t\t$macaddr"
+writelog "\tNetwork card:\t\t${vb_network_card}"
+writelog "\tNetwork kind:\t\t${network_kind}"
+writelog "\tBooting from:\t\t${boot}\c"
+[ ${diskless} -eq 0 ] && writelog ""
+[ ${diskless} -eq 1 ] && writelog " 'diskless'"
+# TODO: server start activate via xml, etc...
+#writelog "\tGuest VRDP port:\t${vrdpport}"
+writelog "\tCD-ROM1:\t\t${cdrom0}"
+#writelog "\tCD-ROM2:\t\t${cdrom1}"
+writelog "\tFloppy_A:\t\t${floppy0}"
+writelog "\tFloppy_B:\t\t${floppy1}"
+# defined in run-virt.sh and run-vmgrid.sh
+writelog "\tShared Folders '${sharename}':\t${sharepath}"
+
+################################################################################
+### Pepare and configure virtual machine and disk image
+################################################################################
+
+# create Virtualbox.xml
+
+# Shares given?
+if [ "x$shfolders" != "xFALSE" ]; then
+ sharelist="<SharedFolders>
+ <SharedFolder name=\"${homesharename}\" hostPath=\"${homesharepath}\" writable=\"true\"/>
+ <SharedFolder name=\"${commonsharename}\" hostPath=\"${commonsharepath}\" writable=\"true\"/>
+ </SharedFolders>"
+else
+ sharelist=''
+fi
+
+source ${VMCHOOSERVBOX}/virtualbox.include # create Virtualbox.xml
+
+# remove snapshot disk when using rw images
+if [ "${imgtype}" != "Immutable" ]; then
+ sed -i "/${snapshotuuid}/d" "${confdir}/VirtualBox.xml"
+fi
+
+# TODO: add rawdisk if requested
+#"raw.vmdk" format="VMDK" type="Writethrough"/>
+
+source ${VMCHOOSERVBOX}/machine.include # create machine.xml
+
+# remove CD-ROM if not available
+if [ "${cdrom0}" != "TRUE" ]; then
+ sed -i "/HostDrive/d" ${machconfig}
+ sed -i '/AttachedDevice.*type="DVD"/d' ${machconfig}
+ sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT (CD)!!! -->/d" ${machconfig}
+fi
+
+# if diskless remove all disks
+if [ ${diskless} -eq 1 ]; then
+ sed -i "/<HardDisk/d;/<\/HardDisk/d" "${confdir}/VirtualBox.xml"
+ sed -i "/${imageuuid}/d" ${machconfig}
+ sed -i '/AttachedDevice type="HardDisk"/d' ${machconfig}
+ sed -i "/<!-- PLEASE DO NOT REMOVE THIS COMMENT (HD)!!! -->/d" ${machconfig}
+fi
+
+# define redirects
+if [ ${redirects} -ge 1 ]; then
+ (( i=1 ))
+ writelog "\tGuest redirects:\t\c"
+ while [ ${i} -le ${redirects} ]; do
+ extradataitem='<ExtraDataItem name="VBoxInternal/Devices'
+ extradataitem="${extradataitem}/${network_card}/0/LUN#0/Config"
+ extradataitem="${extradataitem}/${redirect_name[$i]}/"
+ extradataprotocol="Protocol\" value=\"${redirect_proto[$i]}\"/>"
+ extradatahostport="HostPort\" value=\"${redirect_hport[$i]}\"/>"
+ extradataguestport="GuestPort\" value=\"${redirect_gport[$i]}\"/>"
+ sed -i "s,</ExtraData>, ${extradataitem}${extradataguestport}\n\
+ ${extradataitem}${extradatahostport}\n\
+ ${extradataitem}${extradataprotocol}\n\
+ </ExtraData>," "${machconfig}"
+ writelog "${tabspace}${redirect_name[$i]} port: ${redirect_hport[$i]}"
+ tabspace='\t\t\t\t'
+ (( i=$i+1 ))
+ done
+fi
+
+################################################################################
+### Set env for vmchooser-run_virt
+################################################################################
+
+# wait for a certain command to settle
+# get the PID of the right process
+# kill PID, seems to work
+VBMANPID=$(pstree -p | grep VBoxXPCOMIPCD | grep -ivE "VirtualBox|VBoxHeadless"\
+ | sed -e "s/.*VBoxXPCOMIPCD(\(.*\)).*/\1/")
+for i in $(echo ${VBMANPID}); do
+ kill -9 ${VBMANPID} >/dev/null 2>&1
+done
+
+# set the variables appropriately (several interfaces with different names)
+VIRTCMD=$(which VirtualBox 2>/dev/null)
+VIRTCMDOPTS="--startvm ${machineuuid} --start-running --fullscreen"
+
+# set headless mode (-v off to disable vrdp)
+VIRTCMDHL=$(which VBoxHeadless 2>/dev/null)
+VIRTCMDOPTSHL="-s ${machineuuid}"
+
diff --git a/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/rwimg.vdi.gz b/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/rwimg.vdi.gz
new file mode 100644
index 00000000..e2133d6d
--- /dev/null
+++ b/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/rwimg.vdi.gz
Binary files differ
diff --git a/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.conf b/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.conf
new file mode 100644
index 00000000..8a7a58e4
--- /dev/null
+++ b/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.conf
@@ -0,0 +1,2 @@
+# Todo: Good setting
+export VBOX_USER_HOME=""
diff --git a/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include b/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include
new file mode 100644
index 00000000..62143c54
--- /dev/null
+++ b/core/modules/vbox/data/opt/openslx/vmchooser/virtualbox/virtualbox.include
@@ -0,0 +1,57 @@
+# -----------------------------------------------------------------------------
+# Copyright (c) 2010..2012 - OpenSLX GmbH
+#
+# This program/file is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+# -----------------------------------------------------------------------------
+# Include file (general template) for run-virt.include of the virtualbox plugin
+
+cat << EOF > "${confdir}/VirtualBox.xml"
+<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.12-linux">
+ <Global>
+ <ExtraData>
+ <ExtraDataItem name="GUI/Input/AutoCapture" value="true"/>
+ <ExtraDataItem name="GUI/Input/HostKey" value="65300"/> <!-- scroll lock / Rollen -->
+ <ExtraDataItem name="GUI/LastVMSelected" value="${machineuuid}"/>
+ <ExtraDataItem name="GUI/HostScreenSaverDisabled" value="false"/>
+ <ExtraDataItem name="GUI/LicenseAgreed" value="1,2,3,4,5,6,7,8,9"/>
+ <ExtraDataItem name="GUI/MaxGuestResolution" value="any"/> <!-- auto, width,height -->
+ <ExtraDataItem name="GUI/UpdateCheckCount" value="2"/>
+ <ExtraDataItem name="GUI/UpdateDate" value="never"/>
+ <ExtraDataItem name="GUI/SuppressMessages" value=",remindAboutAutoCapture,confirmInputCapture,remindAboutWrongColorDepth,confirmGoingFullscreen,remindAboutMouseIntegrationOn,remindAboutMouseIntegrationOff,showRuntimeError.warning.DevATA_DISKFULL,remindAboutPausedVMInput,confirmVMReset,showRuntimeError.warning.HostAudioNotResponding,showRuntimeError.warning.ExtPackNoEhci,remindAboutMouseIntegration"/>
+ <ExtraDataItem name="GUI/TrayIcon/Enabled" value="false"/>
+ </ExtraData>
+ <MachineRegistry>
+ <MachineEntry uuid="{${machineuuid}}" src="Machines/${vm_shortname}/${vm_shortname}.xml"/>
+ </MachineRegistry>
+ <MediaRegistry>
+ <HardDisks>
+ <HardDisk uuid="{${diskuuid}}" location="${diskfile}" format="${imgfmt}" type="${imgtype}">
+ <HardDisk uuid="{${snapshotuuid}}" location="${snapshotdir}/{${snapshotuuid}}.vdi" format="VDI" autoReset="true"/>
+ </HardDisk>
+ </HardDisks>
+ <!--
+ <DVDImages/>
+ -->
+ <FloppyImages>
+ <Image uuid="{288d5452-2dd3-44f2-bfc8-78e205a4fa87}" location="${floppy1name}"/>
+ </FloppyImages>
+ </MediaRegistry>
+ <NetserviceRegistry>
+ <DHCPServers>
+ <DHCPServer networkName="HostInterfaceNetworking-vboxnet0" IPAddress="0.0.0.0" networkMask="0.0.0.0" lowerIP="0.0.0.0" upperIP="0.0.0.0" enabled="0"/>
+ <!--
+ <DHCPServer networkName="HostInterfaceNetworking-vboxnet1" IPAddress="0.0.0.0" networkMask="0.0.0.0" lowerIP="0.0.0.0" upperIP="0.0.0.0" enabled="0"/>
+ -->
+ </DHCPServers>
+ </NetserviceRegistry>
+ <SystemProperties defaultMachineFolder="${machfolder}" defaultHardDiskFolder="${diskfolder}" defaultHardDiskFormat="VDI" remoteDisplayAuthLibrary="VBoxAuth" webServiceAuthLibrary="VBoxAuth" LogHistoryCount="3"/>
+ <USBDeviceFilters/>
+ </Global>
+</VirtualBox>
+EOF
diff --git a/core/modules/vbox/module.build b/core/modules/vbox/module.build
new file mode 100644
index 00000000..0f62eab4
--- /dev/null
+++ b/core/modules/vbox/module.build
@@ -0,0 +1,142 @@
+#!/bin/bash
+
+patch_vbox_scripts() {
+ # Patching virtualbox utility scripts to include openslx-busybox binary paths. Strange sed-ing, as the openslx
+ # binary paths need to be at the end of PATH to not impede with system binaries.
+ # It seems sufficient to patch just VBox, as eg. vboxmanage, vboxheadless etc. are just links to VBox.
+ # If only vboxmanage, vboxheadless or such should be patched (and not the base script VBox) just use a list
+ # in the loop (eg. 'for i in virtualbox vboxmanage vboxheadless; do'). These links will be replaced by patched
+ # 'real' files. Of course it will not make sense if VBox is included in the list, then.
+ # Patched files will be saved with extension .original.
+
+ pinfo "Patching virtual box scripts to include openslx (busybox)-paths ..."
+ for i in VBox; do
+ pinfo "Patching virtual box script $i ..."
+ SCRIPTPATH=$(grep -m 1 PATH "${MODULE_BUILD_DIR}/usr/bin/$i"|sed 's/"//g') # assume first hit is real path
+ sed -i "-i.original" "/^PATH=/c ${SCRIPTPATH}:/opt/openslx/bin:/opt/openslx/sbin"\
+ "${MODULE_BUILD_DIR}/usr/bin/$i" # append openslx paths
+ done
+
+ # due to problems with group membership of kdm-spawned processes we need to
+ # patch ${MODULE_BUILD_DIR}/usr/share/virtualbox/VBoxCreateUSBNode.sh:
+ sed -i "s/0750/0755/g" "${MODULE_BUILD_DIR}/usr/share/virtualbox/VBoxCreateUSBNode.sh"
+ sed -i "s/0660/0666/g" "${MODULE_BUILD_DIR}/usr/share/virtualbox/VBoxCreateUSBNode.sh"
+}
+
+extract_extpack() {
+ pinfo "Unpacking Extension Pack ..."
+ mkdir -p "${MODULE_BUILD_DIR}/usr/lib/virtualbox/ExtensionPacks/Oracle_VM_VirtualBox_Extension_Pack"
+ cp "${MODULE_WORK_DIR}"/src/vbox/extpack/[EP][xX][tE]* "${MODULE_BUILD_DIR}"/usr/lib/virtualbox/ExtensionPacks/Oracle_VM_VirtualBox_Extension_Pack
+ if [ x${AMD64_X86} == "xamd64" ]; then
+ pinfo "Unpacking 64bit branch of Extension Pack ..."
+ cp -r "${MODULE_WORK_DIR}/src/vbox/extpack/linux.amd64" "${MODULE_BUILD_DIR}/usr/lib/virtualbox/ExtensionPacks/Oracle_VM_VirtualBox_Extension_Pack"
+ else # then we assume 32bit x86...
+ pinfo "Unpacking32bit branch of Extension Pack ..."
+ cp -r "${MODULE_WORK_DIR}/src/vbox/extpack/linux.x86" "${MODULE_BUILD_DIR}/usr/lib/virtualbox/ExtensionPacks/Oracle_VM_VirtualBox_Extension_Pack"
+ fi
+}
+
+build_modules() {
+ pinfo "Recompiling VirtualBox kernel modules ..."
+ # Set some variables to use/patch VBox scripts
+ local MODULE_SRC="${MODULE_BUILD_DIR}/usr/share/virtualbox/src/vboxhost"
+ local BUILDINTMP="$MODULE_SRC/build_in_tmp"
+ local BUILDSUBDIR="modules"
+
+ # Some Vars for VBs kernel module makefiles
+ MODULE_DIR_ALT="$MODULE_DIR" # save usual MODULE_DIR
+ export KERN_DIR="${MODULE_WORK_DIR}/../kernel/build/lib/modules/$(ls ${MODULE_WORK_DIR}/../kernel/build/lib/modules/)/build/"
+ pinfo "Using Kernel dir $KERN_DIR"
+ # export MODULE_DIR="${MODULE_WORK_DIR}/../kernel/build/lib/modules/$(ls ${MODULE_WORK_DIR}/../kernel/build/lib/modules/)/kernel/misc"
+ export MODULE_DIR="${MODULE_WORK_DIR}/build/lib/modules/vbox"
+
+ pinfo "Recompiling VirtualBox kernel module vboxdrv ..."
+ if ! $BUILDINTMP \
+ --save-module-symvers /tmp/vboxdrv-Module.symvers \
+ --module-source "$MODULE_SRC/vboxdrv" \
+ --no-print-directory install;
+ then
+ perror "[vbox]: Error compiling VirtualBox kernel module vboxdrv"
+ fi
+ pinfo "Recompiling VirtualBox kernel module vboxnetflt ..."
+ if ! $BUILDINTMP \
+ --use-module-symvers /tmp/vboxdrv-Module.symvers \
+ --module-source "$MODULE_SRC/vboxnetflt" \
+ --no-print-directory install;
+ then
+ perror "[vbox]: Error compiling VirtualBox kernel module vboxnetflt"
+ fi
+ pinfo "Recompiling VirtualBox kernel module vboxnetadp ..."
+ if ! $BUILDINTMP \
+ --use-module-symvers /tmp/vboxdrv-Module.symvers \
+ --module-source "$MODULE_SRC/vboxnetadp" \
+ --no-print-directory install;
+ then
+ perror "[vbox]: Error compiling VirtualBox kernel module vboxnetadp"
+ fi
+ pinfo "Recompiling VirtualBox kernel module vboxpci ..."
+ if ! $BUILDINTMP \
+ --use-module-symvers /tmp/vboxdrv-Module.symvers \
+ --module-source "$MODULE_SRC/vboxpci" \
+ --no-print-directory install;
+ then
+ perror "[vbox]: Error compiling VirtualBox kernel module vboxpci"
+ fi
+ pinfo "Compiled successfully the VirtualBox kernel modules."
+ export MODULE_DIR="$MODULE_DIR_ALT" # re-set MODULE_DIR
+}
+
+
+fetch_source() {
+ if [ -z "$REQUIRED_VBOXBASEURL" -o -z "$REQUIRED_VBOXEXTURL" ]; then
+ perror "Virtualbox download URLs not set - please write a module.conf-file for your linux flavour."
+ fi
+
+ mkdir -p "src/vbox"
+ cd src/vbox
+ # pinfo "Downloading $REQUIRED_VBOXBASEURL"
+ download "$REQUIRED_VBOXBASEURL"
+ # pinfo "Downloading $REQUIRED_VBOXEXTURL"
+ download_untar "$REQUIRED_VBOXEXTURL" "extpack" "vbox_extpack.tar.gz"
+ cd -
+}
+
+
+build() {
+ case "$PACKET_HANDLER" in
+ rpm)
+ pinfo "Unpacking rpm ..."
+ cd build || perror "Cannot cd to build directory!"
+ rpm2cpio ../src/vbox/$(basename "$REQUIRED_VBOXBASEURL")|cpio -idmv || perror "Could not unpack rpm-archive!"
+ # it seems that sometimes directories from rpm will be created with 700-permissions,
+ # if that directory is not explicitly mentioned to create. So eg. usr, etc will carry the
+ # permissions 700, which is no fun. So we search for these directories and correct them.
+ find . -type d -perm 700 -exec chmod 755 {} \;
+ ;;
+ dpkg )
+ pinfo "Unpacking deb ..."
+ cd build || perror "Cannot cd to build directory!"
+ dpkg -x ../src/vbox/$(basename "$REQUIRED_VBOXBASEURL") . || perror "Could not unpack deb-archive!"
+ # VirtualBox needs to be suid-root:
+ for i in VBoxHeadless VBoxNetAdpCtl VBoxNetDHCP VBoxSDL VBoxVolInfo VirtualBox VBoxNetAdpCtl; do
+ chmod u+s ${MODULE_BUILD_DIR}/usr/lib/virtualbox/$i || pwarning "(Debian/Ubuntu) Could not suid $i executable!"
+ done
+ ;;
+ *) perror "Unknown Distribution: $SYS_DISTRIBUTION - Please specify its packet manager in remote/setup_target" ;;
+ esac
+
+ build_modules
+ patch_vbox_scripts
+ extract_extpack
+
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+}
+
+post_copy() {
+ # clean a bit, as sometimes there are residual files in /tmp/vbox.*/
+ rm -rf /tmp/vbox.*/
+}
+
diff --git a/core/modules/vbox/module.conf b/core/modules/vbox/module.conf
new file mode 100644
index 00000000..a2925bc7
--- /dev/null
+++ b/core/modules/vbox/module.conf
@@ -0,0 +1,20 @@
+# VBox version 5 branch:
+# REQUIRED_VBOX_VERSION_MAJOR="5.0"
+# REQUIRED_VBOX_VERSION_MINOR="0"
+# REQUIRED_VBOX_VERSIONCODE="101573"
+
+# VBox version 4 last branch:
+REQUIRED_VBOX_VERSION_MAJOR="5.0"
+REQUIRED_VBOX_VERSION_MINOR="16"
+REQUIRED_VBOX_VERSIONCODE="105871"
+
+REQUIRED_VBOX_VERSION="$REQUIRED_VBOX_VERSION_MAJOR.$REQUIRED_VBOX_VERSION_MINOR"
+
+REQUIRED_DIRECTORIES="
+ /etc
+ /lib
+ /usr
+"
+# REQUIRED_LDD_BLACKLIST: Keep in mind the leading '\|'!
+REQUIRED_LDD_BLACKLIST="\|VBoxVMM"
+
diff --git a/helper/README.helper b/core/modules/vbox/module.conf.opensuse
index e69de29b..e69de29b 100644
--- a/helper/README.helper
+++ b/core/modules/vbox/module.conf.opensuse
diff --git a/core/modules/vbox/module.conf.opensuse.12.3 b/core/modules/vbox/module.conf.opensuse.12.3
new file mode 100644
index 00000000..e4aed59a
--- /dev/null
+++ b/core/modules/vbox/module.conf.opensuse.12.3
@@ -0,0 +1,19 @@
+REQUIRED_VBOX_OSCODE='openSUSE123-1'
+
+REQUIRED_VBOXBASEURL="http://download.virtualbox.org/virtualbox/${REQUIRED_VBOX_VERSION}/VirtualBox-${REQUIRED_VBOX_VERSION_MAJOR}-${REQUIRED_VBOX_VERSION}_${REQUIRED_VBOX_VERSIONCODE}_${REQUIRED_VBOX_OSCODE}.${X86_64_I586}.rpm"
+REQUIRED_VBOXEXTURL="http://download.virtualbox.org/virtualbox/${REQUIRED_VBOX_VERSION}/Oracle_VM_VirtualBox_Extension_Pack-${REQUIRED_VBOX_VERSION}-${REQUIRED_VBOX_VERSIONCODE}.vbox-extpack"
+
+REQUIRED_CONTENT_PACKAGES="
+ libSDL-1_2-0
+ libpng12-0
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ libSDL-1_2-0
+ libpng12-0
+"
+
+REQUIRED_LIBRARIES="
+ libSDL-1.2
+ libpng12
+"
diff --git a/core/modules/vbox/module.conf.ubuntu b/core/modules/vbox/module.conf.ubuntu
new file mode 100644
index 00000000..acab7b4f
--- /dev/null
+++ b/core/modules/vbox/module.conf.ubuntu
@@ -0,0 +1,13 @@
+REQUIRED_CONTENT_PACKAGES="
+ libsdl1.2debian
+ libpng12-0
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ libsdl1.2debian
+ libpng12-0
+"
+
+REQUIRED_LIBRARIES="
+ libpng12
+"
diff --git a/core/modules/vbox/module.conf.ubuntu.13.04 b/core/modules/vbox/module.conf.ubuntu.13.04
new file mode 100644
index 00000000..3008508f
--- /dev/null
+++ b/core/modules/vbox/module.conf.ubuntu.13.04
@@ -0,0 +1,18 @@
+REQUIRED_VBOX_OSCODE='Ubuntu~raring'
+
+REQUIRED_VBOXBASEURL="http://download.virtualbox.org/virtualbox/${REQUIRED_VBOX_VERSION}/virtualbox-${REQUIRED_VBOX_VERSION_MAJOR}_${REQUIRED_VBOX_VERSION}-${REQUIRED_VBOX_VERSIONCODE}~${REQUIRED_VBOX_OSCODE}_${AMD64_I386}.deb"
+REQUIRED_VBOXEXTURL="http://download.virtualbox.org/virtualbox/${REQUIRED_VBOX_VERSION}/Oracle_VM_VirtualBox_Extension_Pack-${REQUIRED_VBOX_VERSION}-${REQUIRED_VBOX_VERSIONCODE}.vbox-extpack"
+
+REQUIRED_CONTENT_PACKAGES="
+ libsdl1.2debian
+ libpng12-0
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ libsdl1.2debian
+ libpng12-0
+"
+
+REQUIRED_LIBRARIES="
+ libpng12
+"
diff --git a/core/modules/vbox/module.conf.ubuntu.13.10 b/core/modules/vbox/module.conf.ubuntu.13.10
new file mode 100644
index 00000000..f91fbcf1
--- /dev/null
+++ b/core/modules/vbox/module.conf.ubuntu.13.10
@@ -0,0 +1,19 @@
+REQUIRED_VBOX_OSCODE='Ubuntu~raring' # raring: 13.04, but also used here.
+
+REQUIRED_VBOXBASEURL="http://download.virtualbox.org/virtualbox/${REQUIRED_VBOX_VERSION}/virtualbox-${REQUIRED_VBOX_VERSION_MAJOR}_${REQUIRED_VBOX_VERSION}-${REQUIRED_VBOX_VERSIONCODE}~${REQUIRED_VBOX_OSCODE}_${AMD64_I386}.deb"
+REQUIRED_VBOXEXTURL="http://download.virtualbox.org/virtualbox/${REQUIRED_VBOX_VERSION}/Oracle_VM_VirtualBox_Extension_Pack-${REQUIRED_VBOX_VERSION}-${REQUIRED_VBOX_VERSIONCODE}.vbox-extpack"
+
+
+REQUIRED_CONTENT_PACKAGES="
+ libsdl1.2debian
+ libpng12-0
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ libsdl1.2debian
+ libpng12-0
+"
+
+REQUIRED_LIBRARIES="
+ libpng12
+"
diff --git a/core/modules/vbox/module.conf.ubuntu.14 b/core/modules/vbox/module.conf.ubuntu.14
new file mode 100644
index 00000000..5ec7cc83
--- /dev/null
+++ b/core/modules/vbox/module.conf.ubuntu.14
@@ -0,0 +1,23 @@
+# VBox version 5 branch:
+# REQUIRED_VBOX_OSCODE='Ubuntu~trusty'
+
+# VBox version 4 last branch:
+REQUIRED_VBOX_OSCODE='Ubuntu~raring'
+
+REQUIRED_VBOXBASEURL="http://download.virtualbox.org/virtualbox/${REQUIRED_VBOX_VERSION}/virtualbox-${REQUIRED_VBOX_VERSION_MAJOR}_${REQUIRED_VBOX_VERSION}-${REQUIRED_VBOX_VERSIONCODE}~${REQUIRED_VBOX_OSCODE}_${AMD64_I386}.deb"
+REQUIRED_VBOXEXTURL="http://download.virtualbox.org/virtualbox/${REQUIRED_VBOX_VERSION}/Oracle_VM_VirtualBox_Extension_Pack-${REQUIRED_VBOX_VERSION}-${REQUIRED_VBOX_VERSIONCODE}.vbox-extpack"
+
+
+REQUIRED_CONTENT_PACKAGES="
+ libsdl1.2debian
+ libpng12-0
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ libsdl1.2debian
+ libpng12-0
+"
+
+REQUIRED_LIBRARIES="
+ libpng12
+"
diff --git a/core/modules/vbox/module.conf.ubuntu.16 b/core/modules/vbox/module.conf.ubuntu.16
new file mode 100644
index 00000000..a0ba2521
--- /dev/null
+++ b/core/modules/vbox/module.conf.ubuntu.16
@@ -0,0 +1,23 @@
+# VBox version 5 branch:
+# REQUIRED_VBOX_OSCODE='Ubuntu~trusty'
+
+# VBox version 4 last branch:
+REQUIRED_VBOX_OSCODE='Ubuntu~wily'
+
+REQUIRED_VBOXBASEURL="http://download.virtualbox.org/virtualbox/${REQUIRED_VBOX_VERSION}/virtualbox-${REQUIRED_VBOX_VERSION_MAJOR}_${REQUIRED_VBOX_VERSION}-${REQUIRED_VBOX_VERSIONCODE}~${REQUIRED_VBOX_OSCODE}_${AMD64_I386}.deb"
+REQUIRED_VBOXEXTURL="http://download.virtualbox.org/virtualbox/${REQUIRED_VBOX_VERSION}/Oracle_VM_VirtualBox_Extension_Pack-${REQUIRED_VBOX_VERSION}-${REQUIRED_VBOX_VERSIONCODE}.vbox-extpack"
+
+
+REQUIRED_CONTENT_PACKAGES="
+ libsdl1.2debian
+ libpng12-0
+"
+
+REQUIRED_INSTALLED_PACKAGES="
+ libsdl1.2debian
+ libpng12-0
+"
+
+REQUIRED_LIBRARIES="
+ libpng12
+"
diff --git a/core/modules/vmchooser/TODO b/core/modules/vmchooser/TODO
new file mode 100644
index 00000000..23252d6f
--- /dev/null
+++ b/core/modules/vmchooser/TODO
@@ -0,0 +1,4 @@
+currently nothing to do.
+
+done:
+ adapt globals.cpp globals.h to adopt the new structure of openslx-files: everything we do under /opt/openslx
diff --git a/core/modules/vmchooser/data/opt/openslx/vmchooser/sessionstart b/core/modules/vmchooser/data/opt/openslx/vmchooser/sessionstart
new file mode 100755
index 00000000..be3235c1
--- /dev/null
+++ b/core/modules/vmchooser/data/opt/openslx/vmchooser/sessionstart
@@ -0,0 +1,12 @@
+#!/bin/ash
+
+SOURCEPATH="/opt/openslx/vmchooser/sessionstart.d"
+
+if [ -d "$SOURCEPATH" ]; then
+ for file in $SOURCEPATH/*; do
+ "$file" || slxlog "vmchooser-sessionstart" "Could not source $file at session start!" "$file"
+ done
+fi
+
+exit 0
+
diff --git a/core/modules/vmchooser/data/opt/openslx/vmchooser/themes/openslx/openslx-left.png b/core/modules/vmchooser/data/opt/openslx/vmchooser/themes/openslx/openslx-left.png
new file mode 100644
index 00000000..900dd867
--- /dev/null
+++ b/core/modules/vmchooser/data/opt/openslx/vmchooser/themes/openslx/openslx-left.png
Binary files differ
diff --git a/core/modules/vmchooser/data/opt/openslx/vmchooser/themes/openslx/openslx-right.png b/core/modules/vmchooser/data/opt/openslx/vmchooser/themes/openslx/openslx-right.png
new file mode 100644
index 00000000..8ca9347b
--- /dev/null
+++ b/core/modules/vmchooser/data/opt/openslx/vmchooser/themes/openslx/openslx-right.png
Binary files differ
diff --git a/core/modules/vmchooser/data/opt/openslx/vmchooser/themes/openslx/openslx.ini b/core/modules/vmchooser/data/opt/openslx/vmchooser/themes/openslx/openslx.ini
new file mode 100644
index 00000000..57a22821
--- /dev/null
+++ b/core/modules/vmchooser/data/opt/openslx/vmchooser/themes/openslx/openslx.ini
@@ -0,0 +1,4 @@
+background-color=#ffffff
+image-right=openslx-right.png
+image-left=openslx-left.png
+
diff --git a/core/modules/vmchooser/module.build b/core/modules/vmchooser/module.build
new file mode 100644
index 00000000..cfb7fd41
--- /dev/null
+++ b/core/modules/vmchooser/module.build
@@ -0,0 +1,39 @@
+
+fetch_source() {
+ git clone "${REQUIRED_GIT}" src
+}
+
+build() {
+ local SRCDIR="${MODULE_WORK_DIR}/src/"
+
+ [ ! -d "${MODULE_BUILD_DIR}/${REQUIRED_PREFIX}" ] && mkdir -p "${MODULE_BUILD_DIR}/${REQUIRED_PREFIX}"
+ cd "${MODULE_BUILD_DIR}/${REQUIRED_PREFIX}"
+
+ # patch globals.cpp and globals.h to use standardised paths /opt/openslx/...
+ if ! grep -q VMCHOOSER_SCRIPTS_PATH "$SRCDIR/src/globals.h"; then
+ sed -i 's/^#define VMCHOOSER_BIN_PATH.*/#define VMCHOOSER_BIN_PATH "\/opt\/openslx\/bin"/g' "${SRCDIR}"/src/globals.h
+ sed -i 's/^#define VMCHOOSER_ETC_BASE_PATH.*/#define VMCHOOSER_ETC_BASE_PATH "\/opt\/openslx\/vmchooser\/config"/g' "${SRCDIR}"/src/globals.h
+ sed -i 's/^#define VMCHOOSER_BIN_PATH.*/#define VMCHOOSER_BIN_PATH "\/opt\/openslx\/bin"\n#define VMCHOOSER_SCRIPTS_PATH "\/opt\/openslx\/scripts"/g' "${SRCDIR}"/src/globals.h
+ sed -i 's/^#define VMCHOOSER_THEME_BASE.*/#define VMCHOOSER_THEME_BASE "\/opt\/openslx\/vmchooser\/themes"/g' "${SRCDIR}"/src/globals.h
+
+ sed -i 's/^QString binPath(VMCHOOSER_BIN_PATH);/QString binPath(VMCHOOSER_BIN_PATH);\nQString scriptsPath(VMCHOOSER_SCRIPTS_PATH);/g' "${SRCDIR}"/src/globals.cpp
+ sed -i 's/^QString runVmScript(binPath + "\/run-virt.sh");/QString runVmScript(scriptsPath + "\/vmchooser-run_virt");/g' "${SRCDIR}"/src/globals.cpp
+ sed -i 's/^QString filterScript(binPath + "\/xmlfilter.sh");/QString filterScript(scriptsPath + "\/vmchooser-xml_filter");/g' "${SRCDIR}"/src/globals.cpp
+ sed -i 's/^#define VMCHOOSER_VMPATH.*/#define VMCHOOSER_VMPATH "\/mnt\/vmstore"/g' "${SRCDIR}"/src/globals.h
+ fi
+
+ pinfo "Running cmake"
+
+ # activate qt 4
+ activate_qt 4
+
+ cmake "$SRCDIR" || perror "'cmake $SRCDIR' failed."
+ make || perror "'make' failed."
+
+ cd - &> /dev/null
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/vmchooser/module.conf b/core/modules/vmchooser/module.conf
new file mode 100644
index 00000000..686eb8bf
--- /dev/null
+++ b/core/modules/vmchooser/module.conf
@@ -0,0 +1,3 @@
+REQUIRED_GIT="git://git.openslx.org/openslx/tools/vmchooser.git"
+REQUIRED_PREFIX="/opt/openslx/bin"
+REQUIRED_BINARIES="vmchooser"
diff --git a/core/modules/vmchooser/module.conf.debian b/core/modules/vmchooser/module.conf.debian
new file mode 100644
index 00000000..2953ac63
--- /dev/null
+++ b/core/modules/vmchooser/module.conf.debian
@@ -0,0 +1,4 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cmake
+ libqt4-dev
+"
diff --git a/core/modules/vmchooser/module.conf.fedora b/core/modules/vmchooser/module.conf.fedora
new file mode 100644
index 00000000..d012e561
--- /dev/null
+++ b/core/modules/vmchooser/module.conf.fedora
@@ -0,0 +1,3 @@
+REQUIRED_INSTALLED_PACKAGES="
+ qt-devel
+"
diff --git a/core/modules/vmchooser/module.conf.opensuse b/core/modules/vmchooser/module.conf.opensuse
new file mode 100644
index 00000000..75cb7dd6
--- /dev/null
+++ b/core/modules/vmchooser/module.conf.opensuse
@@ -0,0 +1,4 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cmake
+ libqt4-devel
+"
diff --git a/core/modules/vmchooser/module.conf.ubuntu b/core/modules/vmchooser/module.conf.ubuntu
new file mode 100644
index 00000000..2953ac63
--- /dev/null
+++ b/core/modules/vmchooser/module.conf.ubuntu
@@ -0,0 +1,4 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cmake
+ libqt4-dev
+"
diff --git a/core/modules/vmchooser2/data/etc/tmpfiles.d/vmchooser-cache.conf b/core/modules/vmchooser2/data/etc/tmpfiles.d/vmchooser-cache.conf
new file mode 100644
index 00000000..3b2219d1
--- /dev/null
+++ b/core/modules/vmchooser2/data/etc/tmpfiles.d/vmchooser-cache.conf
@@ -0,0 +1,2 @@
+d /tmp/vmchooser2 0777 root root
+d /tmp/vmchooser2/icons 0777 root root
diff --git a/core/modules/vmchooser2/data/opt/openslx/bin/vmchooser b/core/modules/vmchooser2/data/opt/openslx/bin/vmchooser
new file mode 100755
index 00000000..a99207ff
--- /dev/null
+++ b/core/modules/vmchooser2/data/opt/openslx/bin/vmchooser
@@ -0,0 +1,36 @@
+#!/bin/ash
+
+# This script launches the real vmchooser (vmchooser.real)
+# It's here to pass the XML URL, coming from
+# /opt/openslx/config, as well as the pool filter (if any)
+
+. /opt/openslx/config
+
+if [ -n "$SLX_VMCHOOSER_BASE_URL" ]; then
+ URL="$SLX_VMCHOOSER_BASE_URL"
+elif [ -n "$SLX_PXE_SERVER_IP" ]; then
+ URL="http://$SLX_PXE_SERVER_IP/vmchooser/"
+else
+ slxlog "virt-vmchooser" "vmchooser: Could not determine URL to fetch VM list from! (need SLX_VMCHOOSER_BASE_URL)"
+ # TODO: Tell user
+fi
+
+MEM=$(grep -m1 '^MemTotal:' /proc/meminfo | awk '{print $2}')
+if [ -n "$SLX_VMCHOOSER_TAB" ] && [ "$SLX_VMCHOOSER_TAB" -ge 0 -a "$SLX_VMCHOOSER_TAB" -le 2 ] 2>/dev/null; then
+ TAB="$SLX_VMCHOOSER_TAB"
+elif [ "$MEM" -lt 3000000 ]; then # Check RAM size; if it's not that much, default to the native linux sessions
+ TAB=0
+else
+ TAB=2
+fi
+
+EXTRA=
+[ -n "$SLX_VMCHOOSER_TEMPLATES" ] && EXTRA="$EXTRA --template-mode $SLX_VMCHOOSER_TEMPLATES"
+[ -n "$SLX_VMCHOOSER_FORLOCATION" ] && EXTRA="$EXTRA --location-mode $SLX_VMCHOOSER_FORLOCATION"
+
+if [ -z "$SLX_LOCATIONS" ]; then
+ exec vmchooser.real "$@" --url "$URL" --fullscreen --tab "$TAB" $EXTRA
+fi
+
+exec vmchooser.real "$@" --url "$URL" --fullscreen --tab "$TAB" --locations "$SLX_LOCATIONS" $EXTRA
+
diff --git a/core/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart b/core/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart
new file mode 100755
index 00000000..1cc7eb5f
--- /dev/null
+++ b/core/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart
@@ -0,0 +1,18 @@
+#!/bin/ash
+
+SOURCEPATH="/opt/openslx/vmchooser/sessionstart.d"
+
+if [ -d "$SOURCEPATH" ]; then
+ for file in $SOURCEPATH/*; do
+ "$file"
+ RET=$?
+ if [ "$RET" != 0 ]; then
+ param="$file"
+ [ "$(head -n 1 "$file" | cut -b 1)" != "#" ] && param=
+ slxlog "vmchooser-sessionstart" "$file returned $RET at session start!" "$param"
+ fi
+ done
+fi
+
+exit 0
+
diff --git a/core/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart.d/log-selected-session b/core/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart.d/log-selected-session
new file mode 100755
index 00000000..2499b3b7
--- /dev/null
+++ b/core/modules/vmchooser2/data/opt/openslx/vmchooser/sessionstart.d/log-selected-session
@@ -0,0 +1,5 @@
+#!/bin/ash
+
+[ -n "$SESSION_NAME" ] && slxlog ".vmchooser-session-name" "$SESSION_NAME"
+
+exit 0
diff --git a/core/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-left.png b/core/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-left.png
new file mode 100644
index 00000000..c9d8ab0d
--- /dev/null
+++ b/core/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-left.png
Binary files differ
diff --git a/core/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-right.png b/core/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-right.png
new file mode 100644
index 00000000..8ca9347b
--- /dev/null
+++ b/core/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool-right.png
Binary files differ
diff --git a/core/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool.ini b/core/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool.ini
new file mode 100644
index 00000000..90d00617
--- /dev/null
+++ b/core/modules/vmchooser2/data/opt/openslx/vmchooser/themes/bwlehrpool/bwlehrpool.ini
@@ -0,0 +1,4 @@
+background-color=#ffffff
+image-right=bwlehrpool-right.png
+image-left=bwlehrpool-left.png
+
diff --git a/core/modules/vmchooser2/module.build b/core/modules/vmchooser2/module.build
new file mode 100644
index 00000000..3686aa75
--- /dev/null
+++ b/core/modules/vmchooser2/module.build
@@ -0,0 +1,39 @@
+
+fetch_source() {
+ git clone "${REQUIRED_GIT}" src
+}
+
+build() {
+ local SRCDIR="${MODULE_WORK_DIR}/src/"
+
+ [ ! -d "${MODULE_BUILD_DIR}/${REQUIRED_PREFIX}" ] && mkdir -p "${MODULE_BUILD_DIR}/${REQUIRED_PREFIX}"
+ cd "${MODULE_BUILD_DIR}/${REQUIRED_PREFIX}"
+
+ # patch globals.cpp and globals.h to use standardised paths /opt/openslx/...
+ if ! grep -q VMCHOOSER_SCRIPTS_PATH "$SRCDIR/src/globals.h"; then
+ sed -i 's/^#define VMCHOOSER_ETC_BASE_PATH.*/#define VMCHOOSER_ETC_BASE_PATH "\/opt\/openslx\/vmchooser\/config"/g' "${SRCDIR}/src/globals.h"
+ sed -i 's/^#define VMCHOOSER_BIN_PATH.*/#define VMCHOOSER_BIN_PATH "\/opt\/openslx\/bin"\n#define VMCHOOSER_SCRIPTS_PATH "\/opt\/openslx\/scripts"/g' "${SRCDIR}/src/globals.h"
+ sed -i 's/^#define VMCHOOSER_THEME_BASE.*/#define VMCHOOSER_THEME_BASE "\/opt\/openslx\/vmchooser\/themes"/g' "${SRCDIR}/src/globals.h"
+
+ sed -i 's/^QString binPath(VMCHOOSER_BIN_PATH);/QString binPath(VMCHOOSER_BIN_PATH);\nQString scriptsPath(VMCHOOSER_SCRIPTS_PATH);/g' "${SRCDIR}/src/globals.cpp"
+ sed -i 's/^QString runVmScript(binPath + "\/run-virt.sh");/QString runVmScript(scriptsPath + "\/vmchooser-run_virt");/g' "${SRCDIR}/src/globals.cpp"
+ sed -i 's/^QString filterScript(binPath + "\/xmlfilter.sh");/QString filterScript(scriptsPath + "\/vmchooser-xml_filter");/g' "${SRCDIR}/src/globals.cpp"
+ sed -i 's/^#define VMCHOOSER_VMPATH.*/#define VMCHOOSER_VMPATH "\/mnt\/vmstore"/g' "${SRCDIR}/src/globals.h"
+ fi
+
+ pinfo "Running cmake"
+
+ # use qt4-dev (in case eg. qt4 and 5 are installed)
+ activate_qt 4
+
+ cmake "$SRCDIR" || perror "'cmake $SRCDIR' failed."
+ make || perror "'make' failed."
+ mv "vmchooser" "vmchooser.real" || perror "Could not rename vmchooser binary to vmchooser.real"
+
+ cd - > /dev/null
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/vmchooser2/module.conf b/core/modules/vmchooser2/module.conf
new file mode 100644
index 00000000..b098d7a5
--- /dev/null
+++ b/core/modules/vmchooser2/module.conf
@@ -0,0 +1,3 @@
+REQUIRED_GIT="git://git.openslx.org/openslx-ng/vmchooser2.git"
+REQUIRED_PREFIX="/opt/openslx/bin"
+REQUIRED_BINARIES="vmchooser.real"
diff --git a/core/modules/vmchooser2/module.conf.debian b/core/modules/vmchooser2/module.conf.debian
new file mode 100644
index 00000000..2953ac63
--- /dev/null
+++ b/core/modules/vmchooser2/module.conf.debian
@@ -0,0 +1,4 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cmake
+ libqt4-dev
+"
diff --git a/core/modules/vmchooser2/module.conf.opensuse b/core/modules/vmchooser2/module.conf.opensuse
new file mode 100644
index 00000000..75cb7dd6
--- /dev/null
+++ b/core/modules/vmchooser2/module.conf.opensuse
@@ -0,0 +1,4 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cmake
+ libqt4-devel
+"
diff --git a/core/modules/vmchooser2/module.conf.ubuntu b/core/modules/vmchooser2/module.conf.ubuntu
new file mode 100644
index 00000000..2953ac63
--- /dev/null
+++ b/core/modules/vmchooser2/module.conf.ubuntu
@@ -0,0 +1,4 @@
+REQUIRED_INSTALLED_PACKAGES="
+ cmake
+ libqt4-dev
+"
diff --git a/core/modules/vmware/data/addon-init b/core/modules/vmware/data/addon-init
new file mode 100755
index 00000000..d844c282
--- /dev/null
+++ b/core/modules/vmware/data/addon-init
@@ -0,0 +1,6 @@
+#!/bin/ash
+
+systemctl daemon-reload
+systemctl start vmware
+exit 0
+
diff --git a/core/modules/vmware/data/etc/X11/Xreset.d/vmware b/core/modules/vmware/data/etc/X11/Xreset.d/vmware
new file mode 100644
index 00000000..83bfb392
--- /dev/null
+++ b/core/modules/vmware/data/etc/X11/Xreset.d/vmware
@@ -0,0 +1,17 @@
+#
+# VMWare cleanup
+#
+
+# Unmount dirs that vmware sometimes leaves around
+VMWARE_TMP_DIRS="$(cat /proc/mounts | grep "/tmp/vmware-" | awk -F " " '{print $1}')"
+for DIR in $VMWARE_TMP_DIRS; do
+ umount "$DIR" && rmdir "$DIR"
+done
+
+# Delete redo/temp files that sometimes stay around e.g. on vmware crash
+for file in $(find /tmp/virt/vmware -type f -size +4M); do
+ fuser -s "$file" || rm -- "$file"
+done
+
+true
+
diff --git a/core/modules/vmware/data/etc/systemd/system/graphical.target.wants/vmware.service b/core/modules/vmware/data/etc/systemd/system/graphical.target.wants/vmware.service
new file mode 120000
index 00000000..7deb4820
--- /dev/null
+++ b/core/modules/vmware/data/etc/systemd/system/graphical.target.wants/vmware.service
@@ -0,0 +1 @@
+../vmware.service \ No newline at end of file
diff --git a/core/modules/vmware/data/etc/systemd/system/vmware.service b/core/modules/vmware/data/etc/systemd/system/vmware.service
new file mode 100644
index 00000000..78f75726
--- /dev/null
+++ b/core/modules/vmware/data/etc/systemd/system/vmware.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Sets up the vmware environment
+Requires=run-virt-env.service setup-partitions.service network.target
+After=run-virt-env.service setup-partitions.service network.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-vmware_env start
diff --git a/core/modules/vmware/data/etc/vmware-vix/bootstrap b/core/modules/vmware/data/etc/vmware-vix/bootstrap
new file mode 100644
index 00000000..425074de
--- /dev/null
+++ b/core/modules/vmware/data/etc/vmware-vix/bootstrap
@@ -0,0 +1,2 @@
+BINDIR="/usr/bin"
+
diff --git a/core/modules/vmware/data/etc/vmware/bootstrap b/core/modules/vmware/data/etc/vmware/bootstrap
new file mode 100644
index 00000000..0cc4af90
--- /dev/null
+++ b/core/modules/vmware/data/etc/vmware/bootstrap
@@ -0,0 +1,12 @@
+PREFIX="/usr"
+BINDIR="/usr/bin"
+SBINDIR="/usr/sbin"
+LIBDIR="/usr/lib"
+DATADIR="/usr/share"
+SYSCONFDIR="/etc"
+DOCDIR="/usr/share/doc"
+MANDIR="/usr/share/man"
+INCLUDEDIR="/usr/include"
+INITDIR="/etc"
+INITSCRIPTDIR="/etc/init.d"
+
diff --git a/core/modules/vmware/data/etc/vmware/icu b/core/modules/vmware/data/etc/vmware/icu
new file mode 120000
index 00000000..d1ebea7d
--- /dev/null
+++ b/core/modules/vmware/data/etc/vmware/icu
@@ -0,0 +1 @@
+/usr/lib/vmware/icu \ No newline at end of file
diff --git a/core/modules/vmware/data/etc/vmware/locations b/core/modules/vmware/data/etc/vmware/locations
new file mode 100644
index 00000000..2d419546
--- /dev/null
+++ b/core/modules/vmware/data/etc/vmware/locations
@@ -0,0 +1,3 @@
+# Empty locations file to catch downgrade
+# to WS 6.0
+# OpenSLX: No idea what above means, but better have this file... ;-)
diff --git a/core/modules/vmware/data/etc/vmware/usbarb.rules b/core/modules/vmware/data/etc/vmware/usbarb.rules
new file mode 100644
index 00000000..ae107c7b
--- /dev/null
+++ b/core/modules/vmware/data/etc/vmware/usbarb.rules
@@ -0,0 +1,4 @@
+{
+ "version": 1,
+ "rules": []
+}
diff --git a/core/modules/vmware/data/opt/openslx/bin/vmplayer b/core/modules/vmware/data/opt/openslx/bin/vmplayer
new file mode 100755
index 00000000..cfb91a0a
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/bin/vmplayer
@@ -0,0 +1,17 @@
+#!/bin/ash
+# radically simplified version of the original script vmplayer by VMware Inc.
+PREFIX=/usr/lib/vmware # depends on the vmware location
+
+# HACK: Let the OpenGL driver report s3tc capability even if not present, so 3D will be enabled
+export force_s3tc_enable=true
+
+PROG=$(basename $0)
+
+exec "$PREFIX/lib/wrapper-gtk24.sh" \
+ "$PREFIX/lib" \
+ "$PREFIX/bin/$PROG" \
+ "$PREFIX/libconf" "$@"
+
+
+
+
diff --git a/core/modules/vmware/data/opt/openslx/bin/vmware b/core/modules/vmware/data/opt/openslx/bin/vmware
new file mode 120000
index 00000000..aa0b74b1
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/bin/vmware
@@ -0,0 +1 @@
+vmplayer \ No newline at end of file
diff --git a/core/modules/vmware/data/opt/openslx/scripts/systemd-vmware_env b/core/modules/vmware/data/opt/openslx/scripts/systemd-vmware_env
new file mode 100755
index 00000000..fb33e261
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/scripts/systemd-vmware_env
@@ -0,0 +1,101 @@
+#!/bin/ash
+# -----------------------------------------------------------------------------
+# Copyright (c) 2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# systemd-vmware_env
+# - This is the systemd configuration and provisioning script for the various
+# VMware modules and services
+################################################################################
+
+VMWARE_CONF_DIR=/opt/openslx/vmchooser/vmware
+VMCHOOSER_CONF_DIR=/opt/openslx/vmchooser/config
+
+load_modules () {
+ local FAILED=""
+ # module stuff
+ insmod /lib/modules/vmware/vmmon.ko || FAILED="$FAILED vmmon"
+ insmod /lib/modules/vmware/vmnet.ko || FAILED="$FAILED vmnet"
+ #insmod /lib/modules/vmware/vmci.ko || FAILED="$FAILED vmci"
+ #insmod /lib/modules/vmware/vmblock.ko || FAILED="$FAILED vmblock"
+ #insmod /lib/modules/vmware/vsock.ko || FAILED="$FAILED vsock"
+ [ -n "$FAILED" ] && slxlog "vmware-insmod" "Error loading vmware kernel module(s) $FAILED"
+}
+
+unload_modules () {
+ rmmod vmnet vmmon #vsock vmci vmblock
+}
+
+vmnetif () {
+ # create the needed devices which effects all vmware options
+ # they are not created automatically via module load
+ for device in "/dev/vmnet0 c 119 0" "/dev/vmnet1 c 119 1" \
+ "/dev/vmnet2 c 119 2" "/dev/vmmon c 10 165"; do
+ mknod ${device}
+ done
+ chmod 0700 /dev/vmnet*
+
+ # setup bridge (vmnet0), nat (vmnet1) and software defined networking (vmnet2) interfaces
+ if ! /usr/bin/vmnet-netifup -d /var/run/vmnet-netifup-vmnet0.pid /dev/vmnet0 vmnet0 ; then
+ slxlog "vmware-netifup" "Launching /usr/bin/vmnet-netifup for vmnet0 failed."
+ fi
+ ip link set dev vmnet0 up
+ brctl addif br0 vmnet0
+ if ! /usr/bin/vmnet-netifup -d /var/run/vmnet-netifup-vmnet1.pid /dev/vmnet1 vmnet1; then
+ slxlog "vmware-netifup" "Launching /usr/bin/vmnet-netifup for vmnet1 failed."
+ fi
+ ip link set dev vmnet1 up
+ brctl addif nat1 vmnet1
+ if ! /usr/bin/vmnet-netifup -d /var/run/vmnet-netifup-vmnet2.pid /dev/vmnet2 vmnet2; then
+ slxlog "vmware-netifup" "Launching /usr/bin/vmnet-netifup for vmnet2 failed."
+ fi
+ ip link set dev vmnet2 up
+ brctl addif vsw2 vmnet2
+}
+
+vmblock () {
+ if ! /usr/bin/vmware-usbarbitrator; then
+ slxlog "vmware-usbarb" "Launching /usr/bin/vmware-usbarbitrator failed."
+ fi
+}
+
+# create required standard directories
+mkdir -p "/tmp/virt/vmware" "/dev/shm/vmware" "/run/vmware" -m 1777
+
+# FixMe: Should be rewritten for proper systemd operation
+case "$1" in
+ start)
+ # hack to access the first serial/parallel port
+ [ -c /dev/ttyS0 ] && chmod a+rw /dev/ttyS0
+ [ -c /dev/parport0 ] && chmod a+rw /dev/parport0
+ load_modules
+ vmnetif
+ vmblock
+ ;;
+ stop)
+ #stop: defines stop function for initscript
+ killall vmnet-netifup vmnet-bridge vmware vmplayer vmware-tray
+ # might take a while until all services are shut down
+ sleep 0.5
+ unload_modules
+
+ ;;
+ restart)
+ #restart: defines restart function for initscript
+ $0 stop && $0 start
+ ;;
+ status)
+ #status: defines status function for initscript
+ vmstatus
+ ;;
+esac
+
+exit 0
+
diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc
new file mode 100644
index 00000000..b618041c
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmhome_preferences_file.inc
@@ -0,0 +1,71 @@
+create_vmhome_preferences_file() {
+ cat > "$vmhome/preferences" <<-HEREEND
+ .encoding = "UTF-8"
+ # This configuration file was generated by $0
+
+ # updates
+ webUpdate.enabled = "FALSE"
+ webUpdate.lastCheck.status = "done_updates"
+ webUpdate.checkPeriod = "never"
+ pref.downloadPermission = "DENY"
+ pref.vmplayer.downloadPermission = "DENY"
+ pref.vmplayer.webUpdateOnStartup = "FALSE"
+ pref.lastUpdateCheckSec = "$(date +%s)"
+ # hints
+ pref.tip.startup = "FALSE"
+ hints.hideAll = "TRUE"
+ hint.vmui.showAllUSBDevs = "FALSE"
+ hint.usb.disconnectHostdriver = "FALSE"
+ hint.vmui.reset = "FALSE"
+ hint.vmui.poweroff = "FALSE"
+ hint.upgrade.legacyVM = "FALSE"
+ hint.tools.toolsReminder = "FALSE"
+ hint.nfsmounted.persistent = "FALSE"
+ hint.loader.debug.beta = "FALSE"
+ hint.leaveFullScreen = "FALSE"
+ hint.guestos.xp = "FALSE"
+ hint.buslogic.needDriver = "FALSE"
+
+ # configs
+ prefvmx.defaultVMPath = "$vmhome"
+ prefvmx.mru.config = "$conffile:"
+
+ # hot keys
+ pref.hotkey.control = "true"
+ pref.hotkey.alt = "true"
+ pref.hotkey.shift = "true"
+ pref.hotkey.gui = "true"
+
+ # fullscreen/mouse/keyboard
+ pref.fullscreen.toolbarPixels = "0"
+ pref.vmplayer.fullscreen.autohide = "TRUE"
+ pref.vmplayer.fullscreen.nobar = 1
+ pref.grabOnMouseClick = "TRUE"
+ pref.grabOnKeyPress = "TRUE"
+ pref.motionGrab = "TRUE"
+ pref.motionUngrab = "TRUE"
+ pref.hideCursorOnUngrab = "TRUE"
+ pref.autoFit = "TRUE"
+ pref.autoFitFullScreen = "fitGuestToHost"
+ pref.autoFitGuestToWindow = "TRUE"
+ pref.vmplayer.exit.vmAction = "poweroff"
+ pref.vmplayer.confirmOnExit = "TRUE"
+ pref.backgroundOnClose = "FALSE"
+ pref.trayicon.enabled = "FALSE"
+
+ # shared folders
+ pref.enableAllSharedFolders = "TRUE"
+
+ # eula
+ pref.vmplayer.firstRunDismissedVersion = "$vmware_version"
+ pref.eula.count = "2"
+ pref.eula0.product = "VMware Player"
+ pref.eula0.build = "$vmware_build"
+ pref.eula1.product = "VMware Workstation"
+ pref.eula1.build = "$vmware_build"
+ HEREEND
+ if [ -n "$SLX_EXAM" ]; then
+ echo 'pref.hotkey.rightControl = "true"' >> "$vmhome/preferences"
+ fi
+ writelog "Vmware preferences file created in $vmhome."
+}
diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file.inc
new file mode 100644
index 00000000..5d33ce16
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file.inc
@@ -0,0 +1,186 @@
+########################################
+# Include: Create vmware startup files #
+########################################
+
+writelog "Creating vmware configuration file: $conffile"
+
+MAXMEM="9999999"
+MAXCORES="4"
+shfolders="TRUE"
+sound="es1371"
+
+# define hardware configuration depending on the guest OS used
+# this needs to be fixed and is the base for the creation of new VMs
+case "$vmostype" in
+ win31*|windows31*)
+ vmostype="win31"
+ shfolders="FALSE"
+ sound="sb16"
+ MAXMEM="32"
+ MAXCORES="1"
+ ;;
+ winnt*|windowsnt*)
+ vmostype="winnt"
+ shfolders="FALSE"
+ sound="sb16"
+ MAXMEM="1000"
+ MAXCORES="2"
+ ;;
+ win95*|windows95*)
+ vmostype="win95"
+ shfolders="FALSE"
+ MAXMEM="96"
+ MAXCORES="1"
+ ;;
+ win98*|windows98*)
+ vmostype="win98"
+ MAXMEM="256"
+ MAXCORES="1"
+ ;;
+ winme*|windowsme*)
+ vmostype="winme"
+ MAXMEM="384"
+ MAXCORES="1"
+ ;;
+ win2000|windows2000|win2000pro*)
+ vmostype="win2000pro"
+ MAXMEM="4000"
+ MAXCORES="2"
+ ;;
+ win2000srv*|windows2000srv*|win2000serv*|windows2000serv*)
+ vmostype="win2000serv"
+ shfolders="FALSE"
+ MAXMEM="4000"
+ MAXCORES="4"
+ ;;
+ win2000adv*|windows2000adv*|win2000dat*|windows2000dat*)
+ vmostype="win2000advserv"
+ shfolders="FALSE"
+ MAXMEM="8000"
+ MAXCORES="8"
+ ;;
+ winnet*64|win*2003*64|windowsnet*64)
+ vmostype="winnetstandard-64"
+ MAXMEM="8000"
+ ;;
+ winnet*|win*2003*|windowsnet*)
+ vmostype="winnetstandard"
+ MAXMEM="4000"
+ ;;
+ winxphome*|windowsxphome*)
+ vmostype="winxphome"
+ MAXMEM="4000"
+ MAXCORES="1"
+ ;;
+ winxp*64|windowsxp*64)
+ vmostype="winxppro-64"
+ MAXMEM="8000"
+ MAXCORES="2"
+ ;;
+ winxp*|windowsxp*)
+ vmostype="winxppro"
+ MAXMEM="4000"
+ MAXCORES="1"
+ ;;
+ winvista-64)
+ vmostype="winvista-64"
+ MAXMEM="16000"
+ MAXCORES="2"
+ ;;
+ windows7-64)
+ vmostype="windows7-64"
+ MAXMEM="32000"
+ MAXCORES="4"
+ ;;
+ windows8-64)
+ vmostype="windows8-64"
+ MAXMEM="32000"
+ MAXCORES="8"
+ ;;
+ windows9-64)
+ vmostype="windows9-64"
+ MAXMEM="64000"
+ MAXCORES="8"
+ ;;
+ winvista)
+ vmostype="winvista"
+ MAXMEM="8000"
+ MAXCORES="2"
+ ;;
+ windows7)
+ vmostype="windows7"
+ MAXMEM="8000"
+ MAXCORES="4"
+ ;;
+ windows8)
+ vmostype="windows8"
+ MAXMEM="8000"
+ MAXCORES="4"
+ ;;
+ windows9)
+ vmostype="windows9"
+ MAXMEM="8000"
+ MAXCORES="4"
+ ;;
+ win*64)
+ MAXMEM="16000"
+ MAXCORES="4"
+ ;;
+ win*)
+ MAXMEM="8000"
+ ;;
+ dos|msdos*|ms-dos*)
+ vmostype="dos"
+ shfolders="FALSE"
+ MAXMEM="128"
+ ;;
+ macos*64)
+ vmostype="freebsd-64"
+ MAXMEM="4000"
+ MAXCORES="2"
+ ;;
+ macos*)
+ vmostype="freebsd"
+ MAXMEM="4000"
+ MAXCORES="1"
+ ;;
+ beos*)
+ vmostype="other"
+ shfolders="FALSE"
+ ;;
+ # Unknown guestOS setting in .xml - this encompasses linux too,
+ # as there is a multitude of different distributions. Perhaps further
+ # action will be needed if this leads to problems with exotic OSs.
+ *64)
+ vmostype="other-64"
+ # shfolders="FALSE"
+ MAXMEM="123456"
+ MAXCORES="4"
+ ;;
+ *)
+ vmostype="other"
+ # shfolders="FALSE"
+ MAXMEM="8000"
+ MAXCORES="1"
+ ;;
+esac
+
+real_core_count="$cpu_cores"
+[ "$cpu_cores" -gt "$MAXCORES" ] && cpu_cores="$MAXCORES"
+
+# It currently makes no sense to set the virtual number of cores
+# to a different value than the virtual number of cores per virtual CPU.
+cores_per_socket="$cpu_cores"
+
+if [ "x$shfolders" != "xFALSE" ]; then
+ ENABLE_SHARE='sharedFolder.option = "alwaysEnabled"'
+else
+ ENABLE_SHARE=''
+fi
+
+[ "$mem" -ge "$MAXMEM" ] && mem="$MAXMEM"
+[ "$hwver" -lt "7" -a "$mem" -gt "3500" ] && mem="3500"
+
+# set the appropriate permissions for the vmware config file
+chmod u+rwx "${conffile}" >/dev/null 2>&1
+
diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file_legacy.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file_legacy.inc
new file mode 100644
index 00000000..1d6b2185
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/create_vmware_config_file_legacy.inc
@@ -0,0 +1,312 @@
+########################################
+# Include: Create vmware startup files #
+########################################
+
+create_vmware_config_file_legacy() {
+ echo "# This configuration file was generated by $0" > "$conffile"
+
+ MAXMEM="9999999"
+ MAXCORES="4"
+ shfolders="TRUE"
+ sound="es1371"
+
+ # define hardware configuration depending on the guest OS used
+ # this needs to be fixed and is the base for the creation of new VMs
+ case "$vmostype" in
+ win31*|windows31*)
+ vmostype="win31"
+ shfolders="FALSE"
+ sound="sb16"
+ MAXMEM="32"
+ MAXCORES="1"
+ ;;
+ winnt*|windowsnt*)
+ vmostype="winnt"
+ shfolders="FALSE"
+ sound="sb16"
+ MAXMEM="1000"
+ MAXCORES="2"
+ ;;
+ win95*|windows95*)
+ vmostype="win95"
+ shfolders="FALSE"
+ MAXMEM="96"
+ MAXCORES="1"
+ ;;
+ win98*|windows98*)
+ vmostype="win98"
+ MAXMEM="256"
+ MAXCORES="1"
+ ;;
+ winme*|windowsme*)
+ vmostype="winme"
+ MAXMEM="384"
+ MAXCORES="1"
+ ;;
+ win2000|windows2000|win2000pro*)
+ vmostype="win2000pro"
+ MAXMEM="4000"
+ MAXCORES="2"
+ ;;
+ win2000srv*|windows2000srv*|win2000serv*|windows2000serv*)
+ vmostype="win2000serv"
+ shfolders="FALSE"
+ MAXMEM="4000"
+ MAXCORES="4"
+ ;;
+ win2000adv*|windows2000adv*|win2000dat*|windows2000dat*)
+ vmostype="win2000advserv"
+ shfolders="FALSE"
+ MAXMEM="8000"
+ MAXCORES="8"
+ ;;
+ winnet*64|win*2003*64|windowsnet*64)
+ vmostype="winnetstandard-64"
+ MAXMEM="8000"
+ ;;
+ winnet*|win*2003*|windowsnet*)
+ vmostype="winnetstandard"
+ MAXMEM="4000"
+ ;;
+ winxphome*|windowsxphome*)
+ vmostype="winxphome"
+ MAXMEM="4000"
+ MAXCORES="1"
+ ;;
+ winxp*64|windowsxp*64)
+ vmostype="winxppro-64"
+ MAXMEM="8000"
+ MAXCORES="2"
+ ;;
+ winxp*|windowsxp*)
+ vmostype="winxppro"
+ MAXMEM="4000"
+ MAXCORES="1"
+ ;;
+ winvista*64|windowsvista*64)
+ vmostype="winvista-64"
+ MAXMEM="16000"
+ MAXCORES="2"
+ ;;
+ winvista*|windowsvista*)
+ vmostype="winvista"
+ MAXMEM="8000"
+ MAXCORES="2"
+ ;;
+ win7*64|windows7*64)
+ vmostype="windows7-64"
+ MAXMEM="32000"
+ MAXCORES="4"
+ ;;
+ win7*|windows7*)
+ vmostype="windows7"
+ MAXMEM="8000"
+ MAXCORES="4"
+ ;;
+ win8*64|windows8*64)
+ vmostype="windows8-64"
+ MAXMEM="32000"
+ MAXCORES="4"
+ ;;
+ win8*|windows8*)
+ vmostype="windows8"
+ MAXMEM="8000"
+ MAXCORES="4"
+ ;;
+ win*64)
+ MAXMEM="16000"
+ MAXCORES="4"
+ ;;
+ win*)
+ MAXMEM="8000"
+ ;;
+ dos|msdos*|ms-dos*)
+ vmostype="dos"
+ shfolders="FALSE"
+ MAXMEM="128"
+ ;;
+ macos*64)
+ vmostype="freebsd-64"
+ MAXMEM="4000"
+ MAXCORES="2"
+ ;;
+ macos*)
+ vmostype="freebsd"
+ MAXMEM="4000"
+ MAXCORES="1"
+ ;;
+ beos*)
+ vmostype="other"
+ shfolders="FALSE"
+ ;;
+ # Unknown guestOS setting in .xml - use conservative defaults
+ *64)
+ vmostype="other-64"
+ shfolders="FALSE"
+ MAXMEM="123456"
+ MAXCORES="4"
+ ;;
+ *)
+ vmostype="other"
+ shfolders="FALSE"
+ MAXMEM="8000"
+ MAXCORES="1"
+ ;;
+ esac
+ real_core_count="$cpu_cores"
+ [ "$cpu_cores" -gt "$MAXCORES" ] && cpu_cores="$MAXCORES"
+ # It currently makes no sense to set the virtual number of cores
+ # to a different value than the virtual number of cores per virtual CPU.
+ cores_per_socket="$cpu_cores"
+
+ if [ "x$shfolders" != "xFALSE" ]; then
+ ENABLE_SHARE='sharedFolder.option = "alwaysEnabled"'
+ else
+ ENABLE_SHARE=''
+ fi
+
+ [ "$mem" -ge "$MAXMEM" ] && mem="$MAXMEM"
+ [ "$hwver" -lt "7" -a "$mem" -gt "3500" ] && mem="3500"
+
+ cap3d="WHAT IS THIS VAR USED FOR?" # helper var for loging output
+
+
+ cat >> "$conffile" <<-HEREEND
+ .encoding = "UTF-8"
+ config.version = "8"
+
+ # general hardware (ehci, 3d accel)
+ ehci.present = "TRUE"
+ $FORCE3D
+ mks.enable3d = "$enable3d"
+
+ monitor.virtual_mmu = "automatic"
+ monitor.virtual_exec = "automatic"
+ floppy1.clientDevice = "FALSE"
+ floppy1.readonly = "TRUE"
+
+ # id
+ virtualHW.version = "$hwver"
+ displayName = "$displayname"
+ guestOS = "$vmostype"
+
+ # CPU/MEM
+ numvcpus = "$cpu_cores"
+ cpuid.coresPerSocket = "$cores_per_socket"
+ maxvcpus = "$real_core_count"
+ memsize = "$mem"
+ MemAllowAutoScaleDown = "FALSE"
+ MemTrimRate = "-1"
+
+ # ide-disks
+ ide0:0.present = "$ide"
+ ide0:0.fileName = "$vm_diskfile"
+ ## Edited for persistent mode.
+ ide0:0.mode = "independent-${diskmode}"
+ ##
+ ide1:0.present = "$cdrom0"
+ ide1:0.autodetect = "TRUE"
+ ide1:0.fileName = "auto detect"
+ ide1:0.deviceType = "cdrom-raw"
+ ide1:1.present = "$cdrom1"
+ ide1:1.autodetect = "TRUE"
+ ide1:1.fileName = "auto detect"
+ ide1:1.deviceType = "cdrom-raw"
+
+ # scsi-disks
+ scsi0.present = "$scsi"
+ scsi0:0.present = "$scsi"
+ scsi0:0.fileName = "$vm_diskfile"
+ scsi0.virtualDev = "$hddrv"
+ ## Edited for persistent mode.
+ scsi0:0.mode = "independent-${diskmode}"$stateFileConfiguration
+ ##
+
+ # floppies
+ floppy0.present = "$floppy0"
+ floppy0.startConnected = "FALSE"
+ floppy0.autodetect = "TRUE"
+ floppy0.fileName = "auto detect"
+
+ # we need floppy b: for the client configuration
+ floppy1.present = "$floppy1"
+ floppy1.startConnected = "TRUE"
+ floppy1.fileType = "file"
+ floppy1.fileName = "$floppy1name"
+
+ # nics
+ ethernet0.present = "TRUE"
+ ethernet0.addressType = "static"
+ $network_virtualDev
+ #ethernet0.connectionType = "hostonly"
+ ethernet0.connectionType = "custom"
+ ethernet0.vnet = "$hostdev"
+ ethernet0.address = "00:50:56:$macaddrsuffix"
+ ethernet0.wakeOnPcktRcv = "FALSE"
+
+ # sound
+ sound.present = "TRUE"
+ $sound_fileName
+ sound.virtualdev = "$sound"
+ pciSound.enableVolumeControl = "FALSE"
+ sound.enableVolumeControl = "FALSE"
+
+ # svga
+ svga.autodetect = "TRUE"
+
+ # usb
+ usb.present = "TRUE"
+ usb.generic.autoconnect = "TRUE"
+
+ # pci configuration
+ usb.pciSlotNumber = "16"
+ ethernet0.pciSlotNumber = "17"
+ sound.pciSlotNumber = "18"
+ ehci.pciSlotNumber = "19"
+ scsi0.pciSlotNumber = "20"
+
+ $PCIE
+
+ # shared folders
+ $ENABLE_SHARE
+ sharedFolder0.present = "$shfolders"
+ sharedFolder0.enabled = "$shfolders"
+ sharedFolder0.expiration = "never"
+ sharedFolder0.guestName = "$homesharename"
+ sharedFolder0.hostPath = "$homesharepath"
+ sharedFolder0.readAccess = "TRUE"
+ sharedFolder0.writeAccess = "TRUE"
+ sharedFolder1.present = "$shfolders"
+ sharedFolder1.enabled = "$shfolders"
+ sharedFolder1.expiration = "never"
+ sharedFolder1.guestName = "$commonsharename"
+ sharedFolder1.hostPath = "$commonsharepath"
+ sharedFolder1.readAccess = "TRUE"
+ sharedFolder1.writeAccess = "TRUE"
+ sharedFolder.maxNum = "2"
+
+ # dirs/configs
+ tmpDirectory = "$redodir"
+ redoLogDir = "$redodir"
+ mainMem.useNamedFile = "TRUE"
+ snapshot.disabled = "TRUE"
+ tools.syncTime = "TRUE"
+ isolation.tools.hgfs.disable = "FALSE"
+ hgfs.mapRootShare = "TRUE"
+ isolation.tools.dnd.disable = "FALSE"
+ isolation.tools.copy.enable = "TRUE"
+ isolation.tools.paste.enabled = "TRUE"
+
+ # serial port
+ serial0.present = "$serial"
+ $serialdev
+
+ # parallel port
+ parallel0.present = "$parallel"
+ parallel0.bidirectional = "$paralbidi"
+ $paraldev
+ HEREEND
+
+ # set the appropriate permissions for the vmware config file
+ chmod u+rwx "${conffile}" >/dev/null 2>&1
+}
diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/logging.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/logging.inc
new file mode 100644
index 00000000..dc01434d
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/logging.inc
@@ -0,0 +1,64 @@
+###############################
+# Include: Logging and stdout #
+###############################
+
+logging() {
+ # log script information
+ writelog "# File created by $0 (VMware version ${vmware_version})\n# on $(date)\n"
+ ## Edited for persistent mode.
+ writelog "Starting with ${diskmode} mode ...\n"
+ ##
+
+ # write all results to logfile
+ # log disksetup
+ writelog "Directories:"
+ writelog "\tConfdir:\t${confdir}"
+ writelog "\tConffile:\t${conffile}"
+ writelog "\tRedodir:\t${redodir}"
+ writelog "\tVMhome:\t\t${vmhome}"
+ writelog "\t/tmp info: $(grep "/tmp " /proc/mounts) $(df -h | grep " /tmp$" | awk '{print $2}')"
+ # hw setup
+ writelog "Hardware:"
+ writelog "\tMAC:\t\t00:50:56:$macaddrsuffix" # TODO: Make var at top for this, it's hard coded twice
+ if [ -n "${network_card}" ]; then
+ writelog "\tNet Adaptor:\t${network_card}"
+ fi
+ writelog "\tMem:\t\t${mem} MB"
+
+ # echo nur wenn hostmem gesetzt
+ [ -n "${hostmem}" ] && writelog "\tHostmem:\t${hostmem} MB"
+ writelog "\tMax. res.:\t${xres}x${yres}"
+ writelog "\tCD-ROM1:\t${cdrom0}"
+ writelog "\tCD-ROM2:\t${cdrom1}"
+ writelog "\tFloppy_A:\t${floppy0}"
+ if [ "${serial}" = "TRUE" ]; then
+ writelog "\tSerial Port:\t${serialdev}"
+ fi
+ if [ "${parallel}" = "TRUE" ]; then
+ writelog "\tParallel Port:\t${paraldev}"
+ fi
+
+ writelog "Shared folders:"
+ if [ "${ENABLE_SHARE}" = '' ]; then
+ writelog "\tNo shared folders enabled."
+ else
+ writelog "\Shared folders enabled ($ENABLE_SHARE)"
+ fi
+
+ # image
+ writelog "Diskimage:"
+ writelog "\tDiskfile:\t${diskfile}"
+ writelog "\tDisktype:\t${hddrv}"
+ writelog "\tHWVersion:\t${hwver}"
+ writelog "\tVMostype:\t${vmostype}"
+
+ # misc
+ writelog "Misc:"
+ writelog "\tDisplayname:\t${displayname}"
+ if [ "${cap3d}" = "TRUE" -a "${enable3d}" = "TRUE" ]; then
+ writelog "\t3D Graphics:\tenabled"
+ fi
+ # empty line at end
+ writelog ""
+
+}
diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc
new file mode 100644
index 00000000..092abce5
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/parse_vmx.inc
@@ -0,0 +1,130 @@
+######################################################################
+# Include: Parsing the non-legacy delivered vmxfile $TMPDIR/$IMGUUID #
+######################################################################
+
+writelog "Parsing virtual machine description file..."
+
+# check for vmdk file marker %VM_DISK_PATH% and put vmdk path in it's place: also VM_DISK_MODE
+# and VM_DISK_REDOLOGDIR.
+# IMAGE=$(grep -io '<image_path.*"' "${xmlfile}" | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
+sed -i 's#%VM_DISK_PATH%#'"$vm_diskfile"'#g' "$TMPDIR/$IMGUUID"
+sed -i 's#%VM_DISK_MODE%#'"independent-nonpersistent"'#g' "$TMPDIR/$IMGUUID"
+sed -i 's#%VM_DISK_REDOLOGDIR%#'"$redodir"'#g' "$TMPDIR/$IMGUUID"
+
+# Ethernet: All we do is entering a generated MAC, as we do not want to interfere
+# in the possible case no networking is wanted.
+writelog "Guest MAC: $macaddr"
+echo 'ethernet0.addressType = "static"' >> "$TMPDIR/$IMGUUID"
+echo 'ethernet0.address = "'"${macaddr}"'"' >> "$TMPDIR/$IMGUUID"
+
+# DVD, CDROM
+# XXX: For now it's save to assume ide channel 1 is free, as we support only one HDD, and it it's IDE, it's on channel 0
+cat >> "$TMPDIR/$IMGUUID" <<-HEREEND
+ide1:0.present = "$cdrom0"
+ide1:0.autodetect = "TRUE"
+ide1:0.fileName = "auto detect"
+ide1:0.deviceType = "cdrom-raw"
+ide1:1.present = "$cdrom1"
+ide1:1.autodetect = "TRUE"
+ide1:1.fileName = "auto detect"
+ide1:1.deviceType = "cdrom-raw"
+HEREEND
+
+# Floppies:
+cat >> "$TMPDIR/$IMGUUID" <<-HEREEND
+floppy0.present = "$floppy0"
+floppy0.startConnected = "FALSE"
+floppy0.autodetect = "TRUE"
+floppy0.fileName = "auto detect"
+floppy1.present = "$floppy1"
+floppy1.startConnected = "TRUE"
+floppy1.fileType = "file"
+floppy1.fileName = "$floppy1name"
+HEREEND
+
+writelog "numvcpus = ${cpu_cores} - maxvcpus=${real_core_count}"
+
+# RAM, CPUs
+cat >> "$TMPDIR/$IMGUUID" <<-HEREEND
+numvcpus = "$cpu_cores"
+cpuid.coresPerSocket = "$cores_per_socket"
+maxvcpus = "$real_core_count"
+memsize = "$mem"
+MemAllowAutoScaleDown = "FALSE"
+MemTrimRate = "-1"
+HEREEND
+
+# USB
+if [ -n "$SLX_EXAM" ]; then
+ # Exam mode: No USB (TODO: Configurable)
+ sed -i '/^usb\./d' "$TMPDIR/$IMGUUID"
+ echo 'usb.present = "FALSE"' >> "$TMPDIR/$IMGUUID"
+else
+ cat >> "$TMPDIR/$IMGUUID" <<-HEREEND
+ usb.present = "TRUE"
+ usb.generic.autoconnect = "TRUE"
+ HEREEND
+fi
+
+# shared folders
+cat >> "$TMPDIR/$IMGUUID" <<-HEREEND
+$ENABLE_SHARE
+sharedFolder0.present = "$shfolders"
+sharedFolder0.enabled = "$shfolders"
+sharedFolder0.expiration = "never"
+sharedFolder0.guestName = "$homesharename"
+sharedFolder0.hostPath = "$homesharepath"
+sharedFolder0.readAccess = "TRUE"
+sharedFolder0.writeAccess = "TRUE"
+sharedFolder1.present = "$shfolders"
+sharedFolder1.enabled = "$shfolders"
+sharedFolder1.expiration = "never"
+sharedFolder1.guestName = "$commonsharename"
+sharedFolder1.hostPath = "$commonsharepath"
+sharedFolder1.readAccess = "TRUE"
+sharedFolder1.writeAccess = "FALSE"
+sharedFolder.maxNum = "2"
+hgfs.mapRootShare = "TRUE"
+hgfs.linkRootShare = "TRUE"
+HEREEND
+
+# Isolation tools: settings
+# It should be verified whether and when entries necessary
+cat >> "$TMPDIR/$IMGUUID" <<-HEREEND
+isolation.tools.hgfs.disable = "FALSE"
+isolation.tools.dnd.disable = "FALSE"
+isolation.tools.copy.enable = "TRUE"
+isolation.tools.paste.enabled = "TRUE"
+HEREEND
+
+# Serial, parallel: Empty, nothing is being currently set. TODO later.
+
+# Graphics, GPU: 3D will be enabled (even if vmware doesn't support the chip) if we whitelisted it.
+if [ -n "$SLX_VMWARE_3D" ]; then
+ writelog "FORCE3D set - overriding 3D in vmx file."
+ echo 'mks.gl.allowBlacklistedDrivers = "TRUE"' >> "$TMPDIR/$IMGUUID"
+ # We override... play safe and cap the hwVersion to 10, since some i915 chips goofed up with 12
+ # Investigate if we might have to do this in other cases where we don't override
+ if grep -qi '^mks.enable3d.*true' "$TMPDIR/$IMGUUID"; then
+ vmw_cap_hw_version "10"
+ fi
+else
+ writelog "FORCE3D not set - 3D will only work if GPU/driver is whitelisted by vmware."
+fi
+
+# Disable DPI scaling information passing via vmware tools
+sed -i '/^gui.applyHostDisplayScaling/d' "$TMPDIR/$IMGUUID"
+echo 'gui.applyHostDisplayScalingToGuest = "FALSE"' >> "$TMPDIR/$IMGUUID"
+
+# Additinal exam mode settings
+if [ -n "$SLX_EXAM" ]; then
+ echo 'gui.restricted = "true"' >> "$TMPDIR/$IMGUUID"
+fi
+
+# Killing duplicate lines (output much nicer than sort -u):
+awk '!a[$0]++' "${TMPDIR}/${IMGUUID}" > "${TMPDIR}/${IMGUUID}.tmp" && mv "${TMPDIR}/${IMGUUID}.tmp" "${TMPDIR}/${IMGUUID}"
+
+# At last_ Let's copy it to $confdir/run-vmware.conf
+cp -p "$TMPDIR/$IMGUUID" "$conffile" && writelog "Copied TMPDIR/IMGUUID ${TMPDIR}/${IMGUUID} to conffile ${conffile}" || \
+ ( writelog "Could not copy TMPDIR/IMGUUID -$TMPDIR/$IMGUUID- to conffile ${conffile}!"; cleanexit 1 )
+
diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_hardware_legacy.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_hardware_legacy.inc
new file mode 100644
index 00000000..22718839
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_hardware_legacy.inc
@@ -0,0 +1,152 @@
+#########################################
+# Include: Hardware checks and settings #
+#########################################
+
+set_hardware_legacy() {
+
+# use different network card (default e1000, vlance, vmxnet)
+if [ -n "${network_card}" ]; then
+ network_virtualDev="ethernet0.virtualDev = \"${network_card}\""
+else
+ network_virtualDev='ethernet0.virtualDev = "e1000"'
+fi
+
+# use different network card (default e1000, vlance, vmxnet)
+hostdev="/dev/vmnet1"
+case "${network_kind}" in
+ bridge|bridged)
+ hostdev="/dev/vmnet0"
+ ;;
+ nat)
+ hostdev="/dev/vmnet1"
+ ;;
+ hostonly|host-only)
+ hostdev="/dev/vmnet2"
+ ;;
+esac
+
+# set standard sound card, overwrite depending on OS (options sb16, es1371, hdaudio)
+sound="es1371"
+
+# set sound card explicitly if there is more than one card in the host system
+sound_fileName='sound.fileName = "-1"
+sound.autodetect = "TRUE"'
+
+# check for 3D configuration setting
+case "$enable3d" in
+ true|yes)
+ enable3d="TRUE"
+ ;;
+ *)
+ enable3d="FALSE"
+ ;;
+esac
+
+# check for whitelisted HW-3D
+FORCE3D=""
+if [ -n "$SLX_VMWARE_3D" ]; then
+ FORCE3D='mks.gl.allowBlacklistedDrivers = "TRUE"'
+fi
+
+# serial/parallel port defined (e.g. "ttyS0, lp0" or "autodetect")
+case "$serial" in
+ tty*)
+ if [ -e "/dev/$serial" ]; then
+ serialdev="serial0.filename = \"/dev/${serial}\""
+ serial="TRUE"
+ else
+ serialdev="# no serial port configured"
+ serial="FALSE"
+ fi
+ ;;
+ auto*)
+ serialdev="serial0.autodetect = \"TRUE\""
+ serial="TRUE"
+ ;;
+ *)
+ serialdev="# no serial port configured"
+ serial="FALSE"
+ ;;
+esac
+
+case "$parallel" in
+ lp*|parport*)
+ if [ -e "/dev/$parallel" ]; then
+ paraldev="parallel0.filename = \"/dev/${parallel}\""
+ paralbidi="TRUE"
+ parallel="TRUE"
+ else
+ paraldev="# no parallel port configured"
+ paralbidi="FALSE"
+ parallel="FALSE"
+ fi
+ ;;
+ auto*)
+ paraldev="parallel0.autodetect = \"TRUE\""
+ paralbidi="TRUE"
+ parallel="TRUE"
+ ;;
+ *)
+ paraldev="# no parallel port configured"
+ paralbidi="FALSE"
+ parallel="FALSE"
+ ;;
+esac
+
+# check if ide/scsi and hwver of image
+# read only the first 30 lines to be sure
+imghead=$(head -n 30 "${diskfile}")
+
+## Added to handle persistent snapshots.
+if [[ "$originalVMDKFilePath" ]]; then
+ echo "Select \"${originalVMDKFilePath}\" as information base for \"${diskfile}\"."
+ imghead=$(head -n 30 "$originalVMDKFilePath") && \
+
+ # Support suspend mode.
+ stateFilePath="$(readlink -f "$(dirname "$diskfile")/"*.vmss)" && \
+ if [ -f "$stateFilePath" ]; then
+ echo "Found state file \"$stateFilePath\"." && \
+ stateFileConfiguration="
+ checkpoint.vmState = \"$stateFilePath\""
+ fi
+ POSTRUN="stateFilePath=\"\$(readlink -f \"${confdir}/\"*.vmss)\" && memoryFilePath=\"\$(readlink -f \"${confdir}/\"*.vmem)\" && [ -f \"\$stateFilePath\" ] && echo \"Saving state and memory file \\\"\$stateFilePath\\\" and \\\"\$memoryFilePath\\\".\" && mv -f \"\$stateFilePath\" \"$(dirname "$diskfile")/\" && mv -f \"\$memoryFilePath\" \"$(dirname "$diskfile")/\""
+fi
+
+##
+hwver=$(echo "${imghead}" | grep -m1 -ia "ddb.virtualHWVersion" | awk -F '"' '{print $2}')
+
+
+if [ -z "$override_hddtype" ]; then
+ hddrv=$(echo "${imghead}" | grep -m1 -ia "ddb.adapterType" | awk -F '"' '{print $2}')
+else
+ hddrv=$override_hddtype
+fi
+
+PCIE=
+case "${hddrv}" in
+ ide)
+ ide="TRUE"
+ scsi="FALSE"
+ ;;
+ lsisas*)
+ ide="FALSE"
+ scsi="TRUE"
+ PCIE='pciBridge4.present = "TRUE"
+ pciBridge4.virtualDev = "pcieRootPort"
+ pciBridge4.functions = "8"'
+ ;;
+ lsilogic|buslogic)
+ ide="FALSE"
+ scsi="TRUE"
+ ;;
+ scsi)
+ ide="FALSE"
+ scsi="TRUE"
+ hddrv="lsilogic"
+ ;;
+ *)
+ slxlog "virt-vmware-hdd" "vmware: Unknown HDD adapter type $hddrv"
+ ;;
+esac
+
+}
diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc
new file mode 100644
index 00000000..0c45ee59
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/set_vmware_include_variables.inc
@@ -0,0 +1,30 @@
+#####################################################################
+# Include: Declaration of vmware run-virt-include default variables #
+#####################################################################
+
+set_vmware_include_variables() {
+ [ "$mem" -gt 3800 -a "$(uname -m)" != "x86_64" ] && mem=3800
+
+ # temporary disk space for logs, etc...
+ redodir="/tmp/virt/vmware/${USER}.$$"
+
+ # dir for configs and vmem file
+ confdir="/tmp/virt/vmware/${USER}.$$"
+
+ # configfile
+ conffile="${confdir}/run-vmware.conf"
+
+ # diskfile
+ diskfile="${vmpath}"
+
+ # users vmware config folder
+ [ -z "${HOME}" ] && HOME=$(getent passwd "$(whoami)" | awk -F ':' '{print $6}')
+ vmhome="${HOME}/.vmware"
+
+ # get several version infos for vmware/player
+ source /opt/openslx/vmchooser/vmware/vmware.conf
+
+ # VMware start options
+ # "-X": start in fullscreen
+ vmopt="-X"
+}
diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files.inc
new file mode 100644
index 00000000..555688bf
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files.inc
@@ -0,0 +1,29 @@
+###############################
+# Include: Write config files #
+###############################
+
+writelog "Redo directory: ${redodir}"
+writelog "Config directory: ${confdir}"
+writelog "Config file: ${conffile}"
+writelog "vmhome/dndlogs: ${vmhome}/dndlogs"
+
+# create vmware directories
+mkdir -p "$redodir" >/dev/null 2>&1
+mkdir -p "$confdir" >/dev/null 2>&1
+mkdir -p "$vmhome/dndlogs" >/dev/null 2>&1
+touch "$vmhome/dndlogs/dndlog.conf" >/dev/null 2>&1
+
+# create preferences file ${vmhome}/preferences
+source "${VMWAREINCLUDEDIR}/create_vmhome_preferences_file.inc" && create_vmhome_preferences_file
+
+# create VMware config file (conffile)
+source "${VMWAREINCLUDEDIR}/create_vmware_config_file.inc"
+
+# link to conffile if confdir != redodir
+[ "$confdir" != "$redodir" ] && ln -s "$conffile" "$redodir/run-vmware.conf" >/dev/null 2>&1
+
+# own nvram. We need it for floppy drive b, default nvram has just drive a
+if ! cp "/opt/openslx/vmchooser/vmware/nvram" "$confdir/nvram"; then
+ slxlog "virt-vmware-nvram" "Could not copy nvram from '/opt/openslx/vmchooser/vmware/nvram' '$confdir/nvram'"
+fi
+
diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files_legacy.inc b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files_legacy.inc
new file mode 100644
index 00000000..52a341ba
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/includes/write_config_files_legacy.inc
@@ -0,0 +1,29 @@
+###############################
+# Include: Write config files #
+###############################
+
+write_config_files_legacy() {
+ # create vmware directories
+ mkdir -p "$redodir" >/dev/null 2>&1
+ mkdir -p "$confdir" >/dev/null 2>&1
+ mkdir -p "$vmhome/dndlogs" >/dev/null 2>&1
+ touch "$vmhome/dndlogs/dndlog.conf" >/dev/null 2>&1
+
+ # create preferences file ${vmhome}/preferences
+ source "${VMWAREINCLUDEDIR}/create_vmhome_preferences_file.inc" && create_vmhome_preferences_file
+
+ # create VMware config file (conffile)
+ source "${VMWAREINCLUDEDIR}/create_vmware_config_file_legacy.inc" && create_vmware_config_file_legacy
+
+ # link to conffile if confdir != redodir
+ [ "$confdir" != "$redodir" ] && ln -s "$conffile" "$redodir/run-vmware.conf" >/dev/null 2>&1
+
+ # sync is needed to ensure that data is really written to virtual disk
+ # TODO: Move to general run-virt, right before exec of vm
+ sync
+
+ # own nvram. We need it for floppy drive b, default nvram has just drive a
+ if ! cp "/opt/openslx/vmchooser/vmware/nvram" "$confdir/nvram"; then
+ slxlog "virt-vmware-nvram" "Could not copy nvram from '/opt/openslx/vmchooser/vmware/nvram' '$confdir/nvram'"
+ fi
+}
diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/nvram b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/nvram
new file mode 100644
index 00000000..85125f1e
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/nvram
Binary files differ
diff --git a/core/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include
new file mode 100644
index 00000000..e25947e0
--- /dev/null
+++ b/core/modules/vmware/data/opt/openslx/vmchooser/vmware/run-virt.include
@@ -0,0 +1,76 @@
+# -----------------------------------------------------------------------------
+# Copyright (c) 2009..2012 - RZ Uni Freiburg
+# Copyright (c) 2009..2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+# run-virt.include
+# - component for vmware/player of the vmchooser plugin vmchooser-run_virt
+################################################################################
+
+################################################################################
+### configuration writer functions
+### This needs bash, not dash or ash! (indented HEREDOC)
+################################################################################
+
+VMWAREINCLUDEDIR=/opt/openslx/vmchooser/vmware/includes
+vmostype=$(rv_clean_string "$vmostype")
+
+# declaration of default variables for vmware
+source "${VMWAREINCLUDEDIR}/set_vmware_include_variables.inc" && set_vmware_include_variables
+# General global openslx config
+source /opt/openslx/config
+
+# TODO: Where to put global helper functions that could be used in several units below?
+vmw_cap_hw_version() {
+ [ -z "$1" ] && writelog "cap_hw_version called without parameter!" && return 1
+ [ "$1" -lt "$maxhardwareversion" ] && maxhardwareversion="$1"
+}
+
+if [ "$LEGACY" ]; then
+ # hardware checks
+ source "${VMWAREINCLUDEDIR}/set_hardware_legacy.inc" && set_hardware_legacy
+ # write configuration files
+ # write_config_files calls:
+ # set_vmhome_preferences_header
+ # set_vmware_startup_file
+ source "${VMWAREINCLUDEDIR}/write_config_files_legacy.inc" && write_config_files_legacy
+else
+ # write configuration files
+ source "${VMWAREINCLUDEDIR}/write_config_files.inc"
+
+ # parse the given vmx file
+ source "${VMWAREINCLUDEDIR}/parse_vmx.inc"
+fi
+
+# logging and stdout
+# needs writelog() from vmchooser-run_virt
+source "${VMWAREINCLUDEDIR}/logging.inc" && logging
+
+# Apply $maxhardwareversion to final VMX
+HWVER=$(grep -i '^virtualHW.version *= *' "$conffile" | head -n 1 | awk -F '=' '{print $2}' | sed -r 's/[^0-9]//g')
+if [ -n "$HWVER" ] && [ "$HWVER" -gt "$maxhardwareversion" ]; then
+ writelog "Hardware version capped to $maxhardwareversion (was $HWVER)"
+ sed -i 's/^virtualHW\.version.*$/virtualHW.version = "'$maxhardwareversion'"/I' "$conffile"
+fi
+
+# See if there are any USB devices connected that we want to pass through immediately
+get_usb_devices 'usb.autoConnect.deviceXXXXX = "0x%VENDOR%:0x%PRODUCT%"' \
+ | sed -r 's/0x0+/0x/g' \
+ | awk '{sub(/XXXXX/,NR-1)}1' \
+ >> "$conffile"
+
+
+# For debugging
+cp "$conffile" "/tmp/vmware-last-config"
+
+# using the modified version of the wrapper script
+VIRTCMD="/opt/openslx/bin/vmplayer"
+VIRTCMDOPTS="${vmopt} ${conffile}"
+
diff --git a/core/modules/vmware/data/usr/bin/vmplayer b/core/modules/vmware/data/usr/bin/vmplayer
new file mode 120000
index 00000000..2944838d
--- /dev/null
+++ b/core/modules/vmware/data/usr/bin/vmplayer
@@ -0,0 +1 @@
+/opt/openslx/bin/vmplayer \ No newline at end of file
diff --git a/core/modules/vmware/data/usr/bin/vmware b/core/modules/vmware/data/usr/bin/vmware
new file mode 120000
index 00000000..bde6f9c0
--- /dev/null
+++ b/core/modules/vmware/data/usr/bin/vmware
@@ -0,0 +1 @@
+/opt/openslx/bin/vmware \ No newline at end of file
diff --git a/core/modules/vmware/data/usr/share/icons/hicolor/index.theme b/core/modules/vmware/data/usr/share/icons/hicolor/index.theme
new file mode 100644
index 00000000..5c9c50ad
--- /dev/null
+++ b/core/modules/vmware/data/usr/share/icons/hicolor/index.theme
@@ -0,0 +1,1662 @@
+[Icon Theme]
+Name=Hicolor
+Comment=Fallback icon theme
+Hidden=true
+Directories=16x16/actions,16x16/animations,16x16/apps,16x16/categories,16x16/devices,16x16/emblems,16x16/emotes,16x16/filesystems,16x16/intl,16x16/mimetypes,16x16/places,16x16/status,16x16/stock/chart,16x16/stock/code,16x16/stock/data,16x16/stock/form,16x16/stock/image,16x16/stock/io,16x16/stock/media,16x16/stock/navigation,16x16/stock/net,16x16/stock/object,16x16/stock/table,16x16/stock/text,22x22/actions,22x22/animations,22x22/apps,22x22/categories,22x22/devices,22x22/emblems,22x22/emotes,22x22/filesystems,22x22/intl,22x22/mimetypes,22x22/places,22x22/status,22x22/stock/chart,22x22/stock/code,22x22/stock/data,22x22/stock/form,22x22/stock/image,22x22/stock/io,22x22/stock/media,22x22/stock/navigation,22x22/stock/net,22x22/stock/object,22x22/stock/table,22x22/stock/text,24x24/actions,24x24/animations,24x24/apps,24x24/categories,24x24/devices,24x24/emblems,24x24/emotes,24x24/filesystems,24x24/intl,24x24/mimetypes,24x24/places,24x24/status,24x24/stock/chart,24x24/stock/code,24x24/stock/data,24x24/stock/form,24x24/stock/image,24x24/stock/io,24x24/stock/media,24x24/stock/navigation,24x24/stock/net,24x24/stock/object,24x24/stock/table,24x24/stock/text,32x32/actions,32x32/animations,32x32/apps,32x32/categories,32x32/devices,32x32/emblems,32x32/emotes,32x32/filesystems,32x32/intl,32x32/mimetypes,32x32/places,32x32/status,32x32/stock/chart,32x32/stock/code,32x32/stock/data,32x32/stock/form,32x32/stock/image,32x32/stock/io,32x32/stock/media,32x32/stock/navigation,32x32/stock/net,32x32/stock/object,32x32/stock/table,32x32/stock/text,36x36/actions,36x36/animations,36x36/apps,36x36/categories,36x36/devices,36x36/emblems,36x36/emotes,36x36/filesystems,36x36/intl,36x36/mimetypes,36x36/places,36x36/status,36x36/stock/chart,36x36/stock/code,36x36/stock/data,36x36/stock/form,36x36/stock/image,36x36/stock/io,36x36/stock/media,36x36/stock/navigation,36x36/stock/net,36x36/stock/object,36x36/stock/table,36x36/stock/text,48x48/actions,48x48/animations,48x48/apps,48x48/categories,48x48/devices,48x48/emblems,48x48/emotes,48x48/filesystems,48x48/intl,48x48/mimetypes,48x48/places,48x48/status,48x48/stock/chart,48x48/stock/code,48x48/stock/data,48x48/stock/form,48x48/stock/image,48x48/stock/io,48x48/stock/media,48x48/stock/navigation,48x48/stock/net,48x48/stock/object,48x48/stock/table,48x48/stock/text,64x64/actions,64x64/animations,64x64/apps,64x64/categories,64x64/devices,64x64/emblems,64x64/emotes,64x64/filesystems,64x64/intl,64x64/mimetypes,64x64/places,64x64/status,64x64/stock/chart,64x64/stock/code,64x64/stock/data,64x64/stock/form,64x64/stock/image,64x64/stock/io,64x64/stock/media,64x64/stock/navigation,64x64/stock/net,64x64/stock/object,64x64/stock/table,64x64/stock/text,72x72/actions,72x72/animations,72x72/apps,72x72/categories,72x72/devices,72x72/emblems,72x72/emotes,72x72/filesystems,72x72/intl,72x72/mimetypes,72x72/places,72x72/status,72x72/stock/chart,72x72/stock/code,72x72/stock/data,72x72/stock/form,72x72/stock/image,72x72/stock/io,72x72/stock/media,72x72/stock/navigation,72x72/stock/net,72x72/stock/object,72x72/stock/table,72x72/stock/text,96x96/actions,96x96/animations,96x96/apps,96x96/categories,96x96/devices,96x96/emblems,96x96/emotes,96x96/filesystems,96x96/intl,96x96/mimetypes,96x96/places,96x96/status,96x96/stock/chart,96x96/stock/code,96x96/stock/data,96x96/stock/form,96x96/stock/image,96x96/stock/io,96x96/stock/media,96x96/stock/navigation,96x96/stock/net,96x96/stock/object,96x96/stock/table,96x96/stock/text,128x128/actions,128x128/animations,128x128/apps,128x128/categories,128x128/devices,128x128/emblems,128x128/emotes,128x128/filesystems,128x128/intl,128x128/mimetypes,128x128/places,128x128/status,128x128/stock/chart,128x128/stock/code,128x128/stock/data,128x128/stock/form,128x128/stock/image,128x128/stock/io,128x128/stock/media,128x128/stock/navigation,128x128/stock/net,128x128/stock/object,128x128/stock/table,128x128/stock/text,192x192/actions,192x192/animations,192x192/apps,192x192/categories,192x192/devices,192x192/emblems,192x192/emotes,192x192/filesystems,192x192/intl,192x192/mimetypes,192x192/places,192x192/status,192x192/stock/chart,192x192/stock/code,192x192/stock/data,192x192/stock/form,192x192/stock/image,192x192/stock/io,192x192/stock/media,192x192/stock/navigation,192x192/stock/net,192x192/stock/object,192x192/stock/table,192x192/stock/text,256x256/actions,256x256/animations,256x256/apps,256x256/categories,256x256/devices,256x256/emblems,256x256/emotes,256x256/filesystems,256x256/intl,256x256/mimetypes,256x256/places,256x256/status,256x256/stock/chart,256x256/stock/code,256x256/stock/data,256x256/stock/form,256x256/stock/image,256x256/stock/io,256x256/stock/media,256x256/stock/navigation,256x256/stock/net,256x256/stock/object,256x256/stock/table,256x256/stock/text,scalable/actions,scalable/animations,scalable/apps,scalable/categories,scalable/devices,scalable/emblems,scalable/emotes,scalable/filesystems,scalable/intl,scalable/mimetypes,scalable/places,scalable/status,scalable/stock/chart,scalable/stock/code,scalable/stock/data,scalable/stock/form,scalable/stock/image,scalable/stock/io,scalable/stock/media,scalable/stock/navigation,scalable/stock/net,scalable/stock/object,scalable/stock/table,scalable/stock/text
+
+
+[16x16/actions]
+Size=16
+Context=Actions
+Type=Threshold
+
+[16x16/animations]
+Size=16
+Context=Animations
+Type=Threshold
+
+[16x16/apps]
+Size=16
+Context=Applications
+Type=Threshold
+
+[16x16/categories]
+Size=16
+Context=Categories
+Type=Threshold
+
+[16x16/devices]
+Size=16
+Context=Devices
+Type=Threshold
+
+[16x16/emblems]
+Size=16
+Context=Emblems
+Type=Threshold
+
+[16x16/emotes]
+Size=16
+Context=Emotes
+Type=Threshold
+
+[16x16/filesystems]
+Size=16
+Context=FileSystems
+Type=Threshold
+
+[16x16/intl]
+Size=16
+Context=International
+Type=Threshold
+
+[16x16/mimetypes]
+Size=16
+Context=MimeTypes
+Type=Threshold
+
+[16x16/places]
+Size=16
+Context=Places
+Type=Threshold
+
+[16x16/status]
+Size=16
+Context=Status
+Type=Threshold
+
+[16x16/stock/chart]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/code]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/data]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/form]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/image]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/io]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/media]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/navigation]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/net]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/object]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/table]
+Size=16
+Context=Stock
+Type=Threshold
+
+[16x16/stock/text]
+Size=16
+Context=Stock
+Type=Threshold
+
+[22x22/actions]
+Size=22
+Context=Actions
+Type=Threshold
+
+[22x22/animations]
+Size=22
+Context=Animations
+Type=Threshold
+
+[22x22/apps]
+Size=22
+Context=Applications
+Type=Fixed
+
+[22x22/categories]
+Size=22
+Context=Categories
+Type=Threshold
+
+[22x22/devices]
+Size=22
+Context=Devices
+Type=Threshold
+
+[22x22/emblems]
+Size=22
+Context=Emblems
+Type=Threshold
+
+[22x22/emotes]
+Size=22
+Context=Emotes
+Type=Threshold
+
+[22x22/filesystems]
+Size=22
+Context=FileSystems
+Type=Threshold
+
+[22x22/intl]
+Size=22
+Context=International
+Type=Threshold
+
+[22x22/mimetypes]
+Size=22
+Context=MimeTypes
+Type=Threshold
+
+[22x22/places]
+Size=22
+Context=Places
+Type=Threshold
+
+[22x22/status]
+Size=22
+Context=Status
+Type=Threshold
+
+[22x22/stock/chart]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/code]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/data]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/form]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/image]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/io]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/media]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/navigation]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/net]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/object]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/table]
+Size=22
+Context=Stock
+Type=Threshold
+
+[22x22/stock/text]
+Size=22
+Context=Stock
+Type=Threshold
+
+[24x24/actions]
+Size=24
+Context=Actions
+Type=Threshold
+
+[24x24/animations]
+Size=24
+Context=Animations
+Type=Threshold
+
+[24x24/apps]
+Size=24
+Context=Applications
+Type=Threshold
+
+[24x24/categories]
+Size=24
+Context=Categories
+Type=Threshold
+
+[24x24/devices]
+Size=24
+Context=Devices
+Type=Threshold
+
+[24x24/emblems]
+Size=24
+Context=Emblems
+Type=Threshold
+
+[24x24/emotes]
+Size=24
+Context=Emotes
+Type=Threshold
+
+[24x24/filesystems]
+Size=24
+Context=FileSystems
+Type=Threshold
+
+[24x24/intl]
+Size=24
+Context=International
+Type=Threshold
+
+[24x24/mimetypes]
+Size=24
+Context=MimeTypes
+Type=Threshold
+
+[24x24/places]
+Size=24
+Context=Places
+Type=Threshold
+
+[24x24/status]
+Size=24
+Context=Status
+Type=Threshold
+
+[24x24/stock/chart]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/code]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/data]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/form]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/image]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/io]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/media]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/navigation]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/net]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/object]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/table]
+Size=24
+Context=Stock
+Type=Threshold
+
+[24x24/stock/text]
+Size=24
+Context=Stock
+Type=Threshold
+
+[32x32/actions]
+Size=32
+Context=Actions
+Type=Threshold
+
+[32x32/animations]
+Size=32
+Context=Animations
+Type=Threshold
+
+[32x32/apps]
+Size=32
+Context=Applications
+Type=Threshold
+
+[32x32/categories]
+Size=32
+Context=Categories
+Type=Threshold
+
+[32x32/devices]
+Size=32
+Context=Devices
+Type=Threshold
+
+[32x32/emblems]
+Size=32
+Context=Emblems
+Type=Threshold
+
+[32x32/emotes]
+Size=32
+Context=Emotes
+Type=Threshold
+
+[32x32/filesystems]
+Size=32
+Context=FileSystems
+Type=Threshold
+
+[32x32/intl]
+Size=32
+Context=International
+Type=Threshold
+
+[32x32/mimetypes]
+Size=32
+Context=MimeTypes
+Type=Threshold
+
+[32x32/places]
+Size=32
+Context=Places
+Type=Threshold
+
+[32x32/status]
+Size=32
+Context=Status
+Type=Threshold
+
+[32x32/stock/chart]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/code]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/data]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/form]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/image]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/io]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/media]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/navigation]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/net]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/object]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/table]
+Size=32
+Context=Stock
+Type=Threshold
+
+[32x32/stock/text]
+Size=32
+Context=Stock
+Type=Threshold
+
+[36x36/actions]
+Size=36
+Context=Actions
+Type=Threshold
+
+[36x36/animations]
+Size=36
+Context=Animations
+Type=Threshold
+
+[36x36/apps]
+Size=36
+Context=Applications
+Type=Threshold
+
+[36x36/categories]
+Size=36
+Context=Categories
+Type=Threshold
+
+[36x36/devices]
+Size=36
+Context=Devices
+Type=Threshold
+
+[36x36/emblems]
+Size=36
+Context=Emblems
+Type=Threshold
+
+[36x36/emotes]
+Size=36
+Context=Emotes
+Type=Threshold
+
+[36x36/filesystems]
+Size=36
+Context=FileSystems
+Type=Threshold
+
+[36x36/intl]
+Size=36
+Context=International
+Type=Threshold
+
+[36x36/mimetypes]
+Size=36
+Context=MimeTypes
+Type=Threshold
+
+[36x36/places]
+Size=36
+Context=Places
+Type=Threshold
+
+[36x36/status]
+Size=36
+Context=Status
+Type=Threshold
+
+[36x36/stock/chart]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/code]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/data]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/form]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/image]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/io]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/media]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/navigation]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/net]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/object]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/table]
+Size=36
+Context=Stock
+Type=Threshold
+
+[36x36/stock/text]
+Size=36
+Context=Stock
+Type=Threshold
+
+[48x48/actions]
+Size=48
+Context=Actions
+Type=Threshold
+
+[48x48/animations]
+Size=48
+Context=Animations
+Type=Threshold
+
+[48x48/apps]
+Size=48
+Context=Applications
+Type=Threshold
+
+[48x48/categories]
+Size=48
+Context=Categories
+Type=Threshold
+
+[48x48/devices]
+Size=48
+Context=Devices
+Type=Threshold
+
+[48x48/emblems]
+Size=48
+Context=Emblems
+Type=Threshold
+
+[48x48/emotes]
+Size=48
+Context=Emotes
+Type=Threshold
+
+[48x48/filesystems]
+Size=48
+Context=FileSystems
+Type=Threshold
+
+[48x48/intl]
+Size=48
+Context=International
+Type=Threshold
+
+[48x48/mimetypes]
+Size=48
+Context=MimeTypes
+Type=Threshold
+
+[48x48/places]
+Size=48
+Context=Places
+Type=Threshold
+
+[48x48/status]
+Size=48
+Context=Status
+Type=Threshold
+
+[48x48/stock/chart]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/code]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/data]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/form]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/image]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/io]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/media]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/navigation]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/net]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/object]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/table]
+Size=48
+Context=Stock
+Type=Threshold
+
+[48x48/stock/text]
+Size=48
+Context=Stock
+Type=Threshold
+
+[64x64/actions]
+Size=64
+Context=Actions
+Type=Threshold
+
+[64x64/animations]
+Size=64
+Context=Animations
+Type=Threshold
+
+[64x64/apps]
+Size=64
+Context=Applications
+Type=Threshold
+
+[64x64/categories]
+Size=64
+Context=Categories
+Type=Threshold
+
+[64x64/devices]
+Size=64
+Context=Devices
+Type=Threshold
+
+[64x64/emblems]
+Size=64
+Context=Emblems
+Type=Threshold
+
+[64x64/emotes]
+Size=64
+Context=Emotes
+Type=Threshold
+
+[64x64/filesystems]
+Size=64
+Context=FileSystems
+Type=Threshold
+
+[64x64/intl]
+Size=64
+Context=International
+Type=Threshold
+
+[64x64/mimetypes]
+Size=64
+Context=MimeTypes
+Type=Threshold
+
+[64x64/places]
+Size=64
+Context=Places
+Type=Threshold
+
+[64x64/status]
+Size=64
+Context=Status
+Type=Threshold
+
+[64x64/stock/chart]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/code]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/data]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/form]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/image]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/io]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/media]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/navigation]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/net]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/object]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/table]
+Size=64
+Context=Stock
+Type=Threshold
+
+[64x64/stock/text]
+Size=64
+Context=Stock
+Type=Threshold
+[72x72/actions]
+Size=72
+Context=Actions
+Type=Threshold
+
+[72x72/animations]
+Size=72
+Context=Animations
+Type=Threshold
+
+[72x72/apps]
+Size=72
+Context=Applications
+Type=Threshold
+
+[72x72/categories]
+Size=72
+Context=Categories
+Type=Threshold
+
+[72x72/devices]
+Size=72
+Context=Devices
+Type=Threshold
+
+[72x72/emblems]
+Size=72
+Context=Emblems
+Type=Threshold
+
+[72x72/emotes]
+Size=72
+Context=Emotes
+Type=Threshold
+
+[72x72/filesystems]
+Size=72
+Context=FileSystems
+Type=Threshold
+
+[72x72/intl]
+Size=72
+Context=International
+Type=Threshold
+
+[72x72/mimetypes]
+Size=72
+Context=MimeTypes
+Type=Threshold
+
+[72x72/places]
+Size=72
+Context=Places
+Type=Threshold
+
+[72x72/status]
+Size=72
+Context=Status
+Type=Threshold
+
+[72x72/stock/chart]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/code]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/data]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/form]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/image]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/io]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/media]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/navigation]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/net]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/object]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/table]
+Size=72
+Context=Stock
+Type=Threshold
+
+[72x72/stock/text]
+Size=72
+Context=Stock
+Type=Threshold
+
+[96x96/actions]
+Size=96
+Context=Actions
+Type=Threshold
+
+[96x96/animations]
+Size=96
+Context=Animations
+Type=Threshold
+
+[96x96/apps]
+Size=96
+Context=Applications
+Type=Threshold
+
+[96x96/categories]
+Size=96
+Context=Categories
+Type=Threshold
+
+[96x96/devices]
+Size=96
+Context=Devices
+Type=Threshold
+
+[96x96/emblems]
+Size=96
+Context=Emblems
+Type=Threshold
+
+[96x96/emotes]
+Size=96
+Context=Emotes
+Type=Threshold
+
+[96x96/filesystems]
+Size=96
+Context=FileSystems
+Type=Threshold
+
+[96x96/intl]
+Size=96
+Context=International
+Type=Threshold
+
+[96x96/mimetypes]
+Size=96
+Context=MimeTypes
+Type=Threshold
+
+[96x96/places]
+Size=96
+Context=Places
+Type=Threshold
+
+[96x96/status]
+Size=96
+Context=Status
+Type=Threshold
+
+[96x96/stock/chart]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/code]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/data]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/form]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/image]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/io]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/media]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/navigation]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/net]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/object]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/table]
+Size=96
+Context=Stock
+Type=Threshold
+
+[96x96/stock/text]
+Size=96
+Context=Stock
+Type=Threshold
+
+[128x128/actions]
+Size=128
+Context=Actions
+Type=Threshold
+
+[128x128/animations]
+Size=128
+Context=Animations
+Type=Threshold
+
+[128x128/apps]
+Size=128
+Context=Applications
+Type=Threshold
+
+[128x128/categories]
+Size=128
+Context=Categories
+Type=Threshold
+
+[128x128/devices]
+Size=128
+Context=Devices
+Type=Threshold
+
+[128x128/emblems]
+Size=128
+Context=Emblems
+Type=Threshold
+
+[128x128/emotes]
+Size=128
+Context=Emotes
+Type=Threshold
+
+[128x128/filesystems]
+Size=128
+Context=FileSystems
+Type=Threshold
+
+[128x128/intl]
+Size=128
+Context=International
+Type=Threshold
+
+[128x128/mimetypes]
+Size=128
+Context=MimeTypes
+Type=Threshold
+
+[128x128/places]
+Size=128
+Context=Places
+Type=Threshold
+
+[128x128/status]
+Size=128
+Context=Status
+Type=Threshold
+
+[128x128/stock/chart]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/code]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/data]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/form]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/image]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/io]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/media]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/navigation]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/net]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/object]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/table]
+Size=128
+Context=Stock
+Type=Threshold
+
+[128x128/stock/text]
+Size=128
+Context=Stock
+Type=Threshold
+
+[192x192/actions]
+Size=192
+Context=Actions
+Type=Threshold
+
+[192x192/animations]
+Size=192
+Context=Animations
+Type=Threshold
+
+[192x192/apps]
+Size=192
+Context=Applications
+Type=Threshold
+
+[192x192/categories]
+Size=192
+Context=Categories
+Type=Threshold
+
+[192x192/devices]
+Size=192
+Context=Devices
+Type=Threshold
+
+[192x192/emblems]
+Size=192
+Context=Emblems
+Type=Threshold
+
+[192x192/emotes]
+Size=192
+Context=Emotes
+Type=Threshold
+
+[192x192/filesystems]
+Size=192
+Context=FileSystems
+Type=Threshold
+
+[192x192/intl]
+Size=192
+Context=International
+Type=Threshold
+
+[192x192/mimetypes]
+Size=192
+Context=MimeTypes
+Type=Threshold
+
+[192x192/places]
+Size=192
+Context=Places
+Type=Threshold
+
+[192x192/status]
+Size=192
+Context=Status
+Type=Threshold
+
+[192x192/stock/chart]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/code]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/data]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/form]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/image]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/io]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/media]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/navigation]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/net]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/object]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/table]
+Size=192
+Context=Stock
+Type=Threshold
+
+[192x192/stock/text]
+Size=192
+Context=Stock
+Type=Threshold
+
+[256x256/actions]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Actions
+Type=Scalable
+
+[256x256/animations]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Animations
+Type=Scalable
+
+[256x256/apps]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Applications
+Type=Scalable
+
+[256x256/categories]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Categories
+Type=Scalable
+
+[256x256/devices]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Devices
+Type=Scalable
+
+[256x256/emblems]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Emblems
+Type=Scalable
+
+[256x256/emotes]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Emotes
+Type=Scalable
+
+[256x256/filesystems]
+MinSize=64
+Size=256
+MaxSize=256
+Context=FileSystems
+Type=Scalable
+
+[256x256/intl]
+MinSize=64
+Size=256
+MaxSize=256
+Context=International
+Type=Scalable
+
+[256x256/mimetypes]
+MinSize=64
+Size=256
+MaxSize=256
+Context=MimeTypes
+Type=Scalable
+
+[256x256/places]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Places
+Type=Scalable
+
+[256x256/status]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Status
+Type=Scalable
+
+[256x256/stock/chart]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/code]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/data]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/form]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/image]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/io]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/media]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/navigation]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/net]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/object]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/table]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[256x256/stock/text]
+MinSize=64
+Size=256
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/actions]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Actions
+Type=Scalable
+
+[scalable/animations]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Animations
+Type=Scalable
+
+[scalable/apps]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Applications
+Type=Scalable
+
+[scalable/categories]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Categories
+Type=Scalable
+
+[scalable/devices]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Devices
+Type=Scalable
+
+[scalable/emblems]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Emblems
+Type=Scalable
+
+[scalable/emotes]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Emotes
+Type=Scalable
+
+[scalable/filesystems]
+MinSize=1
+Size=128
+MaxSize=256
+Context=FileSystems
+Type=Scalable
+
+[scalable/intl]
+MinSize=1
+Size=128
+MaxSize=256
+Context=International
+Type=Scalable
+
+[scalable/mimetypes]
+MinSize=1
+Size=128
+MaxSize=256
+Context=MimeTypes
+Type=Scalable
+
+[scalable/places]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Places
+Type=Scalable
+
+[scalable/status]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Status
+Type=Scalable
+
+[scalable/stock/chart]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/code]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/data]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/form]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/image]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/io]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/media]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/navigation]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/net]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/object]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/table]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
+[scalable/stock/text]
+MinSize=1
+Size=128
+MaxSize=256
+Context=Stock
+Type=Scalable
+
diff --git a/core/modules/vmware/module.build b/core/modules/vmware/module.build
new file mode 100644
index 00000000..bac61583
--- /dev/null
+++ b/core/modules/vmware/module.build
@@ -0,0 +1,158 @@
+fetch_source() {
+ [ -e "${MODULE_WORK_DIR}/src" -a -d "${MODULE_WORK_DIR}/src" ] && \
+ { rm -r "${MODULE_WORK_DIR}/src" || perror "Could not delete old src dir."; }
+ mkdir -p "${MODULE_WORK_DIR}/src" || perror "Could not mkdir src"
+ cd "${MODULE_WORK_DIR}/src" || perror "cd fail."
+
+ # Get directory listing
+ wget -O "index.html" "$REQUIRED_DOWNLOAD_BASE" || perror "Could not download vmware dir index"
+
+ VMWARE_BUNDLE_FILE=$(grep -E -o -i "href=\"VMware-$REQUIRED_TYPE-[^\"]+[\._\-]$ARCHREGEX[\._\-][^\"]+\"" "index.html" | head -n 1 | awk -F '"' '{printf $2}')
+ [ -z "$VMWARE_BUNDLE_FILE" ] && perror "Could not determine vmware $REQUIRED_TYPE bundle file for current arch from $MODULE_WORK_DIR/src/index.html"
+ # Download file
+ wget -O "$VMWARE_BUNDLE_FILE" "$REQUIRED_DOWNLOAD_BASE/$VMWARE_BUNDLE_FILE" || perror "Could not download $VMWARE_BUNDLE_FILE from $REQUIRED_DOWNLOAD_BASE"
+ if [[ "$VMWARE_BUNDLE_FILE" == *.tar ]]; then
+ tar -x "${VMWARE_BUNDLE_FILE%.tar}" -f "$VMWARE_BUNDLE_FILE" || perror "Could not untar downloaded $VMWARE_BUNDLE_FILE"
+ unlink "$VMWARE_BUNDLE_FILE"
+ VMWARE_BUNDLE_FILE="${VMWARE_BUNDLE_FILE%.tar}"
+ fi
+
+ cd - >/dev/null
+}
+
+build() {
+ [ -z "$VMWARE_BUNDLE_FILE" ] && VMWARE_BUNDLE_FILE=$(basename "$(find "${MODULE_WORK_DIR}/src" -iname "vmware-*" | head -n 1)")
+ local DELETE_FILES=$(for LINE in $REQUIRED_VMWARE_DELETIONS;do echo "rm -rf -- $LINE"; done)
+
+ local OFFICIAL_VERSION=$(echo "$VMWARE_BUNDLE_FILE" | cut -f 3 -d '-')
+ local BUILD_VERSION=$(echo "$VMWARE_BUNDLE_FILE" | cut -f 4 -d '-')
+ BUILD_VERSION=${BUILD_VERSION%%.*}
+ [ -z "$OFFICIAL_VERSION" ] && perror "Could not determine vmware version from downloaded file (expected eg. 12.0.0)"
+ if [ -z "$BUILD_VERSION" ] || [ "$BUILD_VERSION" -lt 10000 ]; then
+ perror "Could not determine vmware build number from downloaded file"
+ fi
+
+ # prepare the build directory with the files needed during the chroot
+ cp "${MODULE_WORK_DIR}/src/$VMWARE_BUNDLE_FILE" "${MODULE_BUILD_DIR}/$VMWARE_BUNDLE_FILE"
+ cp -r "${MODULE_WORK_DIR}/patches" "${MODULE_BUILD_DIR}"
+
+ # sanity check to see if KERNEL_HEADERS_DIR is set and exists
+ [ -z "${KERNEL_HEADERS_DIR}" -o ! -e "${KERNEL_HEADERS_DIR}" ] && perror "KERNEL_HEADERS_DIR ('"${KERNEL_HEADERS_DIR}"') not found. Was the kernel module built?"
+
+ # build in two steps, to be able to use mltk function while patching modules
+ pinfo "Installing vmware per chroot..."
+ chroot_run "${MODULE_BUILD_DIR}" <<-EOF
+ # PS1='\[\e[1;33m\](chroot) \u@\h:\w\$ \[\e[1;32m\]' /bin/bash -norc # un-comment for debugging within chroot
+ $DELETE_FILES
+ yes | sh /"${VMWARE_BUNDLE_FILE}" --eulas-agreed --console --required
+ EOF
+ # check if we need to patch modules
+ cd "${MODULE_BUILD_DIR}/usr/lib/vmware/modules/source" \
+ || perror "Could not cd to '${MODULE_BUILD_DIR}/usr/lib/vmware/modules/source'"
+
+ local KMOD SHORT PATCH MIN_KERN MAX_KERN
+ for KMOD in *.tar; do
+ SHORT="${KMOD%%.tar}"
+ [ -e ".${SHORT}.patched" ] && continue
+ for PATCH in $(find "${MODULE_WORK_DIR}/patches/" -name "${SHORT}__*__*.patch"); do
+ parse_patch_name "$PATCH"
+ [ -z "${MIN_KERN}" -o -z "${MAX_KERN}" ] && perror "Could not parse patch filename"
+ if version_lt "$TARGET_KERNEL_SHORT" "$MIN_KERN" || version_gt "$TARGET_KERNEL_SHORT" "$MAX_KERN"; then
+ pinfo "*NOT* applying $PATCH (min=$MIN_KERN max=$MAX_KERN cmp=$TARGET_KERNEL_SHORT)"
+ continue # Not suitable for our kernel
+ fi
+ if version_lt "$OFFICIAL_VERSION" "$MIN_VMWARE" || version_gt "$OFFICIAL_VERSION" "$MAX_VMWARE"; then
+ pinfo "*NOT* applying $PATCH (min=$MIN_VMWARE max=$MAX_VMWARE cmp=$OFFICIAL_VERSION)"
+ continue # Not suitable for our kernel
+ fi
+ pinfo "Kernel: Applying $PATCH (min=$MIN_KERN max=$MAX_KERN cmp=$TARGET_KERNEL_SHORT)"
+ pinfo "VMware: Applying $PATCH (min=$MIN_VMWARE max=$MAX_VMWARE cmp=$OFFICIAL_VERSION)"
+ [ ! -d "${SHORT}-only" ] && tar xf "$KMOD"
+ [ ! -d "${SHORT}-only" ] && perror "untar of $KMOD failed."
+ cd "${SHORT}-only" || perror "Where is ${SHORT}-only?"
+ if ! patch -p1 < "$PATCH"; then
+ cd ..
+ rm -rf -- "${SHORT}-only"
+ perror "Applying $PATCH failed."
+ fi
+ cd ..
+ done
+ if [ -d "${SHORT}-only" ]; then
+ tar cf "$KMOD" "${SHORT}-only/" || perror "repacking of $KMOD failed."
+ rm -rf -- "${SHORT}-only"
+ touch ".${SHORT}.patched"
+ fi
+ done
+ cd "${MODULE_WORK_DIR}" || perror "Could not cd to '${MODULE_WORK_DIR}'"
+
+ # now build modules inside the chroot
+ chroot_run "${MODULE_BUILD_DIR}" <<-EOF
+ vmware-modconfig --console --build-mod -k "${TARGET_KERNEL_LONG}" vmnet $(which gcc) "${KERNEL_HEADERS_DIR}/include" vmplayer vmnet
+ vmware-modconfig --console --build-mod -k "${TARGET_KERNEL_LONG}" vmmon $(which gcc) "${KERNEL_HEADERS_DIR}/include" vmplayer vmmon
+ EOF
+
+ # cleanup unneeded files
+ rm -rf -- "${MODULE_BUILD_DIR}/etc/vmware-installer"
+ rm -rf -- "${MODULE_BUILD_DIR}/usr/lib/vmware-installer"
+ rm -rf -- "${MODULE_BUILD_DIR}/usr/lib/vmware-ovftool"
+ unlink "${MODULE_BUILD_DIR}/$VMWARE_BUNDLE_FILE"
+
+ # write vmware.conf config file to be later sourced by vmware/run-virt.include.
+ # This file was formerly stored in data/opt/openslx/vmchooser/vmware/vmware.conf.
+
+ mkdir -p "${MODULE_BUILD_DIR}/opt/openslx/vmchooser/vmware/" || perror "could not mkdir "${MODULE_BUILD_DIR}/opt/openslx/vmchooser/vmware/"."
+
+ cat > "${MODULE_BUILD_DIR}/opt/openslx/vmchooser/vmware/vmware.conf" <<-EOF
+ # configuration file written by vmware/module.build
+ vmnet0=true
+ vmnet1=192.168.101.1/24
+ vmnet1nat=true
+ vmnet8=192.168.102.1/24
+ vmware_version=$OFFICIAL_VERSION
+ vmware_build=${BUILD_VERSION}
+ maxhardwareversion=${OFFICIAL_VERSION%%.*}
+ EOF
+
+ # Patch system-wide vmware config
+ sed -i '/^installerDefaults.autoSoftwareUpdateEnabled/d;/^installerDefaults.componentDownloadEnabled/d;/^installerDefaults.dataCollectionEnabled/d' "${MODULE_BUILD_DIR}/etc/vmware/config"
+ cat >> "${MODULE_BUILD_DIR}/etc/vmware/config" <<-HEREDOC
+ installerDefaults.autoSoftwareUpdateEnabled = "no"
+ installerDefaults.componentDownloadEnabled = "no"
+ installerDefaults.dataCollectionEnabled = "no"
+ HEREDOC
+}
+
+post_copy() {
+ # FIXME: gconftool is copied without dependencies
+ tarcopy "$(find /usr/lib/ /usr/lib64 -name gconv -type d)" "$TARGET_BUILD_DIR"
+
+ # Update Icon cache for vmplayer
+ gtk-update-icon-cache-3.0 "${TARGET_BUILD_DIR}/usr/share/icons/hicolor/" || pwarning "update-icon-cache-3.0 failed."
+
+ # fix vmware-usbarbitrator bug
+ date +'%Y.%m.%d' >"${TARGET_BUILD_DIR}/etc/arch-release"
+
+ mkdir -p "$TARGET_BUILD_DIR/lib/modules/vmware/"
+ cp "${MODULE_BUILD_DIR}/lib/modules/$TARGET_KERNEL_LONG/vmplayer/"* "$TARGET_BUILD_DIR/lib/modules/vmware/" || perror "Could not cp vmware modules to target!"
+
+}
+
+parse_patch_name() {
+ [ $# -ne 1 ] && perror "parse_patch_name: Wrong parameter count."
+ local PATCH="$1"
+ # Kernel restriction
+ MIN_KERN=$(echo "$PATCH" | sed -r 's/^[^_]+__([0-9\.]+)-[0-9\.]+__[^_]+\.patch$/\1/g')
+ [[ "$MIN_KERN" == /* ]] && MIN_KERN=$(echo "$PATCH" | sed -r 's/^[^_]+__([0-9\.]+)__[^_]+\.patch$/\1/g')
+ MAX_KERN=$(echo "$PATCH" | sed -r 's/^[^_]+__[0-9\.]+-([0-9\.]+)__[^_]+\.patch$/\1/g')
+ [[ "$MAX_KERN" == /* ]] && MAX_KERN=$(echo "$PATCH" | sed -r 's/^[^_]+__([0-9\.]+)__[^_]+\.patch$/\1/g')
+ [[ "$MIN_KERN" == /* ]] && MIN_KERN=
+ [[ "$MAX_KERN" == /* ]] && MAX_KERN=
+ # vmware restriction
+ MIN_VMWARE=$(echo "$PATCH" | sed -r 's/^[^_]+__[^_]+__([0-9\.]+)-[^_]+\.patch$/\1/g')
+ [[ "$MIN_VMWARE" == /* ]] && MIN_VMWARE=$(echo "$PATCH" | sed -r 's/^[^_]+__[^_]+__([0-9\.]+)\.patch$/\1/g')
+ MAX_VMWARE=$(echo "$PATCH" | sed -r 's/^[^_]+__[^_]+__[^_]+-([0-9\.]+)\.patch$/\1/g')
+ [[ "$MAX_VMWARE" == /* ]] && MAX_VMWARE=$(echo "$PATCH" | sed -r 's/^[^_]+__[^_]+__([0-9\.]+)\.patch$/\1/g')
+ [[ "$MIN_VMWARE" == /* ]] && MIN_VMWARE=
+ [[ "$MAX_VMWARE" == /* ]] && MAX_VMWARE=
+}
+
diff --git a/core/modules/vmware/module.conf b/core/modules/vmware/module.conf
new file mode 100644
index 00000000..697ba546
--- /dev/null
+++ b/core/modules/vmware/module.conf
@@ -0,0 +1,69 @@
+REQUIRED_DOWNLOAD_BASE="http://softwareupdate.vmware.com/cds/vmw-desktop/ws/12.1.0/3272444/linux/core/"
+REQUIRED_TYPE="workstation"
+REQUIRED_MODULES="kernel"
+REQUIRED_DIRECTORIES="
+ /etc/vmware
+ /usr/sbin
+ /usr/lib/vmware/bin
+ /usr/lib/vmware/hostd
+ /usr/lib/vmware/icu
+ /usr/lib/vmware/lib
+ /usr/lib/vmware/libconf
+ /usr/lib/vmware/licenses
+ /usr/lib/vmware/resources
+ /usr/lib/vmware/scripts
+ /usr/lib/vmware/share
+ /usr/lib/vmware/xkeymap
+"
+REQUIRED_FILES="
+ /usr/lib/vmware/config
+ /usr/bin/vmware-usbarbitrator
+ /opt/openslx/vmchooser/vmware/vmware.conf
+"
+REQUIRED_BINARIES="
+ vmnet-netifup
+"
+
+REQUIRED_VMWARE_DELETIONS="
+ /var/lib/vmware
+ /etc/vmw*
+ /etc/rc?.d/???vmware*
+ /etc/rc0.d/K06vmware-workstation-server
+ /etc/pam.d/vmware-authd
+ /etc/rc3.d/S25vmamqpd
+ /etc/xdg/menus/applications-merged
+ /etc/init.d/vmamqpd
+ /etc/init.d/vmware*
+ /etc/thnuclnt
+ /etc/cups/thnuclnt.convs
+ /etc/cups/thnuclnt.types
+ /etc/modprobe.d/vmware-fuse.conf
+ /lib/modules/3.11.0-13-generic/misc/vmnet.ko
+ /lib/modules/3.11.0-13-generic/misc/vmmon.ko
+ /usr/share/mime/packages/vmware-player.xml
+ /usr/share/applications/vmware*
+ /usr/share/desktop-directories/vmware-ace-vms.directory
+ /usr/share/man/man1/vmware.1.gz
+ /usr/share/doc/vmware*
+ /usr/share/icons/hicolor/*/mimetypes/application-certificate.png
+ /usr/share/icons/hicolor/*/apps/vmware*
+ /usr/share/icons/hicolor/*/mimetypes/*vmware*
+ /usr/bin/vmnet-dhcpd
+ /usr/bin/ovftool
+ /usr/bin/vmrun
+ /usr/bin/vmware-wssc-adminTool
+ /usr/bin/vmnet-bridge
+ /usr/bin/vmplayer
+ /usr/bin/vmnet-sniffer
+ /usr/bin/vmss2core
+ /usr/bin/vm-support
+ /usr/bin/vmnet-natd
+ /usr/bin/vmnet-netifup
+ /usr/bin/vmware*
+ /usr/include/vmware-vix
+ /usr/lib/libvixAllProducts.so
+ /usr/lib/cups/filter/thnucups
+ /usr/lib/diskLibWrapper.so
+ /usr/lib/vmware*
+ /usr/sbin/vmware*
+"
diff --git a/core/modules/vmware/module.conf.ubuntu b/core/modules/vmware/module.conf.ubuntu
new file mode 100644
index 00000000..c75ee906
--- /dev/null
+++ b/core/modules/vmware/module.conf.ubuntu
@@ -0,0 +1,136 @@
+REQUIRED_VMWARE_DELETIONS="
+ /var/lib/vmware
+ /etc/vmware-vix
+ /etc/rc0.d/K08vmware
+ /etc/rc0.d/K06vmware-workstation-server
+ /etc/rc0.d/K06vmamqpd
+ /etc/pam.d/vmware-authd
+ /etc/rc3.d/S19vmware
+ /etc/rc3.d/S55vmware-workstation-server
+ /etc/rc3.d/S25vmamqpd
+ /etc/rc3.d/K08vmware-USBArbitrator
+ /etc/rc3.d/S50vmware-USBArbitrator
+ /etc/rc5.d/K08vmware-USBArbitrator
+ /etc/rc5.d/S50vmware-USBArbitrator
+ /etc/rc2.d/S19vmware
+ /etc/rc2.d/S55vmware-workstation-server
+ /etc/rc2.d/S25vmamqpd
+ /etc/rc2.d/K08vmware-USBArbitrator
+ /etc/rc2.d/S50vmware-USBArbitrator
+ /etc/xdg/menus/applications-merged
+ /etc/rc6.d/K08vmware
+ /etc/rc6.d/K06vmware-workstation-server
+ /etc/rc6.d/K06vmamqpd
+ /etc/rc4.d/S19vmware
+ /etc/rc4.d/S55vmware-workstation-server
+ /etc/rc4.d/S25vmamqpd
+ /etc/init.d/vmamqpd
+ /etc/init.d/vmware-USBArbitrator
+ /etc/init.d/vmware-workstation-server
+ /etc/init.d/vmware
+ /etc/thnuclnt
+ /etc/vmware-installer
+ /etc/cups/thnuclnt.convs
+ /etc/cups/thnuclnt.types
+ /etc/vmware/netmap.conf
+ /etc/vmware/icu
+ /etc/vmware/hostd
+ /etc/vmware/installer.sh
+ /etc/vmware/bootstrap
+ /etc/vmware/ssl
+ /etc/vmware/config
+ /etc/vmware/locations
+ /etc/modprobe.d/vmware-fuse.conf
+ /lib/modules/3.11.0-13-generic/misc/vmnet.ko
+ /lib/modules/3.11.0-13-generic/misc/vmmon.ko
+ /usr/share/mime/packages/vmware-player.xml
+ /usr/share/applications/vmware-workstation.desktop
+ /usr/share/applications/vmware-player.desktop
+ /usr/share/applications/vmware-netcfg.desktop
+ /usr/share/desktop-directories/vmware-ace-vms.directory
+ /usr/share/man/man1/vmware.1.gz
+ /usr/share/doc/vmware-vix
+ /usr/share/doc/vmware-workstation
+ /usr/share/doc/vmware-player
+ /usr/share/icons/hicolor/32x32/mimetypes/application-certificate.png
+ /usr/share/icons/hicolor/32x32/mimetypes/application-x-vmware-easter-egg.png
+ /usr/share/icons/hicolor/32x32/mimetypes/application-x-vmware-team.png
+ /usr/share/icons/hicolor/32x32/mimetypes/application-x-vmware-vm-legacy.png
+ /usr/share/icons/hicolor/32x32/mimetypes/application-x-vmware-vm-clone.png
+ /usr/share/icons/hicolor/32x32/mimetypes/application-x-vmware-vm.png
+ /usr/share/icons/hicolor/32x32/apps/vmware-player.png
+ /usr/share/icons/hicolor/32x32/apps/vmware-workstation.png
+ /usr/share/icons/hicolor/48x48/mimetypes/application-x-vmware-vmfoundry.png
+ /usr/share/icons/hicolor/48x48/mimetypes/application-x-vmware-vmdisk.png
+ /usr/share/icons/hicolor/48x48/mimetypes/application-x-vmware-easter-egg.png
+ /usr/share/icons/hicolor/48x48/mimetypes/application-x-vmware-team.png
+ /usr/share/icons/hicolor/48x48/mimetypes/application-x-vmware-vm-legacy.png
+ /usr/share/icons/hicolor/48x48/mimetypes/application-x-vmware-vm-clone.png
+ /usr/share/icons/hicolor/48x48/mimetypes/application-x-vmware-snapshot.png
+ /usr/share/icons/hicolor/48x48/mimetypes/application-x-vmware-vm.png
+ /usr/share/icons/hicolor/48x48/apps/vmware-player.png
+ /usr/share/icons/hicolor/48x48/apps/vmware-workstation.png
+ /usr/share/icons/hicolor/scalable/mimetypes/application-x-vmware-easter-egg.svg
+ /usr/share/icons/hicolor/scalable/mimetypes/application-x-vmware-team.svg
+ /usr/share/icons/hicolor/scalable/mimetypes/application-x-vmware-vm-clone.svg
+ /usr/share/icons/hicolor/scalable/mimetypes/application-x-vmware-snapshot.svg
+ /usr/share/icons/hicolor/scalable/mimetypes/application-x-vmware-vm-legacy.svg
+ /usr/share/icons/hicolor/scalable/mimetypes/application-x-vmware-vmfoundry.svg
+ /usr/share/icons/hicolor/scalable/mimetypes/application-certificate.svg
+ /usr/share/icons/hicolor/scalable/mimetypes/application-x-vmware-vm.svg
+ /usr/share/icons/hicolor/scalable/apps/vmware-workstation.svg
+ /usr/share/icons/hicolor/16x16/mimetypes/application-certificate.png
+ /usr/share/icons/hicolor/16x16/mimetypes/application-x-vmware-easter-egg.png
+ /usr/share/icons/hicolor/16x16/mimetypes/application-x-vmware-team.png
+ /usr/share/icons/hicolor/16x16/mimetypes/application-x-vmware-vm-legacy.png
+ /usr/share/icons/hicolor/16x16/mimetypes/application-x-vmware-vm-clone.png
+ /usr/share/icons/hicolor/16x16/mimetypes/application-x-vmware-vm.png
+ /usr/share/icons/hicolor/16x16/apps/vmware-player.png
+ /usr/share/icons/hicolor/16x16/apps/vmware-netcfg.png
+ /usr/share/icons/hicolor/16x16/apps/vmware-workstation.png
+ /usr/share/icons/hicolor/24x24/mimetypes
+ /usr/share/icons/hicolor/24x24/apps/vmware-player.png
+ /usr/share/icons/hicolor/24x24/apps/vmware-netcfg.png
+ /usr/share/icons/hicolor/24x24/apps/vmware-workstation.png
+ /usr/bin/vmnet-dhcpd
+ /usr/bin/vmware-unity-helper
+ /usr/bin/ovftool
+ /usr/bin/vmrun
+ /usr/bin/vmware-vim-cmd
+ /usr/bin/vmware-wssc-adminTool
+ /usr/bin/vmnet-bridge
+ /usr/bin/vmplayer
+ /usr/bin/vmnet-sniffer
+ /usr/bin/vmss2core
+ /usr/bin/vmware-usbarbitrator
+ /usr/bin/vmware-netcfg
+ /usr/bin/vmware-modconfig
+ /usr/bin/vmware-tray
+ /usr/bin/vmware-mount
+ /usr/bin/vm-support
+ /usr/bin/vmware-vdiskmanager
+ /usr/bin/vmware-license-enter.sh
+ /usr/bin/vmware-license-check.sh
+ /usr/bin/vmnet-natd
+ /usr/bin/vmware-uninstall
+ /usr/bin/vmware-vprobe
+ /usr/bin/vmware-fuseUI
+ /usr/bin/vmware-installer
+ /usr/bin/vmware-ping
+ /usr/bin/vmware-gksu
+ /usr/bin/vmnet-netifup
+ /usr/bin/vmware-networks
+ /usr/bin/vmware
+ /usr/bin/vmware-hostd
+ /usr/include/vmware-vix
+ /usr/lib/vmware-vix
+ /usr/lib/vmware-ovftool
+ /usr/lib/vmware-installer
+ /usr/lib/libvixAllProducts.so
+ /usr/lib/cups/filter/thnucups
+ /usr/lib/diskLibWrapper.so
+ /usr/lib/vmware
+ /usr/local/share/applications
+ /usr/sbin/vmware-authdlauncher
+ /usr/sbin/vmware-authd
+"
diff --git a/core/modules/vmware/patches/vmblock__3.0-3.9__1.0-100.0.patch b/core/modules/vmware/patches/vmblock__3.0-3.9__1.0-100.0.patch
new file mode 100644
index 00000000..89b3a7c6
--- /dev/null
+++ b/core/modules/vmware/patches/vmblock__3.0-3.9__1.0-100.0.patch
@@ -0,0 +1,11 @@
+--- a/linux/control.c 2013-10-18 19:56:11.000000000 +0200
++++ b/linux/control.c 2014-02-14 15:54:59.895201379 +0100
+@@ -293,7 +293,7 @@
+
+ retval = i < 0 ? -EINVAL : blockOp(name, blocker);
+
+- putname(name);
++ __putname(name);
+
+ return retval;
+ }
diff --git a/core/modules/vmware/patches/vmblock__3.10__1.0-100.0.patch b/core/modules/vmware/patches/vmblock__3.10__1.0-100.0.patch
new file mode 100644
index 00000000..e54317f9
--- /dev/null
+++ b/core/modules/vmware/patches/vmblock__3.10__1.0-100.0.patch
@@ -0,0 +1,34 @@
+--- a/linux/control.c 2013-10-18 19:56:11.000000000 +0200
++++ b/linux/control.c 2014-02-14 16:20:18.667236035 +0100
+@@ -208,17 +208,18 @@
+ VMBlockSetProcEntryOwner(controlProcMountpoint);
+
+ /* Create /proc/fs/vmblock/dev */
+- controlProcEntry = create_proc_entry(VMBLOCK_CONTROL_DEVNAME,
++ /* controlProcEntry = create_proc_entry(VMBLOCK_CONTROL_DEVNAME,
+ VMBLOCK_CONTROL_MODE,
+- controlProcDirEntry);
+- if (!controlProcEntry) {
++ controlProcDirEntry);*/
++ controlProcEntry = proc_create(VMBLOCK_CONTROL_DEVNAME, VMBLOCK_CONTROL_MODE, controlProcDirEntry, &ControlFileOps);
++ if (controlProcEntry == NULL) {
+ Warning("SetupProcDevice: could not create " VMBLOCK_DEVICE "\n");
+ remove_proc_entry(VMBLOCK_CONTROL_MOUNTPOINT, controlProcDirEntry);
+ remove_proc_entry(VMBLOCK_CONTROL_PROC_DIRNAME, NULL);
+ return -EINVAL;
+ }
+
+- controlProcEntry->proc_fops = &ControlFileOps;
++ /*controlProcEntry->proc_fops = &ControlFileOps;*/
+ return 0;
+ }
+
+@@ -293,7 +294,7 @@
+
+ retval = i < 0 ? -EINVAL : blockOp(name, blocker);
+
+- putname(name);
++ __putname(name);
+
+ return retval;
+ }
diff --git a/core/modules/vmware/patches/vmblock__3.11-9.9__1.0-11.0.patch b/core/modules/vmware/patches/vmblock__3.11-9.9__1.0-11.0.patch
new file mode 100644
index 00000000..dedb2646
--- /dev/null
+++ b/core/modules/vmware/patches/vmblock__3.11-9.9__1.0-11.0.patch
@@ -0,0 +1,123 @@
+--- a/linux/control.c 2013-10-18 19:56:11.000000000 +0200
++++ b/linux/control.c 2014-02-14 16:20:18.667236035 +0100
+@@ -208,17 +208,18 @@
+ VMBlockSetProcEntryOwner(controlProcMountpoint);
+
+ /* Create /proc/fs/vmblock/dev */
+- controlProcEntry = create_proc_entry(VMBLOCK_CONTROL_DEVNAME,
++ /* controlProcEntry = create_proc_entry(VMBLOCK_CONTROL_DEVNAME,
+ VMBLOCK_CONTROL_MODE,
+- controlProcDirEntry);
+- if (!controlProcEntry) {
++ controlProcDirEntry);*/
++ controlProcEntry = proc_create(VMBLOCK_CONTROL_DEVNAME, VMBLOCK_CONTROL_MODE, controlProcDirEntry, &ControlFileOps);
++ if (controlProcEntry == NULL) {
+ Warning("SetupProcDevice: could not create " VMBLOCK_DEVICE "\n");
+ remove_proc_entry(VMBLOCK_CONTROL_MOUNTPOINT, controlProcDirEntry);
+ remove_proc_entry(VMBLOCK_CONTROL_PROC_DIRNAME, NULL);
+ return -EINVAL;
+ }
+
+- controlProcEntry->proc_fops = &ControlFileOps;
++ /*controlProcEntry->proc_fops = &ControlFileOps;*/
+ return 0;
+ }
+
+@@ -293,7 +294,7 @@
+
+ retval = i < 0 ? -EINVAL : blockOp(name, blocker);
+
+- putname(name);
++ __putname(name);
+
+ return retval;
+ }
+--- a/linux/file.c 2013-10-18 19:56:11.000000000 +0200
++++ b/linux/file.c 2014-02-14 16:20:21.455236098 +0100
+@@ -38,46 +38,6 @@
+ typedef ino_t inode_num_t;
+ #endif
+
+-/* Specifically for our filldir_t callback */
+-typedef struct FilldirInfo {
+- filldir_t filldir;
+- void *dirent;
+-} FilldirInfo;
+-
+-
+-/*
+- *----------------------------------------------------------------------------
+- *
+- * Filldir --
+- *
+- * Callback function for readdir that we use in place of the one provided.
+- * This allows us to specify that each dentry is a symlink, but pass through
+- * everything else to the original filldir function.
+- *
+- * Results:
+- * Original filldir's return value.
+- *
+- * Side effects:
+- * Directory information gets copied to user's buffer.
+- *
+- *----------------------------------------------------------------------------
+- */
+-
+-static int
+-Filldir(void *buf, // IN: Dirent buffer passed from FileOpReaddir
+- const char *name, // IN: Dirent name
+- int namelen, // IN: len of dirent's name
+- loff_t offset, // IN: Offset
+- inode_num_t ino, // IN: Inode number of dirent
+- unsigned int d_type) // IN: Type of file
+-{
+- FilldirInfo *info = buf;
+-
+- /* Specify DT_LNK regardless */
+- return info->filldir(info->dirent, name, namelen, offset, ino, DT_LNK);
+-}
+-
+-
+ /* File operations */
+
+ /*
+@@ -166,11 +126,10 @@
+
+ static int
+ FileOpReaddir(struct file *file, // IN
+- void *dirent, // IN
+- filldir_t filldir) // IN
++ struct dir_context *ctx) // IN
+ {
+ int ret;
+- FilldirInfo info;
++
+ struct file *actualFile;
+
+ if (!file) {
+@@ -184,12 +143,10 @@
+ return -EINVAL;
+ }
+
+- info.filldir = filldir;
+- info.dirent = dirent;
+-
+- actualFile->f_pos = file->f_pos;
+- ret = vfs_readdir(actualFile, Filldir, &info);
+- file->f_pos = actualFile->f_pos;
++ /* Ricky Wong Yung Fei:
++ * Manipulation of pos is now handled internally by iterate_dir().
++ */
++ ret = iterate_dir(actualFile, ctx);
+
+ return ret;
+ }
+@@ -237,7 +194,7 @@
+
+
+ struct file_operations RootFileOps = {
+- .readdir = FileOpReaddir,
++ .iterate = FileOpReaddir,
+ .open = FileOpOpen,
+ .release = FileOpRelease,
+ };
diff --git a/core/modules/vmware/patches/vmci__4.3-4.3__12.0.0.patch b/core/modules/vmware/patches/vmci__4.3-4.3__12.0.0.patch
new file mode 100644
index 00000000..05dae1b7
--- /dev/null
+++ b/core/modules/vmware/patches/vmci__4.3-4.3__12.0.0.patch
@@ -0,0 +1,26 @@
+--- a/linux/driver.c 2015-09-14 21:07:49.751696932 +0200
++++ b/linux/driver.c 2015-09-14 22:10:48.015908198 +0200
+@@ -2467,8 +2467,6 @@
+ static void __exit
+ vmci_exit(void)
+ {
+- int retval;
+-
+ if (guestDeviceInit) {
+ pci_unregister_driver(&vmci_driver);
+ vfree(data_buffer);
+@@ -2480,12 +2478,8 @@
+
+ VMCI_HostCleanup();
+
+- retval = misc_deregister(&linuxState.misc);
+- if (retval) {
+- Warning(LGPFX "Module %s: error unregistering\n", VMCI_MODULE_NAME);
+- } else {
+- Log(LGPFX"Module %s: unloaded\n", VMCI_MODULE_NAME);
+- }
++ misc_deregister(&linuxState.misc);
++ Log(LGPFX"Module %s: unloaded\n", VMCI_MODULE_NAME);
+
+ hostDeviceInit = FALSE;
+ }
diff --git a/core/modules/vmware/patches/vmmon__4.3-4.3__12.0.0.patch b/core/modules/vmware/patches/vmmon__4.3-4.3__12.0.0.patch
new file mode 100644
index 00000000..3f5a950a
--- /dev/null
+++ b/core/modules/vmware/patches/vmmon__4.3-4.3__12.0.0.patch
@@ -0,0 +1,13 @@
+--- a/linux/driver.c 2015-08-14 22:39:49.000000000 +0200
++++ b/linux/driver.c 2015-09-14 22:11:06.807909249 +0200
+@@ -387,9 +387,7 @@
+ #ifdef VMX86_DEVEL
+ unregister_chrdev(linuxState.major, linuxState.deviceName);
+ #else
+- if (misc_deregister(&linuxState.misc)) {
+- Warning("Module %s: error unregistering\n", linuxState.deviceName);
+- }
++ misc_deregister(&linuxState.misc);
+ #endif
+
+ Log("Module %s: unloaded\n", linuxState.deviceName);
diff --git a/core/modules/vmware/patches/vmnet__3.13-3.13__1.0-10.0.2.patch b/core/modules/vmware/patches/vmnet__3.13-3.13__1.0-10.0.2.patch
new file mode 100644
index 00000000..54607506
--- /dev/null
+++ b/core/modules/vmware/patches/vmnet__3.13-3.13__1.0-10.0.2.patch
@@ -0,0 +1,27 @@
+--- a/filter.c 2014-04-17 05:30:43.497846349 -0700
++++ b/filter.c 2014-04-17 05:30:41.445846394 -0700
+@@ -203,7 +203,11 @@
+ #endif
+
+ static unsigned int
++#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+ VNetFilterHookFn(unsigned int hooknum, // IN:
++#else
++VNetFilterHookFn(const struct nf_hook_ops *ops, // IN:
++#endif
+ #ifdef VMW_NFHOOK_USES_SKB
+ struct sk_buff *skb, // IN:
+ #else
+@@ -252,7 +256,11 @@
+
+ /* When the host transmits, hooknum is VMW_NF_INET_POST_ROUTING. */
+ /* When the host receives, hooknum is VMW_NF_INET_LOCAL_IN. */
+- transmit = (hooknum == VMW_NF_INET_POST_ROUTING);
++ #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
++ transmit = (hooknum == VMW_NF_INET_POST_ROUTING);
++ #else
++ transmit = (ops->hooknum == VMW_NF_INET_POST_ROUTING);
++ #endif
+
+ packetHeader = compat_skb_network_header(skb);
+ ip = (struct iphdr*)packetHeader;
diff --git a/core/modules/x11vnc/module.build b/core/modules/x11vnc/module.build
new file mode 100644
index 00000000..0238f1bd
--- /dev/null
+++ b/core/modules/x11vnc/module.build
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+
+}
+
+post_copy() {
+ :
+}
+
diff --git a/core/modules/x11vnc/module.conf b/core/modules/x11vnc/module.conf
new file mode 100644
index 00000000..6303e3e8
--- /dev/null
+++ b/core/modules/x11vnc/module.conf
@@ -0,0 +1,6 @@
+REQUIRED_BINARIES="
+ x11vnc
+"
+REQUIRED_DIRECTORIES="
+"
+REQUIRED_FILES=""
diff --git a/core/modules/x11vnc/module.conf.fedora b/core/modules/x11vnc/module.conf.fedora
new file mode 100644
index 00000000..43ae3119
--- /dev/null
+++ b/core/modules/x11vnc/module.conf.fedora
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ x11vnc
+"
+REQUIRED_CONTENT_PACKAGES="
+ x11vnc
+"
diff --git a/core/modules/x11vnc/module.conf.opensuse b/core/modules/x11vnc/module.conf.opensuse
new file mode 100644
index 00000000..b6b60c93
--- /dev/null
+++ b/core/modules/x11vnc/module.conf.opensuse
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ x11vnc
+"
+REQUIRED_CONTENT_PACKAGES="
+ x11vnc
+"
diff --git a/core/modules/x11vnc/module.conf.ubuntu b/core/modules/x11vnc/module.conf.ubuntu
new file mode 100644
index 00000000..b6b60c93
--- /dev/null
+++ b/core/modules/x11vnc/module.conf.ubuntu
@@ -0,0 +1,6 @@
+REQUIRED_INSTALLED_PACKAGES="
+ x11vnc
+"
+REQUIRED_CONTENT_PACKAGES="
+ x11vnc
+"
diff --git a/core/modules/xorg/data/etc/X11/Xreset b/core/modules/xorg/data/etc/X11/Xreset
new file mode 100755
index 00000000..3d175a5b
--- /dev/null
+++ b/core/modules/xorg/data/etc/X11/Xreset
@@ -0,0 +1,25 @@
+#!/bin/ash
+#
+# /etc/X11/Xreset
+#
+# Xreset - run as root after session exits
+#
+
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+
+set -e
+
+PROGNAME=Xreset
+SYSSESSIONDIR=/etc/X11/Xreset.d
+
+if [ ! -d "$SYSSESSIONDIR" ]; then
+ # Nothing to do, exiting
+ exit 0
+fi
+
+for SESSIONFILE in $SYSSESSIONDIR/*; do
+ . "$SESSIONFILE" || slxlog "xreset" "Xreset: Could not source $SESSIONFILE." "$SESSIONFILE"
+done
+
+exit 0
+
diff --git a/core/modules/xorg/data/etc/X11/Xsession b/core/modules/xorg/data/etc/X11/Xsession
new file mode 100755
index 00000000..fadc69ba
--- /dev/null
+++ b/core/modules/xorg/data/etc/X11/Xsession
@@ -0,0 +1,112 @@
+#!/bin/ash
+#
+# /etc/X11/Xsession
+#
+# Xsession is executed to start the user's session (as the user)
+#
+
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+
+PROGNAME=Xsession
+
+message () {
+ # pretty-print messages of arbitrary length; use xmessage if it
+ # is available and $DISPLAY is set
+ MESSAGE="$PROGNAME: $*"
+ echo "$MESSAGE" | fold -s -w ${COLUMNS:-80} >&2
+ if [ -n "$DISPLAY" ] && which xmessage > /dev/null 2>&1; then
+ echo "$MESSAGE" | fold -s -w ${COLUMNS:-80} | xmessage -center -file -
+ fi
+}
+
+message_nonl () {
+ # pretty-print messages of arbitrary length (no trailing newline); use
+ # xmessage if it is available and $DISPLAY is set
+ MESSAGE="$PROGNAME: $*"
+ echo -n "$MESSAGE" | fold -s -w ${COLUMNS:-80} >&2;
+ if [ -n "$DISPLAY" ] && which xmessage > /dev/null 2>&1; then
+ echo -n "$MESSAGE" | fold -s -w ${COLUMNS:-80} | xmessage -center -file -
+ fi
+}
+
+errormsg () {
+ # exit script with error
+ message "$*"
+ exit 1
+}
+
+internal_errormsg () {
+ # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message
+ # One big call to message() for the sake of xmessage; if we had two then
+ # the user would have dismissed the error we want reported before seeing the
+ # request to report it.
+ errormsg "$*" \
+ "Please report the installed version of the \"x11-common\"" \
+ "package and the complete text of this error message to" \
+ "<debian-x@lists.debian.org>."
+}
+
+# Workaround to start Xsession. The original Xsession script includes error handling functionality and sources other scrips from the Xsession.d/ directory.
+
+SESSIONDIR="/etc/X11/Xsession.d"
+
+if [ -d "$SESSIONDIR" ]; then
+ for file in $SESSIONDIR/*; do
+ . $file || slxlog "xsession" "Xsession: Could not source $file" "$file"
+ done
+fi
+
+# Make sure we source the global profile - needed for ssh-agent, etc.
+[ -e "/etc/profile" ] && source "/etc/profile"
+
+# start selected session
+case "$1" in
+ failsafe)
+ # Failsafe session was requested.
+ if [ -e /usr/bin/xterm ]; then
+ if [ -x /usr/bin/xterm ]; then
+ exec xterm -geometry +1+1
+ else
+ # fatal error
+ errormsg "unable to launch failsafe X session ---" \
+ "x-terminal-emulator not executable; aborting."
+ fi
+ else
+ # fatal error
+ errormsg "unable to launch failsafe X session ---" \
+ "x-terminal-emulator not found; aborting."
+ fi
+ ;;
+ default)
+ # Specific program was requested.
+ SESSION="default"
+ if [ -e $HOME/.dmrc ]; then
+ SESSION=$(cat $HOME/.dmrc|grep "Session"| cut -d "=" -f2)
+ fi
+ # somehow .dmrc is cleared when logging in the first time after boot
+ if [ -e $HOME/.dmrc.real ]; then
+ SESSION=$(cat $HOME/.dmrc.real|grep "Session"| cut -d "=" -f2)
+ fi
+ [ "x$SESSION" == "xdefault" ] && SESSION="gnome"
+ CMD=$(cat /opt/openslx/xsessions/$SESSION.desktop|grep "Exec"| cut -d "=" -f2-99|head -n1)
+ exec $CMD
+ ;;
+
+ *)
+ # Specific program was requested.
+ STARTUP_FULL_PATH=$(/opt/openslx/bin/which "${1%% *}" || true)
+ if [ -n "$STARTUP_FULL_PATH" ] && [ -e "$STARTUP_FULL_PATH" ]; then
+ if [ -x "$STARTUP_FULL_PATH" ]; then
+ exec $1
+ else
+ message "unable to launch \"$1\" X session ---" \
+ "\"$1\" not executable; falling back to default session."
+ fi
+ else
+ message "unable to launch \"$1\" X session ---" \
+ "\"$1\" not found; falling back to default session."
+ fi
+ ;;
+
+esac
+
diff --git a/core/modules/xorg/data/etc/X11/Xsetup b/core/modules/xorg/data/etc/X11/Xsetup
new file mode 100755
index 00000000..b93d7bd6
--- /dev/null
+++ b/core/modules/xorg/data/etc/X11/Xsetup
@@ -0,0 +1,16 @@
+#!/bin/ash
+#
+# /etc/X11/Xsetup
+#
+# Xsetup is executed once before the greeter starts (as root)
+#
+
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+
+SESSIONDIR="/etc/X11/Xsetup.d"
+
+if [ -d "$SESSIONDIR" ]; then
+ for file in $SESSIONDIR/*; do
+ . $file || slxlog "xsetup" "Xsetup: Could not source $file" "$file"
+ done
+fi
diff --git a/core/modules/xorg/data/etc/X11/Xstartup b/core/modules/xorg/data/etc/X11/Xstartup
new file mode 100755
index 00000000..353c5bb2
--- /dev/null
+++ b/core/modules/xorg/data/etc/X11/Xstartup
@@ -0,0 +1,9 @@
+#!/bin/ash
+#
+# /etc/X11/Xstartup
+#
+# Xstartup is executed on successful authentication, before the session is opened (as root)
+#
+
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+
diff --git a/core/modules/xorg/data/opt/openslx/iptables/rules.d/70-xorg b/core/modules/xorg/data/opt/openslx/iptables/rules.d/70-xorg
new file mode 100755
index 00000000..023f5087
--- /dev/null
+++ b/core/modules/xorg/data/opt/openslx/iptables/rules.d/70-xorg
@@ -0,0 +1,4 @@
+#!/bin/ash
+
+# X11 port
+iptables -I ipt-helper-INPUT 1 -i br0 -p tcp --dport 6000 -j REJECT
diff --git a/core/modules/xorg/module.build b/core/modules/xorg/module.build
new file mode 100644
index 00000000..16e0bb5b
--- /dev/null
+++ b/core/modules/xorg/module.build
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+fetch_source() {
+ :
+}
+
+build() {
+ COPYLIST="list_dpkg_output"
+ [ -e "$COPYLIST" ] && rm "$COPYLIST"
+
+ list_packet_files >> "$COPYLIST"
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "${MODULE_BUILD_DIR}"
+
+ # copy udev rules to correct location
+ [ -d "${MODULE_BUILD_DIR}/lib/udev" ] && mv "${MODULE_BUILD_DIR}/lib/udev" "${MODULE_BUILD_DIR}/usr/lib/"
+}
+
+post_copy() {
+ mkdir -p "${TARGET_BUILD_DIR}/etc/X11"
+ [ ! -e ${TARGET_BUILD_DIR}/etc/X11/X ] && ln -s /usr/bin/Xorg ${TARGET_BUILD_DIR}/etc/X11/X
+}
+
diff --git a/core/modules/xorg/module.conf b/core/modules/xorg/module.conf
new file mode 100644
index 00000000..b99f0e2a
--- /dev/null
+++ b/core/modules/xorg/module.conf
@@ -0,0 +1,19 @@
+REQUIRED_BINARIES="
+ X
+ Xorg
+ gtf
+ cvt
+ setxkbmap
+ xkbvleds
+ xkbprint
+ xkbwatch
+ xkbbell
+ xkbevd
+ xrandr
+ xkbcomp
+ vmmouse_detect
+"
+REQUIRED_DIRECTORIES="
+ /usr/share/X11
+"
+REQUIRED_FILES=""
diff --git a/core/modules/xorg/module.conf.centos b/core/modules/xorg/module.conf.centos
new file mode 100644
index 00000000..ff5846e3
--- /dev/null
+++ b/core/modules/xorg/module.conf.centos
@@ -0,0 +1,67 @@
+# xkbutils, xkbprint, setxkbmap, xkbevd for 64-bit openSuse
+REQUIRED_INSTALLED_PACKAGES="
+ xorg-x11-server-Xorg
+ xorg-x11-drv-vmware
+ xorg-x11-drv-ati
+ xorg-x11-drv-nouveau
+ xorg-x11-drv-intel
+ xorg-x11-drv-vesa
+ xorg-x11-drv-fbdev
+ xorg-x11-drv-modesetting
+ xorg-x11-drv-vmmouse
+ xorg-x11-drv-wacom
+ xorg-x11-drv-evdev
+ xorg-x11-drv-keyboard
+ xorg-x11-drv-mouse
+ xorg-x11-drv-synaptics
+ xorg-x11-drv-void
+ xkeyboard-config
+ dejavu-sans-fonts
+ libxcb
+ mesa-dri-drivers
+ mesa-libGL
+ xorg-x11-xkb-utils
+ xorg-x11-xkb-extras
+ pixman
+ xorg-x11-server-utils
+"
+REQUIRED_CONTENT_PACKAGES="
+ xorg-x11-server-Xorg
+ xorg-x11-drv-vmware
+ xorg-x11-drv-ati
+ xorg-x11-drv-nouveau
+ xorg-x11-drv-intel
+ xorg-x11-drv-vesa
+ xorg-x11-drv-fbdev
+ xorg-x11-drv-modesetting
+ xorg-x11-drv-vmmouse
+ xorg-x11-drv-wacom
+ xorg-x11-drv-evdev
+ xorg-x11-drv-keyboard
+ xorg-x11-drv-mouse
+ xorg-x11-drv-synaptics
+ xorg-x11-drv-void
+ xkeyboard-config
+ dejavu-sans-fonts
+ libxcb
+ mesa-dri-drivers
+ mesa-libGL
+ xorg-x11-xkb-utils
+ xorg-x11-xkb-extras
+ pixman
+ xorg-x11-server-utils
+"
+REQUIRED_LIBRARIES="
+ libxcb-glx
+ libIntelXvMC
+ i965_dri
+ vmwgfx_dri
+ i915_dri
+ libpixman-1
+"
+REQUIRED_DIRECTORIES+="
+ /usr/bin
+ /usr/lib/udev
+ /usr/$LIB64/xorg
+ /usr/share/fonts
+"
diff --git a/core/modules/xorg/module.conf.debian b/core/modules/xorg/module.conf.debian
new file mode 100644
index 00000000..86d473a3
--- /dev/null
+++ b/core/modules/xorg/module.conf.debian
@@ -0,0 +1,40 @@
+REQUIRED_INSTALLED_PACKAGES="
+"
+REQUIRED_CONTENT_PACKAGES="
+ xserver-xorg
+ xserver-xorg-core
+ libgl1-mesa-dri
+ libgl1-mesa-glx
+ xkb-data
+ x11-xkb-utils
+ x11-xserver-utils
+ xserver-xorg-input-evdev
+ xserver-xorg-input-mouse
+ xserver-xorg-input-vmmouse
+ xserver-xorg-video-intel
+ xserver-xorg-video-ati
+ xserver-xorg-video-vesa
+ xserver-xorg-video-mga
+ xserver-xorg-video-sisusb
+ xserver-xorg-video-vmware
+ xserver-xorg-video-fbdev
+ xserver-xorg-video-radeon
+ xserver-xorg-video-sisusb
+ xserver-xorg-video-nouveau
+ @xserver-xorg-video-openchrome
+ @xserver-xorg-video-savage
+ @xserver-xorg-video-trident
+ @xserver-xorg-video-mach64
+ @xserver-xorg-video-qxl
+ @xserver-xorg-video-siliconmotion
+ @xserver-xorg-video-cirrus
+ @xserver-xorg-video-r128
+ @xserver-xorg-video-neomagic
+ @xserver-xorg-video-geode
+ @xserver-xorg-video-s3
+ @xserver-xorg-video-tdfx
+"
+REQUIRED_DIRECTORIES+="
+ /usr/lib
+"
+REQUIRED_FILES=""
diff --git a/core/modules/xorg/module.conf.fedora b/core/modules/xorg/module.conf.fedora
new file mode 100644
index 00000000..5cb5a594
--- /dev/null
+++ b/core/modules/xorg/module.conf.fedora
@@ -0,0 +1,69 @@
+# xkbutils, xkbprint, setxkbmap, xkbevd for 64-bit openSuse
+REQUIRED_INSTALLED_PACKAGES="
+ xorg-x11-server-Xorg
+ xorg-x11-drv-vmware
+ xorg-x11-drv-ati
+ xorg-x11-drv-nouveau
+ xorg-x11-drv-intel
+ xorg-x11-drv-i740
+ xorg-x11-drv-vesa
+ xorg-x11-drv-fbdev
+ xorg-x11-drv-modesetting
+ xorg-x11-drv-vmmouse
+ xorg-x11-drv-wacom
+ xorg-x11-drv-evdev
+ xorg-x11-drv-keyboard
+ xorg-x11-drv-mouse
+ xorg-x11-drv-synaptics
+ xorg-x11-drv-void
+ xkeyboard-config
+ dejavu-sans-fonts
+ libxcb
+ mesa-dri-drivers
+ mesa-libGL
+ xorg-x11-xkb-utils
+ xorg-x11-xkb-extras
+ pixman
+ xorg-x11-server-utils
+"
+REQUIRED_CONTENT_PACKAGES="
+ xorg-x11-server-Xorg
+ xorg-x11-drv-vmware
+ xorg-x11-drv-ati
+ xorg-x11-drv-nouveau
+ xorg-x11-drv-intel
+ xorg-x11-drv-i740
+ xorg-x11-drv-vesa
+ xorg-x11-drv-fbdev
+ xorg-x11-drv-modesetting
+ xorg-x11-drv-vmmouse
+ xorg-x11-drv-wacom
+ xorg-x11-drv-evdev
+ xorg-x11-drv-keyboard
+ xorg-x11-drv-mouse
+ xorg-x11-drv-synaptics
+ xorg-x11-drv-void
+ xkeyboard-config
+ dejavu-sans-fonts
+ libxcb
+ mesa-dri-drivers
+ mesa-libGL
+ xorg-x11-xkb-utils
+ xorg-x11-xkb-extras
+ pixman
+ xorg-x11-server-utils
+"
+REQUIRED_LIBRARIES="
+ libxcb-glx
+ libIntelXvMC
+ i965_dri
+ vmwgfx_dri
+ i915_dri
+ libpixman-1
+"
+REQUIRED_DIRECTORIES+="
+ /usr/bin
+ /usr/lib/udev
+ /usr/$LIB64/xorg
+ /usr/share/fonts
+"
diff --git a/core/modules/xorg/module.conf.opensuse b/core/modules/xorg/module.conf.opensuse
new file mode 100644
index 00000000..1e6f5ff1
--- /dev/null
+++ b/core/modules/xorg/module.conf.opensuse
@@ -0,0 +1,59 @@
+# xkbutils, xkbprint, setxkbmap, xkbevd for 64-bit openSuse
+REQUIRED_INSTALLED_PACKAGES="
+"
+REQUIRED_CONTENT_PACKAGES="
+ xorg-x11
+ xorg-x11-server
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xorg-x11-driver-video-nouveau
+ xf86-video-vmware
+ xf86-video-ati
+ xf86-video-nv
+ xf86-video-intel
+ xf86-video-i128
+ xf86-video-geode
+ xf86-video-vesa
+ xf86-video-fbdev
+ xf86-video-modesetting
+ xf86-input-vmmouse
+ xf86-input-wacom
+ xf86-input-evdev
+ xf86-input-joystick
+ xf86-input-keyboard
+ xf86-input-mouse
+ xf86-input-synaptics
+ xf86-input-void
+ xkeyboard-config
+ xkbcomp
+ dejavu-fonts
+ libxcb-glx0
+ kdm-branding-openSUSE
+ Mesa
+ xkbutils
+ xkbprint
+ setxkbmap
+ xkbevd
+ libpixman-1-0
+ xrandr
+ vaapi-intel-driver
+"
+REQUIRED_LIBRARIES="
+ libI810XvMC
+ libxcb-glx
+ libIntelXvMC
+ i965_dri
+ vmwgfx_dri
+ i915_dri
+ i965_drv_video
+ libpixman-1
+"
+REQUIRED_DIRECTORIES+="
+ /usr/bin
+ /usr/lib/udev
+ /usr/$LIB64/xorg
+ /usr/share/fonts
+"
+REQUIRED_FILES="
+ /var/adm/fillup-templates/sysconfig.displaymanager-kdm
+"
diff --git a/core/modules/xorg/module.conf.opensuse.13.1 b/core/modules/xorg/module.conf.opensuse.13.1
new file mode 100644
index 00000000..6199ed15
--- /dev/null
+++ b/core/modules/xorg/module.conf.opensuse.13.1
@@ -0,0 +1,95 @@
+# xkbutils, xkbprint, setxkbmap, xkbevd for 64-bit openSuse
+REQUIRED_INSTALLED_PACKAGES="
+ xorg-x11
+ xorg-x11
+ xorg-x11-server
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xorg-x11-driver-video-nouveau
+ xf86-video-vmware
+ xf86-video-ati
+ xf86-video-nv
+ xf86-video-intel
+ xf86-video-i128
+ xf86-video-geode
+ xf86-video-vesa
+ xf86-video-fbdev
+ xf86-video-modesetting
+ xf86-input-vmmouse
+ xf86-input-wacom
+ xf86-input-evdev
+ xf86-input-joystick
+ xf86-input-keyboard
+ xf86-input-mouse
+ xf86-input-synaptics
+ xf86-input-void
+ xkeyboard-config
+ xkbcomp
+ dejavu-fonts
+ libxcb-glx0
+ kdm-branding-openSUSE
+ Mesa
+ xkbutils
+ xkbprint
+ setxkbmap
+ xkbevd
+ libpixman-1-0
+ xrandr
+ vaapi-intel-driver
+"
+REQUIRED_CONTENT_PACKAGES="
+ xorg-x11
+ xorg-x11-server
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xorg-x11-driver-video-nouveau
+ xf86-video-vmware
+ xf86-video-ati
+ xf86-video-nv
+ xf86-video-intel
+ xf86-video-i128
+ xf86-video-geode
+ xf86-video-vesa
+ xf86-video-fbdev
+ xf86-video-modesetting
+ xf86-input-vmmouse
+ xf86-input-wacom
+ xf86-input-evdev
+ xf86-input-joystick
+ xf86-input-keyboard
+ xf86-input-mouse
+ xf86-input-synaptics
+ xf86-input-void
+ xkeyboard-config
+ xkbcomp
+ dejavu-fonts
+ libxcb-glx0
+ kdm-branding-openSUSE
+ Mesa
+ xkbutils
+ xkbprint
+ setxkbmap
+ xkbevd
+ libpixman-1-0
+ xrandr
+ vaapi-intel-driver
+"
+REQUIRED_LIBRARIES="
+ libI810XvMC
+ libxcb-glx
+ libIntelXvMC
+ i965_dri
+ vmwgfx_dri
+ i915_dri
+ i965_drv_video
+ libpixman-1
+"
+REQUIRED_DIRECTORIES+="
+ /usr/bin
+ /usr/lib/udev
+ /usr/$LIB64/xorg
+ /usr/share/fonts
+"
+REQUIRED_FILES="
+ /var/adm/fillup-templates/sysconfig.displaymanager-kdm
+"
diff --git a/core/modules/xorg/module.conf.opensuse.13.2 b/core/modules/xorg/module.conf.opensuse.13.2
new file mode 100644
index 00000000..363ce3aa
--- /dev/null
+++ b/core/modules/xorg/module.conf.opensuse.13.2
@@ -0,0 +1,92 @@
+# xkbutils, xkbprint, setxkbmap, xkbevd for 64-bit openSuse
+REQUIRED_INSTALLED_PACKAGES="
+ xorg-x11
+ xorg-x11-server
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xf86-video-nouveau
+ xf86-video-vmware
+ xf86-video-ati
+ xf86-video-nv
+ xf86-video-intel
+ xf86-video-i128
+ xf86-video-geode
+ xf86-video-vesa
+ xf86-video-fbdev
+ xf86-video-modesetting
+ xf86-input-vmmouse
+ xf86-input-wacom
+ xf86-input-evdev
+ xf86-input-joystick
+ xf86-input-keyboard
+ xf86-input-mouse
+ xf86-input-synaptics
+ xf86-input-void
+ xkeyboard-config
+ xkbcomp
+ dejavu-fonts
+ kdm-branding-openSUSE
+ Mesa
+ xkbutils
+ xkbprint
+ setxkbmap
+ xkbevd
+ libpixman-1-0
+ xrandr
+ vaapi-intel-driver
+"
+REQUIRED_CONTENT_PACKAGES="
+ xorg-x11
+ xorg-x11-server
+ xorg-x11-driver-input
+ xorg-x11-driver-video
+ xf86-video-nouveau
+ xf86-video-vmware
+ xf86-video-ati
+ xf86-video-nv
+ xf86-video-intel
+ xf86-video-i128
+ xf86-video-geode
+ xf86-video-vesa
+ xf86-video-fbdev
+ xf86-video-modesetting
+ xf86-input-vmmouse
+ xf86-input-wacom
+ xf86-input-evdev
+ xf86-input-joystick
+ xf86-input-keyboard
+ xf86-input-mouse
+ xf86-input-synaptics
+ xf86-input-void
+ xkeyboard-config
+ xkbcomp
+ dejavu-fonts
+ libxcb-glx0
+ kdm-branding-openSUSE
+ Mesa
+ xkbutils
+ xkbprint
+ setxkbmap
+ xkbevd
+ libpixman-1-0
+ xrandr
+ vaapi-intel-driver
+"
+REQUIRED_LIBRARIES="
+ libxcb-glx
+ libIntelXvMC
+ i965_dri
+ vmwgfx_dri
+ i915_dri
+ i965_drv_video
+ libpixman-1
+"
+REQUIRED_DIRECTORIES+="
+ /usr/bin
+ /usr/lib/udev
+ /usr/$LIB64/xorg
+ /usr/share/fonts
+"
+REQUIRED_FILES="
+ /var/adm/fillup-templates/sysconfig.displaymanager-kdm
+"
diff --git a/core/modules/xorg/module.conf.ubuntu b/core/modules/xorg/module.conf.ubuntu
new file mode 100644
index 00000000..41a8739a
--- /dev/null
+++ b/core/modules/xorg/module.conf.ubuntu
@@ -0,0 +1,40 @@
+REQUIRED_INSTALLED_PACKAGES="
+"
+REQUIRED_CONTENT_PACKAGES="
+ xserver-xorg$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-core$UBUNTU_XORG_PKG_SUFFIX
+ libgl1-mesa-dri$UBUNTU_XORG_PKG_SUFFIX
+ libgl1-mesa-glx$UBUNTU_XORG_PKG_SUFFIX
+ xkb-data
+ x11-xkb-utils
+ x11-xserver-utils
+ xserver-xorg-input-evdev$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-input-mouse$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-input-vmmouse$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-intel$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-ati$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-vesa$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-mga$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-vmware$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-fbdev$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-radeon$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-sisusb$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-nouveau$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-openchrome$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-savage$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-trident$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-mach64$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-qxl$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-siliconmotion$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-cirrus$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-r128$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-neomagic$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-geode$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-s3$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-tdfx$UBUNTU_XORG_PKG_SUFFIX
+"
+
+REQUIRED_DIRECTORIES+="
+ /usr/lib
+"
+REQUIRED_FILES=""
diff --git a/core/modules/xorg/module.conf.ubuntu.16 b/core/modules/xorg/module.conf.ubuntu.16
new file mode 100644
index 00000000..8eb4cd56
--- /dev/null
+++ b/core/modules/xorg/module.conf.ubuntu.16
@@ -0,0 +1,37 @@
+REQUIRED_INSTALLED_PACKAGES="
+"
+REQUIRED_CONTENT_PACKAGES="
+ xserver-xorg$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-core$UBUNTU_XORG_PKG_SUFFIX
+ libgl1-mesa-dri$UBUNTU_XORG_PKG_SUFFIX
+ libgl1-mesa-glx$UBUNTU_XORG_PKG_SUFFIX
+ xkb-data
+ x11-xkb-utils
+ x11-xserver-utils
+ xserver-xorg-input-evdev$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-input-vmmouse$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-intel$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-ati$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-vesa$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-vmware$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-fbdev$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-radeon$UBUNTU_XORG_PKG_SUFFIX
+ xserver-xorg-video-nouveau$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-openchrome$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-savage$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-trident$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-mach64$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-qxl$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-siliconmotion$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-cirrus$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-r128$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-neomagic$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-geode$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-s3$UBUNTU_XORG_PKG_SUFFIX
+ @xserver-xorg-video-tdfx$UBUNTU_XORG_PKG_SUFFIX
+"
+
+REQUIRED_DIRECTORIES+="
+ /usr/lib
+"
+REQUIRED_FILES=""
diff --git a/core/post-patch/ck-connector/fake-ck-connector.c b/core/post-patch/ck-connector/fake-ck-connector.c
new file mode 100644
index 00000000..42fa1546
--- /dev/null
+++ b/core/post-patch/ck-connector/fake-ck-connector.c
@@ -0,0 +1,55 @@
+#include <dbus/dbus.h>
+#include <sys/types.h>
+
+struct _CkConnector;
+typedef struct _CkConnector CkConnector;
+
+
+struct _CkConnector
+{
+ int refcount;
+ char *cookie;
+ dbus_bool_t session_created;
+ DBusConnection *connection;
+};
+
+void ck_connector_unref (CkConnector *connector)
+{
+ return;
+}
+
+CkConnector * ck_connector_ref (CkConnector *connector)
+{
+ return connector;
+}
+
+CkConnector * ck_connector_new (void)
+{
+ return (CkConnector*)1;
+}
+
+dbus_bool_t ck_connector_open_session (CkConnector *connector, DBusError *error)
+{
+ return 1;
+}
+
+dbus_bool_t ck_connector_open_session_with_parameters (CkConnector *connector, DBusError *error, const char *first_parameter_name, ...)
+{
+ return 1;
+}
+
+dbus_bool_t ck_connector_open_session_for_user (CkConnector *connector, uid_t user, const char *display_device, const char *x11_display, DBusError *error)
+{
+ return 1;
+}
+
+const char * ck_connector_get_cookie (CkConnector *connector)
+{
+ return NULL;
+}
+
+dbus_bool_t ck_connector_close_session (CkConnector *connector, DBusError *error)
+{
+ return 1;
+}
+
diff --git a/core/rootfs/rootfs-stage31/data/etc/modprobe.d/vmwgfx-fbdev.conf b/core/rootfs/rootfs-stage31/data/etc/modprobe.d/vmwgfx-fbdev.conf
new file mode 100644
index 00000000..ebc4b49c
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/etc/modprobe.d/vmwgfx-fbdev.conf
@@ -0,0 +1,5 @@
+# when vmwgfx is loaded via modprobe in stage31, this conf file is read,
+# enables fbdev support for vmware so that
+# fb doesnt break when switching tty's in minilinux running inside vmware
+options vmwgfx enable_fbdev=1
+
diff --git a/core/rootfs/rootfs-stage31/data/etc/modules b/core/rootfs/rootfs-stage31/data/etc/modules
new file mode 100644
index 00000000..e728c600
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/etc/modules
@@ -0,0 +1,68 @@
+8139cp
+8139too
+acenic
+adp8860_bl
+adp8870_bl
+atl1
+atl1c
+atl1e
+atl2
+atp
+b44
+bna
+bnx2
+bnx2x
+cnic
+cxgb
+cxgb3
+cxgb4
+cxgb4vf
+de2104x
+dl2k
+dmfe
+dnet
+e100
+e1000
+e1000e
+forcedeth
+hid-generic
+hp100
+igb
+igbvf
+ipg
+ixgb
+ixgbe
+ixgbevf
+jme
+ksz884x
+myri10ge
+nbd
+ne2k-pci
+parport
+pcnet32
+qla3xxx
+qlge
+r6040
+r8169
+s2io
+sc92031
+sfc
+sis190
+sis900
+skge
+sky2
+smsc9420
+squashfs
+sunhme
+tg3
+tlan
+tulip
+typhoon
+uli526x
+usbhid
+via-rhine
+via-velocity
+vmxnet3
+vxge
+xfs
+xircom_cb
diff --git a/core/rootfs/rootfs-stage31/data/inc/activate_sysconfig b/core/rootfs/rootfs-stage31/data/inc/activate_sysconfig
new file mode 100644
index 00000000..c9b74791
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/inc/activate_sysconfig
@@ -0,0 +1,98 @@
+#!/bin/ash
+
+echo "Configuring stage 3.2 ..."
+
+# first a few variables
+CONFIG="${FUTURE_ROOT}/opt/openslx/config"
+
+#########################################################################
+#
+# This function downloads the config containing environment variables
+#
+fetch_sysconfig() {
+ [ -e "$CONFIG" ] && grep -E '^#_RCONFIG_TAG$' "$CONFIG" > /dev/null \
+ && echo "Config already fetched." && return 0
+
+ download "${SLX_BASE_PATH}/config" "${CONFIG}-remote" || return 1
+
+ echo "# Config fetched from $URL" >> "$CONFIG"
+ echo "#_RCONFIG_TAG" >> "$CONFIG"
+ cat "${CONFIG}-remote" >> "$CONFIG"
+}
+#########################################################################
+#
+# This function downloads the config.tgz and unpacks it to $TARGET_PATH <-- no it doesn't!
+#
+fetch_config_files() {
+ [ -e "${CONFIG}.tgz" ] && echo "config.tgz already downloaded." && return 0
+
+ download "${SLX_BASE_PATH}/config.tgz" "${CONFIG}.tgz"
+}
+
+
+#########################################################################
+#
+# This function updates the downloaded config with the IP information
+# received from /inc/setup_network <-- plus 500 other things
+update_sysconfig() {
+ # sanity checks
+ [ ! -e "${CONFIG}" ] && { echo "Cannot update. '$CONFIG' does not exist."; return 1; }
+
+ # write IP and SLX_SERVER configuration to $CONFIG
+cat >> "$CONFIG" <<HEREEND
+# IP Config written in stage31
+SLX_PXE_CLIENT_IP='$CLIENTIP'
+SLX_PXE_SERVER_IP='$SERVERIP'
+SLX_PXE_GATEWAY='$GATEWAY'
+SLX_PXE_DNS='$DNS_SERVER'
+SLX_PXE_MAC='$BRIDGEMAC'
+HEREEND
+
+ [ ! -e "${CONFIG}.tgz" ] && { echo "Cannot update. '$CONFIG' does not exist."; return 1; }
+
+ # setup hardware clock
+ . "${CONFIG}"
+ if [ "x$SLX_BIOS_CLOCK" == "xlocal" ]; then
+ hwclock -s -l
+ elif [ "x$SLX_BIOS_CLOCK" == "xutc" ]; then
+ hwclock -s -u
+ fi
+
+ local TEMP_EXTRACT_DIR="/tmp/config.tgz.tmp"
+ # TODO perserve existing directories permissions (but overwrite the permissions of files!)
+ mkdir -p "${TEMP_EXTRACT_DIR}"
+ tar xf "${CONFIG}.tgz" -C "${TEMP_EXTRACT_DIR}" || { echo "Could not untar ${CONFIG}.tgz to ${TEMP_EXTRACT_DIR}"; return 1; }
+ chown -R 0:0 "${TEMP_EXTRACT_DIR}" 2>/dev/null
+ cd "${TEMP_EXTRACT_DIR}"
+ # first we look for local config.tgz files, which we merge with the common
+ # config.tgz files
+ local LOCAL_CONFIG_DIR="openslx-configs/${SLX_LOCAL_CONFIG}"
+ if [ -n "${SLX_LOCAL_CONFIG}" -a -d "${LOCAL_CONFIG_DIR}" ]; then
+ tarcopy "${LOCAL_CONFIG_DIR}" "${TEMP_EXTRACT_DIR}"
+ echo "Merged local configuration files for '${SLX_LOCAL_CONFIG}'"
+ fi
+ # purge openslx-configs/*
+ rm -rf -- "openslx-configs/"
+ # now just tarcopy them to future root
+ tarcopy "${TEMP_EXTRACT_DIR}" "${FUTURE_ROOT}"
+ # cleanup the downloaded stuff
+ cd /
+ rm -rf -- "${TEMP_EXTRACT_DIR}"
+ [ $DEBUG -eq 0 ] && rm -f -- "${CONFIG}.tgz"
+ # Display branding logo if splash screen is shown
+ [ "x${MUTED_OUTPUT}" = "x1" ] && [ -e "${FUTURE_ROOT}/etc/branding.ppm" ] && fbsplash -s "${FUTURE_ROOT}/etc/branding.ppm" &
+ return 0
+}
+
+
+#########################################################################
+#
+# MAIN PART
+#
+
+fetch_sysconfig || drop_shell "Could not download remote config"
+. "${CONFIG}-remote" || drop_shell "Could not source remote config"
+fetch_config_files || drop_shell "Could not download config.tgz"
+update_sysconfig || drop_shell "Could not update sysconfig"
+true
+
diff --git a/core/rootfs/rootfs-stage31/data/inc/drm.functions b/core/rootfs/rootfs-stage31/data/inc/drm.functions
new file mode 100644
index 00000000..c62c562b
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/inc/drm.functions
@@ -0,0 +1,80 @@
+
+# pass module name(s) relative path in /lib/modules with .ko extension, or special like @nvidia or @amd
+load_gfx () {
+ local MOD FILES OFFSET RETVAL
+ RETVAL=1 # default: failure
+ while [ $# -gt 0 ]; do
+ MOD=$(echo $1) # trim :)
+ shift
+ [ -z "$MOD" ] && continue
+ if [ "x${MOD}" != "x${MOD#@}" ]; then
+ # starts with '@' - special
+ OFFSET=$(( ${#MOD} + 2 ))
+ FILES=$( grep "^$MOD\s" "/drm.cfg" | cut -c ${OFFSET}- )
+ [ -z "$FILES" ] && drop_shell "Could not find entry for special $MOD"
+ if load_gfx $FILES; then
+ RETVAL=0
+ else
+ # loading special case failed, try fallback if found
+ MOD="${MOD}_fallback"
+ OFFSET=$(( ${#MOD} + 2 ))
+ FILES=$( grep "^$MOD\s" "/drm.cfg" | cut -c ${OFFSET}- )
+ [ -n "$FILES" ] && load_gfx $FILES && RETVAL=0
+ fi
+ else # regular module name or filename
+ if [ "x${MOD%.ko}" == "x${MOD}" ]; then
+ # regular module name
+ modprobe "$MOD" && RETVAL=0
+ else
+ # a .ko file
+ insmod "/lib/modules/$MOD" && RETVAL=0
+ fi
+ fi
+ done
+ return $RETVAL
+}
+
+setup_gfx () {
+ local KERN RETVAL CARD CARDS SUCCESS FILES DRM
+ # check if forced by KCL
+ if [ "x$GFX" == "xnvidia" ]; then
+ load_gfx @nvidia
+ return
+ fi
+ if [ "x$GFX" == "xamd" ]; then
+ load_gfx @amd
+ return
+ fi
+ # not forced - check which driver to load
+ CARDS=$(lspci | grep 'Class 0300' | awk '{print $4}')
+ if [ -e "/drm.cfg" ] && [ -n "$CARDS" ]; then
+ SUCCESS="yes"
+ for CARD in $CARDS; do
+ # look up exact pci id of this card
+ [ $DEBUG -ge 1 ] && echo Trying exact matching for drm drivers for $CARD
+ FILES=$(grep "^$CARD\s" "/drm.cfg" | cut -c 11-)
+ load_gfx $FILES && continue
+ # failed... try vendor id only
+ CARD=$(echo $CARD | cut -c 1-4)
+ [ $DEBUG -ge 1 ] && echo Trying vendor matching for drm drivers for $CARD
+ FILES=$(grep "^$CARD\s" "/drm.cfg" | cut -c 6-)
+ load_gfx $FILES && continue
+ # everything failed for this card
+ echo Unknown PCI vendor id: $CARD
+ SUCCESS="no"
+ done
+ [ "x$SUCCESS" == "xyes" ] && return 0
+ fi
+ # braindead fallback
+ echo "At least one gfx card has no known drm drivers.... will load them all :/"
+ KERN=$(uname -r)
+ RETVAL=1
+ [ -z "$KERN" ] && KERN=$(ls '/lib/modules' | grep '\.' | tail -n 1)
+ for DRM in $(find "/lib/modules/$KERN/kernel/drivers/gpu/drm" -name "*.ko"); do
+ DRM="$(basename "$DRM")"
+ DRM="${DRM%.ko}"
+ modprobe "$DRM" && RETVAL=0
+ done
+ return $RETVAL
+}
+
diff --git a/core/rootfs/rootfs-stage31/data/inc/functions b/core/rootfs/rootfs-stage31/data/inc/functions
new file mode 100644
index 00000000..248d0149
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/inc/functions
@@ -0,0 +1,84 @@
+#########################################################################
+#
+# COMMON HELPER FUNCTIONS
+#
+
+#########################################################################
+#
+# Function to drop a debug shell with an error message.
+#
+# Usage:
+# drop_shell "This is your error message."
+#
+drop_shell() {
+ if [ -n "$MUTED_OUTPUT" ]; then
+ exec 1>&4 2>&5
+ reset
+ fi
+ [ $# -gt 0 ] && echo $@
+ echo "CTRL + D will continue booting."
+ setsid sh -c 'exec sh </dev/tty1 >/dev/tty1 2>&1'
+}
+
+#########################################################################
+#
+# Helper function to download given FILE_URL from servers in 'slxsrv'
+# as given through the kernel command line. File will be saved under TARGET_PATH
+#
+# Usage:
+# download FILE_URL TARGET_PATH
+#
+# Example:
+# download "config" "/opt/openslx/config"
+#
+# Note:
+# FILE_URL can have subpath, e.g. "ubuntu-13.04-x64/config"
+#
+download() {
+ [ $# -ne 2 ] && echo "Error - 'download' requires 2 arguments, $# given." && return 1
+
+ if [ -z "$SLX_KCL_SERVERS" ]; then
+ . "/opt/openslx/config" || echo "Error - could not source '/opt/openslx/config'"
+ fi
+
+ local FILE_URL="$1"
+ local TARGET_PATH="$2"
+
+ # Shuffle server list
+ local SERVERS=$(for SERVER in $SLX_CONFIG_SERVERS $SLX_KCL_SERVERS; do echo "$RANDOM $SERVER"; done | sort -u | sed -r 's/^[0-9]+ //')
+
+ for TIMEOUT in 1 1 2 END; do
+ for SERVER in $SERVERS; do
+ rm -f -- "${TARGET_PATH}"
+ wget -T 5 -q -O "$TARGET_PATH" "http://${SERVER}/${FILE_URL}"
+ RET=$?
+ if [ "x$RET" != "x0" -o ! -e "$TARGET_PATH" ]; then
+ echo "Error - downloading 'http://$SERVER/$FILE_URL' via wget failed. Exit Code: $RET"
+ usleep 50000 # 50ms
+ else
+ echo "Successfully downloaded 'http://${SERVER}/$FILE_URL'."
+ return 0
+ fi
+ done
+ [ "$TIMEOUT" = "END" ] && break
+ echo "Trying again in $(($TIMEOUT * 250)) ms..."
+ usleep $(($TIMEOUT * 250000))
+ done
+ # Max retries reached, no success :-(
+ return 1
+}
+
+# Add benchmark event to var, including uptime as prefix
+bench_event() {
+ bench_result="${bench_result}$(cut -f 1 -d ' ' "/proc/uptime") $@
+"
+}
+
+# mini tarcopy <3
+# tarcopy <source_dir> <target_dir>
+tarcopy() {
+ [ -d "$1" -a -d "$2" ] || return 1
+ cd "$1"
+ tar -cp * | tar -xp -C "$2"
+ cd - &>/dev/null
+}
diff --git a/core/rootfs/rootfs-stage31/data/inc/network.functions b/core/rootfs/rootfs-stage31/data/inc/network.functions
new file mode 100644
index 00000000..641f4f55
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/inc/network.functions
@@ -0,0 +1,23 @@
+wait_for_iface() {
+ local DEVICE=$1
+ local TIMEOUT=10
+ echo -n "Waiting for interface $DEVICE: "
+ # Some systems don't have operstate. Seems to be hardware dependent
+ [ ! -e "/sys/class/net/${DEVICE}/operstate" ] && usleep 10000
+ if [ -e "/sys/class/net/${DEVICE}/operstate" ]; then
+ while true; do
+ # check linkstate
+ [ "x$(cat "/sys/class/net/${DEVICE}/operstate")" == "xup" ] && break
+ TIMEOUT=$(( $TIMEOUT - 1 )) # don't wait forever, the pcnet iface of vmware will never be "up" although it's working
+ [ "$TIMEOUT" -le 0 ] && break
+ # else
+ echo -n "."
+ usleep 500000
+ done
+ else
+ # we really don't have a operstate .. then just wait a sec and hope for the best.
+ sleep 1
+ fi
+ echo ".$(cat "/sys/class/net/${DEVICE}/operstate" 2>/dev/null)"
+}
+true
diff --git a/core/rootfs/rootfs-stage31/data/inc/ntp_sync b/core/rootfs/rootfs-stage31/data/inc/ntp_sync
new file mode 100755
index 00000000..940af366
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/inc/ntp_sync
@@ -0,0 +1,26 @@
+# Sync time via network
+
+func_sync_net_time() {
+ local SERVER
+ if [ -n "$SLX_NTP_SERVER" ]; then
+ for SERVER in $SLX_NTP_SERVER; do
+ if ntpdate -u -p 2 "$SERVER"; then
+ echo "Successfully queried $SERVER for time."
+ if [ "x$SLX_BIOS_CLOCK" = "xlocal" ]; then
+ usleep 100000
+ hwclock -l -w || echo "... but could not set BIOS clock to localtime"
+ elif [ "x$SLX_BIOS_CLOCK" = "xutc" ]; then
+ usleep 100000
+ hwclock -u -w || echo "... but could not set BIOS clock to UTC"
+ fi
+ break
+ fi
+ echo "Error querying $SERVER for current time."
+ done
+ fi
+}
+
+func_sync_net_time &
+
+true
+
diff --git a/core/rootfs/rootfs-stage31/data/inc/parse_kcl b/core/rootfs/rootfs-stage31/data/inc/parse_kcl
new file mode 100644
index 00000000..4a69ac25
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/inc/parse_kcl
@@ -0,0 +1,58 @@
+#!/bin/ash
+
+getip () {
+ echo "${IPINFO}" | awk -F ':' "{print \$$1}"
+}
+parse_ip () {
+ local IPINFO=$1
+ CLIENTIP="$(getip 1)"
+ SERVERIP="$(getip 2)"
+ GATEWAY="$(getip 3)"
+ SUBNET_MASK="$(getip 4)"
+ BROADCAST_ADDRESS="$(ipcalc -s -b "$CLIENTIP" "$SUBNET_MASK" | sed s/.*=//)"
+ [ -z "$BROADCAST_ADDRESS" ] && BROADCAST_ADDRESS="255.255.255.255"
+ # we might have an idea of the dns server via preboot
+ DNS_SERVER="$(getip 5)"
+}
+
+# read kernel command line
+DEBUG=0
+SPLASH=0
+read KCL < "/proc/cmdline"
+for opts in ${KCL}; do
+ case "${opts}" in
+ debug=*)
+ DEBUG=${opts#debug=}
+ DEBUG_SHELL=set
+ ;;
+ ip=*)
+ # process IP info
+ parse_ip ${opts#ip=} ;;
+ nfs=*) # TODO: Still working? Still needed? Also see related code in setup_stage32
+ NFS=${opts#nfs=}
+ NFSPATH=${NFS#*:}
+ NFSSERVER=${NFS%:/*}
+ ;;
+ BOOTIF=*)
+ MAC="$( echo "$opts" | cut -b 11- | tr '-' ':' | tr '[A-Z]' '[a-z]' )" ;; # make mac lowercase for udev (see setup_network)
+ slxsrv=*)
+ SLX_KCL_SERVERS=$( echo "${opts#slxsrv=}" | tr ',' " " ) ;;
+ slxbase=*)
+ SLX_BASE_PATH=${opts#slxbase=} ;;
+ splash)
+ SPLASH=1 ;;
+ nvidia)
+ GFX=nvidia ;;
+ ati|amd)
+ GFX=amd ;;
+ esac
+done
+
+# If slxsrv was not given on command line, just use the PXE server's address
+[ -z "$SLX_KCL_SERVERS" ] && [ -n "$SERVERIP" ] && SLX_KCL_SERVERS="$SERVERIP"
+# Now save to config file
+echo "SLX_KCL_SERVERS='$SLX_KCL_SERVERS'" >> "${FUTURE_ROOT}/opt/openslx/config"
+echo "SLX_BASE_PATH='$SLX_BASE_PATH'" >> "${FUTURE_ROOT}/opt/openslx/config"
+
+true
+
diff --git a/core/rootfs/rootfs-stage31/data/inc/setup_network b/core/rootfs/rootfs-stage31/data/inc/setup_network
new file mode 100644
index 00000000..13c52289
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/inc/setup_network
@@ -0,0 +1,84 @@
+#!/bin/ash
+
+echo "Setting up network..."
+
+echo "Main MAC address is '$MAC'"
+
+# setup network
+source /inc/network.functions
+
+# set up loopback networking
+echo "Setting up loopback"
+ip link set dev lo up 2>/dev/null
+ip addr add 127.0.0.1/8 dev lo 2>/dev/null
+
+echo "Setting up bridge"
+BRIDGE="br0"
+
+# Following was supposed to prevent scripts from getting confused by multiple interfaces with same MAC - does not work though
+## Flip mac address of original interface - this var is not local so init sees the changes too
+#MAC="$(echo "$MAC" | awk -F ':' '{printf $1 ":" $2 ":" $5 ":" $3 ":" $6 ":" $4}')"
+#ip link set addr "$MAC" "$SLAVE"
+
+mkdir -p "${FUTURE_ROOT}/etc/udev/rules.d"
+
+#IP_OUT=$(ip a | sed -r ':a;N;$!ba;s/: ([a-z0-9]+): /####\1####/g;s/ether ([a-f0-9:]+) /####\1####/g'| grep -E -o '####[^ ]+####' | sed 's/#//g' | grep -B 1 ':')
+IP_OUT=$(ip a | grep -B 1 "/ether" | sed -r '/^--$/d;$!N;s#^[0-9]+: ([a-z0-9\.:]+): .*?/ether ([0-9a-fA-Z:]+) .*$#\1==\2#')
+
+if ! echo "$IP_OUT" | grep -q -- "$MAC"; then
+ drop_shell "Boot interface not found in interface list. NIC driver missing?"
+fi
+
+for LINE in $IP_OUT; do
+ IFACE=$(echo "$LINE" | awk -F '==' '{printf $1}')
+ IFMAC=$(echo "$LINE" | awk -F '==' '{printf $2}' | tr '[A-Z]' '[a-z]') # udev requires mac addesses to be lowercase (a-f), see http://www.debianhelp.co.uk/udev.htm
+ echo "${IFACE} = ${IFMAC}"
+
+ if [ "x$IFMAC" == "x$MAC" ]; then
+ brctl addbr "$BRIDGE" || drop_shell "Could not create bridge $BRIDGE"
+ brctl stp "$BRIDGE" 0
+ brctl setfd "$BRIDGE" 0.000000000001
+ ip link set addr "$IFMAC" "$BRIDGE" || drop_shell "Could not set mac of $BRIDGE"
+ ip link set dev "$IFACE" up
+ wait_for_iface "$IFACE"
+ brctl addif "$BRIDGE" "$IFACE" || drop_shell "Could not add $IFACE to $BRIDGE"
+
+ # save our variables for retry on fail
+ echo "IFACE=$IFACE" > /run/network.conf
+
+ # analyze ip information from the kernel command line and put parts
+ # of it into several variables
+ if [ -n "$CLIENTIP" ] ; then
+ # set static ip address
+ ip addr add "$CLIENTIP/$(ipcalc -s -p "$CLIENTIP" "$SUBNET_MASK" | sed "s/.*=//")" broadcast "$BROADCAST_ADDRESS" dev "$BRIDGE"
+ ip link set dev "$BRIDGE" up
+ [ -n "$GATEWAY" ] && ip route add default via "$GATEWAY" dev "$BRIDGE"
+ else
+ NOIPYET="yes"
+ fi
+ # Ignore this device later on when systemd handles network interfaces (see hacked 99-systemd.rules in systemd data dir)
+ echo "SUBSYSTEM==\"net\", ACTION==\"add\", KERNEL==\"eth*\", ATTR{address}==\"$IFMAC\", TAG+=\"openslxignore\"" >> "${FUTURE_ROOT}/etc/udev/rules.d/01-ignore-boot-interface.rules"
+ fi
+ # youdev
+ echo "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", ATTR{address}==\"$IFMAC\", ATTR{dev_id}==\"0x0\", ATTR{type}==\"1\", KERNEL==\"eth*\", NAME=\"$IFACE\"" >> "${FUTURE_ROOT}/etc/udev/rules.d/70-net-boot-nic-name.rules"
+ # continue...
+ IFACE=""
+done
+
+wait_for_iface "$BRIDGE"
+
+# udhcpc
+PARAM=
+if [ -n "$CLIENTIP" ]; then
+ PARAM="-r $CLIENTIP"
+fi
+echo -n "$CLIENTIP" > "/run/firstip"
+echo -n "$GATEWAY" > "/run/firstgw"
+
+# save our variables for retry on fail ff.
+echo "CLIENTIP=$CLIENTIP" >> /run/network.conf
+echo "GATEWAY=$GATEWAY" >> /run/network.conf
+echo "BRIDGE=$BRIDGE" >> /run/network.conf
+
+udhcpc $PARAM -O domain -O nissrv -O nisdomain -O wpad -O search -t 5 -T 2 -s "/inc/udhcpc-trigger" -f -n -q -i "$BRIDGE"
+# udhcpc return value will be return value of this script
diff --git a/core/rootfs/rootfs-stage31/data/inc/setup_network_retry b/core/rootfs/rootfs-stage31/data/inc/setup_network_retry
new file mode 100644
index 00000000..0578d9b2
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/inc/setup_network_retry
@@ -0,0 +1,33 @@
+#!/bin/ash
+
+source /inc/network.functions
+source /run/network.conf
+
+for i in 1 2 3 4 5 6 7 8; do
+ echo "<$i> Try to fix broken network"
+ echo -n "Take interface $IFACE down .. "
+
+ ip link set dev $IFACE down
+ usleep 1000
+
+ echo "and up again.."
+ ip link set dev $IFACE up
+ usleep 1000
+
+ wait_for_iface "$IFACE"
+
+ udhcpc $PARAM -O domain -O nissrv -O nisdomain -O wpad -O search -t 5 -T 2 -s "/inc/udhcpc-trigger" -f -n -q -i "$BRIDGE"
+
+ if [ $? -eq 0 ]; then
+ echo "Finally fixed IP config. Continue boot."
+ RET=0
+ break
+ else
+ RET=1
+ fi
+done
+
+[ $RET -gt 0 ] && drop_shell "Something is really broken.. Please check your network cable and reset your computer."
+
+# create correct return value
+[ $RET -eq 0 ]
diff --git a/core/rootfs/rootfs-stage31/data/inc/setup_stage32 b/core/rootfs/rootfs-stage31/data/inc/setup_stage32
new file mode 100644
index 00000000..5ec5a69d
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/inc/setup_stage32
@@ -0,0 +1,68 @@
+#!/bin/ash
+#
+# This script sets up the stage 3.2.
+# - downloads/mounts stage32.sqfs
+# - merge it with current rootfs through aufs
+# - will not download, if the "nfs=" is used in the
+# kernel command line
+#
+#########################################################################
+#
+# first check if an NFS-share was given per command line
+#
+if [ -n "$NFS" ]; then
+ echo "Mounting stage 3.2 as NFS..."
+ busybox mount -n -t nfs -o ro,async,nolock ${NFSSERVER}:${NFSPATH} /rorootfs \
+ || drop_shell "Problem mounting NFS-Directory from ${NFSSERVER}:${NFSPATH}." \
+ || return 1
+ return 0
+fi
+
+#########################################################################
+#
+# MAIN PART
+#
+
+echo "Setting up stage 3.2 ..."
+
+STAGE32_TARGET_PATH="/stage32.sqfs"
+STAGE32_MOUNT_POINT="/rorootfs"
+
+# try to download it
+download "${SLX_BASE_PATH}/stage32.sqfs" "$STAGE32_TARGET_PATH" || drop_shell "Could not download stage32!"
+
+# "Delete" addon hook-script in aufs view
+touch "${FUTURE_ROOT}/.wh.addon-init"
+
+# try to mount it at STAGE32_MOUNT_POINT
+echo "Mounting stage 3.2 as SquashFS..."
+busybox mount -n -t squashfs "$STAGE32_TARGET_PATH" "$STAGE32_MOUNT_POINT" || drop_shell "Problem mounting Squashfs."
+
+echo "Building aufs ..."
+busybox mount -n -t aufs -o "br:${FUTURE_ROOT}:${STAGE32_MOUNT_POINT}=ro" none /mnt || drop_shell "Problem building aufs."
+mkdir -p /mnt/opt/openslx/uniontmp /mnt/tmp
+#busybox mount -n --move "$FUTURE_ROOT" /mnt/opt/openslx/uniontmp || drop_shell "Problem moving uniontmp." # Move needed?
+FUTURE_ROOT="/mnt"
+
+# Move network stuff
+cp /etc/hostname /etc/hosts "${FUTURE_ROOT}/etc/"
+cp /etc/resolv.conf "${FUTURE_ROOT}/opt/openslx/"
+[ -s "/run/config" ] && cat "/run/config" >> "${FUTURE_ROOT}/opt/openslx/config"
+
+# if booting with splash, suppress kernel output in stage32
+if [ $SPLASH -eq 1 ]; then
+ if grep -q -E "^ *kernel.printk" "${FUTURE_ROOT}/usr/lib/sysctl.d/50-default.conf"; then
+ sed -i 's/^ *kernel\.printk.*/kernel\.printk = 1 1 0 1/g' "${FUTURE_ROOT}/usr/lib/sysctl.d/50-default.conf"
+ else
+ echo "kernel.printk = 1 1 0 1" >> "${FUTURE_ROOT}/usr/lib/sysctl.d/50-default.conf"
+ fi
+fi
+
+# Kinda specific for virtualization environment: Autologin and run VM for benchmarks
+if [ -n "$SLX_BENCHMARK_VM" ]; then
+ # Enable KDM autologin for demo user
+ sed -i 's/^AutoLoginUser=.*//;s/^AutoLoginEnable=.*/AutoLoginEnable=true\nAutoLoginUser=demo/' "${FUTURE_ROOT}/etc/kde4/kdm/kdmrc"
+ # Running the VM automatically has to be taken care of by run-virt and vmchooser. SLX_BENCHMARK_VM should contain
+ # a numeric value for the index in vmchooser
+fi
+
diff --git a/core/rootfs/rootfs-stage31/data/inc/setup_stage4 b/core/rootfs/rootfs-stage31/data/inc/setup_stage4
new file mode 100644
index 00000000..585627c2
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/inc/setup_stage4
@@ -0,0 +1,69 @@
+#!/bin/ash
+
+[ -z "${SLX_STAGE4}" ] && { echo "SLX_STAGE4 is not set in /opt/openslx/config." && exit 1; }
+
+MOUNTPOINT="/rorootfs/"
+mkdir -p "$MOUNTPOINT"
+
+
+# first load module
+insmod /lib/modules/dnbd3/dnbd3.ko
+
+# dnbd3 it is
+if [ -z "${SLX_DNBD3_SERVERS}${SLX_DNBD3_PRIO_SERVERS}" ]; then
+ slxlog --echo "mount-stage4" "dnbd3 stage4 configured, but SLX_DNBD3(_PRIO)_SERVERS empty or not set in /opt/openslx/config."
+ exit 1
+fi
+# Determine revision
+if [ -z "$SLX_STAGE4_RID" ] || echo "$SLX_STAGE4_RID" | grep -v -q -E "^[0-9]+$"; then
+ SLX_STAGE4_RID="0"
+fi
+# Randomize list
+SERVERS=$(for SERVER in $SLX_DNBD3_SERVERS; do echo "$RANDOM $SERVER"; done | sort -u | sed -r 's/^[0-9]+ //')
+IMAGE=$(echo $SLX_STAGE4 | awk '{printf $2}')
+[ -e /var/run/dnbd3.socket ] || sleep 2 # Ugly, service should only start when dnbd3 daemon is up and running
+RET=1337
+for SRV in $SLX_DNBD3_PRIO_SERVERS $SERVERS; do
+ echo "Requesting $IMAGE from $SRV"
+ dnbd3=$(/opt/openslx/bin/dnbd3-client -h "$SRV" -i "$IMAGE" -r "$SLX_STAGE4_RID" -d /dev/dnbd0)
+ RET=$?
+ [ "$RET" -eq "0" ] && break
+ echo "... didn't work ($RET)"
+ sleep 1
+done
+if [ "$RET" -ne "0" ]; then
+ drop_shell "Omg"
+ slxlog --echo "mount-stage4" "Could not get stage4 via dnbd3 ($IMAGE : $SLX_STAGE4_RID) ($SLX_DNBD3_PRIO_SERVERS / $SERVERS)"
+ exit $RET
+fi
+echo "Mounting /dev/dnbd0 to $MOUNTPOINT"
+if ! busybox mount -t squashfs -o ro /dev/dnbd0 "$MOUNTPOINT"; then
+ slxlog --echo "mount-stage4" "Could not mount stage4 from '$dnbd3' to '$MOUNTPOINT' ($SRV, $IMAGE)"
+ exit 1
+fi
+
+busybox mount -n -t aufs -o "br:${FUTURE_ROOT}:${MOUNTPOINT}=ro" none /mnt || drop_shell "Problem building aufs."
+mkdir -p /mnt/opt/openslx/uniontmp /mnt/tmp
+FUTURE_ROOT="/mnt"
+
+cp /etc/hostname /etc/hosts "${FUTURE_ROOT}/etc/"
+cp /etc/resolv.conf "${FUTURE_ROOT}/opt/openslx/"
+[ -s "/run/config" ] && cat "/run/config" >> "${FUTURE_ROOT}/opt/openslx/config"
+
+# if booting with splash, suppress kernel output in stage32
+if [ $SPLASH -eq 1 ]; then
+ if grep -q -E "^ *kernel.printk" "${FUTURE_ROOT}/usr/lib/sysctl.d/50-default.conf"; then
+ sed -i 's/^ *kernel\.printk.*/kernel\.printk = 1 1 0 1/g' "${FUTURE_ROOT}/usr/lib/sysctl.d/50-default.conf"
+ else
+ echo "kernel.printk = 1 1 0 1" >> "${FUTURE_ROOT}/usr/lib/sysctl.d/50-default.conf"
+ fi
+fi
+
+# Kinda specific for virtualization environment: Autologin and run VM for benchmarks
+if [ -n "$SLX_BENCHMARK_VM" ]; then
+ # Enable KDM autologin for demo user
+ sed -i 's/^AutoLoginUser=.*//;s/^AutoLoginEnable=.*/AutoLoginEnable=true\nAutoLoginUser=demo/' "${FUTURE_ROOT}/etc/kde4/kdm/kdmrc"
+ # Running the VM automatically has to be taken care of by run-virt and vmchooser. SLX_BENCHMARK_VM should contain
+ # a numeric value for the index in vmchooser
+fi
+
diff --git a/core/rootfs/rootfs-stage31/data/inc/udhcpc-trigger b/core/rootfs/rootfs-stage31/data/inc/udhcpc-trigger
new file mode 100755
index 00000000..02987f21
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/inc/udhcpc-trigger
@@ -0,0 +1,93 @@
+#!/bin/ash
+
+exec >> /run/stdout
+exec 2>> /run/stderr
+set -x
+
+if [ "x$1" != "xbound" -a "x$1" != "xrenew" ] || [ "x$interface" != "xbr0" ] || [ -z "$ip" ]; then
+ exit 0
+fi
+
+# If we already got an IP from KCL, see if it differs, and remove first if so
+# We just try to prevent everything from breaking if the DHCP server doesn't
+# objey the renew request by the client and hands out a new address
+if [ -s "/run/firstip" ]; then
+ #...some address is already configured...
+ OLD=$(cat "/run/firstip")
+ if [ "x${OLD}" != "x${ip}" ]; then
+ #...it's a different one, reconfigure...
+ echo "..reconfiguring ${OLD} to ${ip}.."
+ # remove default route and let it be added again below, as it might get lost when changing the primary address on the interface
+ ip route del default 2>/dev/null
+ rm -f -- "/run/firstgw"
+ ip addr del "${OLD}" dev "${interface}" 2>/dev/null
+ ip addr add "${ip}/$(ipcalc -s -p "${ip}" "${subnet}" | sed s/.*=//)" dev "${interface}"
+ fi
+else
+ #...no address configured yet, just add...
+ echo "..adding ${ip}.."
+ ip addr add "${ip}/$(ipcalc -s -p "${ip}" "${subnet}" | sed s/.*=//)" dev "${interface}"
+fi
+echo -n "$ip" > "/run/firstip"
+
+# Same procedure for default gateway
+if [ -n "${router}" ]; then
+ if [ -s "/run/firstgw" ]; then
+ OLD=$(cat "/run/firstgw")
+ if [ "x${OLD}" != "x${router}" ]; then
+ echo "..reconfiguring default gw from ${OLD} to ${router}.."
+ ip route del default 2>/dev/null
+ ip route add default via "$router"
+ fi
+ else
+ ip route add default via "$router"
+ fi
+ echo -n "$router" > "/run/firstgw"
+fi
+
+rm -f -- "/etc/resolv.conf"
+
+# DNS/domain?
+if [ -n "$dns" ]; then
+ echo "..got DNS.."
+ echo "# From DHCP in stage 3.1" >> "/run/config"
+ echo "SLX_DNS='$dns'" >> "/run/config"
+fi
+for serv in $dns; do
+ echo "nameserver $serv" >> "/etc/resolv.conf"
+done
+if [ -z "$domain" ]; then
+ # try to get domain via reverse lookup if empty
+ echo "..trying to get domain via DNS, as DHCP didn't supply one.."
+ fqdn=$(timeout -t 3 nslookup "$ip" | grep -E "^Address +[0-9]+: +$ip " | head -n 1 | awk '{print $4}')
+ domain="${fqdn#*.}"
+fi
+if [ -n "$domain" ]; then
+ echo "domain $domain" >> "/etc/resolv.conf"
+fi
+if [ -n "$search" ]; then
+ echo "search $search" >> "/etc/resolv.conf"
+elif [ -n "$domain" ]; then
+ echo "search $domain" >> "/etc/resolv.conf"
+fi
+
+
+# Hostname
+if [ -z "$hostname" ]; then
+ # as with domain, if there's no hostname, try to get via DNS
+ echo "..trying to get hostname via DNS, as DHCP didn't supply one.."
+ [ -z "$fqdn" ] && fqdn=$(timeout -t 3 nslookup "$ip" | grep -E "^Address +[0-9]+: +$ip " | head -n 1 | awk '{print $4}')
+ hostname="${fqdn%%.*}"
+elif [ -n "$domain" ]; then
+ fqdn="${hostname}.${domain%% *}" # in case domain is a list
+fi
+if [ -n "$hostname" ]; then
+ [ -z "$fqdn" ] && fqdn="$hostname"
+ echo "..setting hostname $hostname (fqdn: $fqdn).."
+ echo "$hostname" > "/proc/sys/kernel/hostname"
+ echo "$hostname" > "/etc/hostname"
+ echo "127.0.0.1 localhost" > "/etc/hosts"
+ echo "127.0.1.1 $fqdn $hostname" >> "/etc/hosts"
+ echo "SLX_HOSTNAME='$hostname'" >> "/run/config"
+fi
+
diff --git a/core/rootfs/rootfs-stage31/data/init b/core/rootfs/rootfs-stage31/data/init
new file mode 100755
index 00000000..5e6d1caf
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/data/init
@@ -0,0 +1,166 @@
+#!/bin/ash
+# Copyright (c) 2013, 2014 - bwLehrpool Projekt
+# Copyright (c) 2012 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# First script for initial ramfs for OpenSLX linux stateless clients
+#############################################################################
+
+# set PATH correctly
+export PATH=/bin:/sbin:/usr/bin:/usr/sbin
+
+# import common functions
+. "/inc/functions"
+
+# mount the important standard directories
+[ ! -f /proc/cpuinfo ] && busybox mount -n -t proc proc /proc
+bench_event "KERNEL" "Kernel initialized"
+[ ! -d /sys/class ] && busybox mount -n -t sysfs sysfs /sys
+
+# NOTE: busybox mount is only available through the busybox binary,
+# the link had to be dropped, to prevent bugs in the stage32.
+busybox mount -n -t devtmpfs -o 'rw,relatime,nosuid,noexec,mode=0755' initramfsdevs /dev
+busybox mount -n -t tmpfs -o 'mode=755' run "/run"
+
+# preparations for mounting stage3.2
+FUTURE_ROOT="/dev/shm/uniontmp"
+mkdir -p "$FUTURE_ROOT" /rorootfs
+busybox mount -n -t tmpfs -o 'mode=755' none "$FUTURE_ROOT"
+mkdir -p "$FUTURE_ROOT/opt/openslx"
+
+
+# Get all variables we care about from the KCL
+. /inc/parse_kcl
+
+# NOTE: this is only relevant when using the distro's kernel
+# load kernel modules as given in /etc/modules
+modprobe -a -b $(cat /etc/modules) 2>/dev/null
+
+# Load drm gfx drivers, if successful, check if splash screen should be shown, and do so
+. "/inc/drm.functions"
+if [ "$SPLASH" -eq 1 ]; then
+ if setup_gfx; then
+ echo "1 1 0 1" > /proc/sys/kernel/printk
+ exec 4>&1 5>&2 > /dev/null 2>&1
+ MUTED_OUTPUT=1
+ clear
+ echo -e "\033[?25l" >&4
+ if [ -e "/etc/splash.ppm.gz" ]; then
+ fbsplash -x -b -s "/etc/splash.ppm.gz" &
+ elif [ -e "/etc/splash.ppm" ]; then
+ fbsplash -x -b -s "/etc/splash.ppm" &
+ else
+ echo "Splash screen requested, but not found in initramfs..." >&4
+ fi
+ fi
+else
+ setup_gfx
+fi
+
+# suppress kernel output if DEBUG is set and no splash screen is requested
+if [ $SPLASH -eq 0 ]; then
+ [ $DEBUG -ge 1 ] && echo "4 4 1 7" > /proc/sys/kernel/printk || echo "1 1 0 1" >/proc/sys/kernel/printk
+fi
+
+[ $DEBUG -ge 4 ] && drop_shell "Requested Debug Shell: before network."
+
+. "/inc/setup_network" || . "/inc/setup_network_retry" || drop_shell "Error setting up network"
+bench_event "NETWORK" "Network up and running"
+
+[ $DEBUG -ge 3 ] && drop_shell "Requested Debug Shell: after network/before configuring."
+
+. "/inc/activate_sysconfig" || drop_shell "Could not source /inc/activate_sysconfig"
+bench_event "CONFIG" "Downloaded config"
+# From here on, we have all the vars from /opt/openslx/config
+
+# Sync time via NTP
+. "/inc/ntp_sync"
+
+[ $DEBUG -ge 2 ] && drop_shell "Requested Debug Shell: after configuration/before stage32."
+
+. "/inc/setup_stage32" || drop_shell "Problem setting up stage3.2"
+bench_event "STAGE32" "Downloaded stage 3.2"
+
+# copy files needed for stage3.2 to FUTURE_ROOT
+echo "Copying busybox etc. to stage32..."
+tar -cp /bin/* /sbin/* | tar -xp -C "${FUTURE_ROOT}/opt/openslx/"
+mkdir -p "${FUTURE_ROOT}/opt/openslx/inc"
+cp -a "/inc/functions" "${FUTURE_ROOT}/opt/openslx/inc/"
+
+# set the SLX_ROOT_PASS if given in config
+if [ ! -z "$SLX_ROOT_PASS" ]; then
+ sed -i "s#^root:[^:]*:#root:$SLX_ROOT_PASS:#" "${FUTURE_ROOT}/etc/shadow"
+fi
+# set the SLX_DEMO_PASS if given in config
+if [ ! -z "$SLX_DEMO_PASS" ]; then
+ sed -i "s#^demo:[^:]*:#demo:$SLX_DEMO_PASS:#" "${FUTURE_ROOT}/etc/shadow"
+fi
+
+# one last debug shell if activated
+[ $DEBUG -ge 1 ] && drop_shell "Requested Debug Shell: before switch_root."
+
+# Activate debug shell after switchroot?
+[ -n "$DEBUG_SHELL" ] && ln -s "../debug-shell.service" "${FUTURE_ROOT}/usr/lib/systemd/system/sysinit.target.wants/debug-shell.service"
+
+# need /proc for this ;)
+bench_event "PRESWITCH" "Switching to stage 3.2"
+
+# unmount filesystems
+for mnt in proc sys run ; do
+ busybox umount -f -l "/$mnt" 2>/dev/null
+done
+
+# HACK HACK: Klausurmodus
+# Putting this here as we're hopefully moving to the all new dracut solution soon
+# so there's no reason to make it pretty now
+if [ -n "$SLX_EXAM" ]; then
+ # Visual: Make kdm all orange
+ sed -i 's/#e3e4e9/#f9a72b/g' "${FUTURE_ROOT}/usr/share/desktop/themes/kdm/bwlehrpool/theme.xml"
+ # Set autologindelay to 0 to directly boot
+ sed -i 's/^AutoLoginDelay=.*/AutoLoginDelay=0/g' "${FUTURE_ROOT}/etc/kde4/kdm/kdmrc"
+ # Visual: Move splash screen to upper left corner
+ if [ -e "/etc/splash.ppm.gz" ]; then
+ fbsplash -b -s "/etc/splash.ppm.gz" &
+ elif [ -e "/etc/splash.ppm" ]; then
+ fbsplash -b -s "/etc/splash.ppm" &
+ fi
+ # Visual: ssh banner
+ echo "+ - - - - KLAUSURMODUS AKTIV - - - - +" >> "${FUTURE_ROOT}/etc/issue.net"
+ echo "++++++++++++++++++++++++++++++++++++++" >> "${FUTURE_ROOT}/etc/issue.net"
+ # Disable ctrl-alt-delete
+ rm -- "${FUTURE_ROOT}/usr/lib/systemd/system/ctrl-alt-del.target"
+ # No idleaction
+ rm -- "${FUTURE_ROOT}/etc/cron.d/openslx-idleaction"
+ # Ignore everything but power button
+ cat > "${FUTURE_ROOT}/etc/systemd/logind.conf" <<EOF
+[Login]
+NAutoVTs=0
+ReserveVT=0
+KillUserProcesses=no
+HandlePowerKey=poweroff
+HandleSuspendKey=ignore
+HandleHibernateKey=ignore
+HandleLidSwitch=ignore
+IdleAction=ignore
+EOF
+ # Link exam.service in sysinit.target
+ ln -s "../exam.service" "${FUTURE_ROOT}/etc/systemd/system/sysinit.target.wants/exam.service"
+fi
+
+echo "Switching root...."
+echo "$bench_result" > "${FUTURE_ROOT}/opt/openslx/.benchmark"
+# Prepare environment (HOME is needed as a hack for nss_ldap with ssl and no caching)
+unset BOOT_IMAGE initrd KCL ip slxbase slxsrv IPINFO vga ip MAC BOOTIF DEBUG OLDPWD MUTED_OUTPUT GFX
+export HOME=/
+export init="/usr/lib/systemd/systemd"
+export recovery=
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+exec /sbin/switch_root -c /dev/console /mnt /usr/lib/systemd/systemd
+
diff --git a/core/rootfs/rootfs-stage31/module.build b/core/rootfs/rootfs-stage31/module.build
new file mode 100644
index 00000000..cda5788a
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/module.build
@@ -0,0 +1,74 @@
+#!/bin/bash
+fetch_source() {
+ :
+}
+
+build() {
+ local COPYLIST BIN_LOCATION DRM_MODULES FILE BIN MODNAME PCI_FILE ALIAS VENDOR DEVICE LIB
+ COPYLIST="list_binaries_and_files"
+ [ -e "$COPYLIST" ] && rm -f "$COPYLIST"
+ for BIN in $REQUIRED_BINARIES; do
+ BIN_LOCATION=$(which "$BIN")
+ [ -z "$BIN_LOCATION" ] && perror "Cannot find $BIN"
+ get_link_chain "$BIN_LOCATION" >> "$COPYLIST"
+ done
+
+ mkdir -p "$MODULE_BUILD_DIR/lib"
+ find /lib /lib64 /usr/lib /usr/lib64 \( -name "libnss_dns*" -o -name "libresolv*" -o -name "libnss_files*" \) >> "$COPYLIST"
+
+ tarcopy "$(cat "$COPYLIST" | sort -u)" "$MODULE_BUILD_DIR"
+
+ # generate drm module loading database
+ pinfo "Generating PCI ID database for DRM drivers"
+ DRM_MODULES="$KERNEL_BASE_DIR/lib/modules/$TARGET_KERNEL_LONG/kernel/drivers/gpu/drm"
+ PCI_FILE="$MODULE_BUILD_DIR/drm.cfg"
+ [ -d "$DRM_MODULES" ] || perror "DRM dir not found at $DRM_MODULES"
+ cp "$MODULE_DIR/templates/drm.cfg" "$PCI_FILE" || perror "Could not copy drm.cfg from templates dir"
+ echo "# -- generated from kernel $TARGET_KERNEL_LONG modules:" >> "$PCI_FILE"
+ for FILE in $(find "$DRM_MODULES" -name "*.ko"); do
+ MODNAME=$(basename "$FILE")
+ MODNAME=${MODNAME%.ko}
+ [ -z "$MODNAME" ] && perror "$FILE equals empty modname"
+ echo "# $MODNAME" >> "$PCI_FILE"
+ for ALIAS in $(modinfo "$FILE" | grep '^alias:' | grep -o 'pci:v.*' | tr '[A-F]' '[a-f]'); do
+ VENDOR=$(echo $ALIAS | cut -c 10-13)
+ if [ "x$(echo $ALIAS | cut -c 15)" == "x*" ]; then
+ # device wildcard
+ grep -q -i "^${VENDOR}\s" "$PCI_FILE" && continue
+ echo "${VENDOR} $MODNAME" >> "$PCI_FILE"
+ else
+ # specific device
+ DEVICE=$(echo $ALIAS | cut -c 19-22)
+ grep -q -i "^${VENDOR}:${DEVICE}\s" "$PCI_FILE" && continue
+ echo "${VENDOR}:${DEVICE} $MODNAME" >> "$PCI_FILE"
+ fi
+ done
+ done
+}
+
+post_copy() {
+ pinfo "Generating rootfs for Stage 3.1 ..."
+ generate_rootfs
+
+ # copy kernel, modules and firmware
+ copy_kernel_modules
+ copy_firmware
+ copy_kernel
+}
+
+#
+# helper functions to generate the base rootfs
+#
+generate_rootfs() {
+ # create basic directory structure
+ mkdir -p "${TARGET_BUILD_DIR}"/{bin,dev,proc,run,etc,mnt,sys} \
+ || perror "Cannot create basic directory structure in '${TARGET_BUILD_DIR}'"
+
+ # copy device files from running system
+ cp -a /dev/{console,kmsg,mem,null,tty,tty0,tty1,tty9,urandom,zero} \
+ "${TARGET_BUILD_DIR}"/dev || perror "Cannot copy devices from running system"
+
+ # copy libc and ld-linux
+ tarcopy "$(list_basic_libs)" "${TARGET_BUILD_DIR}"
+}
+
diff --git a/core/rootfs/rootfs-stage31/module.conf b/core/rootfs/rootfs-stage31/module.conf
new file mode 100644
index 00000000..d4944184
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/module.conf
@@ -0,0 +1,74 @@
+REQUIRED_BINARIES="
+ ntpdate
+"
+REQUIRED_MODULES="
+ busybox
+ kernel
+"
+REQUIRED_KERNEL_MODULES="
+ kernel/drivers/net/ethernet/*.ko
+ kernel/drivers/net/ethernet/*/*.ko
+ kernel/drivers/net/ethernet/*/*/*.ko
+ kernel/drivers/video/sis/sisfb.ko
+ kernel/drivers/video/via/viafb.ko
+ kernel/drivers/acpi/video.ko
+ kernel/drivers/ssb/ssb.ko
+ kernel/drivers/acpi/button.ko
+ kernel/drivers/gpu/drm/drm*.ko
+ kernel/drivers/gpu/drm/*/*.ko
+ kernel/drivers/hid/hid-generic.ko
+ kernel/drivers/i2c/algos/i2c-algo-bit.ko
+ kernel/drivers/i2c/i2c-core.ko
+ kernel/drivers/usb/usb-common.ko
+ kernel/drivers/usb/core/usbcore.ko
+ kernel/drivers/net/netconsole.ko
+ kernel/drivers/hid/hid.ko
+ kernel/drivers/hid/hid-cherry.ko
+ kernel/drivers/hid/usbhid/usbhid.ko
+ kernel/drivers/platform/x86/wmi.ko
+ kernel/drivers/platform/x86/mxm-wmi.ko
+ kernel/fs/configfs/configfs.ko
+ kernel/fs/nfs_common/nfs_acl.ko
+ kernel/fs/nfs/nfs.ko
+ kernel/fs/fscache/fscache.ko
+ kernel/fs/lockd/lockd.ko
+ kernel/fs/squashfs/squashfs.ko
+ kernel/fs/xfs/xfs.ko
+ kernel/net/sunrpc/sunrpc.ko
+ kernel/net/sunrpc/auth_gss/auth_rpcgss.ko
+ kernel/net/802/stp.ko
+ kernel/net/bridge/bridge.ko
+ kernel/ubuntu/aufs/aufs.ko
+ kernel/fs/aufs/aufs.ko
+ kernel/drivers/block/nbd.ko
+ kernel/drivers/parport/parport.ko
+ kernel/drivers/video/backlight/adp8860_bl.ko
+ kernel/drivers/video/backlight/adp8870_bl.ko
+ kernel/fs/xfs/xfs.ko
+"
+REQUIRED_FIRMWARE="
+ 3com/
+ e100/
+ matrox/
+ r128/
+ radeon/
+ RTL8192E/
+ RTL8192SE/
+ rtl_nic/
+ tigon/
+ i915/
+ intel/
+"
+REQUIRED_LIBRARIES="
+ libnss_files
+ libnss_dns
+ libresolv
+"
+REQUIRED_SYSTEM_FILES="
+ /etc/protocols
+ /etc/services
+ /etc/localtime
+"
+REQUIRED_FILES="
+ /drm.cfg
+"
diff --git a/core/rootfs/rootfs-stage31/module.conf.centos b/core/rootfs/rootfs-stage31/module.conf.centos
new file mode 100644
index 00000000..35c9927b
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/module.conf.centos
@@ -0,0 +1,3 @@
+REQUIRED_INSTALLED_PACKAGES="
+ ntpdate
+"
diff --git a/core/rootfs/rootfs-stage31/module.conf.debian b/core/rootfs/rootfs-stage31/module.conf.debian
new file mode 100644
index 00000000..35c9927b
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/module.conf.debian
@@ -0,0 +1,3 @@
+REQUIRED_INSTALLED_PACKAGES="
+ ntpdate
+"
diff --git a/core/rootfs/rootfs-stage31/module.conf.fedora b/core/rootfs/rootfs-stage31/module.conf.fedora
new file mode 100644
index 00000000..35c9927b
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/module.conf.fedora
@@ -0,0 +1,3 @@
+REQUIRED_INSTALLED_PACKAGES="
+ ntpdate
+"
diff --git a/core/rootfs/rootfs-stage31/module.conf.ubuntu b/core/rootfs/rootfs-stage31/module.conf.ubuntu
new file mode 100644
index 00000000..35c9927b
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/module.conf.ubuntu
@@ -0,0 +1,3 @@
+REQUIRED_INSTALLED_PACKAGES="
+ ntpdate
+"
diff --git a/core/rootfs/rootfs-stage31/templates/drm.cfg b/core/rootfs/rootfs-stage31/templates/drm.cfg
new file mode 100644
index 00000000..bbfa3bc0
--- /dev/null
+++ b/core/rootfs/rootfs-stage31/templates/drm.cfg
@@ -0,0 +1,19 @@
+## nvidia
+# 8800 GTS
+10de:0193 @nvidia
+# ION
+10de:087d @nvidia
+##
+# 10de-11c0: nvidia Geforce GTX 660 (OG)
+# 10de-0fc2: nvidia GeForce GT 630 (OG)
+# 10de-0dd8: nvidia Quadro 2000
+##
+10de:11c0 @nvidia
+10de:0fc2 @nvidia
+10de:0dd8 @nvidia
+## intel
+# Dell GX 620
+8086:2772 i915
+# aliases
+@nvidia nvidia/nvidia.ko nvidia/nvidia-uvm.ko nvidia/nvidia-modeset.ko
+@nvidia_fallback nouveau
diff --git a/core/rootfs/rootfs-stage32/TODO b/core/rootfs/rootfs-stage32/TODO
new file mode 100644
index 00000000..046b40d2
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/TODO
@@ -0,0 +1,4 @@
+libmdns needed?
+/etc/modprobe.d/blacklist.conf needed?
+
+Support for rpc.statd and rpcbind for OpenSuSE
diff --git a/core/rootfs/rootfs-stage32/data/bin/ash b/core/rootfs/rootfs-stage32/data/bin/ash
new file mode 120000
index 00000000..8f88d64e
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/bin/ash
@@ -0,0 +1 @@
+/opt/openslx/bin/busybox \ No newline at end of file
diff --git a/core/rootfs/rootfs-stage32/data/bin/sh b/core/rootfs/rootfs-stage32/data/bin/sh
new file mode 120000
index 00000000..5d4150d0
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/bin/sh
@@ -0,0 +1 @@
+/bin/bash \ No newline at end of file
diff --git a/core/rootfs/rootfs-stage32/data/etc/conf.d/nfs-common.conf b/core/rootfs/rootfs-stage32/data/etc/conf.d/nfs-common.conf
new file mode 100644
index 00000000..c12705b9
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/conf.d/nfs-common.conf
@@ -0,0 +1,7 @@
+# Common configuration file for rpc-services.
+
+# Options for rpcbind
+BIND_OPTS="-w"
+
+# Options for rpc.statd
+STATD_OPTS="-L"
diff --git a/core/rootfs/rootfs-stage32/data/etc/hosts b/core/rootfs/rootfs-stage32/data/etc/hosts
new file mode 100644
index 00000000..631cf753
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/hosts
@@ -0,0 +1,8 @@
+127.0.0.1 localhost
+
+# The following lines are desirable for IPv6 capable hosts
+::1 ip6-localhost ip6-loopback
+fe00::0 ip6-localnet
+ff00::0 ip6-mcastprefix
+ff02::1 ip6-allnodes
+ff02::2 ip6-allrouters
diff --git a/core/rootfs/rootfs-stage32/data/etc/keymaps/de_DE b/core/rootfs/rootfs-stage32/data/etc/keymaps/de_DE
new file mode 100644
index 00000000..375c2012
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/keymaps/de_DE
Binary files differ
diff --git a/core/rootfs/rootfs-stage32/data/etc/modprobe.d/50-mltk-blacklist.conf b/core/rootfs/rootfs-stage32/data/etc/modprobe.d/50-mltk-blacklist.conf
new file mode 100644
index 00000000..00be09ca
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/modprobe.d/50-mltk-blacklist.conf
@@ -0,0 +1,11 @@
+# Blacklist for mltk related modules
+
+# Intel corporation 82Q35 Express MEI controller spams syslog under
+# some 3.0 kernels
+blacklist mei
+
+# pcspeaker device driver
+blacklist pcspkr
+
+# Strange device driver for alsa via pcspeaker
+blacklist snd-pcsp
diff --git a/core/rootfs/rootfs-stage32/data/etc/nsswitch.conf b/core/rootfs/rootfs-stage32/data/etc/nsswitch.conf
new file mode 100644
index 00000000..6886def9
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/nsswitch.conf
@@ -0,0 +1,19 @@
+# /etc/nsswitch.conf
+#
+# Example configuration of GNU Name Service Switch functionality.
+# If you have the `glibc-doc-reference' and `info' packages installed, try:
+# `info libc "Name Service Switch"' for information about this file.
+
+passwd: compat
+group: compat
+shadow: compat
+
+hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
+networks: files
+
+protocols: db files
+services: db files
+ethers: db files
+rpc: db files
+
+netgroup: nis
diff --git a/core/rootfs/rootfs-stage32/data/etc/profile b/core/rootfs/rootfs-stage32/data/etc/profile
new file mode 100644
index 00000000..cbc5dba2
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/profile
@@ -0,0 +1,56 @@
+# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
+# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
+# XXX: Use `backticks` here instead of $(this stuff) as we don't know which shell is running...
+
+export UID=`id -u` 2> /dev/null
+
+# If running interactively, then:
+if [ "$PS1" ]; then
+
+ if [ "$BASH" ]; then
+ export PS1="[\u@\h \W]\\$ "
+ else
+ if [ "$UID" -eq 0 ]; then
+ export PS1='# '
+ else
+ export PS1='$ '
+ fi
+ fi
+
+ export HISTSIZE=1000
+ export HISTFILESIZE=1000
+ export PAGER='/bin/less'
+ export EDITOR='/bin/vi'
+ export INPUTRC=/etc/inputrc
+ #export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile
+ export TERMINFO='/lib/terminfo'
+
+fi
+
+# Stuff we might wanna know
+PWENT=`getent passwd $USER`
+export USER=`echo "$PWENT" | awk -F ':' '{print $1}'`
+export GID=`echo "$PWENT" | awk -F ':' '{print $4}'`
+export HOME=`echo "$PWENT" | awk -F ':' '{print $6}'`
+export GROUP=`id -gn`
+export LOGNAME=$USER
+export HOSTNAME=`hostname`
+
+# set TERM to xterm on SSH sessions
+[ -n "$SSH_TTY" ] && export TERM=xterm
+
+# Source configuration files from /etc/profile.d
+for i in /etc/profile.d/*.sh ; do
+ if [ -r "$i" ]; then
+ . $i
+ fi
+done
+
+# Sourcing /etc/profile.local - please add custom stuff to profile.local
+# as /etc/profile may be overwritten by system updates
+test -s /etc/profile.local && . /etc/profile.local
+
+if [ -s "$HOME/.bashrc" ]; then
+ . "$HOME/.bashrc"
+fi
+
diff --git a/core/rootfs/rootfs-stage32/data/etc/resolv.conf b/core/rootfs/rootfs-stage32/data/etc/resolv.conf
new file mode 120000
index 00000000..c6430d61
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/resolv.conf
@@ -0,0 +1 @@
+/opt/openslx/resolv.conf \ No newline at end of file
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service
new file mode 100644
index 00000000..2c5d7769
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service
@@ -0,0 +1,13 @@
+# This will trigger network.target etc. at an early point,
+# if network setup happened in stage31 (dhcp...)
+[Unit]
+Description=Trigger network targets early
+DefaultDependencies=no
+Wants=systemd-tmpfiles-setup.service
+Before=sysinit.target
+After=systemd-tmpfiles-setup.service
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-early_network_triggers
+RemainAfterExit=yes
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/graphical.target.wants/killsplash.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/graphical.target.wants/killsplash.service
new file mode 120000
index 00000000..40a962d5
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/graphical.target.wants/killsplash.service
@@ -0,0 +1 @@
+../killsplash.service \ No newline at end of file
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/load-gfx-driver.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/load-gfx-driver.service
new file mode 100644
index 00000000..0534f45c
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/load-gfx-driver.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Load DRM GFX driver and 3D
+Before=sysinit.target shutdown.target
+DefaultDependencies=no
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-load_gfx_driver
+RemainAfterExit=yes
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/mount-stage4.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/mount-stage4.service
new file mode 100644
index 00000000..7f8b54a8
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/mount-stage4.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Mount Openslx Stage 4
+DefaultDependencies=no
+Wants=setup-dnbd3.service stage4.target
+After=setup-dnbd3.service
+Before=stage4.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/opt/openslx/scripts/systemd-mount_stage4
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target b/core/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target
new file mode 100644
index 00000000..bc12cd1b
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target
@@ -0,0 +1,4 @@
+[Unit]
+Description=DNS Server available
+ConditionPathExists=/run/network/dns-ready
+
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target b/core/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target
new file mode 100644
index 00000000..770eb697
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target
@@ -0,0 +1,4 @@
+[Unit]
+Description=Default route configured
+ConditionPathExists=/run/network/gateway-ready
+
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/nfs-mount.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/nfs-mount.service
new file mode 120000
index 00000000..c1792e42
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/nfs-mount.service
@@ -0,0 +1 @@
+mount-stage4.service \ No newline at end of file
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/rpc-statd.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/rpc-statd.service
new file mode 100644
index 00000000..903a3b1a
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/rpc-statd.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=NFSv2/3 Network Status Monitor Daemon
+After=rpcbind.service
+Requires=rpcbind.service
+
+[Service]
+Type=forking
+EnvironmentFile=/etc/conf.d/nfs-common.conf
+ExecStart=/sbin/rpc.statd $STATD_OPTS
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/rpcbind.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/rpcbind.service
new file mode 100644
index 00000000..7dc4dcc2
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/rpcbind.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=RPC Bind
+After=network.target
+Wants=rpcbind.target
+Before=rpcbind.target
+
+[Service]
+Type=forking
+EnvironmentFile=/etc/conf.d/nfs-common.conf
+ExecStart=/sbin/rpcbind $BIND_OPTS
+Restart=always
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/setup-partitions.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/setup-partitions.service
new file mode 100644
index 00000000..6bb3a986
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/setup-partitions.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Setup local disk partitions (tmp, swap)
+DefaultDependencies=no
+Before=basic.target
+After=systemd-udev-settle.service
+Wants=tmp.target
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-setup_partitions
+RemainAfterExit=yes
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/setup-slx-addon@.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/setup-slx-addon@.service
new file mode 100644
index 00000000..88f38dbb
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/setup-slx-addon@.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Setup SLX addon %i
+DefaultDependencies=no
+Wants=tmp.target
+After=tmp.target
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-setup_slx_addons %I
+RemainAfterExit=yes
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/setup-slx-addons.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/setup-slx-addons.service
new file mode 100644
index 00000000..71a81d3f
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/setup-slx-addons.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Download, mount and append SLX addons
+After=tmp.target
+Wants=tmp.target
+DefaultDependencies=no
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-setup_slx_addons
+RemainAfterExit=yes
+
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/stage4.target b/core/rootfs/rootfs-stage32/data/etc/systemd/system/stage4.target
new file mode 100644
index 00000000..9b2e9e94
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/stage4.target
@@ -0,0 +1,5 @@
+[Unit]
+Requires=mount-stage4.service
+After=mount-stage4.service
+Description=OpenSLX Stage 4
+RefuseManualStart=yes
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service
new file mode 120000
index 00000000..8aec0a6d
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service
@@ -0,0 +1 @@
+../early-network-triggers.service \ No newline at end of file
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/load-gfx-driver.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/load-gfx-driver.service
new file mode 120000
index 00000000..b72d0453
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/load-gfx-driver.service
@@ -0,0 +1 @@
+../load-gfx-driver.service \ No newline at end of file
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/setup-partitions.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/setup-partitions.service
new file mode 120000
index 00000000..af2957f8
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/setup-partitions.service
@@ -0,0 +1 @@
+../setup-partitions.service \ No newline at end of file
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/setup-slx-addons.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/setup-slx-addons.service
new file mode 120000
index 00000000..415050b5
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/setup-slx-addons.service
@@ -0,0 +1 @@
+../setup-slx-addons.service \ No newline at end of file
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/update-etc_issue.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/update-etc_issue.service
new file mode 120000
index 00000000..4540789e
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/update-etc_issue.service
@@ -0,0 +1 @@
+../update-etc_issue.service \ No newline at end of file
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/zram-swap.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/zram-swap.service
new file mode 120000
index 00000000..c1754b11
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/zram-swap.service
@@ -0,0 +1 @@
+../zram-swap.service \ No newline at end of file
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/tmp.target b/core/rootfs/rootfs-stage32/data/etc/systemd/system/tmp.target
new file mode 100644
index 00000000..a8c3eab2
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/tmp.target
@@ -0,0 +1,5 @@
+[Unit]
+Description=/tmp has been mounted
+Wants=setup-partitions.service
+After=setup-partitions.service
+
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/update-etc_issue.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/update-etc_issue.service
new file mode 100644
index 00000000..21a09b7c
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/update-etc_issue.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Update /etc/issue
+Before=getty.target shutdown.target
+DefaultDependencies=no
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/openslx-create_issue
+RemainAfterExit=no
diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/zram-swap.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/zram-swap.service
new file mode 100644
index 00000000..a458b380
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/systemd/system/zram-swap.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Setup zram swap partitions
+DefaultDependencies=no
+Wants=swap.target
+Before=swap.target
+
+[Service]
+Type=oneshot
+ExecStart=/opt/openslx/scripts/systemd-zram_swap
+RemainAfterExit=yes
diff --git a/core/rootfs/rootfs-stage32/data/etc/terminfo/l/linux b/core/rootfs/rootfs-stage32/data/etc/terminfo/l/linux
new file mode 100644
index 00000000..48d722f8
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/terminfo/l/linux
Binary files differ
diff --git a/core/rootfs/rootfs-stage32/data/etc/terminfo/x/xterm b/core/rootfs/rootfs-stage32/data/etc/terminfo/x/xterm
new file mode 100644
index 00000000..438b1581
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/terminfo/x/xterm
Binary files differ
diff --git a/core/rootfs/rootfs-stage32/data/etc/terminfo/x/xterm-256color b/core/rootfs/rootfs-stage32/data/etc/terminfo/x/xterm-256color
new file mode 100644
index 00000000..b934be06
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/terminfo/x/xterm-256color
Binary files differ
diff --git a/core/rootfs/rootfs-stage32/data/etc/tmpfiles.d/network.conf b/core/rootfs/rootfs-stage32/data/etc/tmpfiles.d/network.conf
new file mode 100644
index 00000000..346ecf7e
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/tmpfiles.d/network.conf
@@ -0,0 +1 @@
+d /run/network 0755 root root
diff --git a/core/rootfs/rootfs-stage32/data/etc/tmpfiles.d/openslx-log.conf b/core/rootfs/rootfs-stage32/data/etc/tmpfiles.d/openslx-log.conf
new file mode 100644
index 00000000..4d93fb9c
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/tmpfiles.d/openslx-log.conf
@@ -0,0 +1 @@
+d /var/log/openslx 0777 root root
diff --git a/core/rootfs/rootfs-stage32/data/etc/tmpfiles.d/run-lock.conf b/core/rootfs/rootfs-stage32/data/etc/tmpfiles.d/run-lock.conf
new file mode 100644
index 00000000..a20cf5ce
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/etc/tmpfiles.d/run-lock.conf
@@ -0,0 +1,2 @@
+d /run/lock 1777 root root
+
diff --git a/core/rootfs/rootfs-stage32/data/opt/openslx/bin/penv b/core/rootfs/rootfs-stage32/data/opt/openslx/bin/penv
new file mode 100755
index 00000000..5d0c8dc7
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/opt/openslx/bin/penv
@@ -0,0 +1,7 @@
+#!/bin/ash
+
+[ "$#" -ne "1" ] && echo "Usage: $0 PID" && exit 1
+[ ! -e "/proc/$1/environ" ] && echo "No such process: $1" && exit 1
+[ ! -r "/proc/$1/environ" ] && echo "Cannot open process: $1" && exit 1
+sed 's/\x0/\n/g' "/proc/$1/environ" | grep -E --color=auto '^[^=]*'
+
diff --git a/core/rootfs/rootfs-stage32/data/opt/openslx/bin/slxlog b/core/rootfs/rootfs-stage32/data/opt/openslx/bin/slxlog
new file mode 100755
index 00000000..52320c1a
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/opt/openslx/bin/slxlog
@@ -0,0 +1,76 @@
+#!/bin/ash
+
+##################
+# Remote logging #
+##################
+#
+# Usage: slxlog [-e | --echo] "logtype" "Human readable string" ["file name which's contents should be sent too"]
+# -e or --echo will echo message to stdout too
+#
+
+export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+
+. /opt/openslx/config
+[ -z "$SLX_REMOTE_LOG" ] && exit 3
+
+LOGCHECK="/tmp/remote_log_check"
+NOW=$(date +%s)
+
+if [ "x$1" = "x-e" -o "x$1" = "x--echo" ]; then
+ shift
+ echo "$@"
+fi
+
+[ $# -eq 0 ] && exit 0
+
+TYPE="$1"
+
+# Simple spamcheck. Not very tamper-proof, but if you'd want to spam the server
+# you could do it anyways. This is to protect from accidental loops calling this.
+if [ -r "$LOGCHECK" ]; then
+ # Allow max 150 messages in total
+ LINES=$(cat "$LOGCHECK" | wc -l)
+ [ "$LINES" -gt "150" ] && exit 1
+ # Allow max 5 of same type messages in 30 seconds
+ LINES=$(grep "$TYPE" "$LOGCHECK" | wc -l)
+ if [ "$LINES" -ge "5" ]; then
+ LAST=$(grep "$TYPE" "$LOGCHECK" | tail -n 5 | head -n 1 | awk '{print $1}')
+ if [ -n "$LAST" ]; then
+ DIFF="$(( $NOW - $LAST ))"
+ [ "$DIFF" -lt "30" ] && exit 2
+ fi
+ fi
+fi
+echo "$NOW $TYPE" >> "$LOGCHECK"
+chmod 0666 "$LOGCHECK" 2>/dev/null
+
+if [ $# -lt 2 ]; then
+ MSG="Missing text for $@"
+else
+ MSG="$2"
+fi
+USER=$(whoami)
+MSG="[$USER] $MSG"
+
+if [ $# -gt 2 ]; then
+ EXTRA="$3"
+fi
+
+if [ -n "$SLX_DEBUG" ]; then
+ CURLLOG="/tmp/slxlog.$USER"
+else
+ CURLLOG="/dev/null"
+fi
+
+if [ -n "$EXTRA" ] && [ -r "$EXTRA" -a -s "$EXTRA" ] && [ "$(stat -c %s "$EXTRA")" -lt "10000" ]; then # valid file attachment
+ curl --data-urlencode "type=$TYPE" --data-urlencode "description=$MSG" --data-urlencode "longdesc@$EXTRA" "$SLX_REMOTE_LOG" >> "$CURLLOG" 2>&1 &
+elif [ -z "$EXTRA" ]; then # no attachment
+ curl --data-urlencode "type=$TYPE" --data-urlencode "description=$MSG" "$SLX_REMOTE_LOG" >> "$CURLLOG" 2>&1 &
+elif [ -s "$EXTRA" ]; then # empty attachment file (or missing)
+ curl --data-urlencode "type=$TYPE" --data-urlencode "description=$MSG" --data-urlencode "longdesc=Attachment too large: $EXTRA" "$SLX_REMOTE_LOG" >> "$CURLLOG" 2>&1 &
+else # attachment file to big (more than 10k)
+ curl --data-urlencode "type=$TYPE" --data-urlencode "description=$MSG" --data-urlencode "longdesc=Attachment missing/empty: $EXTRA" "$SLX_REMOTE_LOG" >> "$CURLLOG" 2>&1 &
+fi
+
+exit 0
+
diff --git a/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/openslx-create_issue b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/openslx-create_issue
new file mode 100755
index 00000000..879463cd
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/openslx-create_issue
@@ -0,0 +1,25 @@
+#!/bin/bash
+# Copyright (c) 2013, 2014 - bwLehrpool Projekt
+# Copyright (c) 2012 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org
+#
+# First script for initial ramfs for OpenSLX linux stateless clients
+#############################################################################
+PATH=$PATH:/opt/openslx/bin:/opt/openslx/sbin
+
+# Set greeting and add information about the booted system
+len=$(expr length "$(cat /etc/hostname)")
+while [ $len -le 56 ] ; do
+ space="$space "
+ len=$(($len + 1))
+done
+
+sed "s/%space%/$space/g" /opt/openslx/etc/issue.template > /etc/issue
+
diff --git a/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers
new file mode 100755
index 00000000..1e999da6
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers
@@ -0,0 +1,29 @@
+#!/bin/ash
+
+# This script will trigger several network targets if
+# applicable at an early point.
+# This happens if dhcp/network setup was successful in stage31
+
+# Main interface
+BRIDGE="br0"
+
+if [ ! -e "/sys/class/net/${BRIDGE}/operstate" -o "x$(cat "/sys/class/net/${BRIDGE}/operstate")" == "xup" ] && [ -e "/opt/openslx/uniontmp/etc/hostname" -o -e "/etc/resolv.conf" ]; then
+ echo "Triggering network.target"
+ touch "/run/network/network-ready"
+ systemctl start network.target &
+fi
+
+if [ -s "/etc/resolv.conf" ] && grep -q "^nameserver" "/etc/resolv.conf"; then
+ echo "Triggering network-dns.target"
+ touch "/run/network/dns-ready"
+ systemctl start network-dns.target &
+fi
+
+if route -n | grep -q -E '^0\.0\.0\.0.*U.*G'; then
+ echo "Triggering network-gateway.target"
+ touch "/run/network/gateway-ready"
+ systemctl start network-gateway.target &
+fi
+
+exit 0
+
diff --git a/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-load_gfx_driver b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-load_gfx_driver
new file mode 100755
index 00000000..7bc310fc
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-load_gfx_driver
@@ -0,0 +1,22 @@
+#!/bin/bash
+PATH=$PATH:/opt/openslx/bin:/opt/openslx/sbin
+PCIFILE=/tmp/lspci-output
+
+if ! lspci -n > "$PCIFILE"; then
+ echo "lspci -n failed..."
+ exit 1
+fi
+
+if grep -E ' (8086:0152|8086:0412|8086:0416|1002:6779)( |$)' "$PCIFILE" > /dev/null; then
+ echo "i915 - enable 3D"
+ echo -e "# Written by load-gfx-driver\nSLX_VMWARE_3D=yes" >> "/opt/openslx/config"
+fi
+
+if lsmod | grep -q '^nvidia\s'; then
+ # nvidia kernel module was loaded in stage31 - download libs
+ systemctl start setup-slx-addon@nvidia_libs &
+ echo -e "# Written by load-gfx-driver\nSLX_VMWARE_3D=yes" >> "/opt/openslx/config"
+fi
+
+exit 0
+
diff --git a/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-mount_stage4 b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-mount_stage4
new file mode 100755
index 00000000..10cfca5f
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-mount_stage4
@@ -0,0 +1,71 @@
+#!/bin/bash
+# Needs full bash
+
+. /opt/openslx/config
+PATH=$PATH:/opt/openslx/bin:/opt/openslx/sbin
+
+[ -z "${SLX_STAGE4}" ] && { echo "SLX_STAGE4 is not set in /opt/openslx/config." && exit 1; }
+
+MOUNTPOINT="/opt/openslx/mnt/stage4"
+mkdir -p "$MOUNTPOINT"
+
+if [[ "$SLX_STAGE4" == dnbd3* ]]; then
+ # dnbd3 it is
+ if [ -z "${SLX_DNBD3_SERVERS}${SLX_DNBD3_PRIO_SERVERS}" ]; then
+ slxlog --echo "mount-stage4" "dnbd3 stage4 configured, but SLX_DNBD3(_PRIO)_SERVERS empty or not set in /opt/openslx/config."
+ exit 1
+ fi
+ # Determine revision
+ if [ -z "$SLX_STAGE4_RID" ] || echo "$SLX_STAGE4_RID" | grep -v -q -E "^[0-9]+$"; then
+ SLX_STAGE4_RID="0"
+ fi
+ # Randomize list
+ SERVERS=$(for SERVER in $SLX_DNBD3_SERVERS; do echo "$RANDOM $SERVER"; done | sort -u | sed -r 's/^[0-9]+ //')
+ IMAGE=$(echo $SLX_STAGE4 | awk '{printf $2}')
+ [ -e /var/run/dnbd3.socket ] || sleep 2 # Ugly, service should only start when dnbd3 daemon is up and running
+ RET=1337
+ for SRV in $SLX_DNBD3_PRIO_SERVERS $SERVERS; do
+ echo "Requesting $IMAGE from $SRV"
+ dnbd3=$(dnbd3-client -h "$SRV" -i "$IMAGE" -r "$SLX_STAGE4_RID")
+ RET=$?
+ [ "$RET" -eq "0" ] && break
+ echo "... didn't work ($RET)"
+ sleep 1
+ done
+ if [ "$RET" -ne "0" ]; then
+ slxlog --echo "mount-stage4" "Could not get stage4 via dnbd3 ($IMAGE : $SLX_STAGE4_RID) ($SLX_DNBD3_PRIO_SERVERS / $SERVERS)"
+ exit $RET
+ fi
+ echo "Mounting $dnbd3 to $MOUNTPOINT"
+ if ! mount -t squashfs -o ro "$dnbd3" "$MOUNTPOINT"; then
+ slxlog --echo "mount-stage4" "Could not mount stage4 from '$dnbd3' to '$MOUNTPOINT' ($SRV, $IMAGE)"
+ exit 1
+ fi
+else
+ # Try nfs
+ echo "Mounting ${SLX_STAGE4} to $MOUNTPOINT"
+ if ! mount -t nfs -o ro,async,nolock,vers=3 "$SLX_STAGE4" "$MOUNTPOINT"; then
+ slxlog --echo "mount-stage4" "Could not mount stage4 from '$SLX_STAGE4' to '$MOUNTPOINT'"
+ exit 1
+ fi
+fi
+
+echo "Appending $MOUNTPOINT to /"
+if mount -o "remount,append:$MOUNTPOINT=ro" /; then
+
+ # addons can trigger ldconfig, hence
+ # make sure no ldconfig is running before copying the real ld cache
+ while ps aux|grep -v grep|grep -q ldconfig; do
+ sleep 1
+ done
+ cp -r "${MOUNTPOINT}/"etc/ld.* /etc/ || echo "Could not really copy full blown ldconfig from stage4 to live system"
+else
+ slxlog --echo "mount-stage4" "Could not append mounted stage4 at '$MOUNTPOINT' to aufs at /"
+ exit 1
+fi
+
+# dbus reload needed eg. for gnome etc. and perhaps other service files which stage4 needs:
+systemctl reload dbus.service
+
+exit 0
+
diff --git a/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_partitions b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_partitions
new file mode 100755
index 00000000..0c352241
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_partitions
@@ -0,0 +1,168 @@
+#!/bin/ash
+# Copyright (c) 2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Local hard disk autodetection script for OpenSLX linux stateless clients,
+# detecting swap and special partitions
+
+#############################################################################
+
+# Mount point for persistent scratch partition (type 45)
+PERSISTENT="/opt/openslx/persistent"
+
+# General formatter for the /tmp partition on a local harddisk
+diskfm () {
+ mopt="" # Global var!
+ local target="$1"
+ local fslist="xfs jfs ext3 ext2 ext4"
+ local fs
+ local path
+ [ $# -ge 2 ] && fslist="$2"
+ for fs in $fslist ; do
+ unset available
+ case $(cat /proc/filesystems) in
+ *${fs}*) available=yes;;
+ *) modprobe "${fs}" && available=yes;;
+ esac
+ if [ -n "${available}" ]; then
+ unset found
+ if which "mkfs.$fs" ; then
+ found=yes
+ case "mkfs.$fs" in
+ mkfs.xfs)
+ fopt="-f -b size=4k -s size=4k -l size=512b" # fastest formatting possible :)
+ mopt="-o noexec"
+ ;;
+ mkfs.ext2)
+ fopt="-Fq"
+ mopt="-o nocheck,noexec"
+ ;;
+ mkfs.ext3|mkfs.ext4)
+ fopt="-Fq"
+ mopt="-o noexec"
+ ;;
+ mkfs.reiserfs)
+ fopt="-f"
+ mopt="-o noexec"
+ ;;
+ mkfs.jfs)
+ fopt="-q"
+ mopt="-o noexec"
+ ;;
+ esac
+ mkfs.$fs ${fopt} "${target}"
+ fi
+ [ -n "$found" ] && break
+ fi
+ done
+}
+
+mount_temp () {
+ local PRE=$(pwd)
+ if ! cd /tmp; then
+ mount_temp_fallback $@
+ return $?
+ fi
+ mount $@ /tmp || return 1
+ chmod a+rwxt /tmp
+ # Move stuff from working directory, which is old /tmp, to new /tmp just mounted
+ mv ./* ./.[!.]* ./..?* /tmp/ 2> /dev/null
+ local OLD=$(LANG=C ls -alh | grep -v -E ' \.\.?$' | grep -v '^total')
+ [ -n "$OLD" ] && echo -- "Leftovers:" && echo -- "$OLD"
+ cd "$PRE"
+}
+
+mount_temp_fallback () {
+ mkdir -p /tmptmp
+ mv /tmp/* /tmp/.* /tmptmp/ 2> /dev/null
+ mount $@ /tmp || return 1
+ chmod a+rwxt /tmp
+ mv /tmptmp/* /tmptmp/.* /tmp/
+ rmdir /tmptmp
+ return 0
+}
+
+fdisk -l | sed -n "/^\/dev\//p" > "/etc/disk.partition"
+
+if [ ! -s "/etc/disk.partition" ]; then
+ sleep 3
+ fdisk -l | sed -n "/^\/dev\//p" > "/etc/disk.partition"
+fi
+
+echo "Partitions:"
+cat "/etc/disk.partition"
+
+# Check for standard swap partitions and make them available to the system
+HAVE_SWAP=no
+for hdpartnr in $(sed -n -e "/ 82 /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
+ echo -e "$hdpartnr\tswap\t\tswap\t\tdefaults\t 0 0" >> "/etc/fstab"
+ swapon "$hdpartnr" -p 10 && HAVE_SWAP=yes # low priority, in case we have zram swap, prefer that)
+done
+
+# We use special non assigned partition type (id44) for harddisk scratch
+# space, thus no normal filesystem will be incidentally deleted or
+# corrupted
+HAVE_TEMP=no
+for hdpartnr in $(sed -n -e "/ 44 /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
+ # check for supported filesystem and formatter
+ if diskfm "$hdpartnr"; then
+ # echo "$hdpartnr is mounted to /mnt/tmp at $(sysup)" >/tmp/tmpready
+ mount_temp "$mopt" "$hdpartnr" || continue
+ echo -e "${hdpartnr}\t/tmp\t\tauto\t\tnoexec\t 0 0" >> "/etc/fstab"
+ HAVE_TEMP=yes
+ break
+ else
+ echo "formatting failed for some reason"
+ fi # Made this non-forking, systemd should handle it - 2013-05-28
+done
+
+# Put detected linux partitions (83) into /etc/fstab with "noauto", special
+# partition 45 (persistent scratch) to /var/scratch and 46 to /var/openslx
+HAVE_PERSISTENT=no
+for partid in 83 45 46 ; do
+ for hdpartnr in $(sed -n -e "/ ${partid} /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
+ if [ "${partid}" -eq 83 ]; then
+ mkdir -p "/media/${hdpartnr#/dev/*}"
+ echo -e "${hdpartnr}\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto,noexec\t 0 0" >> "/etc/fstab"
+ elif [ "${partid}" -eq 45 -a "$HAVE_PERSISTENT" = "no" ]; then
+ mkdir -p "$PERSISTENT"
+ if ! mount -t auto -o noexec "${hdpartnr}" "$PERSISTENT"; then
+ diskfm "$hdpartnr" "jfs xfs ext3" || continue
+ mount -t auto -o noexec "${hdpartnr}" "$PERSISTENT" || continue
+ fi
+ HAVE_PERSISTENT=yes
+ echo -e "${hdpartnr}\t${PERSISTENT}\tauto\t\tnoauto,noexec\t\t 0 0" >> "/etc/fstab"
+ elif [ "${partid}" -eq 46 ]; then
+ mkdir -p "/media/${hdpartnr#/dev/*}"
+ #mount -t auto ${hdpartnr} /mnt/media/${hdpartnr#/dev/*} \n\
+ #test -d /mnt/media/${hdpartnr#/dev/*}/home && \
+ # ln -sf /media/${hdpartnr#/dev/*} /var/home
+ echo -e "${hdpartnr}\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto\t\t 0 0" >> "/etc/fstab"
+ fi
+ done
+done
+[ "$HAVE_PERSISTENT" = "no" -a -d "$PERSISTENT" ] && rm -f "$PERSISTENT"
+
+mount -a
+
+# Make huge tmpfs if nothing could be mounted for /tmp
+if [ "$HAVE_TEMP" = "no" ]; then
+ mount_temp -t tmpfs -o size=60G none
+ slxlog "partition-temp" "Running /tmp on tmpfs only!" "/etc/disk.partition"
+fi
+if [ "$HAVE_SWAP" = "no" ]; then
+ TOTAL_RAM=$(grep ^MemTotal /proc/meminfo | awk '{print $2}')
+ if [ -n "$TOTAL_RAM" ] && [ "$TOTAL_RAM" -lt "3000000" ]; then
+ slxlog "partition-swap" "Have no (formatted) swap partition, using zram swap only!" "/etc/disk.partition"
+ fi
+fi
+
+exit 0
+
diff --git a/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_slx_addons b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_slx_addons
new file mode 100755
index 00000000..8fb2579a
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-setup_slx_addons
@@ -0,0 +1,94 @@
+#!/bin/bash
+# Needs full bash
+#
+# Script to be called by systemd
+#
+# Downloads and appends addons per sqfs/aufs.
+#
+######################################################################################
+#
+# Two modes for this script:
+# - without any arguments, it will just go through the list of addons to
+# setup as given through the OpenSLX configuration file
+# - with an argument, it will setup the addon given as $1
+#
+#
+######################################################################################
+
+export PATH=$PATH:/opt/openslx/bin:/opt/openslx/sbin
+
+# read global OpenSLX config
+. /opt/openslx/config || { echo "Could not source config!"; exit 23; }
+
+# source functions.inc for the download function
+. /opt/openslx/inc/functions || { echo "/opt/openslx/inc/functions not found!"; exit 1337; }
+
+# quick fix for the missing FUTURE_ROOT needed by /opt/openslx/etc/functions.inc
+export FUTURE_ROOT="/"
+
+# read openslx config, especially servers given by SLX_KCL_SERVERS and SLX_CONFIG_SERVERS
+if [ -z "${SLX_CONFIG_SERVERS}" ]; then
+ echo "SLX_CONFIG_SERVERS is not set in /opt/openslx/config. Will only try the base servers from the cmdline."
+ #[ -z "${SLX_KCL_SERVERS}" ] && SLX_KCL_SERVERS=$(read_from_cmdline "slxsrv")
+fi
+
+# read base slx servers from cmdline
+BASE_MOUNT_POINT="/opt/openslx/mnt"
+DOWNLOAD_DEST="/tmp/addons"
+mkdir -p "$DOWNLOAD_DEST" || { echo "Failed to create $DOWNLOAD_DEST"; exit 1; }
+
+######################################################################################
+#
+# NO ARGUMENTS -> LOOP OVER ALL ADDONS
+#
+
+if [ $# -eq 0 ]; then
+ [ -z "${SLX_ADDONS}" ] && { echo "No addons configured. Nothing to do :-)."; exit 0; }
+ for ADDON in ${SLX_ADDONS}; do
+ systemctl start "setup-slx-addon@$ADDON" &
+ done
+fi
+
+######################################################################################
+#
+# WITH ARGUMENTS -> SETUP ADDON
+#
+
+if [ $# -eq 1 ]; then
+ ADDON="$1"
+
+ # download the addon from the given URL
+ ADDON_TARGET_PATH="${DOWNLOAD_DEST}/$(basename "$ADDON").sqfs"
+ if ! download "${SLX_BASE_PATH}/${ADDON}.sqfs" "${ADDON_TARGET_PATH}"; then
+ slxlog --echo "addon-download" "Download of '${HTTP_BASE_PATH}/${ADDON}.sqfs' failed."
+ exit 1
+ fi
+
+ # now mount it to $BASE_MOUNT_POINT/<addon-name>
+ ADDON_MOUNT_POINT="${BASE_MOUNT_POINT}/$(basename "$ADDON")"
+ mkdir -p "$ADDON_MOUNT_POINT"
+ mount -t squashfs -o ro "$ADDON_TARGET_PATH" "$ADDON_MOUNT_POINT" || \
+ { slxlog --echo "addon-mount" "Failed to mount $ADDON_TARGET_PATH."; exit 1; }
+
+ # now append it to /
+ echo "Appending ${ADDON_MOUNT_POINT} to /"
+ if ! mount -o "remount,ins:1:${ADDON_MOUNT_POINT}=rr" / ; then # ins:2 makes sure the addon is after tmpfs and stage32, but before stage4
+ slxlog --echo "addon-aufs" "Failed to append ${ADDON_MOUNT_POINT} to the aufs. Cleaning up..."
+ umount -l ${ADDON_MOUNT_POINT} || echo "Could not unmount ${ADDON_MOUNT_POINT}!"
+ exit 1
+ fi
+
+ # Run post-hook if available
+ if [ -x "$ADDON_MOUNT_POINT/addon-init" ]; then
+ "$ADDON_MOUNT_POINT/addon-init" || \
+ slxlog --echo "addon-init" "Warning: Could not execute addon-init of $ADDON"
+ fi
+ if ! grep -q '/opt/openslx/mnt/stage4' "/proc/mounts"; then
+ ldconfig 2> /dev/null || ldconfig.real 2> /dev/null
+ fi
+fi
+
+[ $# -gt 1 ] && { echo "Error - $0 only takes no or one argument. $# given." && exit 1; }
+
+exit 0
+
diff --git a/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-zram_swap b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-zram_swap
new file mode 100755
index 00000000..f8bd5682
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-zram_swap
@@ -0,0 +1,60 @@
+#!/bin/ash
+# Copyright (c) 2013 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your feedback to feedback@openslx.org
+#
+# General information about OpenSLX can be found under http://openslx.org
+#
+# Local hard disk autodetection script for OpenSLX linux stateless clients,
+# detecting swap and special partitions
+
+#############################################################################
+
+
+# Add zram swap
+# Some older ubuntu kernels had a problem here, see https://bugs.launchpad.net/ubuntu/+source/linux-lts-raring/+bug/1217189
+# So make sure you're up to date
+
+make_swap () {
+ [ $# -ne 2 ] && echo "make_swap: Wrong parameter count $#" && exit 1
+ local USE="$1"
+ local DEV="$2"
+ echo "$USE" > "/sys/block/zram${DEV}/disksize"
+ mkswap "/dev/zram${DEV}"
+ swapon "/dev/zram${DEV}" -p 1000 # high priority (in case we have hdd swap 0x82, prefer zram)
+}
+
+CPUS=$(grep -c -E "^processor.*[0-9]+$" "/proc/cpuinfo")
+if [ -z "$CPUS" ]; then
+ echo "ERROR: Could not determine CPU core count"
+ exit 1
+fi
+
+[ "$CPUS" -gt "16" ] && CPUS=16 # zram can only handle up to 32 devices, the system can apparently even just handle 29 swap partitions, so use a reasonable upper limit
+if ! modprobe zram "num_devices=$CPUS"; then
+ echo "ERROR: Could not load zram module"
+ exit 1
+fi
+
+TOTAL=$(grep ^MemTotal /proc/meminfo | awk '{print $2}')
+USE=$(( $TOTAL / ( 2 * $CPUS ) ))
+echo "Have $CPUS cores, $TOTAL kb mem, use $USE kb zram swap per core"
+USE=$(( $USE * 1024 ))
+DEV=0
+while [ "$DEV" -lt "$CPUS" ]; do
+ make_swap "$USE" "$DEV" &
+ LAST=$!
+ DEV=$(( $DEV + 1 ))
+done
+
+# Wait, so we don't trigger swap.target too early
+while kill -0 "$LAST"; do
+ usleep 100000
+done
+
+exit 0
+
diff --git a/core/rootfs/rootfs-stage32/data/root/.bashrc b/core/rootfs/rootfs-stage32/data/root/.bashrc
new file mode 100644
index 00000000..6266b0f4
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/data/root/.bashrc
@@ -0,0 +1,48 @@
+[ -z "$PS1" ] && return
+HISTCONTROL=ignoredups:ignorespace
+shopt -s histappend
+HISTSIZE=1000
+HISTFILESIZE=2000
+shopt -s checkwinsize
+[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
+if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
+ debian_chroot=$(cat /etc/debian_chroot)
+fi
+case "$TERM" in
+ xterm-color) color_prompt=yes;;
+esac
+force_color_prompt=yes
+if [ -n "$force_color_prompt" ]; then
+ if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
+ color_prompt=yes
+ else
+ color_prompt=
+ fi
+fi
+if [ "$color_prompt" = yes ]; then
+ PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
+else
+ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+fi
+unset color_prompt force_color_prompt
+case "$TERM" in
+xterm*|rxvt*)
+ PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
+ ;;
+*)
+ ;;
+esac
+if [ -x /usr/bin/dircolors ]; then
+ test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
+ alias ls='ls --color=auto'
+ alias grep='grep --color=auto'
+ alias fgrep='fgrep --color=auto'
+ alias egrep='egrep --color=auto'
+fi
+alias ll='ls -alFh'
+alias la='ls -A'
+alias l='ls -CF'
+if [ -f ~/.bash_aliases ]; then
+ . ~/.bash_aliases
+fi
+export PATH=/root/bin:$PATH
diff --git a/core/rootfs/rootfs-stage32/module.build b/core/rootfs/rootfs-stage32/module.build
new file mode 100644
index 00000000..4fbc26b5
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/module.build
@@ -0,0 +1,146 @@
+#!/bin/bash
+fetch_source() {
+ :
+}
+
+build() {
+ if [ ! -z "$REQUIRED_CONTENT_PACKAGES" ]; then
+ local COPYLIST="list_dpkg_output"
+ [ -e "${COPYLIST}" ] && rm "${COPYLIST}"
+ list_packet_files >> "${COPYLIST}"
+ tarcopy "$(cat "${COPYLIST}" | sort -u)" "${MODULE_BUILD_DIR}"
+ fi
+
+ local FILELIST="list_binaries_and_files"
+ [ -e "${FILELIST}" ] && rm "${FILELIST}"
+
+ # Compile rdns
+ mkdir -p "$MODULE_BUILD_DIR/opt/openslx/bin"
+ gcc -o "$MODULE_BUILD_DIR/opt/openslx/bin/rdns" "$MODULE_DIR/rdns.c" || perror "Compiling rdns failed."
+ # Get ldconfig
+ mkdir -p "$MODULE_BUILD_DIR/sbin"
+ local LOC=$(which ldconfig.real)
+ [ -z "$LOC" ] && LOC=$(which ldconfig)
+ [ -z "$LOC" ] && perror "Cannot find ldconfig"
+ pdebug "Picking ldconfig from $LOC"
+ cp "$LOC" "$MODULE_BUILD_DIR/sbin/ldconfig"
+
+ pinfo "Searching binaries from config file in system..."
+ for BIN in ${REQUIRED_BINARIES}
+ do
+ [ -n "$(find "$MODULE_BUILD_DIR" -name "$BIN")" ] && continue
+ BIN_LOCATION="$(which "$BIN")"
+ if [ ! -z "$BIN_LOCATION" -a -e "$BIN_LOCATION" ]; then
+ get_link_chain "$BIN_LOCATION" >> "$FILELIST"
+ else
+ perror "${BIN} not found on the system! Please install it."
+ fi
+ done
+
+ pinfo "Searching libraries from config file in system... (could take some time)"
+ for LIB in ${REQUIRED_LIBRARIES}
+ do
+ # lib + lib64: Ugly hack, will be replaced by a better solution
+ for LIB_LOCATION in $(find /lib/ /lib64/ -name "${LIB}.so*")
+ do
+ get_link_chain "${LIB_LOCATION}" >> "${FILELIST}"
+ done
+ done
+
+ for FILE in ${REQUIRED_DIRECTORIES}
+ do
+ [ ! -d ${FILE} ] && perror "Missing required directory $FILE"
+ echo ${FILE} >> "${FILELIST}"
+ done
+ for FILE in ${REQUIRED_FILES}
+ do
+ [ ! -f ${FILE} ] && perror "Missing required file $FILE"
+ echo ${FILE} >> "${FILELIST}"
+ done
+
+ local NUMFILES=$(cat "${FILELIST}" | wc -l)
+ if [ "x$NUMFILES" != "x" -a "x$NUMFILES" != "x0" ]; then
+ pinfo "File list generated at ${MODULE_BUILD_DIR}/${FILELIST} ($NUMFILES entries)"
+ pinfo "If something fails here, try to clean this module first."
+ tarcopy "$(cat "${FILELIST}")" "${MODULE_BUILD_DIR}"
+ fi
+}
+
+post_copy() {
+ # symlink for more
+ if [ ! -e "$TARGET_BUILD_DIR/bin/more" ]; then
+ [ -e "$TARGET_BUILD_DIR/bin/less" ] && ln -s /bin/less "$TARGET_BUILD_DIR/bin/more"
+ [ -e "$TARGET_BUILD_DIR/usr/bin/less" ] && ln -s /usr/bin/less "$TARGET_BUILD_DIR/bin/more"
+ fi
+ # same hack for mount
+ [ ! -e "$TARGET_BUILD_DIR/bin/mount" ] && ln -s /usr/bin/mount "$TARGET_BUILD_DIR/bin/mount"
+
+ # make basic directory structure
+ mkdir -p "$TARGET_BUILD_DIR"/{bin,dev,proc,lib,etc,mnt,run,sys,var,opt/openslx/mnt}
+ ln -s -n -f -t "$TARGET_BUILD_DIR/var" "../run/lock" "../run"
+
+ # copy devices from running system
+ cp -a /dev/{console,kmsg,mem,null,shm,tty,tty0,tty1,tty9,urandom,zero} \
+ "${TARGET_BUILD_DIR}"/dev || perror "Copying devices from running system failed."
+
+ # set /etc/environment to include /opt/openslx/bin and /opt/openslx/sbin
+ #add_env PATH "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+ add_env PATH "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/openslx/sbin:/opt/openslx/bin"
+ # set terminal to linux as it defaults to xterm which messes up ssh sessions
+ add_env TERM "linux"
+
+ # quick fix for /etc/fstab
+ [ ! -e "${TARGET_BUILD_DIR}/etc/fstab" ] && echo "# no configuration" > "${TARGET_BUILD_DIR}/etc/fstab"
+
+ # link /etc/mtab, needed for systemd
+ [ ! -e "${TARGET_BUILD_DIR}/etc/mtab" ] && ln -s "/proc/self/mounts" "${TARGET_BUILD_DIR}/etc/mtab"
+
+ # passwd, group, shadow
+ init_users_and_groups
+
+ # quick fix for missing group in /etc/group
+ add_group "lock"
+ add_group "nogroup"
+ add_user "nobody"
+
+ # setup root account
+ PASSWORD= USER=root add_user
+ DEMO_ID="$(USER=demo PASSWORD= USERHOME=/home/demo USERSHELL=/bin/bash add_user)"
+
+ mkdir -p "${TARGET_BUILD_DIR}/root"
+ mkdir -p "${TARGET_BUILD_DIR}/home/demo"
+ chown "$DEMO_ID:$DEMO_ID" "${TARGET_BUILD_DIR}/home/demo"
+ sed -i -r 's/^blacklist.*pcspkr/#&/g' "$TARGET_BUILD_DIR/etc/modprobe.d/blacklist.conf"
+
+ echo "minilinux-$(hostname)" > "${TARGET_BUILD_DIR}/etc/hostname"
+
+
+ # copy kernel, modules and firmware
+ copy_kernel_modules
+ copy_firmware
+ copy_kernel
+
+ # Try to fetch distro logo
+ if [ ! -s "$TARGET_BUILD_DIR/etc/distro.png" ]; then
+ local DIST=$(lsb_release -si)
+ if [ -n "$DIST" ]; then
+ [ -z "$CFG_DISTLOGO_URL" ] && CFG_DISTLOGO_URL='http://mltk-services.ruf.uni-freiburg.de/distro_logo.php?distro='
+ wget -t 3 -T 3 -O "$TARGET_BUILD_DIR/etc/distro.png" "${CFG_DISTLOGO_URL}${DIST}"
+ if [ ! -s "$TARGET_BUILD_DIR/etc/distro.png" ]; then
+ rm -f "$TARGET_BUILD_DIR/etc/distro.png"
+ pwarning "Could not download distro-logo"
+ fi
+ else
+ pwarning "Could not determine distribution"
+ fi
+ fi
+ # Create issue.template
+ local DIST=$(lsb_release -sd)
+ local GITC=$(git rev-parse --short HEAD)
+ local DATE=$(date "+%Y-%m-%d")
+ local VERSION=$(echo "bwLehrpool/$DIST $DATE/$GITC" | escape_replace)
+ mkdir -p "$TARGET_BUILD_DIR/opt/openslx/etc"
+ sed "s/%version%/$VERSION/g" "$MODULE_DIR/templates/issue.template" > "$TARGET_BUILD_DIR/opt/openslx/etc/issue.template" || perror "Could not create issue template"
+
+}
+
diff --git a/core/rootfs/rootfs-stage32/module.conf b/core/rootfs/rootfs-stage32/module.conf
new file mode 100644
index 00000000..0e62ab55
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/module.conf
@@ -0,0 +1,261 @@
+REQUIRED_MODULES="
+ kernel
+"
+REQUIRED_BINARIES="
+ bash
+ dmesg
+ curl
+ less
+ agetty
+ loadkeys
+ setfont
+ login
+ sulogin
+ mount
+ umount
+ mount.nfs4
+ umount.nfs4
+ mkfs.xfs
+ mkfs.ext3
+ mkfs.ext4
+ blkid
+ modprobe
+ insmod
+ lsmod
+ rm
+ kill
+ ps
+ scp
+ ssh
+ tput
+ xterm
+ bc
+ dirname
+ mkdosfs
+ iptables
+ rdns
+ find
+ rpcbind
+ rpc.statd
+ pkill
+ getent
+ ldconfig
+ grep
+ date
+ cat
+ ls
+ awk
+ sed
+"
+REQUIRED_LIBRARIES="
+ libcap
+ libcidn
+ libcom_err
+ libcrypt
+ libcrypto
+ libnsl
+ libnss_compat
+ libnss_dns
+ libnss_files
+ libnss_hesiod
+ libnss_nis
+ libnss_nisplus
+ libnss_mdns
+ libpam
+ libutil
+ libtinfo
+ libresolv
+"
+REQUIRED_FILES="
+ /etc/inputrc
+ /etc/localtime
+ /etc/login.defs
+ /etc/securetty
+ /etc/protocols
+ /etc/services
+ /etc/networks
+ /etc/netconfig
+ /etc/fonts/fonts.conf
+"
+REQUIRED_KERNEL_MODULES="
+ kernel/drivers/cpufreq
+ kernel/drivers/memstick
+ kernel/drivers/mfd
+ kernel/drivers/gpio
+ kernel/drivers/block
+ kernel/drivers/uwb
+ kernel/drivers/w1
+ kernel/drivers/regulator
+ kernel/drivers/leds
+ kernel/drivers/firmware
+ kernel/drivers/watchdog
+ kernel/drivers/media/rc
+ kernel/drivers/media/video
+ kernel/drivers/media/common
+ kernel/drivers/mmc
+ kernel/drivers/staging
+ kernel/drivers/firewire
+ kernel/drivers/bluetooth
+ kernel/drivers/power
+ kernel/drivers/video
+ kernel/drivers/uio
+ kernel/drivers/md
+ kernel/drivers/virtio
+ kernel/drivers/pci
+ kernel/drivers/acpi
+ kernel/drivers/input
+ kernel/drivers/ssb
+ kernel/drivers/spi
+ kernel/drivers/crypto
+ kernel/drivers/bcma
+ kernel/drivers/nfc
+ kernel/drivers/usb
+ kernel/drivers/char
+ kernel/drivers/vhost
+ kernel/drivers/i2c
+ kernel/drivers/ata
+ kernel/drivers/tty
+ kernel/drivers/parport
+ kernel/drivers/misc
+ kernel/drivers/scsi
+ kernel/drivers/message
+ kernel/drivers/auxdisplay
+ kernel/drivers/target
+ kernel/drivers/dca
+ kernel/drivers/dma
+ kernel/drivers/rtc
+ kernel/drivers/pps
+ kernel/drivers/hid
+ kernel/drivers/atm
+ kernel/drivers/platform
+ kernel/drivers/edac
+ kernel/drivers/hv
+ kernel/drivers/idle
+ kernel/drivers/xen
+ kernel/ubuntu/aufs
+ kernel/arch
+ kernel/lib
+ kernel/fs
+ kernel/crypto
+ kernel/net
+ kernel/sound
+ kernel/fs/autofs4/autofs4
+ kernel/drivers/net/macvtap.ko
+ kernel/drivers/net/veth.ko
+ kernel/drivers/net/vxlan.ko
+ kernel/net/openvswitch/openvswitch.ko
+"
+REQUIRED_FIRMWARE="
+ 3com
+ acenic
+ adaptec
+ advansys
+ ar3k
+ asihpi
+ av7110
+ bnx2
+ bnx2x
+ brcm
+ cis
+ cpia2
+ cxgb3
+ cxgb4
+ dabusb
+ dsp56k
+ e100
+ ea
+ edgeport
+ emi26
+ emi62
+ ene-ub6250
+ ess
+ hp
+ isci
+ kaweth
+ keyspan
+ keyspan_pda
+ korg
+ libertas
+ matrox
+ mrvl
+ mwl8k
+ ositech
+ r128
+ radeon
+ RTL8192E
+ RTL8192SE
+ rtl_nic
+ sb16
+ scripts
+ slicoss
+ sun
+ sxg
+ tehuti
+ ti-connectivity
+ tigon
+ ttusb-budget
+ ueagle-atm
+ usbdux
+ vicam
+ vxge
+ yam
+ yamaha
+ agere_ap_fw.bin
+ agere_sta_fw.bin
+ aic94xx-seq.fw
+ ath3k-1.fw
+ atmel_at76c502_3com.bin
+ atmel_at76c502.bin
+ atmel_at76c502d.bin
+ atmel_at76c502e.bin
+ atmel_at76c504_2958.bin
+ atmel_at76c504a_2958.bin
+ atmel_at76c504.bin
+ atmel_at76c506.bin
+ atmsar11.fw
+ carl9170-1.fw
+ f2255usb.bin
+ GPL-3
+ htc_7010.fw
+ htc_9271.fw
+ i2400m-fw-usb-1.4.sbcf
+ i2400m-fw-usb-1.5.sbcf
+ i6050-fw-usb-1.5.sbcf
+ intelliport2.bin
+ lbtf_usb.bin
+ lgs8g75.fw
+ mts_cdma.fw
+ mts_edge.fw
+ mts_gsm.fw
+ mts_mt9234mu.fw
+ mts_mt9234zba.fw
+ mwl8335_duplex.fw
+ NPE-B
+ NPE-C
+ phanfw.bin
+ rt2561.bin
+ rt2561s.bin
+ rt2661.bin
+ rt2860.bin
+ rt2870.bin
+ rt3070.bin
+ rt3071.bin
+ rt3090.bin
+ rt73.bin
+ s2250.fw
+ s2250_loader.fw
+ TDA7706_OM_v2.5.1_boot.txt
+ TDA7706_OM_v3.0.2_boot.txt
+ ti_3410.fw
+ ti_5052.fw
+ tlg2300_firmware.bin
+ tr_smctr.bin
+ usbduxfast_firmware.bin
+ usbdux_firmware.bin
+ usbduxsigma_firmware.bin
+ vntwusb.fw
+ WHENCE.ubuntu
+ whiteheat.fw
+ whiteheat_loader.fw
+"
+
diff --git a/core/rootfs/rootfs-stage32/module.conf.centos b/core/rootfs/rootfs-stage32/module.conf.centos
new file mode 100644
index 00000000..b48da75e
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/module.conf.centos
@@ -0,0 +1,16 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nfs-utils
+ xfsprogs
+ squashfs-tools
+ curl
+ xvidtune
+ xterm
+"
+REQUIRED_CONTENT_PACKAGES="
+"
+REQUIRED_DIRECTORIES="
+ /usr/$LIB64/xtables
+"
+REQUIRED_FILES+="
+ /usr/share/X11/app-defaults/Xvidtune
+"
diff --git a/core/rootfs/rootfs-stage32/module.conf.debian b/core/rootfs/rootfs-stage32/module.conf.debian
new file mode 100644
index 00000000..fbf489e7
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/module.conf.debian
@@ -0,0 +1,19 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nfs-common
+ squashfs-tools
+ whois
+ xfsprogs
+ firmware-linux-free
+ curl
+ jfsutils
+ libssl-dev
+"
+REQUIRED_CONTENT_PACKAGES="
+
+"
+REQUIRED_DIRECTORIES="
+ /lib/xtables
+"
+REQUIRED_FILES+="
+ /etc/X11/app-defaults/Xvidtune
+"
diff --git a/core/rootfs/rootfs-stage32/module.conf.fedora b/core/rootfs/rootfs-stage32/module.conf.fedora
new file mode 100644
index 00000000..b48da75e
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/module.conf.fedora
@@ -0,0 +1,16 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nfs-utils
+ xfsprogs
+ squashfs-tools
+ curl
+ xvidtune
+ xterm
+"
+REQUIRED_CONTENT_PACKAGES="
+"
+REQUIRED_DIRECTORIES="
+ /usr/$LIB64/xtables
+"
+REQUIRED_FILES+="
+ /usr/share/X11/app-defaults/Xvidtune
+"
diff --git a/core/rootfs/rootfs-stage32/module.conf.opensuse b/core/rootfs/rootfs-stage32/module.conf.opensuse
new file mode 100644
index 00000000..a9601b88
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/module.conf.opensuse
@@ -0,0 +1,22 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nfs-client
+ xfsprogs
+ squashfs
+ timezone
+ libcap2
+ jfsutils
+ curl
+"
+REQUIRED_CONTENT_PACKAGES="
+ timezone
+ libcap2
+"
+REQUIRED_DIRECTORIES="
+ /usr/$LIB64/xtables
+"
+REQUIRED_FILES+="
+ /usr/share/X11/app-defaults/Xvidtune
+"
+REQUIRED_KERNEL_MODULES+="
+ kernel/drivers/cdrom
+"
diff --git a/core/rootfs/rootfs-stage32/module.conf.opensuse.13.1 b/core/rootfs/rootfs-stage32/module.conf.opensuse.13.1
new file mode 100644
index 00000000..aa7f8afb
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/module.conf.opensuse.13.1
@@ -0,0 +1,20 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nfs-client
+ xfsprogs
+ squashfs
+ timezone
+ libcap2
+ jfsutils
+ curl
+ xvidtune
+"
+REQUIRED_CONTENT_PACKAGES="
+ timezone
+ libcap2
+"
+REQUIRED_DIRECTORIES="
+ /usr/$LIB64/xtables
+"
+REQUIRED_FILES+="
+ /usr/share/X11/app-defaults/Xvidtune
+"
diff --git a/core/rootfs/rootfs-stage32/module.conf.opensuse.13.2 b/core/rootfs/rootfs-stage32/module.conf.opensuse.13.2
new file mode 100644
index 00000000..aa7f8afb
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/module.conf.opensuse.13.2
@@ -0,0 +1,20 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nfs-client
+ xfsprogs
+ squashfs
+ timezone
+ libcap2
+ jfsutils
+ curl
+ xvidtune
+"
+REQUIRED_CONTENT_PACKAGES="
+ timezone
+ libcap2
+"
+REQUIRED_DIRECTORIES="
+ /usr/$LIB64/xtables
+"
+REQUIRED_FILES+="
+ /usr/share/X11/app-defaults/Xvidtune
+"
diff --git a/core/rootfs/rootfs-stage32/module.conf.ubuntu b/core/rootfs/rootfs-stage32/module.conf.ubuntu
new file mode 100644
index 00000000..77c68cef
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/module.conf.ubuntu
@@ -0,0 +1,21 @@
+REQUIRED_INSTALLED_PACKAGES="
+ nfs-common
+ squashfs-tools
+ whois
+ xfsprogs
+ curl
+ openssl
+"
+REQUIRED_CONTENT_PACKAGES="
+ openssl
+"
+REQUIRED_BINARIES+="
+ openssl
+"
+REQUIRED_DIRECTORIES="
+ /lib/xtables
+"
+REQUIRED_FILES+="
+ /etc/X11/app-defaults/Xvidtune
+ /usr/lib/ssl/openssl.cnf
+"
diff --git a/core/rootfs/rootfs-stage32/rdns.c b/core/rootfs/rootfs-stage32/rdns.c
new file mode 100644
index 00000000..218f7400
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/rdns.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <errno.h>
+#include <netdb.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+int main(int argc, char *argv[])
+{
+ if (argc != 2) {
+ fprintf(stderr,"usage: %s <IPADDRESS>\n", argv[0]);
+ return 1;
+ }
+
+ struct hostent *he;
+ struct in_addr ipv4addr;
+ struct in6_addr ipv6addr;
+
+ inet_pton(AF_INET, argv[1], &ipv4addr);
+ he = gethostbyaddr(&ipv4addr, sizeof ipv4addr, AF_INET);
+ if (he == NULL) return 2;
+ if (he->h_name == NULL) return 3;
+ printf("%s\n", he->h_name);
+
+ return 0;
+}
+
diff --git a/core/rootfs/rootfs-stage32/templates/issue.template b/core/rootfs/rootfs-stage32/templates/issue.template
new file mode 100644
index 00000000..a79797ad
--- /dev/null
+++ b/core/rootfs/rootfs-stage32/templates/issue.template
@@ -0,0 +1,9 @@
+ WELCOME TO %space% \n (\l)
+ _____ ______ ______ __ __ _______ __ __ __
+ / _ | _ | ___| | | | | ____| | | | | |
+ | | | | |_| | |_ | | | | |___ | | / /
+ | | | | ___/| _| | | ____ | | | |
+ | |_| | | | |___| | | | ____| | |___ / /
+ _____/|__| |______|__| |__| |_______|______|__| |__| - NG
+
+ %version% (c) <OpenSLX.ORG>
diff --git a/core/targets/debug/debug b/core/targets/debug/debug
new file mode 120000
index 00000000..c05237d6
--- /dev/null
+++ b/core/targets/debug/debug
@@ -0,0 +1 @@
+../../modules/debug \ No newline at end of file
diff --git a/core/targets/nvidia_libs/nvidia_libs b/core/targets/nvidia_libs/nvidia_libs
new file mode 120000
index 00000000..27f398eb
--- /dev/null
+++ b/core/targets/nvidia_libs/nvidia_libs
@@ -0,0 +1 @@
+../../modules/nvidia_libs \ No newline at end of file
diff --git a/core/targets/qemukvm/qemukvm b/core/targets/qemukvm/qemukvm
new file mode 120000
index 00000000..e8e7d1b3
--- /dev/null
+++ b/core/targets/qemukvm/qemukvm
@@ -0,0 +1 @@
+../../modules/qemukvm \ No newline at end of file
diff --git a/core/targets/stage31/busybox b/core/targets/stage31/busybox
new file mode 120000
index 00000000..4f45cedf
--- /dev/null
+++ b/core/targets/stage31/busybox
@@ -0,0 +1 @@
+../../modules/busybox \ No newline at end of file
diff --git a/core/targets/stage31/kernel b/core/targets/stage31/kernel
new file mode 120000
index 00000000..044f086d
--- /dev/null
+++ b/core/targets/stage31/kernel
@@ -0,0 +1 @@
+../../modules/kernel \ No newline at end of file
diff --git a/core/targets/stage31/rootfs-stage31 b/core/targets/stage31/rootfs-stage31
new file mode 120000
index 00000000..05a91970
--- /dev/null
+++ b/core/targets/stage31/rootfs-stage31
@@ -0,0 +1 @@
+../../rootfs/rootfs-stage31 \ No newline at end of file
diff --git a/core/targets/stage31/splash-openslx b/core/targets/stage31/splash-openslx
new file mode 120000
index 00000000..ca44930e
--- /dev/null
+++ b/core/targets/stage31/splash-openslx
@@ -0,0 +1 @@
+../../modules/splash-openslx \ No newline at end of file
diff --git a/core/targets/stage32-headless/cpugovernor b/core/targets/stage32-headless/cpugovernor
new file mode 120000
index 00000000..544c1e19
--- /dev/null
+++ b/core/targets/stage32-headless/cpugovernor
@@ -0,0 +1 @@
+../../modules/cpugovernor \ No newline at end of file
diff --git a/core/targets/stage32-headless/cron b/core/targets/stage32-headless/cron
new file mode 120000
index 00000000..39164da5
--- /dev/null
+++ b/core/targets/stage32-headless/cron
@@ -0,0 +1 @@
+../../modules/cron \ No newline at end of file
diff --git a/core/targets/stage32-headless/dbus b/core/targets/stage32-headless/dbus
new file mode 120000
index 00000000..dd148715
--- /dev/null
+++ b/core/targets/stage32-headless/dbus
@@ -0,0 +1 @@
+../../modules/dbus \ No newline at end of file
diff --git a/core/targets/stage32-headless/dhcpc-busybox b/core/targets/stage32-headless/dhcpc-busybox
new file mode 120000
index 00000000..ea3634e6
--- /dev/null
+++ b/core/targets/stage32-headless/dhcpc-busybox
@@ -0,0 +1 @@
+../../modules/dhcpc-busybox \ No newline at end of file
diff --git a/core/targets/stage32-headless/dnbd3 b/core/targets/stage32-headless/dnbd3
new file mode 120000
index 00000000..fa80b45c
--- /dev/null
+++ b/core/targets/stage32-headless/dnbd3
@@ -0,0 +1 @@
+../../modules/dnbd3 \ No newline at end of file
diff --git a/core/targets/stage32-headless/german b/core/targets/stage32-headless/german
new file mode 120000
index 00000000..4469f96e
--- /dev/null
+++ b/core/targets/stage32-headless/german
@@ -0,0 +1 @@
+../../modules/german \ No newline at end of file
diff --git a/core/targets/stage32-headless/idleaction b/core/targets/stage32-headless/idleaction
new file mode 120000
index 00000000..09fd9493
--- /dev/null
+++ b/core/targets/stage32-headless/idleaction
@@ -0,0 +1 @@
+../../modules/idleaction \ No newline at end of file
diff --git a/core/targets/stage32-headless/kernel b/core/targets/stage32-headless/kernel
new file mode 120000
index 00000000..044f086d
--- /dev/null
+++ b/core/targets/stage32-headless/kernel
@@ -0,0 +1 @@
+../../modules/kernel \ No newline at end of file
diff --git a/core/targets/stage32-headless/nscd b/core/targets/stage32-headless/nscd
new file mode 120000
index 00000000..d7e411d2
--- /dev/null
+++ b/core/targets/stage32-headless/nscd
@@ -0,0 +1 @@
+../../modules/nscd \ No newline at end of file
diff --git a/core/targets/stage32-headless/pam b/core/targets/stage32-headless/pam
new file mode 120000
index 00000000..588acdbf
--- /dev/null
+++ b/core/targets/stage32-headless/pam
@@ -0,0 +1 @@
+../../modules/pam \ No newline at end of file
diff --git a/core/targets/stage32-headless/rootfs-stage32 b/core/targets/stage32-headless/rootfs-stage32
new file mode 120000
index 00000000..96dcbb86
--- /dev/null
+++ b/core/targets/stage32-headless/rootfs-stage32
@@ -0,0 +1 @@
+../../rootfs/rootfs-stage32 \ No newline at end of file
diff --git a/core/targets/stage32-headless/rsyslogd b/core/targets/stage32-headless/rsyslogd
new file mode 120000
index 00000000..339d02f8
--- /dev/null
+++ b/core/targets/stage32-headless/rsyslogd
@@ -0,0 +1 @@
+../../modules/rsyslogd \ No newline at end of file
diff --git a/core/targets/stage32-headless/smartctl b/core/targets/stage32-headless/smartctl
new file mode 120000
index 00000000..3a48434f
--- /dev/null
+++ b/core/targets/stage32-headless/smartctl
@@ -0,0 +1 @@
+../../modules/smartctl \ No newline at end of file
diff --git a/core/targets/stage32-headless/sshd b/core/targets/stage32-headless/sshd
new file mode 120000
index 00000000..56b4e4b5
--- /dev/null
+++ b/core/targets/stage32-headless/sshd
@@ -0,0 +1 @@
+../../modules/sshd \ No newline at end of file
diff --git a/core/targets/stage32-headless/systemd b/core/targets/stage32-headless/systemd
new file mode 120000
index 00000000..2dc58bd3
--- /dev/null
+++ b/core/targets/stage32-headless/systemd
@@ -0,0 +1 @@
+../../modules/systemd \ No newline at end of file
diff --git a/core/targets/stage32-headless/xorg b/core/targets/stage32-headless/xorg
new file mode 120000
index 00000000..a9494860
--- /dev/null
+++ b/core/targets/stage32-headless/xorg
@@ -0,0 +1 @@
+../../modules/xorg \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/busybox b/core/targets/stage32-lightdm/busybox
new file mode 120000
index 00000000..4f45cedf
--- /dev/null
+++ b/core/targets/stage32-lightdm/busybox
@@ -0,0 +1 @@
+../../modules/busybox \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/consolekit b/core/targets/stage32-lightdm/consolekit
new file mode 120000
index 00000000..261968c7
--- /dev/null
+++ b/core/targets/stage32-lightdm/consolekit
@@ -0,0 +1 @@
+../../modules/consolekit \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/cpugovernor b/core/targets/stage32-lightdm/cpugovernor
new file mode 120000
index 00000000..544c1e19
--- /dev/null
+++ b/core/targets/stage32-lightdm/cpugovernor
@@ -0,0 +1 @@
+../../modules/cpugovernor \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/dbus b/core/targets/stage32-lightdm/dbus
new file mode 120000
index 00000000..dd148715
--- /dev/null
+++ b/core/targets/stage32-lightdm/dbus
@@ -0,0 +1 @@
+../../modules/dbus \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/debug b/core/targets/stage32-lightdm/debug
new file mode 120000
index 00000000..c05237d6
--- /dev/null
+++ b/core/targets/stage32-lightdm/debug
@@ -0,0 +1 @@
+../../modules/debug \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/ldm b/core/targets/stage32-lightdm/ldm
new file mode 120000
index 00000000..0ee07888
--- /dev/null
+++ b/core/targets/stage32-lightdm/ldm
@@ -0,0 +1 @@
+../../modules/ldm \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/ldm-gtk-greeter b/core/targets/stage32-lightdm/ldm-gtk-greeter
new file mode 120000
index 00000000..82ef14e4
--- /dev/null
+++ b/core/targets/stage32-lightdm/ldm-gtk-greeter
@@ -0,0 +1 @@
+../../modules/ldm-gtk-greeter/ \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/policykit b/core/targets/stage32-lightdm/policykit
new file mode 120000
index 00000000..39b77c7f
--- /dev/null
+++ b/core/targets/stage32-lightdm/policykit
@@ -0,0 +1 @@
+../../modules/policykit \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/rootfs-stage32 b/core/targets/stage32-lightdm/rootfs-stage32
new file mode 120000
index 00000000..96dcbb86
--- /dev/null
+++ b/core/targets/stage32-lightdm/rootfs-stage32
@@ -0,0 +1 @@
+../../rootfs/rootfs-stage32 \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/rsyslogd b/core/targets/stage32-lightdm/rsyslogd
new file mode 120000
index 00000000..339d02f8
--- /dev/null
+++ b/core/targets/stage32-lightdm/rsyslogd
@@ -0,0 +1 @@
+../../modules/rsyslogd \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/sshd b/core/targets/stage32-lightdm/sshd
new file mode 120000
index 00000000..56b4e4b5
--- /dev/null
+++ b/core/targets/stage32-lightdm/sshd
@@ -0,0 +1 @@
+../../modules/sshd \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/systemd b/core/targets/stage32-lightdm/systemd
new file mode 120000
index 00000000..2dc58bd3
--- /dev/null
+++ b/core/targets/stage32-lightdm/systemd
@@ -0,0 +1 @@
+../../modules/systemd \ No newline at end of file
diff --git a/core/targets/stage32-lightdm/xorg b/core/targets/stage32-lightdm/xorg
new file mode 120000
index 00000000..a9494860
--- /dev/null
+++ b/core/targets/stage32-lightdm/xorg
@@ -0,0 +1 @@
+../../modules/xorg \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/alsa b/core/targets/stage32-opensuse/alsa
new file mode 120000
index 00000000..7e13d263
--- /dev/null
+++ b/core/targets/stage32-opensuse/alsa
@@ -0,0 +1 @@
+../../modules/alsa \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/beamergui b/core/targets/stage32-opensuse/beamergui
new file mode 120000
index 00000000..5e863316
--- /dev/null
+++ b/core/targets/stage32-opensuse/beamergui
@@ -0,0 +1 @@
+../../modules/beamergui \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/consolekit b/core/targets/stage32-opensuse/consolekit
new file mode 120000
index 00000000..261968c7
--- /dev/null
+++ b/core/targets/stage32-opensuse/consolekit
@@ -0,0 +1 @@
+../../modules/consolekit \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/cpugovernor b/core/targets/stage32-opensuse/cpugovernor
new file mode 120000
index 00000000..544c1e19
--- /dev/null
+++ b/core/targets/stage32-opensuse/cpugovernor
@@ -0,0 +1 @@
+../../modules/cpugovernor \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/cron b/core/targets/stage32-opensuse/cron
new file mode 120000
index 00000000..39164da5
--- /dev/null
+++ b/core/targets/stage32-opensuse/cron
@@ -0,0 +1 @@
+../../modules/cron \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/cups b/core/targets/stage32-opensuse/cups
new file mode 120000
index 00000000..0ff7101d
--- /dev/null
+++ b/core/targets/stage32-opensuse/cups
@@ -0,0 +1 @@
+../../modules/cups \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/dbus b/core/targets/stage32-opensuse/dbus
new file mode 120000
index 00000000..dd148715
--- /dev/null
+++ b/core/targets/stage32-opensuse/dbus
@@ -0,0 +1 @@
+../../modules/dbus \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/debug b/core/targets/stage32-opensuse/debug
new file mode 120000
index 00000000..c05237d6
--- /dev/null
+++ b/core/targets/stage32-opensuse/debug
@@ -0,0 +1 @@
+../../modules/debug \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/dhcpc-busybox b/core/targets/stage32-opensuse/dhcpc-busybox
new file mode 120000
index 00000000..ea3634e6
--- /dev/null
+++ b/core/targets/stage32-opensuse/dhcpc-busybox
@@ -0,0 +1 @@
+../../modules/dhcpc-busybox \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/dnbd3 b/core/targets/stage32-opensuse/dnbd3
new file mode 120000
index 00000000..fa80b45c
--- /dev/null
+++ b/core/targets/stage32-opensuse/dnbd3
@@ -0,0 +1 @@
+../../modules/dnbd3 \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/german b/core/targets/stage32-opensuse/german
new file mode 120000
index 00000000..4469f96e
--- /dev/null
+++ b/core/targets/stage32-opensuse/german
@@ -0,0 +1 @@
+../../modules/german \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/idleaction b/core/targets/stage32-opensuse/idleaction
new file mode 120000
index 00000000..09fd9493
--- /dev/null
+++ b/core/targets/stage32-opensuse/idleaction
@@ -0,0 +1 @@
+../../modules/idleaction \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/iptables-helper b/core/targets/stage32-opensuse/iptables-helper
new file mode 120000
index 00000000..e449282d
--- /dev/null
+++ b/core/targets/stage32-opensuse/iptables-helper
@@ -0,0 +1 @@
+../../modules/iptables-helper \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/kdm b/core/targets/stage32-opensuse/kdm
new file mode 120000
index 00000000..727ed5b5
--- /dev/null
+++ b/core/targets/stage32-opensuse/kdm
@@ -0,0 +1 @@
+../../modules/kdm \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/kernel b/core/targets/stage32-opensuse/kernel
new file mode 120000
index 00000000..044f086d
--- /dev/null
+++ b/core/targets/stage32-opensuse/kernel
@@ -0,0 +1 @@
+../../modules/kernel \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/nscd b/core/targets/stage32-opensuse/nscd
new file mode 120000
index 00000000..d7e411d2
--- /dev/null
+++ b/core/targets/stage32-opensuse/nscd
@@ -0,0 +1 @@
+../../modules/nscd \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/openbox b/core/targets/stage32-opensuse/openbox
new file mode 120000
index 00000000..0fb8d86d
--- /dev/null
+++ b/core/targets/stage32-opensuse/openbox
@@ -0,0 +1 @@
+../../modules/openbox \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/pam b/core/targets/stage32-opensuse/pam
new file mode 120000
index 00000000..588acdbf
--- /dev/null
+++ b/core/targets/stage32-opensuse/pam
@@ -0,0 +1 @@
+../../modules/pam \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/polkit b/core/targets/stage32-opensuse/polkit
new file mode 120000
index 00000000..0ad0b111
--- /dev/null
+++ b/core/targets/stage32-opensuse/polkit
@@ -0,0 +1 @@
+../../modules/polkit \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/printergui b/core/targets/stage32-opensuse/printergui
new file mode 120000
index 00000000..6ccbb628
--- /dev/null
+++ b/core/targets/stage32-opensuse/printergui
@@ -0,0 +1 @@
+../../modules/printergui \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/redsocks b/core/targets/stage32-opensuse/redsocks
new file mode 120000
index 00000000..0740c53b
--- /dev/null
+++ b/core/targets/stage32-opensuse/redsocks
@@ -0,0 +1 @@
+../../modules/redsocks \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/rootfs-stage32 b/core/targets/stage32-opensuse/rootfs-stage32
new file mode 120000
index 00000000..96dcbb86
--- /dev/null
+++ b/core/targets/stage32-opensuse/rootfs-stage32
@@ -0,0 +1 @@
+../../rootfs/rootfs-stage32 \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/rsyslogd b/core/targets/stage32-opensuse/rsyslogd
new file mode 120000
index 00000000..339d02f8
--- /dev/null
+++ b/core/targets/stage32-opensuse/rsyslogd
@@ -0,0 +1 @@
+../../modules/rsyslogd \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/run-virt b/core/targets/stage32-opensuse/run-virt
new file mode 120000
index 00000000..1e4a476c
--- /dev/null
+++ b/core/targets/stage32-opensuse/run-virt
@@ -0,0 +1 @@
+../../modules/run-virt \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/smartctl b/core/targets/stage32-opensuse/smartctl
new file mode 120000
index 00000000..3a48434f
--- /dev/null
+++ b/core/targets/stage32-opensuse/smartctl
@@ -0,0 +1 @@
+../../modules/smartctl \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/sshd b/core/targets/stage32-opensuse/sshd
new file mode 120000
index 00000000..56b4e4b5
--- /dev/null
+++ b/core/targets/stage32-opensuse/sshd
@@ -0,0 +1 @@
+../../modules/sshd \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/systemd b/core/targets/stage32-opensuse/systemd
new file mode 120000
index 00000000..2dc58bd3
--- /dev/null
+++ b/core/targets/stage32-opensuse/systemd
@@ -0,0 +1 @@
+../../modules/systemd \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/udisks b/core/targets/stage32-opensuse/udisks
new file mode 120000
index 00000000..06e7da5f
--- /dev/null
+++ b/core/targets/stage32-opensuse/udisks
@@ -0,0 +1 @@
+../../modules/udisks \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/vmchooser b/core/targets/stage32-opensuse/vmchooser
new file mode 120000
index 00000000..d918fbdc
--- /dev/null
+++ b/core/targets/stage32-opensuse/vmchooser
@@ -0,0 +1 @@
+../../modules/vmchooser \ No newline at end of file
diff --git a/core/targets/stage32-opensuse/xorg b/core/targets/stage32-opensuse/xorg
new file mode 120000
index 00000000..a9494860
--- /dev/null
+++ b/core/targets/stage32-opensuse/xorg
@@ -0,0 +1 @@
+../../modules/xorg \ No newline at end of file
diff --git a/core/targets/stage32-scientific/alsa b/core/targets/stage32-scientific/alsa
new file mode 120000
index 00000000..7e13d263
--- /dev/null
+++ b/core/targets/stage32-scientific/alsa
@@ -0,0 +1 @@
+../../modules/alsa \ No newline at end of file
diff --git a/core/targets/stage32-scientific/cpugovernor b/core/targets/stage32-scientific/cpugovernor
new file mode 120000
index 00000000..544c1e19
--- /dev/null
+++ b/core/targets/stage32-scientific/cpugovernor
@@ -0,0 +1 @@
+../../modules/cpugovernor \ No newline at end of file
diff --git a/core/targets/stage32-scientific/dbus b/core/targets/stage32-scientific/dbus
new file mode 120000
index 00000000..dd148715
--- /dev/null
+++ b/core/targets/stage32-scientific/dbus
@@ -0,0 +1 @@
+../../modules/dbus \ No newline at end of file
diff --git a/core/targets/stage32-scientific/debug b/core/targets/stage32-scientific/debug
new file mode 120000
index 00000000..c05237d6
--- /dev/null
+++ b/core/targets/stage32-scientific/debug
@@ -0,0 +1 @@
+../../modules/debug \ No newline at end of file
diff --git a/core/targets/stage32-scientific/german b/core/targets/stage32-scientific/german
new file mode 120000
index 00000000..4469f96e
--- /dev/null
+++ b/core/targets/stage32-scientific/german
@@ -0,0 +1 @@
+../../modules/german \ No newline at end of file
diff --git a/core/targets/stage32-scientific/kdm b/core/targets/stage32-scientific/kdm
new file mode 120000
index 00000000..727ed5b5
--- /dev/null
+++ b/core/targets/stage32-scientific/kdm
@@ -0,0 +1 @@
+../../modules/kdm \ No newline at end of file
diff --git a/core/targets/stage32-scientific/kernel b/core/targets/stage32-scientific/kernel
new file mode 120000
index 00000000..044f086d
--- /dev/null
+++ b/core/targets/stage32-scientific/kernel
@@ -0,0 +1 @@
+../../modules/kernel \ No newline at end of file
diff --git a/core/targets/stage32-scientific/nscd b/core/targets/stage32-scientific/nscd
new file mode 120000
index 00000000..d7e411d2
--- /dev/null
+++ b/core/targets/stage32-scientific/nscd
@@ -0,0 +1 @@
+../../modules/nscd \ No newline at end of file
diff --git a/core/targets/stage32-scientific/openbox b/core/targets/stage32-scientific/openbox
new file mode 120000
index 00000000..0fb8d86d
--- /dev/null
+++ b/core/targets/stage32-scientific/openbox
@@ -0,0 +1 @@
+../../modules/openbox \ No newline at end of file
diff --git a/core/targets/stage32-scientific/pam b/core/targets/stage32-scientific/pam
new file mode 120000
index 00000000..588acdbf
--- /dev/null
+++ b/core/targets/stage32-scientific/pam
@@ -0,0 +1 @@
+../../modules/pam \ No newline at end of file
diff --git a/core/targets/stage32-scientific/policykit b/core/targets/stage32-scientific/policykit
new file mode 120000
index 00000000..39b77c7f
--- /dev/null
+++ b/core/targets/stage32-scientific/policykit
@@ -0,0 +1 @@
+../../modules/policykit \ No newline at end of file
diff --git a/core/targets/stage32-scientific/rootfs-stage32 b/core/targets/stage32-scientific/rootfs-stage32
new file mode 120000
index 00000000..96dcbb86
--- /dev/null
+++ b/core/targets/stage32-scientific/rootfs-stage32
@@ -0,0 +1 @@
+../../rootfs/rootfs-stage32 \ No newline at end of file
diff --git a/core/targets/stage32-scientific/rsyslogd b/core/targets/stage32-scientific/rsyslogd
new file mode 120000
index 00000000..339d02f8
--- /dev/null
+++ b/core/targets/stage32-scientific/rsyslogd
@@ -0,0 +1 @@
+../../modules/rsyslogd \ No newline at end of file
diff --git a/core/targets/stage32-scientific/sshd b/core/targets/stage32-scientific/sshd
new file mode 120000
index 00000000..56b4e4b5
--- /dev/null
+++ b/core/targets/stage32-scientific/sshd
@@ -0,0 +1 @@
+../../modules/sshd \ No newline at end of file
diff --git a/core/targets/stage32-scientific/systemd b/core/targets/stage32-scientific/systemd
new file mode 120000
index 00000000..2dc58bd3
--- /dev/null
+++ b/core/targets/stage32-scientific/systemd
@@ -0,0 +1 @@
+../../modules/systemd \ No newline at end of file
diff --git a/core/targets/stage32-scientific/vmchooser b/core/targets/stage32-scientific/vmchooser
new file mode 120000
index 00000000..d918fbdc
--- /dev/null
+++ b/core/targets/stage32-scientific/vmchooser
@@ -0,0 +1 @@
+../../modules/vmchooser \ No newline at end of file
diff --git a/core/targets/stage32-scientific/vmplayer b/core/targets/stage32-scientific/vmplayer
new file mode 120000
index 00000000..9303aa6a
--- /dev/null
+++ b/core/targets/stage32-scientific/vmplayer
@@ -0,0 +1 @@
+../../modules/vmplayer \ No newline at end of file
diff --git a/core/targets/stage32-scientific/xorg b/core/targets/stage32-scientific/xorg
new file mode 120000
index 00000000..a9494860
--- /dev/null
+++ b/core/targets/stage32-scientific/xorg
@@ -0,0 +1 @@
+../../modules/xorg \ No newline at end of file
diff --git a/core/targets/stage32/alsa b/core/targets/stage32/alsa
new file mode 120000
index 00000000..7e13d263
--- /dev/null
+++ b/core/targets/stage32/alsa
@@ -0,0 +1 @@
+../../modules/alsa \ No newline at end of file
diff --git a/core/targets/stage32/consolekit b/core/targets/stage32/consolekit
new file mode 120000
index 00000000..261968c7
--- /dev/null
+++ b/core/targets/stage32/consolekit
@@ -0,0 +1 @@
+../../modules/consolekit \ No newline at end of file
diff --git a/core/targets/stage32/cpugovernor b/core/targets/stage32/cpugovernor
new file mode 120000
index 00000000..544c1e19
--- /dev/null
+++ b/core/targets/stage32/cpugovernor
@@ -0,0 +1 @@
+../../modules/cpugovernor \ No newline at end of file
diff --git a/core/targets/stage32/cron b/core/targets/stage32/cron
new file mode 120000
index 00000000..39164da5
--- /dev/null
+++ b/core/targets/stage32/cron
@@ -0,0 +1 @@
+../../modules/cron \ No newline at end of file
diff --git a/core/targets/stage32/cups b/core/targets/stage32/cups
new file mode 120000
index 00000000..0ff7101d
--- /dev/null
+++ b/core/targets/stage32/cups
@@ -0,0 +1 @@
+../../modules/cups \ No newline at end of file
diff --git a/core/targets/stage32/dbus b/core/targets/stage32/dbus
new file mode 120000
index 00000000..dd148715
--- /dev/null
+++ b/core/targets/stage32/dbus
@@ -0,0 +1 @@
+../../modules/dbus \ No newline at end of file
diff --git a/core/targets/stage32/dhcpc-busybox b/core/targets/stage32/dhcpc-busybox
new file mode 120000
index 00000000..ea3634e6
--- /dev/null
+++ b/core/targets/stage32/dhcpc-busybox
@@ -0,0 +1 @@
+../../modules/dhcpc-busybox \ No newline at end of file
diff --git a/core/targets/stage32/dnbd3 b/core/targets/stage32/dnbd3
new file mode 120000
index 00000000..fa80b45c
--- /dev/null
+++ b/core/targets/stage32/dnbd3
@@ -0,0 +1 @@
+../../modules/dnbd3 \ No newline at end of file
diff --git a/core/targets/stage32/german b/core/targets/stage32/german
new file mode 120000
index 00000000..4469f96e
--- /dev/null
+++ b/core/targets/stage32/german
@@ -0,0 +1 @@
+../../modules/german \ No newline at end of file
diff --git a/core/targets/stage32/kdm b/core/targets/stage32/kdm
new file mode 120000
index 00000000..727ed5b5
--- /dev/null
+++ b/core/targets/stage32/kdm
@@ -0,0 +1 @@
+../../modules/kdm \ No newline at end of file
diff --git a/core/targets/stage32/kernel b/core/targets/stage32/kernel
new file mode 120000
index 00000000..044f086d
--- /dev/null
+++ b/core/targets/stage32/kernel
@@ -0,0 +1 @@
+../../modules/kernel \ No newline at end of file
diff --git a/core/targets/stage32/nscd b/core/targets/stage32/nscd
new file mode 120000
index 00000000..d7e411d2
--- /dev/null
+++ b/core/targets/stage32/nscd
@@ -0,0 +1 @@
+../../modules/nscd \ No newline at end of file
diff --git a/core/targets/stage32/openbox b/core/targets/stage32/openbox
new file mode 120000
index 00000000..0fb8d86d
--- /dev/null
+++ b/core/targets/stage32/openbox
@@ -0,0 +1 @@
+../../modules/openbox \ No newline at end of file
diff --git a/core/targets/stage32/pam b/core/targets/stage32/pam
new file mode 120000
index 00000000..588acdbf
--- /dev/null
+++ b/core/targets/stage32/pam
@@ -0,0 +1 @@
+../../modules/pam \ No newline at end of file
diff --git a/core/targets/stage32/polkit b/core/targets/stage32/polkit
new file mode 120000
index 00000000..0ad0b111
--- /dev/null
+++ b/core/targets/stage32/polkit
@@ -0,0 +1 @@
+../../modules/polkit \ No newline at end of file
diff --git a/core/targets/stage32/redsocks b/core/targets/stage32/redsocks
new file mode 120000
index 00000000..0740c53b
--- /dev/null
+++ b/core/targets/stage32/redsocks
@@ -0,0 +1 @@
+../../modules/redsocks \ No newline at end of file
diff --git a/core/targets/stage32/rootfs-stage32 b/core/targets/stage32/rootfs-stage32
new file mode 120000
index 00000000..96dcbb86
--- /dev/null
+++ b/core/targets/stage32/rootfs-stage32
@@ -0,0 +1 @@
+../../rootfs/rootfs-stage32 \ No newline at end of file
diff --git a/core/targets/stage32/rsyslogd b/core/targets/stage32/rsyslogd
new file mode 120000
index 00000000..339d02f8
--- /dev/null
+++ b/core/targets/stage32/rsyslogd
@@ -0,0 +1 @@
+../../modules/rsyslogd \ No newline at end of file
diff --git a/core/targets/stage32/run-virt b/core/targets/stage32/run-virt
new file mode 120000
index 00000000..1e4a476c
--- /dev/null
+++ b/core/targets/stage32/run-virt
@@ -0,0 +1 @@
+../../modules/run-virt \ No newline at end of file
diff --git a/core/targets/stage32/smartctl b/core/targets/stage32/smartctl
new file mode 120000
index 00000000..3a48434f
--- /dev/null
+++ b/core/targets/stage32/smartctl
@@ -0,0 +1 @@
+../../modules/smartctl \ No newline at end of file
diff --git a/core/targets/stage32/sshd b/core/targets/stage32/sshd
new file mode 120000
index 00000000..56b4e4b5
--- /dev/null
+++ b/core/targets/stage32/sshd
@@ -0,0 +1 @@
+../../modules/sshd \ No newline at end of file
diff --git a/core/targets/stage32/systemd b/core/targets/stage32/systemd
new file mode 120000
index 00000000..2dc58bd3
--- /dev/null
+++ b/core/targets/stage32/systemd
@@ -0,0 +1 @@
+../../modules/systemd \ No newline at end of file
diff --git a/core/targets/stage32/udisks b/core/targets/stage32/udisks
new file mode 120000
index 00000000..06e7da5f
--- /dev/null
+++ b/core/targets/stage32/udisks
@@ -0,0 +1 @@
+../../modules/udisks \ No newline at end of file
diff --git a/core/targets/stage32/vmchooser b/core/targets/stage32/vmchooser
new file mode 120000
index 00000000..d918fbdc
--- /dev/null
+++ b/core/targets/stage32/vmchooser
@@ -0,0 +1 @@
+../../modules/vmchooser \ No newline at end of file
diff --git a/core/targets/stage32/xorg b/core/targets/stage32/xorg
new file mode 120000
index 00000000..a9494860
--- /dev/null
+++ b/core/targets/stage32/xorg
@@ -0,0 +1 @@
+../../modules/xorg \ No newline at end of file
diff --git a/core/targets/vbox/vbox b/core/targets/vbox/vbox
new file mode 120000
index 00000000..78b3e385
--- /dev/null
+++ b/core/targets/vbox/vbox
@@ -0,0 +1 @@
+../../modules/vbox \ No newline at end of file
diff --git a/core/targets/vmware/kernel b/core/targets/vmware/kernel
new file mode 120000
index 00000000..044f086d
--- /dev/null
+++ b/core/targets/vmware/kernel
@@ -0,0 +1 @@
+../../modules/kernel \ No newline at end of file
diff --git a/core/targets/vmware/vmware b/core/targets/vmware/vmware
new file mode 120000
index 00000000..81fa2c91
--- /dev/null
+++ b/core/targets/vmware/vmware
@@ -0,0 +1 @@
+../../modules/vmware \ No newline at end of file
diff --git a/data/kernel.wanted.config b/data/kernel.wanted.config
new file mode 100644
index 00000000..d3ffab9b
--- /dev/null
+++ b/data/kernel.wanted.config
@@ -0,0 +1,248 @@
+CONFIG_LOCALVERSION="-openslx"
+CONFIG_8139CP=y
+CONFIG_8139TOO=y
+CONFIG_8139TOO_8129=y
+CONFIG_8139TOO_PIO=y
+CONFIG_8139TOO_TUNE_TWISTER=y
+CONFIG_ACENIC=y
+CONFIG_AGP_SIS=y
+CONFIG_AGP_VIA=y
+CONFIG_ATL1=y
+CONFIG_ATL1C=y
+CONFIG_ATL1E=y
+CONFIG_ATL2=y
+CONFIG_ATP=y
+CONFIG_AUFS_BDEV_LOOP=y
+CONFIG_AUFS_BRANCH_MAX_127=y
+CONFIG_AUFS_FS=y
+CONFIG_AUFS_SBILIST=y
+CONFIG_B44=y
+CONFIG_B44_PCI=y
+CONFIG_B44_PCICORE_AUTOSELECT=y
+CONFIG_B44_PCI_AUTOSELECT=y
+CONFIG_BACKLIGHT_ADP8860=y
+CONFIG_BACKLIGHT_ADP8870=y
+CONFIG_BACKLIGHT_APPLE=y
+CONFIG_BACKLIGHT_CARILLO_RANCH=y
+CONFIG_BACKLIGHT_LP855X=y
+CONFIG_BACKLIGHT_PROGEAR=y
+CONFIG_BACKLIGHT_SAHARA=y
+CONFIG_BE2NET=y
+CONFIG_BLK_DEV_CRYPTOLOOP=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
+CONFIG_BLK_DEV_NBD=y
+CONFIG_BLK_DEV_PCIESSD_MTIP32XX=y
+CONFIG_BNA=y
+CONFIG_BNX2=y
+CONFIG_BNX2X=y
+CONFIG_CASSINI=y
+CONFIG_CHELSIO_T1=y
+CONFIG_CHELSIO_T1_1G=y
+CONFIG_CHELSIO_T3=y
+CONFIG_CHELSIO_T4=y
+CONFIG_CHELSIO_T4VF=y
+CONFIG_CNIC=y
+CONFIG_CRC16=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRYPTO_CRC32C=y
+CONFIG_DE2104X=y
+CONFIG_DE600=y
+CONFIG_DE620=y
+CONFIG_DL2K=y
+CONFIG_DM9102=y
+CONFIG_DNET=y
+CONFIG_DRM=y
+CONFIG_DRM_AST=n
+CONFIG_DRM_CIRRUS_QEMU=m
+CONFIG_DRM_GMA3600=y
+CONFIG_DRM_GMA500=m
+CONFIG_DRM_GMA600=y
+CONFIG_DRM_I2C_CH7006=m
+CONFIG_DRM_I2C_SIL164=m
+CONFIG_DRM_I810=m
+CONFIG_DRM_I915=m
+CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+CONFIG_DRM_MGA=m
+CONFIG_DRM_MGAG200=m
+CONFIG_DRM_NOUVEAU=m
+CONFIG_DRM_NOUVEAU_BACKLIGHT=y
+CONFIG_DRM_R128=m
+CONFIG_DRM_RADEON=m
+CONFIG_DRM_RADEON_KMS=y
+CONFIG_DRM_AMDGPU=m
+CONFIG_DRM_SAVAGE=m
+CONFIG_DRM_SIS=m
+CONFIG_DRM_TDFX=m
+CONFIG_DRM_TTM=m
+CONFIG_DRM_UDL=m
+CONFIG_DRM_USB=m
+CONFIG_DRM_VIA=m
+CONFIG_DRM_VMWGFX=m
+CONFIG_DRM_VMWGFX_FBCON=y
+CONFIG_DRM_BOCHS=m
+CONFIG_DRM_VIRTIO_GPU=m
+CONFIG_E1000=y
+CONFIG_E1000E=y
+CONFIG_E100=y
+CONFIG_ENIC=y
+CONFIG_EPIC100=y
+CONFIG_ETHERNET=y
+CONFIG_ETHOC=y
+CONFIG_EXPORTFS=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_EXT4_FS_XATTR=y
+CONFIG_EXT4_USE_FOR_EXT23=y
+CONFIG_EXYNOS_VIDEO=y
+CONFIG_FB_BOOT_VESA_SUPPORT=y
+CONFIG_FB_VESA=y
+CONFIG_FEALNX=y
+CONFIG_FORCEDETH=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GPIOLIB=y
+CONFIG_HAPPYMEAL=y
+CONFIG_HID_GENERIC=y
+CONFIG_HP100=y
+CONFIG_IGB=y
+CONFIG_IGBVF=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_IP1000=y
+CONFIG_INPUT_EVBUG=n
+CONFIG_IXGB=y
+CONFIG_IXGBE=y
+CONFIG_IXGBEVF=y
+CONFIG_JBD2=y
+CONFIG_JME=y
+CONFIG_KERNEL_XZ=y
+CONFIG_KS8851_MLL=y
+CONFIG_KSZ884X_PCI=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_PLATFORM=y
+CONFIG_LIBCRC32C=y
+CONFIG_MDIO=y
+CONFIG_MLX4_CORE=y
+CONFIG_MLX4_DEBUG=y
+CONFIG_MLX4_EN=y
+CONFIG_MYRI10GE=y
+CONFIG_NATSEMI=y
+CONFIG_NE2K_PCI=y
+CONFIG_NETXEN_NIC=y
+CONFIG_NET_CALXEDA_XGMAC=y
+CONFIG_NET_PACKET_ENGINE=y
+CONFIG_NET_TULIP=y
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_NET_VENDOR_8390=y
+CONFIG_NET_VENDOR_ADAPTEC=y
+CONFIG_NET_VENDOR_ALTEON=y
+CONFIG_NET_VENDOR_AMD=y
+CONFIG_NET_VENDOR_ATHEROS=y
+CONFIG_NET_VENDOR_BROADCOM=y
+CONFIG_NET_VENDOR_BROCADE=y
+CONFIG_NET_VENDOR_CHELSIO=y
+CONFIG_NET_VENDOR_CISCO=y
+CONFIG_NET_VENDOR_DEC=y
+CONFIG_NET_VENDOR_DLINK=y
+CONFIG_NET_VENDOR_EMULEX=y
+CONFIG_NET_VENDOR_EXAR=y
+CONFIG_NET_VENDOR_FUJITSU=y
+CONFIG_NET_VENDOR_HP=y
+CONFIG_NET_VENDOR_I825XX=y
+CONFIG_NET_VENDOR_INTEL=y
+CONFIG_NET_VENDOR_MARVELL=y
+CONFIG_NET_VENDOR_MELLANOX=y
+CONFIG_NET_VENDOR_MICREL=y
+CONFIG_NET_VENDOR_MYRI=y
+CONFIG_NET_VENDOR_NATSEMI=y
+CONFIG_NET_VENDOR_NVIDIA=y
+CONFIG_NET_VENDOR_OKI=y
+CONFIG_NET_VENDOR_QLOGIC=y
+CONFIG_NET_VENDOR_RDC=y
+CONFIG_NET_VENDOR_REALTEK=y
+CONFIG_NET_VENDOR_SEEQ=y
+CONFIG_NET_VENDOR_SILAN=y
+CONFIG_NET_VENDOR_SIS=y
+CONFIG_NET_VENDOR_SMSC=y
+CONFIG_NET_VENDOR_STMICRO=y
+CONFIG_NET_VENDOR_SUN=y
+CONFIG_NET_VENDOR_TEHUTI=y
+CONFIG_NET_VENDOR_TI=y
+CONFIG_NET_VENDOR_VIA=y
+CONFIG_NET_VENDOR_XIRCOM=y
+CONFIG_NIU=y
+CONFIG_NS83820=y
+CONFIG_OVERLAYFS_FS=y
+CONFIG_PACKET=y
+CONFIG_PARPORT=y
+CONFIG_PCH_GBE=y
+CONFIG_PCMCIA_XIRCOM=y
+CONFIG_PCNET32=y
+CONFIG_QLA3XXX=y
+CONFIG_QLCNIC=y
+CONFIG_QLGE=y
+CONFIG_R6040=y
+CONFIG_R8169=y
+CONFIG_S2IO=y
+CONFIG_SC92031=y
+CONFIG_SEEQ8005=y
+CONFIG_SFC=y
+CONFIG_SFC_MCDI_MON=y
+CONFIG_SIS190=y
+CONFIG_SIS900=y
+CONFIG_SKGE=y
+CONFIG_SKY2=y
+CONFIG_SMSC9420=y
+CONFIG_SMSC_PHY=y
+CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_LZO=y
+CONFIG_SQUASHFS_XATTR=y
+CONFIG_SQUASHFS_XZ=y
+CONFIG_SQUASHFS_ZLIB=y
+CONFIG_SSB=y
+CONFIG_SSB_DRIVER_PCICORE=y
+CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
+CONFIG_SSB_PCIHOST=y
+CONFIG_SSB_PCIHOST_POSSIBLE=y
+CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
+CONFIG_SSB_SPROM=y
+CONFIG_STMMAC_ETH=y
+CONFIG_STMMAC_PCI=y
+CONFIG_STMMAC_PLATFORM=y
+CONFIG_STMMAC_RING=y
+CONFIG_STUB_POULSBO=y
+CONFIG_SUNDANCE=y
+CONFIG_SUNDANCE_MMIO=y
+CONFIG_SUNGEM=y
+CONFIG_SUNGEM_PHY=y
+CONFIG_TIGON3=y
+CONFIG_TLAN=y
+CONFIG_TULIP=y
+CONFIG_TYPHOON=y
+CONFIG_UIO=y
+CONFIG_ULI526X=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+CONFIG_USB_HID=y
+CONFIG_VGASTATE=y
+CONFIG_VGA_SWITCHEROO=y
+CONFIG_VIA_RHINE=y
+CONFIG_VIA_RHINE_MMIO=y
+CONFIG_VIA_VELOCITY=y
+CONFIG_VMXNET3=y
+CONFIG_VORTEX=y
+CONFIG_VXGE=y
+CONFIG_WINBOND_840=y
+CONFIG_XFS_FS=y
+CONFIG_ZNET=y
+CONFIG_IP_PNP=n
+CONFIG_IP_PNP_DHCP=n
+CONFIG_IP_PNP_BOOTP=n
+CONFIG_IP_PNP_RARP=n
+CONFIG_RD_XZ=y
+CONFIG_IP_NF_NAT=y
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_MANGLE=y
+CONFIG_NF_NAT_MASQUERADE_IPV4=y
+
diff --git a/mltk b/mltk
new file mode 100755
index 00000000..fa4e0ae0
--- /dev/null
+++ b/mltk
@@ -0,0 +1,250 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+#
+# Copyright (c) 2014 - OpenSLX GmbH
+#
+# This program is free software distributed under the GPL version 2.
+# See http://openslx.org/COPYING
+#
+# If you have any feedback please consult http://openslx.org/feedback and
+# send your suggestions, praise, or complaints to feedback@openslx.org
+#
+# General information about OpenSLX can be found at http://openslx.org/
+# -----------------------------------------------------------------------------
+#
+# Mini-Linux Toolkit
+#
+# -----------------------------------------------------------------------------
+
+declare -rg ARG0="$0"
+declare -rg SELF="$(readlink -f "$ARG0")"
+declare -rg ROOT_DIR="$(dirname "${SELF}")"
+declare -rg MLTK_PID="$$"
+declare -rg REMOTE_SETUP_TARGET="${ROOT_DIR}/core/bin/setup_target"
+
+
+# Make apt-get install non-interactive when it comes to postinstall questions
+# ie. kdm asking which dm you want to set as default
+export DEBIAN_FRONTEND=noninteractive
+
+qnd_exit() {
+ unset_quiet
+ kill "$MLTK_PID"
+ [ $# -ge 1 ] && kill "$1"
+ exit 1
+}
+
+# source all helper unit files that are found under helper/*.inc
+# or core/includes/*.inc
+# a helper unit may contain a function called "__init" which will be called
+# after all helpers have been sourced.
+for HELPER in "$ROOT_DIR"/core/includes/helper/*.inc "$ROOT_DIR"/core/includes/*.inc; do
+ SHORT=${HELPER%.inc}
+ SHORT="_init_${SHORT##*/}"
+ . <(sed "s/^__init/$SHORT/" "$HELPER") && continue
+ unset_quiet
+ echo "Could not source $HELPER"
+ qnd_exit
+done
+# called below, after initial_checks
+init_helpers () {
+ # in case the helers have init functions, call them now
+ for HELPER in "$ROOT_DIR"/helper/*.inc "$ROOT_DIR"/core/includes/*.inc; do
+ SHORT=${HELPER%.inc}
+ SHORT="_init_${SHORT##*/}"
+ type -t "$SHORT" | grep -q '^function$' && "$SHORT"
+ done
+}
+
+# Support sourcing a "config" where you can set up stuff like 'export http_proxy=...'
+[ -e "$ROOT_DIR/config" ] && . "$ROOT_DIR/config"
+
+banner () {
+ echo -e "\033[38;5;202m\t __ __ __ "
+ echo -e "\033[38;5;202m\t.--------.| | | |_| |--."
+ echo -e "\033[38;5;208m\t| || |_| _| < "
+ echo -e "\033[38;5;214m\t|__|__|__||____|____|__|__|"
+ echo -e "\033[38;5;214m\t "
+ echo -e "\033[38;5;220m\t ** OpenSLX Project // 2013..2016 **"
+ echo -e "\033[38;5;226m\t http://lab.openslx.org/"
+ echo -e "\033[00m"
+}
+
+print_usage() {
+ echo -e ""
+ echo -e "Toolkit for creating preboot mini-linux for OpenSLX NG (mltk)"
+ echo -e "Usage: $ARG0 <target> [-d] [-c [module]*] [-b [module]*] [-n [name]]"
+ echo -e ""
+ echo -e " Options:"
+ echo -e " -d activates debug output for the task (spamy)"
+ echo -e " -b build module(s) and copy them to the target build directory"
+ echo -e " -c clean build directory of module(s) and target dir"
+ echo -e " -n bind mount all the local builds (var/builds) to /export/builds;"
+ echo -e " the optional parameter name allows to change the default mount target"
+ echo -e " <name> -> /export/<name>"
+ echo -e ""
+ echo -e " You can pass names of specific modules to clean/build (-c / -b)."
+ echo -e " Otherwise, all modules will be cleaned/built."
+ echo -e ""
+ echo -e " Examples:"
+ echo -e " $ARG0 stage31 -c -b"
+ echo -e " (clean and build all modules symlinked in core/targets/stage31)"
+ echo -e " $ARG0 stage32 -c base sshd -b sshd ldm -d"
+ echo -e " (clean base and sshd, build sshd and ldm, be verbose)"
+ echo -e " $ARG0 -n"
+ echo -e " (provides bind mount at /export/build for synchronizing)"
+ echo -e ""
+ echo -e " Existing targets are:"
+ echo -e " $(echo $(ls "${ROOT_DIR}/core/targets" "${ROOT_DIR}/overlay/targets" 2>/dev/null || echo "No targets found."))"
+ echo -e ""
+}
+
+check_devtools() {
+ # Checking for needed development tools, compilers etc.
+ # Required: m4 make gcc g++ binutils
+ # no qmake here, qmake (libqt4-devel) should be installed in a module!
+ local DEV_TOOLS="gcc g++ make cmake m4 strip git depmod patch pkg-config" # 'strip' as marker for binutils
+
+ # DEV_CHECK marks missing dev-tools
+ local DEV_TOOLS_MISSING=""
+ for i in $DEV_TOOLS; do
+ which "$i" 2>/dev/null 1>&2 || DEV_TOOLS_MISSING+="$i "
+ done
+
+ if [ -n "$DEV_TOOLS_MISSING" ]; then
+ pinfo "You appear to be missing following development tools."
+ pinfo "Missing tools are: $DEV_TOOLS_MISSING"
+ pinfo "For $SYS_DISTRIBUTION you probably need to run:"
+ case $SYS_DISTRIBUTION in
+ ubuntu | debian)
+ pinfo "apt-get install build-essential m4 squashfs-tools pkg-config cmake"
+ pinfo "to install missing development tools."
+ ;;
+ # FIXME: Don't know how precise this filter works so we might want to have a better matching ...
+ opensuse)
+ pinfo "zypper install gcc gcc-c++ make m4 binutils git module-init-tools patch squashfs pkg-config cmake"
+ pinfo "to install missing development tools."
+ ;;
+ fedora | scientific | centos)
+ pinfo "yum install redhat-lsb gcc-c++ gcc make m4 binutils pkgconfig patch cmake"
+ ;;
+ *)
+ perror "No installation help for $SYS_DISTRIBUTION available."
+ ;;
+ esac
+ perror "Please install missing dependencies (see above) and try again!"
+ fi
+}
+
+initial_checks() {
+ if [ "x$(whoami)" != "xroot" ]; then
+ perror "ERROR: You need to have root rights to install packages and do various other things."
+ exit 1
+ else
+ banner
+ fi
+
+ [ ! -e "${REMOTE_SETUP_TARGET}" ] && perror "Missing script core/bin/setup_target. Exiting."
+}
+
+read_params() {
+ local SUBMODE=""
+
+ # A target represents a set of modules to be build for a specific stage.
+ # i.e. a very basic stage31 target should includes:
+ # - busybox
+ # - kernel
+ # - rootfs-stage31
+ # a basic stage32 target could add:
+ # - systemd
+ # - dbus
+ # - pam
+ # for a GUI, you could add:
+ # - xorg
+ # - kdm
+ # - plymouth
+ TARGET=""
+ if [[ "$1" != -* ]]; then
+ TARGET="$1"
+ shift
+ elif [[ "$1" == "-h" || "$1" == "--help" ]]; then
+ print_usage
+ exit 1
+ elif [[ "$1" != "-n" ]]; then
+ perror "A target is required. None given."
+ fi
+
+ # handle rest of arguments
+ while [ "$#" -gt "0" ]; do
+ local PARAM="$1"
+ shift
+
+ # options to current target
+ if [[ "$PARAM" == -* ]]; then
+ case "$PARAM" in
+ -c)
+ SUBMODE="CLEAN"
+ ;;
+ -b)
+ SUBMODE="BUILD"
+ ;;
+ -d)
+ REMOTE_DEBUG=1
+ continue
+ ;;
+ -n)
+ if [ -z "$1" ]; then
+ REMOTE_EXPORT_DIR=/export/build
+ else
+ REMOTE_EXPORT_DIR="/export/$1"
+ shift
+ fi
+ REMOTE_EXPORT="1"
+ continue
+ ;;
+ *)
+ pwarning "Unknown flag to target: $PARAM"
+ print_usage
+ exit 1
+ ;;
+ esac
+ eval REMOTE_${SUBMODE}=1
+ continue
+ fi
+
+ # module name
+ [[ "$SUBMODE" != "CLEAN" && "$SUBMODE" != "BUILD" ]] && pwarning "Module name given, but no action specified (eg. build)" && print_usage && exit 1
+ eval "REMOTE_LIST_${SUBMODE}=\"\$REMOTE_LIST_${SUBMODE} \$PARAM\""
+ done
+
+ # exit if no command
+ [[ "$REMOTE_CLEAN" == 0 && "$REMOTE_BUILD" == 0 && "$REMOTE_EXPORT" == 0 ]] && print_usage && exit 1
+}
+
+run() {
+ if [[ $REMOTE_CLEAN == 1 || $REMOTE_BUILD == 1 || $REMOTE_EXPORT == 1 ]]; then
+ [[ $REMOTE_DEBUG == 1 ]] && unset_quiet || set_quiet
+ . "${REMOTE_SETUP_TARGET}" || perror "Cannot source ${REMOTE_SETUP_TARGET}"
+ [[ $REMOTE_CLEAN == 1 ]] && clean_modules $TARGET $REMOTE_LIST_CLEAN
+ [[ $REMOTE_BUILD == 1 ]] && generate_target $TARGET $REMOTE_LIST_BUILD
+ [[ $REMOTE_EXPORT == 1 ]] && export_builds
+ fi
+}
+
+REMOTE_DEBUG="0"
+REMOTE_CLEAN="0"
+REMOTE_BUILD="0"
+REMOTE_EXPORT="0"
+REMOTE_LIST_CLEAN=""
+REMOTE_LIST_BUILD=""
+REMOTE_AUTOMATIC_BUILD=0
+
+initial_checks
+read_params $@
+init_helpers
+
+check_devtools
+
+run
+exit 0
+
diff --git a/tmp/README b/tmp/README
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tmp/README
diff --git a/var/README b/var/README
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/var/README