<?xml version="1.0"?>
<grammar xmlns="http://xmlns.bjoern.hoehrmann.de/xlx/0.1/">
  <define name="IRI">
    <group>
      <ref name="scheme"/>
      <value type="ascii-insensitive-string">:</value>
      <ref name="ihier-part"/>
      <repetition min="0" max="1">
        <group>
          <value type="ascii-insensitive-string">?</value>
          <ref name="iquery"/>
        </group>
      </repetition>
      <repetition min="0" max="1">
        <group>
          <value type="ascii-insensitive-string">#</value>
          <ref name="ifragment"/>
        </group>
      </repetition>
    </group>
  </define>
  <define name="ihier-part">
    <choice>
      <group>
        <value type="ascii-insensitive-string">//</value>
        <ref name="iauthority"/>
        <ref name="ipath-abempty"/>
      </group>
      <ref name="ipath-absolute"/>
      <ref name="ipath-rootless"/>
      <ref name="ipath-empty"/>
    </choice>
  </define>
  <define name="IRI-reference">
    <choice>
      <ref name="IRI"/>
      <ref name="irelative-ref"/>
    </choice>
  </define>
  <define name="absolute-IRI">
    <group>
      <ref name="scheme"/>
      <value type="ascii-insensitive-string">:</value>
      <ref name="ihier-part"/>
      <repetition min="0" max="1">
        <group>
          <value type="ascii-insensitive-string">?</value>
          <ref name="iquery"/>
        </group>
      </repetition>
    </group>
  </define>
  <define name="irelative-ref">
    <group>
      <ref name="irelative-part"/>
      <repetition min="0" max="1">
        <group>
          <value type="ascii-insensitive-string">?</value>
          <ref name="iquery"/>
        </group>
      </repetition>
      <repetition min="0" max="1">
        <group>
          <value type="ascii-insensitive-string">#</value>
          <ref name="ifragment"/>
        </group>
      </repetition>
    </group>
  </define>
  <define name="irelative-part">
    <choice>
      <group>
        <value type="ascii-insensitive-string">//</value>
        <ref name="iauthority"/>
        <ref name="ipath-abempty"/>
      </group>
      <ref name="ipath-absolute"/>
      <ref name="ipath-noscheme"/>
      <ref name="ipath-empty"/>
    </choice>
  </define>
  <define name="iauthority">
    <group>
      <repetition min="0" max="1">
        <group>
          <ref name="iuserinfo"/>
          <value type="ascii-insensitive-string">@</value>
        </group>
      </repetition>
      <ref name="ihost"/>
      <repetition min="0" max="1">
        <group>
          <value type="ascii-insensitive-string">:</value>
          <ref name="port"/>
        </group>
      </repetition>
    </group>
  </define>
  <define name="iuserinfo">
    <repetition min="0" max="unbounded">
      <choice>
        <ref name="iunreserved"/>
        <ref name="pct-encoded"/>
        <ref name="sub-delims"/>
        <value type="ascii-insensitive-string">:</value>
      </choice>
    </repetition>
  </define>
  <define name="ihost">
    <choice>
      <ref name="IP-literal"/>
      <ref name="IPv4address"/>
      <ref name="ireg-name"/>
    </choice>
  </define>
  <define name="ireg-name">
    <repetition min="0" max="unbounded">
      <choice>
        <ref name="iunreserved"/>
        <ref name="pct-encoded"/>
        <ref name="sub-delims"/>
      </choice>
    </repetition>
  </define>
  <define name="ipath">
    <choice>
      <ref name="ipath-abempty"/>
      <ref name="ipath-absolute"/>
      <ref name="ipath-noscheme"/>
      <ref name="ipath-rootless"/>
      <ref name="ipath-empty"/>
    </choice>
  </define>
  <define name="ipath-abempty">
    <repetition min="0" max="unbounded">
      <group>
        <value type="ascii-insensitive-string">/</value>
        <ref name="isegment"/>
      </group>
    </repetition>
  </define>
  <define name="ipath-absolute">
    <group>
      <value type="ascii-insensitive-string">/</value>
      <repetition min="0" max="1">
        <group>
          <ref name="isegment-nz"/>
          <repetition min="0" max="unbounded">
            <group>
              <value type="ascii-insensitive-string">/</value>
              <ref name="isegment"/>
            </group>
          </repetition>
        </group>
      </repetition>
    </group>
  </define>
  <define name="ipath-noscheme">
    <group>
      <ref name="isegment-nz-nc"/>
      <repetition min="0" max="unbounded">
        <group>
          <value type="ascii-insensitive-string">/</value>
          <ref name="isegment"/>
        </group>
      </repetition>
    </group>
  </define>
  <define name="ipath-rootless">
    <group>
      <ref name="isegment-nz"/>
      <repetition min="0" max="unbounded">
        <group>
          <value type="ascii-insensitive-string">/</value>
          <ref name="isegment"/>
        </group>
      </repetition>
    </group>
  </define>
  <define name="ipath-empty">
    <repetition min="0" max="0"/>
  </define>
  <define name="isegment">
    <repetition min="0" max="unbounded">
      <ref name="ipchar"/>
    </repetition>
  </define>
  <define name="isegment-nz">
    <repetition min="1" max="unbounded">
      <ref name="ipchar"/>
    </repetition>
  </define>
  <define name="isegment-nz-nc">
    <repetition min="1" max="unbounded">
      <choice>
        <ref name="iunreserved"/>
        <ref name="pct-encoded"/>
        <ref name="sub-delims"/>
        <value type="ascii-insensitive-string">@</value>
      </choice>
    </repetition>
  </define>
  <define name="ipchar">
    <choice>
      <ref name="iunreserved"/>
      <ref name="pct-encoded"/>
      <ref name="sub-delims"/>
      <value type="ascii-insensitive-string">:</value>
      <value type="ascii-insensitive-string">@</value>
    </choice>
  </define>
  <define name="iquery">
    <repetition min="0" max="unbounded">
      <choice>
        <ref name="ipchar"/>
        <ref name="iprivate"/>
        <value type="ascii-insensitive-string">/</value>
        <value type="ascii-insensitive-string">?</value>
      </choice>
    </repetition>
  </define>
  <define name="ifragment">
    <repetition min="0" max="unbounded">
      <choice>
        <ref name="ipchar"/>
        <value type="ascii-insensitive-string">/</value>
        <value type="ascii-insensitive-string">?</value>
      </choice>
    </repetition>
  </define>
  <define name="iunreserved">
    <choice>
      <ref name="ALPHA"/>
      <ref name="DIGIT"/>
      <value type="ascii-insensitive-string">-</value>
      <value type="ascii-insensitive-string">.</value>
      <value type="ascii-insensitive-string">_</value>
      <value type="ascii-insensitive-string">~</value>
      <ref name="ucschar"/>
    </choice>
  </define>
  <define name="ucschar">
    <choice>
      <data type="class">
        <param name="range">#00a0-d7ff</param>
      </data>
      <data type="class">
        <param name="range">#f900-fdcf</param>
      </data>
      <data type="class">
        <param name="range">#fdf0-ffef</param>
      </data>
      <data type="class">
        <param name="range">#10000-1fffd</param>
      </data>
      <data type="class">
        <param name="range">#20000-2fffd</param>
      </data>
      <data type="class">
        <param name="range">#30000-3fffd</param>
      </data>
      <data type="class">
        <param name="range">#40000-4fffd</param>
      </data>
      <data type="class">
        <param name="range">#50000-5fffd</param>
      </data>
      <data type="class">
        <param name="range">#60000-6fffd</param>
      </data>
      <data type="class">
        <param name="range">#70000-7fffd</param>
      </data>
      <data type="class">
        <param name="range">#80000-8fffd</param>
      </data>
      <data type="class">
        <param name="range">#90000-9fffd</param>
      </data>
      <data type="class">
        <param name="range">#a0000-afffd</param>
      </data>
      <data type="class">
        <param name="range">#b0000-bfffd</param>
      </data>
      <data type="class">
        <param name="range">#c0000-cfffd</param>
      </data>
      <data type="class">
        <param name="range">#d0000-dfffd</param>
      </data>
      <data type="class">
        <param name="range">#e1000-efffd</param>
      </data>
    </choice>
  </define>
  <define name="iprivate">
    <choice>
      <data type="class">
        <param name="range">#e000-f8ff</param>
      </data>
      <data type="class">
        <param name="range">#f0000-ffffd</param>
      </data>
      <data type="class">
        <param name="range">#100000-10fffd</param>
      </data>
    </choice>
  </define>
  <define name="scheme">
    <group>
      <ref name="ALPHA"/>
      <repetition min="0" max="unbounded">
        <choice>
          <ref name="ALPHA"/>
          <ref name="DIGIT"/>
          <value type="ascii-insensitive-string">+</value>
          <value type="ascii-insensitive-string">-</value>
          <value type="ascii-insensitive-string">.</value>
        </choice>
      </repetition>
    </group>
  </define>
  <define name="port">
    <repetition min="0" max="unbounded">
      <ref name="DIGIT"/>
    </repetition>
  </define>
  <define name="IP-literal">
    <group>
      <value type="ascii-insensitive-string">[</value>
      <choice>
        <ref name="IPv6address"/>
        <ref name="IPvFuture"/>
      </choice>
      <value type="ascii-insensitive-string">]</value>
    </group>
  </define>
  <define name="IPvFuture">
    <group>
      <value type="ascii-insensitive-string">v</value>
      <repetition min="1" max="unbounded">
        <ref name="HEXDIG"/>
      </repetition>
      <value type="ascii-insensitive-string">.</value>
      <repetition min="1" max="unbounded">
        <choice>
          <ref name="unreserved"/>
          <ref name="sub-delims"/>
          <value type="ascii-insensitive-string">:</value>
        </choice>
      </repetition>
    </group>
  </define>
  <define name="IPv6address">
    <choice>
      <group>
        <repetition min="6" max="6">
          <group>
            <ref name="h16"/>
            <value type="ascii-insensitive-string">:</value>
          </group>
        </repetition>
        <ref name="ls32"/>
      </group>
      <group>
        <value type="ascii-insensitive-string">::</value>
        <repetition min="5" max="5">
          <group>
            <ref name="h16"/>
            <value type="ascii-insensitive-string">:</value>
          </group>
        </repetition>
        <ref name="ls32"/>
      </group>
      <group>
        <repetition min="0" max="1">
          <ref name="h16"/>
        </repetition>
        <value type="ascii-insensitive-string">::</value>
        <repetition min="4" max="4">
          <group>
            <ref name="h16"/>
            <value type="ascii-insensitive-string">:</value>
          </group>
        </repetition>
        <ref name="ls32"/>
      </group>
      <group>
        <repetition min="0" max="1">
          <group>
            <repetition min="0" max="1">
              <group>
                <ref name="h16"/>
                <value type="ascii-insensitive-string">:</value>
              </group>
            </repetition>
            <ref name="h16"/>
          </group>
        </repetition>
        <value type="ascii-insensitive-string">::</value>
        <repetition min="3" max="3">
          <group>
            <ref name="h16"/>
            <value type="ascii-insensitive-string">:</value>
          </group>
        </repetition>
        <ref name="ls32"/>
      </group>
      <group>
        <repetition min="0" max="1">
          <group>
            <repetition min="0" max="2">
              <group>
                <ref name="h16"/>
                <value type="ascii-insensitive-string">:</value>
              </group>
            </repetition>
            <ref name="h16"/>
          </group>
        </repetition>
        <value type="ascii-insensitive-string">::</value>
        <repetition min="2" max="2">
          <group>
            <ref name="h16"/>
            <value type="ascii-insensitive-string">:</value>
          </group>
        </repetition>
        <ref name="ls32"/>
      </group>
      <group>
        <repetition min="0" max="1">
          <group>
            <repetition min="0" max="3">
              <group>
                <ref name="h16"/>
                <value type="ascii-insensitive-string">:</value>
              </group>
            </repetition>
            <ref name="h16"/>
          </group>
        </repetition>
        <value type="ascii-insensitive-string">::</value>
        <ref name="h16"/>
        <value type="ascii-insensitive-string">:</value>
        <ref name="ls32"/>
      </group>
      <group>
        <repetition min="0" max="1">
          <group>
            <repetition min="0" max="4">
              <group>
                <ref name="h16"/>
                <value type="ascii-insensitive-string">:</value>
              </group>
            </repetition>
            <ref name="h16"/>
          </group>
        </repetition>
        <value type="ascii-insensitive-string">::</value>
        <ref name="ls32"/>
      </group>
      <group>
        <repetition min="0" max="1">
          <group>
            <repetition min="0" max="5">
              <group>
                <ref name="h16"/>
                <value type="ascii-insensitive-string">:</value>
              </group>
            </repetition>
            <ref name="h16"/>
          </group>
        </repetition>
        <value type="ascii-insensitive-string">::</value>
        <ref name="h16"/>
      </group>
      <group>
        <repetition min="0" max="1">
          <group>
            <repetition min="0" max="6">
              <group>
                <ref name="h16"/>
                <value type="ascii-insensitive-string">:</value>
              </group>
            </repetition>
            <ref name="h16"/>
          </group>
        </repetition>
        <value type="ascii-insensitive-string">::</value>
      </group>
    </choice>
  </define>
  <define name="h16">
    <repetition min="1" max="4">
      <ref name="HEXDIG"/>
    </repetition>
  </define>
  <define name="ls32">
    <choice>
      <group>
        <ref name="h16"/>
        <value type="ascii-insensitive-string">:</value>
        <ref name="h16"/>
      </group>
      <ref name="IPv4address"/>
    </choice>
  </define>
  <define name="IPv4address">
    <group>
      <ref name="dec-octet"/>
      <value type="ascii-insensitive-string">.</value>
      <ref name="dec-octet"/>
      <value type="ascii-insensitive-string">.</value>
      <ref name="dec-octet"/>
      <value type="ascii-insensitive-string">.</value>
      <ref name="dec-octet"/>
    </group>
  </define>
  <define name="dec-octet">
    <choice>
      <ref name="DIGIT"/>
      <group>
        <data type="class">
          <param name="range">#0031-0039</param>
        </data>
        <ref name="DIGIT"/>
      </group>
      <group>
        <value type="ascii-insensitive-string">1</value>
        <repetition min="2" max="2">
          <ref name="DIGIT"/>
        </repetition>
      </group>
      <group>
        <value type="ascii-insensitive-string">2</value>
        <data type="class">
          <param name="range">#0030-0034</param>
        </data>
        <ref name="DIGIT"/>
      </group>
      <group>
        <value type="ascii-insensitive-string">25</value>
        <data type="class">
          <param name="range">#0030-0035</param>
        </data>
      </group>
    </choice>
  </define>
  <define name="pct-encoded">
    <group>
      <value type="ascii-insensitive-string">%</value>
      <ref name="HEXDIG"/>
      <ref name="HEXDIG"/>
    </group>
  </define>
  <define name="unreserved">
    <choice>
      <ref name="ALPHA"/>
      <ref name="DIGIT"/>
      <value type="ascii-insensitive-string">-</value>
      <value type="ascii-insensitive-string">.</value>
      <value type="ascii-insensitive-string">_</value>
      <value type="ascii-insensitive-string">~</value>
    </choice>
  </define>
  <define name="reserved">
    <choice>
      <ref name="gen-delims"/>
      <ref name="sub-delims"/>
    </choice>
  </define>
  <define name="gen-delims">
    <choice>
      <value type="ascii-insensitive-string">:</value>
      <value type="ascii-insensitive-string">/</value>
      <value type="ascii-insensitive-string">?</value>
      <value type="ascii-insensitive-string">#</value>
      <value type="ascii-insensitive-string">[</value>
      <value type="ascii-insensitive-string">]</value>
      <value type="ascii-insensitive-string">@</value>
    </choice>
  </define>
  <define name="sub-delims">
    <choice>
      <value type="ascii-insensitive-string">!</value>
      <value type="ascii-insensitive-string">$</value>
      <value type="ascii-insensitive-string">&amp;</value>
      <value type="ascii-insensitive-string">'</value>
      <value type="ascii-insensitive-string">(</value>
      <value type="ascii-insensitive-string">)</value>
      <value type="ascii-insensitive-string">*</value>
      <value type="ascii-insensitive-string">+</value>
      <value type="ascii-insensitive-string">,</value>
      <value type="ascii-insensitive-string">;</value>
      <value type="ascii-insensitive-string">=</value>
    </choice>
  </define>
</grammar>
