Linux vmi2545633.contaboserver.net 6.1.0-32-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.129-1 (2025-03-06) x86_64
Apache/2.4.62 (Debian)
Server IP : 127.0.0.1 & Your IP : 127.0.0.1
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
bin /
Delete
Unzip
Name
Size
Permission
Date
Action
X11
[ DIR ]
drwxr-xr-x
2025-10-09 10:16
[
66.89
KB
-rwxr-xr-x
2022-09-20 15:27
aa-enabled
18.23
KB
-rwxr-xr-x
2023-02-14 11:49
aa-exec
18.23
KB
-rwxr-xr-x
2023-02-14 11:49
aa-features-abi
18.23
KB
-rwxr-xr-x
2023-02-14 11:49
ab
58.42
KB
-rwxr-xr-x
2024-10-04 15:21
aclocal
35.18
KB
-rwxr-xr-x
2022-03-18 13:09
aclocal-1.16
35.18
KB
-rwxr-xr-x
2022-03-18 13:09
add-apt-repository
14.1
KB
-rwxr-xr-x
2024-05-17 12:23
addpart
30.31
KB
-rwxr-xr-x
2024-11-21 20:01
addr2line
23.14
KB
-rwxr-xr-x
2023-01-14 17:24
appstreamcli
128.12
KB
-rwxr-xr-x
2023-05-28 15:10
apropos
51.29
KB
-rwxr-xr-x
2023-03-12 22:23
apt
18.31
KB
-rwxr-xr-x
2023-05-25 14:11
apt-add-repository
14.1
KB
-rwxr-xr-x
2024-05-17 12:23
apt-cache
86.38
KB
-rwxr-xr-x
2023-05-25 14:11
apt-cdrom
22.38
KB
-rwxr-xr-x
2023-05-25 14:11
apt-config
26.31
KB
-rwxr-xr-x
2023-05-25 14:11
apt-extracttemplates
22.39
KB
-rwxr-xr-x
2023-05-25 14:11
apt-ftparchive
270.39
KB
-rwxr-xr-x
2023-05-25 14:11
apt-get
50.38
KB
-rwxr-xr-x
2023-05-25 14:11
apt-key
27.32
KB
-rwxr-xr-x
2023-05-25 14:11
apt-listchanges
11.96
KB
-rwxr-xr-x
2021-03-28 11:06
apt-mark
58.38
KB
-rwxr-xr-x
2023-05-25 14:11
apt-sortpkgs
38.32
KB
-rwxr-xr-x
2023-05-25 14:11
ar
51.17
KB
-rwxr-xr-x
2023-01-14 17:24
arch
42.86
KB
-rwxr-xr-x
2022-09-20 15:27
aria_chk
5.49
MB
-rwxr-xr-x
2025-02-19 00:56
aria_dump_log
5.29
MB
-rwxr-xr-x
2025-02-19 00:56
aria_ftdump
5.3
MB
-rwxr-xr-x
2025-02-19 00:56
aria_pack
5.33
MB
-rwxr-xr-x
2025-02-19 00:56
aria_read_log
5.44
MB
-rwxr-xr-x
2025-02-19 00:56
as
897.41
KB
-rwxr-xr-x
2023-01-14 17:24
autoconf
14.85
KB
-rwxr-xr-x
2023-01-14 17:42
autoheader
8.82
KB
-rwxr-xr-x
2023-01-14 17:42
autom4te
32.69
KB
-rwxr-xr-x
2023-01-14 17:42
automake
255.91
KB
-rwxr-xr-x
2022-03-18 13:09
automake-1.16
255.91
KB
-rwxr-xr-x
2022-03-18 13:09
autopoint
26.38
KB
-rwxr-xr-x
2023-02-26 15:20
autoreconf
26.3
KB
-rwxr-xr-x
2023-01-14 17:42
autoscan
16.77
KB
-rwxr-xr-x
2023-01-14 17:42
autoupdate
33.22
KB
-rwxr-xr-x
2023-01-14 17:42
awk
696.44
KB
-rwxr-xr-x
2023-02-19 13:30
b2sum
58.98
KB
-rwxr-xr-x
2022-09-20 15:27
base32
46.89
KB
-rwxr-xr-x
2022-09-20 15:27
base64
46.89
KB
-rwxr-xr-x
2022-09-20 15:27
basename
42.83
KB
-rwxr-xr-x
2022-09-20 15:27
basenc
54.89
KB
-rwxr-xr-x
2022-09-20 15:27
bash
1.21
MB
-rwxr-xr-x
2024-03-29 19:40
bashbug
6.7
KB
-rwxr-xr-x
2024-03-29 19:40
bsondump
11.03
MB
-rwxr-xr-x
2025-04-01 15:22
buildhash
46.63
KB
-rwxr-xr-x
2022-03-29 18:19
bunzip2
38.3
KB
-rwxr-xr-x
2022-09-19 02:54
busctl
90.5
KB
-rwxr-xr-x
2025-03-06 14:56
busybox
754.77
KB
-rwxr-xr-x
2023-04-23 21:24
bzcat
38.3
KB
-rwxr-xr-x
2022-09-19 02:54
bzcmp
2.17
KB
-rwxr-xr-x
2022-09-19 02:54
bzdiff
2.17
KB
-rwxr-xr-x
2022-09-19 02:54
bzegrep
3.69
KB
-rwxr-xr-x
2022-09-19 02:54
bzexe
4.78
KB
-rwxr-xr-x
2021-11-27 12:25
bzfgrep
3.69
KB
-rwxr-xr-x
2022-09-19 02:54
bzgrep
3.69
KB
-rwxr-xr-x
2022-09-19 02:54
bzip2
38.3
KB
-rwxr-xr-x
2022-09-19 02:54
bzip2recover
14.23
KB
-rwxr-xr-x
2022-09-19 02:54
bzless
1.27
KB
-rwxr-xr-x
2022-09-19 02:54
bzmore
1.27
KB
-rwxr-xr-x
2022-09-19 02:54
c++
1.25
MB
-rwxr-xr-x
2023-01-08 09:12
c++filt
18.51
KB
-rwxr-xr-x
2023-01-14 17:24
c89
428
B
-rwxr-xr-x
2020-11-17 18:53
c89-gcc
428
B
-rwxr-xr-x
2020-11-17 18:53
c99
454
B
-rwxr-xr-x
2020-11-17 18:53
c99-gcc
454
B
-rwxr-xr-x
2020-11-17 18:53
c_rehash
6.68
KB
-rwxr-xr-x
2024-10-27 14:16
captoinfo
90.34
KB
-rwxr-xr-x
2023-05-07 14:33
cat
42.98
KB
-rwxr-xr-x
2022-09-20 15:27
catman
42.77
KB
-rwxr-xr-x
2023-03-12 22:23
cc
1.24
MB
-rwxr-xr-x
2023-01-08 09:12
certbot
958
B
-rwxr-xr-x
2023-04-16 05:22
cgi-fcgi
18
KB
-rwxr-xr-x
2021-01-11 05:57
chage
78.49
KB
-rwxr-sr-x
2023-03-23 12:40
chardet
221
B
-rwxr-xr-x
2022-12-26 14:42
chardetect
221
B
-rwxr-xr-x
2022-12-26 14:42
chattr
14.24
KB
-rwxr-xr-x
2023-03-05 03:16
chcon
67.11
KB
-rwxr-xr-x
2022-09-20 15:27
checkgid
14.23
KB
-rwxr-xr-x
2024-10-04 15:21
chfn
61.2
KB
-rwsr-xr-x
2023-03-23 12:40
chgrp
67.05
KB
-rwxr-xr-x
2022-09-20 15:27
chmod
62.98
KB
-rwxr-xr-x
2022-09-20 15:27
choom
54.31
KB
-rwxr-xr-x
2024-11-21 20:01
chown
71.05
KB
-rwxr-xr-x
2022-09-20 15:27
chrt
66.31
KB
-rwxr-xr-x
2024-11-21 20:01
chsh
51.64
KB
-rwsr-xr-x
2023-03-23 12:40
chvt
14.57
KB
-rwxr-xr-x
2023-03-23 09:34
ckbcomp
147.14
KB
-rwxr-xr-x
2023-05-21 21:30
cksum
139.05
KB
-rwxr-xr-x
2022-09-20 15:27
clear
14.24
KB
-rwxr-xr-x
2023-05-07 14:33
clear_console
14.15
KB
-rwxr-xr-x
2024-03-29 19:40
cmp
50.95
KB
-rwxr-xr-x
2023-02-03 19:00
codepage
14.41
KB
-rwxr-xr-x
2023-03-23 09:34
col
34.31
KB
-rwxr-xr-x
2024-11-21 20:01
colcrt
14.31
KB
-rwxr-xr-x
2024-11-21 20:01
colrm
30.31
KB
-rwxr-xr-x
2024-11-21 20:01
column
54.31
KB
-rwxr-xr-x
2024-11-21 20:01
comm
46.92
KB
-rwxr-xr-x
2022-09-20 15:27
compose
18.06
KB
-rwxr-xr-x
2021-11-29 13:07
corelist
15.01
KB
-rwxr-xr-x
2023-11-25 20:59
corepack
132
B
-rwxr-xr-x
2024-02-26 06:00
cp
147.61
KB
-rwxr-xr-x
2022-09-20 15:27
cpan
8.16
KB
-rwxr-xr-x
2023-11-25 20:59
cpan5.36-x86_64-linux-gnu
8.18
KB
-rwxr-xr-x
2023-11-25 20:59
cpio
158.56
KB
-rwxr-xr-x
2022-09-14 19:45
cpio-filter
1.22
KB
-rwxr-xr-x
2022-11-19 21:25
cpp
1.24
MB
-rwxr-xr-x
2023-01-08 09:12
cpp-12
1.24
MB
-rwxr-xr-x
2023-01-08 09:12
crc32
1.04
KB
-rwxr-xr-x
2020-03-14 12:52
crontab
42.63
KB
-rwxr-sr-x
2023-03-02 07:33
csplit
119.17
KB
-rwxr-xr-x
2022-09-20 15:27
ctstat
26.59
KB
-rwxr-xr-x
2023-05-22 13:19
curl
274.22
KB
-rwxr-xr-x
2025-03-09 10:45
cut
46.98
KB
-rwxr-xr-x
2022-09-20 15:27
cvtsudoers
337.19
KB
-rwxr-xr-x
2023-06-27 11:45
dash
122.7
KB
-rwxr-xr-x
2023-01-05 13:20
date
119.05
KB
-rwxr-xr-x
2022-09-20 15:27
dbilogstrip
1.35
KB
-rwxr-xr-x
2022-11-19 21:14
dbiprof
6.06
KB
-rwxr-xr-x
2022-11-19 21:14
dbiproxy
5.27
KB
-rwxr-xr-x
2022-11-19 21:14
dbus-cleanup-sockets
14.22
KB
-rwxr-xr-x
2023-09-16 10:03
dbus-daemon
238.56
KB
-rwxr-xr-x
2023-09-16 10:03
dbus-monitor
26.23
KB
-rwxr-xr-x
2023-09-16 10:03
dbus-run-session
14.23
KB
-rwxr-xr-x
2023-09-16 10:03
dbus-send
30.22
KB
-rwxr-xr-x
2023-09-16 10:03
dbus-update-activation-environment
14.22
KB
-rwxr-xr-x
2023-09-16 10:03
dbus-uuidgen
14.22
KB
-rwxr-xr-x
2023-09-16 10:03
dd
87.15
KB
-rwxr-xr-x
2022-09-20 15:27
deallocvt
14.53
KB
-rwxr-xr-x
2023-03-23 09:34
deb-systemd-helper
23.79
KB
-rwxr-xr-x
2022-07-09 00:05
deb-systemd-invoke
6.09
KB
-rwxr-xr-x
2022-07-02 15:23
debconf
2.79
KB
-rwxr-xr-x
2023-01-08 21:50
debconf-apt-progress
11.27
KB
-rwxr-xr-x
2023-01-08 21:50
debconf-communicate
608
B
-rwxr-xr-x
2023-01-08 21:50
debconf-copydb
1.68
KB
-rwxr-xr-x
2023-01-08 21:50
debconf-escape
647
B
-rwxr-xr-x
2023-01-08 21:50
debconf-gettextize
15.97
KB
-rwxr-xr-x
2020-12-30 01:09
debconf-set-selections
2.92
KB
-rwxr-xr-x
2023-01-08 21:50
debconf-show
1.78
KB
-rwxr-xr-x
2023-01-08 21:50
debconf-updatepo
4.46
KB
-rwxr-xr-x
2020-12-30 01:09
debianbts
217
B
-rwxr-xr-x
2022-12-08 11:34
defmt-c
14.23
KB
-rwxr-xr-x
2022-03-29 18:19
defmt-sh
14.23
KB
-rwxr-xr-x
2022-03-29 18:19
delpart
30.31
KB
-rwxr-xr-x
2024-11-21 20:01
delv
41.3
KB
-rwxr-xr-x
2025-01-25 10:14
df
99.8
KB
-rwxr-xr-x
2022-09-20 15:27
dh
28.85
KB
-rwxr-xr-x
2023-01-02 14:54
dh_assistant
20.34
KB
-rwxr-xr-x
2023-01-02 14:54
dh_auto_build
1.37
KB
-rwxr-xr-x
2023-01-02 14:54
dh_auto_clean
1.51
KB
-rwxr-xr-x
2023-01-02 14:54
dh_auto_configure
1.63
KB
-rwxr-xr-x
2023-01-02 14:54
dh_auto_install
3.22
KB
-rwxr-xr-x
2023-01-02 14:54
dh_auto_test
1.65
KB
-rwxr-xr-x
2023-01-02 14:54
dh_autoreconf
6.46
KB
-rwxr-xr-x
2021-02-04 11:26
dh_autoreconf_clean
2.1
KB
-rwxr-xr-x
2021-02-04 11:26
dh_autotools-dev_restoreconfig
1.79
KB
-rwxr-xr-x
2022-01-31 14:43
dh_autotools-dev_updateconfig
1.81
KB
-rwxr-xr-x
2022-01-31 14:43
dh_bash-completion
4.31
KB
-rwxr-xr-x
2021-08-28 15:26
dh_bugfiles
3.58
KB
-rwxr-xr-x
2023-01-02 14:54
dh_builddeb
4.79
KB
-rwxr-xr-x
2023-01-02 14:54
dh_clean
5.03
KB
-rwxr-xr-x
2023-01-02 14:54
dh_compress
7.67
KB
-rwxr-xr-x
2023-01-02 14:54
dh_dwz
4.99
KB
-rwxr-xr-x
2023-01-02 14:54
dh_fixperms
5.29
KB
-rwxr-xr-x
2023-01-02 14:54
dh_gencontrol
5.88
KB
-rwxr-xr-x
2023-01-02 14:54
dh_icons
2.04
KB
-rwxr-xr-x
2023-01-02 14:54
dh_install
12.16
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installalternatives
6.61
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installcatalogs
3.33
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installchangelogs
11.57
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installcron
1.65
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installdeb
12.71
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installdebconf
6.69
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installdirs
3.09
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installdocs
14.65
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installemacsen
3.74
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installexamples
5.65
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installgsettings
2.24
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installifupdown
1.47
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installinfo
3.38
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installinit
13.96
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installinitramfs
2.5
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installlogcheck
1.94
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installlogrotate
1.14
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installman
13.37
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installmanpages
4.89
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installmenu
2.15
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installmime
1.3
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installmodules
2.66
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installpam
1.42
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installppp
1.38
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installsystemd
14.06
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installsystemduser
8.36
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installsysusers
2.98
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installtmpfiles
3.24
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installudev
2.1
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installwm
3.3
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installxfonts
2.8
KB
-rwxr-xr-x
2023-01-02 14:54
dh_installxmlcatalogs
9.22
KB
-rwxr-xr-x
2019-02-27 00:18
dh_link
4.32
KB
-rwxr-xr-x
2023-01-02 14:54
dh_lintian
1.29
KB
-rwxr-xr-x
2023-01-02 14:54
dh_listpackages
825
B
-rwxr-xr-x
2023-01-02 14:54
dh_makeshlibs
15.12
KB
-rwxr-xr-x
2023-01-02 14:54
dh_md5sums
3.46
KB
-rwxr-xr-x
2023-01-02 14:54
dh_missing
8.75
KB
-rwxr-xr-x
2023-01-02 14:54
dh_movefiles
4.69
KB
-rwxr-xr-x
2023-01-02 14:54
dh_perl
5.03
KB
-rwxr-xr-x
2023-01-02 14:54
dh_perl_dbi
1.17
KB
-rwxr-xr-x
2022-11-19 21:14
dh_phpcomposer
3.01
KB
-rwxr-xr-x
2023-01-28 15:13
dh_phppear
5.63
KB
-rwxr-xr-x
2023-01-28 15:13
dh_prep
1.87
KB
-rwxr-xr-x
2023-01-02 14:54
dh_shlibdeps
6.24
KB
-rwxr-xr-x
2023-01-02 14:54
dh_strip
14.85
KB
-rwxr-xr-x
2023-01-02 14:54
dh_strip_nondeterminism
3.12
KB
-rwxr-xr-x
2023-01-15 19:53
dh_systemd_enable
8.98
KB
-rwxr-xr-x
2023-01-02 14:54
dh_systemd_start
8.57
KB
-rwxr-xr-x
2023-01-02 14:54
dh_testdir
1.31
KB
-rwxr-xr-x
2023-01-02 14:54
dh_testroot
2.91
KB
-rwxr-xr-x
2023-01-02 14:54
dh_ucf
2.38
KB
-rwxr-xr-x
2023-01-02 14:54
dh_update_autotools_config
1.84
KB
-rwxr-xr-x
2023-01-02 14:54
dh_usrlocal
4.2
KB
-rwxr-xr-x
2023-01-02 14:54
diff
151.58
KB
-rwxr-xr-x
2023-02-03 19:00
diff3
67.14
KB
-rwxr-xr-x
2023-02-03 19:00
dig
138.77
KB
-rwxr-xr-x
2025-01-25 10:14
dir
147.8
KB
-rwxr-xr-x
2022-09-20 15:27
dircolors
50.92
KB
-rwxr-xr-x
2022-09-20 15:27
dirmngr
586.13
KB
-rwxr-xr-x
2023-03-26 13:03
dirmngr-client
106.87
KB
-rwxr-xr-x
2023-03-26 13:03
dirname
38.83
KB
-rwxr-xr-x
2022-09-20 15:27
discover-config
2.87
KB
-rwxr-xr-x
2022-01-09 07:48
dmesg
86.58
KB
-rwxr-xr-x
2024-11-21 20:01
dnsdomainname
22.15
KB
-rwxr-xr-x
2022-12-19 13:33
dnstap-read
18.33
KB
-rwxr-xr-x
2025-01-25 10:14
domainname
22.15
KB
-rwxr-xr-x
2022-12-19 13:33
dotlockfile
22.5
KB
-rwxr-sr-x
2021-02-04 15:18
dpkg
310.64
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-architecture
14.85
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-buildflags
8.14
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-buildpackage
32.63
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-checkbuilddeps
7.45
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-deb
166.52
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-distaddfile
2.72
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-divert
154.55
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-genbuildinfo
18.48
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-genchanges
17.39
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-gencontrol
14.2
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-gensymbols
10.65
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-maintscript-helper
20.71
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-mergechangelogs
8.88
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-name
6.62
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-parsechangelog
4.83
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-query
158.58
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-realpath
4.09
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-scanpackages
8.47
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-scansources
8.98
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-shlibdeps
31.17
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-source
22.91
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-split
126.48
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-statoverride
62.33
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-trigger
86.48
KB
-rwxr-xr-x
2023-05-11 02:04
dpkg-vendor
3.18
KB
-rwxr-xr-x
2023-05-11 02:04
du
171.33
KB
-rwxr-xr-x
2022-09-20 15:27
dumpkeys
175.13
KB
-rwxr-xr-x
2023-03-23 09:34
dwp
1.79
MB
-rwxr-xr-x
2023-01-14 17:24
dwz
237.66
KB
-rwxr-xr-x
2022-12-26 10:45
echo
42.83
KB
-rwxr-xr-x
2022-09-20 15:27
edit
18.06
KB
-rwxr-xr-x
2021-11-29 13:07
editor
280.74
KB
-rwxr-xr-x
2024-05-06 06:10
egrep
41
B
-rwxr-xr-x
2023-01-24 14:43
eject
82.16
KB
-rwxr-xr-x
2024-11-21 20:01
elfedit
35.03
KB
-rwxr-xr-x
2023-01-14 17:24
enc2xs
40.96
KB
-rwxr-xr-x
2023-11-25 20:59
encguess
3
KB
-rwxr-xr-x
2023-11-25 20:59
env
47.4
KB
-rwxr-xr-x
2022-09-20 15:27
envsubst
34.31
KB
-rwxr-xr-x
2023-02-26 15:20
eqn
205.42
KB
-rwxr-xr-x
2023-03-07 09:38
ex
1.55
MB
-rwxr-xr-x
2025-02-16 05:23
expand
42.92
KB
-rwxr-xr-x
2022-09-20 15:27
expiry
30.45
KB
-rwxr-sr-x
2023-03-23 12:40
expr
115.05
KB
-rwxr-xr-x
2022-09-20 15:27
factor
83.2
KB
-rwxr-xr-x
2022-09-20 15:27
faillog
22.53
KB
-rwxr-xr-x
2023-03-23 12:40
faked-sysv
34.76
KB
-rwxr-xr-x
2023-03-18 09:22
faked-tcp
34.78
KB
-rwxr-xr-x
2023-03-18 09:22
fakeroot
3.9
KB
-rwxr-xr-x
2023-03-18 09:22
fakeroot-sysv
3.9
KB
-rwxr-xr-x
2023-03-18 09:22
fakeroot-tcp
3.9
KB
-rwxr-xr-x
2023-03-18 09:22
fallocate
34.31
KB
-rwxr-xr-x
2024-11-21 20:01
false
34.83
KB
-rwxr-xr-x
2022-09-20 15:27
fc-cache
18.59
KB
-rwxr-xr-x
2023-01-31 22:24
fc-cat
18.52
KB
-rwxr-xr-x
2023-01-31 22:24
fc-conflist
14.34
KB
-rwxr-xr-x
2023-01-31 22:24
fc-list
14.4
KB
-rwxr-xr-x
2023-01-31 22:24
fc-match
14.47
KB
-rwxr-xr-x
2023-01-31 22:24
fc-pattern
14.39
KB
-rwxr-xr-x
2023-01-31 22:24
fc-query
14.36
KB
-rwxr-xr-x
2023-01-31 22:24
fc-scan
14.42
KB
-rwxr-xr-x
2023-01-31 22:24
fc-validate
14.41
KB
-rwxr-xr-x
2023-01-31 22:24
fcgistarter
14.23
KB
-rwxr-xr-x
2024-10-04 15:21
fgconsole
14.52
KB
-rwxr-xr-x
2023-03-23 09:34
fgrep
41
B
-rwxr-xr-x
2023-01-24 14:43
filan
96.02
KB
-rwxr-xr-x
2022-11-06 08:15
file
26.48
KB
-rwxr-xr-x
2023-01-28 18:17
fincore
34.36
KB
-rwxr-xr-x
2024-11-21 20:01
find
219.58
KB
-rwxr-xr-x
2023-01-08 18:07
findaffix
11.74
KB
-rwxr-xr-x
2022-03-29 18:19
findmnt
83.59
KB
-rwxr-xr-x
2024-11-21 20:01
flock
34.39
KB
-rwxr-xr-x
2024-11-21 20:01
fmt
46.89
KB
-rwxr-xr-x
2022-09-20 15:27
fold
42.89
KB
-rwxr-xr-x
2022-09-20 15:27
free
26.3
KB
-rwxr-xr-x
2022-12-19 06:06
funzip
22.46
KB
-rwxr-xr-x
2023-02-19 18:02
fuser
39.83
KB
-rwxr-xr-x
2022-12-13 05:27
g++
1.25
MB
-rwxr-xr-x
2023-01-08 09:12
g++-12
1.25
MB
-rwxr-xr-x
2023-01-08 09:12
galera_new_cluster
917
B
-rwxr-xr-x
2025-02-19 00:56
galera_recovery
3.29
KB
-rwxr-xr-x
2025-02-19 00:56
gapplication
22.31
KB
-rwxr-xr-x
2024-11-14 09:42
gawk
696.44
KB
-rwxr-xr-x
2023-02-19 13:30
gawkbug
6.54
KB
-rwxr-xr-x
2023-02-19 13:30
gcc
1.24
MB
-rwxr-xr-x
2023-01-08 09:12
gcc-12
1.24
MB
-rwxr-xr-x
2023-01-08 09:12
gcc-ar
34.54
KB
-rwxr-xr-x
2023-01-08 09:12
gcc-ar-12
34.54
KB
-rwxr-xr-x
2023-01-08 09:12
gcc-nm
34.54
KB
-rwxr-xr-x
2023-01-08 09:12
gcc-nm-12
34.54
KB
-rwxr-xr-x
2023-01-08 09:12
gcc-ranlib
34.54
KB
-rwxr-xr-x
2023-01-08 09:12
gcc-ranlib-12
34.54
KB
-rwxr-xr-x
2023-01-08 09:12
gcov
720.16
KB
-rwxr-xr-x
2023-01-08 09:12
gcov-12
720.16
KB
-rwxr-xr-x
2023-01-08 09:12
gcov-dump
568.02
KB
-rwxr-xr-x
2023-01-08 09:12
gcov-dump-12
568.02
KB
-rwxr-xr-x
2023-01-08 09:12
gcov-tool
588.09
KB
-rwxr-xr-x
2023-01-08 09:12
gcov-tool-12
588.09
KB
-rwxr-xr-x
2023-01-08 09:12
gdbus
50.31
KB
-rwxr-xr-x
2024-11-14 09:42
gencat
26.75
KB
-rwxr-xr-x
2025-03-06 22:46
geqn
205.42
KB
-rwxr-xr-x
2023-03-07 09:38
getconf
26.5
KB
-rwxr-xr-x
2025-03-06 22:46
getent
35.47
KB
-rwxr-xr-x
2025-03-06 22:46
getkeycodes
14.53
KB
-rwxr-xr-x
2023-03-23 09:34
getopt
34.31
KB
-rwxr-xr-x
2024-11-21 20:01
gettext
34.31
KB
-rwxr-xr-x
2023-02-26 15:20
gettext.sh
5.07
KB
-rwxr-xr-x
2023-02-26 15:20
gettextize
41.28
KB
-rwxr-xr-x
2023-02-26 15:20
gio
90.33
KB
-rwxr-xr-x
2024-11-14 09:42
gio-querymodules
14.23
KB
-rwxr-xr-x
2024-11-14 09:42
glib-compile-schemas
62.3
KB
-rwxr-xr-x
2024-11-14 09:42
gmake
234.65
KB
-rwxr-xr-x
2021-04-10 13:55
gold
2.99
MB
-rwxr-xr-x
2023-01-14 17:24
gp-archive
159.06
KB
-rwxr-xr-x
2023-01-14 17:24
gp-collect-app
175.27
KB
-rwxr-xr-x
2023-01-14 17:24
gp-display-html
578.29
KB
-rwxr-xr-x
2023-01-14 17:24
gp-display-src
150.81
KB
-rwxr-xr-x
2023-01-14 17:24
gp-display-text
257.3
KB
-rwxr-xr-x
2023-01-14 17:24
gpasswd
86.42
KB
-rwsr-xr-x
2023-03-23 12:40
gpg
1.06
MB
-rwxr-xr-x
2023-03-26 13:03
gpg-agent
425.22
KB
-rwxr-xr-x
2023-03-26 13:03
gpg-connect-agent
154.96
KB
-rwxr-xr-x
2023-03-26 13:03
gpg-wks-server
203
KB
-rwxr-xr-x
2023-03-26 13:03
gpg-zip
3.43
KB
-rwxr-xr-x
2023-03-26 13:03
gpgcompose
910.27
KB
-rwxr-xr-x
2023-03-26 13:03
gpgconf
174.73
KB
-rwxr-xr-x
2023-03-26 13:03
gpgparsemail
34.3
KB
-rwxr-xr-x
2023-03-26 13:03
gpgsm
527.66
KB
-rwxr-xr-x
2023-03-26 13:03
gpgsplit
74.56
KB
-rwxr-xr-x
2023-03-26 13:03
gpgtar
147.52
KB
-rwxr-xr-x
2023-03-26 13:03
gpgv
463
KB
-rwxr-xr-x
2023-03-26 13:03
gpic
220.27
KB
-rwxr-xr-x
2023-03-07 09:38
gprof
108.35
KB
-rwxr-xr-x
2023-01-14 17:24
gprofng
146.59
KB
-rwxr-xr-x
2023-01-14 17:24
grep
198.39
KB
-rwxr-xr-x
2023-01-24 14:43
gresource
22.23
KB
-rwxr-xr-x
2024-11-14 09:42
groff
125.45
KB
-rwxr-xr-x
2023-03-07 09:38
grog
2.71
KB
-rwxr-xr-x
2023-03-07 09:38
grops
185.86
KB
-rwxr-xr-x
2023-03-07 09:38
grotty
137.48
KB
-rwxr-xr-x
2023-03-07 09:38
groups
42.89
KB
-rwxr-xr-x
2022-09-20 15:27
grub-editenv
374.16
KB
-rwxr-xr-x
2023-10-02 14:11
grub-file
809.41
KB
-rwxr-xr-x
2023-10-02 14:11
grub-fstest
931.13
KB
-rwxr-xr-x
2023-10-02 14:11
grub-glue-efi
245.01
KB
-rwxr-xr-x
2023-10-02 14:11
grub-kbdcomp
1.64
KB
-rwxr-xr-x
2023-10-02 14:11
grub-menulst2cfg
229.05
KB
-rwxr-xr-x
2023-10-02 14:11
grub-mkfont
273.66
KB
-rwxr-xr-x
2023-10-02 14:11
grub-mkimage
354.2
KB
-rwxr-xr-x
2023-10-02 14:11
grub-mklayout
249.29
KB
-rwxr-xr-x
2023-10-02 14:11
grub-mknetdir
410.99
KB
-rwxr-xr-x
2023-10-02 14:11
grub-mkpasswd-pbkdf2
257.35
KB
-rwxr-xr-x
2023-10-02 14:11
grub-mkrelpath
244.7
KB
-rwxr-xr-x
2023-10-02 14:11
grub-mkrescue
987.84
KB
-rwxr-xr-x
2023-10-02 14:11
grub-mkstandalone
487.32
KB
-rwxr-xr-x
2023-10-02 14:11
grub-mount
754.05
KB
-rwxr-xr-x
2023-10-02 14:11
grub-ntldr-img
34.58
KB
-rwxr-xr-x
2023-10-02 14:11
grub-render-label
822.01
KB
-rwxr-xr-x
2023-10-02 14:11
grub-script-check
272.82
KB
-rwxr-xr-x
2023-10-02 14:11
grub-syslinux2cfg
770.52
KB
-rwxr-xr-x
2023-10-02 14:11
gsettings
26.31
KB
-rwxr-xr-x
2024-11-14 09:42
gtbl
146.43
KB
-rwxr-xr-x
2023-03-07 09:38
gunzip
2.29
KB
-rwxr-xr-x
2022-04-10 02:22
gzexe
6.3
KB
-rwxr-xr-x
2022-04-10 02:22
gzip
95.84
KB
-rwxr-xr-x
2022-04-10 02:22
h2ph
28.54
KB
-rwxr-xr-x
2023-11-25 20:59
h2xs
59.51
KB
-rwxr-xr-x
2023-11-25 20:59
hardlink
50.39
KB
-rwxr-xr-x
2024-11-21 20:01
hd
58.32
KB
-rwxr-xr-x
2024-11-21 20:01
head
46.95
KB
-rwxr-xr-x
2022-09-20 15:27
helpztags
2.46
KB
-rwxr-xr-x
2025-02-16 05:23
hexdump
58.32
KB
-rwxr-xr-x
2024-11-21 20:01
host
114.7
KB
-rwxr-xr-x
2025-01-25 10:14
hostid
38.83
KB
-rwxr-xr-x
2022-09-20 15:27
hostname
22.15
KB
-rwxr-xr-x
2022-12-19 13:33
hostnamectl
30.38
KB
-rwxr-xr-x
2025-03-06 14:56
htcacheclean
34.24
KB
-rwxr-xr-x
2024-10-04 15:21
htdbm
26.23
KB
-rwxr-xr-x
2024-10-04 15:21
htdigest
14.23
KB
-rwxr-xr-x
2024-10-04 15:21
htpasswd
26.23
KB
-rwxr-xr-x
2024-10-04 15:21
i386
26.58
KB
-rwxr-xr-x
2024-11-21 20:01
icombine
38.63
KB
-rwxr-xr-x
2022-03-29 18:19
iconv
63.13
KB
-rwxr-xr-x
2025-03-06 22:46
id
47.02
KB
-rwxr-xr-x
2022-09-20 15:27
ifnames
4.08
KB
-rwxr-xr-x
2023-01-14 17:42
ijoin
18.26
KB
-rwxr-xr-x
2022-03-29 18:19
inetutils-telnet
186.2
KB
-rwxr-xr-x
2023-08-23 10:01
infocmp
62.31
KB
-rwxr-xr-x
2023-05-07 14:33
infotocap
90.34
KB
-rwxr-xr-x
2023-05-07 14:33
innochecksum
4.56
MB
-rwxr-xr-x
2025-02-19 00:56
innotop
445.44
KB
-rwxr-xr-x
2025-02-19 00:56
install
155.8
KB
-rwxr-xr-x
2022-09-20 15:27
install_compass
14.85
KB
-rwxr-xr-x
2013-12-19 05:41
instmodsh
4.27
KB
-rwxr-xr-x
2023-11-25 20:59
ionice
34.31
KB
-rwxr-xr-x
2024-11-21 20:01
ip
674.82
KB
-rwxr-xr-x
2023-05-22 13:19
ipcmk
34.38
KB
-rwxr-xr-x
2024-11-21 20:01
ipcrm
34.31
KB
-rwxr-xr-x
2024-11-21 20:01
ipcs
74.31
KB
-rwxr-xr-x
2024-11-21 20:01
iptables-xml
88.98
KB
-rwxr-xr-x
2023-01-16 13:44
ischroot
14.32
KB
-rwxr-xr-x
2023-07-28 23:46
ispell
102.73
KB
-rwxr-xr-x
2022-03-29 18:19
ispell-wrapper
7.05
KB
-rwxr-xr-x
2023-03-14 21:17
join
54.98
KB
-rwxr-xr-x
2022-09-20 15:27
journalctl
74.64
KB
-rwxr-xr-x
2025-03-06 14:56
json_pp
4.88
KB
-rwxr-xr-x
2023-11-25 20:59
kbd_mode
14.82
KB
-rwxr-xr-x
2023-03-23 09:34
kbdinfo
14.53
KB
-rwxr-xr-x
2023-03-23 09:34
kbxutil
162.77
KB
-rwxr-xr-x
2023-03-26 13:03
kernel-install
12.75
KB
-rwxr-xr-x
2025-03-06 14:56
kill
22.3
KB
-rwxr-xr-x
2022-12-19 06:06
killall
31.95
KB
-rwxr-xr-x
2022-12-13 05:27
kmod
174.27
KB
-rwxr-xr-x
2022-12-10 00:02
laptop-detect
3.73
KB
-rwxr-xr-x
2017-08-12 15:24
last
50.31
KB
-rwxr-xr-x
2024-11-21 20:01
lastb
50.31
KB
-rwxr-xr-x
2024-11-21 20:01
lastlog
31.75
KB
-rwxr-xr-x
2023-03-23 12:40
lcf
7.6
KB
-rwxr-xr-x
2024-12-20 07:39
ld
1.27
MB
-rwxr-xr-x
2023-01-14 17:24
ld.bfd
1.27
MB
-rwxr-xr-x
2023-01-14 17:24
ld.gold
2.99
MB
-rwxr-xr-x
2023-01-14 17:24
ld.so
209.96
KB
-rwxr-xr-x
2025-03-06 22:46
ldd
5.28
KB
-rwxr-xr-x
2025-03-06 22:46
less
194.3
KB
-rwxr-xr-x
2024-05-02 18:30
lessecho
14.24
KB
-rwxr-xr-x
2024-05-02 18:30
lessfile
8.83
KB
-rwxr-xr-x
2024-05-02 18:30
lesskey
23.63
KB
-rwxr-xr-x
2024-05-02 18:30
lesspipe
8.83
KB
-rwxr-xr-x
2024-05-02 18:30
letsencrypt
958
B
-rwxr-xr-x
2023-04-16 05:22
lexgrog
107.48
KB
-rwxr-xr-x
2023-03-12 22:23
lft
2.43
KB
-rwxr-xr-x
2023-02-25 12:24
lft.db
2.43
KB
-rwxr-xr-x
2023-02-25 12:24
libnetcfg
15.41
KB
-rwxr-xr-x
2023-11-25 20:59
libtoolize
133.12
KB
-rwxr-xr-x
2024-04-09 20:04
link
38.83
KB
-rwxr-xr-x
2022-09-20 15:27
linux-boot-prober
1.54
KB
-rwxr-xr-x
2018-08-10 19:23
linux-check-removal
4.56
KB
-rwxr-xr-x
2018-09-05 17:52
linux-update-symlinks
6.17
KB
-rwxr-xr-x
2016-06-05 01:13
linux-version
2.63
KB
-rwxr-xr-x
2022-02-11 02:17
linux32
26.58
KB
-rwxr-xr-x
2024-11-21 20:01
linux64
26.58
KB
-rwxr-xr-x
2024-11-21 20:01
ln
71.12
KB
-rwxr-xr-x
2022-09-20 15:27
lnstat
26.59
KB
-rwxr-xr-x
2023-05-22 13:19
loadkeys
215.34
KB
-rwxr-xr-x
2023-03-23 09:34
loadunimap
38.87
KB
-rwxr-xr-x
2023-03-23 09:34
locale
46.16
KB
-rwxr-xr-x
2025-03-06 22:46
localectl
26.38
KB
-rwxr-xr-x
2025-03-06 14:56
localedef
291.91
KB
-rwxr-xr-x
2025-03-06 22:46
logger
54.9
KB
-rwxr-xr-x
2024-11-21 20:01
login
51.78
KB
-rwxr-xr-x
2023-03-23 12:40
loginctl
58.48
KB
-rwxr-xr-x
2025-03-06 14:56
logname
38.83
KB
-rwxr-xr-x
2022-09-20 15:27
logresolve
14.24
KB
-rwxr-xr-x
2024-10-04 15:21
look
18.31
KB
-rwxr-xr-x
2024-11-21 20:01
ls
147.8
KB
-rwxr-xr-x
2022-09-20 15:27
lsattr
14.24
KB
-rwxr-xr-x
2023-03-05 03:16
lsb_release
2.59
KB
-rwxr-xr-x
2022-09-26 20:06
lsblk
202.31
KB
-rwxr-xr-x
2024-11-21 20:01
lscpu
126.31
KB
-rwxr-xr-x
2024-11-21 20:01
lsfd
120.3
KB
-rwxr-xr-x
2024-11-21 20:01
lsinitramfs
735
B
-rwxr-xr-x
2024-08-22 19:30
lsipc
98.31
KB
-rwxr-xr-x
2024-11-21 20:01
lsirq
34.48
KB
-rwxr-xr-x
2024-11-21 20:01
lslocks
70.7
KB
-rwxr-xr-x
2024-11-21 20:01
lslogins
94.31
KB
-rwxr-xr-x
2024-11-21 20:01
lsmem
66.31
KB
-rwxr-xr-x
2024-11-21 20:01
lsmod
174.27
KB
-rwxr-xr-x
2022-12-10 00:02
lsns
82.31
KB
-rwxr-xr-x
2024-11-21 20:01
lsof
175.61
KB
-rwxr-xr-x
2022-04-28 04:08
lspci
104.04
KB
-rwxr-xr-x
2023-01-17 23:50
lspgpot
1.06
KB
-rwxr-xr-x
2017-08-28 10:22
lsusb
247.07
KB
-rwxr-xr-x
2024-01-24 21:32
lto-dump
30.47
MB
-rwxr-xr-x
2023-01-08 09:12
lto-dump-12
30.47
MB
-rwxr-xr-x
2023-01-08 09:12
lzcat
82.7
KB
-rwxr-xr-x
2025-04-03 19:55
lzcmp
7.25
KB
-rwxr-xr-x
2025-04-03 19:55
lzdiff
7.25
KB
-rwxr-xr-x
2025-04-03 19:55
lzegrep
10.09
KB
-rwxr-xr-x
2025-04-03 19:55
lzfgrep
10.09
KB
-rwxr-xr-x
2025-04-03 19:55
lzgrep
10.09
KB
-rwxr-xr-x
2025-04-03 19:55
lzless
1.77
KB
-rwxr-xr-x
2025-04-03 19:55
lzma
82.7
KB
-rwxr-xr-x
2025-04-03 19:55
lzmainfo
14.3
KB
-rwxr-xr-x
2025-04-03 19:55
lzmore
2.14
KB
-rwxr-xr-x
2025-04-03 19:55
m4
271.52
KB
-rwxr-xr-x
2023-02-03 13:00
make
234.65
KB
-rwxr-xr-x
2021-04-10 13:55
make-first-existing-target
4.79
KB
-rwxr-xr-x
2021-04-10 13:55
man
121.36
KB
-rwxr-xr-x
2023-03-12 22:23
man-recode
35.38
KB
-rwxr-xr-x
2023-03-12 22:23
mandb
147.61
KB
-rwxr-xr-x
2023-03-12 22:23
manpath
34.78
KB
-rwxr-xr-x
2023-03-12 22:23
mapscrn
34.84
KB
-rwxr-xr-x
2023-03-23 09:34
mariadb
5.06
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-access
109.31
KB
-rwxr-xr-x
2025-02-19 00:56
mariadb-admin
4.83
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-analyze
4.83
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-binlog
5.11
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-check
4.83
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-conv
4.55
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-convert-table-format
4.12
KB
-rwxr-xr-x
2025-02-19 00:56
mariadb-dump
4.92
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-dumpslow
8.05
KB
-rwxr-xr-x
2025-02-19 00:56
mariadb-find-rows
3.21
KB
-rwxr-xr-x
2025-02-19 00:56
mariadb-fix-extensions
1.22
KB
-rwxr-xr-x
2025-02-19 00:56
mariadb-hotcopy
34.52
KB
-rwxr-xr-x
2025-02-19 00:56
mariadb-import
4.82
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-install-db
22.13
KB
-rwxr-xr-x
2025-02-19 00:56
mariadb-optimize
4.83
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-plugin
4.52
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-repair
4.83
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-report
49.02
KB
-rwxr-xr-x
2025-02-19 00:56
mariadb-secure-installation
13.49
KB
-rwxr-xr-x
2025-02-19 00:56
mariadb-service-convert
2.45
KB
-rwxr-xr-x
2025-02-19 00:56
mariadb-setpermission
17.56
KB
-rwxr-xr-x
2025-02-19 00:56
mariadb-show
4.82
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-slap
4.84
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-tzinfo-to-sql
4.53
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-upgrade
4.96
MB
-rwxr-xr-x
2025-02-19 00:56
mariadb-waitpid
4.51
MB
-rwxr-xr-x
2025-02-19 00:56
mariadbcheck
4.83
MB
-rwxr-xr-x
2025-02-19 00:56
mariadbd-multi
26.69
KB
-rwxr-xr-x
2025-02-19 00:56
mariadbd-safe
30.42
KB
-rwxr-xr-x
2025-02-19 00:56
mariadbd-safe-helper
4.49
MB
-rwxr-xr-x
2025-02-19 00:56
mawk
154.66
KB
-rwxr-xr-x
2022-06-17 15:35
mcookie
34.38
KB
-rwxr-xr-x
2024-11-21 20:01
md5sum
50.95
KB
-rwxr-xr-x
2022-09-20 15:27
md5sum.textutils
50.95
KB
-rwxr-xr-x
2022-09-20 15:27
mdig
50.33
KB
-rwxr-xr-x
2025-01-25 10:14
memusage
7.29
KB
-rwxr-xr-x
2025-03-06 22:46
memusagestat
22.69
KB
-rwxr-xr-x
2025-03-06 22:46
mesg
18.3
KB
-rwxr-xr-x
2024-11-21 20:01
migrate-pubring-from-classic-gpg
2.99
KB
-rwxr-xr-x
2022-09-01 22:08
mk_modmap
15.78
KB
-rwxr-xr-x
2023-03-23 09:34
mkdir
95.27
KB
-rwxr-xr-x
2022-09-20 15:27
mkfifo
67.17
KB
-rwxr-xr-x
2022-09-20 15:27
mknod
71.2
KB
-rwxr-xr-x
2022-09-20 15:27
mktemp
42.92
KB
-rwxr-xr-x
2022-09-20 15:27
mongod
207.63
MB
-rwxr-xr-x
2013-12-19 05:41
mongodump
17.53
MB
-rwxr-xr-x
2025-04-01 15:22
mongoexport
17.26
MB
-rwxr-xr-x
2025-04-01 15:22
mongofiles
17.25
MB
-rwxr-xr-x
2025-04-01 15:22
mongoimport
17.44
MB
-rwxr-xr-x
2025-04-01 15:22
mongorestore
17.9
MB
-rwxr-xr-x
2025-04-01 15:22
mongos
160.52
MB
-rwxr-xr-x
2013-12-19 05:41
mongosh
142.35
MB
-rwxr-xr-x
2025-03-06 15:39
mongostat
17.05
MB
-rwxr-xr-x
2025-04-01 15:22
mongotop
16.67
MB
-rwxr-xr-x
2025-04-01 15:22
more
58.31
KB
-rwxr-xr-x
2024-11-21 20:01
mount
58.3
KB
-rwsr-xr-x
2024-11-21 20:01
mountpoint
18.3
KB
-rwxr-xr-x
2024-11-21 20:01
msgattrib
26.3
KB
-rwxr-xr-x
2023-02-26 15:20
msgcat
22.3
KB
-rwxr-xr-x
2023-02-26 15:20
msgcmp
26.3
KB
-rwxr-xr-x
2023-02-26 15:20
msgcomm
22.3
KB
-rwxr-xr-x
2023-02-26 15:20
msgconv
22.3
KB
-rwxr-xr-x
2023-02-26 15:20
msgen
22.3
KB
-rwxr-xr-x
2023-02-26 15:20
msgexec
18.3
KB
-rwxr-xr-x
2023-02-26 15:20
msgfilter
30.3
KB
-rwxr-xr-x
2023-02-26 15:20
msgfmt
86.5
KB
-rwxr-xr-x
2023-02-26 15:20
msggrep
114.42
KB
-rwxr-xr-x
2023-02-26 15:20
msginit
66.65
KB
-rwxr-xr-x
2023-02-26 15:20
msgmerge
70.68
KB
-rwxr-xr-x
2023-02-26 15:20
msgunfmt
34.32
KB
-rwxr-xr-x
2023-02-26 15:20
msguniq
22.3
KB
-rwxr-xr-x
2023-02-26 15:20
msql2mysql
1.41
KB
-rwxr-xr-x
2025-02-19 00:56
mt
83.38
KB
-rwxr-xr-x
2022-09-14 19:45
mt-gnu
83.38
KB
-rwxr-xr-x
2022-09-14 19:45
mtrace
6.35
KB
-rwxr-xr-x
2025-03-06 22:46
munchlist
31.23
KB
-rwxr-xr-x
2022-03-29 18:19
mv
139.62
KB
-rwxr-xr-x
2022-09-20 15:27
my_print_defaults
4.52
MB
-rwxr-xr-x
2025-02-19 00:56
myisam_ftdump
4.85
MB
-rwxr-xr-x
2025-02-19 00:56
myisamchk
4.97
MB
-rwxr-xr-x
2025-02-19 00:56
myisamlog
4.83
MB
-rwxr-xr-x
2025-02-19 00:56
myisampack
4.88
MB
-rwxr-xr-x
2025-02-19 00:56
mysql
5.06
MB
-rwxr-xr-x
2025-02-19 00:56
mysql_convert_table_format
4.12
KB
-rwxr-xr-x
2025-02-19 00:56
mysql_find_rows
3.21
KB
-rwxr-xr-x
2025-02-19 00:56
mysql_fix_extensions
1.22
KB
-rwxr-xr-x
2025-02-19 00:56
mysql_install_db
22.13
KB
-rwxr-xr-x
2025-02-19 00:56
mysql_plugin
4.52
MB
-rwxr-xr-x
2025-02-19 00:56
mysql_secure_installation
13.49
KB
-rwxr-xr-x
2025-02-19 00:56
mysql_setpermission
17.56
KB
-rwxr-xr-x
2025-02-19 00:56
mysql_tzinfo_to_sql
4.53
MB
-rwxr-xr-x
2025-02-19 00:56
mysql_upgrade
4.96
MB
-rwxr-xr-x
2025-02-19 00:56
mysql_waitpid
4.51
MB
-rwxr-xr-x
2025-02-19 00:56
mysqlaccess
109.31
KB
-rwxr-xr-x
2025-02-19 00:56
mysqladmin
4.83
MB
-rwxr-xr-x
2025-02-19 00:56
mysqlanalyze
4.83
MB
-rwxr-xr-x
2025-02-19 00:56
mysqlbinlog
5.11
MB
-rwxr-xr-x
2025-02-19 00:56
mysqlcheck
4.83
MB
-rwxr-xr-x
2025-02-19 00:56
mysqld_multi
26.69
KB
-rwxr-xr-x
2025-02-19 00:56
mysqld_safe
30.42
KB
-rwxr-xr-x
2025-02-19 00:56
mysqld_safe_helper
4.49
MB
-rwxr-xr-x
2025-02-19 00:56
mysqldump
4.92
MB
-rwxr-xr-x
2025-02-19 00:56
mysqldumpslow
8.05
KB
-rwxr-xr-x
2025-02-19 00:56
mysqlhotcopy
34.52
KB
-rwxr-xr-x
2025-02-19 00:56
mysqlimport
4.82
MB
-rwxr-xr-x
2025-02-19 00:56
mysqloptimize
4.83
MB
-rwxr-xr-x
2025-02-19 00:56
mysqlrepair
4.83
MB
-rwxr-xr-x
2025-02-19 00:56
mysqlreport
49.02
KB
-rwxr-xr-x
2025-02-19 00:56
mysqlshow
4.82
MB
-rwxr-xr-x
2025-02-19 00:56
mysqlslap
4.84
MB
-rwxr-xr-x
2025-02-19 00:56
mytop
71.95
KB
-rwxr-xr-x
2025-02-19 00:56
namei
34.31
KB
-rwxr-xr-x
2024-11-21 20:01
nano
280.74
KB
-rwxr-xr-x
2024-05-06 06:10
nawk
696.44
KB
-rwxr-xr-x
2023-02-19 13:30
nc
34.13
KB
-rwxr-xr-x
2021-08-20 11:41
nc.traditional
34.13
KB
-rwxr-xr-x
2021-08-20 11:41
neqn
913
B
-rwxr-xr-x
2023-03-07 09:38
netcat
34.13
KB
-rwxr-xr-x
2021-08-20 11:41
networkctl
106.38
KB
-rwxr-xr-x
2025-03-06 14:56
newgrp
47.75
KB
-rwsr-xr-x
2023-03-23 12:40
ngettext
34.31
KB
-rwxr-xr-x
2023-02-26 15:20
nice
42.86
KB
-rwxr-xr-x
2022-09-20 15:27
nisdomainname
22.15
KB
-rwxr-xr-x
2022-12-19 13:33
nl
111.11
KB
-rwxr-xr-x
2022-09-20 15:27
nm
44.03
KB
-rwxr-xr-x
2023-01-14 17:24
node
97.47
MB
-rwxr-xr-x
2024-04-10 12:32
nodejs
97.47
MB
-rwxr-xr-x
2024-04-10 12:32
nohup
42.89
KB
-rwxr-xr-x
2022-09-20 15:27
normalizer
244
B
-rwxr-xr-x
2022-11-27 08:00
npm
54
B
-rwxr-xr-x
2022-10-11 10:59
nproc
42.89
KB
-rwxr-xr-x
2022-09-20 15:27
npx
2.86
KB
-rwxr-xr-x
2023-08-09 13:29
nroff
3.22
KB
-rwxr-xr-x
2023-03-07 09:38
nsenter
34.54
KB
-rwxr-xr-x
2024-11-21 20:01
nslookup
114.74
KB
-rwxr-xr-x
2025-01-25 10:14
nstat
104.45
KB
-rwxr-xr-x
2023-05-22 13:19
nsupdate
74.55
KB
-rwxr-xr-x
2025-01-25 10:14
numfmt
67.02
KB
-rwxr-xr-x
2022-09-20 15:27
objcopy
155.66
KB
-rwxr-xr-x
2023-01-14 17:24
objdump
362.56
KB
-rwxr-xr-x
2023-01-14 17:24
od
79.02
KB
-rwxr-xr-x
2022-09-20 15:27
open
18.06
KB
-rwxr-xr-x
2021-11-29 13:07
openssl
953.26
KB
-rwxr-xr-x
2024-10-27 14:16
openvt
23.13
KB
-rwxr-xr-x
2023-03-23 09:34
os-prober
4.42
KB
-rwxr-xr-x
2021-09-22 18:07
pager
194.3
KB
-rwxr-xr-x
2024-05-02 18:30
partx
118.31
KB
-rwxr-xr-x
2024-11-21 20:01
passwd
66.65
KB
-rwsr-xr-x
2023-03-23 12:40
paste
42.89
KB
-rwxr-xr-x
2022-09-20 15:27
patch
187.44
KB
-rwxr-xr-x
2021-01-09 08:58
pathchk
42.86
KB
-rwxr-xr-x
2022-09-20 15:27
pcre2-config
1.93
KB
-rwxr-xr-x
2023-01-01 15:44
pdb3
62.4
KB
-rwxr-xr-x
2024-11-30 21:22
pdb3.11
62.4
KB
-rwxr-xr-x
2024-11-30 21:22
pear
793
B
-rwxr-xr-x
2023-06-12 06:24
peardev
814
B
-rwxr-xr-x
2023-06-12 06:24
pecl
727
B
-rwxr-xr-x
2023-06-12 06:24
peekfd
14.5
KB
-rwxr-xr-x
2022-12-13 05:27
perl
3.63
MB
-rwxr-xr-x
2023-11-25 20:59
perl5.36-x86_64-linux-gnu
14.41
KB
-rwxr-xr-x
2023-11-25 20:59
perl5.36.0
3.63
MB
-rwxr-xr-x
2023-11-25 20:59
perlbug
44.12
KB
-rwxr-xr-x
2023-11-25 20:59
perldoc
125
B
-rwxr-xr-x
2023-07-05 08:56
perlivp
10.61
KB
-rwxr-xr-x
2023-11-25 20:59
perlthanks
44.12
KB
-rwxr-xr-x
2023-11-25 20:59
perror
4.71
MB
-rwxr-xr-x
2025-02-19 00:56
pgrep
34.42
KB
-rwxr-xr-x
2022-12-19 06:06
phar
14.88
KB
-rwxr-xr-x
2025-10-01 20:26
phar.default
14.88
KB
-rwxr-xr-x
2025-10-01 20:26
phar.phar
14.88
KB
-rwxr-xr-x
2025-10-01 20:26
phar.phar.default
14.88
KB
-rwxr-xr-x
2025-10-01 20:26
phar.phar8.2
14.88
KB
-rwxr-xr-x
2025-03-13 18:10
phar.phar8.4
14.88
KB
-rwxr-xr-x
2025-10-01 20:26
phar8.2
14.88
KB
-rwxr-xr-x
2025-03-13 18:10
phar8.2.phar
14.88
KB
-rwxr-xr-x
2025-03-13 18:10
phar8.4
14.88
KB
-rwxr-xr-x
2025-10-01 20:26
phar8.4.phar
14.88
KB
-rwxr-xr-x
2025-10-01 20:26
php
5.72
MB
-rwxr-xr-x
2025-10-01 20:26
php-config
4.24
KB
-rwxr-xr-x
2025-03-13 18:10
php-config8.2
4.24
KB
-rwxr-xr-x
2025-03-13 18:10
php.default
5.72
MB
-rwxr-xr-x
2025-10-01 20:26
php8.2
5.4
MB
-rwxr-xr-x
2025-03-13 18:10
php8.4
5.72
MB
-rwxr-xr-x
2025-10-01 20:26
phpabtpl
8.47
KB
-rwxr-xr-x
2023-01-28 15:13
phpize
4.83
KB
-rwxr-xr-x
2025-03-13 18:10
phpize8.2
4.83
KB
-rwxr-xr-x
2025-03-13 18:10
pic
220.27
KB
-rwxr-xr-x
2023-03-07 09:38
pico
280.74
KB
-rwxr-xr-x
2024-05-06 06:10
piconv
8.16
KB
-rwxr-xr-x
2023-11-25 20:59
pidof
26.31
KB
-rwxr-xr-x
2023-04-03 06:25
pidwait
34.42
KB
-rwxr-xr-x
2022-12-19 06:06
pinentry
70.57
KB
-rwxr-xr-x
2022-10-18 14:52
pinentry-curses
70.57
KB
-rwxr-xr-x
2022-10-18 14:52
ping
88.45
KB
-rwxr-xr-x
2024-09-24 17:00
ping4
88.45
KB
-rwxr-xr-x
2024-09-24 17:00
ping6
88.45
KB
-rwxr-xr-x
2024-09-24 17:00
pinky
47.05
KB
-rwxr-xr-x
2022-09-20 15:27
pip
221
B
-rwxr-xr-x
2023-02-19 14:19
pip3
221
B
-rwxr-xr-x
2023-02-19 14:19
pip3.11
221
B
-rwxr-xr-x
2023-02-19 14:19
pkaction
18.23
KB
-rwxr-xr-x
2023-01-31 22:05
pkcheck
22.3
KB
-rwxr-xr-x
2023-01-31 22:05
pkcon
55.61
KB
-rwxr-xr-x
2023-05-28 17:00
pkg-config
44.04
KB
-rwxr-xr-x
2023-01-22 11:06
pkgconf
44.04
KB
-rwxr-xr-x
2023-01-22 11:06
pkgtools
1.34
KB
-rwxr-xr-x
2023-01-28 15:13
pkill
34.42
KB
-rwxr-xr-x
2022-12-19 06:06
pkmon
22.79
KB
-rwxr-xr-x
2023-05-28 17:00
pkttyagent
18.23
KB
-rwxr-xr-x
2023-01-31 22:05
pl2pm
4.43
KB
-rwxr-xr-x
2023-11-25 20:59
pldd
22.69
KB
-rwxr-xr-x
2025-03-06 22:46
pm2
56
B
-rwxr-xr-x
2025-04-08 13:05
pm2-dev
59
B
-rwxr-xr-x
2025-04-08 13:05
pm2-docker
67
B
-rwxr-xr-x
2025-04-08 13:05
pm2-runtime
67
B
-rwxr-xr-x
2025-04-08 13:05
pmap
34.34
KB
-rwxr-xr-x
2022-12-19 06:06
po2debconf
8.47
KB
-rwxr-xr-x
2020-12-30 01:09
pod2html
4.04
KB
-rwxr-xr-x
2023-11-25 20:59
pod2man
14.68
KB
-rwxr-xr-x
2023-11-25 20:59
pod2text
10.55
KB
-rwxr-xr-x
2023-11-25 20:59
pod2usage
4.01
KB
-rwxr-xr-x
2023-11-25 20:59
podchecker
3.57
KB
-rwxr-xr-x
2023-11-25 20:59
podebconf-display-po
12.67
KB
-rwxr-xr-x
2015-01-10 14:10
podebconf-report-po
31.76
KB
-rwxr-xr-x
2015-01-10 15:44
pr
79.11
KB
-rwxr-xr-x
2022-09-20 15:27
preconv
66.43
KB
-rwxr-xr-x
2023-03-07 09:38
print
18.06
KB
-rwxr-xr-x
2021-11-29 13:07
printenv
34.83
KB
-rwxr-xr-x
2022-09-20 15:27
printf
62.92
KB
-rwxr-xr-x
2022-09-20 15:27
prlimit
38.83
KB
-rwxr-xr-x
2024-11-21 20:01
procan
79.91
KB
-rwxr-xr-x
2022-11-06 08:15
prove
13.34
KB
-rwxr-xr-x
2023-11-25 20:59
prtstat
18.57
KB
-rwxr-xr-x
2022-12-13 05:27
ps
142.93
KB
-rwxr-xr-x
2022-12-19 06:06
psfaddtable
30.62
KB
-rwxr-xr-x
2023-03-23 09:34
psfgettable
30.62
KB
-rwxr-xr-x
2023-03-23 09:34
psfstriptable
30.62
KB
-rwxr-xr-x
2023-03-23 09:34
psfxtable
30.62
KB
-rwxr-xr-x
2023-03-23 09:34
pslog
14.45
KB
-rwxr-xr-x
2022-12-13 05:27
pstree
35.78
KB
-rwxr-xr-x
2022-12-13 05:27
pstree.x11
35.78
KB
-rwxr-xr-x
2022-12-13 05:27
ptar
3.48
KB
-rwxr-xr-x
2023-11-25 20:59
ptardiff
2.58
KB
-rwxr-xr-x
2023-11-25 20:59
ptargrep
4.29
KB
-rwxr-xr-x
2023-11-25 20:59
ptx
135.23
KB
-rwxr-xr-x
2022-09-20 15:27
pv
63.98
KB
-rwxr-xr-x
2022-04-12 00:55
pwd
42.92
KB
-rwxr-xr-x
2022-09-20 15:27
pwdx
14.3
KB
-rwxr-xr-x
2022-12-19 06:06
py3clean
7.63
KB
-rwxr-xr-x
2023-04-09 10:22
py3compile
13
KB
-rwxr-xr-x
2023-04-09 10:22
py3versions
12.52
KB
-rwxr-xr-x
2023-04-09 10:22
pydoc3
79
B
-rwxr-xr-x
2024-11-30 21:22
pydoc3.11
79
B
-rwxr-xr-x
2024-11-30 21:22
pygettext3
23.67
KB
-rwxr-xr-x
2023-02-07 13:37
pygettext3.11
23.67
KB
-rwxr-xr-x
2023-02-07 13:37
python3
6.52
MB
-rwxr-xr-x
2024-11-30 21:22
python3-config
3
KB
-rwxr-xr-x
2024-11-30 21:22
python3.11
6.52
MB
-rwxr-xr-x
2024-11-30 21:22
python3.11-config
3
KB
-rwxr-xr-x
2024-11-30 21:22
pzstd
742.38
KB
-rwxr-xr-x
2023-03-18 20:58
querybts
10.64
KB
-rwxr-xr-x
2023-04-29 06:38
ranlib
51.17
KB
-rwxr-xr-x
2023-01-14 17:24
rbash
1.21
MB
-rwxr-xr-x
2024-03-29 19:40
rdma
180.6
KB
-rwxr-xr-x
2023-05-22 13:19
readelf
751.38
KB
-rwxr-xr-x
2023-01-14 17:24
readlink
50.89
KB
-rwxr-xr-x
2022-09-20 15:27
realpath
50.92
KB
-rwxr-xr-x
2022-09-20 15:27
recode-sr-latin
14.3
KB
-rwxr-xr-x
2023-02-26 15:20
redis-benchmark
738.63
KB
-rwxr-xr-x
2025-01-19 10:41
redis-check-aof
2.28
MB
-rwxr-xr-x
2025-01-19 10:41
redis-check-rdb
2.28
MB
-rwxr-xr-x
2025-01-19 10:41
redis-cli
366.27
KB
-rwxr-xr-x
2025-01-19 10:41
redis-server
2.28
MB
-rwxr-xr-x
2025-01-19 10:41
rename.ul
22.3
KB
-rwxr-xr-x
2024-11-21 20:01
renice
14.3
KB
-rwxr-xr-x
2024-11-21 20:01
replace
4.5
MB
-rwxr-xr-x
2025-02-19 00:56
report-hw
2.06
KB
-rwxr-xr-x
2021-09-22 18:06
reportbug
110.11
KB
-rwxr-xr-x
2023-04-29 06:38
reset
30.24
KB
-rwxr-xr-x
2023-05-07 14:33
resizecons
26.8
KB
-rwxr-xr-x
2023-03-23 09:34
resizepart
70.31
KB
-rwxr-xr-x
2024-11-21 20:01
resolve_stack_dump
4.52
MB
-rwxr-xr-x
2025-02-19 00:56
resolveip
4.52
MB
-rwxr-xr-x
2025-02-19 00:56
rev
14.3
KB
-rwxr-xr-x
2024-11-21 20:01
rgrep
30
B
-rwxr-xr-x
2020-01-29 12:09
rm
71.05
KB
-rwxr-xr-x
2022-09-20 15:27
rmdir
54.92
KB
-rwxr-xr-x
2022-09-20 15:27
rnano
280.74
KB
-rwxr-xr-x
2024-05-06 06:10
rotatelogs
26.31
KB
-rwxr-xr-x
2024-10-04 15:21
routel
1.62
KB
-rwxr-xr-x
2023-05-22 13:19
rpcgen
95
KB
-rwxr-xr-x
2022-12-02 21:30
rrsync
12.34
KB
-rwxr-xr-x
2025-01-15 18:47
rsync
502.38
KB
-rwxr-xr-x
2025-01-15 18:47
rsync-ssl
5.02
KB
-rwxr-xr-x
2025-01-15 18:47
rtstat
26.59
KB
-rwxr-xr-x
2023-05-22 13:19
run-mailcap
18.06
KB
-rwxr-xr-x
2021-11-29 13:07
run-parts
26.91
KB
-rwxr-xr-x
2023-07-28 23:46
runcon
42.95
KB
-rwxr-xr-x
2022-09-20 15:27
rview
1.55
MB
-rwxr-xr-x
2025-02-16 05:23
savelog
10.24
KB
-rwxr-xr-x
2023-07-28 23:46
scp
266.63
KB
-rwxr-xr-x
2025-02-14 13:06
screendump
14.47
KB
-rwxr-xr-x
2023-03-23 09:34
script
70.3
KB
-rwxr-xr-x
2024-11-21 20:01
scriptlive
54.3
KB
-rwxr-xr-x
2024-11-21 20:01
scriptreplay
46.3
KB
-rwxr-xr-x
2024-11-21 20:01
sdiff
55.08
KB
-rwxr-xr-x
2023-02-03 19:00
sed
123.46
KB
-rwxr-xr-x
2023-01-05 19:55
see
18.06
KB
-rwxr-xr-x
2021-11-29 13:07
select-default-iwrap
474
B
-rwxr-xr-x
2023-03-14 21:17
select-editor
2.39
KB
-rwxr-xr-x
2023-01-14 16:28
sensible-browser
1.26
KB
-rwxr-xr-x
2023-01-14 16:28
sensible-editor
1.24
KB
-rwxr-xr-x
2023-01-14 16:28
sensible-pager
565
B
-rwxr-xr-x
2023-01-14 16:28
seq
58.92
KB
-rwxr-xr-x
2022-09-20 15:27
setarch
26.58
KB
-rwxr-xr-x
2024-11-21 20:01
setfont
58.9
KB
-rwxr-xr-x
2023-03-23 09:34
setkeycodes
14.52
KB
-rwxr-xr-x
2023-03-23 09:34
setleds
18.55
KB
-rwxr-xr-x
2023-03-23 09:34
setlogcons
14.52
KB
-rwxr-xr-x
2023-03-23 09:34
setmetamode
14.66
KB
-rwxr-xr-x
2023-03-23 09:34
setpci
30.31
KB
-rwxr-xr-x
2023-01-17 23:50
setpriv
78.31
KB
-rwxr-xr-x
2024-11-21 20:01
setsid
14.3
KB
-rwxr-xr-x
2024-11-21 20:01
setterm
46.31
KB
-rwxr-xr-x
2024-11-21 20:01
setupcon
39.35
KB
-rwxr-xr-x
2023-05-21 21:30
setvtrgb
14.65
KB
-rwxr-xr-x
2023-03-23 09:34
sftp
282.59
KB
-rwxr-xr-x
2025-02-14 13:06
sg
47.75
KB
-rwsr-xr-x
2023-03-23 12:40
sh
122.7
KB
-rwxr-xr-x
2023-01-05 13:20
sha1sum
54.95
KB
-rwxr-xr-x
2022-09-20 15:27
sha224sum
58.95
KB
-rwxr-xr-x
2022-09-20 15:27
sha256sum
58.95
KB
-rwxr-xr-x
2022-09-20 15:27
sha384sum
62.95
KB
-rwxr-xr-x
2022-09-20 15:27
sha512sum
62.95
KB
-rwxr-xr-x
2022-09-20 15:27
shasum
9.75
KB
-rwxr-xr-x
2023-11-25 20:59
showconsolefont
22.57
KB
-rwxr-xr-x
2023-03-23 09:34
showkey
18.56
KB
-rwxr-xr-x
2023-03-23 09:34
shred
63.14
KB
-rwxr-xr-x
2022-09-20 15:27
shtool
138.76
KB
-rwxr-xr-x
2019-12-23 21:26
shtoolize
15.16
KB
-rwxr-xr-x
2019-12-23 21:26
shuf
58.98
KB
-rwxr-xr-x
2022-09-20 15:27
size
26.86
KB
-rwxr-xr-x
2023-01-14 17:24
skill
30.33
KB
-rwxr-xr-x
2022-12-19 06:06
slabtop
22.37
KB
-rwxr-xr-x
2022-12-19 06:06
sleep
42.86
KB
-rwxr-xr-x
2022-09-20 15:27
slogin
1.07
MB
-rwxr-xr-x
2025-02-14 13:06
snice
30.33
KB
-rwxr-xr-x
2022-12-19 06:06
socat
401.98
KB
-rwxr-xr-x
2022-11-06 08:15
soelim
50.43
KB
-rwxr-xr-x
2023-03-07 09:38
sort
115.68
KB
-rwxr-xr-x
2022-09-20 15:27
sotruss
4.18
KB
-rwxr-xr-x
2025-03-06 22:46
splain
18.99
KB
-rwxr-xr-x
2023-11-25 20:59
split
59.55
KB
-rwxr-xr-x
2022-09-20 15:27
splitfont
14.39
KB
-rwxr-xr-x
2023-03-23 09:34
sprof
26.81
KB
-rwxr-xr-x
2025-03-06 22:46
ss
189.14
KB
-rwxr-xr-x
2023-05-22 13:19
ssh
1.07
MB
-rwxr-xr-x
2025-02-14 13:06
ssh-add
518.44
KB
-rwxr-xr-x
2025-02-14 13:06
ssh-agent
474.38
KB
-rwxr-sr-x
2025-02-14 13:06
ssh-argv0
1.42
KB
-rwxr-xr-x
2025-02-14 11:18
ssh-copy-id
12.38
KB
-rwxr-xr-x
2023-02-02 12:21
ssh-keygen
646.44
KB
-rwxr-xr-x
2025-02-14 13:06
ssh-keyscan
622.47
KB
-rwxr-xr-x
2025-02-14 13:06
stat
95.2
KB
-rwxr-xr-x
2022-09-20 15:27
stdbuf
58.92
KB
-rwxr-xr-x
2022-09-20 15:27
streamzip
7.75
KB
-rwxr-xr-x
2023-11-25 20:59
strings
30.98
KB
-rwxr-xr-x
2023-01-14 17:24
strip
155.7
KB
-rwxr-xr-x
2023-01-14 17:24
stty
83.02
KB
-rwxr-xr-x
2022-09-20 15:27
su
70.31
KB
-rwsr-xr-x
2024-11-21 20:01
sudo
275.02
KB
-rwsr-xr-x
2023-06-27 11:45
sudoedit
275.02
KB
-rwsr-xr-x
2023-06-27 11:45
sudoreplay
115.7
KB
-rwxr-xr-x
2023-06-27 11:45
sum
50.96
KB
-rwxr-xr-x
2022-09-20 15:27
sync
38.89
KB
-rwxr-xr-x
2022-09-20 15:27
systemctl
1.29
MB
-rwxr-xr-x
2025-03-06 14:56
systemd
90.38
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-analyze
182.61
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-ask-password
18.48
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-cat
18.38
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-cgls
22.48
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-cgtop
38.4
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-creds
42.61
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-cryptenroll
58.6
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-delta
26.38
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-detect-virt
18.37
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-escape
18.37
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-firstboot
50.59
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-hwdb
126.66
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-id128
22.37
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-inhibit
22.39
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-machine-id-setup
18.48
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-mount
50.59
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-notify
18.38
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-path
18.37
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-repart
150.69
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-run
58.57
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-socket-activate
26.38
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-stdio-bridge
18.38
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-sysext
42.49
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-sysusers
62.68
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-tmpfiles
110.57
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-tty-ask-password-agent
34.38
KB
-rwxr-xr-x
2025-03-06 14:56
systemd-umount
50.59
KB
-rwxr-xr-x
2025-03-06 14:56
tabs
18.23
KB
-rwxr-xr-x
2023-05-07 14:33
tac
111.05
KB
-rwxr-xr-x
2022-09-20 15:27
tail
75.14
KB
-rwxr-xr-x
2022-09-20 15:27
tar
519.52
KB
-rwxr-xr-x
2024-01-20 09:27
tasksel
26.82
KB
-rwxr-xr-x
2023-05-25 06:27
taskset
62.31
KB
-rwxr-xr-x
2024-11-21 20:01
tbl
146.43
KB
-rwxr-xr-x
2023-03-07 09:38
tee
42.95
KB
-rwxr-xr-x
2022-09-20 15:27
telnet
186.2
KB
-rwxr-xr-x
2023-08-23 10:01
tempfile
14.18
KB
-rwxr-xr-x
2023-07-28 23:46
test
58.89
KB
-rwxr-xr-x
2022-09-20 15:27
tic
90.34
KB
-rwxr-xr-x
2023-05-07 14:33
timedatectl
42.37
KB
-rwxr-xr-x
2025-03-06 14:56
timeout
47.49
KB
-rwxr-xr-x
2022-09-20 15:27
tload
18.32
KB
-rwxr-xr-x
2022-12-19 06:06
toe
22.23
KB
-rwxr-xr-x
2023-05-07 14:33
top
131.58
KB
-rwxr-xr-x
2022-12-19 06:06
touch
107.05
KB
-rwxr-xr-x
2022-09-20 15:27
tput
26.27
KB
-rwxr-xr-x
2023-05-07 14:33
tr
54.89
KB
-rwxr-xr-x
2022-09-20 15:27
traceproto
2.82
KB
-rwxr-xr-x
2023-02-25 12:24
traceproto.db
2.82
KB
-rwxr-xr-x
2023-02-25 12:24
traceroute
71.23
KB
-rwxr-xr-x
2023-02-25 12:24
traceroute-nanog
1.58
KB
-rwxr-xr-x
2023-02-25 12:24
traceroute.db
71.23
KB
-rwxr-xr-x
2023-02-25 12:24
traceroute6
71.23
KB
-rwxr-xr-x
2023-02-25 12:24
traceroute6.db
71.23
KB
-rwxr-xr-x
2023-02-25 12:24
troff
755.83
KB
-rwxr-xr-x
2023-03-07 09:38
true
34.83
KB
-rwxr-xr-x
2022-09-20 15:27
truncate
42.89
KB
-rwxr-xr-x
2022-09-20 15:27
tryaffix
4.8
KB
-rwxr-xr-x
2022-03-29 18:19
tset
30.24
KB
-rwxr-xr-x
2023-05-07 14:33
tsort
54.89
KB
-rwxr-xr-x
2022-09-20 15:27
tty
34.86
KB
-rwxr-xr-x
2022-09-20 15:27
tzselect
14.99
KB
-rwxr-xr-x
2025-03-06 22:46
ucf
40.69
KB
-rwxr-xr-x
2024-12-20 07:39
ucfq
18.91
KB
-rwxr-xr-x
2024-12-20 07:39
ucfr
10.85
KB
-rwxr-xr-x
2024-12-20 07:39
uclampset
62.31
KB
-rwxr-xr-x
2024-11-21 20:01
udevadm
1.29
MB
-rwxr-xr-x
2025-03-06 14:56
ul
22.31
KB
-rwxr-xr-x
2024-11-21 20:01
umount
34.3
KB
-rwsr-xr-x
2024-11-21 20:01
uname
42.86
KB
-rwxr-xr-x
2022-09-20 15:27
uncompress
2.29
KB
-rwxr-xr-x
2022-04-10 02:22
unexpand
42.92
KB
-rwxr-xr-x
2022-09-20 15:27
unicode_start
2.71
KB
-rwxr-xr-x
2023-03-23 09:34
unicode_stop
528
B
-rwxr-xr-x
2023-03-23 09:34
uniq
46.95
KB
-rwxr-xr-x
2022-09-20 15:27
unlink
38.83
KB
-rwxr-xr-x
2022-09-20 15:27
unlzma
82.7
KB
-rwxr-xr-x
2025-04-03 19:55
unmkinitramfs
3.59
KB
-rwxr-xr-x
2024-08-22 19:30
unshare
82.54
KB
-rwxr-xr-x
2024-11-21 20:01
unxz
82.7
KB
-rwxr-xr-x
2025-04-03 19:55
unzip
175.05
KB
-rwxr-xr-x
2023-02-19 18:02
unzipsfx
82.86
KB
-rwxr-xr-x
2023-02-19 18:02
unzstd
1.22
MB
-rwxr-xr-x
2023-03-18 20:58
update-alternatives
58.31
KB
-rwxr-xr-x
2023-05-11 02:04
update-mime-database
59.27
KB
-rwxr-xr-x
2022-04-29 17:19
uptime
14.3
KB
-rwxr-xr-x
2022-12-19 06:06
usb-devices
4.35
KB
-rwxr-xr-x
2024-01-24 21:32
usbhid-dump
30.76
KB
-rwxr-xr-x
2024-01-24 21:32
usbreset
14.46
KB
-rwxr-xr-x
2024-01-24 21:32
users
38.89
KB
-rwxr-xr-x
2022-09-20 15:27
utmpdump
30.3
KB
-rwxr-xr-x
2024-11-21 20:01
vdir
147.8
KB
-rwxr-xr-x
2022-09-20 15:27
vi
1.55
MB
-rwxr-xr-x
2025-02-16 05:23
view
1.55
MB
-rwxr-xr-x
2025-02-16 05:23
vim.tiny
1.55
MB
-rwxr-xr-x
2025-02-16 05:23
vmstat
34.72
KB
-rwxr-xr-x
2022-12-19 06:06
w
22.3
KB
-rwxr-xr-x
2022-12-19 06:06
wall
38.3
KB
-rwxr-xr-x
2024-11-21 20:01
watch
26.71
KB
-rwxr-xr-x
2022-12-19 06:06
watchgnupg
18.23
KB
-rwxr-xr-x
2023-03-26 13:03
wc
51.05
KB
-rwxr-xr-x
2022-09-20 15:27
wdctl
70.34
KB
-rwxr-xr-x
2024-11-21 20:01
wget
459.36
KB
-rwxr-xr-x
2025-03-03 13:32
whatis
51.29
KB
-rwxr-xr-x
2023-03-12 22:23
whereis
30.77
KB
-rwxr-xr-x
2024-11-21 20:01
which
946
B
-rwxr-xr-x
2023-07-28 23:46
which.debianutils
946
B
-rwxr-xr-x
2023-07-28 23:46
whiptail
26.75
KB
-rwxr-xr-x
2023-01-31 14:53
who
59.02
KB
-rwxr-xr-x
2022-09-20 15:27
whoami
38.86
KB
-rwxr-xr-x
2022-09-20 15:27
write
22.31
KB
-rwxr-xr-x
2024-11-21 20:01
wsrep_sst_backup
2.39
KB
-rwxr-xr-x
2025-02-19 00:56
wsrep_sst_common
66.5
KB
-rwxr-xr-x
2025-02-19 00:56
wsrep_sst_mariabackup
49.21
KB
-rwxr-xr-x
2025-02-19 00:56
wsrep_sst_mysqldump
8.04
KB
-rwxr-xr-x
2025-02-19 00:56
wsrep_sst_rsync
29.7
KB
-rwxr-xr-x
2025-02-19 00:56
wsrep_sst_rsync_wan
29.7
KB
-rwxr-xr-x
2025-02-19 00:56
x86_64
26.58
KB
-rwxr-xr-x
2024-11-21 20:01
x86_64-linux-gnu-addr2line
23.14
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-ar
51.17
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-as
897.41
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-c++filt
18.51
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-cpp
1.24
MB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-cpp-12
1.24
MB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-dwp
1.79
MB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-elfedit
35.03
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-g++
1.25
MB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-g++-12
1.25
MB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcc
1.24
MB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcc-12
1.24
MB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcc-ar
34.54
KB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcc-ar-12
34.54
KB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcc-nm
34.54
KB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcc-nm-12
34.54
KB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcc-ranlib
34.54
KB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcc-ranlib-12
34.54
KB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcov
720.16
KB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcov-12
720.16
KB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcov-dump
568.02
KB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcov-dump-12
568.02
KB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcov-tool
588.09
KB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gcov-tool-12
588.09
KB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-gold
2.99
MB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-gp-archive
159.06
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-gp-collect-app
175.27
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-gp-display-html
578.29
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-gp-display-src
150.81
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-gp-display-text
257.3
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-gprof
108.35
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-gprofng
146.59
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-ld
1.27
MB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-ld.bfd
1.27
MB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-ld.gold
2.99
MB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-lto-dump
30.47
MB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-lto-dump-12
30.47
MB
-rwxr-xr-x
2023-01-08 09:12
x86_64-linux-gnu-nm
44.03
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-objcopy
155.66
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-objdump
362.56
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-pkg-config
44.04
KB
-rwxr-xr-x
2023-01-22 11:06
x86_64-linux-gnu-pkgconf
44.04
KB
-rwxr-xr-x
2023-01-22 11:06
x86_64-linux-gnu-python3-config
3
KB
-rwxr-xr-x
2024-11-30 21:22
x86_64-linux-gnu-python3.11-config
3
KB
-rwxr-xr-x
2024-11-30 21:22
x86_64-linux-gnu-ranlib
51.17
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-readelf
751.38
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-size
26.86
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-strings
30.98
KB
-rwxr-xr-x
2023-01-14 17:24
x86_64-linux-gnu-strip
155.7
KB
-rwxr-xr-x
2023-01-14 17:24
xargs
70.45
KB
-rwxr-xr-x
2023-01-08 18:07
xauth
51.5
KB
-rwxr-xr-x
2023-01-24 16:29
xdg-user-dir
234
B
-rwxr-xr-x
2022-09-26 14:37
xdg-user-dirs-update
26.16
KB
-rwxr-xr-x
2022-09-26 14:37
xgettext
292.78
KB
-rwxr-xr-x
2023-02-26 15:20
xsubpp
5.05
KB
-rwxr-xr-x
2023-11-25 20:59
xz
82.7
KB
-rwxr-xr-x
2025-04-03 19:55
xzcat
82.7
KB
-rwxr-xr-x
2025-04-03 19:55
xzcmp
7.25
KB
-rwxr-xr-x
2025-04-03 19:55
xzdiff
7.25
KB
-rwxr-xr-x
2025-04-03 19:55
xzegrep
10.09
KB
-rwxr-xr-x
2025-04-03 19:55
xzfgrep
10.09
KB
-rwxr-xr-x
2025-04-03 19:55
xzgrep
10.09
KB
-rwxr-xr-x
2025-04-03 19:55
xzless
1.77
KB
-rwxr-xr-x
2025-04-03 19:55
xzmore
2.14
KB
-rwxr-xr-x
2025-04-03 19:55
yes
38.83
KB
-rwxr-xr-x
2022-09-20 15:27
ypdomainname
22.15
KB
-rwxr-xr-x
2022-12-19 13:33
zcat
1.94
KB
-rwxr-xr-x
2022-04-10 02:22
zcmp
1.64
KB
-rwxr-xr-x
2022-04-10 02:22
zdiff
6.31
KB
-rwxr-xr-x
2022-04-10 02:22
zdump
22.52
KB
-rwxr-xr-x
2025-03-06 22:46
zegrep
29
B
-rwxr-xr-x
2022-04-10 02:22
zfgrep
29
B
-rwxr-xr-x
2022-04-10 02:22
zforce
2.03
KB
-rwxr-xr-x
2022-04-10 02:22
zgrep
7.91
KB
-rwxr-xr-x
2022-04-10 02:22
zip
212.27
KB
-rwxr-xr-x
2023-02-19 18:00
zipcloak
92.48
KB
-rwxr-xr-x
2023-02-19 18:00
zipdetails
68.55
KB
-rwxr-xr-x
2023-11-25 20:59
zipgrep
2.89
KB
-rwxr-xr-x
2023-02-19 18:02
zipinfo
175.05
KB
-rwxr-xr-x
2023-02-19 18:02
zipnote
84.16
KB
-rwxr-xr-x
2023-02-19 18:00
zipsplit
88.19
KB
-rwxr-xr-x
2023-02-19 18:00
zless
2.15
KB
-rwxr-xr-x
2022-04-10 02:22
zmore
1.8
KB
-rwxr-xr-x
2022-04-10 02:22
znew
4.47
KB
-rwxr-xr-x
2022-04-10 02:22
zstd
1.22
MB
-rwxr-xr-x
2023-03-18 20:58
zstdcat
1.22
MB
-rwxr-xr-x
2023-03-18 20:58
zstdgrep
3.78
KB
-rwxr-xr-x
2023-03-18 20:58
zstdless
197
B
-rwxr-xr-x
2023-03-18 20:58
zstdmt
1.22
MB
-rwxr-xr-x
2023-03-18 20:58
Save
Rename
#!/usr/bin/perl # ckbcomp -- translate XKB layout to loadkeys or kbdcontrol format # Copyright © 2005,2006 Anton Zinoviev <anton@lml.bas.bg> # 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 2 of the License, or # (at your option) any later version. # 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. # If you have not received a copy of the GNU General Public License # along with this program, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA use warnings 'all'; use strict; my $debug_flag = 1; sub debug { if ($debug_flag) { print STDERR "@_"; } } sub warning { print STDERR "WARNING: @_"; } ########### ARGUMENTS ############################################### my $charmap; my $compose_charmap; my $acm; my $verbosity = 0; my $installdir=$0; $installdir =~ s|/[^/]*$||g; if ($installdir =~ m|/bin$|) { $installdir =~ s|/bin$||; } else { $installdir .= "/.."; } if ( $installdir eq '' || ! -d "$installdir/bin") { $installdir = '/usr'; } my @xdirs = ('/etc/console-setup/ckb', "$installdir/etc/console-setup/ckb", '/usr/local/share/X11/xkb', '/usr/share/X11/xkb', '/etc/X11/xkb'); my $keycodes; my $symbols; my $rules; my $model; my @layouts; my @variants = (); my @options = (); my $compact = 0; my $backspace = ''; my $freebsd = 0; while (@ARGV) { $_ = shift @ARGV; if (s/^-//) { if (/^charmap$/) { if ($charmap) { die "$0: No more than one -charmap option is allowed\n"; } $charmap = $ARGV[0]; shift @ARGV; } elsif (/^ccharmap$/) { if ($compose_charmap) { die "$0: No more than one -ccharmap option is allowed\n"; } $compose_charmap = $ARGV[0]; shift @ARGV; } elsif (/^v(erbose)?$/) { if ($verbosity) { die "$0: No more than one -verbose option is allowed\n"; } if ($ARGV[0] =~ /^[0-9]|10$/) { $verbosity = $ARGV[0]; shift @ARGV; } else { $verbosity = 5; } } elsif (/^I(.*)$/) { @xdirs = ($1, @xdirs); } elsif (/^keycodes$/) { if ($keycodes) { die "$0: No more than one -keycodes option is allowed\n"; } $keycodes = $ARGV[0]; shift @ARGV; } elsif (/^symbols$/) { if ($symbols) { die "$0: No more than one -symbols option is allowed\n"; } $symbols = $ARGV[0]; shift @ARGV; } elsif (/^rules$/) { if ($rules) { die "$0: No more than one -rules option is allowed\n"; } $rules = $ARGV[0]; shift @ARGV; } elsif (/^model$/) { if ($model) { die "$0: No more than one -model option is allowed\n"; } $model = $ARGV[0]; $model =~ s/[[:space:]]//g; shift @ARGV; } elsif (/^layout$/) { if (@layouts) { die "$0: No more than one -layout option is allowed\n"; } $ARGV[0] =~ s/[[:space:]]//g; @layouts = split (/,/, $ARGV[0], -1); shift @ARGV; } elsif (/^variant$/) { if (@variants) { die "$0: No more than one -variant option is allowed\n"; } $ARGV[0] =~ s/[[:space:]]//g; @variants = split (/,/, $ARGV[0], -1); shift @ARGV; } elsif (/^option$/) { $ARGV[0] =~ s/[[:space:]]//g; @options = (@options, split (/,/, $ARGV[0], -1)); shift @ARGV; } elsif (/^help$|^-help$|^\?$/) { print <<EOT; Usage: ckbcomp [args] [<layout> [<variant> [<option> ... ]]] Where legal args are: -?,-help Print this message -charmap <name> Specifies the encoding to use -ccharmap <name> Specifies the encoding to use for compose sequences -I<dir> Add <dir> to list of directories to be used -keycodes <name> Specifies keycodes component name -symbols <name> Specifies symbols component name -rules <name> Name of rules file to use -model <name> Specifies model used to choose component names -layout <name> Specifies layout used to choose component names -variant <name> Specifies layout variant used to choose component names -option <name> Adds an option used to choose component names -v[erbose] [<lvl>] Sets verbosity (1..10). Higher values yield more messages -compact Generate compact keymap -freebsd Generate keymap for FreeBSD -backspace bs|del Backspace is BS (^h) or DEL (^?) EOT exit 0; } elsif (/^compact$/) { $compact = 1; } elsif (/^freebsd$/) { $freebsd = 1; } elsif (/^backspace$/) { $backspace = $ARGV[0]; if ($backspace ne 'del' && $backspace ne 'bs') { die "$0: Option -backspace accepts either del or bs\n"; } shift @ARGV; } else { die "$0: Unknown option -$_\n"; } } else { if (! @layouts) { $_ =~ s/[[:space:]]//g; @layouts = split (/,/, $_, -1); @layouts = ('us') if (! @layouts); } elsif (! @variants) { $_ =~ s/[[:space:]]//g; @variants = split (/,/, $_, -1); @variants = ('') if (! @variants); } else { $_ =~ s/[[:space:]]//g; @options = (@options, split (/,/, $_, -1)); } } } $rules = 'base' if (! $rules); $model = 'pc104' if (! $model); $backspace = $freebsd ? 'bs' : 'del' if (! $backspace); ########### GLOBAL VARIABLES ######################################### my %rules_variables = (); # The variables defined in the rules file my $arch = 'at'; # The name of a mapping between X key codes and kernel # keycodes my %acmtable; # Unicode -> legacy code (defined only when -charmap is given) my $KEYMAP = ''; # This variable contains the generated keymap my $broken_caps = 0; # In unicode mode Caps_Lock doesn't work for non-ASCII # letters. 1 = the keymap contains non-ascii letters. # See http://bugzilla.kernel.org/show_bug.cgi?id=7746#c21 my %keycodes_table; # x keysym -> x key code my %aliases; # x keysym -> x keysym my %symbols_table; # x key code -> [[symbols for group0,...], # [symbols for group1,...], ...] my %types_table; # x key code -> key type (i.e. "TWO_LEVEL") my $augment_method = 1; # Constants for different XKB include methods my $override_method = 2; my $replace_method = 3; my $alternate_method = 4; my $ignore_method = 5; # This is not a XKB method and means "don't include" my $filename; # The name of the currently read file my $stream = ''; # The contents of $filename that still has not been parsed my $method = $override_method; # The current method (by default "override") my $base_group = 0; # The base group to include in (for "symbols" files only) my %kernel_modifiers = ( # Linux 'Shift' => 0x01, 'Shift_Lock' => 0x01, 'AltGr' => 0x02, 'AltGr_Lock' => 0x02, 'Control' => 0x04, 'Control_Lock' => 0x04, 'Alt' => 0x08, 'Alt_Lock' => 0x08, 'ShiftL' => 0x10, 'ShiftL_Lock' => 0x10, 'ShiftR' => 0x20, 'ShiftR_Lock' => 0x20, 'CtrlL' => 0x40, 'CtrlL_Lock' => 0x40, 'CtrlR' => 0x80, 'CtrlR_Lock' => 0x80, # FreeBSD 'lshift' => 0x01, 'rshift' => 0x01, 'shifta' => 0x01, # is this correct ? 'lshifta' => 0x01, # is this correct ? 'rshifta' => 0x01, # is this correct ? 'alt' => 0x02, 'lalt' => 0x02, 'ralt' => 0x02, 'alta' => 0x02, # is this correct ? 'lalta' => 0x02, # is this correct ? 'ralta' => 0x02, # is this correct ? 'ctrl' => 0x04, 'lctrl' => 0x04, 'rctrl' => 0x04, 'ctrla' => 0x04, # is this correct ? 'lctrla' => 0x04, # is this correct ? 'rctrla' => 0x04, # is this correct ? 'alock' => 0x10, 'ashift' => 0x10, ); my @modifier_combinations = ('plain', 'shift', 'altgr', 'altgr shift', 'control', 'control shift', 'control altgr', 'control altgr shift', 'alt', 'alt shift', 'alt altgr', 'alt altgr shift', 'alt control', 'alt control shift', 'alt control altgr', 'alt control altgr shift', 'shiftl', 'shiftl shift', 'shiftl altgr', 'shiftl altgr shift', 'shiftl control', 'shiftl control shift', 'shiftl control altgr', 'shiftl control altgr shift', 'shiftl alt', 'shiftl alt shift', 'shiftl alt altgr', 'shiftl alt altgr shift', 'shiftl alt control', 'shiftl alt control shift', 'shiftl alt control altgr', 'shiftl alt control altgr shift', 'shiftr', 'shiftr shift', 'shiftr altgr', 'shiftr altgr shift', 'shiftr control', 'shiftr control shift', 'shiftr control altgr', 'shiftr control altgr shift', 'shiftr alt', 'shiftr alt shift', 'shiftr alt altgr', 'shiftr alt altgr shift', 'shiftr alt control', 'shiftr alt control shift', 'shiftr alt control altgr', 'shiftr alt control altgr shift', 'shiftr shiftl', 'shiftr shiftl shift', 'shiftr shiftl altgr', 'shiftr shiftl altgr shift', 'shiftr shiftl control', 'shiftr shiftl control shift', 'shiftr shiftl control altgr', 'shiftr shiftl control altgr shift', 'shiftr shiftl alt', 'shiftr shiftl alt shift', 'shiftr shiftl alt altgr', 'shiftr shiftl alt altgr shift', 'shiftr shiftl alt control', 'shiftr shiftl alt control shift', 'shiftr shiftl alt control altgr', 'shiftr shiftl alt control altgr shift', 'ctrll', 'ctrll shift', 'ctrll altgr', 'ctrll altgr shift', 'ctrll control', 'ctrll control shift', 'ctrll control altgr', 'ctrll control altgr shift', 'ctrll alt', 'ctrll alt shift', 'ctrll alt altgr', 'ctrll alt altgr shift', 'ctrll alt control', 'ctrll alt control shift', 'ctrll alt control altgr', 'ctrll alt control altgr shift', 'ctrll shiftl', 'ctrll shiftl shift', 'ctrll shiftl altgr', 'ctrll shiftl altgr shift', 'ctrll shiftl control', 'ctrll shiftl control shift', 'ctrll shiftl control altgr', 'ctrll shiftl control altgr shift', 'ctrll shiftl alt', 'ctrll shiftl alt shift', 'ctrll shiftl alt altgr', 'ctrll shiftl alt altgr shift', 'ctrll shiftl alt control', 'ctrll shiftl alt control shift', 'ctrll shiftl alt control altgr', 'ctrll shiftl alt control altgr shift', 'ctrll shiftr', 'ctrll shiftr shift', 'ctrll shiftr altgr', 'ctrll shiftr altgr shift', 'ctrll shiftr control', 'ctrll shiftr control shift', 'ctrll shiftr control altgr', 'ctrll shiftr control altgr shift', 'ctrll shiftr alt', 'ctrll shiftr alt shift', 'ctrll shiftr alt altgr', 'ctrll shiftr alt altgr shift', 'ctrll shiftr alt control', 'ctrll shiftr alt control shift', 'ctrll shiftr alt control altgr', 'ctrll shiftr alt control altgr shift', 'ctrll shiftr shiftl', 'ctrll shiftr shiftl shift', 'ctrll shiftr shiftl altgr', 'ctrll shiftr shiftl altgr shift', 'ctrll shiftr shiftl control', 'ctrll shiftr shiftl control shift', 'ctrll shiftr shiftl control altgr', 'ctrll shiftr shiftl control altgr shift', 'ctrll shiftr shiftl alt', 'ctrll shiftr shiftl alt shift', 'ctrll shiftr shiftl alt altgr', 'ctrll shiftr shiftl alt altgr shift', 'ctrll shiftr shiftl alt control', 'ctrll shiftr shiftl alt control shift', 'ctrll shiftr shiftl alt control altgr', 'ctrll shiftr shiftl alt control altgr shift', ); # Some Unicodes cause the kernel/loadkeys to issue "Segmentation fault" # kbd 1.15-1 (deliberately) fails on anything in the range 0xf000..0xffff; # see http://bugs.debian.org/500116. my %forbidden; { for my $i (0xf000..0xffff) { $forbidden{$i} = 1; } } my %xkbsym_table = ( 'space' => '0020', 'exclam' => '0021', 'quotedbl' => '0022', 'numbersign' => '0023', 'dollar' => '0024', 'percent' => '0025', 'ampersand' => '0026', 'apostrophe' => '0027', 'quoteright' => '0027', 'parenleft' => '0028', 'parenlef' => '0028', # Is this recognised by X ? (speling error) 'parenright' => '0029', 'asterisk' => '002a', 'asterix' => '002a', # Is this recognised by X ? (speling error) 'plus' => '002b', 'comma' => '002c', 'minus' => '002d', 'period' => '002e', 'slash' => '002f', '0' => '0030', '1' => '0031', '2' => '0032', '3' => '0033', '4' => '0034', '5' => '0035', '6' => '0036', '7' => '0037', '8' => '0038', '9' => '0039', 'colon' => '003a', 'semicolon' => '003b', 'less' => '003c', 'equal' => '003d', 'greater' => '003e', 'question' => '003f', 'at' => '0040', 'A' => '0041', 'B' => '0042', 'C' => '0043', 'D' => '0044', 'E' => '0045', 'F' => '0046', 'G' => '0047', 'H' => '0048', 'I' => '0049', 'J' => '004a', 'K' => '004b', 'L' => '004c', 'M' => '004d', 'N' => '004e', 'O' => '004f', 'P' => '0050', 'Q' => '0051', 'R' => '0052', 'S' => '0053', 'T' => '0054', 'U' => '0055', 'V' => '0056', 'W' => '0057', 'X' => '0058', 'Y' => '0059', 'Z' => '005a', 'bracketleft' => '005b', 'backslash' => '005c', 'backlash' => '005c', # Is this recognised by X ? (speling error) 'bracketright' => '005d', 'circumflex' => '005e', 'asciicircum' => '005e', 'underscore' => '005f', 'grave' => '0060', 'quoteleft' => '0060', 'a' => '0061', 'b' => '0062', 'c' => '0063', 'd' => '0064', 'e' => '0065', 'f' => '0066', 'g' => '0067', 'h' => '0068', 'i' => '0069', 'j' => '006a', 'k' => '006b', 'l' => '006c', 'm' => '006d', 'n' => '006e', 'o' => '006f', 'p' => '0070', 'q' => '0071', 'r' => '0072', 's' => '0073', 't' => '0074', 'u' => '0075', 'v' => '0076', 'w' => '0077', 'x' => '0078', 'y' => '0079', 'z' => '007a', 'braceleft' => '007b', 'pipe' => '007c', # Is this recognised by X ? 'bar' => '007c', 'braceright' => '007d', 'asciitilde' => '007e', 'nobreakspace' => '00a0', 'exclamdown' => '00a1', 'cent' => '00a2', 'sterling' => '00a3', 'currency' => '00a4', 'yen' => '00a5', 'brokenbar' => '00a6', 'section' => '00a7', 'diaeresis' => '00a8', 'copyright' => '00a9', 'ordfeminine' => '00aa', 'guillemotleft' => '00ab', 'notsign' => '00ac', 'hyphen' => '00ad', 'registered' => '00ae', 'macron' => '00af', 'overbar' => '00af', 'degree' => '00b0', 'plusminus' => '00b1', 'twosuperior' => '00b2', 'threesuperior' => '00b3', 'acute' => '0027', # APOSTROPHE instead of ACUTE ACCENT 'mu' => '00b5', 'paragraph' => '00b6', 'periodcentered' => '00b7', 'cedilla' => '00b8', 'onesuperior' => '00b9', 'masculine' => '00ba', 'guillemotright' => '00bb', 'onequarter' => '00bc', 'onehalf' => '00bd', 'threequarters' => '00be', 'questiondown' => '00bf', 'Agrave' => '00c0', 'Aacute' => '00c1', 'Acircumflex' => '00c2', 'Atilde' => '00c3', 'Adiaeresis' => '00c4', 'Aring' => '00c5', 'AE' => '00c6', 'Ccedilla' => '00c7', 'Egrave' => '00c8', 'Eacute' => '00c9', 'Ecircumflex' => '00ca', 'Ediaeresis' => '00cb', 'Igrave' => '00cc', 'Iacute' => '00cd', 'Icircumflex' => '00ce', 'Idiaeresis' => '00cf', 'ETH' => '00d0', 'Eth' => '00d0', 'Ntilde' => '00d1', 'Ograve' => '00d2', 'Oacute' => '00d3', 'Ocircumflex' => '00d4', 'Otilde' => '00d5', 'Odiaeresis' => '00d6', 'multiply' => '00d7', 'Ooblique' => '00d8', 'Oslash' => '00d8', 'Ugrave' => '00d9', 'Uacute' => '00da', 'Ucircumflex' => '00db', 'Udiaeresis' => '00dc', 'Yacute' => '00dd', 'THORN' => '00de', 'Thorn' => '00de', 'ssharp' => '00df', 'agrave' => '00e0', 'aacute' => '00e1', 'acircumflex' => '00e2', 'atilde' => '00e3', 'adiaeresis' => '00e4', 'aring' => '00e5', 'ae' => '00e6', 'ccedilla' => '00e7', 'egrave' => '00e8', 'eacute' => '00e9', 'ecircumflex' => '00ea', 'ediaeresis' => '00eb', 'igrave' => '00ec', 'iacute' => '00ed', 'icircumflex' => '00ee', 'idiaeresis' => '00ef', 'eth' => '00f0', 'ntilde' => '00f1', 'ograve' => '00f2', 'oacute' => '00f3', 'ocircumflex' => '00f4', 'otilde' => '00f5', 'odiaeresis' => '00f6', 'division' => '00f7', 'oslash' => '00f8', 'ooblique' => '00f8', 'ugrave' => '00f9', 'uacute' => '00fa', 'ucircumflex' => '00fb', 'udiaeresis' => '00fc', 'yacute' => '00fd', 'thorn' => '00fe', 'ydiaeresis' => '00ff', 'Amacron' => '0100', 'amacron' => '0101', 'Abreve' => '0102', 'abreve' => '0103', 'Aogonek' => '0104', 'aogonek' => '0105', 'Cacute' => '0106', 'cacute' => '0107', 'Ccircumflex' => '0108', 'ccircumflex' => '0109', 'Cabovedot' => '010a', 'cabovedot' => '010b', 'Ccaron' => '010c', 'ccaron' => '010d', 'Dcaron' => '010e', 'dcaron' => '010f', 'Dstroke' => '0110', 'dstroke' => '0111', 'Emacron' => '0112', 'emacron' => '0113', 'Eabovedot' => '0116', 'eabovedot' => '0117', 'Eogonek' => '0118', 'eogonek' => '0119', 'Ecaron' => '011a', 'ecaron' => '011b', 'Gcircumflex' => '011c', 'gcircumflex' => '011d', 'Gbreve' => '011e', 'gbreve' => '011f', 'Gabovedot' => '0120', 'gabovedot' => '0121', 'Gcedilla' => '0122', 'gcedilla' => '0123', 'Hcircumflex' => '0124', 'hcircumflex' => '0125', 'Hstroke' => '0126', 'hstroke' => '0127', 'Itilde' => '0128', 'itilde' => '0129', 'Imacron' => '012a', 'imacron' => '012b', 'Ibreve' => '012c', 'ibreve' => '012d', 'Iogonek' => '012e', 'iogonek' => '012f', 'Iabovedot' => '0130', 'idotless' => '0131', 'Jcircumflex' => '0134', 'jcircumflex' => '0135', 'Kcedilla' => '0136', 'kcedilla' => '0137', 'kra' => '0138', 'Lacute' => '0139', 'lacute' => '013a', 'Lcedilla' => '013b', 'lcedilla' => '013c', 'Lcaron' => '013d', 'lcaron' => '013e', 'Lstroke' => '0141', 'lstroke' => '0142', 'Nacute' => '0143', 'nacute' => '0144', 'Ncedilla' => '0145', 'ncedilla' => '0146', 'Ncaron' => '0147', 'ncaron' => '0148', 'ENG' => '014a', 'eng' => '014b', 'Omacron' => '014c', 'omacron' => '014d', 'Odoubleacute' => '0150', 'odoubleacute' => '0151', 'OE' => '0152', 'oe' => '0153', 'Racute' => '0154', 'racute' => '0155', 'Rcedilla' => '0156', 'rcedilla' => '0157', 'Rcaron' => '0158', 'rcaron' => '0159', 'Sacute' => '015a', 'sacute' => '015b', 'Scircumflex' => '015c', 'scircumflex' => '015d', 'Scedilla' => '015e', 'scedilla' => '015f', 'Scaron' => '0160', 'scaron' => '0161', 'Tcedilla' => '0162', 'tcedilla' => '0163', 'Tcaron' => '0164', 'tcaron' => '0165', 'Tslash' => '0166', 'tslash' => '0167', 'Utilde' => '0168', 'utilde' => '0169', 'Umacron' => '016a', 'umacron' => '016b', 'Ubreve' => '016c', 'ubreve' => '016d', 'Uring' => '016e', 'uring' => '016f', 'Udoubleacute' => '0170', 'udoubleacute' => '0171', 'Uogonek' => '0172', 'uogonek' => '0173', 'Wcircumflex' => '0174', 'wcircumflex' => '0175', 'Ycircumflex' => '0176', 'ycircumflex' => '0177', 'Ydiaeresis' => '0178', 'Zacute' => '0179', 'zacute' => '017a', 'Zabovedot' => '017b', 'zabovedot' => '017c', 'Zcaron' => '017d', 'zcaron' => '017e', 'SCHWA' => '018f', 'Schwa' => '018f', # Is this recognised by X ? 'function' => '0192', 'Obarred' => '019f', 'Ohorn' => '01a0', # Is this recognised by X ? 'ohorn' => '01a1', # Is this recognised by X ? 'Uhorn' => '01af', 'uhorn' => '01b0', 'Zstroke' => '01b5', 'zstroke' => '01b6', 'EZH' => '01b7', 'Ezh' => '01b7', 'Ocaron' => '01d1', 'ocaron' => '01d2', 'Gcaron' => '01e6', # Is this recognised by X ? 'gcaron' => '01e7', # Is this recognised by X ? 'schwa' => '0259', # Is this recognised by X ? 'obarred' => '0275', 'ezh' => '0292', 'caron' => '02c7', 'breve' => '02d8', 'abovedot' => '02d9', 'ogonek' => '02db', 'doubleacute' => '02dd', 'Greek_accentdieresis' => '0385', 'Greek_ALPHAaccent' => '0386', 'Greek_EPSILONaccent' => '0388', 'Greek_ETAaccent' => '0389', 'Greek_IOTAaccent' => '038a', 'Greek_OMICRONaccent' => '038c', 'Greek_UPSILONaccent' => '038e', 'Greek_OMEGAaccent' => '038f', 'Greek_iotaaccentdieresis' => '0390', 'Greek_ALPHA' => '0391', 'Greek_BETA' => '0392', 'Greek_GAMMA' => '0393', 'Greek_DELTA' => '0394', 'Greek_EPSILON' => '0395', 'Greek_ZETA' => '0396', 'Greek_ETA' => '0397', 'Greek_THETA' => '0398', 'Greek_IOTA' => '0399', 'Greek_KAPPA' => '039a', 'Greek_LAMBDA' => '039b', 'Greek_LAMDA' => '039b', # Is this recognised by X ? (speling error) 'Greek_MU' => '039c', 'Greek_NU' => '039d', 'Greek_XI' => '039e', 'Greek_OMICRON' => '039f', 'Greek_PI' => '03a0', 'Greek_RHO' => '03a1', 'Greek_SIGMA' => '03a3', 'Greek_TAU' => '03a4', 'Greek_UPSILON' => '03a5', 'Greek_PHI' => '03a6', 'Greek_CHI' => '03a7', 'Greek_PSI' => '03a8', 'Greek_OMEGA' => '03a9', 'Greek_IOTAdiaeresis' => '03aa', 'Greek_UPSILONdieresis' => '03ab', 'Greek_alphaaccent' => '03ac', 'Greek_epsilonaccent' => '03ad', 'Greek_etaaccent' => '03ae', 'Greek_iotaaccent' => '03af', 'Greek_upsilonaccentdieresis' => '03b0', 'Greek_alpha' => '03b1', 'Greek_beta' => '03b2', 'Greek_gamma' => '03b3', 'Greek_delta' => '03b4', 'Greek_epsilon' => '03b5', 'Greek_zeta' => '03b6', 'Greek_eta' => '03b7', 'Greek_theta' => '03b8', 'Greek_iota' => '03b9', 'Greek_kappa' => '03ba', 'Greek_lambda' => '03bb', 'Greek_lamda' => '03bb', # Is this recognised by X ? (speling error) 'Greek_mu' => '03bc', 'Greek_nu' => '03bd', 'Greek_xi' => '03be', 'Greek_omicron' => '03bf', 'Greek_pi' => '03c0', 'Greek_rho' => '03c1', 'Greek_finalsmallsigma' => '03c2', 'Greek_sigma' => '03c3', 'Greek_tau' => '03c4', 'Greek_upsilon' => '03c5', 'Greek_phi' => '03c6', 'Greek_chi' => '03c7', 'Greek_psi' => '03c8', 'Greek_omega' => '03c9', 'Greek_iotadieresis' => '03ca', 'Greek_upsilondieresis' => '03cb', 'Greek_omicronaccent' => '03cc', 'Greek_upsilonaccent' => '03cd', 'Greek_omegaaccent' => '03ce', 'Cyrillic_IO' => '0401', 'Serbian_DJE' => '0402', 'Macedonia_GJE' => '0403', 'Ukrainian_IE' => '0404', 'Macedonia_DSE' => '0405', 'Ukrainian_I' => '0406', 'Ukrainian_YI' => '0407', 'Cyrillic_JE' => '0408', 'Cyrillic_LJE' => '0409', 'Cyrillic_NJE' => '040a', 'Serbian_TSHE' => '040b', 'Macedonia_KJE' => '040c', 'Byelorussian_SHORTU' => '040e', 'Cyrillic_DZHE' => '040f', 'Cyrillic_A' => '0410', 'Cyrillic_BE' => '0411', 'Cyrillic_VE' => '0412', 'Cyrillic_GHE' => '0413', 'Cyrillic_DE' => '0414', 'Cyrillic_IE' => '0415', 'Cyrillic_ZHE' => '0416', 'Cyrillic_ZH' => '0416', 'Cyrillic_ZE' => '0417', 'Cyrillic_I' => '0418', 'Cyrillic_SHORTI' => '0419', 'Cyrillic_KA' => '041a', 'Cyrillic_EL' => '041b', 'Cyrillic_EM' => '041c', 'Cyrillic_EN' => '041d', 'Cyrillic_N' => '041d', 'Cyrillic_O' => '041e', 'Cyrillic_PE' => '041f', 'Cyrillic_ER' => '0420', 'Cyrillic_ES' => '0421', 'Cyrillic_TE' => '0422', 'Cyrillic_U' => '0423', 'Cyrillic_EF' => '0424', 'Cyrillic_F' => '0424', 'Cyrillic_HA' => '0425', 'Cyrillic_TSE' => '0426', 'Cyrillic_CHE' => '0427', 'Cyrillic_SHA' => '0428', 'Cyrillic_SHCHA' => '0429', 'Cyrillic_HARDSIGN' => '042a', 'Cyrillic_YERU' => '042b', 'Cyrillic_UI' => '042b', 'Cyrillic_SOFTSIGN' => '042c', 'Cyrillic_E' => '042d', 'Cyrillic_YU' => '042e', 'Cyrillic_YA' => '042f', 'Cyrillic_a' => '0430', 'Cyrillic_be' => '0431', 'Cyrillic_ve' => '0432', 'Cyrillic_ghe' => '0433', 'Cyrillic_de' => '0434', 'Cyrillic_ie' => '0435', 'Cyrillic_zhe' => '0436', 'Cyrillic_zh' => '0436', 'Cyrillic_ze' => '0437', 'Cyrillic_i' => '0438', 'Cyrillic_shorti' => '0439', 'Cyrillic_ka' => '043a', 'Cyrillic_el' => '043b', 'Cyrillic_em' => '043c', 'Cyrillic_en' => '043d', 'Cyrillic_n' => '043d', 'Cyrillic_o' => '043e', 'Cyrillic_pe' => '043f', 'Cyrillic_er' => '0440', 'Cyrillic_es' => '0441', 'Cyrillic_te' => '0442', 'Cyrillic_u' => '0443', 'Cyrillic_ef' => '0444', 'Cyrillic_f' => '0444', 'Cyrillic_ha' => '0445', 'Cyrillic_tse' => '0446', 'Cyrillic_che' => '0447', 'Cyrillic_sha' => '0448', 'Cyrillic_shcha' => '0449', 'Cyrillic_hardsign' => '044a', 'Cyrillic_yeru' => '044b', 'Cyrillic_ui' => '044b', 'Cyrillic_softsign' => '044c', 'Cyrillic_e' => '044d', 'Cyrillic_yu' => '044e', 'Cyrillic_ya' => '044f', 'Cyrillic_io' => '0451', 'Serbian_dje' => '0452', 'Macedonia_gje' => '0453', 'Ukrainian_ie' => '0454', 'Macedonia_dse' => '0455', 'Ukrainian_i' => '0456', 'Ukrainian_yi' => '0457', 'Cyrillic_je' => '0458', 'Cyrillic_lje' => '0459', 'Cyrillic_nje' => '045a', 'Serbian_tshe' => '045b', 'Macedonia_kje' => '045c', 'Byelorussian_shortu' => '045e', 'Cyrillic_dzhe' => '045f', 'Ukrainian_GHE_WITH_UPTURN' => '0490', # Is this recognised by X ? 'Ukrainian_ghe_with_upturn' => '0491', # Is this recognised by X ? 'Cyrillic_GHE_bar' => '0492', # Is this recognised by X ? 'Cyrillic_ghe_bar' => '0493', # Is this recognised by X ? 'Cyrillic_ZHE_descender' => '0496', 'Cyrillic_zhe_descender' => '0497', 'Cyrillic_KA_descender' => '049a', # Is this recognised by X ? 'Cyrillic_ka_descender' => '049b', # Is this recognised by X ? 'Cyrillic_KA_vertstroke' => '049c', # Is this recognised by X ? 'Cyrillic_ka_vertstroke' => '049d', # Is this recognised by X ? 'Cyrillic_EN_descender' => '04a2', # Is this recognised by X ? 'Cyrillic_en_descender' => '04a3', # Is this recognised by X ? 'Cyrillic_U_straight' => '04ae', # Is this recognised by X ? 'Cyrillic_u_straight' => '04af', # Is this recognised by X ? 'Cyrillic_U_straight_bar' => '04b0', # Is this recognised by X ? 'Cyrillic_u_straight_bar' => '04b1', # Is this recognised by X ? 'Cyrillic_HA_descender' => '04b2', # Is this recognised by X ? 'Cyrillic_ha_descender' => '04b3', # Is this recognised by X ? 'Cyrillic_CHE_descender' => '04b6', 'Cyrillic_che_descender' => '04b7', 'Cyrillic_CHE_vertstroke' => '04b8', # Is this recognised by X ? 'Cyrillic_che_vertstroke' => '04b9', # Is this recognised by X ? 'Cyrillic_SHHA' => '04ba', # Is this recognised by X ? 'Cyrillic_shha' => '04bb', # Is this recognised by X ? 'Cyrillic_SCHWA' => '04d8', # Is this recognised by X ? 'Cyrillic_schwa' => '04d9', # Is this recognised by X ? 'Cyrillic_I_macron' => '04e2', 'Cyrillic_i_macron' => '04e3', 'Cyrillic_O_bar' => '04e8', # Is this recognised by X ? 'Cyrillic_o_bar' => '04e9', # Is this recognised by X ? 'Cyrillic_U_macron' => '04ee', 'Cyrillic_u_macron' => '04ef', 'Armenian_AYB' => '0531', 'Armenian_BEN' => '0532', 'Armenian_GIM' => '0533', 'Armenian_DA' => '0534', 'Armenian_YECH' => '0535', 'Armenian_ZA' => '0536', 'Armenian_E' => '0537', 'Armenian_AT' => '0538', 'Armenian_TO' => '0539', 'Armenian_ZHE' => '053a', 'Armenian_INI' => '053b', 'Armenian_LYUN' => '053c', 'Armenian_KHE' => '053d', 'Armenian_TSA' => '053e', 'Armenian_KEN' => '053f', 'Armenian_HO' => '0540', 'Armenian_DZA' => '0541', 'Armenian_GHAT' => '0542', 'Armenian_TCHE' => '0543', 'Armenian_MEN' => '0544', 'Armenian_HI' => '0545', 'Armenian_NU' => '0546', 'Armenian_SHA' => '0547', 'Armenian_VO' => '0548', 'Armenian_CHA' => '0549', 'Armenian_PE' => '054a', 'Armenian_JE' => '054b', 'Armenian_RA' => '054c', 'Armenian_SE' => '054d', 'Armenian_VEV' => '054e', 'Armenian_TYUN' => '054f', 'Armenian_RE' => '0550', 'Armenian_TSO' => '0551', 'Armenian_VYUN' => '0552', 'Armenian_PYUR' => '0553', 'Armenian_KE' => '0554', 'Armenian_O' => '0555', 'Armenian_FE' => '0556', 'Armenian_apostrophe' => '055a', 'Armenian_accent' => '055b', 'Armenian_shesht' => '055b', 'Armenian_amanak' => '055c', 'Armenian_exclam' => '055c', 'Armenian_but' => '055d', 'Armenian_separation_mark' => '055d', 'Armenian_paruyk' => '055e', 'Armenian_question' => '055e', 'Armenian_ayb' => '0561', 'Armenian_ben' => '0562', 'Armenian_gim' => '0563', 'Armenian_da' => '0564', 'Armenian_yech' => '0565', 'Armenian_za' => '0566', 'Armenian_e' => '0567', 'Armenian_at' => '0568', 'Armenian_to' => '0569', 'Armenian_zhe' => '056a', 'Armenian_ini' => '056b', 'Armenian_lyun' => '056c', 'Armenian_khe' => '056d', 'Armenian_tsa' => '056e', 'Armenian_ken' => '056f', 'Armenian_ho' => '0570', 'Armenian_dza' => '0571', 'Armenian_ghat' => '0572', 'Armenian_tche' => '0573', 'Armenian_men' => '0574', 'Armenian_hi' => '0575', 'Armenian_nu' => '0576', 'Armenian_sha' => '0577', 'Armenian_vo' => '0578', 'Armenian_cha' => '0579', 'Armenian_pe' => '057a', 'Armenian_je' => '057b', 'Armenian_ra' => '057c', 'Armenian_se' => '057d', 'Armenian_vev' => '057e', 'Armenian_tyun' => '057f', 'Armenian_re' => '0580', 'Armenian_tso' => '0581', 'Armenian_vyun' => '0582', 'Armenian_pyur' => '0583', 'Armenian_ke' => '0584', 'Armenian_o' => '0585', 'Armenian_fe' => '0586', 'Armenian_ligature_ew' => '0587', 'Armenian_full_stop' => '0589', 'Armenian_verjaket' => '0589', 'Armenian_hyphen' => '058a', 'Armenian_yentamna' => '058a', 'hebrew_aleph' => '05d0', 'hebrew_bet' => '05d1', 'hebrew_gimel' => '05d2', 'hebrew_dalet' => '05d3', 'hebrew_he' => '05d4', 'hebrew_waw' => '05d5', 'hebrew_zain' => '05d6', 'hebrew_chet' => '05d7', 'hebrew_tet' => '05d8', 'hebrew_yod' => '05d9', 'hebrew_finalkaph' => '05da', 'hebrew_kaph' => '05db', 'hebrew_lamed' => '05dc', 'hebrew_finalmem' => '05dd', 'hebrew_mem' => '05de', 'hebrew_finalnun' => '05df', 'hebrew_nun' => '05e0', 'hebrew_samech' => '05e1', 'hebrew_ayin' => '05e2', 'hebrew_finalpe' => '05e3', 'hebrew_pe' => '05e4', 'hebrew_finalzade' => '05e5', 'hebrew_zade' => '05e6', 'hebrew_qoph' => '05e7', 'hebrew_resh' => '05e8', 'hebrew_shin' => '05e9', 'hebrew_taw' => '05ea', 'Arabic_comma' => '060c', 'Arabic_semicolon' => '061b', 'Arabic_question_mark' => '061f', 'Arabic_hamza' => '0621', 'Arabic_maddaonalef' => '0622', 'Arabic_hamzaonalef' => '0623', 'Arabic_hamzaonwaw' => '0624', 'Arabic_hamzaunderalef' => '0625', 'Arabic_hamzaonyeh' => '0626', 'Arabic_alef' => '0627', 'Arabic_beh' => '0628', 'Arabic_tehmarbuta' => '0629', 'Arabic_teh' => '062a', 'Arabic_theh' => '062b', 'Arabic_jeem' => '062c', 'Arabic_hah' => '062d', 'Arabic_khah' => '062e', 'Arabic_dal' => '062f', 'Arabic_thal' => '0630', 'Arabic_ra' => '0631', 'Arabic_zain' => '0632', 'Arabic_seen' => '0633', 'Arabic_sheen' => '0634', 'Arabic_sad' => '0635', 'Arabic_dad' => '0636', 'Arabic_tah' => '0637', 'Arabic_zah' => '0638', 'Arabic_ain' => '0639', 'Arabic_ghain' => '063a', 'Arabic_tatweel' => '0640', 'Arabic_feh' => '0641', 'Arabic_qaf' => '0642', 'Arabic_kaf' => '0643', 'Arabic_lam' => '0644', 'Arabic_meem' => '0645', 'Arabic_noon' => '0646', 'Arabic_ha' => '0647', 'Arabic_heh' => '0647', # Is this recognised by X ? 'Arabic_waw' => '0648', 'Arabic_alefmaksura' => '0649', 'Arabic_yeh' => '064a', 'Arabic_fathatan' => '064b', 'Arabic_dammatan' => '064c', 'Arabic_kasratan' => '064d', 'Arabic_fatha' => '064e', 'Arabic_damma' => '064f', 'Arabic_kasra' => '0650', 'Arabic_shadda' => '0651', 'Arabic_sukun' => '0652', 'Arabic_madda_above' => '0653', # Is this recognised by X ? 'Arabic_hamza_above' => '0654', # Is this recognised by X ? 'Arabic_hamza_below' => '0655', # Is this recognised by X ? 'Arabic_0' => '0660', 'Arabic_1' => '0661', 'Arabic_2' => '0662', 'Arabic_3' => '0663', 'Arabic_4' => '0664', 'Arabic_5' => '0665', 'Arabic_6' => '0666', 'Arabic_7' => '0667', 'Arabic_8' => '0668', 'Arabic_9' => '0669', 'Arabic_percent' => '066a', 'Arabic_superscript_alef' => '0670', # Is this recognised by X ? 'Arabic_tteh' => '0679', 'Arabic_peh' => '067e', 'Arabic_tcheh' => '0686', 'Arabic_ddal' => '0688', 'Arabic_rreh' => '0691', 'Arabic_jeh' => '0698', 'Arabic_veh' => '06a4', 'Arabic_keheh' => '06a9', 'Arabic_gaf' => '06af', 'Arabic_noon_ghunna' => '06ba', 'Arabic_heh_doachashmee' => '06be', 'Arabic_heh_goal' => '06c1', 'Arabic_farsi_yeh' => '06cc', 'Farsi_yeh' => '06cc', 'Arabic_yeh_baree' => '06d2', 'Arabic_fullstop' => '06d4', 'Farsi_0' => '06f0', 'Farsi_1' => '06f1', 'Farsi_2' => '06f2', 'Farsi_3' => '06f3', 'Farsi_4' => '06f4', 'Farsi_5' => '06f5', 'Farsi_6' => '06f6', 'Farsi_7' => '06f7', 'Farsi_8' => '06f8', 'Farsi_9' => '06f9', 'Sinh_ng' => '0d82', 'Sinh_h2' => '0d83', 'Sinh_a' => '0d85', 'Sinh_aa' => '0d86', 'Sinh_ae' => '0d87', 'Sinh_aee' => '0d88', 'Sinh_i' => '0d89', 'Sinh_ii' => '0d8a', 'Sinh_u' => '0d8b', 'Sinh_uu' => '0d8c', 'Sinh_ri' => '0d8d', 'Sinh_rii' => '0d8e', 'Sinh_lu' => '0d8f', 'Sinh_luu' => '0d90', 'Sinh_e' => '0d91', 'Sinh_ee' => '0d92', 'Sinh_ai' => '0d93', 'Sinh_o' => '0d94', 'Sinh_oo' => '0d95', 'Sinh_au' => '0d96', 'Sinh_ka' => '0d9a', 'Sinh_kha' => '0d9b', 'Sinh_ga' => '0d9c', 'Sinh_gha' => '0d9d', 'Sinh_ng2' => '0d9e', 'Sinh_nga' => '0d9f', 'Sinh_ca' => '0da0', 'Sinh_cha' => '0da1', 'Sinh_ja' => '0da2', 'Sinh_jha' => '0da3', 'Sinh_nya' => '0da4', 'Sinh_jnya' => '0da5', 'Sinh_nja' => '0da6', 'Sinh_tta' => '0da7', 'Sinh_ttha' => '0da8', 'Sinh_dda' => '0da9', 'Sinh_ddha' => '0daa', 'Sinh_nna' => '0dab', 'Sinh_ndda' => '0dac', 'Sinh_tha' => '0dad', 'Sinh_thha' => '0dae', 'Sinh_dha' => '0daf', 'Sinh_dhha' => '0db0', 'Sinh_na' => '0db1', 'Sinh_ndha' => '0db3', 'Sinh_pa' => '0db4', 'Sinh_pha' => '0db5', 'Sinh_ba' => '0db6', 'Sinh_bha' => '0db7', 'Sinh_ma' => '0db8', 'Sinh_mba' => '0db9', 'Sinh_ya' => '0dba', 'Sinh_ra' => '0dbb', 'Sinh_la' => '0dbd', 'Sinh_va' => '0dc0', 'Sinh_sha' => '0dc1', 'Sinh_ssha' => '0dc2', 'Sinh_sa' => '0dc3', 'Sinh_ha' => '0dc4', 'Sinh_lla' => '0dc5', 'Sinh_fa' => '0dc6', 'Sinh_al' => '0dca', 'Sinh_aa2' => '0dcf', 'Sinh_ae2' => '0dd0', 'Sinh_aee2' => '0dd1', 'Sinh_i2' => '0dd2', 'Sinh_ii2' => '0dd3', 'Sinh_u2' => '0dd4', 'Sinh_uu2' => '0dd6', 'Sinh_ru2' => '0dd8', 'Sinh_e2' => '0dd9', 'Sinh_ee2' => '0dda', 'Sinh_ai2' => '0ddb', 'Sinh_o2' => '0ddc', 'Sinh_oo2' => '0ddd', 'Sinh_au2' => '0dde', 'Sinh_lu2' => '0ddf', 'Sinh_ruu2' => '0df2', 'Sinh_luu2' => '0df3', 'Thai_kokai' => '0e01', 'Thai_khokhai' => '0e02', 'Thai_khokhuat' => '0e03', 'Thai_khokhwai' => '0e04', 'Thai_khokhon' => '0e05', 'Thai_khorakhang' => '0e06', 'Thai_ngongu' => '0e07', 'Thai_chochan' => '0e08', 'Thai_choching' => '0e09', 'Thai_chochang' => '0e0a', 'Thai_soso' => '0e0b', 'Thai_chochoe' => '0e0c', 'Thai_yoying' => '0e0d', 'Thai_dochada' => '0e0e', 'Thai_topatak' => '0e0f', 'Thai_thothan' => '0e10', 'Thai_thonangmontho' => '0e11', 'Thai_thophuthao' => '0e12', 'Thai_nonen' => '0e13', 'Thai_dodek' => '0e14', 'Thai_totao' => '0e15', 'Thai_thothung' => '0e16', 'Thai_thothahan' => '0e17', 'Thai_thothong' => '0e18', 'Thai_nonu' => '0e19', 'Thai_bobaimai' => '0e1a', 'Thai_popla' => '0e1b', 'Thai_phophung' => '0e1c', 'Thai_fofa' => '0e1d', 'Thai_phophan' => '0e1e', 'Thai_fofan' => '0e1f', 'Thai_phosamphao' => '0e20', 'Thai_moma' => '0e21', 'Thai_yoyak' => '0e22', 'Thai_rorua' => '0e23', 'Thai_ru' => '0e24', 'Thai_loling' => '0e25', 'Thai_lu' => '0e26', 'Thai_wowaen' => '0e27', 'Thai_sosala' => '0e28', 'Thai_sorusi' => '0e29', 'Thai_sosua' => '0e2a', 'Thai_hohip' => '0e2b', 'Thai_lochula' => '0e2c', 'Thai_oang' => '0e2d', 'Thai_honokhuk' => '0e2e', 'Thai_paiyannoi' => '0e2f', 'Thai_saraa' => '0e30', 'Thai_maihanakat' => '0e31', 'Thai_saraaa' => '0e32', 'Thai_saraam' => '0e33', 'Thai_sarai' => '0e34', 'Thai_saraii' => '0e35', 'Thai_saraue' => '0e36', 'Thai_sarauee' => '0e37', 'Thai_sarau' => '0e38', 'Thai_sarauu' => '0e39', 'Thai_phinthu' => '0e3a', 'Thai_baht' => '0e3f', 'Thai_sarae' => '0e40', 'Thai_saraae' => '0e41', 'Thai_sarao' => '0e42', 'Thai_saraaimaimuan' => '0e43', 'Thai_saraaimaimalai' => '0e44', 'Thai_lakkhangyao' => '0e45', 'Thai_maiyamok' => '0e46', 'Thai_maitaikhu' => '0e47', 'Thai_maiek' => '0e48', 'Thai_maitho' => '0e49', 'Thai_maitri' => '0e4a', 'Thai_maichattawa' => '0e4b', 'Thai_thanthakhat' => '0e4c', 'Thai_nikhahit' => '0e4d', 'Thai_leksun' => '0e50', 'Thai_leknung' => '0e51', 'Thai_leksong' => '0e52', 'Thai_leksam' => '0e53', 'Thai_leksi' => '0e54', 'Thai_lekha' => '0e55', 'Thai_lekhok' => '0e56', 'Thai_lekchet' => '0e57', 'Thai_lekpaet' => '0e58', 'Thai_lekkao' => '0e59', 'Georgian_an' => '10d0', 'Georgian_ban' => '10d1', 'Georgian_gan' => '10d2', 'Georgian_don' => '10d3', 'Georgian_en' => '10d4', 'Georgian_vin' => '10d5', 'Georgian_zen' => '10d6', 'Georgian_tan' => '10d7', 'Georgian_in' => '10d8', 'Georgian_kan' => '10d9', 'Georgian_las' => '10da', 'Georgian_man' => '10db', 'Georgian_nar' => '10dc', 'Georgian_on' => '10dd', 'Georgian_par' => '10de', 'Georgian_zhar' => '10df', 'Georgian_rae' => '10e0', 'Georgian_san' => '10e1', 'Georgian_tar' => '10e2', 'Georgian_un' => '10e3', 'Georgian_phar' => '10e4', 'Georgian_khar' => '10e5', 'Georgian_ghan' => '10e6', 'Georgian_qar' => '10e7', 'Georgian_shin' => '10e8', 'Georgian_chin' => '10e9', 'Georgian_can' => '10ea', 'Georgian_jil' => '10eb', 'Georgian_cil' => '10ec', 'Georgian_char' => '10ed', 'Georgian_xan' => '10ee', 'Georgian_jhan' => '10ef', 'Georgian_hae' => '10f0', 'Georgian_he' => '10f1', 'Georgian_hie' => '10f2', 'Georgian_we' => '10f3', 'Georgian_har' => '10f4', 'Georgian_hoe' => '10f5', 'Georgian_fi' => '10f6', 'Hangul_J_Kiyeog' => '11a8', 'Hangul_J_SsangKiyeog' => '11a9', 'Hangul_J_KiyeogSios' => '11aa', 'Hangul_J_Nieun' => '11ab', 'Hangul_J_NieunJieuj' => '11ac', 'Hangul_J_NieunHieuh' => '11ad', 'Hangul_J_Dikeud' => '11ae', 'Hangul_J_Rieul' => '11af', 'Hangul_J_RieulKiyeog' => '11b0', 'Hangul_J_RieulMieum' => '11b1', 'Hangul_J_RieulPieub' => '11b2', 'Hangul_J_RieulSios' => '11b3', 'Hangul_J_RieulTieut' => '11b4', 'Hangul_J_RieulPhieuf' => '11b5', 'Hangul_J_RieulHieuh' => '11b6', 'Hangul_J_Mieum' => '11b7', 'Hangul_J_Pieub' => '11b8', 'Hangul_J_PieubSios' => '11b9', 'Hangul_J_Sios' => '11ba', 'Hangul_J_SsangSios' => '11bb', 'Hangul_J_Ieung' => '11bc', 'Hangul_J_Jieuj' => '11bd', 'Hangul_J_Cieuc' => '11be', 'Hangul_J_Khieuq' => '11bf', 'Hangul_J_Tieut' => '11c0', 'Hangul_J_Phieuf' => '11c1', 'Hangul_J_Hieuh' => '11c2', 'Hangul_J_PanSios' => '11eb', 'Hangul_J_KkogjiDalrinIeung' => '11f0', 'Hangul_J_YeorinHieuh' => '11f9', 'Babovedot' => '1e02', # Is this recognised by X ? 'babovedot' => '1e03', # Is this recognised by X ? 'Dabovedot' => '1e0a', # Is this recognised by X ? 'dabovedot' => '1e0b', # Is this recognised by X ? 'Fabovedot' => '1e1e', # Is this recognised by X ? 'fabovedot' => '1e1f', # Is this recognised by X ? 'Lbelowdot' => '1e36', 'lbelowdot' => '1e37', 'Mabovedot' => '1e40', # Is this recognised by X ? 'mabovedot' => '1e41', # Is this recognised by X ? 'Pabovedot' => '1e56', # Is this recognised by X ? 'pabovedot' => '1e57', # Is this recognised by X ? 'Sabovedot' => '1e60', # Is this recognised by X ? 'sabovedot' => '1e61', # Is this recognised by X ? 'Tabovedot' => '1e6a', # Is this recognised by X ? 'tabovedot' => '1e6b', # Is this recognised by X ? 'Wgrave' => '1e80', 'wgrave' => '1e81', 'Wacute' => '1e82', 'wacute' => '1e83', 'Wdiaeresis' => '1e84', 'wdiaeresis' => '1e85', 'Xabovedot' => '1e8a', 'xabovedot' => '1e8b', 'Abelowdot' => '1ea0', 'abelowdot' => '1ea1', 'Ahook' => '1ea2', 'ahook' => '1ea3', 'Acircumflexacute' => '1ea4', 'acircumflexacute' => '1ea5', 'Acircumflexgrave' => '1ea6', 'acircumflexgrave' => '1ea7', 'Acircumflexhook' => '1ea8', 'acircumflexhook' => '1ea9', 'Acircumflextilde' => '1eaa', 'acircumflextilde' => '1eab', 'Acircumflexbelowdot' => '1eac', 'acircumflexbelowdot' => '1ead', 'Abreveacute' => '1eae', 'abreveacute' => '1eaf', 'Abrevegrave' => '1eb0', 'abrevegrave' => '1eb1', 'Abrevehook' => '1eb2', 'abrevehook' => '1eb3', 'Abrevetilde' => '1eb4', 'abrevetilde' => '1eb5', 'Abrevebelowdot' => '1eb6', 'abrevebelowdot' => '1eb7', 'Ebelowdot' => '1eb8', 'ebelowdot' => '1eb9', 'Ehook' => '1eba', 'ehook' => '1ebb', 'Etilde' => '1ebc', 'etilde' => '1ebd', 'Ecircumflexacute' => '1ebe', 'ecircumflexacute' => '1ebf', 'Ecircumflexgrave' => '1ec0', 'ecircumflexgrave' => '1ec1', 'Ecircumflexhook' => '1ec2', 'ecircumflexhook' => '1ec3', 'Ecircumflextilde' => '1ec4', 'ecircumflextilde' => '1ec5', 'Ecircumflexbelowdot' => '1ec6', 'ecircumflexbelowdot' => '1ec7', 'Ihook' => '1ec8', 'ihook' => '1ec9', 'Ibelowdot' => '1eca', 'ibelowdot' => '1ecb', 'Obelowdot' => '1ecc', 'obelowdot' => '1ecd', 'Ohook' => '1ece', 'ohook' => '1ecf', 'Ocircumflexacute' => '1ed0', 'ocircumflexacute' => '1ed1', 'Ocircumflexgrave' => '1ed2', 'ocircumflexgrave' => '1ed3', 'Ocircumflexhook' => '1ed4', 'ocircumflexhook' => '1ed5', 'Ocircumflextilde' => '1ed6', 'ocircumflextilde' => '1ed7', 'Ocircumflexbelowdot' => '1ed8', 'ocircumflexbelowdot' => '1ed9', 'Ohornacute' => '1eda', 'ohornacute' => '1edb', 'Ohorngrave' => '1edc', 'ohorngrave' => '1edd', 'Ohornhook' => '1ede', 'ohornhook' => '1edf', 'Ohorntilde' => '1ee0', 'ohorntilde' => '1ee1', 'Ohornbelowdot' => '1ee2', 'ohornbelowdot' => '1ee3', 'Ubelowdot' => '1ee4', 'ubelowdot' => '1ee5', 'Uhook' => '1ee6', 'uhook' => '1ee7', 'Uhornacute' => '1ee8', 'uhornacute' => '1ee9', 'Uhorngrave' => '1eea', 'uhorngrave' => '1eeb', 'Uhornhook' => '1eec', 'uhornhook' => '1eed', 'Uhorntilde' => '1eee', 'uhorntilde' => '1eef', 'Uhornbelowdot' => '1ef0', 'uhornbelowdot' => '1ef1', 'Ygrave' => '1ef2', 'ygrave' => '1ef3', 'Ybelowdot' => '1ef4', 'ybelowdot' => '1ef5', 'Yhook' => '1ef6', 'yhook' => '1ef7', 'Ytilde' => '1ef8', 'ytilde' => '1ef9', 'enspace' => '2002', 'emspace' => '2003', 'em3space' => '2004', 'em4space' => '2005', 'digitspace' => '2007', 'punctspace' => '2008', 'thinspace' => '2009', 'hairspace' => '200a', 'figdash' => '2012', 'endash' => '2013', 'emdash' => '2014', 'Greek_horizbar' => '2015', 'hebrew_doublelowline' => '2017', 'leftsinglequotemark' => '2018', 'rightsinglequotemark' => '2019', 'singlelowquotemark' => '201a', 'leftdoublequotemark' => '201c', 'rightdoublequotemark' => '201d', 'doublelowquotemark' => '201e', 'dagger' => '2020', 'doubledagger' => '2021', 'enfilledcircbullet' => '2022', 'doubbaselinedot' => '2025', 'ellipsis' => '2026', 'permille' => '2030', 'minutes' => '2032', 'seconds' => '2033', 'caret' => '2038', 'guilsinglleft' => '2039', 'guilsinglright' => '203a', 'overline' => '203e', 'zerosuperior' => '2070', 'foursuperior' => '2074', 'fivesuperior' => '2075', 'sixsuperior' => '2076', 'sevensuperior' => '2077', 'eightsuperior' => '2078', 'ninesuperior' => '2079', 'zerosubscript' => '2080', 'onesubscript' => '2081', 'twosubscript' => '2082', 'threesubscript' => '2083', 'foursubscript' => '2084', 'fivesubscript' => '2085', 'sixsubscript' => '2086', 'sevensubscript' => '2087', 'eightsubscript' => '2088', 'ninesubscript' => '2089', 'EcuSign' => '20a0', 'ColonSign' => '20a1', 'CruzeiroSign' => '20a2', 'FFrancSign' => '20a3', 'LiraSign' => '20a4', 'MillSign' => '20a5', 'NairaSign' => '20a6', 'PesetaSign' => '20a7', 'RupeeSign' => '20a8', 'WonSign' => '20a9', 'Korean_Won' => '20a9', 'NewSheqelSign' => '20aa', 'DongSign' => '20ab', # Is this recognised by X ? 'EuroSign' => '20ac', 'Euro' => '20ac', 'careof' => '2105', 'numerosign' => '2116', 'phonographcopyright' => '2117', 'prescription' => '211e', 'trademark' => '2122', 'onethird' => '2153', 'twothirds' => '2154', 'onefifth' => '2155', 'twofifths' => '2156', 'threefifths' => '2157', 'fourfifths' => '2158', 'onesixth' => '2159', 'fivesixths' => '215a', 'oneeighth' => '215b', 'threeeighths' => '215c', 'fiveeighths' => '215d', 'seveneighths' => '215e', 'leftarrow' => '2190', 'uparrow' => '2191', 'rightarrow' => '2192', 'downarrow' => '2193', 'implies' => '21d2', 'ifonlyif' => '21d4', 'partialderivative' => '2202', 'partdifferential' => '2202', 'emptyset' => '2205', 'nabla' => '2207', 'elementof' => '2208', 'notelementof' => '2209', 'containsas' => '220B', 'jot' => '2218', 'radical' => '221a', 'squareroot' => '221a', 'cuberoot' => '221b', 'fourthroot' => '221c', 'variation' => '221d', 'infinity' => '221e', 'logicaland' => '2227', 'upcaret' => '2227', 'downcaret' => '2228', 'logicalor' => '2228', 'intersection' => '2229', 'upshoe' => '2229', 'downshoe' => '222a', 'union' => '222a', 'integral' => '222b', 'dintegral' => '222c', 'tintegral' => '222d', 'therefore' => '2234', 'because' => '2235', 'approximate' => '223c', 'similarequal' => '2243', 'notapproxeq' => '2247', 'approxeq' => '2248', 'notidentical' => '2262', 'notequal' => '2260', 'identical' => '2261', 'stricteq' => '2263', 'lessthanequal' => '2264', 'greaterthanequal' => '2265', 'includedin' => '2282', 'leftshoe' => '2282', 'includes' => '2283', 'rightshoe' => '2283', 'lefttack' => '22a2', 'righttack' => '22a3', 'uptack' => '22a4', 'downtack' => '22a5', 'upstile' => '2308', 'downstile' => '230a', 'telephonerecorder' => '2315', 'topintegral' => '2320', 'botintegral' => '2321', 'leftanglebracket' => '2329', 'rightanglebracket' => '232a', 'quad' => '2395', 'topleftparens' => '239b', 'botleftparens' => '239d', 'toprightparens' => '239e', 'botrightparens' => '23a0', 'topleftsqbracket' => '23a1', 'botleftsqbracket' => '23a3', 'toprightsqbracket' => '23a4', 'botrightsqbracket' => '23a6', 'leftmiddlecurlybrace' => '23a8', 'rightmiddlecurlybrace' => '23ac', 'leftradical' => '23b7', 'horizlinescan1' => '23ba', 'horizlinescan3' => '23bb', 'horizlinescan7' => '23bc', 'horizlinescan9' => '23bd', 'ht' => '2409', 'lf' => '240a', 'vt' => '240b', 'ff' => '240c', 'cr' => '240d', 'nl' => '2424', 'horizconnector' => '2500', 'horizlinescan5' => '2500', 'vertbar' => '2502', 'vertconnector' => '2502', 'topleftradical' => '250c', 'upleftcorner' => '250c', 'uprightcorner' => '2510', 'lowleftcorner' => '2514', 'lowrightcorner' => '2518', 'leftt' => '251c', 'rightt' => '2524', 'topt' => '252c', 'bott' => '2534', 'crossinglines' => '253c', 'checkerboard' => '2592', 'enfilledsqbullet' => '25aa', 'enopensquarebullet' => '25ab', 'filledrectbullet' => '25ac', 'openrectbullet' => '25ad', 'emfilledrect' => '25ae', 'emopenrectangle' => '25af', 'filledtribulletup' => '25b2', 'opentribulletup' => '25b3', 'filledrighttribullet' => '25b6', 'rightopentriangle' => '25b7', 'filledtribulletdown' => '25bc', 'opentribulletdown' => '25bd', 'filledlefttribullet' => '25c0', 'leftopentriangle' => '25c1', 'soliddiamond' => '25c6', 'circle' => '25cb', 'emopencircle' => '25cb', 'emfilledcircle' => '25cf', 'enopencircbullet' => '25e6', 'openstar' => '2606', 'telephone' => '260e', 'signaturemark' => '2613', 'leftpointer' => '261c', 'rightpointer' => '261e', 'femalesymbol' => '2640', 'malesymbol' => '2642', 'club' => '2663', 'heart' => '2665', 'diamond' => '2666', 'musicalflat' => '266d', 'musicalsharp' => '266f', 'checkmark' => '2713', 'ballotcross' => '2717', 'latincross' => '271d', 'maltesecross' => '2720', 'braille_dots_1' => '2801', 'braille_dots_2' => '2802', 'braille_dots_12' => '2803', 'braille_dots_3' => '2804', 'braille_dots_13' => '2805', 'braille_dots_23' => '2806', 'braille_dots_123' => '2807', 'braille_dots_4' => '2808', 'braille_dots_14' => '2809', 'braille_dots_24' => '280a', 'braille_dots_124' => '280b', 'braille_dots_34' => '280c', 'braille_dots_134' => '280d', 'braille_dots_234' => '280e', 'braille_dots_1234' => '280f', 'braille_dots_5' => '2810', 'braille_dots_15' => '2811', 'braille_dots_25' => '2812', 'braille_dots_125' => '2813', 'braille_dots_35' => '2814', 'braille_dots_135' => '2815', 'braille_dots_235' => '2816', 'braille_dots_1235' => '2817', 'braille_dots_45' => '2818', 'braille_dots_145' => '2819', 'braille_dots_245' => '281a', 'braille_dots_1245' => '281b', 'braille_dots_345' => '281c', 'braille_dots_1345' => '281d', 'braille_dots_2345' => '281e', 'braille_dots_12345' => '281f', 'braille_dots_6' => '2820', 'braille_dots_16' => '2821', 'braille_dots_26' => '2822', 'braille_dots_126' => '2823', 'braille_dots_36' => '2824', 'braille_dots_136' => '2825', 'braille_dots_236' => '2826', 'braille_dots_1236' => '2827', 'braille_dots_46' => '2828', 'braille_dots_146' => '2829', 'braille_dots_246' => '282a', 'braille_dots_1246' => '282b', 'braille_dots_346' => '282c', 'braille_dots_1346' => '282d', 'braille_dots_2346' => '282e', 'braille_dots_12346' => '282f', 'braille_dots_56' => '2830', 'braille_dots_156' => '2831', 'braille_dots_256' => '2832', 'braille_dots_1256' => '2833', 'braille_dots_356' => '2834', 'braille_dots_1356' => '2835', 'braille_dots_2356' => '2836', 'braille_dots_12356' => '2837', 'braille_dots_456' => '2838', 'braille_dots_1456' => '2839', 'braille_dots_2456' => '283a', 'braille_dots_12456' => '283b', 'braille_dots_3456' => '283c', 'braille_dots_13456' => '283d', 'braille_dots_23456' => '283e', 'braille_dots_123456' => '283f', 'braille_dots_7' => '2840', 'braille_dots_17' => '2841', 'braille_dots_27' => '2842', 'braille_dots_127' => '2843', 'braille_dots_37' => '2844', 'braille_dots_137' => '2845', 'braille_dots_237' => '2846', 'braille_dots_1237' => '2847', 'braille_dots_47' => '2848', 'braille_dots_147' => '2849', 'braille_dots_247' => '284a', 'braille_dots_1247' => '284b', 'braille_dots_347' => '284c', 'braille_dots_1347' => '284d', 'braille_dots_2347' => '284e', 'braille_dots_12347' => '284f', 'braille_dots_57' => '2850', 'braille_dots_157' => '2851', 'braille_dots_257' => '2852', 'braille_dots_1257' => '2853', 'braille_dots_357' => '2854', 'braille_dots_1357' => '2855', 'braille_dots_2357' => '2856', 'braille_dots_12357' => '2857', 'braille_dots_457' => '2858', 'braille_dots_1457' => '2859', 'braille_dots_2457' => '285a', 'braille_dots_12457' => '285b', 'braille_dots_3457' => '285c', 'braille_dots_13457' => '285d', 'braille_dots_23457' => '285e', 'braille_dots_123457' => '285f', 'braille_dots_67' => '2860', 'braille_dots_167' => '2861', 'braille_dots_267' => '2862', 'braille_dots_1267' => '2863', 'braille_dots_367' => '2864', 'braille_dots_1367' => '2865', 'braille_dots_2367' => '2866', 'braille_dots_12367' => '2867', 'braille_dots_467' => '2868', 'braille_dots_1467' => '2869', 'braille_dots_2467' => '286a', 'braille_dots_12467' => '286b', 'braille_dots_3467' => '286c', 'braille_dots_13467' => '286d', 'braille_dots_23467' => '286e', 'braille_dots_123467' => '286f', 'braille_dots_567' => '2870', 'braille_dots_1567' => '2871', 'braille_dots_2567' => '2872', 'braille_dots_12567' => '2873', 'braille_dots_3567' => '2874', 'braille_dots_13567' => '2875', 'braille_dots_23567' => '2876', 'braille_dots_123567' => '2877', 'braille_dots_4567' => '2878', 'braille_dots_14567' => '2879', 'braille_dots_24567' => '287a', 'braille_dots_124567' => '287b', 'braille_dots_34567' => '287c', 'braille_dots_134567' => '287d', 'braille_dots_234567' => '287e', 'braille_dots_1234567' => '287f', 'braille_dots_8' => '2880', 'braille_dots_18' => '2881', 'braille_dots_28' => '2882', 'braille_dots_128' => '2883', 'braille_dots_38' => '2884', 'braille_dots_138' => '2885', 'braille_dots_238' => '2886', 'braille_dots_1238' => '2887', 'braille_dots_48' => '2888', 'braille_dots_148' => '2889', 'braille_dots_248' => '288a', 'braille_dots_1248' => '288b', 'braille_dots_348' => '288c', 'braille_dots_1348' => '288d', 'braille_dots_2348' => '288e', 'braille_dots_12348' => '288f', 'braille_dots_58' => '2890', 'braille_dots_158' => '2891', 'braille_dots_258' => '2892', 'braille_dots_1258' => '2893', 'braille_dots_358' => '2894', 'braille_dots_1358' => '2895', 'braille_dots_2358' => '2896', 'braille_dots_12358' => '2897', 'braille_dots_458' => '2898', 'braille_dots_1458' => '2899', 'braille_dots_2458' => '289a', 'braille_dots_12458' => '289b', 'braille_dots_3458' => '289c', 'braille_dots_13458' => '289d', 'braille_dots_23458' => '289e', 'braille_dots_123458' => '289f', 'braille_dots_68' => '28a0', 'braille_dots_168' => '28a1', 'braille_dots_268' => '28a2', 'braille_dots_1268' => '28a3', 'braille_dots_368' => '28a4', 'braille_dots_1368' => '28a5', 'braille_dots_2368' => '28a6', 'braille_dots_12368' => '28a7', 'braille_dots_468' => '28a8', 'braille_dots_1468' => '28a9', 'braille_dots_2468' => '28aa', 'braille_dots_12468' => '28ab', 'braille_dots_3468' => '28ac', 'braille_dots_13468' => '28ad', 'braille_dots_23468' => '28ae', 'braille_dots_123468' => '28af', 'braille_dots_568' => '28b0', 'braille_dots_1568' => '28b1', 'braille_dots_2568' => '28b2', 'braille_dots_12568' => '28b3', 'braille_dots_3568' => '28b4', 'braille_dots_13568' => '28b5', 'braille_dots_23568' => '28b6', 'braille_dots_123568' => '28b7', 'braille_dots_4568' => '28b8', 'braille_dots_14568' => '28b9', 'braille_dots_24568' => '28ba', 'braille_dots_124568' => '28bb', 'braille_dots_34568' => '28bc', 'braille_dots_134568' => '28bd', 'braille_dots_234568' => '28be', 'braille_dots_1234568' => '28bf', 'braille_dots_78' => '28c0', 'braille_dots_178' => '28c1', 'braille_dots_278' => '28c2', 'braille_dots_1278' => '28c3', 'braille_dots_378' => '28c4', 'braille_dots_1378' => '28c5', 'braille_dots_2378' => '28c6', 'braille_dots_12378' => '28c7', 'braille_dots_478' => '28c8', 'braille_dots_1478' => '28c9', 'braille_dots_2478' => '28ca', 'braille_dots_12478' => '28cb', 'braille_dots_3478' => '28cc', 'braille_dots_13478' => '28cd', 'braille_dots_23478' => '28ce', 'braille_dots_123478' => '28cf', 'braille_dots_578' => '28d0', 'braille_dots_1578' => '28d1', 'braille_dots_2578' => '28d2', 'braille_dots_12578' => '28d3', 'braille_dots_3578' => '28d4', 'braille_dots_13578' => '28d5', 'braille_dots_23578' => '28d6', 'braille_dots_123578' => '28d7', 'braille_dots_4578' => '28d8', 'braille_dots_14578' => '28d9', 'braille_dots_24578' => '28da', 'braille_dots_124578' => '28db', 'braille_dots_34578' => '28dc', 'braille_dots_134578' => '28dd', 'braille_dots_234578' => '28de', 'braille_dots_1234578' => '28df', 'braille_dots_678' => '28e0', 'braille_dots_1678' => '28e1', 'braille_dots_2678' => '28e2', 'braille_dots_12678' => '28e3', 'braille_dots_3678' => '28e4', 'braille_dots_13678' => '28e5', 'braille_dots_23678' => '28e6', 'braille_dots_123678' => '28e7', 'braille_dots_4678' => '28e8', 'braille_dots_14678' => '28e9', 'braille_dots_24678' => '28ea', 'braille_dots_124678' => '28eb', 'braille_dots_34678' => '28ec', 'braille_dots_134678' => '28ed', 'braille_dots_234678' => '28ee', 'braille_dots_1234678' => '28ef', 'braille_dots_5678' => '28f0', 'braille_dots_15678' => '28f1', 'braille_dots_25678' => '28f2', 'braille_dots_125678' => '28f3', 'braille_dots_35678' => '28f4', 'braille_dots_135678' => '28f5', 'braille_dots_235678' => '28f6', 'braille_dots_1235678' => '28f7', 'braille_dots_45678' => '28f8', 'braille_dots_145678' => '28f9', 'braille_dots_245678' => '28fa', 'braille_dots_1245678' => '28fb', 'braille_dots_345678' => '28fc', 'braille_dots_1345678' => '28fd', 'braille_dots_2345678' => '28fe', 'braille_dots_12345678' => '28ff', 'kana_comma' => '3001', 'kana_fullstop' => '3002', 'kana_openingbracket' => '300c', 'kana_closingbracket' => '300d', 'voicedsound' => '309b', 'semivoicedsound' => '309c', 'kana_a' => '30a1', 'kana_A' => '30a2', 'kana_i' => '30a3', 'kana_I' => '30a4', 'kana_u' => '30a5', 'kana_U' => '30a6', 'kana_e' => '30a7', 'kana_E' => '30a8', 'kana_o' => '30a9', 'kana_O' => '30aa', 'kana_KA' => '30ab', 'kana_KI' => '30ad', 'kana_KU' => '30af', 'kana_KE' => '30b1', 'kana_KO' => '30b3', 'kana_SA' => '30b5', 'kana_SHI' => '30b7', 'kana_SU' => '30b9', 'kana_SE' => '30bb', 'kana_SO' => '30bd', 'kana_TA' => '30bf', 'kana_CHI' => '30c1', 'kana_tsu' => '30c3', 'kana_TSU' => '30c4', 'kana_TE' => '30c6', 'kana_TO' => '30c8', 'kana_NA' => '30ca', 'kana_NI' => '30cb', 'kana_NU' => '30cc', 'kana_NE' => '30cd', 'kana_NO' => '30ce', 'kana_HA' => '30cf', 'kana_HI' => '30d2', 'kana_FU' => '30d5', 'kana_HE' => '30d8', 'kana_HO' => '30db', 'kana_MA' => '30de', 'kana_MI' => '30df', 'kana_MU' => '30e0', 'kana_ME' => '30e1', 'kana_MO' => '30e2', 'kana_ya' => '30e3', 'kana_YA' => '30e4', 'kana_yu' => '30e5', 'kana_YU' => '30e6', 'kana_yo' => '30e7', 'kana_YO' => '30e8', 'kana_RA' => '30e9', 'kana_RI' => '30ea', 'kana_RU' => '30eb', 'kana_RE' => '30ec', 'kana_RO' => '30ed', 'kana_WA' => '30ef', 'kana_WO' => '30f2', 'kana_N' => '30f3', 'kana_conjunctive' => '30fb', 'kana_middledot' => '30fb', # Is this recognised by X ? 'prolongedsound' => '30fc', 'Hangul_Kiyeog' => '3131', 'Hangul_SsangKiyeog' => '3132', 'Hangul_KiyeogSios' => '3133', 'Hangul_Nieun' => '3134', 'Hangul_NieunJieuj' => '3135', 'Hangul_NieunHieuh' => '3136', 'Hangul_Dikeud' => '3137', 'Hangul_SsangDikeud' => '3138', 'Hangul_Rieul' => '3139', 'Hangul_RieulKiyeog' => '313a', 'Hangul_RieulMieum' => '313b', 'Hangul_RieulPieub' => '313c', 'Hangul_RieulSios' => '313d', 'Hangul_RieulTieut' => '313e', 'Hangul_RieulPhieuf' => '313f', 'Hangul_RieulHieuh' => '3140', 'Hangul_Mieum' => '3141', 'Hangul_Pieub' => '3142', 'Hangul_SsangPieub' => '3143', 'Hangul_PieubSios' => '3144', 'Hangul_Sios' => '3145', 'Hangul_SsangSios' => '3146', 'Hangul_Ieung' => '3147', 'Hangul_Jieuj' => '3148', 'Hangul_SsangJieuj' => '3149', 'Hangul_Cieuc' => '314a', 'Hangul_Khieuq' => '314b', 'Hangul_Tieut' => '314c', 'Hangul_Phieuf' => '314d', 'Hangul_Hieuh' => '314e', 'Hangul_A' => '314f', 'Hangul_AE' => '3150', 'Hangul_YA' => '3151', 'Hangul_YAE' => '3152', 'Hangul_EO' => '3153', 'Hangul_E' => '3154', 'Hangul_YEO' => '3155', 'Hangul_YE' => '3156', 'Hangul_O' => '3157', 'Hangul_WA' => '3158', 'Hangul_WAE' => '3159', 'Hangul_OE' => '315a', 'Hangul_YO' => '315b', 'Hangul_U' => '315c', 'Hangul_WEO' => '315d', 'Hangul_WE' => '315e', 'Hangul_WI' => '315f', 'Hangul_YU' => '3160', 'Hangul_EU' => '3161', 'Hangul_YI' => '3162', 'Hangul_I' => '3163', 'Hangul_RieulYeorinHieuh' => '316d', 'Hangul_SunkyeongeumMieum' => '3171', 'Hangul_SunkyeongeumPieub' => '3178', 'Hangul_PanSios' => '317f', 'Hangul_KkogjiDalrinIeung' => '3181', 'Hangul_SunkyeongeumPhieuf' => '3184', 'Hangul_YeorinHieuh' => '3186', 'Hangul_AraeA' => '318d', 'Hangul_AraeAE' => '318e', ); if ($freebsd) { %xkbsym_table = (%xkbsym_table, # Control symbols 'BackSpace' => 'bs', # 0008 'Tab' => 'ht', # 0009 'Linefeed' => 'nl', # 000a 'Return' => 'cr', # 000d 'Escape' => 'esc', # 001b # Keypad keys 'KP_Multiply' => '\'*\'', 'KP_Add' => 'fkey56', 'KP_Seprator' => '\',\'', # Is this recognised by X ? 'KP_Separator' => '\',\'', 'KP_Subtract' => 'fkey52', 'KP_Decimal' => '\'.\'', 'KP_Divide' => '\'/\'', 'KP_0' => '\'0\'', 'KP_1' => '\'1\'', 'KP_2' => '\'2\'', 'KP_3' => '\'3\'', 'KP_4' => '\'4\'', 'KP_5' => '\'5\'', 'KP_6' => '\'6\'', 'KP_7' => '\'7\'', 'KP_8' => '\'8\'', 'KP_9' => '\'9\'', 'KP_Enter' => 'cr', 'KP_Home' => 'fkey49', 'KP_Left' => 'fkey53', 'KP_Up' => 'fkey50', 'KP_Right' => 'fkey55', 'KP_Down' => 'fkey58', 'KP_Prior' => 'fkey51', 'KP_Page_Up' => 'fkey51', 'KP_Next' => 'fkey59', 'KP_Page_Down' => 'fkey59', 'KP_End' => 'fkey57', 'KP_Begin' => 'fkey54', 'KP_Insert' => 'fkey60', 'KP_Delete' => 'del', 'KP_Space' => 'sp', 'KP_Equal' => '\'=\'', 'KP_Tab' => 'ht', 'KP_F1' => 'fkey01', 'KP_F2' => 'fkey02', 'KP_F3' => 'fkey03', 'KP_F4' => 'fkey04', # Dead symbols 'dead_grave' => 'dgra', 'SunFA_Grave' => 'dgra_grave', # Is this recognised by X ? 'dead_acute' => 'dacu', 'SunFA_Acute' => 'dacu', # Is this recognised by X ? 'dead_circumflex' => 'dcir', 'SunFA_Circum' => 'dcir', # Is this recognised by X ? 'dead_tilde' => 'dtil', 'SunFA_Tilde' => 'dtil', 'dead_breve' => 'dbre', 'dead_diaeresis' => 'ddia', 'SunFA_Diaeresis' => 'ddia', # Is this recognised by X ? 'dead_doubleacute' => 'ddac', 'dead_caron' => 'dcar', 'dead_V' => 'dcar', # Is this correct? 'dead_cedilla' => 'dced', 'SunFA_Cedilla' => 'dced', # Is this recognised by X ? 'dead_ogonek' => 'dogo', 'dead_macron' => 'dmac', 'dead_abovedot' => 'ddot', 'dead_abovering' => 'drin', 'dead_stroke' => 'nop', 'dead_belowdot' => '0323', # ???? Vietnamese 'dead_hook' => 'dsla', # ???? Vietnamese 'dead_belowcomma' => 'nop', 'dead_currency' => 'nop', 'dead_doublegrave' => 'nop', 'dead_invertedbreve' => 'nop', 'dead_iota' => '03b9', # ???? Greek 'dead_horn' => '031b', # ???? Greek 'dead_psili' => 'nop', # ???? Greek 'dead_dasia' => 'nop', # ???? Greek 'dead_greek' => 'fe8c', # Modifiers 'Multi_key' => 'nop', 'Mode_switch' => 'ashift', 'script_switch' => 'nop', 'Shift_L' => 'lshift', 'Shift_R' => 'rshift', 'Control_L' => 'lctrl', 'Control_R' => 'rctrl', 'Caps_Lock' => 'clock', 'Shift_Lock' => 'clock', 'Meta_L' => 'meta', 'Meta_R' => 'meta', 'Alt_L' => 'lalt', 'Alt_R' => 'ralt', 'Super_L' => 'fkey62', 'Super_R' => 'fkey63', 'Hyper_L' => 'meta', 'Hyper_R' => 'meta', 'ISO_Lock' => 'clock', 'ISO_Level2_Latch' => 'lshift', 'ISO_Level3_Shift' => 'alt', 'ISO_Level3_Latch' => 'alt', 'ISO_Level3_Lock' => 'alta', 'ISO_Level5_Shift' => 'alt', 'ISO_Level5_Latch' => 'alt', 'ISO_Level5_Lock' => 'alta', 'ISO_Group_Shift' => 'ashift', 'ISO_Group_Latch' => 'ashift', 'ISO_Group_Lock' => 'alock', 'ISO_Next_Group' => 'alock', 'ISO_Next_Group_Lock' => 'alock', 'ISO_Prev_Group' => 'alock', 'ISO_Prev_Group_Lock' => 'alock', 'ISO_First_Group' => 'alock', 'ISO_First_Group_Lock' => 'alock', 'ISO_Last_Group' => 'alock', 'ISO_Last_Group_Lock' => 'alock', # Other symbols 'NoAction' => 'NoSymbol', # Is this recognised by X ? 'nosymbol' => 'NoSymbol', # Is this recognised by X ? 'Nosymbol' => 'NoSymbol', # Is this recognised by X ? 'noSymbol' => 'NoSymbol', # Is this recognised by X ? 'NoSymbol' => 'NoSymbol', 'any' => 'NoSymbol', # Is this recognised by X ? 'VoidSymbol' => 'nop', 'voidsymbol' => 'nop', # Is this recognised by X ? 'ISO_Left_Tab' => 'ht', 'Clear' => 'nop', 'Pause' => 'saver', 'Scroll_Lock' => 'slock', 'Sys_Req' => 'nop', 'Delete' => 'fkey61', 'Codeinput' => 'nop', 'SingleCandidate' => 'nop', 'MultipleCandidate' => 'nop', 'PreviousCandidate' => 'nop', 'Home' => 'fkey49', 'Left' => 'fkey53', 'Up' => 'fkey50', 'Right' => 'fkey55', 'Down' => 'fkey58', 'Prior' => 'fkey51', 'Page_Up' => 'fkey51', 'Next' => 'fkey59', 'Page_Down' => 'fkey59', 'End' => 'fkey57', 'Begin' => 'fkey54', 'Select' => 'fkey57', 'Print' => 'nscr', 'Execute' => 'nop', 'Insert' => 'fkey60', 'Undo' => 'nop', 'Redo' => 'nop', 'Menu' => 'fkey64', 'Find' => 'fkey49', 'Cancel' => 'nop', 'Help' => 'slock', # Is this correct? 'Break' => 'nop', 'Num_Lock' => 'nlock', 'F1' => 'fkey01', 'F2' => 'fkey02', 'F3' => 'fkey03', 'F4' => 'fkey04', 'F5' => 'fkey05', 'F6' => 'fkey06', 'F7' => 'fkey07', 'F8' => 'fkey08', 'F9' => 'fkey09', 'F10' => 'fkey10', 'F11' => 'fkey11', 'L1' => 'fkey11', 'F12' => 'fkey12', 'L2' => 'fkey12', 'F13' => 'fkey13', 'L3' => 'fkey13', 'F14' => 'fkey14', 'L4' => 'fkey14', 'F15' => 'fkey15', 'L5' => 'fkey15', 'F16' => 'fkey16', 'L6' => 'fkey16', 'F17' => 'fkey17', 'L7' => 'fkey17', 'F18' => 'fkey18', 'L8' => 'fkey18', 'F19' => 'fkey19', 'L9' => 'fkey19', 'F20' => 'fkey20', 'L10' => 'fkey20', 'F21' => 'fkey21', 'R1' => 'fkey21', 'F22' => 'fkey22', 'R2' => 'fkey22', 'F23' => 'fkey23', 'R3' => 'fkey23', 'F24' => 'fkey24', 'R4' => 'fkey24', 'F25' => 'fkey25', 'R5' => 'fkey25', 'F26' => 'fkey26', 'R6' => 'fkey26', 'F27' => 'fkey27', 'R7' => 'fkey27', 'F28' => 'fkey28', 'R8' => 'fkey28', 'F29' => 'fkey29', 'R9' => 'fkey29', 'F30' => 'fkey30', 'R10' => 'fkey30', 'F31' => 'fkey31', 'R11' => 'fkey31', 'F32' => 'fkey32', 'R12' => 'fkey32', 'F33' => 'fkey33', 'R13' => 'fkey33', 'F34' => 'fkey34', 'R14' => 'fkey34', 'F35' => 'fkey35', 'R15' => 'fkey35', 'Terminate_Server' => 'nop', 'Pointer_EnableKeys' => 'nop', 'XF86_Switch_VT_1' => 'scr01', 'XF86_Switch_VT_2' => 'scr02', 'XF86_Switch_VT_3' => 'scr03', 'XF86_Switch_VT_4' => 'scr04', 'XF86_Switch_VT_5' => 'scr05', 'XF86_Switch_VT_6' => 'scr06', 'XF86_Switch_VT_7' => 'scr07', 'XF86_Switch_VT_8' => 'scr08', 'XF86_Switch_VT_9' => 'scr09', 'XF86_Switch_VT_10' => 'scr10', 'XF86_Switch_VT_11' => 'scr11', 'XF86_Switch_VT_12' => 'scr12', 'XF86_ClearGrab' => 'nop', 'XF86_Ungrab' => 'nop', 'XF86_Next_VMode' => 'nop', 'XF86_Prev_VMode' => 'nop', 'XF86Copy' => 'nop', 'XF86Cut' => 'nop', 'XF86Paste' => 'nop', 'XF86AudioLowerVolume' => 'nop', 'XF86AudioRaiseVolume' => 'nop', 'XF86AudioMute' => 'nop', 'XF86PowerOff' => 'nop', 'XF86AudioForward' => 'nop', 'XF86AudioMedia' => 'nop', 'XF86AudioNext' => 'nop', 'XF86AudioPause' => 'nop', 'XF86AudioPlay' => 'nop', 'XF86AudioPrev' => 'nop', 'XF86AudioRecord' => 'nop', 'XF86AudioRewind' => 'nop', 'XF86AudioStop' => 'nop', 'XF86Back' => 'nop', 'XF86Battery' => 'nop', 'XF86Bluetooth' => 'nop', 'XF86Calculator' => 'nop', 'XF86Close' => 'nop', 'XF86Display' => 'nop', 'XF86Documents' => 'nop', 'XF86DOS' => 'nop', 'XF86Eject' => 'nop', 'XF86Explorer' => 'nop', 'XF86Favorites' => 'nop', 'XF86Finance' => 'nop', 'XF86Forward' => 'nop', 'XF86HomePage' => 'nop', 'XF86KbdBrightnessDown' => 'nop', 'XF86KbdBrightnessUp' => 'nop', 'XF86KbdLightOnOff' => 'nop', 'XF86Launch1' => 'nop', 'XF86Launch2' => 'nop', 'XF86Launch3' => 'nop', 'XF86Launch4' => 'nop', 'XF86Mail' => 'nop', 'XF86MailForward' => 'nop', 'XF86MenuKB' => 'nop', 'XF86MonBrightnessDown' => 'nop', 'XF86MonBrightnessUp' => 'nop', 'XF86MyComputer' => 'nop', 'XF86New' => 'nop', 'XF86Phone' => 'nop', 'XF86Reload' => 'nop', 'XF86Reply' => 'nop', 'XF86RotateWindows' => 'nop', 'XF86Save' => 'nop', 'XF86ScreenSaver' => 'nop', 'XF86ScrollDown' => 'nop', 'XF86ScrollUp' => 'nop', 'XF86Search' => 'nop', 'XF86Send' => 'nop', 'XF86Shop' => 'nop', 'XF86Sleep' => 'nop', 'XF86Suspend' => 'nop', 'XF86Tools' => 'nop', 'XF86TouchpadToggle' => 'nop', 'XF86WakeUp' => 'nop', 'XF86WebCam' => 'nop', 'XF86WLAN' => 'nop', 'XF86WWW' => 'nop', 'XF86Xfer' => 'nop', 'braille_blank' => '2800', # What does correspond to these? 'braille_dot_1' => 'nop', 'braille_dot_2' => 'nop', 'braille_dot_3' => 'nop', 'braille_dot_4' => 'nop', 'braille_dot_5' => 'nop', 'braille_dot_6' => 'nop', 'braille_dot_7' => 'nop', 'braille_dot_8' => 'nop', 'braille_dot_9' => 'nop', 'braille_dot_10' => 'nop', # I do not know the Unicodes of these '0x1000' => 'nop', # Special symbol for X or syntax error? '0x13a4' => 'nop', # Special symbol for X or syntax error? '0xfe11' => 'nop', # Special symbol for X or syntax error? 'leftcaret' => 'nop', # Is this recognised by X ? 'guj_rra' => 'nop', # Is this recognised by X ? 'guj_nnna' => 'nop', # Is this recognised by X ? 'guj_llla' => 'nop', # Is this recognised by X ? 'gur_visarga' => 'nop', # Is this recognised by X ? 'gur_v_r' => 'nop', # Is this recognised by X ? 'gur_v_r_s' => 'nop', # Is this recognised by X ? 'Eisu_toggle' => 'nop', # Is this recognised by X ? 'Zenkaku_Hankaku' => 'nop', # Is this recognised by X ? 'Kanji' => 'nop', # Is this recognised by X ? 'Hangul' => 'nop', # Is this recognised by X ? 'Hangul_Hanja' => 'nop', # Is this recognised by X ? 'Henkan' => 'nop', 'Hiragana' => 'nop', 'Hiragana_Katakana' => 'nop', 'Katakana' => 'nop', 'Muhenkan' => 'nop', # XFree86 does not recognise these 'SunAudioLowerVolume' => 'nop', 'SunAudioRaiseVolume' => 'nop', 'SunAudioMute' => 'nop', 'SunCopy' => 'nop', 'SunCut' => 'nop', 'SunPaste' => 'nop', 'SunAgain' => 'nop', 'SunUndo' => 'nop', 'SunFind' => 'nop', 'SunStop' => 'nop', 'SunF36' => 'nop', 'SunF37' => 'nop', 'SunFront' => 'nop', 'SunOpen' => 'nop', 'SunPowerSwitch' => 'nop', 'SunPowerSwitchShift' => 'nop', 'SunProps' => 'nop', 'SunSys_Req' => 'nop', 'SunVideoDegauss' => 'nop', 'SunVideoLowerBrightness' => 'nop', 'SunVideoRaiseBrightness' => 'nop', ); if ($backspace eq 'del') { $xkbsym_table{'BackSpace'} = 'del'; $xkbsym_table{'Delete'} = 'fkey70'; $xkbsym_table{'KP_Delete'} = 'fkey70'; } } else { %xkbsym_table = (%xkbsym_table, # Control symbols 'BackSpace' => 'Delete', # 0008 'Tab' => 'Tab', # 0009 'Linefeed' => 'Linefeed', # 000a 'Return' => 'Return', # 000d 'Escape' => 'Escape', # 001b # Keypad keys 'KP_Multiply' => 'KP_Multiply', 'KP_Add' => 'KP_Add', 'KP_Seprator' => 'KP_Comma', # Is this recognised by X ? 'KP_Separator' => 'KP_Comma', 'KP_Subtract' => 'KP_Subtract', 'KP_Decimal' => 'KP_Period', 'KP_Divide' => 'KP_Divide', 'KP_0' => 'KP_0', 'KP_1' => 'KP_1', 'KP_2' => 'KP_2', 'KP_3' => 'KP_3', 'KP_4' => 'KP_4', 'KP_5' => 'KP_5', 'KP_6' => 'KP_6', 'KP_7' => 'KP_7', 'KP_8' => 'KP_8', 'KP_9' => 'KP_9', 'KP_Enter' => 'KP_Enter', # Keypad keys (alternate level) 'KP_Home' => 'KP_7', 'KP_Left' => 'KP_4', 'KP_Up' => 'KP_8', 'KP_Right' => 'KP_6', 'KP_Down' => 'KP_2', 'KP_Prior' => 'KP_9', 'KP_Page_Up' => 'KP_9', 'KP_Next' => 'KP_3', 'KP_Page_Down' => 'KP_3', 'KP_End' => 'KP_1', 'KP_Begin' => 'VoidSymbol', # What does correspond to this? 'KP_Insert' => 'KP_0', 'KP_Delete' => 'VoidSymbol', # has to be 'KP_Period' or 'KP_Decimal' # Keypad keys with missing support in the kernel 'KP_Space' => 'space', 'KP_Equal' => 'equal', 'KP_Tab' => 'Tab', 'KP_F1' => 'F1', 'KP_F2' => 'F2', 'KP_F3' => 'F3', 'KP_F4' => 'F4', # Dead symbols 'dead_grave' => 'dead_grave', 'SunFA_Grave' => 'dead_grave', # Is this recognised by X ? 'dead_acute' => 'dead_acute', 'SunFA_Acute' => 'dead_acute', # Is this recognised by X ? 'dead_circumflex' => 'dead_circumflex', 'SunFA_Circum' => 'dead_circumflex', # Is this recognised by X ? 'dead_tilde' => 'dead_tilde', 'SunFA_Tilde' => 'dead_tilde', 'dead_breve' => 'dead_kbreve', 'dead_diaeresis' => 'dead_diaeresis', 'SunFA_Diaeresis' => 'dead_diaeresis', # Is this recognised by X ? 'dead_doubleacute' => 'dead_kdoubleacute', 'dead_caron' => 'dead_kcaron', 'dead_V' => 'dead_caron', # Is this correct? 'dead_cedilla' => 'dead_cedilla', 'SunFA_Cedilla' => 'dead_cedilla', # Is this recognised by X ? 'dead_ogonek' => 'dead_kogonek', 'dead_macron' => 'dead_macron', 'dead_abovedot' => 'dead_abovedot', 'dead_abovering' => 'dead_abovering', 'dead_stroke' => 'dead_stroke', 'dead_belowdot' => 'dead_belowdot', 'dead_hook' => 'dead_hook', 'dead_belowcomma' => 'dead_belowcomma', 'dead_currency' => 'dead_currency', 'dead_doublegrave' => 'dead_doublegrave', 'dead_invertedbreve' => 'dead_invertedbreve', 'dead_iota' => 'dead_iota', 'dead_horn' => 'dead_horn', # Dead symbols with no support in the kernel 'dead_psili' => 'VoidSymbol', # ???? Greek 'dead_dasia' => 'VoidSymbol', # ???? Greek # Modifiers 'Multi_key' => 'Compose', 'Mode_switch' => 'ShiftL', 'script_switch' => 'VoidSymbol', 'Shift_L' => 'Shift', 'Shift_R' => 'Shift', 'Control_L' => 'Control', 'Control_R' => 'Control', 'Caps_Lock' => 'Caps_Lock', 'Shift_Lock' => 'Shift_Lock', 'Meta_L' => 'Alt', 'Meta_R' => 'Alt', 'Alt_L' => 'Alt', 'Alt_R' => 'Alt', 'Super_L' => 'Alt', 'Super_R' => 'Alt', 'Hyper_L' => 'Alt', 'Hyper_R' => 'Alt', 'ISO_Lock' => 'Caps_Lock', 'ISO_Level2_Latch' => 'Shift', 'ISO_Level3_Shift' => 'AltGr', 'ISO_Level3_Latch' => 'AltGr', 'ISO_Level3_Lock' => 'AltGr_Lock', 'ISO_Level5_Shift' => 'AltGr', 'ISO_Level5_Latch' => 'AltGr', 'ISO_Level5_Lock' => 'AltGr_Lock', 'ISO_Group_Shift' => 'ShiftL', 'ISO_Group_Latch' => 'ShiftL', 'ISO_Group_Lock' => 'ShiftL_Lock', 'ISO_Next_Group' => 'ShiftL_Lock', 'ISO_Next_Group_Lock' => 'ShiftL_Lock', 'ISO_Prev_Group' => 'ShiftL_Lock', 'ISO_Prev_Group_Lock' => 'ShiftL_Lock', 'ISO_First_Group' => 'ShiftL_Lock', 'ISO_First_Group_Lock' => 'ShiftL_Lock', 'ISO_Last_Group' => 'ShiftL_Lock', 'ISO_Last_Group_Lock' => 'ShiftL_Lock', # Other symbols 'NoAction' => 'NoSymbol', # Is this recognised by X ? 'nosymbol' => 'NoSymbol', # Is this recognised by X ? 'Nosymbol' => 'NoSymbol', # Is this recognised by X ? 'noSymbol' => 'NoSymbol', # Is this recognised by X ? 'NoSymbol' => 'NoSymbol', 'any' => 'NoSymbol', # Is this recognised by X ? 'VoidSymbol' => 'VoidSymbol', 'voidsymbol' => 'VoidSymbol', # Is this recognised by X ? 'ISO_Left_Tab' => 'Meta_Tab', 'Clear' => 'VoidSymbol', 'Pause' => 'Pause', 'Scroll_Lock' => 'Scroll_Lock', 'Sys_Req' => 'Last_Console', 'Delete' => 'Remove', 'Codeinput' => 'VoidSymbol', 'SingleCandidate' => 'VoidSymbol', 'MultipleCandidate' => 'VoidSymbol', 'PreviousCandidate' => 'VoidSymbol', 'Home' => 'Home', 'Left' => 'Left', 'Up' => 'Up', 'Right' => 'Right', 'Down' => 'Down', 'Prior' => 'Prior', 'Page_Up' => 'PageUp', 'Next' => 'Next', 'Page_Down' => 'PageDown', 'End' => 'End', 'Begin' => 'VoidSymbol', 'Select' => 'Select', 'Print' => 'Control_backslash', 'Execute' => 'VoidSymbol', 'Insert' => 'Insert', 'Undo' => 'VoidSymbol', 'Redo' => 'VoidSymbol', 'Menu' => 'VoidSymbol', 'Find' => 'Find', 'Cancel' => 'VoidSymbol', 'Help' => 'Help', 'Break' => 'Break', 'Num_Lock' => 'Num_Lock', 'F1' => 'F1', 'F2' => 'F2', 'F3' => 'F3', 'F4' => 'F4', 'F5' => 'F5', 'F6' => 'F6', 'F7' => 'F7', 'F8' => 'F8', 'F9' => 'F9', 'F10' => 'F10', 'F11' => 'F11', 'L1' => 'F11', 'F12' => 'F12', 'L2' => 'F12', 'F13' => 'F13', 'L3' => 'F13', 'F14' => 'F14', 'L4' => 'F14', 'F15' => 'F15', 'L5' => 'F15', 'F16' => 'F16', 'L6' => 'F16', 'F17' => 'F17', 'L7' => 'F17', 'F18' => 'F18', 'L8' => 'F18', 'F19' => 'F19', 'L9' => 'F19', 'F20' => 'F20', 'L10' => 'F20', 'F21' => 'F21', 'R1' => 'F21', 'F22' => 'F22', 'R2' => 'F22', 'F23' => 'F23', 'R3' => 'F23', 'F24' => 'F24', 'R4' => 'F24', 'F25' => 'F25', 'R5' => 'F25', 'F26' => 'F26', 'R6' => 'F26', 'F27' => 'F27', 'R7' => 'F27', 'F28' => 'F28', 'R8' => 'F28', 'F29' => 'F29', 'R9' => 'F29', 'F30' => 'F30', 'R10' => 'F30', 'F31' => 'F31', 'R11' => 'F31', 'F32' => 'F32', 'R12' => 'F32', 'F33' => 'F33', 'R13' => 'F33', 'F34' => 'F34', 'R14' => 'F34', 'F35' => 'F35', 'R15' => 'F35', 'Terminate_Server' => 'VoidSymbol', 'Pointer_EnableKeys' => 'VoidSymbol', 'XF86_Switch_VT_1' => 'Console_1', 'XF86_Switch_VT_2' => 'Console_2', 'XF86_Switch_VT_3' => 'Console_3', 'XF86_Switch_VT_4' => 'Console_4', 'XF86_Switch_VT_5' => 'Console_5', 'XF86_Switch_VT_6' => 'Console_6', 'XF86_Switch_VT_7' => 'Console_7', 'XF86_Switch_VT_8' => 'Console_8', 'XF86_Switch_VT_9' => 'Console_9', 'XF86_Switch_VT_10' => 'Console_10', 'XF86_Switch_VT_11' => 'Console_11', 'XF86_Switch_VT_12' => 'Console_12', 'XF86_ClearGrab' => 'VoidSymbol', 'XF86_Ungrab' => 'VoidSymbol', 'XF86_Next_VMode' => 'VoidSymbol', 'XF86_Prev_VMode' => 'VoidSymbol', 'XF86Copy' => 'VoidSymbol', 'XF86Cut' => 'VoidSymbol', 'XF86Paste' => 'VoidSymbol', 'XF86AudioLowerVolume' => 'VoidSymbol', 'XF86AudioRaiseVolume' => 'VoidSymbol', 'XF86AudioMute' => 'VoidSymbol', 'XF86PowerOff' => 'VoidSymbol', 'XF86AudioForward' => 'VoidSymbol', 'XF86AudioMedia' => 'VoidSymbol', 'XF86AudioNext' => 'VoidSymbol', 'XF86AudioPause' => 'VoidSymbol', 'XF86AudioPlay' => 'VoidSymbol', 'XF86AudioPrev' => 'VoidSymbol', 'XF86AudioRecord' => 'VoidSymbol', 'XF86AudioRewind' => 'VoidSymbol', 'XF86AudioStop' => 'VoidSymbol', 'XF86Back' => 'VoidSymbol', 'XF86Battery' => 'VoidSymbol', 'XF86Bluetooth' => 'VoidSymbol', 'XF86Calculator' => 'VoidSymbol', 'XF86Close' => 'VoidSymbol', 'XF86Display' => 'VoidSymbol', 'XF86Documents' => 'VoidSymbol', 'XF86DOS' => 'VoidSymbol', 'XF86Eject' => 'VoidSymbol', 'XF86Explorer' => 'VoidSymbol', 'XF86Favorites' => 'VoidSymbol', 'XF86Finance' => 'VoidSymbol', 'XF86Forward' => 'VoidSymbol', 'XF86HomePage' => 'VoidSymbol', 'XF86KbdBrightnessDown' => 'VoidSymbol', 'XF86KbdBrightnessUp' => 'VoidSymbol', 'XF86KbdLightOnOff' => 'VoidSymbol', 'XF86Launch1' => 'VoidSymbol', 'XF86Launch2' => 'VoidSymbol', 'XF86Launch3' => 'VoidSymbol', 'XF86Launch4' => 'VoidSymbol', 'XF86Mail' => 'VoidSymbol', 'XF86MailForward' => 'VoidSymbol', 'XF86MenuKB' => 'VoidSymbol', 'XF86MonBrightnessDown' => 'VoidSymbol', 'XF86MonBrightnessUp' => 'VoidSymbol', 'XF86MyComputer' => 'VoidSymbol', 'XF86New' => 'VoidSymbol', 'XF86Phone' => 'VoidSymbol', 'XF86Reload' => 'VoidSymbol', 'XF86Reply' => 'VoidSymbol', 'XF86RotateWindows' => 'VoidSymbol', 'XF86Save' => 'VoidSymbol', 'XF86ScreenSaver' => 'VoidSymbol', 'XF86ScrollDown' => 'VoidSymbol', 'XF86ScrollUp' => 'VoidSymbol', 'XF86Search' => 'VoidSymbol', 'XF86Send' => 'VoidSymbol', 'XF86Shop' => 'VoidSymbol', 'XF86Sleep' => 'VoidSymbol', 'XF86Suspend' => 'VoidSymbol', 'XF86Tools' => 'VoidSymbol', 'XF86TouchpadToggle' => 'VoidSymbol', 'XF86WakeUp' => 'VoidSymbol', 'XF86WebCam' => 'VoidSymbol', 'XF86WLAN' => 'VoidSymbol', 'XF86WWW' => 'VoidSymbol', 'XF86Xfer' => 'VoidSymbol', 'braille_blank' => 'Brl_blank', 'braille_dot_1' => 'Brl_dot1', 'braille_dot_2' => 'Brl_dot2', 'braille_dot_3' => 'Brl_dot3', 'braille_dot_4' => 'Brl_dot4', 'braille_dot_5' => 'Brl_dot5', 'braille_dot_6' => 'Brl_dot6', 'braille_dot_7' => 'Brl_dot7', 'braille_dot_8' => 'Brl_dot8', 'braille_dot_9' => 'Brl_dot9', 'braille_dot_10' => 'Brl_dot10', # I do not know the Unicodes of these '0x1000' => 'VoidSymbol', # Special symbol for X or syntax error? '0x13a4' => 'VoidSymbol', # Special symbol for X or syntax error? '0xfe11' => 'VoidSymbol', # Special symbol for X or syntax error? 'leftcaret' => 'VoidSymbol', # Is this recognised by X ? 'guj_rra' => 'VoidSymbol', # Is this recognised by X ? 'guj_nnna' => 'VoidSymbol', # Is this recognised by X ? 'guj_llla' => 'VoidSymbol', # Is this recognised by X ? 'gur_visarga' => 'VoidSymbol', # Is this recognised by X ? 'gur_v_r' => 'VoidSymbol', # Is this recognised by X ? 'gur_v_r_s' => 'VoidSymbol', # Is this recognised by X ? 'Eisu_toggle' => 'VoidSymbol', # Is this recognised by X ? 'Zenkaku_Hankaku' => 'VoidSymbol', # Is this recognised by X ? 'Kanji' => 'VoidSymbol', # Is this recognised by X ? 'Hangul' => 'VoidSymbol', # Is this recognised by X ? 'Hangul_Hanja' => 'VoidSymbol', # Is this recognised by X ? 'Henkan' => 'VoidSymbol', 'Hiragana' => 'VoidSymbol', 'Hiragana_Katakana' => 'VoidSymbol', 'Katakana' => 'VoidSymbol', 'Muhenkan' => 'VoidSymbol', # XFree86 does not recognise these 'SunAudioLowerVolume' => 'VoidSymbol', 'SunAudioRaiseVolume' => 'VoidSymbol', 'SunAudioMute' => 'VoidSymbol', 'SunCopy' => 'VoidSymbol', 'SunCut' => 'VoidSymbol', 'SunPaste' => 'VoidSymbol', 'SunAgain' => 'VoidSymbol', 'SunUndo' => 'VoidSymbol', 'SunFind' => 'VoidSymbol', 'SunStop' => 'VoidSymbol', 'SunF36' => 'VoidSymbol', 'SunF37' => 'VoidSymbol', 'SunFront' => 'VoidSymbol', 'SunOpen' => 'VoidSymbol', 'SunPowerSwitch' => 'VoidSymbol', 'SunPowerSwitchShift' => 'VoidSymbol', 'SunProps' => 'VoidSymbol', 'SunSys_Req' => 'VoidSymbol', 'SunVideoDegauss' => 'VoidSymbol', 'SunVideoLowerBrightness' => 'VoidSymbol', 'SunVideoRaiseBrightness' => 'VoidSymbol', ); if ($compact) { $xkbsym_table{'Mode_switch'} = 'AltGr'; $xkbsym_table{'ISO_Group_Shift'} = 'AltGr'; $xkbsym_table{'ISO_Group_Latch'} = 'AltGr'; $xkbsym_table{'ISO_Group_Lock'} = 'AltGr_Lock'; $xkbsym_table{'ISO_Next_Group'} = 'AltGr_Lock'; $xkbsym_table{'ISO_Next_Group_Lock'} = 'AltGr_Lock'; $xkbsym_table{'ISO_Prev_Group'} = 'AltGr_Lock'; $xkbsym_table{'ISO_Prev_Group_Lock'} = 'AltGr_Lock'; $xkbsym_table{'ISO_First_Group'} = 'AltGr_Lock'; $xkbsym_table{'ISO_First_Group_Lock'} = 'AltGr_Lock'; $xkbsym_table{'ISO_Last_Group'} = 'AltGr_Lock'; $xkbsym_table{'ISO_Last_Group_Lock'} = 'AltGr_Lock'; } if ($backspace eq 'bs') { $xkbsym_table{'BackSpace'} = 'BackSpace'; $xkbsym_table{'Delete'} = 'Delete'; } } my $voidsymbol = $freebsd ? 'nop' : 'VoidSymbol'; my @controlsyms; my @metasyms; my @metacontrolsyms; my %controlsyms_hash; { if ($freebsd) { %controlsyms_hash = ( 'nul' => 0x00, 'soh' => 0x01, 'stx' => 0x02, 'etx' => 0x03, 'eot' => 0x04, 'enq' => 0x05, 'ack' => 0x06, 'bel' => 0x07, 'bs' => 0x08, 'ht' => 0x09, 'nl' => 0x0a, 'vt' => 0x0b, 'ff' => 0x0c, 'cr' => 0x0d, 'so' => 0x0e, 'si' => 0x0f, 'dle' => 0x10, 'dc1' => 0x11, 'dc2' => 0x12, 'dc3' => 0x13, 'dc4' => 0x14, 'nak' => 0x15, 'syn' => 0x16, 'etb' => 0x17, 'can' => 0x18, 'em' => 0x19, 'sub' => 0x1a, 'esc' => 0x1b, 'fs' => 0x1c, 'gs' => 0x1d, 'rs' => 0x1e, 'us' => 0x1f, 'del' => 0x7f, ); } else { %controlsyms_hash = ( 'nul' => 0x00, 'Control_a' => 0x01, 'Control_b' => 0x02, 'Control_c' => 0x03, 'Control_d' => 0x04, 'Control_e' => 0x05, 'Control_f' => 0x06, 'Control_g' => 0x07, 'BackSpace' => 0x08, 'Tab' => 0x09, 'Linefeed' => 0x0a, 'Control_k' => 0x0b, 'Control_l' => 0x0c, 'Return' => 0x0d, 'Control_n' => 0x0e, 'Control_o' => 0x0f, 'Control_p' => 0x10, 'Control_q' => 0x11, 'Control_r' => 0x12, 'Control_s' => 0x13, 'Control_t' => 0x14, 'Control_u' => 0x15, 'Control_v' => 0x16, 'Control_w' => 0x17, 'Control_x' => 0x18, 'Control_y' => 0x19, 'Control_z' => 0x1a, 'Escape' => 0x1b, 'Control_backslash' => 0x1c, 'Control_bracketright' => 0x1d, 'Control_asciicircum' => 0x1e, 'Control_underscore' => 0x1f, 'Delete' => 0x7f, ); } for my $special (keys %controlsyms_hash) { $controlsyms[$controlsyms_hash{$special}] = $special; } for my $code (0 .. 255) { if (! defined $controlsyms[$code]) { if ($code >= 64 && $code <= 127 && defined (my $special = $controlsyms[$code % 32])) { $controlsyms[$code] = $special; } else { $controlsyms[$code] = $voidsymbol; } } } # Ctrl + BS = DEL, Ctrl + DEL = BS if ($freebsd) { $controlsyms[0x08] = 'del'; $controlsyms[0x7f] = 'bs'; } else { $controlsyms[0x08] = 'Delete'; $controlsyms[0x7f] = 'BackSpace'; } # Some particularities of FreeBSD and Linux if ($freebsd) { $controlsyms[0x0d] = 'nl'; # Ctrl+m = ^J $controlsyms[0x20] = 'nul'; # Ctrl+space = ^@ $controlsyms[0x3f] = 'del'; # Ctrl+? = ^? } else { $controlsyms[0x0d] = 'Control_m'; # I don't know $controlsyms[0x20] = 'nul'; # Ctrl+space = ^@ $controlsyms[0x2e] = 'Compose'; # Ctrl+. = Compose $controlsyms[0x3f] = 'Delete'; # Ctrl+? = ^? # I suppose these are not necessary: # $controlsyms[0x27] = 'Control_g'; # Ctrl+' = ^G # $controlsyms[0x32] = 'nul'; # 2 # $controlsyms[0x33] = 'Escape'; # 3 # $controlsyms[0x34] = 'Control_backslash'; # 4 # $controlsyms[0x35] = 'Control_bracketright'; # 5 # $controlsyms[0x36] = 'Control_asciicircum'; # 6 # $controlsyms[0x37] = 'Control_underscore'; # 7 # $controlsyms[0x38] = 'Delete'; # 8 } my %metasyms_hash = ( ' ' => 'space', '`' => 'grave', '^' => 'asciicircum', '~' => 'asciitilde', '<' => 'less', '=' => 'equal', '>' => 'greater', '|' => 'bar', '_' => 'underscore', '-' => 'minus', ',' => 'comma', ';' => 'semicolon', ':' => 'colon', '!' => 'exclam', '?' => 'question', '/' => 'slash', '.' => 'period', '\'' => 'apostrophe', '"' => 'quotedbl', '(' => 'parenleft', ')' => 'parenright', '[' => 'bracketleft', ']' => 'bracketright', '{' => 'braceleft', '}' => 'braceright', '@' => 'at', '$' => 'dollar', '*' => 'asterisk', '\\' => 'backslash', '&' => 'ampersand', '#' => 'numbersign', '%' => 'percent', '+' => 'plus', '0' => 'zero', '1' => 'one', '2' => 'two', '3' => 'three', '4' => 'four', '5' => 'five', '6' => 'six', '7' => 'seven', '8' => 'eight', '9' => 'nine', chr(0x08) => 'BackSpace', chr(0x09) => 'Tab', chr(0x0a) => 'Linefeed', chr(0x0d) => 'Control_m', chr(0x1b) => 'Escape', chr(0x1c) => 'Control_backslash', chr(0x7f) => 'Delete', ); for my $code (0 .. 255) { my $sym = chr($code); if (defined (my $special = $metasyms_hash{$sym})) { $sym = $special; } $metasyms[$code] = "Meta_". $sym; } for my $code (0 .. 255) { my $control = $controlsyms[$code]; if ($control eq 'Compose') { $metacontrolsyms[$code] = 'Compose'; } elsif ($control eq 'Return') { $metacontrolsyms[$code] = 'Meta_Control_m'; } elsif ($control eq 'NoSymbol') { $metacontrolsyms[$code] = 'NoSymbol'; } elsif ($control eq 'VoidSymbol') { $metacontrolsyms[$code] = 'VoidSymbol'; } else { $metacontrolsyms[$code] = 'Meta_'. $control; } } } ############ GLOBAL FUNCTIONS ######################################### # Looks for $_[0] in the known directories and returns ready to use # file name sub xfilename { my $file = $_[0]; (my $base = $file) =~ s/.*\/(.+)/$1/; for my $dir (@xdirs) { if (-f "$dir/$file") { return "$dir/$file"; } if (-f "$dir/$base") { return "$dir/$base"; } } die "$0: Can not find file \"$file\" in any known directory\n"; } ########### READ THE RULES FILE ####################################### # The string $_[0] matches the pattern $_[1]. # The pattern may be "*", a variable name, or a plain string. # If the string is 'OPTIONS' then match the pattern against any of the # options from @options. sub matches_pattern { my ($string, $pattern) = @_; if ($string eq 'OPTIONS') { for my $option (@options) { next if ($option eq ''); if ($pattern eq $option) { return 1; } } } else { if ($pattern eq '*') { return $string ne ''; } if ($pattern =~ /^\$([a-zA-Z0-9_]+)$/) { for my $member (@{$rules_variables{$1}}) { if ($string eq $member) { return 1; } } return 0; } if ($string eq $pattern) { return 1; } } return 0; } if (@layouts) { for my $i (0 .. $#layouts) { if (! defined $variants[$i]) { $variants[$i] = ''; } } my $rules_keycodes; my $rules_symbols; open (RULES, xfilename ("rules/$rules")) or die "$0: ". xfilename ("rules/$rules") .": $!\n"; my $oldline = ''; my @antecedents; my @consequents; my $match_found = 0; while (<RULES>) { next if (/^\s*\/\//); next if (/^\s*$/); chomp; s/^\s*//; s/\s+/ /g; if ($oldline) { $_ = $oldline . $_; $oldline = ''; } if (s/\\$/ /) { $oldline = $_; next; } if (/^! ?\$([a-zA-Z0-9_]+) ?= ?(.+)$/) { $rules_variables{$1} = [ split ' ', $2 ]; next; } if (/^! ?(.+)= ?(.+)$/) { @antecedents = split ' ', $1; @consequents = split ' ', $2; foreach my $i (0 .. $#antecedents) { if ($antecedents[$i] eq 'model') { $antecedents[$i] = $model; } elsif ($antecedents[$i] eq 'layout' && @layouts == 1) { $antecedents[$i] = $layouts[0]; } elsif ($antecedents[$i] =~ /layout\[([1-4])\]/) { if (@layouts > 1) { $antecedents[$i] = $layouts[$1 - 1]; } else { $antecedents[$i] = ''; } } elsif ($antecedents[$i] eq 'variant' && @variants == 1) { $antecedents[$i] = $variants[0]; } elsif ($antecedents[$i] =~ /variant\[([1-4])\]/) { if (@variants > 1) { $antecedents[$i] = $variants[$1 - 1]; } else { $antecedents[$i] = ''; } } elsif ($antecedents[$i] eq 'option') { $antecedents[$i] = 'OPTIONS'; } elsif ($antecedents[$i] eq 'layout' || $antecedents[$i] eq 'variant') { $antecedents[$i] = ''; } else { warning "Unknown name \"$antecedents[$i]\" in the following line in \"rules/$rules\":\n"; warning "$_\n"; $antecedents[$i] = ''; } if (! defined $antecedents[$i]) { $antecedents[$i] = ''; } } $match_found = 0; next; } if (/^(.+)= ?(.+)$/) { next if ($match_found); my @antecedent_patterns = split ' ', $1; my $consequent_str = $2; if (@antecedent_patterns != @antecedents ) { warning "Bad number of antecedents in the following line in \"rules/$rules\":\n"; warning "$_\n"; next; } my $matches = 1; for my $i (0 .. $#antecedents) { if (! matches_pattern ($antecedents[$i], $antecedent_patterns[$i])) { $matches = 0; last; } } if ($matches) { $match_found = $antecedents[0] ne 'OPTIONS'; my @consequent_values = split ' ', $2; if (@consequent_values != @consequents) { warning "Bad number of consequents in the following line in \"rules/$rules\":\n"; warning "$_\n"; } for my $i (0 .. $#consequents) { # The purpose of the semicolons is to make %(v) and %_v # empty strings if %v is an empty string $consequent_values[$i] =~ s/%\(/\(;%/g; $consequent_values[$i] =~ s/%_/_;%/g; $consequent_values[$i] =~ s/(%[lvm](\[[1-4]\])?)/$1;/g; $consequent_values[$i] =~ s/%m/$model/g; $consequent_values[$i] =~ s/%l\[1\]/$layouts[0]/g; $consequent_values[$i] =~ s/%l\[2\]/$layouts[1]/g; $consequent_values[$i] =~ s/%l\[3\]/$layouts[2]/g; $consequent_values[$i] =~ s/%l\[4\]/$layouts[3]/g; $consequent_values[$i] =~ s/%l/$layouts[0]/g; $consequent_values[$i] =~ s/%v\[1\]/$variants[0]/g; $consequent_values[$i] =~ s/%v\[2\]/$variants[1]/g; $consequent_values[$i] =~ s/%v\[3\]/$variants[2]/g; $consequent_values[$i] =~ s/%v\[4\]/$variants[3]/g; $consequent_values[$i] =~ s/%v/$variants[0]/g; $consequent_values[$i] =~ s/\(;;\)//g; $consequent_values[$i] =~ s/_;;//g; $consequent_values[$i] =~ s/;//g; if ($consequent_values[$i] =~ /^\+/) { if ($consequents[$i] eq 'keycodes') { $rules_keycodes = $rules_keycodes . $consequent_values[$i]; } elsif ($consequents[$i] eq 'symbols') { $rules_symbols = $rules_symbols . $consequent_values[$i]; } } else { if ($consequents[$i] eq 'keycodes') { if (! $rules_keycodes) { $rules_keycodes = $consequent_values[$i]; } } elsif ($consequents[$i] eq 'symbols') { if (! $rules_symbols) { $rules_symbols = $consequent_values[$i]; } } } } } next; } warning "Syntax error in the following line in \"rules/$rules\":\n"; warning "$_\n"; die; } close RULES; if ($verbosity >= 1) { print STDERR "Acording to the rules file:\n" ." keycodes = $rules_keycodes\n" ." symbols = $rules_symbols\n"; } if (! $keycodes) { $keycodes = $rules_keycodes; } if (! $symbols) { $symbols = $rules_symbols; } } if (! $keycodes) { die "$0: No keycodes, nor layout specified\n"; } if (! $symbols) { die "$0: No symbols, nor layout specified\n"; } ########### COMPUTE ARCH ########################################### if ($keycodes =~ /(^|\+|\|)ataritt(\([^\)]*\))?($|\+|\|)/) { $arch = 'ataritt'; } elsif ($keycodes =~ /(^|\+|\|)amiga(\([^\)]*\))?($|\+|\|)/) { $arch = 'amiga'; } elsif ($keycodes =~ /(^|\+|\|)sun(\(type[45][^\)]*\))?($|\+|\|)/) { $arch = 'sun'; } elsif ($keycodes =~ /(^|\+|\|)evdev(\([^\)]*\))?($|\+|\|)/) { $arch = 'evdev'; } ########### READ ACM ############################################### if ($charmap) { for my $acmfile ("$installdir/share/consoletrans/${charmap}", "$installdir/share/consoletrans/${charmap}.gz", "$installdir/share/consoletrans/${charmap}.acm", "$installdir/share/consoletrans/${charmap}.acm.gz", "/usr/share/consoletrans/${charmap}", "/usr/share/consoletrans/${charmap}.gz", "/usr/share/consoletrans/${charmap}.acm", "/usr/share/consoletrans/${charmap}.acm.gz", "${charmap}") { if (-f $acmfile) { $acm = $acmfile; last; } } (-f $acm) or die "$0: no ACM for ${charmap} exists\n"; if ($acm =~ /gz$/) { open (ACM, '-|:utf8', "zcat $acm") or die "$0: $acm: $!\n"; } else { open (ACM, '<:utf8', $acm) or die "$0: $acm: $!\n"; } while (<ACM>) { s/\#.*//; chomp; next unless (/[^\s]/); if (/^\s*0x([0-9a-fA-F]{1,2})\s+\'([^\']+)\'\s*$/) { my $uni = ord ($2); my $c = hex ($1); $acmtable{$uni} = $c; } else { die "$0: Syntax error in ACM file: $_\n"; } } close ACM; } ########### PARSING ############################################### # Report a syntax error in $filename. $_[0] should describe what was # expected at $stream. sub syntax_error { die "$0: instead of \"". (substr ($stream, 0, 50)) ."\" in $filename expected $_[0].\n"; } # Opens the text file $_[0], reads it and saves its contents in $stream # The comments are removed, all new lines are replaced by spaces and # all redundant spaces are removed. sub file_to_string { my $file = $_[0]; my $string = ''; open (FILE, "$file") or die "$0: $file: $!\n"; while (<FILE>) { chomp; s{//.*}{}; s{\#.*}{}; $string = $string . $_ .' '; } close FILE; my $normalized = ''; my $final_letter = 0; while ($string) { if ($string =~ s/^\s+// && $final_letter && $string =~ /^[a-zA-Z0-9_]/) { $normalized = $normalized .' '; $final_letter = 0; } if ($string =~ s/^([^\"\s]+)//) { $normalized = $normalized . $1; $final_letter = ($1 =~ /[a-zA-Z0-9_]$/); next; } if ($string =~ s/^(\"[^\"]*(\"|$))//) { $normalized = $normalized . $1; $final_letter = 0; if ($2 ne '"') { die "$0: missing quote in ". (substr ($1, 0, 50)) ."...\n"; } next; } (! $string ) or die "Internal error"; } $stream = $normalized; } # removes from $stream initial sequence of xkb flags (default, partial, # hidden, etc.) Returns true if the "default" flag was among them. sub xkb_flags { my $default = 0; while ($stream =~ s/^(default|partial|hidden |alphanumeric_keys|modifier_keys |keypad_keys|function_keys |alternate_group)\s?(.*)/$2/ix) { $default = 1 if ($1 =~ /default/i); } return $default; } # Removes and returns identifier from $stream. sub xkb_identifier { if ($stream =~ s/^([a-zA-Z0-1_]+) ?(.*)/$2/) { return $1; } else { syntax_error "identifier"; } } # Removes and returns a string from $stream. sub xkb_string { if ($stream =~ /^\"([^\"]*)\"(.*)/) { $stream = $2; return $1; } else { syntax_error "string"; } } # Removes an include method name from $stream and returns $alternate_method, # $augment_method, $replace_method, or $override_method. If $stream # does not start with a method name, return the default method (i.e. $method) sub xkb_method { if ($stream =~ s/^alternate ?(.*)/$1/i) { return $alternate_method; } elsif ($stream =~ s/^augment ?(.*)/$1/i) { return $augment_method; } elsif ($stream =~ s/^replace ?(.*)/$1/i) { return $replace_method; } elsif ($stream =~ s/^override ?(.*)/$1/i) { return $override_method; } else { return $method; } } # If $stream starts with an include statement - process it and return true. # Otherwise return false. $_[0] is the file type ("symbols" or "keycodes") sub xkb_include { my $file_type = $_[0]; if ($stream =~ s/^(include|replace|augment|override)\"([^\"]*)\";? (.*)/$3/ix) { my $method_name = $1; my $include_request = $2; if ($method != $ignore_method) { my $oldmethod = $method; if ($method_name =~ /replace/i) { $method = $replace_method; } elsif ($method_name =~ /augment/i) { $method = $augment_method; } elsif ($method_name =~ /override/i) { $method = $override_method; } &include_xkb_file ($file_type, $include_request); $method = $oldmethod; } return 1; } else { return 0; } } sub xkb_keycodes_definitions { my $oldmethod = $method; while ($stream) { $method = $oldmethod; if (xkb_include ('keycodes')) { next; } $method = xkb_method (); if ($stream =~ (s/^(minimum|maximum|indicator|virtual\sindicator) [^;]*;(.*)/$2/ix)) { next; } if ($stream =~ /^<([^>]*)>=/) { $stream =~ s/^<([^>]+)>=([0-9]*);(.*)/$3/ or syntax_error "keycode definition"; my $key = $1; my $code = $2; if ($method == $replace_method || $method == $override_method || ($method == $augment_method && ! defined $keycodes_table{$key})) { $keycodes_table{$key} = [ $code ]; delete $aliases{$key}; } elsif ($method == $alternate_method) { push @{$keycodes_table{$key}}, $code; } next; } if ($stream =~ /^alias/) { $stream =~ s/^alias<([^>]+)>=<([^>]+)>;(.*)/$3/ or syntax_error "alias definition"; my $alias = $1; my $key = $2; if ($method == $replace_method || $method == $override_method || ($method == $augment_method && ! defined $keycodes_table{$alias})) { $keycodes_table{$alias} = []; $aliases{$alias} = $key; } next; } last; } $method = $oldmethod; } # Fill @{$symbols_table{$code}[$group]} with symbols sub symbols_for_group { my $code = shift; my $group = shift; if ($method == $replace_method || ($method == $override_method && (@_ || ! defined $symbols_table{$code}[$group])) || ($method == $augment_method && ! defined $symbols_table{$code})) { my $level = 0; for my $symbol (@_) { if ($symbol !~ /\(/ && $symbol =~ /./ && (! defined $xkbsym_table{$symbol} || $xkbsym_table{$symbol} ne 'NoSymbol' || ! defined $symbols_table{$code}[$group][$level])) { $symbols_table{$code}[$group][$level] = $symbol; } $level++; } } } sub xkb_key { my $default_key_type = $_[0]; if ($stream =~ /^key</i) { $stream =~ s/^key<([^>]+)>\{([^\}]*?)\};(.*)/$3/i or syntax_error "key definition"; my $key = $1; my $list = $2 .","; if ($verbosity >= 4 && ! defined $keycodes_table{$key}) { warning "No scan code for <$key> is defined.\n"; } for my $code (@{$keycodes_table{$key}}) { if ($method == $replace_method) { $symbols_table{$code} = []; } my $group = $base_group; while ($list =~ /[^ ]/) { # [ X1, X2, ... ] if ($list =~ s/^\[([^\]]*?)\],(.*)/$2/) { (my $symbols = $1) =~ s/,/ /g; my @groupsymbols = split ' ', $symbols; symbols_for_group $code, $group, @groupsymbols; $group++; next; } # symbols[GroupN] = [ X1, X2, ... ] if ($list =~ (s/^symbols\[Group([1-4])\] =\[([^\]]*?)\],(.*)/$3/x)) { my $group = $1 - 1 + $base_group; (my $symbols = $2) =~ s/,/ /g; my @groupsymbols = split ' ', $symbols; symbols_for_group $code, $group, @groupsymbols; next; } # type = "...." if ($list =~ (s/^type(?:\[Group1\])? =\"([^\"]+)\",(.*)/$2/x)) { if ($method == $replace_method || $method == $override_method || ($method == $augment_method && ! defined $types_table{$code})) { $types_table{$code} = $1; } next; } # virtualMods = AltGr # overlay1=<KO7> next if ($list =~ s/^[a-zA-Z0-9_]+(=[a-zA-Z0-9_<>]+)?, (.*)/$2/x); # type = "CTRL+ALT" next if ($list =~ s/^[a-zA-Z0-9_]+=\"[^\"]+\",(.*)/$1/); # type[...] = "..." next if ($list =~ s/^type\[[a-zA-Z0-9_]+\]=\"[^\"]+\", (.*)/$1/x); # actions[...] = [ ... ] next if ($list =~ s/^actions\[[a-zA-Z0-9_]+\]=\[[^\]]*?\], (.*)/$1/x); die "$0: garbage in a key definition: \"$list\"" ." in $filename.\n"; } if (! defined $types_table{$code} || $types_table{$code} eq 'DEFAULT') { $types_table{$code} = $default_key_type; } } return 1; } else { return 0; } } sub xkb_symbols_definitions { my $oldmethod = $method; my $default_key_type = 'DEFAULT'; while ($stream) { $method = $oldmethod; if (xkb_include ('symbols')) { next; } $method = xkb_method (); if ($stream =~ /^name/i) { $stream =~ s/^name\[[a-zA-Z0-9_]+\]=\"[^\"]*\";(.*)/$1/i or syntax_error "group name"; next; } if ($stream =~ (s/^key\.type(?:\[Group1\])?=\"([^\"]+)\";(.*)/$2/)) { $default_key_type = $1; next; } if ($stream =~ s/^[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+=.*?;(.*)/$1/i) { next; } if ($stream =~ s/^[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+\[[a-zA-Z0-9_]+\] =.*?;(.*)/$1/ix) { next; } if (xkb_key $default_key_type) { next; } if ($stream =~ /^(modifier_map|modmap|mod_map)/i) { $stream =~ (s/^(modifier_map|modmap|mod_map)\s?[a-zA-Z0-9_]+ \{[^\}]*\};(.*)/$2/ix) or syntax_error "modifier_map"; next; } if ($stream =~ /^virtual_modifiers/i) { $stream =~ (s/^virtual_modifiers\s?[a-zA-Z0-9_,]+;(.*)/$1/ix) or syntax_error "virtual_modifiers"; next; } last; } $method = $oldmethod; } sub xkb_definitions { my $file_type = $_[0]; if ($file_type eq 'symbols') { xkb_symbols_definitions(); } elsif ($file_type eq 'keycodes') { xkb_keycodes_definitions(); } else { die "$0: Bad xkb file type $file_type\n"; } } # Remove from $stream the characters up to the first unmatched "}" sub skip_to_brace { while ($stream && ($stream =~ s/^[^\}\{]*\{//)) { &skip_to_brace; } $stream =~ s/^[^\}\{]*(\}|$)//; } sub xkb_block_list { my $file_type = $_[0]; my $block = $_[1]; my $first = 1; my $ok = 0; my $mystream = $stream; while ($stream) { my $default = xkb_flags(); xkb_identifier() eq "xkb_". $file_type or syntax_error "xkb_". $file_type; my $name = xkb_string(); my $structured; if ($stream =~ s/^\{//) { $structured = 1; } else { $structured = 0; } if ($name eq $block || ($first && ! $block)) { xkb_definitions ($file_type); if ($structured) { $stream =~ s/^\};.*// or syntax_error "};"; } else { $stream = ''; } $ok = 1; } else { if ($structured) { skip_to_brace; $stream =~ s/^;// or syntax_error ";"; } else { last; } } $first = 0; } if (! $ok) { $stream = $mystream; } return $ok; } sub include_xkb_file { my $file_type = $_[0]; my $include_list = '^'. $_[1]; my $oldmethod = $method; my $oldbase_group = $base_group; while ($include_list) { my $file; my $block; if ($include_list =~ (s/^(\^|\+|\|)([^\(\|\+]+)\(([^\)]+)\) :([1234])(.*)/$5/x)) { if ($1 eq '+') { $method = $override_method; } elsif ($1 eq '|') { $method = $augment_method; } $file = $2; $block = $3; $base_group = $4 - 1 + $base_group; } elsif ($include_list =~ (s/^(\^|\+|\|)([^\(\|\+]+)\(([^\)]+)\) (.*)/$4/x)) { if ($1 eq '+') { $method = $override_method; } elsif ($1 eq '|') { $method = $augment_method; } $file = $2; $block = $3; } elsif ($include_list =~ s/^(\^|\+|\|)([^\(\|\+]+):([1234])(.*)/$4/) { if ($1 eq '+') { $method = $override_method; } elsif ($1 eq '|') { $method = $augment_method; } $file = $2; $block = ''; $base_group = $3 - 1 + $base_group; } elsif ($include_list =~ s/^(\^|\+|\|)([^\(\|\+]+)(.*)/$3/) { if ($1 eq '+') { $method = $override_method; } elsif ($1 eq '|') { $method = $augment_method; } $file = $2; $block = ''; } else { die "$0: bad include list $include_list.\n"; } my $oldstream = $stream; if ($file =~ /^\.?\//) { $stream = file_to_string ("$file"); } else { $stream = file_to_string (xfilename "$file_type/$file"); } my $oldfilename = $filename; $filename = $file; if (!xkb_block_list ($file_type, $block)) { warning "Can not find \"$block\" in \"$file\".\n"; xkb_block_list ($file_type, ''); } # Patch the Greek symbols. See Bug#1026986 and http://kbdlayout.info/kbdhe : # - xkb-data makes shift-w a SIGMA, which is not that useful. # - On the other hand, the kernel doesn't support double-dead-keys, and it # is common usage to make shift-w a dead-acute-diaeresis (here encoded # as dead_breve) if ($file eq "gr") { my $code = $keycodes_table{'AD02'}[0]; if (defined $code) { my $symbol = $symbols_table{$code}[$base_group][1]; if ($symbol eq "Greek_SIGMA") { $symbols_table{$code}[$base_group][1] = "dead_breve"; } } } $stream = $oldstream; $filename = $oldfilename; $method = $oldmethod; $base_group = $oldbase_group; } } include_xkb_file 'keycodes', $keycodes; foreach my $alias (keys %aliases) { if (! defined $keycodes_table{$aliases{$alias}}) { die "$0: undefined keyname $aliases{$alias} in ". "an keycode alias definition in $filename.\n"; } $keycodes_table{$alias} = [ @{$keycodes_table{$alias}}, @{$keycodes_table{$aliases{$alias}}} ]; } include_xkb_file 'symbols', $symbols; if ($arch eq 'at' || $arch eq 'evdev') { # Pause - 110, Break - 114, PrintScreen - 111, SysRq - 92 for my $group (0 .. 3) { # no separate Break key on AT keyboards. Break = Ctrl+Pause if (defined $symbols_table{110}[$group][1]) { $symbols_table{114}[$group] = [$symbols_table{110}[$group][1]]; } # no separate SysRq key on AT keyboards. SysRq = Alt+PrintScreen if (defined $symbols_table{111}[$group][1]) { $symbols_table{92}[$group] = [$symbols_table{111}[$group][1]]; } } } foreach my $key (keys %symbols_table) { foreach my $group (0 .. $#{$symbols_table{$key}}) { if (! defined $symbols_table{$key}[$group]) { $symbols_table{$key}[$group] = []; } else { foreach my $level (0 .. $#{$symbols_table{$key}[$group]}) { if (! defined $symbols_table{$key}[$group][$level]) { $symbols_table{$key}[$group][$level] = 'NoSymbol'; } } } } if (! defined $types_table{$key}) { $types_table{$key} = 'DEFAULT'; } } sub uni_to_legacy { my $uni = $_[0]; if ($acm) { if ($uni <= 0x7f) { if ($freebsd && $uni >= 0x20 && $uni <= 0x7e) { return sprintf "\'%c\'", $uni; } else { return sprintf "0x%02x", $uni; } } elsif (defined $acmtable{$uni}) { if ($freebsd) { return sprintf "%i", $acmtable{$uni}; } else { return sprintf "0x%02x", $acmtable{$uni}; } } else { if ($verbosity >= 8) { warning sprintf ("Unicode U+%04x does not exist " ."in the legacy encoding\n", $uni); } return $voidsymbol; } } else { return 'U+'. sprintf ("%04x", $uni); } } sub x_to_kernelsym { my $xkeysym = $_[0]; my $kernelkeysym = $xkbsym_table{$xkeysym}; if (defined $kernelkeysym) { if ($kernelkeysym !~ /^[0-9][0-9a-fA-F]{3}$/) { return $kernelkeysym; } } else { $kernelkeysym = ($xkeysym =~ /^0x0*(100)?([0-9a-fA-F]{4})$/ ? $2 : ($xkeysym =~ /^U([0-9a-fA-F]+)$/ ? $1 : undef)); } if (defined $kernelkeysym) { my $uni = hex ($kernelkeysym); if ($uni > 0xFFFF || defined $forbidden{$uni}) { if ($verbosity >= 8) { warning "Forbidden Unicode \"U+$kernelkeysym\"\n"; } return $voidsymbol; } else { if (pack("U", $uni) =~ /\p{IsAlpha}/) { my $legacy = uni_to_legacy ($uni); if ($legacy ne $voidsymbol) { return '+'. $legacy; # further processed for FreeBSD } else { return $legacy; } } elsif ($uni <= 0x1f) { return $controlsyms[$uni]; } else { return uni_to_legacy ($uni); } } } else { warning "Unknown X keysym \"$xkeysym\"\n"; return $voidsymbol; } } sub x_to_ascii { my $xkeysym = $_[0]; my $kernelkeysym = $xkbsym_table{$xkeysym}; if (defined $kernelkeysym) { if (defined $controlsyms_hash{$kernelkeysym}) { return $controlsyms_hash{$kernelkeysym}; } elsif ($kernelkeysym !~ /^[0-9][0-9a-fA-F]{3}$/) { return undef; } } else { $kernelkeysym = ($xkeysym =~ /^0x0*(100)?([0-9a-fA-F]{4})$/ ? $2 : ($xkeysym =~ /^U([0-9a-fA-F]+)$/ ? $1 : undef)); } if (defined $kernelkeysym) { my $uni = hex ($kernelkeysym); if (0x00 <= $uni && 0x7f >= $uni) { return $uni; } } return undef; } # A vector of symbol codes for a key my @vector; # $numlockable[group] -> whether the group is numlockable my @numlockable; # A vector with same length as @vector. Measures how well each element of # @vector represents the xkb symbol for the particular key. Bigger values # mean lower quality. my @quality; sub approximate { my ($coord, $new_sym, $new_quality) = @_; # $new_sym represents the xkb symbol for position $coord in @vector # with quality $new_quality if ((! defined $quality[$coord] || $quality[$coord] > $new_quality) && $new_sym ne $voidsymbol) { $vector[$coord] = $new_sym; $quality[$coord] = $new_quality; } } # Fill @vector with data for key number $_[0] sub flatten { # Kernel X # ----------------------------------------- # 1 Shift level 2 (Shift) # 2 AltGr levels 3 and 4 (AltGr) # 4 Control Control # 8 Alt Alt # 0 Group1 # 16 ShiftL Group2 # 32 ShiftR Group4 # 48 ShiftL+ShiftR Group3 my $key = $_[0]; @vector = (); @quality = (); @numlockable = (0,0,0,0); my @real_group_table = ([-1, -1, -1, -1], [0, 0, 0, 0], # gr1 -> gr1 -> gr1 -> gr1 [0, 1, 1, 0], # gr1 -> gr2 -> gr1 -> gr2 [0, 1, 2, 0], # gr1 -> gr2 -> gr1 -> gr3 [0, 1, 3, 2]);# gr1 -> gr2 -> gr3 -> gr4 for my $group (0..3) { my $real_group = $real_group_table[1+$#{$symbols_table{$key}}][$group]; my $last_level; while ($real_group >= 0 && ($last_level = $#{$symbols_table{$key}[$real_group]}) < 0) { $real_group = $real_group - 1; } next if ($real_group < 0); for my $level (0..3) { my $real_level = $level; if ($types_table{$key} eq 'ONE_LEVEL') { $real_level = 0; } elsif ($types_table{$key} eq 'TWO_LEVEL') { $real_level = $real_level % 2; } elsif ($types_table{$key} eq 'THREE_LEVEL') { if ($real_level > 2) { $real_level = 2; } } if ($last_level == -1) { next; } elsif ($last_level == 0) { $real_level = 0; } elsif ($last_level == 1) { $real_level = $real_level % 2; } elsif ($last_level == 2 && $real_level == 3) { $real_level = 2; } elsif ($real_level > $last_level) { $real_level = $last_level; } my $coord; for ($types_table{$key}) { if (/^(DEFAULT|ONE_LEVEL|TWO_LEVEL |THREE_LEVEL|ALPHABETIC |EIGHT_LEVEL|EIGHT_LEVEL_ALPHABETIC |EIGHT_LEVEL_SEMIALPHABETIC |FOUR_LEVEL|FOUR_LEVEL_ALPHABETIC |FOUR_LEVEL_SEMIALPHABETIC |SEPARATE_CAPS_AND_SHIFT_ALPHABETIC |KEYPAD|FOUR_LEVEL_X|FOUR_LEVEL_MIXED_KEYPAD |FOUR_LEVEL_KEYPAD|LOCAL_EIGHT_LEVEL |FOUR_LEVEL_PLUS_LOCK )$/x) { # Level0: plain # Level1: shift # Level2: altgr # Level3: shift+altgr $coord = ($group << 4) + $level; } elsif (/^(PC_BREAK|PC_CONTROL_LEVEL2 |PC_LCONTROL_LEVEL2|PC_RCONTROL_LEVEL2)$/x) { # Level0: plain # Level1: control if ($level == 0 || $level == 2) { $coord = ($group << 4) + $level; } else { $coord = ($group << 4) + $level + 3; } } elsif (/^(PC_SYSRQ|PC_ALT_LEVEL2 |PC_LALT_LEVEL2|PC_RALT_LEVEL2)$/x) { # Level0: plain # Level1: alt if ($level == 0 || $level == 2) { $coord = ($group << 4) + $level; } else { # notice that $level is 1 or 3 $coord = ($group << 4) + $level + 7; } } elsif (/^SHIFT\+ALT$/) { # Level0: plain # Level1: shift+alt if ($level == 0 || $level == 2) { $coord = ($group << 4) + $level; } else { $coord = ($group << 4) + $level + 8; } } elsif (/^CTRL\+ALT$/) { # Level0: plain # Level1: control+alt if ($level == 0 || $level == 2) { $coord = ($group << 4) + $level; } else { $coord = ($group << 4) + $level + 11; } } elsif (/^PC_FN_LEVEL2$/) { # Level0: plain # Level1: altgr $coord = ($group << 4) + ($level << 1); } else { warning "Unknown key type $types_table{$key}\n"; $coord = ($group << 4) + $level; } } my $xkeysym = $symbols_table{$key}[$real_group][$real_level]; if ($xkeysym =~ /^KP_/) { $numlockable[$group] = 1; } my $is_special = ($xkeysym !~ /^U[0-9a-fA-F]+$/ && defined $xkbsym_table{$xkeysym} && ($xkbsym_table{$xkeysym} !~ /^[0-9][0-9a-fA-F]{3}$/)); my $kernelkeysym = x_to_kernelsym ($xkeysym); approximate ($coord, $kernelkeysym, 0); if (defined (my $ascii = x_to_ascii ($xkeysym))) { approximate (($coord | 0x08), $metasyms[$ascii], 1); approximate (($coord | 0x04), $controlsyms[$ascii], 1); approximate (($coord | 0x0c), $metacontrolsyms[$ascii], 1); } } } for my $x (0..1) { my $mask = 1 << $x; for my $coord (0..63) { next if (! defined $vector[$coord]); approximate($coord ^ $mask, $vector[$coord], $quality[$coord] + $mask << 2); } } for my $x (2..3) { my $mask = 1 << $x; for my $coord (0..63) { next if (! defined $vector[$coord]); approximate($coord | $mask, $vector[$coord], $quality[$coord] + $mask << 2); } } for my $coord (0..16) { next if (! defined $vector[$coord]); for my $mask (1<<4, 2<<4, 3<<4) { approximate($coord | $mask, $vector[$coord], $quality[$coord] + 1 << 6); } } for my $coord (0 .. 63) { if (! defined $vector[$coord]) { $vector[$coord] = $voidsymbol; } } for my $coord (0 .. 63) { next if ($coord & 0x0c); # next if Control and/or Alt my $mask = $kernel_modifiers{$vector[$coord]}; next unless (defined $mask); for my $mod (4, 8, 12) { if ($vector[$coord + $mod] eq $voidsymbol && ($vector[($coord + $mod) ^ $mask] eq $voidsymbol)) { $vector[$coord + $mod] = $vector[$coord]; } } } # Without this it would be possible to lock permanently # a modifier key such as Control or Alt for my $coord (0 .. 63) { my $mask = $kernel_modifiers{$vector[$coord]}; if (defined $mask) { $vector[$coord ^ $mask] = $vector[$coord]; if ($compact && ! $freebsd) { # In non-Latin layouts AltGr=ShiftL # AltGr = 0x02, ShiftL = 0x10 if (($mask & 0x02) && ($mask & 0x10)) { $vector[$coord ^ $mask ^ 0x02] = $vector[$coord]; $vector[$coord ^ $mask ^ 0x10] = $vector[$coord]; } elsif ($mask & 0x02) { $vector[$coord ^ $mask ^ 0x10] = $vector[$coord]; $vector[$coord ^ $mask ^ 0x10 ^ 0x02] = $vector[$coord]; } elsif ($mask & 0x10) { $vector[$coord ^ $mask ^ 0x02] = $vector[$coord]; $vector[$coord ^ $mask ^ 0x02 ^ 0x10] = $vector[$coord]; } } } } if ($freebsd || ! $compact) { for my $coord (16 .. 63) { if ($vector[$coord] =~ /^(ShiftL|ShiftL_Lock|ashift|alock)$/) { $vector[$coord] = $voidsymbol; } } for my $coord (0 .. 15) { if ($vector[$coord] eq 'ShiftL_Lock') { # 0 => 16 $vector[$coord + 16] = 'ShiftR_Lock'; # 16 => 48 $vector[$coord + 32] = 'ShiftR_Lock'; # 32 => 0 $vector[$coord + 48] = 'ShiftL_Lock'; # 48 => 32 } elsif ($vector[$coord] =~ /^(ShiftL|ashift|alock)$/) { $vector[$coord + 16] = $vector[$coord]; $vector[$coord + 32] = $vector[$coord]; $vector[$coord + 48] = $vector[$coord]; } } } else { for my $coord (16 .. 63) { if ($vector[$coord] =~ /^(AltGr|AltGr_Lock)$/) { $vector[$coord] = $voidsymbol; } } for my $coord (0 .. 15) { if ($vector[$coord] =~ /^(AltGr_Lock|AltGr)$/) { $vector[$coord + 16] = $vector[$coord]; $vector[$coord + 32] = $vector[$coord]; $vector[$coord + 48] = $vector[$coord]; } } } for my $group (0 .. 3) { my $kp = undef; for my $x (0 .. 15) { my $coord = 16 * $group + $x; if ($vector[$coord] =~ /^KP_/) { $kp = $vector[$coord]; last; } } if ($types_table{$key} =~ /^(KEYPAD|FOUR_LEVEL_X |FOUR_LEVEL_MIXED_KEYPAD |FOUR_LEVEL_KEYPAD)$/x && ! defined $kp) { $kp = 'VoidSymbol'; $numlockable[$group] = 1; } if ($kp && ! $freebsd) { for my $x (0 .. 15) { my $coord = 16 * $group + $x; for ($vector[$coord]) { if (/^VoidSymbol$/) { # KP_Begin and KP_Delete are mapped to VoidSymbol $vector[$coord] = $kp; } elsif (/$xkbsym_table{'plus'}/) {# not anchored match! $vector[$coord] = 'KP_Add'; } elsif (/$xkbsym_table{'minus'}/) { $vector[$coord] = 'KP_Subtract'; } elsif (/$xkbsym_table{'asterisk'}/) { $vector[$coord] = 'KP_Multiply'; } elsif (/$xkbsym_table{'slash'}/) { $vector[$coord] = 'KP_Divide'; } elsif (/$xkbsym_table{'comma'}/) { $vector[$coord] = 'KP_Comma'; } elsif (/$xkbsym_table{'period'}/) { $vector[$coord] = 'KP_Period'; } elsif (/$xkbsym_table{'0'}/) { $vector[$coord] = 'KP_0'; } elsif (/$xkbsym_table{'1'}/) { $vector[$coord] = 'KP_1'; } elsif (/$xkbsym_table{'2'}/) { $vector[$coord] = 'KP_2'; } elsif (/$xkbsym_table{'3'}/) { $vector[$coord] = 'KP_3'; } elsif (/$xkbsym_table{'4'}/) { $vector[$coord] = 'KP_4'; } elsif (/$xkbsym_table{'5'}/) { $vector[$coord] = 'KP_5'; } elsif (/$xkbsym_table{'6'}/) { $vector[$coord] = 'KP_6'; } elsif (/$xkbsym_table{'7'}/) { $vector[$coord] = 'KP_7'; } elsif (/$xkbsym_table{'8'}/) { $vector[$coord] = 'KP_8'; } elsif (/$xkbsym_table{'9'}/) { $vector[$coord] = 'KP_9'; } elsif (/^(Return|Enter)$/) { $vector[$coord] = 'KP_Enter'; } elsif (/^Home$/) { $vector[$coord] = 'KP_7'; } elsif (/^Left$/) { $vector[$coord] = 'KP_4'; } elsif (/^Up$/) { $vector[$coord] = 'KP_8'; } elsif (/^Right$/) { $vector[$coord] = 'KP_6'; } elsif (/^Down$/) { $vector[$coord] = 'KP_2'; } elsif (/^Prior$/) { $vector[$coord] = 'KP_9'; } elsif (/^Next$/) { $vector[$coord] = 'KP_3'; } elsif (/^End$/) { $vector[$coord] = 'KP_1'; } elsif (/^Insert$/) { $vector[$coord] = 'KP_0'; } } } } } for my $group (0 .. 3) { my $coord = $group << 4; my $mainsym = $vector[$coord]; if ($mainsym =~ /^fkey([0-9]+)$/) { my $num = $1; if (1 <= $num && $num <= 12) { $vector[$coord + 1] = 'fkey'. ($num+12); # shift $vector[$coord + 4] = 'fkey'. ($num+24); # control $vector[$coord + 5] = 'fkey'. ($num+36); # control + shift $vector[$coord + 2] = 'scr'. sprintf("%02i", $num); #altgr my $x = sprintf("%02i", ($num <= 6) ? $num+10 : $num); $vector[$coord + 3] = 'scr'. $x; # altgr + shift $vector[$coord + 6] = 'scr'. sprintf("%02i", $num); # altgr+ctrl $vector[$coord + 7] = 'scr'. $x; # altgr + control + shift } elsif ($num == 52 || $num == 56) { my $sym = $num == 52 ? '\'-\'' : '\'+\''; for my $i ($coord .. $coord+15) { if ($vector[$i] eq $mainsym && $vector[$i^1] eq $mainsym) { $vector[$i | 1] = $sym; } } } elsif ($num == 60 && $vector[$coord + 1] eq 'fkey60') { $vector[$coord + 1] = 'paste'; } } elsif ($mainsym =~ /^esc$/) { $vector[$coord + 6] = 'debug'; $vector[$coord + 7] = 'debug'; } elsif ($mainsym =~ /^saver$/) { # 'Pause' key $vector[$coord] = 'slock'; $vector[$coord + 1] = 'saver'; # shift $vector[$coord + 2] = 'susp'; # altgr $vector[$coord + 3] = 'susp'; # altgr + shift $vector[$coord + 4] = 'slock'; # ctrl $vector[$coord + 5] = 'saver'; # ctrl + shift $vector[$coord + 6] = 'susp'; # ctrl + altgr $vector[$coord + 7] = 'susp'; # ctrl + altgr + shift } elsif ($freebsd && $mainsym =~ /^\' \'$/) { $vector[$coord + 6] = 'susp'; $vector[$coord + 7] = 'susp'; } elsif ($mainsym =~ /^ht$/) { for my $i ($coord .. $coord+15) { if ($vector[$i] eq 'ht' && $vector[$i ^ 1] eq 'ht') { $vector[$i | 1] = 'btab'; } } } elsif ($mainsym =~ /^nscr$/) { for my $i ($coord .. $coord+15) { if ($vector[$i] eq 'nscr' && $vector[$i ^ 1] eq 'nscr') { $vector[$i | 1] = 'pscr'; } } $vector[$coord + 4] = 'debug'; $vector[$coord + 5] = 'debug'; } elsif ($mainsym =~ /^F([0-9]+)$/) { my $num = $1; $vector[$coord + 1] = 'F'. ($num + 12); # shift $vector[$coord + 2] = 'Console_'. ($num + 12); # altgr $vector[$coord + 3] = 'Console_'. ($num + 24); # altgr + shift $vector[$coord + 4] = 'F'. ($num + 24); # control $vector[$coord + 5] = 'F'. ($num + 36); # control + shift $vector[$coord + 6] = 'Console_'. ($num + 12); # control + altgr $vector[$coord + 7] = 'Console_'. ($num + 24); # control+altgr+shift $vector[$coord + 8] = 'Console_'. $num; # alt $vector[$coord + 9] = 'Console_'. ($num + 12); # alt + shift $vector[$coord + 12] = 'Console_'. $num; # control + alt $vector[$coord + 13] = 'Console_'. ($num + 12); # control+alt+shift } elsif ($mainsym eq 'Scroll_Lock' || $mainsym eq 'Help') { $vector[$coord + 1] = 'Show_Memory'; $vector[$coord + 2] = 'Show_Registers'; $vector[$coord + 4] = 'Show_State'; $vector[$coord + 8] = 'Show_Registers'; } elsif ($mainsym =~ /^KP_([0-9])$/) { my $num = $1; $vector[$coord + 2] = 'Hex_'. $num; $vector[$coord + 9] = 'Hex_'. $num; $vector[$coord + 8] = 'Ascii_'. $num; } elsif ($mainsym eq 'Num_Lock') { $vector[$coord + 2] = 'Hex_A'; $vector[$coord + 9] = 'Hex_A'; } elsif ($mainsym eq 'KP_Divide') { $vector[$coord + 2] = 'Hex_B'; $vector[$coord + 9] = 'Hex_B'; } elsif ($mainsym eq 'KP_Multiply') { $vector[$coord + 2] = 'Hex_C'; $vector[$coord + 9] = 'Hex_C'; } elsif ($mainsym eq 'KP_Subtract') { $vector[$coord + 2] = 'Hex_D'; $vector[$coord + 9] = 'Hex_D'; } elsif ($mainsym eq 'KP_Add') { $vector[$coord + 2] = 'Hex_E'; $vector[$coord + 9] = 'Hex_E'; } elsif ($mainsym eq 'KP_Enter') { $vector[$coord + 2] = 'Hex_F'; $vector[$coord + 9] = 'Hex_F'; } elsif ($mainsym eq 'Prior' || $mainsym eq 'PageUp') { $vector[$coord + 1] = 'Scroll_Backward'; } elsif ($mainsym eq 'Next' || $mainsym eq 'PageDown') { $vector[$coord + 1] = 'Scroll_Forward'; } elsif ($mainsym eq 'Left') { $vector[$coord + 8] = 'Decr_Console'; } elsif ($mainsym eq 'Right') { $vector[$coord + 8] = 'Incr_Console'; } elsif ($mainsym eq 'Up') { $vector[$coord + 8] = 'KeyboardSignal'; } } return @vector; } sub print_vector { my $kernel_code = $_[0]; my $only_VoidSymbol = 1; my $no_NoSymbol = 1; for my $mask (0 .. 63) { if ($vector[$mask] ne $voidsymbol && $vector[$mask] ne 'NoSymbol') { $only_VoidSymbol = 0; last; } } return if ($only_VoidSymbol && $compact); for my $mask (0 .. 63) { if ($vector[$mask] eq 'NoSymbol') { $no_NoSymbol = 0; last; } } if ($freebsd) { my @capslockable = (0,0,0,0); for my $group (0 .. 3) { if ($vector[$group * 16] =~ /^\+/) { $capslockable[$group] = 1; last; } } for my $mask (0 .. 63) { $vector[$mask] =~ s/^\+//; $vector[$mask] =~ s/^NoSymbol$/nop/; } for my $group (0 .. 1) { next if ($group && $symbols !~ /:2/); my $lockstate = ($capslockable[$group] ? ($numlockable[$group] ? 'B' : 'C') : ($numlockable[$group] ? 'N' : 'O')); $KEYMAP .= sprintf " %03i ", $kernel_code + 128*$group; for my $mask (0, 1, 4, 5, 2, 3, 6, 7) { $KEYMAP .= sprintf "%-6s ", $vector[$mask + 16*$group]; } $KEYMAP .= " $lockstate\n"; } } elsif ($compact) { my $line = ($symbols =~ /:2/ # true if the keymap is non-latin ? "@vector[0, 1, 16, 17, 4, 20, 8, 24, 12, 28]" : "@vector[0, 1, 2, 3, 4, 6, 8, 10, 12, 14]"); $line =~ s/NoSymbol/VoidSymbol/g; $KEYMAP .= "keycode $kernel_code = $line\n"; } else { my @capsvector = @vector; for my $mask (0 .. 63) { if ($capsvector[$mask] =~ /^(\+?)U\+([0-9a-fA-F]+)$/) { my $v = hex ($2); my $l = ord (lc (pack ("U", $v))); my $u = ord (uc (pack ("U", $v))); my $c = ($v == $l ? $u : $l); $capsvector[$mask] = $1 ."U+". sprintf ("%04x", $c); if ($v != $c && $v > 0x7f) { $broken_caps = 1; } } } if ($no_NoSymbol) { $KEYMAP .= "keycode $kernel_code = @vector @capsvector\n"; } else { for my $mask (0 .. 63) { if ($vector[$mask] ne 'NoSymbol') { $KEYMAP .= "$modifier_combinations[$mask]" ." keycode $kernel_code = $vector[$mask]\n"; if ($modifier_combinations[$mask] =~ /plain/) { $KEYMAP .= "ctrll" ." keycode $kernel_code = $capsvector[$mask]\n"; } else { $KEYMAP .= "ctrll $modifier_combinations[$mask]" ." keycode $kernel_code = $capsvector[$mask]\n"; } } } } } } my %at_scancodes = ( 9 => 1, 10 => 2, 11 => 3, 12 => 4, 13 => 5, 14 => 6, 15 => 7, 16 => 8, 17 => 9, 18 => 10, 19 => 11, 20 => 12, 21 => 13, 22 => 14, 23 => 15, 24 => 16, 25 => 17, 26 => 18, 27 => 19, 28 => 20, 29 => 21, 30 => 22, 31 => 23, 32 => 24, 33 => 25, 34 => 26, 35 => 27, 36 => 28, 37 => 29, 38 => 30, 39 => 31, 40 => 32, 41 => 33, 42 => 34, 43 => 35, 44 => 36, 45 => 37, 46 => 38, 47 => 39, 48 => 40, 49 => 41, 50 => 42, 51 => 43, 52 => 44, 53 => 45, 54 => 46, 55 => 47, 56 => 48, 57 => 49, 58 => 50, 59 => 51, 60 => 52, 61 => 53, 62 => 54, 63 => 55, 64 => 56, 65 => 57, 66 => 58, 67 => 59, 68 => 60, 69 => 61, 70 => 62, 71 => 63, 72 => 64, 73 => 65, 74 => 66, 75 => 67, 76 => 68, 77 => 69, 78 => 70, 79 => 71, 80 => 72, 81 => 73, 82 => 74, 83 => 75, 84 => 76, 85 => 77, 86 => 78, 87 => 79, 88 => 80, 89 => 81, 90 => 82, 91 => 83, 92 => 84, 93 => -1, # fake key (KP_Equal) 94 => 86, 95 => 87, 96 => 88, 97 => 102, 98 => 103, 99 => 104, 100 => 105, 102 => 106, 103 => 107, 104 => 108, 105 => 109, 106 => 110, 107 => 111, 108 => 96, 109 => 97, 110 => 119, 111 => 99, 112 => 98, 113 => 100, 114 => 101, 115 => 125, 116 => 126, 117 => 127, 118 => -1, # Japanese 119 => -1, # Japanese 120 => -1, # Japanese 123 => -1, 124 => -1, # fake key 125 => -1, # fake key 126 => -1, # fake key 127 => -1, # fake key 128 => -1, # fake key 129 => -1, # Japanese 131 => -1, # Japanese 133 => 124, # Japanese 134 => 121, # Brasilian ABNT2 144 => -1, # Japanese 156 => -1, # fake key 208 => -1, # Japanese 209 => -1, # Korean 210 => -1, # Korean 211 => 89, # Brasilian ABNT2, Japanese 214 => -1, # alternate between internal and multimedia display 215 => -1, # turn light on/of 216 => -1, # brightness down 217 => -1, # brightness up ); my %freebsd_scancodes = ( 9 => 1, 10 => 2, 11 => 3, 12 => 4, 13 => 5, 14 => 6, 15 => 7, 16 => 8, 17 => 9, 18 => 10, 19 => 11, 20 => 12, 21 => 13, 22 => 14, 23 => 15, 24 => 16, 25 => 17, 26 => 18, 27 => 19, 28 => 20, 29 => 21, 30 => 22, 31 => 23, 32 => 24, 33 => 25, 34 => 26, 35 => 27, 36 => 28, 37 => 29, 38 => 30, 39 => 31, 40 => 32, 41 => 33, 42 => 34, 43 => 35, 44 => 36, 45 => 37, 46 => 38, 47 => 39, 48 => 40, 49 => 41, 50 => 42, 51 => 43, 52 => 44, 53 => 45, 54 => 46, 55 => 47, 56 => 48, 57 => 49, 58 => 50, 59 => 51, 60 => 52, 61 => 53, 62 => 54, 63 => 55, 64 => 56, 65 => 57, 66 => 58, 67 => 59, 68 => 60, 69 => 61, 70 => 62, 71 => 63, 72 => 64, 73 => 65, 74 => 66, 75 => 67, 76 => 68, 77 => 69, 78 => 70, 79 => 71, 80 => 72, 81 => 73, 82 => 74, 83 => 75, 84 => 76, 85 => 77, 86 => 78, 87 => 79, 88 => 80, 89 => 81, 90 => 82, 91 => 83, 92 => 84, 93 => -1, # fake key (KP_Equal) 94 => 86, 95 => 87, 96 => 88, 97 => 94, 98 => 95, 99 => 96, 100 => 97, 102 => 98, 103 => 99, 104 => 100, 105 => 101, 106 => 102, 107 => 103, 108 => 89, 109 => 90, 110 => 104, 111 => 92, 112 => 91, 113 => 93, 114 => 108, 115 => 105, 116 => 106, 117 => 107, 118 => -1, # Japanese 119 => -1, # Japanese 120 => -1, # Japanese 123 => -1, 124 => -1, # fake key 125 => -1, # fake key 126 => -1, # fake key 127 => -1, # fake key 128 => -1, # fake key 129 => -1, # Japanese 131 => -1, # Japanese 133 => 125, # Japanese 134 => 126, # Brasilian ABNT2 144 => -1, # Japanese 156 => -1, # fake key 208 => -1, # Japanese 209 => -1, # Korean 210 => -1, # Korean 211 => 115, # Brasilian ABNT2, Japanese 214 => -1, # alternate between internal and multimedia display 215 => -1, # turn light on/of 216 => -1, # brightness down 217 => -1, # brightness up ); if ($freebsd) { $KEYMAP .= "# alt\n". "# scan cntrl alt alt cntrl lock\n". "# code base shift cntrl shift alt shift cntrl shift state\n". "# ------------------------------------------------------------------\n"; #" 000 nop nop nop nop nop nop nop nop O\n"; } elsif ($compact) { $KEYMAP .= "keymaps 0-4,6,8,10,12,14\n"; } else { $KEYMAP .= "keymaps 0-127\n"; } if ($freebsd) { foreach my $key (sort {$a <=> $b} (keys %symbols_table)) { my $kernel_code = $freebsd_scancodes{$key}; next if (! defined $kernel_code || $kernel_code < 0); @vector = flatten ($key); if ($kernel_code == 83 || $kernel_code == 103) { for my $coord (0+6, 0+7, 16+6, 16+7, 32+6, 32+7, 48+6, 48+7,) { $vector[$coord] = 'boot'; } } print_vector $kernel_code; } } elsif ($arch eq 'at' || $arch eq 'evdev') { foreach my $key (sort {$a <=> $b} (keys %symbols_table)) { my $kernel_code = (($arch eq 'at') ? $at_scancodes{$key} : $key - 8); next if (! defined $kernel_code || $kernel_code < 0); @vector = flatten ($key); if ($kernel_code == 99) { for my $coord (0, 1, 16, 17, 32, 33, 48, 49) { $vector[$coord] = 'VoidSymbol'; } } elsif ($kernel_code == 83 || $kernel_code == 111) { for my $coord (0+6, 0+12, 0+14, 16+6, 16+12, 16+14, 32+6, 32+12, 32+14, 48+6, 48+12, 48+14) { $vector[$coord] = 'Boot'; } } print_vector $kernel_code; } } elsif ($arch eq 'macintosh') { foreach my $key (sort {$a <=> $b} (keys %symbols_table)) { my $kernel_code = $key - 8; @vector = flatten ($key); print_vector $kernel_code; } $KEYMAP .= '\ keycode 127 = shift control keycode 127 = Boot ' } elsif ($arch eq 'ataritt') { foreach my $key (sort {$a <=> $b} (keys %symbols_table)) { my $kernel_code = $key - 8; if ($kernel_code == 97) { @vector = ('F246', 'Break', 'F246', 'F246', 'F246', 'F246', 'F246', 'F246', 'Last_Console', 'F246', 'F246', 'F246', 'F246', 'F246', 'F246', 'F246') x 4; } else { @vector = flatten ($key); } if ($kernel_code == 83 || $kernel_code == 113) { for my $coord (0+6, 0+12, 0+14, 16+6, 16+12, 16+14, 32+6, 32+12, 32+14, 48+6, 48+12, 48+14) { $vector[$coord] = 'Boot'; } } print_vector $kernel_code; } } elsif ($arch eq 'amiga') { foreach my $key (sort {$a <=> $b} (keys %symbols_table)) { my $kernel_code = $key - 8; @vector = flatten ($key); if ($kernel_code == 60) { for my $coord (0+6, 0+12, 0+14, 16+6, 16+12, 16+14, 32+6, 32+12, 32+14, 48+6, 48+12, 48+14) { $vector[$coord] = 'Boot'; } } print_vector $kernel_code; } } elsif ($arch eq 'sun') { foreach my $key (sort {$a <=> $b} (keys %symbols_table)) { my $kernel_code = $key - 7; @vector = flatten ($key); if ($kernel_code == 50) { for my $coord (0+6, 0+12, 0+14, 16+6, 16+12, 16+14, 32+6, 32+12, 32+14, 48+6, 48+12, 48+14) { $vector[$coord] = 'Boot'; } } print_vector $kernel_code; } } else { die "$0: Unsupported keyboard type $arch\n"; } if ($broken_caps) { $KEYMAP =~ s/Caps_Lock/CtrlL_Lock/g; } print $KEYMAP; if (!$compose_charmap && $charmap) { $compose_charmap = $charmap; } if ($freebsd) { if ($compose_charmap) { my $file1 = "/etc/console-setup/dkey.${compose_charmap}.inc"; my $file2 = "$installdir/etc/console-setup/dkey.${compose_charmap}.inc"; if (-f $file1) { system("cat $file1"); } elsif (-f $file2) { system("cat $file2"); } } } else { print "strings as usual\n"; if ($compose_charmap) { my $file1 = "/etc/console-setup/compose.${compose_charmap}.inc"; my $file2 = "$installdir/etc/console-setup/compose.${compose_charmap}.inc"; if (-f $file1) { system("cat $file1"); } elsif (-f $file2) { system("cat $file2"); } } } my $file1 = "/etc/console-setup/remap.inc"; my $file2 = "$installdir/etc/console-setup/remap.inc"; if (-f $file1) { system("cat $file1"); } elsif (-f $file2) { system("cat $file2"); } exit 0;