<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd"
[
	<!ENTITY varName     "[A-Za-z]\w*">
	<!ENTITY variable    "@\{&varName;\}">
	<!ENTITY exec        "[pPcC]?[iuU]?x">
	<!ENTITY globbChars  "*?">
	<!-- Characters not allowed in a path -->
	<!ENTITY noPathChar  "\s\)&quot;">
	<!ENTITY noPathCharWithoutSpace ")&quot;">
	<!ENTITY endPath     ",(?:[\s&quot;]|$)">
]>

<!--
   AppArmor Profiles Syntax Highlighting Definition
  ===========================================================================

   This file is part of the KDE's KSyntaxHighlighting framework.

   SPDX-FileCopyrightText: 2017-2020 Nibaldo González S. <nibgonz@gmail.com>

   SPDX-License-Identifier: MIT

  ===========================================================================

  Last update:
    Syntax highlighting based on AppArmor 3.0.0
    For more details about the syntax of AppArmor profiles, visit:
      https://gitlab.com/apparmor/apparmor/wikis/Documentation
      https://manpages.ubuntu.com/manpages/focal/en/man5/apparmor.d.5.html

  Change log:
   * Version 12 [02-Oct-2020]: (AppArmor 3.0) Add ABI rules and new profile flags.
   * Version 11 [30-Sep-2020]: Update itemData's and rule_mount_fstypes list.
   * Version 10 [25-Oct-2019]: Use non-capturing groups in RegExpr.
   * Version 9 [20-Jun-2019]: (AppArmor 2.13.3):
      - Add new network domain keywords.
      - Fixes: drop unsupported 'to' operator for link rules and only highlight the 'in'
        operator in mount rules. Only highlight valid numbers in rlimit rules.
   * Version 8 [02-Apr-2019]: (AppArmor 2.13.2)
      - Do not highlight variable assignments and alias rules within profiles.
      - Add keywords of "tunables/share" variables.
      - Change style of "Other Option" attribute and remove one indentation.
   * Version 7 [15-Sep-2018]:
      - Update itemData's style for the new Solarized color schemes.
      - Fixes in "_end_rule_irnc".
   * Version 6 [24-Jul-2018, by Nibaldo G.]: (AppArmor 2.13.0)
      - Fixes for Include rules, add 'if exists'. Fix escapes & globbing in text quoted.
      - Improvements in paths that start with variables, hats, comments and variable
        assignments and others. Add some abstractions & filesystems.
   * Version 4 [25-Jan-2018, by Nibaldo G.]: (AppArmor 2.12.0)
      - New keywords: network and mount rules, default abstractions, variables and others.
      - Multiple improvements and fixes.
      - Do not allow comments within rules and in variable assignment lines.
   * Version 3 [24-Sep-2017, by Nibaldo G.]:
      - Fix incorrect highlighting of the DBus rule 'name' keyword.
   * Version 2 [29-Aug-2017, by Nibaldo G.]:
      - Improvements and bug fixes.
      - Each rule has its own context.
      - The profile name is highlighted in the profile header and profile transition rules.
   * Version 1 [22-Feb-2017, by Nibaldo González]:
      - Initial version. Support for profile syntax of Apparmor 2.11.
-->

<language name="AppArmor Security Profile"
          version="13"
          kateversion="5.0"
          section="Markup"
          extensions="usr.bin.*;usr.sbin.*;bin.*;sbin.*;usr.lib.*;usr.lib64.*;usr.lib32.*;usr.libx32.*;usr.libexec.*;usr.local.bin.*;usr.local.sbin.*;usr.local.lib*;opt.*;etc.cron.*;snap.*;snap-update-ns.*;snap-confine.*"
          priority="0"
          mimetype=""
          author="Nibaldo González (nibgonz@gmail.com)"
          license="MIT">

<highlighting>

	<!-- Profile Header -->
	<list name="profile_head">
		<item>profile</item>
		<item>hat</item>
	</list>
	<list name="profile_options">
		<item>flags</item>
		<item>xattrs</item>
	</list>
	<list name="profile_flags">
		<item>audit</item>
		<item>complain</item>
		<item>enforce</item>
		<item>kill</item>
		<item>unconfined</item>
		<item>mediate_deleted</item>
		<item>attach_disconnected</item>
		<item>chroot_relative</item>
		<!-- Others -->
		<item>chroot_attach</item>
		<item>chroot_no_attach</item>
		<item>delegate_deleted</item>
		<item>no_attach_disconnected</item>
		<item>namespace_relative</item>
	</list>

	<!-- Rule Qualifiers -->
	<list name="rule_access_qualifiers">
		<item>allow</item>
		<item>deny</item>
	</list>
	<list name="file_rule_qualifiers">
		<item>owner</item>
		<item>other</item>
	</list>
	<list name="rule_qualifiers">
		<item>audit</item>
		<!-- noaudit/quiet, defined, not -->
	</list>
	<!-- Conditional: if, else -->

	<!-- Capabilities, Capability Rule.
	     Lowercase capability name without 'CAP_' prefix.
	     http://man7.org/linux/man-pages/man7/capabilities.7.html -->
	<list name="rule_capability">
		<item>audit_control</item>
		<item>audit_read</item>
		<item>audit_write</item>
		<item>block_suspend</item>
		<item>chown</item>
		<item>dac_override</item>
		<item>dac_read_search</item>
		<item>fowner</item>
		<item>fsetid</item>
		<item>ipc_lock</item>
		<item>ipc_owner</item>
		<item>kill</item>
		<item>lease</item>
		<item>linux_immutable</item>
		<item>mac_admin</item>
		<item>mac_override</item>
		<item>mknod</item>
		<item>net_admin</item>
		<item>net_bind_service</item>
		<item>net_broadcast</item>
		<item>net_raw</item>
		<item>setgid</item>
		<item>setfcap</item>
		<item>setpcap</item>
		<item>setuid</item>
		<item>sys_admin</item>
		<item>sys_boot</item>
		<item>sys_chroot</item>
		<item>sys_module</item>
		<item>sys_nice</item>
		<item>sys_pacct</item>
		<item>sys_ptrace</item>
		<item>sys_rawio</item>
		<item>sys_resource</item>
		<item>sys_time</item>
		<item>sys_tty_config</item>
		<item>syslog</item>
		<item>wake_alarm</item>
	</list>

	<!-- Network Rule -->
	<list name="rule_network">
		<!-- Domain.
		     Also: unix -->
		<item>inet</item>
		<item>ax25</item>
		<item>ipx</item>
		<item>appletalk</item>
		<item>netrom</item>
		<item>bridge</item>
		<item>atmpvc</item>
		<item>x25</item>
		<item>inet6</item>
		<item>rose</item>
		<item>netbeui</item>
		<item>security</item>
		<item>key</item>
		<item>packet</item>
		<item>ash</item>
		<item>econet</item>
		<item>atmsvc</item>
		<item>sna</item>
		<item>irda</item>
		<item>pppox</item>
		<item>wanpipe</item>
		<item>bluetooth</item>
		<item>netlink</item>
		<item>rds</item>
		<item>llc</item>
		<item>can</item>
		<item>tipc</item>
		<item>iucv</item>
		<item>rxrpc</item>
		<item>isdn</item>
		<item>phonet</item>
		<item>ieee802154</item>
		<item>caif</item>
		<item>alg</item>
		<item>nfc</item>
		<item>vsock</item>
		<item>mpls</item>
		<item>ib</item>
		<item>kcm</item>
		<item>smc</item>
		<item>qipcrtr</item>
		<item>xdp</item>

		<!-- Type.
		     Also: packet -->
		<item>stream</item>
		<item>dgram</item>
		<item>seqpacket</item>
		<item>rdm</item>
		<item>raw</item>

		<!-- Protocol -->
		<item>tcp</item>
		<item>udp</item>
		<item>icmp</item>
	</list>
	<list name="rule_network_unix">
		<!-- NOTE: This keyword is placed in a separate list,
		     to avoid conflicts with the 'unix' rule name. -->
		<item>unix</item>
	</list>

	<!-- Mount Rule -->
	<list name="rule_mount_options">
		<item>fstype</item>
		<item>vfstype</item>
		<item>options</item>
		<item>option</item>
	</list>
	<list name="rule_mount_flags">
		<item>r</item>
		<item>w</item>
		<item>rw</item>
		<item>ro</item>
		<item>read-only</item>
		<item>suid</item>
		<item>nosuid</item>
		<item>dev</item>
		<item>nodev</item>
		<item>exec</item>
		<item>noexec</item>
		<item>sync</item>
		<item>async</item>
		<item>remount</item>
		<item>mand</item>
		<item>nomand</item>
		<item>dirsync</item>
		<item>atime</item>
		<item>noatime</item>
		<item>diratime</item>
		<item>nodiratime</item>
		<item>bind</item>
		<item>B</item>
		<item>move</item>
		<item>M</item>
		<item>rbind</item>
		<item>R</item>
		<item>verbose</item>
		<item>silent</item>
		<item>loud</item>
		<item>acl</item>
		<item>noacl</item>
		<item>unbindable</item>
		<item>make-unbindable</item>
		<item>runbindable</item>
		<item>make-runbindable</item>
		<item>private</item>
		<item>make-private</item>
		<item>rprivate</item>
		<item>make-rprivate</item>
		<item>slave</item>
		<item>make-slave</item>
		<item>rslave</item>
		<item>make-rslave</item>
		<item>shared</item>
		<item>make-shared</item>
		<item>rshared</item>
		<item>make-rshared</item>
		<item>relatime</item>
		<item>norelatime</item>
		<item>iversion</item>
		<item>noiversion</item>
		<item>strictatime</item>
		<item>user</item>
		<item>nouser</item>
	</list>
	<list name="rule_mount_fstypes">
		<!-- Stackable FS -->
		<item>ecryptfs</item>
		<item>cryfs</item>
		<item>encfs</item>
		<item>overlayfs</item>
		<item>unionfs</item>
		<!-- Specialpurpose FS -->
		<item>devtmpfs</item>
		<item>ramfs</item>
		<item>tmpfs</item>
		<!-- Block-based, Network & Pseudo FS -->
		<item>adfs</item>
		<item>affs</item>
		<item>afs</item>
		<item>apfs</item>
		<item>apparmorfs</item>
		<item>autofs</item>
		<item>bdev</item>
		<item>bfs</item>
		<item>bpf</item>
		<item>btrfs</item>
		<item>cachefs</item>
		<item>ceph</item>
		<item>cgroup2</item>
		<item>cgroup</item>
		<item>cifs</item>
		<item>coda</item>
		<item>coherent</item>
		<item>configfs</item>
		<item>cpuset</item>
		<item>cramfs</item>
		<item>debugfs</item>
		<item>devfs</item>
		<item>devpts</item>
		<item>efs</item>
		<item>exfat</item>
		<item>ext2</item>
		<item>ext3</item>
		<item>ext4</item>
		<item>f2fs</item>
		<item>fatx</item>
		<item>functionfs</item>
		<item>fuse</item>
		<item>fuseblk</item>
		<item>fusectl</item>
		<item>futexfs</item>
		<item>gfs</item>
		<item>hfs</item>
		<item>hfsplus</item>
		<item>hpfs</item>
		<item>hugetlbfs</item>
		<item>ifs</item>
		<item>inotifyfs</item>
		<item>iso9660</item>
		<item>jffs2</item>
		<item>jffs</item>
		<item>jfs</item>
		<item>kernfs</item>
		<item>labeledfs</item>
		<item>lvm2</item>
		<item>minix</item>
		<item>mqueue</item>
		<item>msdos</item>
		<item>ncpfs</item>
		<item>nfs4</item>
		<item>nfs</item>
		<item>nilfs2</item>
		<item>nilfs</item>
		<item>ntfs-3g</item>
		<item>ntfs</item>
		<item>ocfs</item>
		<item>oemfs</item>
		<item>pipefs</item>
		<item>proc</item>
		<item>procfs</item>
		<item>pstore</item>
		<item>pstorefs</item>
		<item>qnx4</item>
		<item>qnx6</item>
		<item>reiser4</item>
		<item>reiserfs</item>
		<item>romfs</item>
		<item>rootfs</item>
		<item>sdcardfs</item>
		<item>securityfs</item>
		<item>selinuxfs</item>
		<item>shm</item>
		<item>smbfs</item>
		<item>sockfs</item>
		<item>specfs</item>
		<item>squashfs</item>
		<item>swap</item>
		<item>swapfs</item>
		<item>sysfs</item>
		<item>sysv</item>
		<item>tracefs</item>
		<item>ubifs</item>
		<item>udf</item>
		<item>ufs</item>
		<item>umsdos</item>
		<item>urefs</item>
		<item>usbfs</item>
		<item>vfat</item>
		<item>xenix</item>
		<item>xfs</item>
		<item>yaffs2</item>
		<item>yaffs</item>
		<item>zfs</item>
		<!-- Not included: ext, usbdevfs, xiafs -->
	</list>

	<!-- Pivot Root Rule -->
	<list name="rule_pivotroot_options">
		<item>oldroot</item>
	</list>

	<!-- Ptrace Rule -->
	<list name="rule_ptrace_options">
		<item>peer</item>
	</list>
	<list name="rule_ptrace_access">
		<!-- Also: r, w, rw, read -->
		<item>readby</item>
		<item>trace</item>
		<item>tracedby</item>
	</list>

	<!-- Signal Rule -->
	<list name="rule_signal_options">
		<item>set</item>
		<item>peer</item>
	</list>
	<list name="rule_signal">
		<!-- Also: rtmin+0 ... rtmin+32 -->
		<item>bus</item>
		<item>hup</item>
		<item>int</item>
		<item>quit</item>
		<item>ill</item>
		<item>trap</item>
		<item>abrt</item>
		<item>fpe</item>
		<item>kill</item>
		<item>usr1</item>
		<item>segv</item>
		<item>usr2</item>
		<item>pipe</item>
		<item>alrm</item>
		<item>term</item>
		<item>stkflt</item>
		<item>chld</item>
		<item>cont</item>
		<item>stop</item>
		<item>stp</item>
		<item>ttin</item>
		<item>ttou</item>
		<item>urg</item>
		<item>xcpu</item>
		<item>xfsz</item>
		<item>vtalrm</item>
		<item>prof</item>
		<item>winch</item>
		<item>io</item>
		<item>pwr</item>
		<item>sys</item>
		<item>emt</item>
		<item>exists</item>
	</list>
	<list name="rule_signal_access">
		<!-- Also: r, w, rw, read, write -->
		<item>send</item>
		<item>receive</item>
	</list>

	<!-- DBus Rule -->
	<list name="rule_dbus_options">
		<item>peer</item>
		<item>bus</item>
		<item>path</item>
		<item>interface</item>
		<item>member</item>
		<item>name</item>
	</list>
	<list name="rule_dbus_peer">
		<item>name</item>
		<item>label</item>
	</list>
	<list name="rule_dbus_access">
		<!-- Also: r, w, rw, read, write -->
		<item>send</item>
		<item>receive</item>
		<item>bind</item>
		<item>eavesdrop</item>
	</list>
	<list name="rule_dbus_bus">
		<item>system</item>
		<item>session</item>
	</list>

	<!-- Unix Rule -->
	<list name="rule_unix_options">
		<item>peer</item>
		<item>set</item>
		<item>label</item>
		<item>type</item>
		<item>protocol</item>
		<item>addr</item>
		<item>attr</item>
		<item>opt</item>
	</list>
	<list name="rule_unix_access">
		<!-- Also: r, w, rw, read, write -->
		<item>send</item>
		<item>receive</item>
		<item>bind</item>
		<item>create</item>
		<item>listen</item>
		<item>accept</item>
		<item>connect</item>
		<item>shutdown</item>
		<item>getattr</item>
		<item>setattr</item>
		<item>getopt</item>
		<item>setopt</item>
	</list>

	<!-- Rlimit Rule -->
	<list name="rule_rlimit">
		<item>cpu</item>
		<item>fsize</item>
		<item>data</item>
		<item>stack</item>
		<item>core</item>
		<item>rss</item>
		<item>nofile</item>
		<item>ofile</item>
		<item>as</item>
		<item>nproc</item>
		<item>memlock</item>
		<item>locks</item>
		<item>sigpending</item>
		<item>msgqueue</item>
		<item>nice</item>
		<item>rtprio</item>
		<item>rttime</item>
	</list>

	<!-- Link Rule -->
	<list name="rule_link">
		<item>subset</item>
	</list>

	<!-- Change Profile Rule -->
	<list name="rule_changeprofile">
		<item>safe</item>
		<item>unsafe</item>
	</list>

	<!-- Include Rule -->
	<list name="rule_include">
		<item>if</item>
		<item>exists</item>
	</list>

	<!-- Permissions -->
	<list name="base_accesses">
		<item>rw</item>
		<item>r</item>
		<item>w</item>
		<item>read</item>
		<item>write</item>
	</list>

	<!-- Abstractions and variables defined in the provided AppArmor policy.
	     NOTE: The following keywords are not used for highlighting. The purpose of these
	     is to provide autocomplete suggestions when writing Include rules and variables. -->
	<list name="default_variables">
		<item>profile_name</item> <!-- Special variable -->

		<item>HOME</item>
		<item>HOMEDIRS</item>
		<item>multiarch</item>
		<item>pid</item>
		<item>pids</item>
		<item>PROC</item>
		<item>securityfs</item>
		<item>apparmorfs</item>
		<item>sys</item>
		<item>tid</item>
		<item>XDG_DESKTOP_DIR</item>
		<item>XDG_DOWNLOAD_DIR</item>
		<item>XDG_TEMPLATES_DIR</item>
		<item>XDG_PUBLICSHARE_DIR</item>
		<item>XDG_DOCUMENTS_DIR</item>
		<item>XDG_MUSIC_DIR</item>
		<item>XDG_PICTURES_DIR</item>
		<item>XDG_VIDEOS_DIR</item>
		<item>flatpak_exports_root</item>
		<item>system_share_dirs</item>
		<item>user_share_dirs</item>
	</list>
	<list name="default_abstractions">
		<item>abstractions/</item>
		<item>apache2-common</item>
		<item>aspell</item>
		<item>audio</item>
		<item>authentication</item>
		<item>base</item>
		<item>bash</item>
		<item>consoles</item>
		<item>cups-client</item>
		<item>dbus</item>
		<item>dbus-accessibility</item>
		<item>dbus-accessibility-strict</item>
		<item>dbus-session</item>
		<item>dbus-session-strict</item>
		<item>dbus-strict</item>
		<item>dconf</item>
		<item>dovecot-common</item>
		<item>dri-common</item>
		<item>dri-enumerate</item>
		<item>enchant</item>
		<item>fcitx</item>
		<item>fcitx-strict</item>
		<item>fonts</item>
		<item>freedesktop.org</item>
		<item>gnome</item>
		<item>gnupg</item>
		<item>ibus</item>
		<item>kde-icon-cache-write</item>
		<item>kde-globals-write</item>
		<item>kde-language-write</item>
		<item>kde</item>
		<item>kerberosclient</item>
		<item>launchpad-integration</item>
		<item>ldapclient</item>
		<item>libpam-systemd</item>
		<item>likewise</item>
		<item>mdns</item>
		<item>mesa</item>
		<item>mir</item>
		<item>mozc</item>
		<item>mysql</item>
		<item>nameservice</item>
		<item>nis</item>
		<item>nvidia</item>
		<item>opencl</item>
		<item>opencl-common</item>
		<item>opencl-intel</item>
		<item>opencl-mesa</item>
		<item>opencl-nvidia</item>
		<item>opencl-pocl</item>
		<item>openssl</item>
		<item>orbit2</item>
		<item>p11-kit</item>
		<item>perl</item>
		<item>php</item>
		<item>php5</item>
		<item>postfix-common</item>
		<item>private-files</item>
		<item>private-files-strict</item>
		<item>python</item>
		<item>qt5-compose-cache-write</item>
		<item>qt5-settings-write</item>
		<item>qt5</item>
		<item>recent-documents-write</item>
		<item>ruby</item>
		<item>samba</item>
		<item>smbpass</item>
		<item>ssl_certs</item>
		<item>ssl_keys</item>
		<item>svn-repositories</item>
		<item>ubuntu-bittorrent-clients</item>
		<item>ubuntu-browsers</item>
		<item>ubuntu-console-browsers</item>
		<item>ubuntu-console-email</item>
		<item>ubuntu-email</item>
		<item>ubuntu-feed-readers</item>
		<item>ubuntu-gnome-terminal</item>
		<item>ubuntu-helpers</item>
		<item>ubuntu-konsole</item>
		<item>ubuntu-media-players</item>
		<item>ubuntu-unity7-base</item>
		<item>ubuntu-unity7-launcher</item>
		<item>ubuntu-unity7-messaging</item>
		<item>ubuntu-xterm</item>
		<item>user-download</item>
		<item>user-mail</item>
		<item>user-manpages</item>
		<item>user-tmp</item>
		<item>user-write</item>
		<item>video</item>
		<item>vulkan</item>
		<item>wayland</item>
		<item>web-data</item>
		<item>winbind</item>
		<item>wutmp</item>
		<item>X</item>
		<item>xad</item>
		<item>xdg-desktop</item>

		<item>ubuntu-browsers.d/</item>
		<item>java</item>
		<item>mailto</item>
		<item>multimedia</item>
		<item>plugins-common</item>
		<item>productivity</item>
		<item>text-editors</item>
		<item>ubuntu-integration</item>
		<item>ubuntu-integration-xul</item>
		<item>user-files</item>

		<item>apparmor_api/</item>
		<item>change_profile</item>
		<item>examine</item>
		<item>find_mountpoint</item>
		<item>introspect</item>
		<item>is_enabled</item>

		<item>tunables/</item>
		<item>alias</item>
		<item>apparmorfs</item>
		<item>dovecot</item>
		<item>global</item>
		<item>home</item>
		<item>kernelvars</item>
		<item>multiarch</item>
		<item>ntpd</item>
		<item>proc</item>
		<item>securityfs</item>
		<item>sys</item>
		<item>xdg-user-dirs</item>
		<item>home.d/</item>
		<item>multiarch.d/</item>
		<item>xdg-user-dirs.d/</item>
		<item>site.local</item>

		<item>local/</item>
	</list>

	<list name="boolean">
		<item>true</item>
		<item>false</item>
	</list>
	<list name="other_words">
		<item>unspec</item>
		<item>none</item>
		<item>unconfined</item>
	</list>

	<!-- Rule Names.
	     NOTE:
	      - Each rule name is a keyword in separate lists, since each
	        has a different context and for a correct delimitation of the words.
	      - The content of a rule is found in the contexts "_default_rule"
	        and "_default_rule_with_comments".
	      - When adding a new rule, add it also in "_end_rule_irnc"! -->
	<list name="rule_name_mount">
		<item>mount</item>
		<item>remount</item>
		<item>umount</item>
	</list>
	<list name="rule_name_abi"><item>abi</item></list>
	<list name="rule_name_alias"><item>alias</item></list>
	<list name="rule_name_file"><item>file</item></list>
	<list name="rule_name_capability"><item>capability</item></list>
	<list name="rule_name_network"><item>network</item></list>
	<list name="rule_name_pivotroot"><item>pivot_root</item></list>
	<list name="rule_name_ptrace"><item>ptrace</item></list>
	<list name="rule_name_signal"><item>signal</item></list>
	<list name="rule_name_dbus"><item>dbus</item></list>
	<list name="rule_name_unix"><item>unix</item></list>
	<list name="rule_name_link"><item>link</item></list>
	<list name="rule_name_changeprofile"><item>change_profile</item></list>
	<list name="rule_name_rlimit"><item>rlimit</item></list>
	<list name="rule_name_set"><item>set</item></list>

	<contexts>

		<context name="_normal" attribute="Normal Text" lineEndContext="#stay">
			<!-- Preamble -->

			<!-- Variable Assignment.
			     NOTE:
			      - Variable assignments are not allowed within profiles (when writing assignments within
			        profiles, the parser shows an error because it does not allow + or = after a variable).
			      - [Jul 24, 2018] Variables of type "@VAR" will only be highlighted in assignments, as long
			        as they are not fully supported (apparently, they will be used in conditional expressions). -->
			<Detect2Chars context="_variable_assignment" attribute="Variable" char="@" char1="{" lookAhead="true" firstNonSpace="true"/>
			<RegExpr context="_variable_assignment_operator" attribute="Variable" String="@&varName;(?=\s*(?:\+?\=|$|\s#))" firstNonSpace="true"/>
			<DetectChar context="_variable_assignment_line_general" attribute="Operator 1" char="=" firstNonSpace="true"/>
			<Detect2Chars context="_variable_assignment_line" attribute="Operator 1" char="+" char1="=" firstNonSpace="true"/>
			<!-- Alias rule -->
			<keyword context="_default_rule_with_comments" attribute="Rule" String="rule_name_alias" beginRegion="Rule"/>

			<!-- Profile Content (also highlight rules, for abstractions) -->
			<IncludeRules context="_default_profile"/>
		</context>

		<!-- Profile Content, within { ... } -->
		<context name="_profile" attribute="Normal Text" lineEndContext="#stay">
			<DetectChar context="#pop" attribute="Operator 1" char="}" endRegion="Profile"/>
			<Detect2Chars context="_variable_assignment_error" attribute="Variable" char="@" char1="{" lookAhead="true" firstNonSpace="true"/>
			<IncludeRules context="_default_profile"/>
			<WordDetect context="#stay" attribute="Error" String="alias"/> <!-- rule_name_alias -->
		</context>

		<context name="_default_profile" attribute="Normal Text" lineEndContext="#stay">
			<!-- Profile Header -->
			<keyword context="_profile_name" attribute="Profile Head" String="profile_head"/>
			<RegExpr context="_profile_name" attribute="Profile Head" String="(?:^|\s)\^(?=\S)"/>
			<keyword context="#stay" attribute="Option" String="profile_options"/>

			<!-- Line Rules -->
			<StringDetect context="_include" attribute="Preprocessor" String="#include" insensitive="true"/>
			<RegExpr context="_include" attribute="Preprocessor" String="(?:^|\s)include(?=\s)"/>
			<DetectChar context="_comment" attribute="Comment" char="#"/>

			<!-- Variables -->
			<Detect2Chars context="_variable" attribute="Variable" char="@" char1="{" lookAhead="true"/>
			<Detect2Chars context="_boolean" attribute="Variable" char="$" char1="{" lookAhead="true"/>
			<keyword context="#stay" attribute="Other Option" String="boolean" insensitive="true"/>
			<RegExpr context="#stay" attribute="Variable" String="\$&varName;(?=[\s\(\)\{\}&quot;@\$#\=\+]|$)"/>

			<!-- Brackets -->
			<IncludeRules context="_brackets_error"/> <!-- {} -->
			<DetectChar context="_profile" attribute="Operator 1" char="{" beginRegion="Profile"/>
			<DetectChar context="_parentheses_block_profile" attribute="Normal Text" char="("/>
			<DetectChar context="_r_square_brackets" attribute="Globbing Brackets" char="["/>

			<!-- Rule Qualifiers -->
			<keyword context="#stay" attribute="Rule Access Qualifier" String="rule_access_qualifiers"/>
			<keyword context="#stay" attribute="Rule Qualifier" String="rule_qualifiers"/>
			<keyword context="#stay" attribute="File Rule Qualifier" String="file_rule_qualifiers"/>

			<!-- Rules -->
			<keyword context="_rule_abi" attribute="Rule" String="rule_name_abi" beginRegion="Rule"/>
			<keyword context="_rule_file" attribute="Rule" String="rule_name_file" beginRegion="Rule"/>
			<keyword context="_rule_mount" attribute="Rule" String="rule_name_mount" beginRegion="Rule"/>
			<keyword context="_rule_capability" attribute="Rule" String="rule_name_capability" beginRegion="Rule"/>
			<keyword context="_rule_network" attribute="Rule" String="rule_name_network" beginRegion="Rule"/>
			<keyword context="_rule_pivotroot" attribute="Rule" String="rule_name_pivotroot" beginRegion="Rule"/>
			<keyword context="_rule_ptrace" attribute="Rule" String="rule_name_ptrace" beginRegion="Rule"/>
			<keyword context="_rule_signal" attribute="Rule" String="rule_name_signal" beginRegion="Rule"/>
			<keyword context="_rule_dbus" attribute="Rule" String="rule_name_dbus" beginRegion="Rule"/>
			<keyword context="_rule_unix" attribute="Rule" String="rule_name_unix" beginRegion="Rule"/>
			<keyword context="_rule_link" attribute="Rule" String="rule_name_link" beginRegion="Rule"/>
			<keyword context="_rule_changeprofile" attribute="Rule" String="rule_name_changeprofile" beginRegion="Rule"/>
			<keyword context="_rule_rlimit" attribute="Rule Error" String="rule_name_rlimit" beginRegion="Rule"/> <!-- set rlimit -->
			<keyword context="_rule_set" attribute="Rule" String="rule_name_set"/>

			<!-- Paths, text in quotes, file permissions and others -->
			<IncludeRules context="_operators"/>
			<IncludeRules context="_find_path"/>
			<IncludeRules context="_find_text_quoted"/>
			<IncludeRules context="_file_rule_permissions"/>
			<keyword context="#stay" String="default_variables"/>
		</context>

		<!-- Within rules and blocks of parentheses -->
		<context name="_common" attribute="Normal Text" lineEndContext="#stay">
			<StringDetect context="#stay" attribute="Error" String="#include" insensitive="true"/>
			<RegExpr context="#stay" attribute="Error" String="include(?=\s)" firstNonSpace="true"/>
			<IncludeRules context="_brackets_error"/>

			<IncludeRules context="_operators"/>
			<IncludeRules context="_find_text_quoted"/>
			<keyword context="#stay" attribute="Other Data" String="other_words" insensitive="true"/>
			<keyword context="#stay" attribute="Other Data" String="boolean" insensitive="true"/>
		</context>

		<!-- Comment -->
		<context name="_comment" attribute="Comment" lineEndContext="#pop">
			<DetectSpaces />
			<LineContinue context="#pop" attribute="Comment"/>
			<IncludeRules context="##Comments"/>
			<!-- URL -->
			<RegExpr context="#stay" attribute="URL in Comment" String="\bhttps?://[^\s&lt;&gt;&quot;&apos;`]*[^\s&lt;&gt;&quot;&apos;`\}\)\]\.,;\|]"/>
			<!-- Email (Source: http://emailregex.com) -->
			<RegExpr context="#stay" attribute="URL in Comment" String="(?:(?:[^&lt;&gt;\(\)\[\]\\\.,;:\s@&quot;]+(?:\.[^&lt;&gt;\(\)\[\]\\\.,;:\s@&quot;]+)*)|(?:&quot;[^&quot;]+&quot;))@(?:(?:\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}])|(?:(?:[a-zA-Z\-\d]+\.)+[a-zA-Z]{2,}))\b"/>
		</context>

		<!-- Profile Header:
		     Highlight the name of the profile.
		     The profile name label is written after the hat character (^) or a profile keyword.
		     AppArmor 3.0 deprecates the use of pathnames as the profiles name. -->
		<context name="_profile_name" attribute="Profile Name" lineEndContext="#stay" fallthrough="true" fallthroughContext="#pop">
			<DetectSpaces context="#stay" attribute="Normal Text"/>
			<!-- Not highlighting paths and paths quoted.
			     NOTE: Some profile labels may contain "/" (like [/]). These cases are not considered. -->
			<RegExpr context="#pop" attribute="Normal Text" String="&quot;(?:[^/&quot;\\]|\\.)*/" lookAhead="true"/>
			<RegExpr context="#pop!_path_content" attribute="Path" String="(?:[^\s&quot;\\]|\\.)*/" lookAhead="true"/>
			<DetectChar context="#pop!_profile_name_quoted" attribute="Profile Name" char="&quot;"/>
			<!-- First word (the profile name) -->
			<RegExpr context="#pop!_profile_name_content" attribute="Normal Text" String="[^\s/\^\{]" lookAhead="true"/>
		</context>
		<context name="_profile_name_content" attribute="Profile Name" lineEndContext="#pop">
			<!-- NOTE: "(" generates errors when calling "get_profiles()" (apparmor_status). This forces to put a space before. -->
			<RegExpr context="#pop" attribute="Error" String="\(\S*\)?"/>
			<!-- End of the profile name label -->
			<DetectSpaces context="#pop" attribute="Normal Text" lookAhead="true"/>
			<!-- The quote ends the profile name, but it is ideal to put a space before -->
			<DetectChar context="#pop" attribute="Normal Text" char="&quot;" lookAhead="true"/>
			<RegExpr context="#stay" attribute="Profile Name Error" String="[^\s\(\\](?=[&quot;\(])"/>

			<StringDetect context="#pop" attribute="Error" String="#include" insensitive="true"/>
			<IncludeRules context="_variable_simple"/>
			<IncludeRules context="_escape"/>
		</context>
		<context name="_profile_name_quoted" attribute="Profile Name" lineEndContext="#stay">
			<DetectChar context="#pop" attribute="Profile Name" char="&quot;"/>
			<IncludeRules context="_variable_simple"/>
			<IncludeRules context="_escape"/>
		</context>

		<!-- Include Rule: include <abstraction/path> -->
		<context name="_include" attribute="Preprocessor" lineEndContext="#pop">
			<Detect2Chars context="#pop" attribute="Error" char="&quot;" char1="&quot;"/>
			<Detect2Chars context="#pop" attribute="Error" char="&lt;" char1="&gt;"/>
			<RegExpr context="#stay" attribute="Error" String="&lt;+(?=[&lt;\s])"/>
			<RegExpr context="#pop!_include_preplib_thanquot" attribute="Prep. Lib" String="&lt;\s*(?=&quot;)"/> <!-- <"path"> -->
			<DetectChar context="#pop!_include_preplib_than" attribute="Prep. Lib" char="&lt;" lookAhead="true"/> <!-- <magic/path> -->
			<DetectChar context="#pop!_include_preplib_quot" attribute="Prep. Lib" char="&quot;"/> <!-- "/abs/path" -->
			<keyword context="#stay" attribute="Preprocessor" String="rule_include"/>
			<RegExpr context="#pop" attribute="Prep. Lib" String="[^\s/&quot;&lt;&gt;]*/\S*(?=\s|$)"/> <!-- /abs/path -->
		</context>
		<context name="_include_preplib_than" attribute="Prep. Lib" lineEndContext="#pop">
			<DetectChar context="#pop" attribute="Prep. Lib" char="&gt;"/>
			<keyword context="#stay" attribute="Prep. Lib" String="default_abstractions"/>
			<RegExpr context="#pop" attribute="Open Prep. Lib" String="[^&gt;\s](?=\s*$)"/>
		</context>
		<context name="_include_preplib_quot" attribute="Prep. Lib" lineEndContext="#pop">
			<DetectChar context="#pop" attribute="Prep. Lib" char="&quot;"/>
			<keyword context="#stay" attribute="Prep. Lib" String="default_abstractions"/>
			<RegExpr context="#pop" attribute="Open Prep. Lib" String="[^&quot;\s](?=\s*$)"/>
		</context>
		<context name="_include_preplib_thanquot" attribute="Prep. Lib" lineEndContext="#pop">
			<DetectChar context="_include_preplib_quot" attribute="Prep. Lib" char="&quot;"/>
			<IncludeRules context="_include_preplib_than"/>
		</context>

		<!-- ABI Rule -->
		<context name="_rule_abi" attribute="Error" lineEndContext="#stay">
			<DetectSpaces attribute="Normal Text"/>
			<RegExpr context="#pop!_abi_path_thanquot" attribute="Prep. Lib" String="&lt;\s*(?=&quot;)"/> <!-- <"path"> -->
			<DetectChar context="#pop!_abi_path_than" attribute="Prep. Lib" char="&lt;" lookAhead="true"/> <!-- <magic/path> -->
			<DetectChar context="#pop!_abi_path_quot" attribute="Prep. Lib" char="&quot;"/> <!-- "/abs/path" -->
			<IncludeRules context="_end_rule"/>
			<DetectChar context="_comment" attribute="Comment" char="#"/>
			<!-- /abs/path -->
			<RegExpr context="#stay" attribute="Error" String="[^\s&quot;&lt;]+(?=[&quot;&lt;])"/>
			<RegExpr context="#pop!_abi_path_text" attribute="Prep. Lib" String="[^\s&quot;&lt;]+" lookAhead="true"/>
		</context>

		<context name="_abi_path_text" attribute="Prep. Lib" lineEndContext="#pop!_rule_abi_after_path">
			<RegExpr context="#pop!_rule_abi_after_path" String="&endPath;" lookAhead="true"/>
			<DetectSpaces context="#pop!_rule_abi_after_path" lookAhead="true"/>
			<AnyChar context="#stay" attribute="Error" String="&quot;&lt;&gt;"/>
		</context>
		<context name="_abi_path_quot" attribute="Prep. Lib" lineEndContext="#stay">
			<DetectChar context="#pop!_rule_abi_after_path" attribute="Prep. Lib" char="&quot;"/>
			<IncludeRules context="_escape"/>
		</context>
		<context name="_abi_path_than" attribute="Prep. Lib" lineEndContext="#pop!_rule_abi_after_path">
			<DetectChar context="#pop!_rule_abi_after_path" attribute="Prep. Lib" char="&gt;"/>
			<RegExpr context="#pop!_rule_abi_after_path" attribute="Open Prep. Lib" String="[^&gt;\s](?=\s*$)"/>
		</context>
		<context name="_abi_path_thanquot" attribute="Prep. Lib" lineEndContext="#pop!_rule_abi_after_path">
			<DetectChar context="_abi_path_thanquot_quot" attribute="Prep. Lib" char="&quot;"/>
			<IncludeRules context="_abi_path_than"/>
		</context>
		<context name="_abi_path_thanquot_quot" attribute="Prep. Lib" lineEndContext="#stay">
			<DetectChar context="#pop" attribute="Prep. Lib" char="&quot;"/>
			<IncludeRules context="_escape"/>
		</context>

		<context name="_rule_abi_after_path" attribute="Error" lineEndContext="#stay">
			<DetectSpaces attribute="Normal Text"/>
			<IncludeRules context="_end_rule"/>
			<DetectChar context="_comment" attribute="Comment" char="#"/>
		</context>

		<!-- @{VARIABLE} -->
		<context name="_variable" attribute="Variable" lineEndContext="#pop">
			<RegExpr context="#pop!_find_path_after_variable" attribute="Variable" String="&variable;"/>
			<DetectChar context="#pop" attribute="Error" char="@"/>
		</context>
		<context name="_parentheses_variable" attribute="Variable" lineEndContext="#pop">
			<RegExpr context="#pop!_parentheses_find_path_after_variable" attribute="Variable" String="&variable;"/>
			<DetectChar context="#pop" attribute="Error" char="@"/>
		</context>
		<context name="_variable_simple" attribute="Normal Text" lineEndContext="#stay">
			<RegExpr context="#stay" attribute="Variable" String="&variable;"/>
		</context>

		<!-- Find path after a variable -->
		<context name="_find_path_after_variable" attribute="Path" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop!_path_content">
			<DetectSpaces context="#pop" lookAhead="true"/>
			<AnyChar context="#pop" String="&noPathCharWithoutSpace;]}=" lookAhead="true"/>
			<RegExpr context="#pop" String="[[:cntrl:]]" lookAhead="true"/> <!-- It is necessary? -->
		</context>
		<context name="_parentheses_find_path_after_variable" attribute="Path" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop!_parentheses_path_content">
			<DetectChar context="#pop" char="," lookAhead="true"/>
			<IncludeRules context="_find_path_after_variable"/>
		</context>

		<!-- @{VARIABLE} = A B C -->
		<context name="_variable_assignment" attribute="Variable" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
			<RegExpr context="#pop!_variable_assignment_operator" attribute="Variable" String="&variable;"/>
			<DetectChar context="#pop" attribute="Error" char="@"/>
		</context>
		<context name="_variable_assignment_operator" attribute="Normal Text" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop!_path_content">
			<!-- After the operator, highlighting as "Path" the entire line -->
			<RegExpr context="#pop!_variable_assignment_line" attribute="Operator 1" String="\s*\+?\="/>
			<DetectChar context="#pop!_path_content" attribute="Error" char="+"/>
			<IncludeRules context="_find_path_after_variable"/>
		</context>
		<context name="_variable_assignment_line" attribute="Path" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop!_variable_assignment_line_content">
			<DetectChar context="#pop!_variable_assignment_line_content" attribute="Error" char="#"/> <!-- Comment -->
		</context>
		<context name="_variable_assignment_line_content" attribute="Path" lineEndContext="#pop">
			<LineContinue context="#stay" attribute="Escape Char"/>
			<IncludeRules context="_path_globbing"/>
			<IncludeRules context="_find_text_quoted"/>
			<IncludeRules context="_variable_simple"/>
			<Detect2Chars context="_hat_path" char="/" char1="/" lookAhead="true"/>
			<RegExpr context="#stay" attribute="Error" String=",(?=[\s&quot;]|$)"/> <!-- End of rule comma (&endPath;) -->
			<StringDetect context="#stay" attribute="Error" String="#include" insensitive="true"/>

			<!-- NOTE: [V4][Jan 06, 2018] AppArmor does not detect comments in variable assignment lines
			     (these are carried through to the policy). This is an AppArmor bug, therefore, the hash
			     character after a space is highlighted as "Error". Check this when the bug has been fixed. -->
			<RegExpr context="_comment_variable_assignment_line" attribute="Path" String="\s(?=#)"/>
		</context>
		<context name="_comment_variable_assignment_line" attribute="Error" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
			<DetectChar context="#pop" attribute="Error" char="#"/>
		</context>
		<context name="_variable_assignment_line_general" attribute="Path" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop!_variable_assignment_line">
			<keyword context="#pop!_variable_assignment_line" attribute="Other Option" String="boolean" insensitive="true"/>
			<DetectSpaces context="#stay"/>
		</context>

		<!-- Within the profiles, highlight as "Error" the operators of variable assignment (= and +=) -->
		<context name="_variable_assignment_error" attribute="Variable" lineEndContext="#pop">
			<RegExpr context="#pop!_variable_assignment_error_operator" attribute="Variable" String="&variable;"/>
			<DetectChar context="#pop" attribute="Error" char="@"/>
		</context>
		<context name="_variable_assignment_error_operator" attribute="Normal Text" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop!_find_path_after_variable">
			<DetectChar context="#pop!_find_path_after_variable" attribute="Error" char="="/>
			<Detect2Chars context="#pop!_find_path_after_variable" attribute="Error" char="+" char1="="/>
			<RegExpr context="#pop!_variable_assignment_error_operator_after_spaces" String="\s+(?=\+?\=)"/>
		</context>
		<context name="_variable_assignment_error_operator_after_spaces" attribute="Normal Text" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
			<DetectChar context="#pop" attribute="Error" char="="/>
			<Detect2Chars context="#pop" attribute="Error" char="+" char1="="/>
		</context>

		<!-- ${BOOLEAN} -->
		<context name="_boolean" attribute="Variable" lineEndContext="#pop">
			<RegExpr context="#pop" attribute="Variable" String="\$\{&varName;\}"/>
			<DetectChar context="#pop" attribute="Error" char="$"/>
		</context>

		<!-- Access Modes / File Permissions -->
		<context name="_permissions" attribute="Normal Text" lineEndContext="#stay">
			<IncludeRules context="_permissions_correction"/>
			<RegExpr context="#stay" attribute="Permissions" String="(?:^|\s)(?:[rwkml]|&exec;)+(?=[\s,]|$)"/>
			<RegExpr context="#stay" attribute="Permissions" String="(?:^|\s)(?:[rakml]|&exec;)+(?=[\s,]|$)"/>
		</context>
		<context name="_file_rule_permissions" attribute="Normal Text" lineEndContext="#stay">
			<IncludeRules context="_permissions_correction"/>
			<RegExpr context="_rule_file" attribute="Permissions" String="(?:^|\s)(?:[rwkml]|&exec;)+(?=[\s,]|$)"/>
			<RegExpr context="_rule_file" attribute="Permissions" String="(?:^|\s)(?:[rakml]|&exec;)+(?=[\s,]|$)"/>
		</context>
		<context name="_permissions_correction" attribute="Normal Text" lineEndContext="#stay">
			<!-- Incompatible execution modes -->
			<RegExpr context="_perm_correction_in" String="(?:^|\s)[rwakml]*p[iUu]?x(?:[rwakml]|p[iUu]?x)*[PcC]?[iUu]?x(?:[rwakml]|&exec;)*(?:[\s,]|$)" lookAhead="true"/> <!-- p -->
			<RegExpr context="_perm_correction_in" String="(?:^|\s)[rwakml]*P[iUu]?x(?:[rwakml]|P[iUu]?x)*[pcC]?[iUu]?x(?:[rwakml]|&exec;)*(?:[\s,]|$)" lookAhead="true"/> <!-- P -->
			<RegExpr context="_perm_correction_in" String="(?:^|\s)[rwakml]*c[iUu]?x(?:[rwakml]|c[iUu]?x)*[PpC]?[iUu]?x(?:[rwakml]|&exec;)*(?:[\s,]|$)" lookAhead="true"/> <!-- c -->
			<RegExpr context="_perm_correction_in" String="(?:^|\s)[rwakml]*C[iUu]?x(?:[rwakml]|C[iUu]?x)*[Ppc]?[iUu]?x(?:[rwakml]|&exec;)*(?:[\s,]|$)" lookAhead="true"/> <!-- C -->
			<RegExpr context="_perm_correction_in" String="(?:^|\s)[rwakml]*[PpCc]?ix(?:[rwakml]|[PpCc]?ix)*[PpCc]?[Uu]?x(?:[rwakml]|&exec;)*(?:[\s,]|$)" lookAhead="true"/> <!-- i -->
			<RegExpr context="_perm_correction_in" String="(?:^|\s)[rwakml]*[PpCc]?ux(?:[rwakml]|[PpCc]?ux)*[PpCc]?[iU]?x(?:[rwakml]|&exec;)*(?:[\s,]|$)" lookAhead="true"/> <!-- u -->
			<RegExpr context="_perm_correction_in" String="(?:^|\s)[rwakml]*[PpCc]?Ux(?:[rwakml]|[PpCc]?Ux)*[PpCc]?[iu]?x(?:[rwakml]|&exec;)*(?:[\s,]|$)" lookAhead="true"/> <!-- U -->
			<RegExpr context="_perm_correction_in" String="(?:^|\s)[rwakml]*[iuU]?x(?:[rwakml]|[iuU]?x)*[PpCc][iuU]?x(?:[rwakml]|&exec;)*(?:[\s,]|$)" lookAhead="true"/> <!-- x, ix, ux or Ux followed by P, p, C or c -->
			<RegExpr context="_perm_correction_in" String="(?:^|\s)[rwakml]*x[rwakmlx]*[iuU]x(?:[rwakml]|&exec;)*(?:[\s,]|$)" lookAhead="true"/> <!-- x followed by ix, ux or Ux -->
		</context>
		<context name="_perm_correction_in" attribute="Normal Text" lineEndContext="#pop">
			<!-- Highlight the previous space or the full permission -->
			<DetectSpaces context="#pop"/>
			<DetectIdentifier context="#pop"/>
		</context>

		<!-- Operators -->
		<context name="_operators" attribute="Normal Text" lineEndContext="#stay">
			<DetectChar context="#stay" attribute="Operator 1" char="="/>
			<Detect2Chars context="#stay" attribute="Operator 1" char="+" char1="="/>
			<Detect2Chars context="#stay" attribute="Operator 2" char="-" char1="&gt;"/>
		</context>
		<context name="_operators_in" attribute="Normal Text" lineEndContext="#stay">
			<!-- Only in mount rules -->
			<RegExpr context="#stay" attribute="Operator 2" String="\b(?:in)(?=[\s\(\{\[&quot;/@\$]|$)"/>
		</context>

		<!-- RULES -->

		<!-- For all rules -->
		<!-- Also see: _default_parentheses_block_rule -->
		<context name="_common_rule" attribute="Normal Text" lineEndContext="#stay">
			<!-- Highlight as path the text after the '=' operator, except keywords or simple words ([\w\-\+]+) -->
			<RegExpr context="#stay" attribute="Error" String="\=(?=\s*(?:$|&endPath;))"/>
			<RegExpr context="_path_content" attribute="Operator 1" String="\=\s*(?=[^\s&quot;\(]*(?:[^&noPathChar;\]\}\=\w\+\-\(,]|,[^&noPathChar;]))"/>
			<Detect2Chars context="_variable" attribute="Variable" char="@" char1="{" lookAhead="true"/>
			<IncludeRules context="_find_path"/>

			<IncludeRules context="_common"/>
			<DetectChar context="_r_curly_brackets" attribute="Globbing Brackets" char="{"/>
			<DetectChar context="_r_square_brackets" attribute="Globbing Brackets" char="["/>
			<!-- This must be at the end of each context (to avoid conflicts with some keywords) -->
			<IncludeRules context="_end_rule"/>
		</context>
		<context name="_default_rule_without_parentheses" attribute="Normal Text" lineEndContext="#stay">
			<IncludeRules context="_common_rule"/>
			<!-- AppArmor does not detect comments within rules (except in file & alias rules) -->
			<IncludeRules context="_comment_not_allowed"/>
		</context>
		<context name="_default_rule" attribute="Normal Text" lineEndContext="#stay">
			<IncludeRules context="_default_rule_without_parentheses"/>
			<DetectChar context="_default_parentheses_block_rule" attribute="Normal Text" char="("/>
		</context>
		<context name="_default_rule_with_comments" attribute="Normal Text" lineEndContext="#stay">
			<IncludeRules context="_common_rule"/>
			<DetectChar context="_comment" attribute="Comment" char="#"/>
		</context>

		<context name="_comment_not_allowed" attribute="Normal Text" lineEndContext="#stay">
			<DetectChar context="_comment" attribute="Error" char="#" firstNonSpace="true"/>
			<DetectChar context="#stay" attribute="Error" char="#"/>
		</context>

		<!-- Network Rule -->
		<context name="_rule_network" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Data" String="rule_network"/>
			<keyword context="#stay" attribute="Data" String="rule_network_unix"/>
			<IncludeRules context="_default_rule"/>
		</context>

		<!-- Capability Rule -->
		<context name="_rule_capability" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Data" String="rule_capability"/>
			<IncludeRules context="_default_rule"/>
		</context>

		<!-- Mount Rule -->
		<context name="_rule_mount" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Option" String="rule_mount_options"/>
			<IncludeRules context="_mount_rule_keywords"/>
			<IncludeRules context="_default_rule_without_parentheses"/>
			<DetectChar context="_mount_parentheses_block" attribute="Normal Text" char="("/>
		</context>
		<context name="_mount_parentheses_block" attribute="Normal Text" lineEndContext="#stay">
			<IncludeRules context="_mount_rule_keywords"/>
			<IncludeRules context="_default_parentheses_block_rule"/>
		</context>
		<context name="_mount_rule_keywords" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Permissions" String="rule_mount_flags"/>
			<keyword context="#stay" attribute="Flags" String="rule_mount_fstypes"/>
			<IncludeRules context="_operators_in"/>
		</context>

		<!-- Pivot Root Rule -->
		<context name="_rule_pivotroot" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Option" String="rule_pivotroot_options"/>
			<IncludeRules context="_default_rule"/>
		</context>

		<!-- Ptrace Rule -->
		<context name="_rule_ptrace" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Option" String="rule_ptrace_options"/>
			<IncludeRules context="_ptrace_rule_keywords"/>
			<IncludeRules context="_default_rule_without_parentheses"/>
			<DetectChar context="_ptrace_parentheses_block" attribute="Normal Text" char="("/>
		</context>
		<context name="_ptrace_parentheses_block" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Other Option" String="rule_ptrace_options"/>
			<IncludeRules context="_ptrace_rule_keywords"/>
			<IncludeRules context="_default_parentheses_block_rule"/>
		</context>
		<context name="_ptrace_rule_keywords" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Permissions" String="rule_ptrace_access"/>
			<keyword context="#stay" attribute="Permissions" String="base_accesses"/>
		</context>

		<!-- Signal Rule -->
		<context name="_rule_signal" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Option" String="rule_signal_options"/>
			<IncludeRules context="_signal_rule_keywords"/>
			<IncludeRules context="_default_rule_without_parentheses"/>
			<DetectChar context="_signal_parentheses_block" attribute="Normal Text" char="("/>
		</context>
		<context name="_signal_parentheses_block" attribute="Normal Text" lineEndContext="#stay">
			<IncludeRules context="_signal_rule_keywords"/>
			<keyword context="#stay" attribute="Other Option" String="rule_signal_options"/>
			<IncludeRules context="_default_parentheses_block_rule"/>
		</context>
		<context name="_signal_rule_keywords" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Flags" String="rule_signal"/>
			<keyword context="#stay" attribute="Permissions" String="rule_signal_access"/>
			<keyword context="#stay" attribute="Permissions" String="base_accesses"/>
			<RegExpr context="#stay" attribute="Flags" String="\brtmin\+0*(?:3[012]|[12]?\d)\b"/> <!-- rtmin+0 ... rtmin+32 -->
		</context>

		<!-- DBus Rule -->
		<context name="_rule_dbus" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Option" String="rule_dbus_options"/>
			<IncludeRules context="_dbus_rule_keywords"/>
			<IncludeRules context="_default_rule_without_parentheses"/>
			<DetectChar context="_dbus_parentheses_block" attribute="Normal Text" char="("/>
		</context>
		<context name="_dbus_parentheses_block" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Other Option" String="rule_dbus_peer"/>
			<IncludeRules context="_dbus_rule_keywords"/>
			<IncludeRules context="_default_parentheses_block_rule"/>
		</context>
		<context name="_dbus_rule_keywords" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Other Data" String="rule_dbus_bus"/>
			<keyword context="#stay" attribute="Permissions" String="rule_dbus_access"/>
			<keyword context="#stay" attribute="Permissions" String="base_accesses"/>
		</context>

		<!-- Unix Rule -->
		<context name="_rule_unix" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Option" String="rule_unix_options"/>
			<IncludeRules context="_unix_rule_keywords"/>
			<IncludeRules context="_default_rule_without_parentheses"/>
			<DetectChar context="_path_content" attribute="Path" char="@" lookAhead="true"/> <!-- Socket -->
			<DetectChar context="_unix_parentheses_block" attribute="Normal Text" char="("/>
		</context>
		<context name="_unix_parentheses_block" attribute="Normal Text" lineEndContext="#stay">
			<IncludeRules context="_unix_rule_keywords"/>
			<keyword context="#stay" attribute="Other Option" String="rule_unix_options"/>
			<IncludeRules context="_default_parentheses_block_rule"/>
			<DetectChar context="_parentheses_path_content" attribute="Path" char="@" lookAhead="true"/>
		</context>
		<context name="_unix_rule_keywords" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Permissions" String="rule_unix_access"/>
			<keyword context="#stay" attribute="Permissions" String="base_accesses"/>
			<keyword context="#stay" attribute="Data" String="rule_network"/>
		</context>

		<!-- Rlimit Rule -->
		<context name="_rule_set" attribute="Normal Text" lineEndContext="#stay" fallthrough="true" fallthroughContext="#pop">
			<keyword context="#pop!_rule_rlimit" attribute="Rule" String="rule_name_rlimit" beginRegion="Rule"/>
			<DetectSpaces context="#stay" attribute="Normal Text"/>
			<RegExpr context="_comment" attribute="Comment" String="#(?!include)" insensitive="true"/>
		</context>
		<context name="_rule_rlimit" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Data" String="rule_rlimit"/>
			<Detect2Chars context="#stay" attribute="Operator 2" char="&lt;" char1="="/>
			<RegExpr context="#stay" attribute="Number" String="\-(?:20|1?\d)\b"/>
			<RegExpr context="_number_unit" attribute="Number" String="\b\d+"/> <!-- Rules Int don't use '-' as a delimiter -->
			<WordDetect context="#stay" attribute="Number" String="infinity"/>
			<RegExpr context="#stay" attribute="Numerical Unit" String="\b(?:[KMG]B?|[shd]|us|ms|min|sec|(?:minute|day|hour|week|second)(?:s?)|(?:milli|micro)second(?:s?))\b"/>
			<IncludeRules context="_default_rule"/>
		</context>
		<context name="_number_unit" attribute="Normal Text" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
			<RegExpr context="#pop" attribute="Numerical Unit" String="(?:[KMG]B?|[shd]|us|ms|min|sec|(?:minute|day|hour|week|second)(?:s?)|(?:milli|micro)second(?:s?))\b"/>
		</context>

		<!-- Link Rule -->
		<context name="_rule_link" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Data" String="rule_link"/>
			<IncludeRules context="_default_rule"/>
		</context>

		<!-- Change Profile Rule -->
		<context name="_rule_changeprofile" attribute="Normal Text" lineEndContext="#stay">
			<Detect2Chars context="#pop!_profile_transition" attribute="Operator 2" char="-" char1="&gt;"/>
			<keyword context="#stay" attribute="Data" String="rule_changeprofile"/>
			<IncludeRules context="_default_rule"/>
		</context>

		<!-- File Rule -->
		<context name="_rule_file" attribute="Normal Text" lineEndContext="#stay">
			<Detect2Chars context="#pop!_profile_transition" attribute="Operator 2" char="-" char1="&gt;"/>
			<IncludeRules context="_default_rule_with_comments"/>
			<IncludeRules context="_permissions"/>
		</context>

		<!-- Profile Transition:
		     Highlight the profile name in File Rules (Execute Mode) and Change Profile Rules. -->
		<context name="_profile_transition" attribute="Transition Profile Name" lineEndContext="#stay" fallthrough="true" fallthroughContext="#pop">
			<DetectSpaces context="#stay" attribute="Normal Text"/>
			<!-- Not highlighting paths and paths quoted -->
			<RegExpr context="#pop!_default_rule_with_comments" attribute="Path" String="(?:[^\s/\[\\]|//|\\.|\[(?:[^\s\]\\]|\\.)*\])*/(?:$|[^/])" lookAhead="true"/>
			<RegExpr context="#pop!_default_rule_with_comments" attribute="Normal Text" String="&quot;(?:[^/&quot;\[\\]|//|\\.|\[(?:[^&quot;\]\\]|\\.)*\])*/(?:$|[^/])" lookAhead="true"/>

			<DetectChar context="#pop!_t_profile_name_quoted" attribute="Transition Profile Name" char="&quot;"/>
			<RegExpr context="#pop!_profile_transition_content" attribute="Normal Text" String="[^\s/]" lookAhead="true"/> <!-- First word -->
		</context>
		<context name="_profile_transition_content" attribute="Transition Profile Name" lineEndContext="#pop!_default_rule_with_comments">
			<RegExpr context="#pop!_default_rule_with_comments" attribute="Error" String="\(\S*(?=,(?:[&noPathChar;]|$))"/>
			<RegExpr context="#pop!_default_rule_with_comments" attribute="Normal Text" String="&endPath;" lookAhead="true"/> <!-- End rule -->
			<DetectSpaces context="#pop" attribute="Normal Text" lookAhead="true"/> <!-- End of the profile name -->

			<DetectChar context="#stay" attribute="Error" char="&quot;"/>
			<StringDetect context="#pop!_default_rule_with_comments" attribute="Error" String="#include" insensitive="true"/>
			<RegExpr context="#stay" String="//(?=&endPath;)"/>
			<IncludeRules context="_default_profile_transition"/>
		</context>
		<context name="_t_profile_name_quoted" attribute="Transition Profile Name" lineEndContext="#pop!_default_rule_with_comments">
			<DetectChar context="#pop!_default_rule_with_comments" attribute="Transition Profile Name" char="&quot;"/>
			<IncludeRules context="_default_profile_transition"/>
		</context>
		<context name="_default_profile_transition" attribute="Transition Profile Name" lineEndContext="#stay">
			<IncludeRules context="_variable_simple"/>
			<AnyChar context="#stay" attribute="Globbing Char in Tran. Prof." String="&globbChars;"/>
			<IncludeRules context="_profile_transition_escape"/>
			<RegExpr context="#stay" attribute="Hat Operator in Tran. Prof." String="//(?=[^&noPathChar;/])"/>
		</context>

		<!-- Change Hat / Child Profile (name//HAT).
		     NOTE: Old style (name^HAT) not included -->
		<context name="_hat_path" attribute="Path" lineEndContext="#pop">
			<RegExpr context="#pop" attribute="Path" String="/(?=/&endPath;)"/>
			<RegExpr context="#pop!_hat_path_content" attribute="SubProfile/Hat Operator" String="//(?=(?:[^\s&quot;/\\]|\\.)+(?:[\s&quot;]|$))"/>
			<DetectChar context="#pop" attribute="Path" char="/"/>
		</context>
		<context name="_hat_path_parentheses" attribute="Path" lineEndContext="#pop">
			<RegExpr context="#pop!_hat_path_parentheses_content" attribute="SubProfile/Hat Operator" String="//(?=(?:[^&noPathChar;/\\,]|\\.)+(?:[&noPathChar;,]|$))"/>
			<DetectChar context="#pop" attribute="Path" char="/"/>
		</context>
		<context name="_hat_path_quoted" attribute="Text Quoted" lineEndContext="#pop">
			<RegExpr context="#pop!_hat_path_quoted_content" attribute="SubProfile/Hat Operator" String="//(?=(?:[^&quot;/\\]|\\.)+&quot;)"/>
			<DetectChar context="#pop" attribute="Text Quoted" char="/"/>
		</context>

		<context name="_hat_path_content" attribute="SubProfile/Hat" lineEndContext="#pop">
			<RegExpr context="#pop" String="&endPath;" lookAhead="true"/> <!-- End Path -->
			<IncludeRules context="_default_path"/>
		</context>
		<context name="_hat_path_parentheses_content" attribute="SubProfile/Hat" lineEndContext="#pop">
			<DetectChar context="#pop" char="," lookAhead="true"/> <!-- End Path -->
			<IncludeRules context="_default_path"/>
		</context>
		<context name="_hat_path_quoted_content" attribute="SubProfile/Hat" lineEndContext="#pop">
			<DetectChar context="#pop" char="&quot;" lookAhead="true"/>
			<IncludeRules context="_default_quoted"/>
		</context>

		<!-- Parentheses Block: ( )
		     NOTE: Here special contexts are used for paths, strings and brackets. The "," character acts as a delimiter. -->
		<context name="_common_parentheses_block" attribute="Normal Text" lineEndContext="#stay">
			<DetectChar context="#pop" attribute="Normal Text" char=")"/>
			<!-- Highlight as path the text after the '=' operator, except keywords or simple words ([\w\-\+]+) -->
			<RegExpr context="#stay" attribute="Error" String="\=(?=\s*(?:$|[,\)]))"/>
			<RegExpr context="_parentheses_path_content" attribute="Operator 1" String="\=\s*(?=[^\s&quot;\(\),]*[^&noPathChar;\]\}\=\w\+\-\(,])"/>
			<DetectChar context="_parentheses_path_content" attribute="Path" char="/" lookAhead="true"/>
			<Detect2Chars context="_parentheses_variable" attribute="Variable" char="@" char1="{" lookAhead="true"/>

			<IncludeRules context="_common"/>
			<DetectChar context="_round_brackets" attribute="Globbing Brackets" char="("/>
			<DetectChar context="_p_curly_brackets" attribute="Globbing Brackets" char="{"/>
			<DetectChar context="_p_square_brackets" attribute="Globbing Brackets" char="["/>
			<IncludeRules context="_comment_not_allowed"/>
		</context>
		<context name="_parentheses_block_profile" attribute="Normal Text" lineEndContext="#stay">
			<keyword context="#stay" attribute="Flags" String="profile_flags"/>
			<!-- Used by xattrs -->
			<RegExpr context="#stay" attribute="Other Option" String="\b[a-zA-Z](?:\.?[\w\-])*(?=\s*\=)"/>
			<IncludeRules context="_common_parentheses_block"/>
			<IncludeRules context="_end_rule_irnc"/>
		</context>
		<!-- Parentheses Block within Rules -->
		<context name="_default_parentheses_block_rule" attribute="Normal Text" lineEndContext="#stay">
			<IncludeRules context="_common_parentheses_block"/>
			<IncludeRules context="_end_rule_irnc_parentheses_rule"/>
		</context>

		<!-- Finding the end of a rule -->
		<context name="_end_rule" attribute="Normal Text" lineEndContext="#stay">
			<RegExpr context="#stay" attribute="Normal Text" String=",(?=\)|[\w\-]+[^\s\w\-,#\(&quot;])"/> <!-- Fix possible incorrect rule closures -->
			<DetectChar  context="#pop" attribute="End of Rule Char" char="," endRegion="Rule"/>
			<IncludeRules context="_end_rule_irnc"/>
		</context>
		<!-- Rule/Profile on new line, in rule not closed -->
		<context name="_end_rule_irnc" attribute="Normal Text" lineEndContext="#stay">
			<keyword String="profile_head" context="#pop!_profile_name" attribute="Profile Head Error"      firstNonSpace="true" endRegion="Rule"/>
			<keyword String="rule_access_qualifiers" context="#pop" attribute="Rule Access Qualifier Error" firstNonSpace="true" endRegion="Rule"/>
			<keyword String="rule_qualifiers"        context="#pop" attribute="Rule Qualifier Error"        firstNonSpace="true" endRegion="Rule"/>
			<keyword String="file_rule_qualifiers"   context="#pop" attribute="File Rule Qualifier Error"   firstNonSpace="true" endRegion="Rule"/>
			<RegExpr String="set(?=\s+rlimit\b)"     context="#pop" attribute="Rule Error"                  firstNonSpace="true" endRegion="Rule"/>

			<keyword String="rule_name_abi"           context="#pop!_rule_abi"           attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<keyword String="rule_name_file"          context="#pop!_rule_file"          attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<keyword String="rule_name_capability"    context="#pop!_rule_capability"    attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<keyword String="rule_name_network"       context="#pop!_rule_network"       attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<keyword String="rule_name_pivotroot"     context="#pop!_rule_pivotroot"     attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<keyword String="rule_name_ptrace"        context="#pop!_rule_ptrace"        attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<keyword String="rule_name_signal"        context="#pop!_rule_signal"        attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<keyword String="rule_name_dbus"          context="#pop!_rule_dbus"          attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<keyword String="rule_name_link"          context="#pop!_rule_link"          attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<keyword String="rule_name_changeprofile" context="#pop!_rule_changeprofile" attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<keyword String="rule_name_rlimit"        context="#pop!_rule_rlimit"        attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<!-- This must be at the end of each rule context, to avoid replacing the 'unix' & 'remount' keywords
			     ('unix' is also a domain of the network rule; 'remount' is also a flag of the mount rule). -->
			<keyword String="rule_name_mount" context="#pop!_rule_mount" attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<keyword String="rule_name_unix"  context="#pop!_rule_unix"  attribute="Rule Error" firstNonSpace="true" endRegion="Rule" beginRegion="Rule"/>
			<!-- Not included: alias rule -->
		</context>
		<!-- For blocks of parentheses within rules (the same keywords as "_end_rule_irnc"!) -->
		<context name="_end_rule_irnc_parentheses_rule" attribute="Normal Text" lineEndContext="#stay">
			<keyword String="profile_head"            context="#pop" attribute="Profile Head Error"          lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_access_qualifiers"  context="#pop" attribute="Rule Access Qualifier Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_qualifiers"         context="#pop" attribute="Rule Qualifier Error"        lookAhead="true" firstNonSpace="true"/>
			<keyword String="file_rule_qualifiers"    context="#pop" attribute="File Rule Qualifier Error"   lookAhead="true" firstNonSpace="true"/>
			<RegExpr String="set(?=\s+rlimit\b)"      context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_name_abi"           context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_name_file"          context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_name_capability"    context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_name_network"       context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_name_pivotroot"     context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_name_ptrace"        context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_name_signal"        context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_name_dbus"          context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_name_link"          context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_name_changeprofile" context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_name_rlimit"        context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<!-- Keep at the end to avoid conflicts! -->
			<keyword String="rule_name_mount" context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<keyword String="rule_name_unix"  context="#pop" attribute="Rule Error" lookAhead="true" firstNonSpace="true"/>
			<!-- Not included: alias rule -->
		</context>

		<!-- Paths & File Globals -->

		<context name="_find_path" attribute="Normal Text" lineEndContext="#stay">
			<DetectChar context="_path_content" attribute="Path" char="/" lookAhead="true"/>
			<RegExpr context="_path_content" String=":(?:[^\:&noPathChar;\(\\]|\\.)+:" lookAhead="true"/> <!-- :namespace: -->
		</context>
		<context name="_path_content" attribute="Path" lineEndContext="#pop">
			<RegExpr context="#pop" String="&endPath;" lookAhead="true"/>
			<IncludeRules context="_default_path"/>
			<Detect2Chars context="_hat_path" char="/" char1="/" lookAhead="true"/>
		</context>
		<context name="_parentheses_path_content" attribute="Path" lineEndContext="#pop">
			<DetectChar context="#pop" char="," lookAhead="true"/>
			<IncludeRules context="_default_path"/>
			<Detect2Chars context="_hat_path_parentheses" char="/" char1="/" lookAhead="true"/>
		</context>
		<context name="_default_path" attribute="Path" lineEndContext="#pop">
			<DetectSpaces context="#pop" lookAhead="true"/>
			<AnyChar context="#pop" String="&noPathCharWithoutSpace;" lookAhead="true"/>
			<IncludeRules context="_variable_simple"/>
			<IncludeRules context="_path_globbing"/>
		</context>

		<!-- Globbing -->
		<context name="_path_globbing" attribute="Normal Text" lineEndContext="#stay">
			<IncludeRules context="_brackets_error"/>
			<DetectChar context="_curly_brackets" attribute="Globbing Brackets" char="{"/>
			<DetectChar context="_square_brackets" attribute="Globbing Brackets" char="["/>
			<DetectChar context="_round_brackets" attribute="Globbing Brackets" char="("/>
			<IncludeRules context="_path_globbing_chars"/>
		</context>
		<context name="_path_globbing_chars" attribute="Normal Text" lineEndContext="#stay">
			<AnyChar context="#stay" attribute="Globbing Char" String="&globbChars;"/>
			<IncludeRules context="_escape"/>
		</context>
		<!-- Escapes: Hexadecimal (\xNN), decimal (\dNNN) & octal (\NNN). Also make literal any character.
		     NOTE: Reserved character escape sequences: \\&quot;aefnrt0 -->
		<context name="_escape" attribute="Normal Text" lineEndContext="#stay">
			<RegExpr context="#stay" attribute="Escape Char" String="\\(?:x[a-fA-F\d]{1,2}|d\d{1,3}|[0-3][0-7]{0,2}|[4-7][0-7]?|.)"/>
		</context>
		<context name="_profile_transition_escape" attribute="Transition Profile Name" lineEndContext="#stay">
			<RegExpr context="#stay" attribute="Globbing Char in Tran. Prof." String="\\(?:x[a-fA-F\d]{1,2}|d\d{1,3}|[0-3][0-7]{0,2}|[4-7][0-7]?|.)"/>
		</context>

		<!-- Groups of brackets: { }, [ ] and ( ) -->
		<context name="_curly_brackets" attribute="Globbing Brackets" lineEndContext="#pop">
			<DetectChar context="#pop" attribute="Globbing Brackets" char="}"/>
			<RegExpr context="#stay" attribute="Open Globbing Brackets" String="[^&noPathChar;\(\[\{\}\\](?=[&noPathChar;]|$)"/>
			<IncludeRules context="_default_path"/>
			<IncludeRules context="_default_curly_brackets"/>
		</context>
		<context name="_square_brackets" attribute="Globbing Brackets" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop!_square_brackets_content">
			<RegExpr context="#pop!_square_brackets_content" attribute="Globbing Char of Brackets" String="\^(?=[^\s\]&quot;])"/>
		</context>
		<context name="_square_brackets_content" attribute="Globbing Brackets" lineEndContext="#pop">
			<DetectChar context="#pop" attribute="Globbing Brackets" char="]"/>
			<DetectSpaces context="#pop" lookAhead="true"/>
			<DetectChar context="#pop" char="&quot;" lookAhead="true"/> <!-- &noPathChar; -->
			<RegExpr context="#stay" attribute="Open Globbing Brackets" String="[^\s\[\]\\](?=[&quot;\s]|$)"/> <!-- &noPathChar; -->
			<IncludeRules context="_default_square_brackets"/>
		</context>
		<context name="_round_brackets" attribute="Globbing Brackets" lineEndContext="#pop">
			<DetectChar context="#pop" attribute="Globbing Brackets" char=")"/>
			<RegExpr context="#stay" attribute="Open Globbing Brackets" String="[^&noPathChar;\(\[\{\\](?=[&quot;\s]|$)"/> <!-- &noPathChar; -->
			<IncludeRules context="_default_path"/>
			<IncludeRules context="_default_round_brackets"/>
		</context>

		<!-- Brackets quoted (allow spaces and line breaks) -->
		<context name="_curly_brackets_quoted" attribute="Globbing Brackets" lineEndContext="#stay">
			<DetectChar context="#pop" attribute="Globbing Brackets" char="}"/>
			<DetectChar context="#pop" char="&quot;" lookAhead="true"/>
			<RegExpr context="#stay" attribute="Open Globbing Brackets" String="[^\s&quot;\(\[\{\}\\](?=\s*&quot;)"/>
			<IncludeRules context="_default_quoted"/>
			<IncludeRules context="_default_curly_brackets"/>
		</context>
		<context name="_square_brackets_quoted" attribute="Globbing Brackets" lineEndContext="#pop!_square_brackets_content_quoted" fallthrough="true" fallthroughContext="#pop!_square_brackets_content_quoted">
			<RegExpr context="#pop!_square_brackets_content_quoted" attribute="Globbing Char of Brackets" String="\^(?=[^\]&quot;])"/>
		</context>
		<context name="_square_brackets_content_quoted" attribute="Globbing Brackets" lineEndContext="#stay">
			<DetectChar context="#pop" attribute="Globbing Brackets" char="]"/>
			<DetectChar context="#pop" char="&quot;" lookAhead="true"/>
			<RegExpr context="#stay" attribute="Open Globbing Brackets" String="[^\s&quot;\[\]\\](?=\s*&quot;)"/>
			<IncludeRules context="_default_square_brackets"/>
		</context>
		<context name="_round_brackets_quoted" attribute="Globbing Brackets" lineEndContext="#stay">
			<DetectChar context="#pop" attribute="Globbing Brackets" char=")"/>
			<DetectChar context="#pop" char="&quot;" lookAhead="true"/>
			<RegExpr context="#stay" attribute="Open Globbing Brackets" String="[^\s&quot;\[\{\(\)\\](?=\s*&quot;)"/>
			<IncludeRules context="_default_quoted"/>
			<IncludeRules context="_default_round_brackets"/>
		</context>

		<context name="_default_curly_brackets" attribute="Globbing Brackets" lineEndContext="#stay">
			<DetectChar context="#stay" attribute="Globbing Char of Brackets" char=","/>
			<keyword context="#stay" String="default_variables"/>
		</context>
		<context name="_default_round_brackets" attribute="Globbing Brackets" lineEndContext="#stay">
			<DetectChar context="#stay" attribute="Globbing Char of Brackets" char="|"/>
		</context>
		<context name="_default_square_brackets" attribute="Globbing Brackets" lineEndContext="#stay">
			<IncludeRules context="_variable_simple"/>
			<DetectChar context="#stay" attribute="Error" char="["/>
			<IncludeRules context="_path_globbing_chars"/>
		</context>
		<context name="_brackets_error" attribute="Normal Text" lineEndContext="#stay">
			<Detect2Chars context="#stay" attribute="Error" char="[" char1="]"/>
			<Detect2Chars context="#stay" attribute="Error" char="{" char1="}"/>
			<Detect2Chars context="#stay" attribute="Error" char="(" char1=")"/>
		</context>

		<!-- If the brackets are outside a path -->
		<context name="_r_curly_brackets" attribute="Globbing Brackets" lineEndContext="#pop">
			<DetectChar context="#pop!_find_path_after_variable" attribute="Globbing Brackets" char="}"/>
			<IncludeRules context="_curly_brackets"/>
		</context>
		<context name="_r_square_brackets" attribute="Globbing Brackets" lineEndContext="#pop">
			<DetectChar context="#pop!_find_path_after_variable" attribute="Globbing Brackets" char="]"/>
			<IncludeRules context="_square_brackets"/>
		</context>
		<!-- In block of parentheses... -->
		<context name="_p_curly_brackets" attribute="Globbing Brackets" lineEndContext="#pop">
			<DetectChar context="#pop!_parentheses_find_path_after_variable" attribute="Globbing Brackets" char="}"/>
			<IncludeRules context="_curly_brackets"/>
		</context>
		<context name="_p_square_brackets" attribute="Globbing Brackets" lineEndContext="#pop">
			<DetectChar context="#pop!_parentheses_find_path_after_variable" attribute="Globbing Brackets" char="]"/>
			<IncludeRules context="_square_brackets"/>
		</context>

		<!-- Path Quoted -->
		<context name="_find_text_quoted" attribute="Normal Text" lineEndContext="#stay">
			<DetectChar context="_quoted" attribute="Text Quoted" char="&quot;"/>
		</context>
		<context name="_quoted" attribute="Text Quoted" lineEndContext="#stay">
			<DetectChar context="#pop" attribute="Text Quoted" char="&quot;"/>
			<IncludeRules context="_default_quoted"/>
			<Detect2Chars context="_hat_path_quoted" char="/" char1="/" lookAhead="true"/>
		</context>
		<context name="_default_quoted" attribute="Text Quoted" lineEndContext="#stay">
			<IncludeRules context="_variable_simple"/>
			<IncludeRules context="_brackets_error"/>
			<DetectChar context="_curly_brackets_quoted" attribute="Globbing Brackets" char="{"/>
			<DetectChar context="_square_brackets_quoted" attribute="Globbing Brackets" char="["/>
			<DetectChar context="_round_brackets_quoted" attribute="Globbing Brackets" char="("/>
			<IncludeRules context="_path_globbing_chars"/>
		</context>

	</contexts>

	<itemDatas>
		<itemData name="Normal Text"    defStyleNum="dsNormal"       spellChecking="false"/>
		<itemData name="Path"           defStyleNum="dsNormal"       spellChecking="false"/>
		<itemData name="Text Quoted"    defStyleNum="dsString"       spellChecking="false"/>
		<itemData name="Comment"        defStyleNum="dsComment"/>
		<itemData name="URL in Comment" defStyleNum="dsComment"      underline="1" spellChecking="false"/>
		<itemData name="Preprocessor"   defStyleNum="dsPreprocessor" spellChecking="false"/>
		<itemData name="Prep. Lib"      defStyleNum="dsImport"       underline="0" spellChecking="false"/>
		<itemData name="Open Prep. Lib" defStyleNum="dsImport"       underline="1" spellChecking="false"/>
		<itemData name="Variable"       defStyleNum="dsBaseN"        bold="0" spellChecking="false"/>

		<itemData name="Profile Head"     defStyleNum="dsFunction"  bold="1" underline="0" spellChecking="false"/>
		<itemData name="Profile Name"     defStyleNum="dsFunction"  bold="0" underline="0" spellChecking="false"/>
		<itemData name="Rule Qualifier"   defStyleNum="dsKeyword"   bold="1" underline="0" spellChecking="false"/>
		<itemData name="Rule Access Qualifier" defStyleNum="dsWarning"  bold="1" underline="0" italic="0" spellChecking="false"/>
		<itemData name="File Rule Qualifier"   defStyleNum="dsVariable" bold="1" underline="0" italic="0" spellChecking="false"/>
		<itemData name="Rule"             defStyleNum="dsVariable"  bold="1" underline="0" italic="0" spellChecking="false"/>
		<itemData name="Data"             defStyleNum="dsVariable"  bold="0" underline="0" italic="0" spellChecking="false"/>
		<itemData name="Other Data"       defStyleNum="dsNormal"    italic="1" spellChecking="false"/>
		<itemData name="Permissions"      defStyleNum="dsNormal"    bold="1"   spellChecking="false"/>

		<itemData name="Option"                  defStyleNum="dsOthers"         spellChecking="false"/>
		<itemData name="Other Option"            defStyleNum="dsAttribute"      spellChecking="false"/>
		<itemData name="Flags"                   defStyleNum="dsVerbatimString" spellChecking="false"/>
		<itemData name="SubProfile/Hat"          defStyleNum="dsAnnotation"     bold="0" underline="0" italic="0" spellChecking="false"/>
		<itemData name="SubProfile/Hat Operator" defStyleNum="dsAnnotation"     bold="1" underline="0" italic="0" spellChecking="false"/>
		<itemData name="Operator 1"              defStyleNum="dsOperator"       spellChecking="false"/>
		<itemData name="Operator 2"              defStyleNum="dsWarning"        bold="1" underline="0" italic="0" spellChecking="false"/>
		<itemData name="Number"                  defStyleNum="dsDecVal"         spellChecking="false"/>
		<itemData name="Numerical Unit"          defStyleNum="dsDecVal"         bold="1" spellChecking="false"/>
		<itemData name="End of Rule Char"        defStyleNum="dsNormal"         spellChecking="false"/>

		<itemData name="Escape Char"               defStyleNum="dsSpecialChar"    spellChecking="false"/>
		<itemData name="Globbing Char"             defStyleNum="dsSpecialChar"    spellChecking="false"/>
		<itemData name="Globbing Char of Brackets" defStyleNum="dsBuiltIn"        bold="0" underline="0" italic="0" spellChecking="false"/>
		<itemData name="Globbing Brackets"         defStyleNum="dsVerbatimString" underline="0" spellChecking="false"/>
		<itemData name="Open Globbing Brackets"    defStyleNum="dsVerbatimString" underline="1" spellChecking="false"/>

		<itemData name="Transition Profile Name"      defStyleNum="dsFunction"    bold="0" italic="1" underline="0" spellChecking="false"/>
		<itemData name="Globbing Char in Tran. Prof." defStyleNum="dsSpecialChar" bold="0" italic="1" underline="0" spellChecking="false"/>
		<itemData name="Hat Operator in Tran. Prof."  defStyleNum="dsAnnotation"  bold="1" italic="1" underline="0" spellChecking="false"/>

		<itemData name="Rule Error"                  defStyleNum="dsVariable" bold="1" underline="1" italic="0" spellChecking="false"/>
		<itemData name="Rule Qualifier Error"        defStyleNum="dsKeyword"  bold="1" underline="1" spellChecking="false"/>
		<itemData name="Rule Access Qualifier Error" defStyleNum="dsWarning"  bold="1" underline="1" italic="0" spellChecking="false"/>
		<itemData name="File Rule Qualifier Error"   defStyleNum="dsVariable" bold="1" underline="1" italic="0" spellChecking="false"/>
		<itemData name="Profile Head Error"          defStyleNum="dsFunction" bold="1" underline="1" spellChecking="false"/>
		<itemData name="Profile Name Error"          defStyleNum="dsFunction" bold="0" underline="1" spellChecking="false"/>
		<itemData name="Error"                       defStyleNum="dsError"    spellChecking="false"/>
	</itemDatas>

</highlighting>

<general>
	<!-- Keyword delimiters: .()<>=/\[]{},"'^;:| -->
	<keywords casesensitive="true" additionalDeliminator="&quot;&apos;" weakDeliminator="!+-%*?~&amp;"/>

	<comments>
		<comment name="singleLine" start="#"/>
	</comments>
</general>

</language>
<!-- kate: replace-tabs off; tab-width 3; indent-width 3; remove-trailing-spaces mod; dynamic-word-wrap off; -->
