%%
%% This is file `expl3-code.tex',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% expl3.dtx  (with options: `package')
%% l3bootstrap.dtx  (with options: `package')
%% l3names.dtx  (with options: `package')
%% l3basics.dtx  (with options: `package')
%% l3expan.dtx  (with options: `package')
%% l3tl.dtx  (with options: `package')
%% l3str.dtx  (with options: `package')
%% l3seq.dtx  (with options: `package')
%% l3int.dtx  (with options: `package')
%% l3flag.dtx  (with options: `package')
%% l3quark.dtx  (with options: `package')
%% l3prg.dtx  (with options: `package')
%% l3clist.dtx  (with options: `package')
%% l3token.dtx  (with options: `package')
%% l3prop.dtx  (with options: `package')
%% l3msg.dtx  (with options: `package')
%% l3file.dtx  (with options: `package')
%% l3skip.dtx  (with options: `package')
%% l3keys.dtx  (with options: `package')
%% l3fp.dtx  (with options: `package')
%% l3fp-aux.dtx  (with options: `package')
%% l3fp-traps.dtx  (with options: `package')
%% l3fp-round.dtx  (with options: `package')
%% l3fp-parse.dtx  (with options: `package')
%% l3fp-logic.dtx  (with options: `package')
%% l3fp-basics.dtx  (with options: `package')
%% l3fp-extended.dtx  (with options: `package')
%% l3fp-expo.dtx  (with options: `package')
%% l3fp-trig.dtx  (with options: `package')
%% l3fp-convert.dtx  (with options: `package')
%% l3fp-random.dtx  (with options: `package')
%% l3fp-assign.dtx  (with options: `package')
%% l3sort.dtx  (with options: `package')
%% l3box.dtx  (with options: `package')
%% l3coffins.dtx  (with options: `package')
%% l3color.dtx  (with options: `package')
%% l3sys.dtx  (with options: `package')
%% l3deprecation.dtx  (with options: `package')
%% l3candidates.dtx  (with options: `package')
%% l3luatex.dtx  (with options: `package,tex')
%% 
%% Copyright (C) 1990-2017 The LaTeX3 Project
%% 
%% It may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License (LPPL), either version 1.3c of
%% this license or (at your option) any later version.  The latest
%% version of this license is in the file:
%% 
%%    http://www.latex-project.org/lppl.txt
%% 
%% This file is part of the "l3kernel bundle" (The Work in LPPL)
%% and all files in that bundle must be distributed together.
%% 
%% File: expl3.dtx Copyright (C) 1990-2017 The LaTeX3 Project
\def\ExplFileDate{2017/05/13}%
\begingroup
  \def\next{\endgroup}%
  \expandafter\ifx\csname PackageError\endcsname\relax
    \begingroup
      \def\next{\endgroup\endgroup}%
      \def\PackageError#1#2#3%
        {%
          \endgroup
          \errhelp{#3}%
          \errmessage{#1 Error: #2!}%
        }%
  \fi
  \expandafter\ifx\csname ExplLoaderFileDate\endcsname\relax
    \def\next
      {%
        \PackageError{expl3}{No expl3 loader detected}
          {%
            You have attempted to use the expl3 code directly rather than using
            the correct loader. Loading of expl3 will abort.
          }%
        \endgroup
        \endinput
      }
  \else
    \ifx\ExplLoaderFileDate\ExplFileDate
    \else
      \def\next
        {%
          \PackageError{expl3}{Mismatched expl3 files detected}
            {%
              You have attempted to load expl3 with mismatched files:
              probably you have one or more files 'locally installed' which
              are in conflict. Loading of expl3 will abort.
            }%
          \endgroup
          \endinput
        }%
    \fi
\fi
\next
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname ver@expl3-code.tex\endcsname\relax
  \expandafter\edef\csname ver@expl3-code.tex\endcsname
    {%
      \ExplFileDate\space
      L3 programming layer
    }%
\else
  \expandafter\endinput
\fi
\immediate\write-1 %
  {%
    Package: expl3
      \ExplFileDate\space
      L3 programming layer (code)%
  }%
%% File: l3bootstrap.dtx Copyright (C) 2011-2017 The LaTeX3 project
\begingroup
  \csname protected\endcsname\gdef\GetIdInfo
    {%
      \begingroup
        \catcode 32 = 10 %
        \GetIdInfoAuxI
    }%
  \csname protected\endcsname\gdef\GetIdInfoAuxI$#1$#2%
    {%
      \def\tempa{#1}%
      \def\tempb{Id}%
      \ifx\tempa\tempb
        \def\tempa
          {%
            \endgroup
            \def\ExplFileDate{0000/00/00}%
            \def\ExplFileDescription{#2}%
            \def\ExplFileName{[unknown]}%
            \def\ExplFileExtension{[unknown extension]}%
            \def\ExplFileVersion{-1}%
          }%
      \else
        \def\tempa
          {%
            \endgroup
            \def\ExplFileDescription{#2}%
            \GetIdInfoAuxII$#1 $%
          }%
      \fi
      \tempa
    }%
  \csname protected\endcsname\gdef\GetIdInfoAuxII$#1 #2.#3 #4 #5 #6$%
    {%
      \def\ExplFileName{#2}%
      \def\ExplFileExtension{#3}%
      \def\ExplFileVersion{#4}%
      \begingroup
        \def\tempa{#4}%
        \def\tempb{-1}%
        \ifx\tempa\tempb
          \def\tempa
            {%
              \endgroup
              \def\ExplFileDate{0000/00/00}%
            }%
        \else
          \def\tempa
            {%
              \endgroup
              \GetIdInfoAuxIII$#5$%
            }%
        \fi
        \tempa
    }%
  \csname protected\endcsname\gdef\GetIdInfoAuxIII$#1-#2-#3$%
    {%
      \def\ExplFileDate{#1/#2/#3}%
    }%
\endgroup
\begingroup
  \expandafter\ifx\csname directlua\endcsname\relax
  \else
    \directlua{%
      local i
      local t = { }
      for _,i in pairs(tex.extraprimitives("luatex")) do
        if string.match(i,"^U") then
          if not string.match(i,"^Uchar$") then
            table.insert(t,i)
          end
        end
      end
      tex.enableprimitives("", t)
    }%
  \fi
\endgroup
\begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname pdfstrcmp\endcsname\relax
  \let\pdfstrcmp\strcmp
\fi
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname directlua\endcsname\relax
\else
  \ifnum\luatexversion<70 %
  \else
    \begingroup\expandafter\expandafter\expandafter\endgroup
    \expandafter\ifx\csname newcatcodetable\endcsname\relax
      \input{ltluatex}%
    \fi
    \newcatcodetable\ucharcat@table
    \directlua{
      l3kernel = l3kernel or { }
      local charcat_table = \number\ucharcat@table\space
      l3kernel.charcat_table = charcat_table
    }%
    \directlua{require("expl3")}%
    \ifnum 0%
      \directlua{
        if status.ini_version then
          tex.write("1")
        end
      }>0 %
      \everyjob\expandafter{%
        \the\expandafter\everyjob
        \csname\detokenize{lua_now_x:n}\endcsname{require("expl3")}%
      }%
    \fi
  \fi
\fi
\begingroup
  \def\next{\endgroup}%
  \def\ShortText{Required primitives not found}%
  \def\LongText%
    {%
      LaTeX3 requires the e-TeX primitives and additional functionality as
      described in the README file.
      \LineBreak
      These are available in the engines\LineBreak
      - pdfTeX v1.40\LineBreak
      - XeTeX v0.9994\LineBreak
      - LuaTeX v0.70\LineBreak
      - e-(u)pTeX mid-2012\LineBreak
      or later.\LineBreak
      \LineBreak
    }%
  \ifnum0%
    \expandafter\ifx\csname pdfstrcmp\endcsname\relax
    \else
      \expandafter\ifx\csname pdftexversion\endcsname\relax
        1%
      \else
        \ifnum\pdftexversion<140 \else 1\fi
      \fi
    \fi
    \expandafter\ifx\csname directlua\endcsname\relax
    \else
      \ifnum\luatexversion<70 \else 1\fi
    \fi
    =0 %
      \newlinechar`\^^J %
      \def\LineBreak{\noexpand\MessageBreak}%
      \expandafter\ifx\csname PackageError\endcsname\relax
        \def\LineBreak{^^J}%
        \def\PackageError#1#2#3%
          {%
            \errhelp{#3}%
            \errmessage{#1 Error: #2}%
          }%
      \fi
      \edef\next
        {%
          \noexpand\PackageError{expl3}{\ShortText}
            {\LongText Loading of expl3 will abort!}%
          \endgroup
          \noexpand\endinput
        }%
  \fi
\next
\begingroup
  \def\@tempa{LaTeX2e}%
  \def\next{}%
  \ifx\fmtname\@tempa
    \expandafter\ifx\csname extrafloats\endcsname\relax
      \def\next
        {%
          \RequirePackage{etex}%
          \csname reserveinserts\endcsname{32}%
        }%
    \fi
  \fi
\expandafter\endgroup
\next
\protected\def\ExplSyntaxOff{}%
\protected\edef\ExplSyntaxOff
  {%
    \protected\def\ExplSyntaxOff{}%
    \catcode   9 = \the\catcode   9\relax
    \catcode  32 = \the\catcode  32\relax
    \catcode  34 = \the\catcode  34\relax
    \catcode  38 = \the\catcode  38\relax
    \catcode  58 = \the\catcode  58\relax
    \catcode  94 = \the\catcode  94\relax
    \catcode  95 = \the\catcode  95\relax
    \catcode 124 = \the\catcode 124\relax
    \catcode 126 = \the\catcode 126\relax
    \endlinechar = \the\endlinechar\relax
    \chardef\csname\detokenize{l__kernel_expl_bool}\endcsname = 0\relax
  }%
\catcode 9   = 9\relax
\catcode 32  = 9\relax
\catcode 34  = 12\relax
\catcode 38 =  4\relax
\catcode 58  = 11\relax
\catcode 94  = 7\relax
\catcode 95  = 11\relax
\catcode 124 = 12\relax
\catcode 126 = 10\relax
\endlinechar = 32\relax
\chardef\l__kernel_expl_bool = 1\relax
\protected \def \ExplSyntaxOn
  {
    \bool_if:NF \l__kernel_expl_bool
      {
        \cs_set_protected:Npx \ExplSyntaxOff
          {
            \char_set_catcode:nn { 9 }   { \char_value_catcode:n { 9 } }
            \char_set_catcode:nn { 32 }  { \char_value_catcode:n { 32 } }
            \char_set_catcode:nn { 34 }  { \char_value_catcode:n { 34 } }
            \char_set_catcode:nn { 38 }  { \char_value_catcode:n { 38 } }
            \char_set_catcode:nn { 58 }  { \char_value_catcode:n { 58 } }
            \char_set_catcode:nn { 94 }  { \char_value_catcode:n { 94 } }
            \char_set_catcode:nn { 95 }  { \char_value_catcode:n { 95 } }
            \char_set_catcode:nn { 124 } { \char_value_catcode:n { 124 } }
            \char_set_catcode:nn { 126 } { \char_value_catcode:n { 126 } }
            \tex_endlinechar:D =
              \tex_the:D \tex_endlinechar:D \scan_stop:
            \bool_set_false:N \l__kernel_expl_bool
            \cs_set_protected:Npn \ExplSyntaxOff { }
          }
      }
    \char_set_catcode_ignore:n           { 9 }   % tab
    \char_set_catcode_ignore:n           { 32 }  % space
    \char_set_catcode_other:n            { 34 }  % double quote
    \char_set_catcode_alignment:n        { 38 }  % ampersand
    \char_set_catcode_letter:n           { 58 }  % colon
    \char_set_catcode_math_superscript:n { 94 }  % circumflex
    \char_set_catcode_letter:n           { 95 }  % underscore
    \char_set_catcode_other:n            { 124 } % pipe
    \char_set_catcode_space:n            { 126 } % tilde
    \tex_endlinechar:D = 32 \scan_stop:
    \bool_set_true:N \l__kernel_expl_bool
  }
%% File: l3names.dtx Copyright (C) 1990-2017 The LaTeX3 project
\let \tex_global:D \global
\let \tex_let:D    \let
\begingroup
  \long \def \__kernel_primitive:NN #1#2
    {
      \tex_global:D \tex_let:D #2 #1
    }
  \__kernel_primitive:NN \                          \tex_space:D
  \__kernel_primitive:NN \/                         \tex_italiccorrection:D
  \__kernel_primitive:NN \-                         \tex_hyphen:D
  \__kernel_primitive:NN \above                       \tex_above:D
  \__kernel_primitive:NN \abovedisplayshortskip       \tex_abovedisplayshortskip:D
  \__kernel_primitive:NN \abovedisplayskip            \tex_abovedisplayskip:D
  \__kernel_primitive:NN \abovewithdelims             \tex_abovewithdelims:D
  \__kernel_primitive:NN \accent                      \tex_accent:D
  \__kernel_primitive:NN \adjdemerits                 \tex_adjdemerits:D
  \__kernel_primitive:NN \advance                     \tex_advance:D
  \__kernel_primitive:NN \afterassignment             \tex_afterassignment:D
  \__kernel_primitive:NN \aftergroup                  \tex_aftergroup:D
  \__kernel_primitive:NN \atop                        \tex_atop:D
  \__kernel_primitive:NN \atopwithdelims              \tex_atopwithdelims:D
  \__kernel_primitive:NN \badness                     \tex_badness:D
  \__kernel_primitive:NN \baselineskip                \tex_baselineskip:D
  \__kernel_primitive:NN \batchmode                   \tex_batchmode:D
  \__kernel_primitive:NN \begingroup                  \tex_begingroup:D
  \__kernel_primitive:NN \belowdisplayshortskip       \tex_belowdisplayshortskip:D
  \__kernel_primitive:NN \belowdisplayskip            \tex_belowdisplayskip:D
  \__kernel_primitive:NN \binoppenalty                \tex_binoppenalty:D
  \__kernel_primitive:NN \botmark                     \tex_botmark:D
  \__kernel_primitive:NN \box                         \tex_box:D
  \__kernel_primitive:NN \boxmaxdepth                 \tex_boxmaxdepth:D
  \__kernel_primitive:NN \brokenpenalty               \tex_brokenpenalty:D
  \__kernel_primitive:NN \catcode                     \tex_catcode:D
  \__kernel_primitive:NN \char                        \tex_char:D
  \__kernel_primitive:NN \chardef                     \tex_chardef:D
  \__kernel_primitive:NN \cleaders                    \tex_cleaders:D
  \__kernel_primitive:NN \closein                     \tex_closein:D
  \__kernel_primitive:NN \closeout                    \tex_closeout:D
  \__kernel_primitive:NN \clubpenalty                 \tex_clubpenalty:D
  \__kernel_primitive:NN \copy                        \tex_copy:D
  \__kernel_primitive:NN \count                       \tex_count:D
  \__kernel_primitive:NN \countdef                    \tex_countdef:D
  \__kernel_primitive:NN \cr                          \tex_cr:D
  \__kernel_primitive:NN \crcr                        \tex_crcr:D
  \__kernel_primitive:NN \csname                      \tex_csname:D
  \__kernel_primitive:NN \day                         \tex_day:D
  \__kernel_primitive:NN \deadcycles                  \tex_deadcycles:D
  \__kernel_primitive:NN \def                         \tex_def:D
  \__kernel_primitive:NN \defaulthyphenchar           \tex_defaulthyphenchar:D
  \__kernel_primitive:NN \defaultskewchar             \tex_defaultskewchar:D
  \__kernel_primitive:NN \delcode                     \tex_delcode:D
  \__kernel_primitive:NN \delimiter                   \tex_delimiter:D
  \__kernel_primitive:NN \delimiterfactor             \tex_delimiterfactor:D
  \__kernel_primitive:NN \delimitershortfall          \tex_delimitershortfall:D
  \__kernel_primitive:NN \dimen                       \tex_dimen:D
  \__kernel_primitive:NN \dimendef                    \tex_dimendef:D
  \__kernel_primitive:NN \discretionary               \tex_discretionary:D
  \__kernel_primitive:NN \displayindent               \tex_displayindent:D
  \__kernel_primitive:NN \displaylimits               \tex_displaylimits:D
  \__kernel_primitive:NN \displaystyle                \tex_displaystyle:D
  \__kernel_primitive:NN \displaywidowpenalty         \tex_displaywidowpenalty:D
  \__kernel_primitive:NN \displaywidth                \tex_displaywidth:D
  \__kernel_primitive:NN \divide                      \tex_divide:D
  \__kernel_primitive:NN \doublehyphendemerits        \tex_doublehyphendemerits:D
  \__kernel_primitive:NN \dp                          \tex_dp:D
  \__kernel_primitive:NN \dump                        \tex_dump:D
  \__kernel_primitive:NN \edef                        \tex_edef:D
  \__kernel_primitive:NN \else                        \tex_else:D
  \__kernel_primitive:NN \emergencystretch            \tex_emergencystretch:D
  \__kernel_primitive:NN \end                         \tex_end:D
  \__kernel_primitive:NN \endcsname                   \tex_endcsname:D
  \__kernel_primitive:NN \endgroup                    \tex_endgroup:D
  \__kernel_primitive:NN \endinput                    \tex_endinput:D
  \__kernel_primitive:NN \endlinechar                 \tex_endlinechar:D
  \__kernel_primitive:NN \eqno                        \tex_eqno:D
  \__kernel_primitive:NN \errhelp                     \tex_errhelp:D
  \__kernel_primitive:NN \errmessage                  \tex_errmessage:D
  \__kernel_primitive:NN \errorcontextlines           \tex_errorcontextlines:D
  \__kernel_primitive:NN \errorstopmode               \tex_errorstopmode:D
  \__kernel_primitive:NN \escapechar                  \tex_escapechar:D
  \__kernel_primitive:NN \everycr                     \tex_everycr:D
  \__kernel_primitive:NN \everydisplay                \tex_everydisplay:D
  \__kernel_primitive:NN \everyhbox                   \tex_everyhbox:D
  \__kernel_primitive:NN \everyjob                    \tex_everyjob:D
  \__kernel_primitive:NN \everymath                   \tex_everymath:D
  \__kernel_primitive:NN \everypar                    \tex_everypar:D
  \__kernel_primitive:NN \everyvbox                   \tex_everyvbox:D
  \__kernel_primitive:NN \exhyphenpenalty             \tex_exhyphenpenalty:D
  \__kernel_primitive:NN \expandafter                 \tex_expandafter:D
  \__kernel_primitive:NN \fam                         \tex_fam:D
  \__kernel_primitive:NN \fi                          \tex_fi:D
  \__kernel_primitive:NN \finalhyphendemerits         \tex_finalhyphendemerits:D
  \__kernel_primitive:NN \firstmark                   \tex_firstmark:D
  \__kernel_primitive:NN \floatingpenalty             \tex_floatingpenalty:D
  \__kernel_primitive:NN \font                        \tex_font:D
  \__kernel_primitive:NN \fontdimen                   \tex_fontdimen:D
  \__kernel_primitive:NN \fontname                    \tex_fontname:D
  \__kernel_primitive:NN \futurelet                   \tex_futurelet:D
  \__kernel_primitive:NN \gdef                        \tex_gdef:D
  \__kernel_primitive:NN \global                      \tex_global:D
  \__kernel_primitive:NN \globaldefs                  \tex_globaldefs:D
  \__kernel_primitive:NN \halign                      \tex_halign:D
  \__kernel_primitive:NN \hangafter                   \tex_hangafter:D
  \__kernel_primitive:NN \hangindent                  \tex_hangindent:D
  \__kernel_primitive:NN \hbadness                    \tex_hbadness:D
  \__kernel_primitive:NN \hbox                        \tex_hbox:D
  \__kernel_primitive:NN \hfil                        \tex_hfil:D
  \__kernel_primitive:NN \hfill                       \tex_hfill:D
  \__kernel_primitive:NN \hfilneg                     \tex_hfilneg:D
  \__kernel_primitive:NN \hfuzz                       \tex_hfuzz:D
  \__kernel_primitive:NN \hoffset                     \tex_hoffset:D
  \__kernel_primitive:NN \holdinginserts              \tex_holdinginserts:D
  \__kernel_primitive:NN \hrule                       \tex_hrule:D
  \__kernel_primitive:NN \hsize                       \tex_hsize:D
  \__kernel_primitive:NN \hskip                       \tex_hskip:D
  \__kernel_primitive:NN \hss                         \tex_hss:D
  \__kernel_primitive:NN \ht                          \tex_ht:D
  \__kernel_primitive:NN \hyphenation                 \tex_hyphenation:D
  \__kernel_primitive:NN \hyphenchar                  \tex_hyphenchar:D
  \__kernel_primitive:NN \hyphenpenalty               \tex_hyphenpenalty:D
  \__kernel_primitive:NN \if                          \tex_if:D
  \__kernel_primitive:NN \ifcase                      \tex_ifcase:D
  \__kernel_primitive:NN \ifcat                       \tex_ifcat:D
  \__kernel_primitive:NN \ifdim                       \tex_ifdim:D
  \__kernel_primitive:NN \ifeof                       \tex_ifeof:D
  \__kernel_primitive:NN \iffalse                     \tex_iffalse:D
  \__kernel_primitive:NN \ifhbox                      \tex_ifhbox:D
  \__kernel_primitive:NN \ifhmode                     \tex_ifhmode:D
  \__kernel_primitive:NN \ifinner                     \tex_ifinner:D
  \__kernel_primitive:NN \ifmmode                     \tex_ifmmode:D
  \__kernel_primitive:NN \ifnum                       \tex_ifnum:D
  \__kernel_primitive:NN \ifodd                       \tex_ifodd:D
  \__kernel_primitive:NN \iftrue                      \tex_iftrue:D
  \__kernel_primitive:NN \ifvbox                      \tex_ifvbox:D
  \__kernel_primitive:NN \ifvmode                     \tex_ifvmode:D
  \__kernel_primitive:NN \ifvoid                      \tex_ifvoid:D
  \__kernel_primitive:NN \ifx                         \tex_ifx:D
  \__kernel_primitive:NN \ignorespaces                \tex_ignorespaces:D
  \__kernel_primitive:NN \immediate                   \tex_immediate:D
  \__kernel_primitive:NN \indent                      \tex_indent:D
  \__kernel_primitive:NN \input                       \tex_input:D
  \__kernel_primitive:NN \inputlineno                 \tex_inputlineno:D
  \__kernel_primitive:NN \insert                      \tex_insert:D
  \__kernel_primitive:NN \insertpenalties             \tex_insertpenalties:D
  \__kernel_primitive:NN \interlinepenalty            \tex_interlinepenalty:D
  \__kernel_primitive:NN \jobname                     \tex_jobname:D
  \__kernel_primitive:NN \kern                        \tex_kern:D
  \__kernel_primitive:NN \language                    \tex_language:D
  \__kernel_primitive:NN \lastbox                     \tex_lastbox:D
  \__kernel_primitive:NN \lastkern                    \tex_lastkern:D
  \__kernel_primitive:NN \lastpenalty                 \tex_lastpenalty:D
  \__kernel_primitive:NN \lastskip                    \tex_lastskip:D
  \__kernel_primitive:NN \lccode                      \tex_lccode:D
  \__kernel_primitive:NN \leaders                     \tex_leaders:D
  \__kernel_primitive:NN \left                        \tex_left:D
  \__kernel_primitive:NN \lefthyphenmin               \tex_lefthyphenmin:D
  \__kernel_primitive:NN \leftskip                    \tex_leftskip:D
  \__kernel_primitive:NN \leqno                       \tex_leqno:D
  \__kernel_primitive:NN \let                         \tex_let:D
  \__kernel_primitive:NN \limits                      \tex_limits:D
  \__kernel_primitive:NN \linepenalty                 \tex_linepenalty:D
  \__kernel_primitive:NN \lineskip                    \tex_lineskip:D
  \__kernel_primitive:NN \lineskiplimit               \tex_lineskiplimit:D
  \__kernel_primitive:NN \long                        \tex_long:D
  \__kernel_primitive:NN \looseness                   \tex_looseness:D
  \__kernel_primitive:NN \lower                       \tex_lower:D
  \__kernel_primitive:NN \lowercase                   \tex_lowercase:D
  \__kernel_primitive:NN \mag                         \tex_mag:D
  \__kernel_primitive:NN \mark                        \tex_mark:D
  \__kernel_primitive:NN \mathaccent                  \tex_mathaccent:D
  \__kernel_primitive:NN \mathbin                     \tex_mathbin:D
  \__kernel_primitive:NN \mathchar                    \tex_mathchar:D
  \__kernel_primitive:NN \mathchardef                 \tex_mathchardef:D
  \__kernel_primitive:NN \mathchoice                  \tex_mathchoice:D
  \__kernel_primitive:NN \mathclose                   \tex_mathclose:D
  \__kernel_primitive:NN \mathcode                    \tex_mathcode:D
  \__kernel_primitive:NN \mathinner                   \tex_mathinner:D
  \__kernel_primitive:NN \mathop                      \tex_mathop:D
  \__kernel_primitive:NN \mathopen                    \tex_mathopen:D
  \__kernel_primitive:NN \mathord                     \tex_mathord:D
  \__kernel_primitive:NN \mathpunct                   \tex_mathpunct:D
  \__kernel_primitive:NN \mathrel                     \tex_mathrel:D
  \__kernel_primitive:NN \mathsurround                \tex_mathsurround:D
  \__kernel_primitive:NN \maxdeadcycles               \tex_maxdeadcycles:D
  \__kernel_primitive:NN \maxdepth                    \tex_maxdepth:D
  \__kernel_primitive:NN \meaning                     \tex_meaning:D
  \__kernel_primitive:NN \medmuskip                   \tex_medmuskip:D
  \__kernel_primitive:NN \message                     \tex_message:D
  \__kernel_primitive:NN \mkern                       \tex_mkern:D
  \__kernel_primitive:NN \month                       \tex_month:D
  \__kernel_primitive:NN \moveleft                    \tex_moveleft:D
  \__kernel_primitive:NN \moveright                   \tex_moveright:D
  \__kernel_primitive:NN \mskip                       \tex_mskip:D
  \__kernel_primitive:NN \multiply                    \tex_multiply:D
  \__kernel_primitive:NN \muskip                      \tex_muskip:D
  \__kernel_primitive:NN \muskipdef                   \tex_muskipdef:D
  \__kernel_primitive:NN \newlinechar                 \tex_newlinechar:D
  \__kernel_primitive:NN \noalign                     \tex_noalign:D
  \__kernel_primitive:NN \noboundary                  \tex_noboundary:D
  \__kernel_primitive:NN \noexpand                    \tex_noexpand:D
  \__kernel_primitive:NN \noindent                    \tex_noindent:D
  \__kernel_primitive:NN \nolimits                    \tex_nolimits:D
  \__kernel_primitive:NN \nonscript                   \tex_nonscript:D
  \__kernel_primitive:NN \nonstopmode                 \tex_nonstopmode:D
  \__kernel_primitive:NN \nulldelimiterspace          \tex_nulldelimiterspace:D
  \__kernel_primitive:NN \nullfont                    \tex_nullfont:D
  \__kernel_primitive:NN \number                      \tex_number:D
  \__kernel_primitive:NN \omit                        \tex_omit:D
  \__kernel_primitive:NN \openin                      \tex_openin:D
  \__kernel_primitive:NN \openout                     \tex_openout:D
  \__kernel_primitive:NN \or                          \tex_or:D
  \__kernel_primitive:NN \outer                       \tex_outer:D
  \__kernel_primitive:NN \output                      \tex_output:D
  \__kernel_primitive:NN \outputpenalty               \tex_outputpenalty:D
  \__kernel_primitive:NN \over                        \tex_over:D
  \__kernel_primitive:NN \overfullrule                \tex_overfullrule:D
  \__kernel_primitive:NN \overline                    \tex_overline:D
  \__kernel_primitive:NN \overwithdelims              \tex_overwithdelims:D
  \__kernel_primitive:NN \pagedepth                   \tex_pagedepth:D
  \__kernel_primitive:NN \pagefilllstretch            \tex_pagefilllstretch:D
  \__kernel_primitive:NN \pagefillstretch             \tex_pagefillstretch:D
  \__kernel_primitive:NN \pagefilstretch              \tex_pagefilstretch:D
  \__kernel_primitive:NN \pagegoal                    \tex_pagegoal:D
  \__kernel_primitive:NN \pageshrink                  \tex_pageshrink:D
  \__kernel_primitive:NN \pagestretch                 \tex_pagestretch:D
  \__kernel_primitive:NN \pagetotal                   \tex_pagetotal:D
  \__kernel_primitive:NN \par                         \tex_par:D
  \__kernel_primitive:NN \parfillskip                 \tex_parfillskip:D
  \__kernel_primitive:NN \parindent                   \tex_parindent:D
  \__kernel_primitive:NN \parshape                    \tex_parshape:D
  \__kernel_primitive:NN \parskip                     \tex_parskip:D
  \__kernel_primitive:NN \patterns                    \tex_patterns:D
  \__kernel_primitive:NN \pausing                     \tex_pausing:D
  \__kernel_primitive:NN \penalty                     \tex_penalty:D
  \__kernel_primitive:NN \postdisplaypenalty          \tex_postdisplaypenalty:D
  \__kernel_primitive:NN \predisplaypenalty           \tex_predisplaypenalty:D
  \__kernel_primitive:NN \predisplaysize              \tex_predisplaysize:D
  \__kernel_primitive:NN \pretolerance                \tex_pretolerance:D
  \__kernel_primitive:NN \prevdepth                   \tex_prevdepth:D
  \__kernel_primitive:NN \prevgraf                    \tex_prevgraf:D
  \__kernel_primitive:NN \radical                     \tex_radical:D
  \__kernel_primitive:NN \raise                       \tex_raise:D
  \__kernel_primitive:NN \read                        \tex_read:D
  \__kernel_primitive:NN \relax                       \tex_relax:D
  \__kernel_primitive:NN \relpenalty                  \tex_relpenalty:D
  \__kernel_primitive:NN \right                       \tex_right:D
  \__kernel_primitive:NN \righthyphenmin              \tex_righthyphenmin:D
  \__kernel_primitive:NN \rightskip                   \tex_rightskip:D
  \__kernel_primitive:NN \romannumeral                \tex_romannumeral:D
  \__kernel_primitive:NN \scriptfont                  \tex_scriptfont:D
  \__kernel_primitive:NN \scriptscriptfont            \tex_scriptscriptfont:D
  \__kernel_primitive:NN \scriptscriptstyle           \tex_scriptscriptstyle:D
  \__kernel_primitive:NN \scriptspace                 \tex_scriptspace:D
  \__kernel_primitive:NN \scriptstyle                 \tex_scriptstyle:D
  \__kernel_primitive:NN \scrollmode                  \tex_scrollmode:D
  \__kernel_primitive:NN \setbox                      \tex_setbox:D
  \__kernel_primitive:NN \setlanguage                 \tex_setlanguage:D
  \__kernel_primitive:NN \sfcode                      \tex_sfcode:D
  \__kernel_primitive:NN \shipout                     \tex_shipout:D
  \__kernel_primitive:NN \show                        \tex_show:D
  \__kernel_primitive:NN \showbox                     \tex_showbox:D
  \__kernel_primitive:NN \showboxbreadth              \tex_showboxbreadth:D
  \__kernel_primitive:NN \showboxdepth                \tex_showboxdepth:D
  \__kernel_primitive:NN \showlists                   \tex_showlists:D
  \__kernel_primitive:NN \showthe                     \tex_showthe:D
  \__kernel_primitive:NN \skewchar                    \tex_skewchar:D
  \__kernel_primitive:NN \skip                        \tex_skip:D
  \__kernel_primitive:NN \skipdef                     \tex_skipdef:D
  \__kernel_primitive:NN \spacefactor                 \tex_spacefactor:D
  \__kernel_primitive:NN \spaceskip                   \tex_spaceskip:D
  \__kernel_primitive:NN \span                        \tex_span:D
  \__kernel_primitive:NN \special                     \tex_special:D
  \__kernel_primitive:NN \splitbotmark                \tex_splitbotmark:D
  \__kernel_primitive:NN \splitfirstmark              \tex_splitfirstmark:D
  \__kernel_primitive:NN \splitmaxdepth               \tex_splitmaxdepth:D
  \__kernel_primitive:NN \splittopskip                \tex_splittopskip:D
  \__kernel_primitive:NN \string                      \tex_string:D
  \__kernel_primitive:NN \tabskip                     \tex_tabskip:D
  \__kernel_primitive:NN \textfont                    \tex_textfont:D
  \__kernel_primitive:NN \textstyle                   \tex_textstyle:D
  \__kernel_primitive:NN \the                         \tex_the:D
  \__kernel_primitive:NN \thickmuskip                 \tex_thickmuskip:D
  \__kernel_primitive:NN \thinmuskip                  \tex_thinmuskip:D
  \__kernel_primitive:NN \time                        \tex_time:D
  \__kernel_primitive:NN \toks                        \tex_toks:D
  \__kernel_primitive:NN \toksdef                     \tex_toksdef:D
  \__kernel_primitive:NN \tolerance                   \tex_tolerance:D
  \__kernel_primitive:NN \topmark                     \tex_topmark:D
  \__kernel_primitive:NN \topskip                     \tex_topskip:D
  \__kernel_primitive:NN \tracingcommands             \tex_tracingcommands:D
  \__kernel_primitive:NN \tracinglostchars            \tex_tracinglostchars:D
  \__kernel_primitive:NN \tracingmacros               \tex_tracingmacros:D
  \__kernel_primitive:NN \tracingonline               \tex_tracingonline:D
  \__kernel_primitive:NN \tracingoutput               \tex_tracingoutput:D
  \__kernel_primitive:NN \tracingpages                \tex_tracingpages:D
  \__kernel_primitive:NN \tracingparagraphs           \tex_tracingparagraphs:D
  \__kernel_primitive:NN \tracingrestores             \tex_tracingrestores:D
  \__kernel_primitive:NN \tracingstats                \tex_tracingstats:D
  \__kernel_primitive:NN \uccode                      \tex_uccode:D
  \__kernel_primitive:NN \uchyph                      \tex_uchyph:D
  \__kernel_primitive:NN \underline                   \tex_underline:D
  \__kernel_primitive:NN \unhbox                      \tex_unhbox:D
  \__kernel_primitive:NN \unhcopy                     \tex_unhcopy:D
  \__kernel_primitive:NN \unkern                      \tex_unkern:D
  \__kernel_primitive:NN \unpenalty                   \tex_unpenalty:D
  \__kernel_primitive:NN \unskip                      \tex_unskip:D
  \__kernel_primitive:NN \unvbox                      \tex_unvbox:D
  \__kernel_primitive:NN \unvcopy                     \tex_unvcopy:D
  \__kernel_primitive:NN \uppercase                   \tex_uppercase:D
  \__kernel_primitive:NN \vadjust                     \tex_vadjust:D
  \__kernel_primitive:NN \valign                      \tex_valign:D
  \__kernel_primitive:NN \vbadness                    \tex_vbadness:D
  \__kernel_primitive:NN \vbox                        \tex_vbox:D
  \__kernel_primitive:NN \vcenter                     \tex_vcenter:D
  \__kernel_primitive:NN \vfil                        \tex_vfil:D
  \__kernel_primitive:NN \vfill                       \tex_vfill:D
  \__kernel_primitive:NN \vfilneg                     \tex_vfilneg:D
  \__kernel_primitive:NN \vfuzz                       \tex_vfuzz:D
  \__kernel_primitive:NN \voffset                     \tex_voffset:D
  \__kernel_primitive:NN \vrule                       \tex_vrule:D
  \__kernel_primitive:NN \vsize                       \tex_vsize:D
  \__kernel_primitive:NN \vskip                       \tex_vskip:D
  \__kernel_primitive:NN \vsplit                      \tex_vsplit:D
  \__kernel_primitive:NN \vss                         \tex_vss:D
  \__kernel_primitive:NN \vtop                        \tex_vtop:D
  \__kernel_primitive:NN \wd                          \tex_wd:D
  \__kernel_primitive:NN \widowpenalty                \tex_widowpenalty:D
  \__kernel_primitive:NN \write                       \tex_write:D
  \__kernel_primitive:NN \xdef                        \tex_xdef:D
  \__kernel_primitive:NN \xleaders                    \tex_xleaders:D
  \__kernel_primitive:NN \xspaceskip                  \tex_xspaceskip:D
  \__kernel_primitive:NN \year                        \tex_year:D
  \__kernel_primitive:NN \beginL                      \etex_beginL:D
  \__kernel_primitive:NN \beginR                      \etex_beginR:D
  \__kernel_primitive:NN \botmarks                    \etex_botmarks:D
  \__kernel_primitive:NN \clubpenalties               \etex_clubpenalties:D
  \__kernel_primitive:NN \currentgrouplevel           \etex_currentgrouplevel:D
  \__kernel_primitive:NN \currentgrouptype            \etex_currentgrouptype:D
  \__kernel_primitive:NN \currentifbranch             \etex_currentifbranch:D
  \__kernel_primitive:NN \currentiflevel              \etex_currentiflevel:D
  \__kernel_primitive:NN \currentiftype               \etex_currentiftype:D
  \__kernel_primitive:NN \detokenize                  \etex_detokenize:D
  \__kernel_primitive:NN \dimexpr                     \etex_dimexpr:D
  \__kernel_primitive:NN \displaywidowpenalties       \etex_displaywidowpenalties:D
  \__kernel_primitive:NN \endL                        \etex_endL:D
  \__kernel_primitive:NN \endR                        \etex_endR:D
  \__kernel_primitive:NN \eTeXrevision                \etex_eTeXrevision:D
  \__kernel_primitive:NN \eTeXversion                 \etex_eTeXversion:D
  \__kernel_primitive:NN \everyeof                    \etex_everyeof:D
  \__kernel_primitive:NN \firstmarks                  \etex_firstmarks:D
  \__kernel_primitive:NN \fontchardp                  \etex_fontchardp:D
  \__kernel_primitive:NN \fontcharht                  \etex_fontcharht:D
  \__kernel_primitive:NN \fontcharic                  \etex_fontcharic:D
  \__kernel_primitive:NN \fontcharwd                  \etex_fontcharwd:D
  \__kernel_primitive:NN \glueexpr                    \etex_glueexpr:D
  \__kernel_primitive:NN \glueshrink                  \etex_glueshrink:D
  \__kernel_primitive:NN \glueshrinkorder             \etex_glueshrinkorder:D
  \__kernel_primitive:NN \gluestretch                 \etex_gluestretch:D
  \__kernel_primitive:NN \gluestretchorder            \etex_gluestretchorder:D
  \__kernel_primitive:NN \gluetomu                    \etex_gluetomu:D
  \__kernel_primitive:NN \ifcsname                    \etex_ifcsname:D
  \__kernel_primitive:NN \ifdefined                   \etex_ifdefined:D
  \__kernel_primitive:NN \iffontchar                  \etex_iffontchar:D
  \__kernel_primitive:NN \interactionmode             \etex_interactionmode:D
  \__kernel_primitive:NN \interlinepenalties          \etex_interlinepenalties:D
  \__kernel_primitive:NN \lastlinefit                 \etex_lastlinefit:D
  \__kernel_primitive:NN \lastnodetype                \etex_lastnodetype:D
  \__kernel_primitive:NN \marks                       \etex_marks:D
  \__kernel_primitive:NN \middle                      \etex_middle:D
  \__kernel_primitive:NN \muexpr                      \etex_muexpr:D
  \__kernel_primitive:NN \mutoglue                    \etex_mutoglue:D
  \__kernel_primitive:NN \numexpr                     \etex_numexpr:D
  \__kernel_primitive:NN \pagediscards                \etex_pagediscards:D
  \__kernel_primitive:NN \parshapedimen               \etex_parshapedimen:D
  \__kernel_primitive:NN \parshapeindent              \etex_parshapeindent:D
  \__kernel_primitive:NN \parshapelength              \etex_parshapelength:D
  \__kernel_primitive:NN \predisplaydirection         \etex_predisplaydirection:D
  \__kernel_primitive:NN \protected                   \etex_protected:D
  \__kernel_primitive:NN \readline                    \etex_readline:D
  \__kernel_primitive:NN \savinghyphcodes             \etex_savinghyphcodes:D
  \__kernel_primitive:NN \savingvdiscards             \etex_savingvdiscards:D
  \__kernel_primitive:NN \scantokens                  \etex_scantokens:D
  \__kernel_primitive:NN \showgroups                  \etex_showgroups:D
  \__kernel_primitive:NN \showifs                     \etex_showifs:D
  \__kernel_primitive:NN \showtokens                  \etex_showtokens:D
  \__kernel_primitive:NN \splitbotmarks               \etex_splitbotmarks:D
  \__kernel_primitive:NN \splitdiscards               \etex_splitdiscards:D
  \__kernel_primitive:NN \splitfirstmarks             \etex_splitfirstmarks:D
  \__kernel_primitive:NN \TeXXeTstate                 \etex_TeXXeTstate:D
  \__kernel_primitive:NN \topmarks                    \etex_topmarks:D
  \__kernel_primitive:NN \tracingassigns              \etex_tracingassigns:D
  \__kernel_primitive:NN \tracinggroups               \etex_tracinggroups:D
  \__kernel_primitive:NN \tracingifs                  \etex_tracingifs:D
  \__kernel_primitive:NN \tracingnesting              \etex_tracingnesting:D
  \__kernel_primitive:NN \tracingscantokens           \etex_tracingscantokens:D
  \__kernel_primitive:NN \unexpanded                  \etex_unexpanded:D
  \__kernel_primitive:NN \unless                      \etex_unless:D
  \__kernel_primitive:NN \widowpenalties              \etex_widowpenalties:D
  \__kernel_primitive:NN \pdfannot                    \pdftex_pdfannot:D
  \__kernel_primitive:NN \pdfcatalog                  \pdftex_pdfcatalog:D
  \__kernel_primitive:NN \pdfcompresslevel            \pdftex_pdfcompresslevel:D
  \__kernel_primitive:NN \pdfcolorstack               \pdftex_pdfcolorstack:D
  \__kernel_primitive:NN \pdfcolorstackinit           \pdftex_pdfcolorstackinit:D
  \__kernel_primitive:NN \pdfcreationdate             \pdftex_pdfcreationdate:D
  \__kernel_primitive:NN \pdfdecimaldigits            \pdftex_pdfdecimaldigits:D
  \__kernel_primitive:NN \pdfdest                     \pdftex_pdfdest:D
  \__kernel_primitive:NN \pdfdestmargin               \pdftex_pdfdestmargin:D
  \__kernel_primitive:NN \pdfendlink                  \pdftex_pdfendlink:D
  \__kernel_primitive:NN \pdfendthread                \pdftex_pdfendthread:D
  \__kernel_primitive:NN \pdffontattr                 \pdftex_pdffontattr:D
  \__kernel_primitive:NN \pdffontname                 \pdftex_pdffontname:D
  \__kernel_primitive:NN \pdffontobjnum               \pdftex_pdffontobjnum:D
  \__kernel_primitive:NN \pdfgamma                    \pdftex_pdfgamma:D
  \__kernel_primitive:NN \pdfimageapplygamma          \pdftex_pdfimageapplygamma:D
  \__kernel_primitive:NN \pdfimagegamma               \pdftex_pdfimagegamma:D
  \__kernel_primitive:NN \pdfgentounicode             \pdftex_pdfgentounicode:D
  \__kernel_primitive:NN \pdfglyphtounicode           \pdftex_pdfglyphtounicode:D
  \__kernel_primitive:NN \pdfhorigin                  \pdftex_pdfhorigin:D
  \__kernel_primitive:NN \pdfimagehicolor             \pdftex_pdfimagehicolor:D
  \__kernel_primitive:NN \pdfimageresolution          \pdftex_pdfimageresolution:D
  \__kernel_primitive:NN \pdfincludechars             \pdftex_pdfincludechars:D
  \__kernel_primitive:NN \pdfinclusioncopyfonts       \pdftex_pdfinclusioncopyfonts:D
  \__kernel_primitive:NN \pdfinclusionerrorlevel      \pdftex_pdfinclusionerrorlevel:D
  \__kernel_primitive:NN \pdfinfo                     \pdftex_pdfinfo:D
  \__kernel_primitive:NN \pdflastannot                \pdftex_pdflastannot:D
  \__kernel_primitive:NN \pdflastlink                 \pdftex_pdflastlink:D
  \__kernel_primitive:NN \pdflastobj                  \pdftex_pdflastobj:D
  \__kernel_primitive:NN \pdflastxform                \pdftex_pdflastxform:D
  \__kernel_primitive:NN \pdflastximage               \pdftex_pdflastximage:D
  \__kernel_primitive:NN \pdflastximagecolordepth     \pdftex_pdflastximagecolordepth:D
  \__kernel_primitive:NN \pdflastximagepages          \pdftex_pdflastximagepages:D
  \__kernel_primitive:NN \pdflinkmargin               \pdftex_pdflinkmargin:D
  \__kernel_primitive:NN \pdfliteral                  \pdftex_pdfliteral:D
  \__kernel_primitive:NN \pdfminorversion             \pdftex_pdfminorversion:D
  \__kernel_primitive:NN \pdfnames                    \pdftex_pdfnames:D
  \__kernel_primitive:NN \pdfobj                      \pdftex_pdfobj:D
  \__kernel_primitive:NN \pdfobjcompresslevel         \pdftex_pdfobjcompresslevel:D
  \__kernel_primitive:NN \pdfoutline                  \pdftex_pdfoutline:D
  \__kernel_primitive:NN \pdfoutput                   \pdftex_pdfoutput:D
  \__kernel_primitive:NN \pdfpageattr                 \pdftex_pdfpageattr:D
  \__kernel_primitive:NN \pdfpagebox                  \pdftex_pdfpagebox:D
  \__kernel_primitive:NN \pdfpageref                  \pdftex_pdfpageref:D
  \__kernel_primitive:NN \pdfpageresources            \pdftex_pdfpageresources:D
  \__kernel_primitive:NN \pdfpagesattr                \pdftex_pdfpagesattr:D
  \__kernel_primitive:NN \pdfrefobj                   \pdftex_pdfrefobj:D
  \__kernel_primitive:NN \pdfrefxform                 \pdftex_pdfrefxform:D
  \__kernel_primitive:NN \pdfrefximage                \pdftex_pdfrefximage:D
  \__kernel_primitive:NN \pdfrestore                  \pdftex_pdfrestore:D
  \__kernel_primitive:NN \pdfretval                   \pdftex_pdfretval:D
  \__kernel_primitive:NN \pdfsave                     \pdftex_pdfsave:D
  \__kernel_primitive:NN \pdfsetmatrix                \pdftex_pdfsetmatrix:D
  \__kernel_primitive:NN \pdfstartlink                \pdftex_pdfstartlink:D
  \__kernel_primitive:NN \pdfstartthread              \pdftex_pdfstartthread:D
  \__kernel_primitive:NN \pdfsuppressptexinfo         \pdftex_pdfsuppressptexinfo:D
  \__kernel_primitive:NN \pdfthread                   \pdftex_pdfthread:D
  \__kernel_primitive:NN \pdfthreadmargin             \pdftex_pdfthreadmargin:D
  \__kernel_primitive:NN \pdftrailer                  \pdftex_pdftrailer:D
  \__kernel_primitive:NN \pdfuniqueresname            \pdftex_pdfuniqueresname:D
  \__kernel_primitive:NN \pdfvorigin                  \pdftex_pdfvorigin:D
  \__kernel_primitive:NN \pdfxform                    \pdftex_pdfxform:D
  \__kernel_primitive:NN \pdfxformattr                \pdftex_pdfxformattr:D
  \__kernel_primitive:NN \pdfxformname                \pdftex_pdfxformname:D
  \__kernel_primitive:NN \pdfxformresources           \pdftex_pdfxformresources:D
  \__kernel_primitive:NN \pdfximage                   \pdftex_pdfximage:D
  \__kernel_primitive:NN \pdfximagebbox               \pdftex_pdfximagebbox:D
  \__kernel_primitive:NN \ifpdfabsdim                 \pdftex_ifabsdim:D
  \__kernel_primitive:NN \ifpdfabsnum                 \pdftex_ifabsnum:D
  \__kernel_primitive:NN \ifpdfprimitive              \pdftex_ifprimitive:D
  \__kernel_primitive:NN \pdfadjustspacing            \pdftex_adjustspacing:D
  \__kernel_primitive:NN \pdfcopyfont                 \pdftex_copyfont:D
  \__kernel_primitive:NN \pdfdraftmode                \pdftex_draftmode:D
  \__kernel_primitive:NN \pdfeachlinedepth            \pdftex_eachlinedepth:D
  \__kernel_primitive:NN \pdfeachlineheight           \pdftex_eachlineheight:D
  \__kernel_primitive:NN \pdffirstlineheight          \pdftex_firstlineheight:D
  \__kernel_primitive:NN \pdffontexpand               \pdftex_fontexpand:D
  \__kernel_primitive:NN \pdffontsize                 \pdftex_fontsize:D
  \__kernel_primitive:NN \pdfignoreddimen             \pdftex_ignoreddimen:D
  \__kernel_primitive:NN \pdfinsertht                 \pdftex_insertht:D
  \__kernel_primitive:NN \pdflastlinedepth            \pdftex_lastlinedepth:D
  \__kernel_primitive:NN \pdflastxpos                 \pdftex_lastxpos:D
  \__kernel_primitive:NN \pdflastypos                 \pdftex_lastypos:D
  \__kernel_primitive:NN \pdfmapfile                  \pdftex_mapfile:D
  \__kernel_primitive:NN \pdfmapline                  \pdftex_mapline:D
  \__kernel_primitive:NN \pdfnoligatures              \pdftex_noligatures:D
  \__kernel_primitive:NN \pdfnormaldeviate            \pdftex_normaldeviate:D
  \__kernel_primitive:NN \pdfpageheight               \pdftex_pageheight:D
  \__kernel_primitive:NN \pdfpagewidth                \pdftex_pagewidth:D
  \__kernel_primitive:NN \pdfpkmode                   \pdftex_pkmode:D
  \__kernel_primitive:NN \pdfpkresolution             \pdftex_pkresolution:D
  \__kernel_primitive:NN \pdfprimitive                \pdftex_primitive:D
  \__kernel_primitive:NN \pdfprotrudechars            \pdftex_protrudechars:D
  \__kernel_primitive:NN \pdfpxdimen                  \pdftex_pxdimen:D
  \__kernel_primitive:NN \pdfrandomseed               \pdftex_randomseed:D
  \__kernel_primitive:NN \pdfsavepos                  \pdftex_savepos:D
  \__kernel_primitive:NN \pdfstrcmp                   \pdftex_strcmp:D
  \__kernel_primitive:NN \pdfsetrandomseed            \pdftex_setrandomseed:D
  \__kernel_primitive:NN \pdfshellescape              \pdftex_shellescape:D
  \__kernel_primitive:NN \pdftracingfonts             \pdftex_tracingfonts:D
  \__kernel_primitive:NN \pdfuniformdeviate           \pdftex_uniformdeviate:D
  \__kernel_primitive:NN \pdftexbanner                \pdftex_pdftexbanner:D
  \__kernel_primitive:NN \pdftexrevision              \pdftex_pdftexrevision:D
  \__kernel_primitive:NN \pdftexversion               \pdftex_pdftexversion:D
  \__kernel_primitive:NN \efcode                      \pdftex_efcode:D
  \__kernel_primitive:NN \ifincsname                  \pdftex_ifincsname:D
  \__kernel_primitive:NN \leftmarginkern              \pdftex_leftmarginkern:D
  \__kernel_primitive:NN \letterspacefont             \pdftex_letterspacefont:D
  \__kernel_primitive:NN \lpcode                      \pdftex_lpcode:D
  \__kernel_primitive:NN \quitvmode                   \pdftex_quitvmode:D
  \__kernel_primitive:NN \rightmarginkern             \pdftex_rightmarginkern:D
  \__kernel_primitive:NN \rpcode                      \pdftex_rpcode:D
  \__kernel_primitive:NN \synctex                     \pdftex_synctex:D
  \__kernel_primitive:NN \tagcode                     \pdftex_tagcode:D
  \tex_long:D \tex_def:D \use_ii:nn #1#2 {#2}
  \tex_long:D \tex_def:D \use_none:n #1 { }
  \tex_long:D \tex_def:D \__kernel_primitive:NN #1#2
    {
      \etex_ifdefined:D #1
        \tex_expandafter:D \use_ii:nn
      \tex_fi:D
        \use_none:n { \tex_global:D \tex_let:D #2 #1 }
    }
  \__kernel_primitive:NN \suppressfontnotfounderror   \xetex_suppressfontnotfounderror:D
  \__kernel_primitive:NN \XeTeXcharclass              \xetex_charclass:D
  \__kernel_primitive:NN \XeTeXcharglyph              \xetex_charglyph:D
  \__kernel_primitive:NN \XeTeXcountfeatures          \xetex_countfeatures:D
  \__kernel_primitive:NN \XeTeXcountglyphs            \xetex_countglyphs:D
  \__kernel_primitive:NN \XeTeXcountselectors         \xetex_countselectors:D
  \__kernel_primitive:NN \XeTeXcountvariations        \xetex_countvariations:D
  \__kernel_primitive:NN \XeTeXdefaultencoding        \xetex_defaultencoding:D
  \__kernel_primitive:NN \XeTeXdashbreakstate         \xetex_dashbreakstate:D
  \__kernel_primitive:NN \XeTeXfeaturecode            \xetex_featurecode:D
  \__kernel_primitive:NN \XeTeXfeaturename            \xetex_featurename:D
  \__kernel_primitive:NN \XeTeXfindfeaturebyname      \xetex_findfeaturebyname:D
  \__kernel_primitive:NN \XeTeXfindselectorbyname     \xetex_findselectorbyname:D
  \__kernel_primitive:NN \XeTeXfindvariationbyname    \xetex_findvariationbyname:D
  \__kernel_primitive:NN \XeTeXfirstfontchar          \xetex_firstfontchar:D
  \__kernel_primitive:NN \XeTeXfonttype               \xetex_fonttype:D
  \__kernel_primitive:NN \XeTeXgenerateactualtext     \xetex_generateactualtext:D
  \__kernel_primitive:NN \XeTeXglyph                  \xetex_glyph:D
  \__kernel_primitive:NN \XeTeXglyphbounds            \xetex_glyphbounds:D
  \__kernel_primitive:NN \XeTeXglyphindex             \xetex_glyphindex:D
  \__kernel_primitive:NN \XeTeXglyphname              \xetex_glyphname:D
  \__kernel_primitive:NN \XeTeXinputencoding          \xetex_inputencoding:D
  \__kernel_primitive:NN \XeTeXinputnormalization     \xetex_inputnormalization:D
  \__kernel_primitive:NN \XeTeXinterchartokenstate    \xetex_interchartokenstate:D
  \__kernel_primitive:NN \XeTeXinterchartoks          \xetex_interchartoks:D
  \__kernel_primitive:NN \XeTeXisdefaultselector      \xetex_isdefaultselector:D
  \__kernel_primitive:NN \XeTeXisexclusivefeature     \xetex_isexclusivefeature:D
  \__kernel_primitive:NN \XeTeXlastfontchar           \xetex_lastfontchar:D
  \__kernel_primitive:NN \XeTeXlinebreakskip          \xetex_linebreakskip:D
  \__kernel_primitive:NN \XeTeXlinebreaklocale        \xetex_linebreaklocale:D
  \__kernel_primitive:NN \XeTeXlinebreakpenalty       \xetex_linebreakpenalty:D
  \__kernel_primitive:NN \XeTeXOTcountfeatures        \xetex_OTcountfeatures:D
  \__kernel_primitive:NN \XeTeXOTcountlanguages       \xetex_OTcountlanguages:D
  \__kernel_primitive:NN \XeTeXOTcountscripts         \xetex_OTcountscripts:D
  \__kernel_primitive:NN \XeTeXOTfeaturetag           \xetex_OTfeaturetag:D
  \__kernel_primitive:NN \XeTeXOTlanguagetag          \xetex_OTlanguagetag:D
  \__kernel_primitive:NN \XeTeXOTscripttag            \xetex_OTscripttag:D
  \__kernel_primitive:NN \XeTeXpdffile                \xetex_pdffile:D
  \__kernel_primitive:NN \XeTeXpdfpagecount           \xetex_pdfpagecount:D
  \__kernel_primitive:NN \XeTeXpicfile                \xetex_picfile:D
  \__kernel_primitive:NN \XeTeXselectorname           \xetex_selectorname:D
  \__kernel_primitive:NN \XeTeXtracingfonts           \xetex_tracingfonts:D
  \__kernel_primitive:NN \XeTeXupwardsmode            \xetex_upwardsmode:D
  \__kernel_primitive:NN \XeTeXuseglyphmetrics        \xetex_useglyphmetrics:D
  \__kernel_primitive:NN \XeTeXvariation              \xetex_variation:D
  \__kernel_primitive:NN \XeTeXvariationdefault       \xetex_variationdefault:D
  \__kernel_primitive:NN \XeTeXvariationmax           \xetex_variationmax:D
  \__kernel_primitive:NN \XeTeXvariationmin           \xetex_variationmin:D
  \__kernel_primitive:NN \XeTeXvariationname          \xetex_variationname:D
  \__kernel_primitive:NN \XeTeXrevision               \xetex_XeTeXrevision:D
  \__kernel_primitive:NN \XeTeXversion                \xetex_XeTeXversion:D
  \__kernel_primitive:NN \ifprimitive                 \pdftex_ifprimitive:D
  \__kernel_primitive:NN \primitive                   \pdftex_primitive:D
  \__kernel_primitive:NN \shellescape                 \pdftex_shellescape:D
  \__kernel_primitive:NN \alignmark                   \luatex_alignmark:D
  \__kernel_primitive:NN \aligntab                    \luatex_aligntab:D
  \__kernel_primitive:NN \attribute                   \luatex_attribute:D
  \__kernel_primitive:NN \attributedef                \luatex_attributedef:D
  \__kernel_primitive:NN \automatichyphenpenalty      \luatex_automatichyphenpenalty:D
  \__kernel_primitive:NN \begincsname                 \luatex_begincsname:D
  \__kernel_primitive:NN \catcodetable                \luatex_catcodetable:D
  \__kernel_primitive:NN \clearmarks                  \luatex_clearmarks:D
  \__kernel_primitive:NN \crampeddisplaystyle         \luatex_crampeddisplaystyle:D
  \__kernel_primitive:NN \crampedscriptscriptstyle    \luatex_crampedscriptscriptstyle:D
  \__kernel_primitive:NN \crampedscriptstyle          \luatex_crampedscriptstyle:D
  \__kernel_primitive:NN \crampedtextstyle            \luatex_crampedtextstyle:D
  \__kernel_primitive:NN \directlua                   \luatex_directlua:D
  \__kernel_primitive:NN \dviextension                \luatex_dviextension:D
  \__kernel_primitive:NN \dvifeedback                 \luatex_dvifeedback:D
  \__kernel_primitive:NN \dvivariable                 \luatex_dvivariable:D
  \__kernel_primitive:NN \etoksapp                    \luatex_etoksapp:D
  \__kernel_primitive:NN \etokspre                    \luatex_etokspre:D
  \__kernel_primitive:NN \explicithyphenpenalty       \luatex_explicithyphenpenalty:D
  \__kernel_primitive:NN \expanded                    \luatex_expanded:D
  \__kernel_primitive:NN \firstvalidlanguage          \luatex_firstvalidlanguage:D
  \__kernel_primitive:NN \fontid                      \luatex_fontid:D
  \__kernel_primitive:NN \formatname                  \luatex_formatname:D
  \__kernel_primitive:NN \hjcode                      \luatex_hjcode:D
  \__kernel_primitive:NN \hpack                       \luatex_hpack:D
  \__kernel_primitive:NN \hyphenationbounds           \luatex_hyphenationbounds:D
  \__kernel_primitive:NN \hyphenationmin              \luatex_hyphenationmin:D
  \__kernel_primitive:NN \hyphenpenaltymode           \luatex_hyphenpenaltymode:D
  \__kernel_primitive:NN \gleaders                    \luatex_gleaders:D
  \__kernel_primitive:NN \initcatcodetable            \luatex_initcatcodetable:D
  \__kernel_primitive:NN \lastnamedcs                 \luatex_lastnamedcs:D
  \__kernel_primitive:NN \latelua                     \luatex_latelua:D
  \__kernel_primitive:NN \letcharcode                 \luatex_letcharcode:D
  \__kernel_primitive:NN \luaescapestring             \luatex_luaescapestring:D
  \__kernel_primitive:NN \luafunction                 \luatex_luafunction:D
  \__kernel_primitive:NN \luatexbanner                \luatex_luatexbanner:D
  \__kernel_primitive:NN \luatexdatestamp             \luatex_luatexdatestamp:D
  \__kernel_primitive:NN \luatexrevision              \luatex_luatexrevision:D
  \__kernel_primitive:NN \luatexversion               \luatex_luatexversion:D
  \__kernel_primitive:NN \mathdisplayskipmode         \luatex_mathdisplayskipmode:D
  \__kernel_primitive:NN \matheqnogapstep             \luatex_matheqnogapstep:D
  \__kernel_primitive:NN \mathnolimitsmode            \luatex_mathnolimitsmode:D
  \__kernel_primitive:NN \mathoption                  \luatex_mathoption:D
  \__kernel_primitive:NN \mathrulesfam                \luatex_mathrulesfam:D
  \__kernel_primitive:NN \mathscriptsmode             \luatex_mathscriptsmode:D
  \__kernel_primitive:NN \mathstyle                   \luatex_mathstyle:D
  \__kernel_primitive:NN \mathsurroundmode            \luatex_mathsurroundmode:D
  \__kernel_primitive:NN \mathsurroundskip            \luatex_mathsurroundskip:D
  \__kernel_primitive:NN \nohrule                     \luatex_nohrule:D
  \__kernel_primitive:NN \nokerns                     \luatex_nokerns:D
  \__kernel_primitive:NN \noligs                      \luatex_noligs:D
  \__kernel_primitive:NN \nospaces                    \luatex_nospaces:D
  \__kernel_primitive:NN \novrule                     \luatex_novrule:D
  \__kernel_primitive:NN \outputbox                   \luatex_outputbox:D
  \__kernel_primitive:NN \pagebottomoffset            \luatex_pagebottomoffset:D
  \__kernel_primitive:NN \pageleftoffset              \luatex_pageleftoffset:D
  \__kernel_primitive:NN \pagerightoffset             \luatex_pagerightoffset:D
  \__kernel_primitive:NN \pagetopoffset               \luatex_pagetopoffset:D
  \__kernel_primitive:NN \pdfextension                \luatex_pdfextension:D
  \__kernel_primitive:NN \pdffeedback                 \luatex_pdffeedback:D
  \__kernel_primitive:NN \pdfvariable                 \luatex_pdfvariable:D
  \__kernel_primitive:NN \postexhyphenchar            \luatex_postexhyphenchar:D
  \__kernel_primitive:NN \posthyphenchar              \luatex_posthyphenchar:D
  \__kernel_primitive:NN \predisplaygapfactor         \luatex_predisplaygapfactor:D
  \__kernel_primitive:NN \preexhyphenchar             \luatex_preexhyphenchar:D
  \__kernel_primitive:NN \prehyphenchar               \luatex_prehyphenchar:D
  \__kernel_primitive:NN \savecatcodetable            \luatex_savecatcodetable:D
  \__kernel_primitive:NN \scantextokens               \luatex_scantextokens:D
  \__kernel_primitive:NN \setfontid                   \luatex_setfontid:D
  \__kernel_primitive:NN \shapemode                   \luatex_shapemode:D
  \__kernel_primitive:NN \suppressifcsnameerror       \luatex_suppressifcsnameerror:D
  \__kernel_primitive:NN \suppresslongerror           \luatex_suppresslongerror:D
  \__kernel_primitive:NN \suppressmathparerror        \luatex_suppressmathparerror:D
  \__kernel_primitive:NN \suppressoutererror          \luatex_suppressoutererror:D
  \__kernel_primitive:NN \toksapp                     \luatex_toksapp:D
  \__kernel_primitive:NN \tokspre                     \luatex_tokspre:D
  \__kernel_primitive:NN \tpack                       \luatex_tpack:D
  \__kernel_primitive:NN \vpack                       \luatex_vpack:D
  \__kernel_primitive:NN \bodydir                     \luatex_bodydir:D
  \__kernel_primitive:NN \boxdir                      \luatex_boxdir:D
  \__kernel_primitive:NN \leftghost                   \luatex_leftghost:D
  \__kernel_primitive:NN \linedir                     \luatex_linedir:D
  \__kernel_primitive:NN \localbrokenpenalty          \luatex_localbrokenpenalty:D
  \__kernel_primitive:NN \localinterlinepenalty       \luatex_localinterlinepenalty:D
  \__kernel_primitive:NN \localleftbox                \luatex_localleftbox:D
  \__kernel_primitive:NN \localrightbox               \luatex_localrightbox:D
  \__kernel_primitive:NN \mathdir                     \luatex_mathdir:D
  \__kernel_primitive:NN \pagedir                     \luatex_pagedir:D
  \__kernel_primitive:NN \pardir                      \luatex_pardir:D
  \__kernel_primitive:NN \rightghost                  \luatex_rightghost:D
  \__kernel_primitive:NN \textdir                     \luatex_textdir:D
  \__kernel_primitive:NN \adjustspacing               \pdftex_adjustspacing:D
  \__kernel_primitive:NN \copyfont                    \pdftex_copyfont:D
  \__kernel_primitive:NN \draftmode                   \pdftex_draftmode:D
  \__kernel_primitive:NN \expandglyphsinfont          \pdftex_fontexpand:D
  \__kernel_primitive:NN \ifabsdim                    \pdftex_ifabsdim:D
  \__kernel_primitive:NN \ifabsnum                    \pdftex_ifabsnum:D
  \__kernel_primitive:NN \ignoreligaturesinfont       \pdftex_ignoreligaturesinfont:D
  \__kernel_primitive:NN \insertht                    \pdftex_insertht:D
  \__kernel_primitive:NN \lastsavedboxresourceindex   \pdftex_pdflastxform:D
  \__kernel_primitive:NN \lastsavedimageresourceindex \pdftex_pdflastximage:D
  \__kernel_primitive:NN \lastsavedimageresourcepages \pdftex_pdflastximagepages:D
  \__kernel_primitive:NN \lastxpos                    \pdftex_lastxpos:D
  \__kernel_primitive:NN \lastypos                    \pdftex_lastypos:D
  \__kernel_primitive:NN \normaldeviate               \pdftex_normaldeviate:D
  \__kernel_primitive:NN \outputmode                  \pdftex_pdfoutput:D
  \__kernel_primitive:NN \pageheight                  \pdftex_pageheight:D
  \__kernel_primitive:NN \pagewidth                   \pdftex_pagewith:D
  \__kernel_primitive:NN \protrudechars               \pdftex_protrudechars:D
  \__kernel_primitive:NN \pxdimen                     \pdftex_pxdimen:D
  \__kernel_primitive:NN \randomseed                  \pdftex_randomseed:D
  \__kernel_primitive:NN \useboxresource              \pdftex_pdfrefxform:D
  \__kernel_primitive:NN \useimageresource            \pdftex_pdfrefximage:D
  \__kernel_primitive:NN \savepos                     \pdftex_savepos:D
  \__kernel_primitive:NN \saveboxresource             \pdftex_pdfxform:D
  \__kernel_primitive:NN \saveimageresource           \pdftex_pdfximage:D
  \__kernel_primitive:NN \setrandomseed               \pdftex_setrandomseed:D
  \__kernel_primitive:NN \tracingfonts                \pdftex_tracingfonts:D
  \__kernel_primitive:NN \uniformdeviate              \pdftex_uniformdeviate:D
  \__kernel_primitive:NN \Uchar                       \utex_char:D
  \__kernel_primitive:NN \Ucharcat                    \utex_charcat:D
  \__kernel_primitive:NN \Udelcode                    \utex_delcode:D
  \__kernel_primitive:NN \Udelcodenum                 \utex_delcodenum:D
  \__kernel_primitive:NN \Udelimiter                  \utex_delimiter:D
  \__kernel_primitive:NN \Udelimiterover              \utex_delimiterover:D
  \__kernel_primitive:NN \Udelimiterunder             \utex_delimiterunder:D
  \__kernel_primitive:NN \Uhextensible                \utex_hextensible:D
  \__kernel_primitive:NN \Umathaccent                 \utex_mathaccent:D
  \__kernel_primitive:NN \Umathaxis                   \utex_mathaxis:D
  \__kernel_primitive:NN \Umathbinbinspacing          \utex_binbinspacing:D
  \__kernel_primitive:NN \Umathbinclosespacing        \utex_binclosespacing:D
  \__kernel_primitive:NN \Umathbininnerspacing        \utex_bininnerspacing:D
  \__kernel_primitive:NN \Umathbinopenspacing         \utex_binopenspacing:D
  \__kernel_primitive:NN \Umathbinopspacing           \utex_binopspacing:D
  \__kernel_primitive:NN \Umathbinordspacing          \utex_binordspacing:D
  \__kernel_primitive:NN \Umathbinpunctspacing        \utex_binpunctspacing:D
  \__kernel_primitive:NN \Umathbinrelspacing          \utex_binrelspacing:D
  \__kernel_primitive:NN \Umathchar                   \utex_mathchar:D
  \__kernel_primitive:NN \Umathcharclass              \utex_mathcharclass:D
  \__kernel_primitive:NN \Umathchardef                \utex_mathchardef:D
  \__kernel_primitive:NN \Umathcharfam                \utex_mathcharfam:D
  \__kernel_primitive:NN \Umathcharnum                \utex_mathcharnum:D
  \__kernel_primitive:NN \Umathcharnumdef             \utex_mathcharnumdef:D
  \__kernel_primitive:NN \Umathcharslot               \utex_mathcharslot:D
  \__kernel_primitive:NN \Umathclosebinspacing        \utex_closebinspacing:D
  \__kernel_primitive:NN \Umathcloseclosespacing      \utex_closeclosespacing:D
  \__kernel_primitive:NN \Umathcloseinnerspacing      \utex_closeinnerspacing:D
  \__kernel_primitive:NN \Umathcloseopenspacing       \utex_closeopenspacing:D
  \__kernel_primitive:NN \Umathcloseopspacing         \utex_closeopspacing:D
  \__kernel_primitive:NN \Umathcloseordspacing        \utex_closeordspacing:D
  \__kernel_primitive:NN \Umathclosepunctspacing      \utex_closepunctspacing:D
  \__kernel_primitive:NN \Umathcloserelspacing        \utex_closerelspacing:D
  \__kernel_primitive:NN \Umathcode                   \utex_mathcode:D
  \__kernel_primitive:NN \Umathcodenum                \utex_mathcodenum:D
  \__kernel_primitive:NN \Umathconnectoroverlapmin    \utex_connectoroverlapmin:D
  \__kernel_primitive:NN \Umathfractiondelsize        \utex_fractiondelsize:D
  \__kernel_primitive:NN \Umathfractiondenomdown      \utex_fractiondenomdown:D
  \__kernel_primitive:NN \Umathfractiondenomvgap      \utex_fractiondenomvgap:D
  \__kernel_primitive:NN \Umathfractionnumup          \utex_fractionnumup:D
  \__kernel_primitive:NN \Umathfractionnumvgap        \utex_fractionnumvgap:D
  \__kernel_primitive:NN \Umathfractionrule           \utex_fractionrule:D
  \__kernel_primitive:NN \Umathinnerbinspacing        \utex_innerbinspacing:D
  \__kernel_primitive:NN \Umathinnerclosespacing      \utex_innerclosespacing:D
  \__kernel_primitive:NN \Umathinnerinnerspacing      \utex_innerinnerspacing:D
  \__kernel_primitive:NN \Umathinneropenspacing       \utex_inneropenspacing:D
  \__kernel_primitive:NN \Umathinneropspacing         \utex_inneropspacing:D
  \__kernel_primitive:NN \Umathinnerordspacing        \utex_innerordspacing:D
  \__kernel_primitive:NN \Umathinnerpunctspacing      \utex_innerpunctspacing:D
  \__kernel_primitive:NN \Umathinnerrelspacing        \utex_innerrelspacing:D
  \__kernel_primitive:NN \Umathlimitabovebgap         \utex_limitabovebgap:D
  \__kernel_primitive:NN \Umathlimitabovekern         \utex_limitabovekern:D
  \__kernel_primitive:NN \Umathlimitabovevgap         \utex_limitabovevgap:D
  \__kernel_primitive:NN \Umathlimitbelowbgap         \utex_limitbelowbgap:D
  \__kernel_primitive:NN \Umathlimitbelowkern         \utex_limitbelowkern:D
  \__kernel_primitive:NN \Umathlimitbelowvgap         \utex_limitbelowvgap:D
  \__kernel_primitive:NN \Umathnolimitsubfactor       \utex_nolimitsubfactor:D
  \__kernel_primitive:NN \Umathnolimitsupfactor       \utex_nolimitsupfactor:D
  \__kernel_primitive:NN \Umathopbinspacing           \utex_opbinspacing:D
  \__kernel_primitive:NN \Umathopclosespacing         \utex_opclosespacing:D
  \__kernel_primitive:NN \Umathopenbinspacing         \utex_openbinspacing:D
  \__kernel_primitive:NN \Umathopenclosespacing       \utex_openclosespacing:D
  \__kernel_primitive:NN \Umathopeninnerspacing       \utex_openinnerspacing:D
  \__kernel_primitive:NN \Umathopenopenspacing        \utex_openopenspacing:D
  \__kernel_primitive:NN \Umathopenopspacing          \utex_openopspacing:D
  \__kernel_primitive:NN \Umathopenordspacing         \utex_openordspacing:D
  \__kernel_primitive:NN \Umathopenpunctspacing       \utex_openpunctspacing:D
  \__kernel_primitive:NN \Umathopenrelspacing         \utex_openrelspacing:D
  \__kernel_primitive:NN \Umathoperatorsize           \utex_operatorsize:D
  \__kernel_primitive:NN \Umathopinnerspacing         \utex_opinnerspacing:D
  \__kernel_primitive:NN \Umathopopenspacing          \utex_opopenspacing:D
  \__kernel_primitive:NN \Umathopopspacing            \utex_opopspacing:D
  \__kernel_primitive:NN \Umathopordspacing           \utex_opordspacing:D
  \__kernel_primitive:NN \Umathoppunctspacing         \utex_oppunctspacing:D
  \__kernel_primitive:NN \Umathoprelspacing           \utex_oprelspacing:D
  \__kernel_primitive:NN \Umathordbinspacing          \utex_ordbinspacing:D
  \__kernel_primitive:NN \Umathordclosespacing        \utex_ordclosespacing:D
  \__kernel_primitive:NN \Umathordinnerspacing        \utex_ordinnerspacing:D
  \__kernel_primitive:NN \Umathordopenspacing         \utex_ordopenspacing:D
  \__kernel_primitive:NN \Umathordopspacing           \utex_ordopspacing:D
  \__kernel_primitive:NN \Umathordordspacing          \utex_ordordspacing:D
  \__kernel_primitive:NN \Umathordpunctspacing        \utex_ordpunctspacing:D
  \__kernel_primitive:NN \Umathordrelspacing          \utex_ordrelspacing:D
  \__kernel_primitive:NN \Umathoverbarkern            \utex_overbarkern:D
  \__kernel_primitive:NN \Umathoverbarrule            \utex_overbarrule:D
  \__kernel_primitive:NN \Umathoverbarvgap            \utex_overbarvgap:D
  \__kernel_primitive:NN \Umathoverdelimiterbgap      \utex_overdelimiterbgap:D
  \__kernel_primitive:NN \Umathoverdelimitervgap      \utex_overdelimitervgap:D
  \__kernel_primitive:NN \Umathpunctbinspacing        \utex_punctbinspacing:D
  \__kernel_primitive:NN \Umathpunctclosespacing      \utex_punctclosespacing:D
  \__kernel_primitive:NN \Umathpunctinnerspacing      \utex_punctinnerspacing:D
  \__kernel_primitive:NN \Umathpunctopenspacing       \utex_punctopenspacing:D
  \__kernel_primitive:NN \Umathpunctopspacing         \utex_punctopspacing:D
  \__kernel_primitive:NN \Umathpunctordspacing        \utex_punctordspacing:D
  \__kernel_primitive:NN \Umathpunctpunctspacing      \utex_punctpunctspacing:D
  \__kernel_primitive:NN \Umathpunctrelspacing        \utex_punctrelspacing:D
  \__kernel_primitive:NN \Umathquad                   \utex_quad:D
  \__kernel_primitive:NN \Umathradicaldegreeafter     \utex_radicaldegreeafter:D
  \__kernel_primitive:NN \Umathradicaldegreebefore    \utex_radicaldegreebefore:D
  \__kernel_primitive:NN \Umathradicaldegreeraise     \utex_radicaldegreeraise:D
  \__kernel_primitive:NN \Umathradicalkern            \utex_radicalkern:D
  \__kernel_primitive:NN \Umathradicalrule            \utex_radicalrule:D
  \__kernel_primitive:NN \Umathradicalvgap            \utex_radicalvgap:D
  \__kernel_primitive:NN \Umathrelbinspacing          \utex_relbinspacing:D
  \__kernel_primitive:NN \Umathrelclosespacing        \utex_relclosespacing:D
  \__kernel_primitive:NN \Umathrelinnerspacing        \utex_relinnerspacing:D
  \__kernel_primitive:NN \Umathrelopenspacing         \utex_relopenspacing:D
  \__kernel_primitive:NN \Umathrelopspacing           \utex_relopspacing:D
  \__kernel_primitive:NN \Umathrelordspacing          \utex_relordspacing:D
  \__kernel_primitive:NN \Umathrelpunctspacing        \utex_relpunctspacing:D
  \__kernel_primitive:NN \Umathrelrelspacing          \utex_relrelspacing:D
  \__kernel_primitive:NN \Umathskewedfractionhgap     \utex_skewedfractionhgap:D
  \__kernel_primitive:NN \Umathskewedfractionvgap     \utex_skewedfractionvgap:D
  \__kernel_primitive:NN \Umathspaceafterscript       \utex_spaceafterscript:D
  \__kernel_primitive:NN \Umathstackdenomdown         \utex_stackdenomdown:D
  \__kernel_primitive:NN \Umathstacknumup             \utex_stacknumup:D
  \__kernel_primitive:NN \Umathstackvgap              \utex_stackvgap:D
  \__kernel_primitive:NN \Umathsubshiftdown           \utex_subshiftdown:D
  \__kernel_primitive:NN \Umathsubshiftdrop           \utex_subshiftdrop:D
  \__kernel_primitive:NN \Umathsubsupshiftdown        \utex_subsupshiftdown:D
  \__kernel_primitive:NN \Umathsubsupvgap             \utex_subsupvgap:D
  \__kernel_primitive:NN \Umathsubtopmax              \utex_subtopmax:D
  \__kernel_primitive:NN \Umathsupbottommin           \utex_supbottommin:D
  \__kernel_primitive:NN \Umathsupshiftdrop           \utex_supshiftdrop:D
  \__kernel_primitive:NN \Umathsupshiftup             \utex_supshiftup:D
  \__kernel_primitive:NN \Umathsupsubbottommax        \utex_supsubbottommax:D
  \__kernel_primitive:NN \Umathunderbarkern           \utex_underbarkern:D
  \__kernel_primitive:NN \Umathunderbarrule           \utex_underbarrule:D
  \__kernel_primitive:NN \Umathunderbarvgap           \utex_underbarvgap:D
  \__kernel_primitive:NN \Umathunderdelimiterbgap     \utex_underdelimiterbgap:D
  \__kernel_primitive:NN \Umathunderdelimitervgap     \utex_underdelimitervgap:D
  \__kernel_primitive:NN \Uoverdelimiter              \utex_overdelimiter:D
  \__kernel_primitive:NN \Uradical                    \utex_radical:D
  \__kernel_primitive:NN \Uroot                       \utex_root:D
  \__kernel_primitive:NN \Uskewed                     \utex_skewed:D
  \__kernel_primitive:NN \Uskewedwithdelims           \utex_skewedwithdelims:D
  \__kernel_primitive:NN \Ustack                      \utex_stack:D
  \__kernel_primitive:NN \Ustartdisplaymath           \utex_startdisplaymath:D
  \__kernel_primitive:NN \Ustartmath                  \utex_startmath:D
  \__kernel_primitive:NN \Ustopdisplaymath            \utex_stopdisplaymath:D
  \__kernel_primitive:NN \Ustopmath                   \utex_stopmath:D
  \__kernel_primitive:NN \Usubscript                  \utex_subscript:D
  \__kernel_primitive:NN \Usuperscript                \utex_superscript:D
  \__kernel_primitive:NN \Uunderdelimiter             \utex_underdelimiter:D
  \__kernel_primitive:NN \Uvextensible                \utex_vextensible:D
  \__kernel_primitive:NN \autospacing                 \ptex_autospacing:D
  \__kernel_primitive:NN \autoxspacing                \ptex_autoxspacing:D
  \__kernel_primitive:NN \dtou                        \ptex_dtou:D
  \__kernel_primitive:NN \euc                         \ptex_euc:D
  \__kernel_primitive:NN \ifdbox                      \ptex_ifdbox:D
  \__kernel_primitive:NN \ifddir                      \ptex_ifddir:D
  \__kernel_primitive:NN \ifmdir                      \ptex_ifmdir:D
  \__kernel_primitive:NN \iftbox                      \ptex_iftbox:D
  \__kernel_primitive:NN \iftdir                      \ptex_iftdir:D
  \__kernel_primitive:NN \ifybox                      \ptex_ifybox:D
  \__kernel_primitive:NN \ifydir                      \ptex_ifydir:D
  \__kernel_primitive:NN \inhibitglue                 \ptex_inhibitglue:D
  \__kernel_primitive:NN \inhibitxspcode              \ptex_inhibitxspcode:D
  \__kernel_primitive:NN \jcharwidowpenalty           \ptex_jcharwidowpenalty:D
  \__kernel_primitive:NN \jfam                        \ptex_jfam:D
  \__kernel_primitive:NN \jfont                       \ptex_jfont:D
  \__kernel_primitive:NN \jis                         \ptex_jis:D
  \__kernel_primitive:NN \kanjiskip                   \ptex_kanjiskip:D
  \__kernel_primitive:NN \kansuji                     \ptex_kansuji:D
  \__kernel_primitive:NN \kansujichar                 \ptex_kansujichar:D
  \__kernel_primitive:NN \kcatcode                    \ptex_kcatcode:D
  \__kernel_primitive:NN \kuten                       \ptex_kuten:D
  \__kernel_primitive:NN \noautospacing               \ptex_noautospacing:D
  \__kernel_primitive:NN \noautoxspacing              \ptex_noautoxspacing:D
  \__kernel_primitive:NN \postbreakpenalty            \ptex_postbreakpenalty:D
  \__kernel_primitive:NN \prebreakpenalty             \ptex_prebreakpenalty:D
  \__kernel_primitive:NN \showmode                    \ptex_showmode:D
  \__kernel_primitive:NN \sjis                        \ptex_sjis:D
  \__kernel_primitive:NN \tate                        \ptex_tate:D
  \__kernel_primitive:NN \tbaselineshift              \ptex_tbaselineshift:D
  \__kernel_primitive:NN \tfont                       \ptex_tfont:D
  \__kernel_primitive:NN \xkanjiskip                  \ptex_xkanjiskip:D
  \__kernel_primitive:NN \xspcode                     \ptex_xspcode:D
  \__kernel_primitive:NN \ybaselineshift              \ptex_ybaselineshift:D
  \__kernel_primitive:NN \yoko                        \ptex_yoko:D
  \__kernel_primitive:NN \disablecjktoken             \uptex_disablecjktoken:D
  \__kernel_primitive:NN \enablecjktoken              \uptex_enablecjktoken:D
  \__kernel_primitive:NN \forcecjktoken               \uptex_forcecjktoken:D
  \__kernel_primitive:NN \kchar                       \uptex_kchar:D
  \__kernel_primitive:NN \kchardef                    \uptex_kchardef:D
  \__kernel_primitive:NN \kuten                       \uptex_kuten:D
  \__kernel_primitive:NN \ucs                         \uptex_ucs:D
\tex_endgroup:D
\etex_ifdefined:D \@@end
  \tex_let:D \tex_end:D                  \@@end
  \tex_let:D \tex_everydisplay:D         \frozen@everydisplay
  \tex_let:D \tex_everymath:D            \frozen@everymath
  \tex_let:D \tex_hyphen:D               \@@hyph
  \tex_let:D \tex_input:D                \@@input
  \tex_let:D \tex_italiccorrection:D     \@@italiccorr
  \tex_let:D \tex_underline:D            \@@underline
  \tex_let:D \pdftex_tracingfonts:D \tex_undefined:D
  \etex_ifdefined:D \pdftracingfonts
    \tex_let:D \pdftex_tracingfonts:D \pdftracingfonts
  \tex_else:D
    \etex_ifdefined:D \luatex_directlua:D
      \luatex_directlua:D { tex.enableprimitives("@@", {"tracingfonts"}) }
      \tex_let:D \pdftex_tracingfonts:D \luatextracingfonts
    \tex_fi:D
  \tex_fi:D
\tex_fi:D
\etex_ifdefined:D \luatexsuppressfontnotfounderror
  \tex_let:D \luatex_alignmark:D                 \luatexalignmark
  \tex_let:D \luatex_aligntab:D                  \luatexaligntab
  \tex_let:D \luatex_attribute:D                 \luatexattribute
  \tex_let:D \luatex_attributedef:D              \luatexattributedef
  \tex_let:D \luatex_catcodetable:D              \luatexcatcodetable
  \tex_let:D \luatex_clearmarks:D                \luatexclearmarks
  \tex_let:D \luatex_crampeddisplaystyle:D       \luatexcrampeddisplaystyle
  \tex_let:D \luatex_crampedscriptscriptstyle:D  \luatexcrampedscriptscriptstyle
  \tex_let:D \luatex_crampedscriptstyle:D        \luatexcrampedscriptstyle
  \tex_let:D \luatex_crampedtextstyle:D          \luatexcrampedtextstyle
  \tex_let:D \luatex_fontid:D                    \luatexfontid
  \tex_let:D \luatex_formatname:D                \luatexformatname
  \tex_let:D \luatex_gleaders:D                  \luatexgleaders
  \tex_let:D \luatex_initcatcodetable:D          \luatexinitcatcodetable
  \tex_let:D \luatex_latelua:D                   \luatexlatelua
  \tex_let:D \luatex_luaescapestring:D           \luatexluaescapestring
  \tex_let:D \luatex_luafunction:D               \luatexluafunction
  \tex_let:D \luatex_mathstyle:D                 \luatexmathstyle
  \tex_let:D \luatex_nokerns:D                   \luatexnokerns
  \tex_let:D \luatex_noligs:D                    \luatexnoligs
  \tex_let:D \luatex_outputbox:D                 \luatexoutputbox
  \tex_let:D \luatex_pageleftoffset:D            \luatexpageleftoffset
  \tex_let:D \luatex_pagetopoffset:D             \luatexpagetopoffset
  \tex_let:D \luatex_postexhyphenchar:D          \luatexpostexhyphenchar
  \tex_let:D \luatex_posthyphenchar:D            \luatexposthyphenchar
  \tex_let:D \luatex_preexhyphenchar:D           \luatexpreexhyphenchar
  \tex_let:D \luatex_prehyphenchar:D             \luatexprehyphenchar
  \tex_let:D \luatex_savecatcodetable:D          \luatexsavecatcodetable
  \tex_let:D \luatex_scantextokens:D             \luatexscantextokens
  \tex_let:D \luatex_suppressifcsnameerror:D     \luatexsuppressifcsnameerror
  \tex_let:D \luatex_suppresslongerror:D         \luatexsuppresslongerror
  \tex_let:D \luatex_suppressmathparerror:D      \luatexsuppressmathparerror
  \tex_let:D \luatex_suppressoutererror:D        \luatexsuppressoutererror
  \tex_let:D \utex_char:D                        \luatexUchar
  \tex_let:D \xetex_suppressfontnotfounderror:D  \luatexsuppressfontnotfounderror
  \tex_let:D \luatex_bodydir:D               \luatexbodydir
  \tex_let:D \luatex_boxdir:D                \luatexboxdir
  \tex_let:D \luatex_leftghost:D             \luatexleftghost
  \tex_let:D \luatex_localbrokenpenalty:D    \luatexlocalbrokenpenalty
  \tex_let:D \luatex_localinterlinepenalty:D \luatexlocalinterlinepenalty
  \tex_let:D \luatex_localleftbox:D          \luatexlocalleftbox
  \tex_let:D \luatex_localrightbox:D         \luatexlocalrightbox
  \tex_let:D \luatex_mathdir:D               \luatexmathdir
  \tex_let:D \luatex_pagebottomoffset:D      \luatexpagebottomoffset
  \tex_let:D \luatex_pagedir:D               \luatexpagedir
  \tex_let:D \pdftex_pageheight:D            \luatexpageheight
  \tex_let:D \luatex_pagerightoffset:D       \luatexpagerightoffset
  \tex_let:D \pdftex_pagewidth:D             \luatexpagewidth
  \tex_let:D \luatex_pardir:D                \luatexpardir
  \tex_let:D \luatex_rightghost:D            \luatexrightghost
  \tex_let:D \luatex_textdir:D               \luatextextdir
\tex_fi:D
\tex_ifnum:D 0
  \etex_ifdefined:D \pdftex_pdftexversion:D 1 \tex_fi:D
  \etex_ifdefined:D \luatex_luatexversion:D 1 \tex_fi:D
    = 0 %
  \tex_let:D \pdftex_mapfile:D \tex_undefined:D
  \tex_let:D \pdftex_mapline:D \tex_undefined:D
\tex_fi:D
\etex_ifdefined:D \XeTeXdelcode
  \tex_let:D \utex_delcode:D        \XeTeXdelcode
  \tex_let:D \utex_delcodenum:D     \XeTeXdelcodenum
  \tex_let:D \utex_delimiter:D      \XeTeXdelimiter
  \tex_let:D \utex_mathaccent:D     \XeTeXmathaccent
  \tex_let:D \utex_mathchar:D       \XeTeXmathchar
  \tex_let:D \utex_mathchardef:D    \XeTeXmathchardef
  \tex_let:D \utex_mathcharnum:D    \XeTeXmathcharnum
  \tex_let:D \utex_mathcharnumdef:D \XeTeXmathcharnumdef
  \tex_let:D \utex_mathcode:D       \XeTeXmathcode
  \tex_let:D \utex_mathcodenum:D    \XeTeXmathcodenum
\tex_fi:D
\etex_ifdefined:D \luatex_luatexversion:D
  \tex_let:D \pdftex_pdftexbanner:D   \tex_undefined:D
  \tex_let:D \pdftex_pdftexrevision:D \tex_undefined:D
  \tex_let:D \pdftex_pdftexversion:D  \tex_undefined:D
\tex_fi:D
\etex_ifdefined:D \normalend
  \tex_let:D \tex_end:D         \normalend
  \tex_let:D \tex_everyjob:D    \normaleveryjob
  \tex_let:D \tex_input:D       \normalinput
  \tex_let:D \tex_language:D    \normallanguage
  \tex_let:D \tex_mathop:D      \normalmathop
  \tex_let:D \tex_month:D       \normalmonth
  \tex_let:D \tex_outer:D       \normalouter
  \tex_let:D \tex_over:D        \normalover
  \tex_let:D \tex_vcenter:D     \normalvcenter
  \tex_let:D \etex_unexpanded:D \normalunexpanded
  \tex_let:D \luatex_expanded:D \normalexpanded
\tex_fi:D
\etex_ifdefined:D \normalitaliccorrection
  \tex_let:D \tex_hoffset:D          \normalhoffset
  \tex_let:D \tex_italiccorrection:D \normalitaliccorrection
  \tex_let:D \tex_voffset:D          \normalvoffset
  \tex_let:D \etex_showtokens:D      \normalshowtokens
  \tex_let:D \luatex_bodydir:D       \spac_directions_normal_body_dir
  \tex_let:D \luatex_pagedir:D       \spac_directions_normal_page_dir
\tex_fi:D
\etex_ifdefined:D \normalleft
  \tex_let:D \tex_left:D   \normalleft
  \tex_let:D \tex_middle:D \normalmiddle
  \tex_let:D \tex_right:D  \normalright
\tex_fi:D
%% File: l3basics.dtx Copyright (C) 1990-2017 The LaTeX3 project
\tex_let:D \if_true:           \tex_iftrue:D
\tex_let:D \if_false:          \tex_iffalse:D
\tex_let:D \or:                \tex_or:D
\tex_let:D \else:              \tex_else:D
\tex_let:D \fi:                \tex_fi:D
\tex_let:D \reverse_if:N       \etex_unless:D
\tex_let:D \if:w               \tex_if:D
\tex_let:D \if_charcode:w      \tex_if:D
\tex_let:D \if_catcode:w       \tex_ifcat:D
\tex_let:D \if_meaning:w       \tex_ifx:D
\tex_let:D \if_mode_math:       \tex_ifmmode:D
\tex_let:D \if_mode_horizontal: \tex_ifhmode:D
\tex_let:D \if_mode_vertical:   \tex_ifvmode:D
\tex_let:D \if_mode_inner:      \tex_ifinner:D
\tex_let:D \if_cs_exist:N      \etex_ifdefined:D
\tex_let:D \if_cs_exist:w      \etex_ifcsname:D
\tex_let:D \cs:w               \tex_csname:D
\tex_let:D \cs_end:            \tex_endcsname:D
\tex_let:D \exp_after:wN       \tex_expandafter:D
\tex_let:D \exp_not:N          \tex_noexpand:D
\tex_let:D \exp_not:n          \etex_unexpanded:D
\tex_let:D \exp:w              \tex_romannumeral:D
\tex_chardef:D \exp_end:  = 0 ~
\tex_let:D \token_to_meaning:N \tex_meaning:D
\tex_let:D \cs_meaning:N       \tex_meaning:D
\tex_let:D \tl_to_str:n        \etex_detokenize:D
\tex_let:D \token_to_str:N     \tex_string:D
\tex_let:D \scan_stop:         \tex_relax:D
\tex_let:D \group_begin:       \tex_begingroup:D
\tex_let:D \group_end:         \tex_endgroup:D
\tex_let:D \if_int_compare:w   \tex_ifnum:D
\tex_let:D \__int_to_roman:w     \tex_romannumeral:D
\tex_let:D \group_insert_after:N \tex_aftergroup:D
\tex_long:D \tex_def:D \exp_args:Nc #1#2
  { \exp_after:wN #1 \cs:w #2 \cs_end: }
\tex_long:D \tex_def:D \exp_args:cc #1#2
  { \cs:w #1 \exp_after:wN \cs_end: \cs:w #2 \cs_end: }
\tex_def:D \token_to_str:c { \exp_args:Nc \token_to_str:N }
\tex_long:D \tex_def:D \cs_meaning:c #1
  {
    \if_cs_exist:w #1 \cs_end:
      \exp_after:wN \use_i:nn
    \else:
      \exp_after:wN \use_ii:nn
    \fi:
    { \exp_args:Nc \cs_meaning:N {#1} }
    { \tl_to_str:n {undefined} }
  }
\tex_let:D \token_to_meaning:c = \cs_meaning:c
\tex_chardef:D \c_zero    = 0 ~
\etex_ifdefined:D \luatex_luatexversion:D
  \tex_chardef:D \c_max_register_int = 65 535 ~
\tex_else:D
  \tex_mathchardef:D \c_max_register_int = 32 767 ~
\tex_fi:D
\tex_let:D \cs_set_nopar:Npn            \tex_def:D
\tex_let:D \cs_set_nopar:Npx            \tex_edef:D
\etex_protected:D \tex_long:D \tex_def:D \cs_set:Npn
  { \tex_long:D \tex_def:D }
\etex_protected:D \tex_long:D \tex_def:D \cs_set:Npx
  { \tex_long:D \tex_edef:D }
\etex_protected:D \tex_long:D \tex_def:D \cs_set_protected_nopar:Npn
  { \etex_protected:D \tex_def:D }
\etex_protected:D \tex_long:D \tex_def:D \cs_set_protected_nopar:Npx
  { \etex_protected:D \tex_edef:D }
\etex_protected:D \tex_long:D \tex_def:D \cs_set_protected:Npn
  { \etex_protected:D \tex_long:D \tex_def:D }
\etex_protected:D \tex_long:D \tex_def:D \cs_set_protected:Npx
  { \etex_protected:D \tex_long:D \tex_edef:D }
\tex_let:D \cs_gset_nopar:Npn           \tex_gdef:D
\tex_let:D \cs_gset_nopar:Npx           \tex_xdef:D
\cs_set_protected:Npn \cs_gset:Npn
  { \tex_long:D \tex_gdef:D }
\cs_set_protected:Npn \cs_gset:Npx
  { \tex_long:D \tex_xdef:D }
\cs_set_protected:Npn \cs_gset_protected_nopar:Npn
  { \etex_protected:D \tex_gdef:D }
\cs_set_protected:Npn \cs_gset_protected_nopar:Npx
  { \etex_protected:D \tex_xdef:D }
\cs_set_protected:Npn \cs_gset_protected:Npn
  { \etex_protected:D \tex_long:D \tex_gdef:D }
\cs_set_protected:Npn \cs_gset_protected:Npx
  { \etex_protected:D \tex_long:D \tex_xdef:D }
\cs_set_nopar:Npn \l__exp_internal_tl { }
\cs_set:Npn \use:c #1 { \cs:w #1 \cs_end: }
\cs_set_protected:Npn \use:x #1
  {
    \cs_set_nopar:Npx \l__exp_internal_tl {#1}
    \l__exp_internal_tl
  }
\cs_set:Npn \use:n    #1       {#1}
\cs_set:Npn \use:nn   #1#2     {#1#2}
\cs_set:Npn \use:nnn  #1#2#3   {#1#2#3}
\cs_set:Npn \use:nnnn #1#2#3#4 {#1#2#3#4}
\cs_set:Npn \use_i:nn  #1#2 {#1}
\cs_set:Npn \use_ii:nn #1#2 {#2}
\cs_set:Npn \use_i:nnn    #1#2#3 {#1}
\cs_set:Npn \use_ii:nnn   #1#2#3 {#2}
\cs_set:Npn \use_iii:nnn  #1#2#3 {#3}
\cs_set:Npn \use_i_ii:nnn #1#2#3 {#1#2}
\cs_set:Npn \use_i:nnnn   #1#2#3#4 {#1}
\cs_set:Npn \use_ii:nnnn  #1#2#3#4 {#2}
\cs_set:Npn \use_iii:nnnn #1#2#3#4 {#3}
\cs_set:Npn \use_iv:nnnn  #1#2#3#4 {#4}
\cs_set:Npn \use_none_delimit_by_q_nil:w  #1 \q_nil  { }
\cs_set:Npn \use_none_delimit_by_q_stop:w #1 \q_stop { }
\cs_set:Npn \use_none_delimit_by_q_recursion_stop:w #1 \q_recursion_stop { }
\cs_set:Npn \use_i_delimit_by_q_nil:nw  #1#2 \q_nil  {#1}
\cs_set:Npn \use_i_delimit_by_q_stop:nw #1#2 \q_stop {#1}
\cs_set:Npn \use_i_delimit_by_q_recursion_stop:nw #1#2 \q_recursion_stop {#1}
\cs_set:Npn \use_none:n         #1                 { }
\cs_set:Npn \use_none:nn        #1#2               { }
\cs_set:Npn \use_none:nnn       #1#2#3             { }
\cs_set:Npn \use_none:nnnn      #1#2#3#4           { }
\cs_set:Npn \use_none:nnnnn     #1#2#3#4#5         { }
\cs_set:Npn \use_none:nnnnnn    #1#2#3#4#5#6       { }
\cs_set:Npn \use_none:nnnnnnn   #1#2#3#4#5#6#7     { }
\cs_set:Npn \use_none:nnnnnnnn  #1#2#3#4#5#6#7#8   { }
\cs_set:Npn \use_none:nnnnnnnnn #1#2#3#4#5#6#7#8#9 { }
\cs_set:Npn \prg_return_true:
  { \exp_after:wN \use_i:nn  \exp:w }
\cs_set:Npn \prg_return_false:
  { \exp_after:wN \use_ii:nn \exp:w}
\cs_set_protected:Npn \prg_set_conditional:Npnn
  { \__prg_generate_conditional_parm:nnNpnn { set } { } }
\cs_set_protected:Npn \prg_new_conditional:Npnn
  { \__prg_generate_conditional_parm:nnNpnn { new } { } }
\cs_set_protected:Npn \prg_set_protected_conditional:Npnn
  { \__prg_generate_conditional_parm:nnNpnn { set } { _protected } }
\cs_set_protected:Npn \prg_new_protected_conditional:Npnn
  { \__prg_generate_conditional_parm:nnNpnn { new } { _protected } }
\cs_set_protected:Npn \__prg_generate_conditional_parm:nnNpnn #1#2#3#4#
  {
    \__cs_split_function:NN #3 \__prg_generate_conditional:nnNnnnnn
    {#1} {#2} {#4}
  }
\cs_set_protected:Npn \prg_set_conditional:Nnn
  { \__prg_generate_conditional_count:nnNnn { set } { } }
\cs_set_protected:Npn \prg_new_conditional:Nnn
  { \__prg_generate_conditional_count:nnNnn { new } { } }
\cs_set_protected:Npn \prg_set_protected_conditional:Nnn
  { \__prg_generate_conditional_count:nnNnn { set } { _protected } }
\cs_set_protected:Npn \prg_new_protected_conditional:Nnn
  { \__prg_generate_conditional_count:nnNnn { new } { _protected } }
\cs_set_protected:Npn \__prg_generate_conditional_count:nnNnn #1#2#3
  {
    \__cs_split_function:NN #3 \__prg_generate_conditional_count:nnNnnnn
    {#1} {#2}
  }
\cs_set_protected:Npn \__prg_generate_conditional_count:nnNnnnn #1#2#3#4#5
  {
    \__cs_parm_from_arg_count:nnF
      { \__prg_generate_conditional:nnNnnnnn {#1} {#2} #3 {#4} {#5} }
      { \tl_count:n {#2} }
      {
        \__msg_kernel_error:nnxx { kernel } { bad-number-of-arguments }
          { \token_to_str:c { #1 : #2 } }
          { \tl_count:n {#2} }
        \use_none:nn
      }
  }
\cs_set_protected:Npn \__prg_generate_conditional:nnNnnnnn #1#2#3#4#5#6#7#8
  {
    \if_meaning:w \c_false_bool #3
      \__msg_kernel_error:nnx { kernel } { missing-colon }
        { \token_to_str:c {#1} }
      \exp_after:wN \use_none:nn
    \fi:
    \use:x
      {
        \exp_not:N \__prg_generate_conditional:nnnnnnw
        \exp_not:n { {#4} {#5} {#1} {#2} {#6} {#8} }
        \tl_to_str:n {#7}
        \exp_not:n { , \q_recursion_tail , \q_recursion_stop }
      }
  }
\cs_set_protected:Npn \__prg_generate_conditional:nnnnnnw #1#2#3#4#5#6#7 ,
  {
    \if_meaning:w \q_recursion_tail #7
      \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
    \fi:
    \use:c { __prg_generate_ #7 _form:wnnnnnn }
        \tl_if_empty:nF {#7}
          {
            \__msg_kernel_error:nnxx
              { kernel } { conditional-form-unknown }
              {#7} { \token_to_str:c { #3 : #4 } }
          }
        \use_none:nnnnnnn
      \q_stop
      {#1} {#2} {#3} {#4} {#5} {#6}
    \__prg_generate_conditional:nnnnnnw {#1} {#2} {#3} {#4} {#5} {#6}
  }
\cs_set_protected:Npn \__prg_generate_p_form:wnnnnnn
    #1 \q_stop #2#3#4#5#6#7
  {
    \if_meaning:w \scan_stop: #3 \scan_stop:
      \exp_after:wN \use_i:nn
    \else:
      \exp_after:wN \use_ii:nn
    \fi:
      {
        \exp_args:cc { cs_ #2 #3 :Npn } { #4 _p: #5 } #6
          { #7 \exp_end: \c_true_bool \c_false_bool }
      }
      {
        \__msg_kernel_error:nnx { kernel } { protected-predicate }
          { \token_to_str:c { #4 _p: #5 } }
      }
  }
\cs_set_protected:Npn \__prg_generate_T_form:wnnnnnn
    #1 \q_stop #2#3#4#5#6#7
  {
    \exp_args:cc { cs_ #2 #3 :Npn } { #4 : #5 T } #6
      { #7 \exp_end: \use:n \use_none:n }
  }
\cs_set_protected:Npn \__prg_generate_F_form:wnnnnnn
    #1 \q_stop #2#3#4#5#6#7
  {
    \exp_args:cc { cs_ #2 #3 :Npn } { #4 : #5 F } #6
      { #7 \exp_end: { } }
  }
\cs_set_protected:Npn \__prg_generate_TF_form:wnnnnnn
    #1 \q_stop #2#3#4#5#6#7
  {
    \exp_args:cc { cs_ #2 #3 :Npn } { #4 : #5 TF } #6
      { #7 \exp_end: }
  }
\cs_set_protected:Npn \prg_set_eq_conditional:NNn
  { \__prg_set_eq_conditional:NNNn \cs_set_eq:cc }
\cs_set_protected:Npn \prg_new_eq_conditional:NNn
  { \__prg_set_eq_conditional:NNNn \cs_new_eq:cc }
\cs_set_protected:Npn \__prg_set_eq_conditional:NNNn #1#2#3#4
  {
    \use:x
      {
        \exp_not:N \__prg_set_eq_conditional:nnNnnNNw
          \__cs_split_function:NN #2 \prg_do_nothing:
          \__cs_split_function:NN #3 \prg_do_nothing:
          \exp_not:N #1
          \tl_to_str:n {#4}
          \exp_not:n { , \q_recursion_tail , \q_recursion_stop }
      }
  }
\cs_set_protected:Npn \__prg_set_eq_conditional:nnNnnNNw #1#2#3#4#5#6
  {
    \if_meaning:w \c_false_bool #3
      \__msg_kernel_error:nnx { kernel } { missing-colon }
        { \token_to_str:c {#1} }
      \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
    \fi:
    \if_meaning:w \c_false_bool #6
      \__msg_kernel_error:nnx { kernel } { missing-colon }
        { \token_to_str:c {#4} }
      \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
    \fi:
    \__prg_set_eq_conditional_loop:nnnnNw {#1} {#2} {#4} {#5}
  }
\cs_set_protected:Npn \__prg_set_eq_conditional_loop:nnnnNw #1#2#3#4#5#6 ,
  {
    \if_meaning:w \q_recursion_tail #6
      \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
    \fi:
    \use:c { __prg_set_eq_conditional_ #6 _form:wNnnnn }
        \tl_if_empty:nF {#6}
          {
            \__msg_kernel_error:nnxx
              { kernel } { conditional-form-unknown }
              {#6} { \token_to_str:c { #1 : #2 } }
          }
        \use_none:nnnnnn
      \q_stop
      #5 {#1} {#2} {#3} {#4}
    \__prg_set_eq_conditional_loop:nnnnNw {#1} {#2} {#3} {#4} #5
  }
\cs_set:Npn \__prg_set_eq_conditional_p_form:wNnnnn #1 \q_stop #2#3#4#5#6
  {
    \__chk_if_exist_cs:c { #5 _p : #6    }
    #2 { #3 _p : #4    } { #5 _p : #6    }
  }
\cs_set:Npn \__prg_set_eq_conditional_TF_form:wNnnnn #1 \q_stop #2#3#4#5#6
  {
    \__chk_if_exist_cs:c { #5    : #6 TF }
    #2 { #3    : #4 TF } { #5    : #6 TF }
  }
\cs_set:Npn \__prg_set_eq_conditional_T_form:wNnnnn #1 \q_stop #2#3#4#5#6
  {
    \__chk_if_exist_cs:c { #5    : #6 T  }
    #2 { #3    : #4 T  } { #5    : #6 T  }
  }
\cs_set:Npn \__prg_set_eq_conditional_F_form:wNnnnn #1 \q_stop #2#3#4#5#6
  {
    \__chk_if_exist_cs:c { #5    : #6  F }
    #2 { #3    : #4  F } { #5    : #6  F }
  }
\tex_chardef:D \c_true_bool  = 1 ~
\tex_chardef:D \c_false_bool = 0 ~
\cs_set:Npn \cs_to_str:N
  {
    \tex_romannumeral:D
      \if:w \token_to_str:N \ \__cs_to_str:w \fi:
      \exp_after:wN \__cs_to_str:N \token_to_str:N
  }
\cs_set:Npn \__cs_to_str:N #1 { \c_zero }
\cs_set:Npn \__cs_to_str:w #1 \__cs_to_str:N
  { - \__int_value:w \fi: \exp_after:wN \c_zero }
\cs_set:Npx \__cs_split_function:NN #1
  {
    \exp_not:N \exp_after:wN \exp_not:N \exp_after:wN
    \exp_not:N \exp_after:wN \exp_not:N \__cs_split_function_auxi:w
      \exp_not:N \cs_to_str:N #1 \exp_not:N \q_mark \c_true_bool
      \token_to_str:N : \exp_not:N \q_mark \c_false_bool
      \exp_not:N \q_stop
  }
\use:x
  {
    \cs_set:Npn \exp_not:N \__cs_split_function_auxi:w
      ##1 \token_to_str:N : ##2 \exp_not:N \q_mark ##3##4 \exp_not:N \q_stop ##5
  }
  { \__cs_split_function_auxii:w #5 #1 \q_mark \q_stop {#2} #3 }
\cs_set:Npn \__cs_split_function_auxii:w #1#2 \q_mark #3 \q_stop
  { #1 {#2} }
\cs_set:Npn \__cs_get_function_name:N #1
  { \__cs_split_function:NN #1 \use_i:nnn }
\cs_set:Npn \__cs_get_function_signature:N #1
  { \__cs_split_function:NN #1 \use_ii:nnn }
\prg_set_conditional:Npnn \cs_if_exist:N #1 { p , T , F , TF }
  {
    \if_meaning:w #1 \scan_stop:
      \prg_return_false:
    \else:
      \if_cs_exist:N #1
        \prg_return_true:
      \else:
        \prg_return_false:
      \fi:
    \fi:
  }
\prg_set_conditional:Npnn \cs_if_exist:c #1 { p , T , F , TF }
  {
    \if_cs_exist:w #1 \cs_end:
      \exp_after:wN \use_i:nn
    \else:
      \exp_after:wN \use_ii:nn
    \fi:
    {
      \exp_after:wN \if_meaning:w \cs:w #1 \cs_end: \scan_stop:
        \prg_return_false:
      \else:
        \prg_return_true:
      \fi:
    }
    \prg_return_false:
  }
\prg_set_conditional:Npnn \cs_if_free:N #1 { p , T , F , TF }
  {
    \if_meaning:w #1 \scan_stop:
      \prg_return_true:
    \else:
      \if_cs_exist:N #1
        \prg_return_false:
      \else:
        \prg_return_true:
      \fi:
    \fi:
  }
\prg_set_conditional:Npnn \cs_if_free:c #1 { p , T , F , TF }
  {
    \if_cs_exist:w #1 \cs_end:
      \exp_after:wN \use_i:nn
    \else:
      \exp_after:wN \use_ii:nn
    \fi:
      {
        \exp_after:wN \if_meaning:w \cs:w #1 \cs_end: \scan_stop:
          \prg_return_true:
        \else:
          \prg_return_false:
        \fi:
      }
      { \prg_return_true: }
  }
\cs_set:Npn \cs_if_exist_use:NTF #1#2
  { \cs_if_exist:NTF #1 { #1 #2 } }
\cs_set:Npn \cs_if_exist_use:NF #1
  { \cs_if_exist:NTF #1 { #1 } }
\cs_set:Npn \cs_if_exist_use:NT #1 #2
  { \cs_if_exist:NTF #1 { #1 #2 } { } }
\cs_set:Npn \cs_if_exist_use:N #1
  { \cs_if_exist:NTF #1 { #1 } { } }
\cs_set:Npn \cs_if_exist_use:cTF #1#2
  { \cs_if_exist:cTF {#1} { \use:c {#1} #2 } }
\cs_set:Npn \cs_if_exist_use:cF #1
  { \cs_if_exist:cTF {#1} { \use:c {#1} } }
\cs_set:Npn \cs_if_exist_use:cT #1#2
  { \cs_if_exist:cTF {#1} { \use:c {#1} #2 } { } }
\cs_set:Npn \cs_if_exist_use:c #1
  { \cs_if_exist:cTF {#1} { \use:c {#1} } { } }
\cs_set_protected:Npn \iow_log:x
  { \tex_immediate:D \tex_write:D -1 }
\cs_set_protected:Npn \iow_term:x
  { \tex_immediate:D \tex_write:D 16 }
\tex_ifodd:D \l@expl@log@functions@bool
  \cs_set_protected:Npn \__chk_log:x { \iow_log:x }
  \cs_set_protected:Npn \__chk_suspend_log:
    {
      \cs_set_protected:Npx \__chk_resume_log:
        {
          \cs_set_protected:Npn \__chk_resume_log:
            { \exp_not:o { \__chk_resume_log: } }
          \cs_set_protected:Npn \__chk_log:x
            { \exp_not:o { \__chk_log:x } }
        }
      \cs_set_protected:Npn \__chk_log:x { \use_none:n }
    }
  \cs_set_protected:Npn \__chk_resume_log: { }
\else:
  \cs_set_protected:Npn \__chk_log:x { \use_none:n }
  \cs_set_protected:Npn \__chk_suspend_log: { }
  \cs_set_protected:Npn \__chk_resume_log: { }
\fi:
\cs_set_protected:Npn \__msg_kernel_error:nnxx #1#2#3#4
  {
    \tex_newlinechar:D = `\^^J \tex_relax:D
    \tex_errmessage:D
      {
        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!~! ^^J
        Argh,~internal~LaTeX3~error! ^^J ^^J
        Module ~ #1 , ~ message~name~"#2": ^^J
        Arguments~'#3'~and~'#4' ^^J ^^J
        This~is~one~for~The~LaTeX3~Project:~bailing~out
      }
    \tex_end:D
  }
\cs_set_protected:Npn \__msg_kernel_error:nnx #1#2#3
  { \__msg_kernel_error:nnxx {#1} {#2} {#3} { } }
\cs_set_protected:Npn \__msg_kernel_error:nn #1#2
  { \__msg_kernel_error:nnxx {#1} {#2} { } { } }
\cs_set:Npn \msg_line_context:
  { on~line~ \tex_the:D \tex_inputlineno:D }
\cs_set_protected:Npn \__chk_if_free_cs:N #1
  {
    \cs_if_free:NF #1
      {
        \__msg_kernel_error:nnxx { kernel } { command-already-defined }
          { \token_to_str:N #1 } { \token_to_meaning:N #1 }
      }
}
\tex_ifodd:D \l@expl@log@functions@bool
  \cs_set_protected:Npn \__chk_if_free_cs:N #1
    {
      \cs_if_free:NF #1
        {
          \__msg_kernel_error:nnxx { kernel } { command-already-defined }
            { \token_to_str:N #1 } { \token_to_meaning:N #1 }
        }
      \__chk_log:x { Defining~\token_to_str:N #1~ \msg_line_context: }
    }
\fi:
\cs_set_protected:Npn \__chk_if_free_cs:c
  { \exp_args:Nc \__chk_if_free_cs:N }
\tex_ifodd:D \l@expl@check@declarations@bool
  \cs_set_protected:Npn \__chk_if_exist_var:N #1
    {
      \cs_if_exist:NF #1
        {
          \__msg_kernel_error:nnx { check } { non-declared-variable }
            { \token_to_str:N #1 }
        }
    }
\fi:
\cs_set_protected:Npn \__chk_if_exist_cs:N #1
  {
    \cs_if_exist:NF #1
      {
        \__msg_kernel_error:nnx { kernel } { command-not-defined }
          { \token_to_str:N #1 }
      }
  }
\cs_set_protected:Npn \__chk_if_exist_cs:c
  { \exp_args:Nc \__chk_if_exist_cs:N }
\cs_set:Npn \__cs_tmp:w #1#2
  {
    \cs_set_protected:Npn #1 ##1
       {
         \__chk_if_free_cs:N ##1
         #2 ##1
      }
  }
\__cs_tmp:w \cs_new_nopar:Npn           \cs_gset_nopar:Npn
\__cs_tmp:w \cs_new_nopar:Npx           \cs_gset_nopar:Npx
\__cs_tmp:w \cs_new:Npn                 \cs_gset:Npn
\__cs_tmp:w \cs_new:Npx                 \cs_gset:Npx
\__cs_tmp:w \cs_new_protected_nopar:Npn \cs_gset_protected_nopar:Npn
\__cs_tmp:w \cs_new_protected_nopar:Npx \cs_gset_protected_nopar:Npx
\__cs_tmp:w \cs_new_protected:Npn       \cs_gset_protected:Npn
\__cs_tmp:w \cs_new_protected:Npx       \cs_gset_protected:Npx
\cs_set:Npn \__cs_tmp:w #1#2
  { \cs_new_protected_nopar:Npn #1 { \exp_args:Nc #2 } }
\__cs_tmp:w \cs_set_nopar:cpn  \cs_set_nopar:Npn
\__cs_tmp:w \cs_set_nopar:cpx  \cs_set_nopar:Npx
\__cs_tmp:w \cs_gset_nopar:cpn \cs_gset_nopar:Npn
\__cs_tmp:w \cs_gset_nopar:cpx \cs_gset_nopar:Npx
\__cs_tmp:w \cs_new_nopar:cpn  \cs_new_nopar:Npn
\__cs_tmp:w \cs_new_nopar:cpx  \cs_new_nopar:Npx
\__cs_tmp:w \cs_set:cpn  \cs_set:Npn
\__cs_tmp:w \cs_set:cpx  \cs_set:Npx
\__cs_tmp:w \cs_gset:cpn \cs_gset:Npn
\__cs_tmp:w \cs_gset:cpx \cs_gset:Npx
\__cs_tmp:w \cs_new:cpn  \cs_new:Npn
\__cs_tmp:w \cs_new:cpx  \cs_new:Npx
\__cs_tmp:w \cs_set_protected_nopar:cpn  \cs_set_protected_nopar:Npn
\__cs_tmp:w \cs_set_protected_nopar:cpx  \cs_set_protected_nopar:Npx
\__cs_tmp:w \cs_gset_protected_nopar:cpn \cs_gset_protected_nopar:Npn
\__cs_tmp:w \cs_gset_protected_nopar:cpx \cs_gset_protected_nopar:Npx
\__cs_tmp:w \cs_new_protected_nopar:cpn  \cs_new_protected_nopar:Npn
\__cs_tmp:w \cs_new_protected_nopar:cpx  \cs_new_protected_nopar:Npx
\__cs_tmp:w \cs_set_protected:cpn  \cs_set_protected:Npn
\__cs_tmp:w \cs_set_protected:cpx  \cs_set_protected:Npx
\__cs_tmp:w \cs_gset_protected:cpn \cs_gset_protected:Npn
\__cs_tmp:w \cs_gset_protected:cpx \cs_gset_protected:Npx
\__cs_tmp:w \cs_new_protected:cpn  \cs_new_protected:Npn
\__cs_tmp:w \cs_new_protected:cpx  \cs_new_protected:Npx
\cs_new_protected:Npn \cs_set_eq:NN #1 { \tex_let:D #1 =~ }
\cs_new_protected:Npn \cs_set_eq:cN { \exp_args:Nc  \cs_set_eq:NN }
\cs_new_protected:Npn \cs_set_eq:Nc { \exp_args:NNc \cs_set_eq:NN }
\cs_new_protected:Npn \cs_set_eq:cc { \exp_args:Ncc \cs_set_eq:NN }
\cs_new_protected:Npn \cs_gset_eq:NN { \tex_global:D  \cs_set_eq:NN }
\cs_new_protected:Npn \cs_gset_eq:Nc { \exp_args:NNc  \cs_gset_eq:NN }
\cs_new_protected:Npn \cs_gset_eq:cN { \exp_args:Nc   \cs_gset_eq:NN }
\cs_new_protected:Npn \cs_gset_eq:cc { \exp_args:Ncc  \cs_gset_eq:NN }
\cs_new_protected:Npn \cs_new_eq:NN #1
  {
    \__chk_if_free_cs:N #1
    \tex_global:D \cs_set_eq:NN #1
  }
\cs_new_protected:Npn \cs_new_eq:cN { \exp_args:Nc  \cs_new_eq:NN }
\cs_new_protected:Npn \cs_new_eq:Nc { \exp_args:NNc \cs_new_eq:NN }
\cs_new_protected:Npn \cs_new_eq:cc { \exp_args:Ncc \cs_new_eq:NN }
\cs_new_protected:Npn \cs_undefine:N #1
  { \cs_gset_eq:NN #1 \tex_undefined:D }
\cs_new_protected:Npn \cs_undefine:c #1
  {
    \if_cs_exist:w #1 \cs_end:
      \exp_after:wN \use:n
    \else:
      \exp_after:wN \use_none:n
    \fi:
    { \cs_gset_eq:cN {#1} \tex_undefined:D }
  }
\cs_set_protected:Npn \__cs_parm_from_arg_count:nnF #1#2
  {
    \exp_args:Nx \__cs_parm_from_arg_count_test:nnF
      {
        \exp_after:wN \exp_not:n
        \if_case:w \__int_eval:w #2 \__int_eval_end:
             { }
        \or: { ##1 }
        \or: { ##1##2 }
        \or: { ##1##2##3 }
        \or: { ##1##2##3##4 }
        \or: { ##1##2##3##4##5 }
        \or: { ##1##2##3##4##5##6 }
        \or: { ##1##2##3##4##5##6##7 }
        \or: { ##1##2##3##4##5##6##7##8 }
        \or: { ##1##2##3##4##5##6##7##8##9 }
        \else: { \c_false_bool }
        \fi:
      }
      {#1}
  }
\cs_set_protected:Npn \__cs_parm_from_arg_count_test:nnF #1#2
  {
    \if_meaning:w \c_false_bool #1
      \exp_after:wN \use_ii:nn
    \else:
      \exp_after:wN \use_i:nn
    \fi:
    { #2 {#1} }
  }
\cs_new:Npn \__cs_count_signature:N #1
  { \int_eval:n { \__cs_split_function:NN #1 \__cs_count_signature:nnN } }
\cs_new:Npn \__cs_count_signature:nnN #1#2#3
  {
    \if_meaning:w \c_true_bool #3
      \tl_count:n {#2}
    \else:
      -1
    \fi:
  }
\cs_new:Npn \__cs_count_signature:c
  { \exp_args:Nc \__cs_count_signature:N }
\cs_new_protected:Npn \cs_generate_from_arg_count:NNnn #1#2#3#4
  {
    \__cs_parm_from_arg_count:nnF { \use:nnn #2 #1 } {#3}
      {
        \__msg_kernel_error:nnxx { kernel } { bad-number-of-arguments }
          { \token_to_str:N #1 } { \int_eval:n {#3} }
        \use_none:n
      }
      {#4}
  }
\cs_new_protected:Npn \cs_generate_from_arg_count:cNnn
  { \exp_args:Nc \cs_generate_from_arg_count:NNnn }
\cs_new_protected:Npn \cs_generate_from_arg_count:Ncnn
  { \exp_args:NNc \cs_generate_from_arg_count:NNnn }
\cs_set:Npn \__cs_tmp:w #1#2#3
  {
    \cs_new_protected:cpx { cs_ #1 : #2 }
      {
        \exp_not:N \__cs_generate_from_signature:NNn
        \exp_after:wN \exp_not:N \cs:w cs_ #1 : #3 \cs_end:
      }
  }
\cs_new_protected:Npn \__cs_generate_from_signature:NNn #1#2
  {
    \__cs_split_function:NN #2 \__cs_generate_from_signature:nnNNNn
    #1 #2
  }
\cs_new_protected:Npn \__cs_generate_from_signature:nnNNNn #1#2#3#4#5#6
  {
    \bool_if:NTF #3
      {
        \str_if_eq_x:nnF { }
          { \tl_map_function:nN {#2} \__cs_generate_from_signature:n }
          {
            \__msg_kernel_error:nnx { kernel } { non-base-function }
              { \token_to_str:N #5 }
          }
        \cs_generate_from_arg_count:NNnn
          #5 #4 { \tl_count:n {#2} } {#6}
      }
      {
        \__msg_kernel_error:nnx { kernel } { missing-colon }
          { \token_to_str:N #5 }
      }
  }
\cs_new:Npn \__cs_generate_from_signature:n #1
  {
    \if:w n #1 \else: \if:w N #1 \else:
    \if:w T #1 \else: \if:w F #1 \else: #1 \fi: \fi: \fi: \fi:
  }
\__cs_tmp:w { set }                  { Nn } { Npn }
\__cs_tmp:w { set }                  { Nx } { Npx }
\__cs_tmp:w { set_nopar }            { Nn } { Npn }
\__cs_tmp:w { set_nopar }            { Nx } { Npx }
\__cs_tmp:w { set_protected }        { Nn } { Npn }
\__cs_tmp:w { set_protected }        { Nx } { Npx }
\__cs_tmp:w { set_protected_nopar }  { Nn } { Npn }
\__cs_tmp:w { set_protected_nopar }  { Nx } { Npx }
\__cs_tmp:w { gset }                 { Nn } { Npn }
\__cs_tmp:w { gset }                 { Nx } { Npx }
\__cs_tmp:w { gset_nopar }           { Nn } { Npn }
\__cs_tmp:w { gset_nopar }           { Nx } { Npx }
\__cs_tmp:w { gset_protected }       { Nn } { Npn }
\__cs_tmp:w { gset_protected }       { Nx } { Npx }
\__cs_tmp:w { gset_protected_nopar } { Nn } { Npn }
\__cs_tmp:w { gset_protected_nopar } { Nx } { Npx }
\__cs_tmp:w { new }                  { Nn } { Npn }
\__cs_tmp:w { new }                  { Nx } { Npx }
\__cs_tmp:w { new_nopar }            { Nn } { Npn }
\__cs_tmp:w { new_nopar }            { Nx } { Npx }
\__cs_tmp:w { new_protected }        { Nn } { Npn }
\__cs_tmp:w { new_protected }        { Nx } { Npx }
\__cs_tmp:w { new_protected_nopar }  { Nn } { Npn }
\__cs_tmp:w { new_protected_nopar }  { Nx } { Npx }
\cs_set:Npn \__cs_tmp:w #1#2
  {
    \cs_new_protected:cpx { cs_ #1 : c #2 }
      {
        \exp_not:N \exp_args:Nc
        \exp_after:wN \exp_not:N \cs:w cs_ #1 : N #2 \cs_end:
      }
  }
\__cs_tmp:w { set }                  { n }
\__cs_tmp:w { set }                  { x }
\__cs_tmp:w { set_nopar }            { n }
\__cs_tmp:w { set_nopar }            { x }
\__cs_tmp:w { set_protected }        { n }
\__cs_tmp:w { set_protected }        { x }
\__cs_tmp:w { set_protected_nopar }  { n }
\__cs_tmp:w { set_protected_nopar }  { x }
\__cs_tmp:w { gset }                 { n }
\__cs_tmp:w { gset }                 { x }
\__cs_tmp:w { gset_nopar }           { n }
\__cs_tmp:w { gset_nopar }           { x }
\__cs_tmp:w { gset_protected }       { n }
\__cs_tmp:w { gset_protected }       { x }
\__cs_tmp:w { gset_protected_nopar } { n }
\__cs_tmp:w { gset_protected_nopar } { x }
\__cs_tmp:w { new }                  { n }
\__cs_tmp:w { new }                  { x }
\__cs_tmp:w { new_nopar }            { n }
\__cs_tmp:w { new_nopar }            { x }
\__cs_tmp:w { new_protected }        { n }
\__cs_tmp:w { new_protected }        { x }
\__cs_tmp:w { new_protected_nopar }  { n }
\__cs_tmp:w { new_protected_nopar }  { x }
\prg_new_conditional:Npnn \cs_if_eq:NN #1#2 { p , T , F , TF }
  {
    \if_meaning:w #1#2
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\cs_new:Npn \cs_if_eq_p:cN { \exp_args:Nc  \cs_if_eq_p:NN }
\cs_new:Npn \cs_if_eq:cNTF { \exp_args:Nc  \cs_if_eq:NNTF }
\cs_new:Npn \cs_if_eq:cNT  { \exp_args:Nc  \cs_if_eq:NNT }
\cs_new:Npn \cs_if_eq:cNF  { \exp_args:Nc  \cs_if_eq:NNF }
\cs_new:Npn \cs_if_eq_p:Nc { \exp_args:NNc \cs_if_eq_p:NN }
\cs_new:Npn \cs_if_eq:NcTF { \exp_args:NNc \cs_if_eq:NNTF }
\cs_new:Npn \cs_if_eq:NcT  { \exp_args:NNc \cs_if_eq:NNT }
\cs_new:Npn \cs_if_eq:NcF  { \exp_args:NNc \cs_if_eq:NNF }
\cs_new:Npn \cs_if_eq_p:cc { \exp_args:Ncc \cs_if_eq_p:NN }
\cs_new:Npn \cs_if_eq:ccTF { \exp_args:Ncc \cs_if_eq:NNTF }
\cs_new:Npn \cs_if_eq:ccT  { \exp_args:Ncc \cs_if_eq:NNT }
\cs_new:Npn \cs_if_eq:ccF  { \exp_args:Ncc \cs_if_eq:NNF }
\cs_new_protected:Npn \__kernel_register_show:N #1
  { \exp_args:No \__kernel_register_show_aux:nN { \tex_the:D #1 } #1 }
\cs_new_protected:Npn \__kernel_register_show_aux:nN #1#2
  {
    \__msg_show_variable:NNNnn #2 \cs_if_exist:NTF ? { }
      { > ~ \token_to_str:N #2 = #1 }
  }
\cs_new_protected:Npn \__kernel_register_show:c
  { \exp_args:Nc \__kernel_register_show:N }
\cs_new_protected:Npn \__kernel_register_log:N
  { \__msg_log_next: \__kernel_register_show:N }
\cs_new_protected:Npn \__kernel_register_log:c
  { \exp_args:Nc \__kernel_register_log:N }
\cs_new_protected:Npn \cs_show:N #1
  {
    \group_begin:
      \int_set:Nn \tex_escapechar:D { `\\ }
      \exp_args:NNx
    \group_end:
    \__msg_show_wrap:n { > ~ \token_to_str:N #1 = \cs_meaning:N #1 }
  }
\cs_new_protected:Npn \cs_show:c
  { \group_begin: \exp_args:NNc \group_end: \cs_show:N }
\cs_new_protected:Npn \cs_log:N { \__msg_log_next: \cs_show:N }
\cs_new_protected:Npn \cs_log:c { \__msg_log_next: \cs_show:c }
\cs_new_nopar:Npn \prg_do_nothing: { }
\cs_new_eq:NN \__prg_break_point:Nn \use_ii:nn
\cs_new:Npn \__prg_map_break:Nn #1#2#3 \__prg_break_point:Nn #4#5
  {
    #5
    \if_meaning:w #1 #4
      \exp_after:wN \use_iii:nnn
    \fi:
    \__prg_map_break:Nn #1 {#2}
  }
\cs_new_eq:NN \__prg_break_point: \prg_do_nothing:
\cs_new:Npn \__prg_break: #1 \__prg_break_point: { }
\cs_new:Npn \__prg_break:n #1#2 \__prg_break_point: {#1}
%% File: l3expan.dtx Copyright (C) 1990-2017 The LaTeX3 project
\cs_new:Npn \__exp_arg_next:nnn #1#2#3 { #2 \::: { #3 {#1} } }
\cs_new:Npn \__exp_arg_next:Nnn #1#2#3 { #2 \::: { #3 #1 } }
\cs_new:Npn \::: #1 {#1}
\cs_new:Npn \::n #1 \::: #2#3 { #1 \::: { #2 {#3} } }
\cs_new:Npn \::N #1 \::: #2#3 { #1 \::: {#2#3} }
\cs_new:Npn \::p #1 \::: #2#3# { #1 \::: {#2#3} }
\cs_new:Npn \::c #1 \::: #2#3
  { \exp_after:wN \__exp_arg_next:Nnn \cs:w #3 \cs_end: {#1} {#2} }
\cs_new:Npn \::o #1 \::: #2#3
  { \exp_after:wN \__exp_arg_next:nnn \exp_after:wN {#3} {#1} {#2} }
\cs_new:Npn \::f #1 \::: #2#3
  {
    \exp_after:wN \__exp_arg_next:nnn
      \exp_after:wN { \exp:w \exp_end_continue_f:w #3 }
      {#1} {#2}
  }
\use:nn { \cs_new_eq:NN \exp_stop_f: } { ~ }
\cs_new_protected:Npn \::x #1 \::: #2#3
  {
    \cs_set_nopar:Npx \l__exp_internal_tl { {#3} }
    \exp_after:wN \__exp_arg_next:nnn \l__exp_internal_tl {#1} {#2}
  }
\cs_new:Npn \::V #1 \::: #2#3
  {
    \exp_after:wN \__exp_arg_next:nnn
      \exp_after:wN { \exp:w \__exp_eval_register:N #3 }
      {#1} {#2}
}
\cs_new:Npn \::v # 1\::: #2#3
  {
    \exp_after:wN \__exp_arg_next:nnn
      \exp_after:wN { \exp:w \__exp_eval_register:c {#3} }
      {#1} {#2}
  }
\cs_new:Npn \__exp_eval_register:N #1
  {
    \exp_after:wN \if_meaning:w \exp_not:N #1 #1
      \if_meaning:w \scan_stop: #1
        \__exp_eval_error_msg:w
      \fi:
    \else:
      \exp_after:wN \use_i_ii:nnn
    \fi:
    \exp_after:wN \exp_end: \tex_the:D #1
  }
\cs_new:Npn \__exp_eval_register:c #1
  { \exp_after:wN \__exp_eval_register:N \cs:w #1 \cs_end: }
\cs_new:Npn \__exp_eval_error_msg:w #1 \tex_the:D #2
  {
      \fi:
    \fi:
    \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#2}
    \exp_end:
  }
\cs_new:Npn \exp_args:No #1#2 { \exp_after:wN #1 \exp_after:wN {#2} }
\cs_new:Npn \exp_args:NNo #1#2#3
  { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN {#3} }
\cs_new:Npn \exp_args:NNNo #1#2#3#4
  { \exp_after:wN #1 \exp_after:wN#2 \exp_after:wN #3 \exp_after:wN {#4} }
\cs_new:Npn \exp_args:NNc #1#2#3
  { \exp_after:wN #1 \exp_after:wN #2 \cs:w # 3\cs_end: }
\cs_new:Npn \exp_args:Ncc #1#2#3
  { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: \cs:w #3 \cs_end: }
\cs_new:Npn \exp_args:Nccc #1#2#3#4
  {
    \exp_after:wN #1
      \cs:w #2 \exp_after:wN \cs_end:
      \cs:w #3 \exp_after:wN \cs_end:
      \cs:w #4 \cs_end:
  }
\cs_new:Npn \exp_args:Nf #1#2
  { \exp_after:wN #1 \exp_after:wN { \exp:w \exp_end_continue_f:w #2 } }
\cs_new:Npn \exp_args:Nv #1#2
  {
    \exp_after:wN #1 \exp_after:wN
      { \exp:w \__exp_eval_register:c {#2} }
  }
\cs_new:Npn \exp_args:NV #1#2
  {
    \exp_after:wN #1 \exp_after:wN
      { \exp:w \__exp_eval_register:N #2 }
  }
\cs_new:Npn \exp_args:NNf #1#2#3
  {
    \exp_after:wN #1
    \exp_after:wN #2
    \exp_after:wN { \exp:w \exp_end_continue_f:w #3 }
  }
\cs_new:Npn \exp_args:NNv #1#2#3
  {
    \exp_after:wN #1
    \exp_after:wN #2
    \exp_after:wN { \exp:w \__exp_eval_register:c {#3} }
  }
\cs_new:Npn \exp_args:NNV #1#2#3
  {
    \exp_after:wN #1
    \exp_after:wN #2
    \exp_after:wN { \exp:w \__exp_eval_register:N #3 }
  }
\cs_new:Npn \exp_args:Nco #1#2#3
  {
    \exp_after:wN #1
    \cs:w #2 \exp_after:wN \cs_end:
    \exp_after:wN {#3}
  }
\cs_new:Npn \exp_args:Ncf #1#2#3
  {
    \exp_after:wN #1
    \cs:w #2 \exp_after:wN \cs_end:
    \exp_after:wN { \exp:w \exp_end_continue_f:w #3 }
  }
\cs_new:Npn \exp_args:NVV #1#2#3
  {
    \exp_after:wN #1
    \exp_after:wN { \exp:w \exp_after:wN
      \__exp_eval_register:N \exp_after:wN #2 \exp_after:wN }
    \exp_after:wN { \exp:w \__exp_eval_register:N #3 }
  }
\cs_new:Npn \exp_args:NNNV #1#2#3#4
  {
    \exp_after:wN #1
    \exp_after:wN #2
    \exp_after:wN #3
    \exp_after:wN { \exp:w \__exp_eval_register:N #4 }
  }
\cs_new:Npn \exp_args:NcNc #1#2#3#4
  {
    \exp_after:wN #1
    \cs:w #2 \exp_after:wN \cs_end:
    \exp_after:wN #3
    \cs:w #4 \cs_end:
  }
\cs_new:Npn \exp_args:NcNo #1#2#3#4
  {
    \exp_after:wN #1
    \cs:w #2 \exp_after:wN \cs_end:
    \exp_after:wN #3
    \exp_after:wN {#4}
  }
\cs_new:Npn \exp_args:Ncco #1#2#3#4
  {
    \exp_after:wN #1
    \cs:w #2 \exp_after:wN \cs_end:
    \cs:w #3 \exp_after:wN \cs_end:
    \exp_after:wN {#4}
  }
\cs_new_protected:Npn \exp_args:Nx { \::x \::: }
\cs_new:Npn \exp_args:Nnc { \::n \::c \::: }
\cs_new:Npn \exp_args:Nfo { \::f \::o \::: }
\cs_new:Npn \exp_args:Nff { \::f \::f \::: }
\cs_new:Npn \exp_args:Nnf { \::n \::f \::: }
\cs_new:Npn \exp_args:Nno { \::n \::o \::: }
\cs_new:Npn \exp_args:NnV { \::n \::V \::: }
\cs_new:Npn \exp_args:Noo { \::o \::o \::: }
\cs_new:Npn \exp_args:Nof { \::o \::f \::: }
\cs_new:Npn \exp_args:Noc { \::o \::c \::: }
\cs_new_protected:Npn \exp_args:NNx { \::N \::x \::: }
\cs_new_protected:Npn \exp_args:Ncx { \::c \::x \::: }
\cs_new_protected:Npn \exp_args:Nnx { \::n \::x \::: }
\cs_new_protected:Npn \exp_args:Nox { \::o \::x \::: }
\cs_new_protected:Npn \exp_args:Nxo { \::x \::o \::: }
\cs_new_protected:Npn \exp_args:Nxx { \::x \::x \::: }
\cs_new:Npn \exp_args:NNno { \::N \::n \::o \::: }
\cs_new:Npn \exp_args:NNoo { \::N \::o \::o \::: }
\cs_new:Npn \exp_args:Nnnc { \::n \::n \::c \::: }
\cs_new:Npn \exp_args:Nnno { \::n \::n \::o \::: }
\cs_new:Npn \exp_args:Nooo { \::o \::o \::o \::: }
\cs_new_protected:Npn \exp_args:NNNx { \::N \::N \::x \::: }
\cs_new_protected:Npn \exp_args:NNnx { \::N \::n \::x \::: }
\cs_new_protected:Npn \exp_args:NNox { \::N \::o \::x \::: }
\cs_new_protected:Npn \exp_args:Nnnx { \::n \::n \::x \::: }
\cs_new_protected:Npn \exp_args:Nnox { \::n \::o \::x \::: }
\cs_new_protected:Npn \exp_args:Nccx { \::c \::c \::x \::: }
\cs_new_protected:Npn \exp_args:Ncnx { \::c \::n \::x \::: }
\cs_new_protected:Npn \exp_args:Noox { \::o \::o \::x \::: }
\cs_new:Npn \__exp_arg_last_unbraced:nn #1#2 { #2#1 }
\cs_new:Npn \::f_unbraced \::: #1#2
  {
    \exp_after:wN \__exp_arg_last_unbraced:nn
      \exp_after:wN { \exp:w \exp_end_continue_f:w #2 } {#1}
  }
\cs_new:Npn \::o_unbraced \::: #1#2
  { \exp_after:wN \__exp_arg_last_unbraced:nn \exp_after:wN {#2} {#1} }
\cs_new:Npn \::V_unbraced \::: #1#2
  {
    \exp_after:wN \__exp_arg_last_unbraced:nn
      \exp_after:wN { \exp:w \__exp_eval_register:N #2 } {#1}
  }
\cs_new:Npn \::v_unbraced \::: #1#2
  {
    \exp_after:wN \__exp_arg_last_unbraced:nn
      \exp_after:wN { \exp:w \__exp_eval_register:c {#2} } {#1}
  }
\cs_new_protected:Npn \::x_unbraced \::: #1#2
  {
    \cs_set_nopar:Npx \l__exp_internal_tl { \exp_not:n {#1} #2 }
    \l__exp_internal_tl
  }
\cs_new:Npn \exp_last_unbraced:NV #1#2
  { \exp_after:wN #1 \exp:w \__exp_eval_register:N #2 }
\cs_new:Npn \exp_last_unbraced:Nv #1#2
  { \exp_after:wN #1 \exp:w \__exp_eval_register:c {#2} }
\cs_new:Npn \exp_last_unbraced:No #1#2 { \exp_after:wN #1 #2 }
\cs_new:Npn \exp_last_unbraced:Nf #1#2
  { \exp_after:wN #1 \exp:w \exp_end_continue_f:w #2 }
\cs_new:Npn \exp_last_unbraced:Nco #1#2#3
  { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: #3 }
\cs_new:Npn \exp_last_unbraced:NcV #1#2#3
  {
    \exp_after:wN #1
    \cs:w #2 \exp_after:wN \cs_end:
    \exp:w \__exp_eval_register:N #3
  }
\cs_new:Npn \exp_last_unbraced:NNV #1#2#3
  {
    \exp_after:wN #1
    \exp_after:wN #2
    \exp:w \__exp_eval_register:N #3
  }
\cs_new:Npn \exp_last_unbraced:NNo #1#2#3
  { \exp_after:wN #1 \exp_after:wN #2 #3 }
\cs_new:Npn \exp_last_unbraced:NNNV #1#2#3#4
  {
    \exp_after:wN #1
    \exp_after:wN #2
    \exp_after:wN #3
    \exp:w \__exp_eval_register:N #4
  }
\cs_new:Npn \exp_last_unbraced:NNNo #1#2#3#4
  { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN #3 #4 }
\cs_new:Npn \exp_last_unbraced:Nno { \::n \::o_unbraced \::: }
\cs_new:Npn \exp_last_unbraced:Noo { \::o \::o_unbraced \::: }
\cs_new:Npn \exp_last_unbraced:Nfo { \::f \::o_unbraced \::: }
\cs_new:Npn \exp_last_unbraced:NnNo { \::n \::N \::o_unbraced \::: }
\cs_new_protected:Npn \exp_last_unbraced:Nx { \::x_unbraced \::: }
\cs_new:Npn \exp_last_two_unbraced:Noo #1#2#3
  { \exp_after:wN \__exp_last_two_unbraced:noN \exp_after:wN {#3} {#2} #1 }
\cs_new:Npn \__exp_last_two_unbraced:noN #1#2#3
   { \exp_after:wN #3 #2 #1 }
\cs_new:Npn \exp_not:o #1 { \etex_unexpanded:D \exp_after:wN {#1} }
\cs_new:Npn \exp_not:c #1 { \exp_after:wN \exp_not:N \cs:w #1 \cs_end: }
\cs_new:Npn \exp_not:f #1
  { \etex_unexpanded:D \exp_after:wN { \exp:w \exp_end_continue_f:w #1 } }
\cs_new:Npn \exp_not:V #1
  {
    \etex_unexpanded:D \exp_after:wN
      { \exp:w \__exp_eval_register:N #1 }
  }
\cs_new:Npn \exp_not:v #1
  {
    \etex_unexpanded:D \exp_after:wN
      { \exp:w \__exp_eval_register:c {#1} }
  }
\tex_catcode:D `\^^@=13
\cs_new_protected:Npn \exp_end_continue_f:w {`^^@}
\cs_new:Npn ^^@{\expansionERROR}
\cs_new:Npn \exp_end_continue_f:nw #1 { `^^@ #1 }
\tex_catcode:D `\^^@=15
\cs_new_protected:Npn \cs_generate_variant:Nn #1#2
  {
    \__chk_if_exist_cs:N #1
    \__cs_generate_variant:N #1
    \exp_after:wN \__cs_split_function:NN
    \exp_after:wN #1
    \exp_after:wN \__cs_generate_variant:nnNN
    \exp_after:wN #1
    \tl_to_str:n {#2} , \scan_stop: , \q_recursion_stop
  }
\cs_new_protected:Npx \__cs_generate_variant:N #1
  {
    \exp_not:N \exp_after:wN \exp_not:N \if_meaning:w
      \exp_not:N \exp_not:N #1 #1
      \cs_set_eq:NN \exp_not:N \__cs_tmp:w \cs_new_protected:Npx
    \exp_not:N \else:
      \exp_not:N \exp_after:wN \exp_not:N \__cs_generate_variant:ww
        \exp_not:N \token_to_meaning:N #1 \tl_to_str:n { ma }
          \exp_not:N \q_mark
        \exp_not:N \q_mark \cs_new_protected:Npx
        \tl_to_str:n { pr }
        \exp_not:N \q_mark \cs_new:Npx
        \exp_not:N \q_stop
    \exp_not:N \fi:
  }
\use:x
  {
    \cs_new_protected:Npn \exp_not:N \__cs_generate_variant:ww
      ##1 \tl_to_str:n { ma } ##2 \exp_not:N \q_mark
  }
  { \__cs_generate_variant:wwNw #1 }
\use:x
  {
    \cs_new_protected:Npn \exp_not:N \__cs_generate_variant:wwNw
      ##1 \tl_to_str:n { pr } ##2 \exp_not:N \q_mark
      ##3 ##4 \exp_not:N \q_stop
  }
  { \cs_set_eq:NN \__cs_tmp:w #3 }
\cs_new_protected:Npn \__cs_generate_variant:nnNN #1#2#3#4
  {
    \if_meaning:w \c_false_bool #3
      \__msg_kernel_error:nnx { kernel } { missing-colon }
        { \token_to_str:c {#1} }
      \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
    \fi:
    \__cs_generate_variant:Nnnw #4 {#1}{#2}
  }
\cs_new_protected:Npn \__cs_generate_variant:Nnnw #1#2#3#4 ,
  {
    \if_meaning:w \scan_stop: #4
      \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
    \fi:
    \use:x
      {
        \exp_not:N \__cs_generate_variant:wwNN
        \__cs_generate_variant_loop:nNwN { }
          #4
          \__cs_generate_variant_loop_end:nwwwNNnn
          \q_mark
          #3 ~
          { ~ { } \fi: \__cs_generate_variant_loop_long:wNNnn } ~
          { }
          \q_stop
        \exp_not:N #1 {#2} {#4}
      }
    \__cs_generate_variant:Nnnw #1 {#2} {#3}
  }
\cs_new:Npn \__cs_generate_variant_loop:nNwN #1#2#3 \q_mark #4
  {
    \if:w #2 #4
      \exp_after:wN \__cs_generate_variant_loop_same:w
    \else:
      \if:w N #4 \else:
        \if:w n #4 \else:
          \__cs_generate_variant_loop_invalid:NNwNNnn #4#2
        \fi:
      \fi:
    \fi:
    #1
    \prg_do_nothing:
    #2
    \__cs_generate_variant_loop:nNwN { } #3 \q_mark
  }
\cs_new:Npn \__cs_generate_variant_loop_same:w
    #1 \prg_do_nothing: #2#3#4
  {
    #3 { #1 \__cs_generate_variant_same:N #2 }
  }
\cs_new:Npn \__cs_generate_variant_loop_end:nwwwNNnn
    #1#2 \q_mark #3 ~ #4 \q_stop #5#6#7#8
  {
    \scan_stop: \scan_stop: \fi:
    \exp_not:N \q_mark
    \exp_not:N \q_stop
    \exp_not:N #6
    \exp_not:c { #7 : #8 #1 #3 }
  }
\cs_new:Npn \__cs_generate_variant_loop_long:wNNnn #1 \q_stop #2#3#4#5
  {
    \exp_not:n
      {
        \q_mark
        \__msg_kernel_error:nnxx { kernel } { variant-too-long }
          {#5} { \token_to_str:N #3 }
        \use_none:nnnn
        \q_stop
        #3
        #3
      }
  }
\cs_new:Npn \__cs_generate_variant_loop_invalid:NNwNNnn
    #1#2 \fi: \fi: \fi: #3 \q_stop #4#5#6#7
  {
    \fi: \fi: \fi:
    \exp_not:n
      {
        \q_mark
        \__msg_kernel_error:nnxxxx { kernel } { invalid-variant }
          {#7} { \token_to_str:N #5 } {#1} {#2}
        \use_none:nnnn
        \q_stop
        #5
        #5
      }
  }
\cs_new:Npn \__cs_generate_variant_same:N #1
  {
    \if:w N #1
      N
    \else:
      \if:w p #1
        p
      \else:
        n
      \fi:
    \fi:
  }
\cs_new_protected:Npn \__cs_generate_variant:wwNN
    #1 \q_mark #2 \q_stop #3#4
  {
    #2
    \cs_if_free:NTF #4
      {
        \group_begin:
          \__cs_generate_internal_variant:n {#1}
          \__cs_tmp:w #4 { \exp_not:c { exp_args:N #1 } \exp_not:N #3 }
        \group_end:
      }
      {
        \__chk_log:x
          {
            Variant~\token_to_str:N #4~%
            already~defined;~ not~ changing~ it~ \msg_line_context:
          }
      }
  }
\cs_new_protected:Npx \__cs_generate_internal_variant:n #1
  {
    \exp_not:N \__cs_generate_internal_variant:wwnNwnn
      #1 \exp_not:N \q_mark
        { \cs_set_eq:NN \exp_not:N \__cs_tmp:w \cs_new_protected:Npx }
        \cs_new_protected:cpx
      \token_to_str:N x \exp_not:N \q_mark
        { }
        \cs_new:cpx
    \exp_not:N \q_stop
      { exp_args:N #1 }
      {
        \exp_not:N \__cs_generate_internal_variant_loop:n #1
          { : \exp_not:N \use_i:nn }
      }
  }
\use:x
  {
    \cs_new_protected:Npn \exp_not:N \__cs_generate_internal_variant:wwnNwnn
        ##1 \token_to_str:N x ##2 \exp_not:N \q_mark
        ##3 ##4 ##5 \exp_not:N \q_stop ##6 ##7
  }
  {
    #3
    \cs_if_free:cT {#6} { #4 {#6} {#7} }
  }
\cs_new:Npn \__cs_generate_internal_variant_loop:n #1
  {
    \exp_after:wN \exp_not:N \cs:w :: #1 \cs_end:
    \__cs_generate_internal_variant_loop:n
  }
%% File: l3tl.dtx Copyright (C) 1990-2017 The LaTeX3 Project
\cs_new_protected:Npn \tl_new:N #1
  {
    \__chk_if_free_cs:N #1
    \cs_gset_eq:NN #1 \c_empty_tl
  }
\cs_generate_variant:Nn \tl_new:N { c }
\cs_new_protected:Npn \tl_const:Nn #1#2
  {
    \__chk_if_free_cs:N #1
    \cs_gset_nopar:Npx #1 { \exp_not:n {#2} }
  }
\cs_new_protected:Npn \tl_const:Nx #1#2
  {
    \__chk_if_free_cs:N #1
    \cs_gset_nopar:Npx #1 {#2}
  }
\cs_generate_variant:Nn \tl_const:Nn { c }
\cs_generate_variant:Nn \tl_const:Nx { c }
\cs_new_protected:Npn \tl_clear:N  #1
  { \tl_set_eq:NN #1 \c_empty_tl }
\cs_new_protected:Npn \tl_gclear:N #1
  { \tl_gset_eq:NN #1 \c_empty_tl }
\cs_generate_variant:Nn \tl_clear:N  { c }
\cs_generate_variant:Nn \tl_gclear:N { c }
\cs_new_protected:Npn \tl_clear_new:N  #1
  { \tl_if_exist:NTF #1 { \tl_clear:N #1 } { \tl_new:N #1 } }
\cs_new_protected:Npn \tl_gclear_new:N #1
  { \tl_if_exist:NTF #1 { \tl_gclear:N #1 } { \tl_new:N #1 } }
\cs_generate_variant:Nn \tl_clear_new:N  { c }
\cs_generate_variant:Nn \tl_gclear_new:N { c }
\cs_new_eq:NN \tl_set_eq:NN  \cs_set_eq:NN
\cs_new_eq:NN \tl_set_eq:cN  \cs_set_eq:cN
\cs_new_eq:NN \tl_set_eq:Nc  \cs_set_eq:Nc
\cs_new_eq:NN \tl_set_eq:cc  \cs_set_eq:cc
\cs_new_eq:NN \tl_gset_eq:NN \cs_gset_eq:NN
\cs_new_eq:NN \tl_gset_eq:cN \cs_gset_eq:cN
\cs_new_eq:NN \tl_gset_eq:Nc \cs_gset_eq:Nc
\cs_new_eq:NN \tl_gset_eq:cc \cs_gset_eq:cc
\cs_new_protected:Npn \tl_concat:NNN #1#2#3
  { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
\cs_new_protected:Npn \tl_gconcat:NNN #1#2#3
  { \tl_gset:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
\cs_generate_variant:Nn \tl_concat:NNN  { ccc }
\cs_generate_variant:Nn \tl_gconcat:NNN { ccc }
\prg_new_eq_conditional:NNn \tl_if_exist:N \cs_if_exist:N { TF , T , F , p }
\prg_new_eq_conditional:NNn \tl_if_exist:c \cs_if_exist:c { TF , T , F , p }
\tl_const:Nn \c_empty_tl { }
\tl_const:Nn \c_space_tl { ~ }
\cs_new_protected:Npn \tl_set:Nn #1#2
  { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } }
\cs_new_protected:Npn \tl_set:No #1#2
  { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } }
\cs_new_protected:Npn \tl_set:Nx #1#2
  { \cs_set_nopar:Npx #1 {#2} }
\cs_new_protected:Npn \tl_gset:Nn #1#2
  { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } }
\cs_new_protected:Npn \tl_gset:No #1#2
  { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } }
\cs_new_protected:Npn \tl_gset:Nx #1#2
  { \cs_gset_nopar:Npx #1 {#2} }
\cs_generate_variant:Nn \tl_set:Nn  {         NV , Nv , Nf }
\cs_generate_variant:Nn \tl_set:Nx  { c }
\cs_generate_variant:Nn \tl_set:Nn  { c, co , cV , cv , cf }
\cs_generate_variant:Nn \tl_gset:Nn {         NV , Nv , Nf }
\cs_generate_variant:Nn \tl_gset:Nx { c }
\cs_generate_variant:Nn \tl_gset:Nn { c, co , cV , cv , cf }
\cs_new_protected:Npn \tl_put_left:Nn #1#2
  { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
\cs_new_protected:Npn \tl_put_left:NV #1#2
  { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
\cs_new_protected:Npn \tl_put_left:No #1#2
  { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
\cs_new_protected:Npn \tl_put_left:Nx #1#2
  { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } }
\cs_new_protected:Npn \tl_gput_left:Nn #1#2
  { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
\cs_new_protected:Npn \tl_gput_left:NV #1#2
  { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
\cs_new_protected:Npn \tl_gput_left:No #1#2
  { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
\cs_new_protected:Npn \tl_gput_left:Nx #1#2
  { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } }
\cs_generate_variant:Nn \tl_put_left:Nn  { c }
\cs_generate_variant:Nn \tl_put_left:NV  { c }
\cs_generate_variant:Nn \tl_put_left:No  { c }
\cs_generate_variant:Nn \tl_put_left:Nx  { c }
\cs_generate_variant:Nn \tl_gput_left:Nn { c }
\cs_generate_variant:Nn \tl_gput_left:NV { c }
\cs_generate_variant:Nn \tl_gput_left:No { c }
\cs_generate_variant:Nn \tl_gput_left:Nx { c }
\cs_new_protected:Npn \tl_put_right:Nn #1#2
  { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
\cs_new_protected:Npn \tl_put_right:NV #1#2
  { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
\cs_new_protected:Npn \tl_put_right:No #1#2
  { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
\cs_new_protected:Npn \tl_put_right:Nx #1#2
  { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } }
\cs_new_protected:Npn \tl_gput_right:Nn #1#2
  { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
\cs_new_protected:Npn \tl_gput_right:NV #1#2
  { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
\cs_new_protected:Npn \tl_gput_right:No #1#2
  { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
\cs_new_protected:Npn \tl_gput_right:Nx #1#2
  { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } }
\cs_generate_variant:Nn \tl_put_right:Nn  { c }
\cs_generate_variant:Nn \tl_put_right:NV  { c }
\cs_generate_variant:Nn \tl_put_right:No  { c }
\cs_generate_variant:Nn \tl_put_right:Nx  { c }
\cs_generate_variant:Nn \tl_gput_right:Nn { c }
\cs_generate_variant:Nn \tl_gput_right:NV { c }
\cs_generate_variant:Nn \tl_gput_right:No { c }
\cs_generate_variant:Nn \tl_gput_right:Nx { c }
\tex_ifodd:D \l@expl@check@declarations@bool
  \cs_set_protected:Npn \__cs_tmp:w #1
    {
      \if_meaning:w \q_recursion_tail #1
        \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
      \fi:
      \use:x
        {
          \cs_set_protected:Npn #1 \exp_not:n { ##1 ##2 }
            {
              \__chk_if_exist_var:N \exp_not:n {##1}
              \exp_not:o { #1 {##1} {##2} }
            }
        }
      \__cs_tmp:w
    }
  \__cs_tmp:w
    \tl_set:Nn  \tl_set:No  \tl_set:Nx
    \tl_gset:Nn \tl_gset:No \tl_gset:Nx
    \tl_put_left:Nn   \tl_put_left:NV
    \tl_put_left:No   \tl_put_left:Nx
    \tl_gput_left:Nn  \tl_gput_left:NV
    \tl_gput_left:No  \tl_gput_left:Nx
    \tl_put_right:Nn  \tl_put_right:NV
    \tl_put_right:No  \tl_put_right:Nx
    \tl_gput_right:Nn \tl_gput_right:NV
    \tl_gput_right:No \tl_gput_right:Nx
    \q_recursion_tail \q_recursion_stop
  \cs_set_protected:Npn \tl_set_eq:NN #1#2
    {
      \__chk_if_exist_var:N #1
      \__chk_if_exist_var:N #2
      \cs_set_eq:NN #1 #2
    }
  \cs_set_protected:Npn \tl_gset_eq:NN #1#2
    {
      \__chk_if_exist_var:N #1
      \__chk_if_exist_var:N #2
      \cs_gset_eq:NN #1 #2
    }
  \cs_set_protected:Npn \tl_concat:NNN #1#2#3
    {
      \__chk_if_exist_var:N #1
      \__chk_if_exist_var:N #2
      \__chk_if_exist_var:N #3
      \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} }
    }
  \cs_set_protected:Npn \tl_gconcat:NNN #1#2#3
    {
      \__chk_if_exist_var:N #1
      \__chk_if_exist_var:N #2
      \__chk_if_exist_var:N #3
      \tl_gset:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} }
    }
\tex_fi:D
\tl_const:Nx \c__tl_rescan_marker_tl { : \token_to_str:N : }
\cs_new_protected:Npn \tl_set_rescan:Nnn
  { \__tl_set_rescan:NNnn \tl_set:Nn }
\cs_new_protected:Npn \tl_gset_rescan:Nnn
  { \__tl_set_rescan:NNnn \tl_gset:Nn }
\cs_new_protected:Npn \tl_rescan:nn
  { \__tl_set_rescan:NNnn \prg_do_nothing: \use:n }
\cs_new_protected:Npn \__tl_set_rescan:NNnn #1#2#3#4
  {
    \tl_if_empty:nTF {#4}
      {
        \group_begin:
          #3
        \group_end:
        #1 #2 { }
      }
      {
        \group_begin:
          \exp_args:No \etex_everyeof:D { \c__tl_rescan_marker_tl \exp_not:N }
          \int_compare:nNnT \tex_endlinechar:D = { 32 }
            { \int_set:Nn \tex_endlinechar:D { -1 } }
          \tex_newlinechar:D \tex_endlinechar:D
          #3 \scan_stop:
          \exp_args:No \__tl_set_rescan:n { \tl_to_str:n {#4} }
          \exp_args:NNNo
        \group_end:
        #1 #2 \l__tl_internal_a_tl
    }
  }
\cs_new_protected:Npn \__tl_set_rescan_multi:n #1
  {
    \tl_set:Nx \l__tl_internal_a_tl
      {
        \exp_after:wN \__tl_rescan:w
        \exp_after:wN \prg_do_nothing:
        \etex_scantokens:D {#1}
      }
  }
\exp_args:Nno \use:nn
  { \cs_new:Npn \__tl_rescan:w #1 } \c__tl_rescan_marker_tl
  { \exp_not:o {#1} }
\cs_generate_variant:Nn \tl_set_rescan:Nnn  {     Nno , Nnx }
\cs_generate_variant:Nn \tl_set_rescan:Nnn  { c , cno , cnx }
\cs_generate_variant:Nn \tl_gset_rescan:Nnn {     Nno , Nnx }
\cs_generate_variant:Nn \tl_gset_rescan:Nnn { c , cno }
\group_begin:
  \tex_catcode:D `\^^@ = 12 \scan_stop:
  \cs_new_protected:Npn \__tl_set_rescan:n #1
    {
      \int_compare:nNnTF \tex_newlinechar:D < 0
        { \use_ii:nn }
        {
          \char_set_lccode:nn { 0 } { \tex_newlinechar:D }
          \tex_lowercase:D { \__tl_set_rescan:NnTF ^^@ } {#1}
        }
          { \__tl_set_rescan_multi:n }
          { \__tl_set_rescan_single:nn { ' } }
      {#1}
    }
  \cs_new_protected:Npn \__tl_set_rescan:NnTF #1#2
    { \tl_if_in:nnTF {#2} {#1} }
  \cs_new_protected:Npn \__tl_set_rescan_single:nn #1
    {
      \int_compare:nNnTF
        { \char_value_catcode:n { `#1 } / 3 } = 4
        { \__tl_set_rescan_single_aux:nn {#1} }
        {
          \int_compare:nNnTF { `#1 } < { `\~ }
            {
              \char_set_lccode:nn { 0 } { `#1 + 1 }
              \tex_lowercase:D { \__tl_set_rescan_single:nn { ^^@ } }
            }
            { \__tl_set_rescan_single_aux:nn { } }
        }
    }
  \cs_new_protected:Npn \__tl_set_rescan_single_aux:nn #1#2
    {
      \int_set:Nn \tex_endlinechar:D { -1 }
      \use:x
        {
          \exp_not:N \use:n
            {
              \exp_not:n { \cs_set:Npn \__tl_rescan:w ##1 }
              \exp_after:wN \__tl_rescan:w
              \exp_after:wN \prg_do_nothing:
              \etex_scantokens:D {#1}
            }
          \c__tl_rescan_marker_tl
        }
        { \exp_not:o {##1} }
      \tl_set:Nx \l__tl_internal_a_tl
        {
          \int_compare:nNnT
            {
              \char_value_catcode:n
                { \exp_last_unbraced:Nf ` \str_head:n {#2} ~ }
            }
            = { 10 } { ~ }
          \exp_after:wN \__tl_rescan:w
          \exp_after:wN \prg_do_nothing:
          \etex_scantokens:D { #2 #1 }
        }
    }
\group_end:
\cs_new_protected:Npn \tl_replace_once:Nnn
  { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_wrap:w \tl_set:Nx  }
\cs_new_protected:Npn \tl_greplace_once:Nnn
  { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_wrap:w \tl_gset:Nx }
\cs_new_protected:Npn \tl_replace_all:Nnn
  { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_next:w \tl_set:Nx  }
\cs_new_protected:Npn \tl_greplace_all:Nnn
  { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_next:w \tl_gset:Nx }
\cs_generate_variant:Nn \tl_replace_once:Nnn  { c }
\cs_generate_variant:Nn \tl_greplace_once:Nnn { c }
\cs_generate_variant:Nn \tl_replace_all:Nnn   { c }
\cs_generate_variant:Nn \tl_greplace_all:Nnn  { c }
\cs_new_protected:Npn \__tl_replace:NnNNNnn #1#2#3#4#5#6#7
  {
    \tl_if_empty:nTF {#6}
      {
        \__msg_kernel_error:nnx { kernel } { empty-search-pattern }
          { \tl_to_str:n {#7} }
      }
      {
        \tl_if_in:onTF { #5 #6 } {#1}
          {
            \tl_if_in:nnTF {#6} {#1}
              { \exp_args:Nc \__tl_replace:NnNNNnn {#2} {#2?} }
              {
                \quark_if_nil:nTF {#6}
                  { \__tl_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_stop } }
                  { \__tl_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_nil  } }
              }
          }
          { \__tl_replace_auxii:nNNNnn {#1} }
          #3#4#5 {#6} {#7}
      }
  }
\cs_new_protected:Npn \__tl_replace_auxi:NnnNNNnn #1#2#3
  {
    \tl_if_in:NnTF #1 { #2 #3 #3 }
      { \__tl_replace_auxi:NnnNNNnn #1 { #2 #3 } {#2} }
      { \__tl_replace_auxii:nNNNnn { #2 #3 #3 } }
  }
\cs_new_protected:Npn \__tl_replace_auxii:nNNNnn #1#2#3#4#5#6
  {
    \group_align_safe_begin:
    \cs_set:Npn \__tl_replace_wrap:w ##1 #1 ##2
      { \exp_not:o { \use_none:nn ##1 } ##2 }
    \cs_set:Npx \__tl_replace_next:w ##1 #5
      {
        \exp_not:N \__tl_replace_wrap:w ##1
        \exp_not:n { #1 }
        \exp_not:n { \exp_not:n {#6} }
        \exp_not:n { #2 { } { } }
      }
    #3 #4
      {
        \exp_after:wN \__tl_replace_next:w
        \exp_after:wN { \exp_after:wN }
        \exp_after:wN { \exp_after:wN }
        #4
        #1
        {
          \if_false: { \fi: }
          \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
        }
        #5
      }
    \group_align_safe_end:
  }
\cs_new_eq:NN \__tl_replace_wrap:w ?
\cs_new_eq:NN \__tl_replace_next:w ?
\cs_new_protected:Npn \tl_remove_once:Nn #1#2
  { \tl_replace_once:Nnn #1 {#2} { } }
\cs_new_protected:Npn \tl_gremove_once:Nn #1#2
  { \tl_greplace_once:Nnn #1 {#2} { } }
\cs_generate_variant:Nn \tl_remove_once:Nn  { c }
\cs_generate_variant:Nn \tl_gremove_once:Nn { c }
\cs_new_protected:Npn \tl_remove_all:Nn #1#2
  { \tl_replace_all:Nnn #1 {#2} { } }
\cs_new_protected:Npn \tl_gremove_all:Nn #1#2
  { \tl_greplace_all:Nnn #1 {#2} { } }
\cs_generate_variant:Nn \tl_remove_all:Nn  { c }
\cs_generate_variant:Nn \tl_gremove_all:Nn { c }
\prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF }
  { \__tl_if_empty_return:o { \use_none:n #1 ? } }
\cs_generate_variant:Nn \tl_if_blank_p:n { V }
\cs_generate_variant:Nn \tl_if_blank:nT  { V }
\cs_generate_variant:Nn \tl_if_blank:nF  { V }
\cs_generate_variant:Nn \tl_if_blank:nTF { V }
\cs_generate_variant:Nn \tl_if_blank_p:n { o }
\cs_generate_variant:Nn \tl_if_blank:nT  { o }
\cs_generate_variant:Nn \tl_if_blank:nF  { o }
\cs_generate_variant:Nn \tl_if_blank:nTF { o }
\prg_new_conditional:Npnn \tl_if_empty:N #1 { p , T , F , TF }
  {
    \if_meaning:w #1 \c_empty_tl
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_generate_variant:Nn \tl_if_empty_p:N { c }
\cs_generate_variant:Nn \tl_if_empty:NT  { c }
\cs_generate_variant:Nn \tl_if_empty:NF  { c }
\cs_generate_variant:Nn \tl_if_empty:NTF { c }
\prg_new_conditional:Npnn \tl_if_empty:n #1 { p , TF , T , F }
  {
    \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
        \tl_to_str:n {#1} \q_nil
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_generate_variant:Nn \tl_if_empty_p:n { V }
\cs_generate_variant:Nn \tl_if_empty:nTF { V }
\cs_generate_variant:Nn \tl_if_empty:nT  { V }
\cs_generate_variant:Nn \tl_if_empty:nF  { V }
\cs_new:Npn \__tl_if_empty_return:o #1
  {
    \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
      \etex_detokenize:D \exp_after:wN {#1} \q_nil
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F }
  { \__tl_if_empty_return:o {#1} }
\prg_new_conditional:Npnn \tl_if_eq:NN #1#2 { p , T , F , TF }
  {
    \if_meaning:w #1 #2
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_generate_variant:Nn \tl_if_eq_p:NN { Nc , c , cc }
\cs_generate_variant:Nn \tl_if_eq:NNTF { Nc , c , cc }
\cs_generate_variant:Nn \tl_if_eq:NNT  { Nc , c , cc }
\cs_generate_variant:Nn \tl_if_eq:NNF  { Nc , c , cc }
\prg_new_protected_conditional:Npnn \tl_if_eq:nn #1#2 { T , F ,  TF }
  {
    \group_begin:
      \tl_set:Nn \l__tl_internal_a_tl {#1}
      \tl_set:Nn \l__tl_internal_b_tl {#2}
      \if_meaning:w \l__tl_internal_a_tl \l__tl_internal_b_tl
        \group_end:
        \prg_return_true:
      \else:
        \group_end:
        \prg_return_false:
      \fi:
  }
\tl_new:N \l__tl_internal_a_tl
\tl_new:N \l__tl_internal_b_tl
\cs_new_protected:Npn \tl_if_in:NnT  { \exp_args:No \tl_if_in:nnT  }
\cs_new_protected:Npn \tl_if_in:NnF  { \exp_args:No \tl_if_in:nnF  }
\cs_new_protected:Npn \tl_if_in:NnTF { \exp_args:No \tl_if_in:nnTF }
\cs_generate_variant:Nn \tl_if_in:NnT { c }
\cs_generate_variant:Nn \tl_if_in:NnF  { c }
\cs_generate_variant:Nn \tl_if_in:NnTF { c }
\prg_new_protected_conditional:Npnn \tl_if_in:nn #1#2 { T  , F , TF }
  {
    \if_false: { \fi:
    \cs_set:Npn \__tl_tmp:w ##1 #2 { }
    \tl_if_empty:oTF { \__tl_tmp:w #1 {} {} #2 }
      { \prg_return_false: } { \prg_return_true: }
    \if_false: } \fi:
  }
\cs_generate_variant:Nn \tl_if_in:nnT  { V , o , no }
\cs_generate_variant:Nn \tl_if_in:nnF  { V , o , no }
\cs_generate_variant:Nn \tl_if_in:nnTF { V , o , no }
\cs_new:Npn \tl_if_single_p:N { \exp_args:No \tl_if_single_p:n }
\cs_new:Npn \tl_if_single:NT  { \exp_args:No \tl_if_single:nT  }
\cs_new:Npn \tl_if_single:NF  { \exp_args:No \tl_if_single:nF  }
\cs_new:Npn \tl_if_single:NTF { \exp_args:No \tl_if_single:nTF }
\prg_new_conditional:Npnn \tl_if_single:n #1 { p , T , F , TF }
  {
    \if_catcode:w ^ \exp_after:wN \__tl_if_single:nnw
        \tl_to_str:n \exp_after:wN { \use_none:nn #1 ?? } ^ ? \q_stop
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_new:Npn \__tl_if_single:nnw #1#2#3 \q_stop {#2}
\cs_new:Npn \tl_case:Nn #1#2
  {
    \exp:w
    \__tl_case:NnTF #1 {#2} { } { }
  }
\cs_new:Npn \tl_case:NnT #1#2#3
  {
    \exp:w
    \__tl_case:NnTF #1 {#2} {#3} { }
  }
\cs_new:Npn \tl_case:NnF #1#2#3
  {
    \exp:w
    \__tl_case:NnTF #1 {#2} { } {#3}
  }
\cs_new:Npn \tl_case:NnTF #1#2
  {
    \exp:w
    \__tl_case:NnTF #1 {#2}
  }
\cs_new:Npn \__tl_case:NnTF #1#2#3#4
  { \__tl_case:Nw #1 #2 #1 { } \q_mark {#3} \q_mark {#4} \q_stop }
\cs_new:Npn \__tl_case:Nw #1#2#3
  {
    \tl_if_eq:NNTF #1 #2
      { \__tl_case_end:nw {#3} }
      { \__tl_case:Nw #1 }
  }
\cs_generate_variant:Nn \tl_case:Nn   { c }
\cs_generate_variant:Nn \tl_case:NnT  { c }
\cs_generate_variant:Nn \tl_case:NnF  { c }
\cs_generate_variant:Nn \tl_case:NnTF { c }
\cs_new:Npn \__prg_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
  { \exp_end: #1 #4 }
\cs_new_eq:NN \__tl_case_end:nw \__prg_case_end:nw
\cs_new:Npn \tl_map_function:nN #1#2
  {
    \__tl_map_function:Nn #2 #1
      \q_recursion_tail
    \__prg_break_point:Nn \tl_map_break: { }
  }
\cs_new:Npn \tl_map_function:NN
  { \exp_args:No \tl_map_function:nN }
\cs_new:Npn \__tl_map_function:Nn #1#2
  {
    \__quark_if_recursion_tail_break:nN {#2} \tl_map_break:
    #1 {#2} \__tl_map_function:Nn #1
  }
\cs_generate_variant:Nn \tl_map_function:NN { c }
\cs_new_protected:Npn \tl_map_inline:nn #1#2
  {
    \int_gincr:N \g__prg_map_int
    \cs_gset_protected:cpn
      { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2}
    \exp_args:Nc \__tl_map_function:Nn
      { __prg_map_ \int_use:N \g__prg_map_int :w }
      #1 \q_recursion_tail
    \__prg_break_point:Nn \tl_map_break: { \int_gdecr:N \g__prg_map_int }
  }
\cs_new_protected:Npn \tl_map_inline:Nn
  { \exp_args:No \tl_map_inline:nn }
\cs_generate_variant:Nn \tl_map_inline:Nn { c }
\cs_new_protected:Npn \tl_map_variable:nNn #1#2#3
  {
    \__tl_map_variable:Nnn #2 {#3} #1
      \q_recursion_tail
    \__prg_break_point:Nn \tl_map_break: { }
  }
\cs_new_protected:Npn \tl_map_variable:NNn
  { \exp_args:No \tl_map_variable:nNn }
\cs_new_protected:Npn \__tl_map_variable:Nnn #1#2#3
  {
    \tl_set:Nn #1 {#3}
    \__quark_if_recursion_tail_break:NN #1 \tl_map_break:
    \use:n {#2}
    \__tl_map_variable:Nnn #1 {#2}
  }
\cs_generate_variant:Nn \tl_map_variable:NNn { c }
\cs_new:Npn \tl_map_break:
  { \__prg_map_break:Nn \tl_map_break: { } }
\cs_new:Npn \tl_map_break:n
  { \__prg_map_break:Nn \tl_map_break: }
\cs_new:Npn \tl_to_str:N #1 { \etex_detokenize:D \exp_after:wN {#1} }
\cs_generate_variant:Nn \tl_to_str:N { c }
\cs_new:Npn \tl_use:N #1
  {
    \tl_if_exist:NTF #1 {#1}
      {
        \__msg_kernel_expandable_error:nnn
          { kernel } { bad-variable } {#1}
      }
  }
\cs_generate_variant:Nn \tl_use:N { c }
\cs_new:Npn \tl_count:n #1
  {
    \int_eval:n
      { 0 \tl_map_function:nN {#1} \__tl_count:n }
  }
\cs_new:Npn \tl_count:N #1
  {
    \int_eval:n
      { 0 \tl_map_function:NN #1 \__tl_count:n }
  }
\cs_new:Npn \__tl_count:n #1 { + 1 }
\cs_generate_variant:Nn \tl_count:n { V , o }
\cs_generate_variant:Nn \tl_count:N { c }
\cs_new:Npn \tl_reverse_items:n #1
  {
    \__tl_reverse_items:nwNwn #1 ?
      \q_mark \__tl_reverse_items:nwNwn
      \q_mark \__tl_reverse_items:wn
      \q_stop { }
  }
\cs_new:Npn \__tl_reverse_items:nwNwn #1 #2 \q_mark #3 #4 \q_stop #5
  {
    #3 #2
      \q_mark \__tl_reverse_items:nwNwn
      \q_mark \__tl_reverse_items:wn
      \q_stop { {#1} #5 }
  }
\cs_new:Npn \__tl_reverse_items:wn #1 \q_stop #2
  { \exp_not:o { \use_none:nn #2 } }
\cs_new:Npn \tl_trim_spaces:n #1
  { \__tl_trim_spaces:nn { \q_mark #1 } \exp_not:o }
\cs_new_protected:Npn \tl_trim_spaces:N #1
  { \tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
\cs_new_protected:Npn \tl_gtrim_spaces:N #1
  { \tl_gset:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
\cs_generate_variant:Nn \tl_trim_spaces:N  { c }
\cs_generate_variant:Nn \tl_gtrim_spaces:N { c }
\cs_set:Npn \__tl_tmp:w #1
  {
    \cs_new:Npn \__tl_trim_spaces:nn ##1
      {
        \__tl_trim_spaces_auxi:w
          ##1
          \q_nil
          \q_mark #1 { }
          \q_mark \__tl_trim_spaces_auxii:w
          \__tl_trim_spaces_auxiii:w
          #1 \q_nil
          \__tl_trim_spaces_auxiv:w
        \q_stop
      }
    \cs_new:Npn \__tl_trim_spaces_auxi:w ##1 \q_mark #1 ##2 \q_mark ##3
      {
        ##3
        \__tl_trim_spaces_auxi:w
        \q_mark
        ##2
        \q_mark #1 {##1}
      }
    \cs_new:Npn \__tl_trim_spaces_auxii:w
        \__tl_trim_spaces_auxi:w \q_mark \q_mark ##1
      {
        \__tl_trim_spaces_auxiii:w
        ##1
      }
    \cs_new:Npn \__tl_trim_spaces_auxiii:w ##1 #1 \q_nil ##2
      {
        ##2
        ##1 \q_nil
        \__tl_trim_spaces_auxiii:w
      }
    \cs_new:Npn \__tl_trim_spaces_auxiv:w ##1 \q_nil ##2 \q_stop ##3
      { ##3 { \use_none:n ##1 } }
  }
\__tl_tmp:w { ~ }
\cs_new:Npn \__tl_act:NNNnn #1#2#3#4#5
  {
    \group_align_safe_begin:
    \__tl_act_loop:w #5 \q__tl_act_mark \q__tl_act_stop
    {#4} #1 #2 #3
    \__tl_act_result:n { }
  }
\cs_new:Npn \__tl_act_loop:w #1 \q__tl_act_stop
  {
    \tl_if_head_is_N_type:nTF {#1}
      { \__tl_act_normal:NwnNNN }
      {
        \tl_if_head_is_group:nTF {#1}
          { \__tl_act_group:nwnNNN }
          { \__tl_act_space:wwnNNN }
      }
    #1 \q__tl_act_stop
  }
\cs_new:Npn \__tl_act_normal:NwnNNN #1 #2 \q__tl_act_stop #3#4
  {
    \if_meaning:w \q__tl_act_mark #1
      \exp_after:wN \__tl_act_end:wn
    \fi:
    #4 {#3} #1
    \__tl_act_loop:w #2 \q__tl_act_stop
    {#3} #4
  }
\cs_new:Npn \__tl_act_end:wn #1 \__tl_act_result:n #2
  { \group_align_safe_end: \exp_end: #2 }
\cs_new:Npn \__tl_act_group:nwnNNN #1 #2 \q__tl_act_stop #3#4#5
  {
    #5 {#3} {#1}
    \__tl_act_loop:w #2 \q__tl_act_stop
    {#3} #4 #5
  }
\exp_last_unbraced:NNo
  \cs_new:Npn \__tl_act_space:wwnNNN \c_space_tl #1 \q__tl_act_stop #2#3#4#5
  {
    #5 {#2}
    \__tl_act_loop:w #1 \q__tl_act_stop
    {#2} #3 #4 #5
  }
\cs_new:Npn \__tl_act_output:n #1 #2 \__tl_act_result:n #3
  { #2 \__tl_act_result:n { #3 #1 } }
\cs_new:Npn \__tl_act_reverse_output:n #1 #2 \__tl_act_result:n #3
  { #2 \__tl_act_result:n { #1 #3 } }
\cs_new:Npn \tl_reverse:n #1
  {
    \etex_unexpanded:D \exp_after:wN
      {
        \exp:w
        \__tl_act:NNNnn
          \__tl_reverse_normal:nN
          \__tl_reverse_group_preserve:nn
          \__tl_reverse_space:n
          { }
          {#1}
      }
  }
\cs_generate_variant:Nn \tl_reverse:n { o , V }
\cs_new:Npn \__tl_reverse_normal:nN #1#2
  { \__tl_act_reverse_output:n {#2} }
\cs_new:Npn \__tl_reverse_group_preserve:nn #1#2
  { \__tl_act_reverse_output:n { {#2} } }
\cs_new:Npn \__tl_reverse_space:n #1
  { \__tl_act_reverse_output:n { ~ } }
\cs_new_protected:Npn \tl_reverse:N #1
  { \tl_set:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
\cs_new_protected:Npn \tl_greverse:N #1
  { \tl_gset:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
\cs_generate_variant:Nn \tl_reverse:N  { c }
\cs_generate_variant:Nn \tl_greverse:N { c }
\cs_new:Npn \tl_head:n #1
  {
    \etex_unexpanded:D
      \if_false: { \fi: \__tl_head_auxi:nw #1 { } \q_stop }
  }
\cs_new:Npn \__tl_head_auxi:nw #1#2 \q_stop
  {
    \exp_after:wN \__tl_head_auxii:n \exp_after:wN {
      \if_false: } \fi: {#1}
  }
\cs_new:Npn \__tl_head_auxii:n #1
  {
    \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
      \tl_to_str:n \exp_after:wN { \use_none:n #1 } \q_nil
      \exp_after:wN \use_i:nn
    \else:
      \exp_after:wN \use_ii:nn
    \fi:
      {#1}
      { \if_false: { \fi: \__tl_head_auxi:nw #1 } }
  }
\cs_generate_variant:Nn \tl_head:n { V , v , f }
\cs_new:Npn \tl_head:w #1#2 \q_stop {#1}
\cs_new:Npn \tl_head:N { \exp_args:No \tl_head:n }
\cs_new:Npn \tl_tail:n #1
  {
    \etex_unexpanded:D
      \tl_if_blank:nTF {#1}
        { { } }
        { \exp_after:wN { \use_none:n #1 } }
  }
\cs_generate_variant:Nn \tl_tail:n { V , v , f }
\cs_new:Npn \tl_tail:N { \exp_args:No \tl_tail:n }
\prg_new_conditional:Npnn \tl_if_head_eq_charcode:nN #1#2 { p , T , F , TF }
  {
    \if_charcode:w
        \exp_not:N #2
        \tl_if_head_is_N_type:nTF { #1 ? }
          {
            \exp_after:wN \exp_not:N
            \tl_head:w #1 { ? \use_none:nn } \q_stop
          }
          { \str_head:n {#1} }
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_generate_variant:Nn \tl_if_head_eq_charcode_p:nN { f }
\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNTF { f }
\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT  { f }
\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNF  { f }
\prg_new_conditional:Npnn \tl_if_head_eq_catcode:nN #1 #2 { p , T , F , TF }
  {
    \if_catcode:w
        \exp_not:N #2
        \tl_if_head_is_N_type:nTF { #1 ? }
          {
            \exp_after:wN \exp_not:N
            \tl_head:w #1 { ? \use_none:nn } \q_stop
          }
          {
            \tl_if_head_is_group:nTF {#1}
              { \c_group_begin_token }
              { \c_space_token }
          }
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\prg_new_conditional:Npnn \tl_if_head_eq_meaning:nN #1#2 { p , T , F , TF }
  {
    \tl_if_head_is_N_type:nTF { #1 ? }
      { \__tl_if_head_eq_meaning_normal:nN }
      { \__tl_if_head_eq_meaning_special:nN }
    {#1} #2
  }
\cs_new:Npn \__tl_if_head_eq_meaning_normal:nN #1 #2
  {
    \exp_after:wN \if_meaning:w
        \tl_head:w #1 { ?? \use_none:nnn } \q_stop #2
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_new:Npn \__tl_if_head_eq_meaning_special:nN #1 #2
  {
    \if_charcode:w \str_head:n {#1} \exp_not:N #2
      \exp_after:wN \use:n
    \else:
      \prg_return_false:
      \exp_after:wN \use_none:n
    \fi:
    {
      \if_catcode:w \exp_not:N #2
                    \tl_if_head_is_group:nTF {#1}
                      { \c_group_begin_token }
                      { \c_space_token }
        \prg_return_true:
      \else:
        \prg_return_false:
      \fi:
    }
  }
\prg_new_conditional:Npnn \tl_if_head_is_N_type:n #1 { p , T , F , TF }
  {
    \if_catcode:w
        \if_false: { \fi: \__tl_if_head_is_N_type:w ? #1 ~ }
        \exp_after:wN \use_none:n
          \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } }
        * *
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_new:Npn \__tl_if_head_is_N_type:w #1 ~
  {
    \tl_if_empty:oTF { \use_none:n #1 } { ^ } { }
    \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
  }
\prg_new_conditional:Npnn \tl_if_head_is_group:n #1 { p , T , F , TF }
  {
    \if_catcode:w
        \exp_after:wN \use_none:n
          \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } }
        * *
      \prg_return_false:
    \else:
      \prg_return_true:
    \fi:
  }
\prg_new_conditional:Npnn \tl_if_head_is_space:n #1 { p , T , F , TF }
  {
    \exp:w \if_false: { \fi:
      \__tl_if_head_is_space:w ? #1 ? ~ }
  }
\cs_new:Npn \__tl_if_head_is_space:w #1 ~
  {
    \tl_if_empty:oTF { \use_none:n #1 }
      { \exp_after:wN \exp_end: \exp_after:wN \prg_return_true: }
      { \exp_after:wN \exp_end: \exp_after:wN \prg_return_false: }
    \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
  }
\cs_new:Npn \tl_item:nn #1#2
  {
    \exp_args:Nf \__tl_item:nn
      { \exp_args:Nf \__tl_item_aux:nn { \int_eval:n {#2} } {#1} }
    #1
    \q_recursion_tail
    \__prg_break_point:
  }
\cs_new:Npn \__tl_item_aux:nn #1#2
  {
    \int_compare:nNnTF {#1} < 0
      { \int_eval:n { \tl_count:n {#2} + 1 + #1 } }
      {#1}
  }
\cs_new:Npn \__tl_item:nn #1#2
  {
    \__quark_if_recursion_tail_break:nN {#2} \__prg_break:
    \int_compare:nNnTF {#1} = 1
      { \__prg_break:n { \exp_not:n {#2} } }
      { \exp_args:Nf \__tl_item:nn { \int_eval:n { #1 - 1 } } }
  }
\cs_new:Npn \tl_item:Nn { \exp_args:No \tl_item:nn }
\cs_generate_variant:Nn \tl_item:Nn { c }
\cs_new_protected:Npn \tl_show:N #1
  {
    \__msg_show_variable:NNNnn #1 \tl_if_exist:NTF ? { }
      { > ~ \token_to_str:N #1 = \tl_to_str:N #1 }
  }
\cs_generate_variant:Nn \tl_show:N { c }
\cs_new_protected:Npn \tl_show:n #1
  { \__msg_show_wrap:n { > ~ \tl_to_str:n {#1} } }
\cs_new_protected:Npn \tl_log:N
  { \__msg_log_next: \tl_show:N }
\cs_generate_variant:Nn \tl_log:N { c }
\cs_new_protected:Npn \tl_log:n
  { \__msg_log_next: \tl_show:n }
\tl_new:N \g_tmpa_tl
\tl_new:N \g_tmpb_tl
\tl_new:N \l_tmpa_tl
\tl_new:N \l_tmpb_tl
\cs_new_protected:Npn \tl_to_lowercase:n #1
  {
    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
      { 2017-12-31 }
      { \token_to_str:N \tl_to_lowercase:n }
      { }
    \cs_gset_eq:NN \tl_to_lowercase:n \tex_lowercase:D
    \tex_lowercase:D {#1}
  }
\cs_new_protected:Npn \tl_to_uppercase:n #1
  {
    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
      { 2017-12-31 }
      { \token_to_str:N \tl_to_uppercase:n }
      { }
    \cs_gset_eq:NN \tl_to_uppercase:n \tex_uppercase:D
    \tex_uppercase:D {#1}
  }
%% File: l3str.dtx Copyright (C) 2011-2017 The LaTeX3 Project
\group_begin:
  \cs_set_protected:Npn \__str_tmp:n #1
    {
      \tl_if_blank:nF {#1}
        {
          \cs_new_eq:cc { str_ #1 :N } { tl_ #1 :N }
          \exp_args:Nc \cs_generate_variant:Nn { str_ #1 :N } { c }
          \__str_tmp:n
        }
    }
  \__str_tmp:n
    { new }
    { use }
    { clear }
    { gclear }
    { clear_new }
    { gclear_new }
    { }
\group_end:
\cs_new_eq:NN \str_set_eq:NN \tl_set_eq:NN
\cs_new_eq:NN \str_gset_eq:NN \tl_gset_eq:NN
\cs_generate_variant:Nn \str_set_eq:NN  { c , Nc , cc }
\cs_generate_variant:Nn \str_gset_eq:NN { c , Nc , cc }
\group_begin:
  \cs_set_protected:Npn \__str_tmp:n #1
    {
      \tl_if_blank:nF {#1}
        {
          \cs_new_protected:cpx { str_ #1 :Nn } ##1##2
            { \exp_not:c { tl_ #1 :Nx } ##1 { \exp_not:N \tl_to_str:n {##2} } }
          \exp_args:Nc \cs_generate_variant:Nn { str_ #1 :Nn } { Nx , cn , cx }
          \__str_tmp:n
        }
    }
  \__str_tmp:n
    { set }
    { gset }
    { const }
    { put_left }
    { gput_left }
    { put_right }
    { gput_right }
    { }
\group_end:
\prg_new_eq_conditional:NNn \str_if_exist:N \tl_if_exist:N { p , T , F , TF }
\prg_new_eq_conditional:NNn \str_if_exist:c \tl_if_exist:c { p , T , F , TF }
\prg_new_eq_conditional:NNn \str_if_empty:N \tl_if_empty:N { p , T , F , TF }
\prg_new_eq_conditional:NNn \str_if_empty:c \tl_if_empty:c { p , T , F , TF }
\cs_new:Npn \__str_if_eq_x:nn #1#2 { \pdftex_strcmp:D {#1} {#2} }
\cs_if_exist:NT \luatex_luatexversion:D
   {
     \cs_set:Npn \__str_if_eq_x:nn #1#2
       {
          \luatex_directlua:D
            {
              l3kernel.strcmp
                (
                  " \__str_escape_x:n {#1} " ,
                  " \__str_escape_x:n {#2} "
                )
            }
       }
     \cs_new:Npn \__str_escape_x:n #1
       {
         \luatex_luaescapestring:D
           {
             \etex_detokenize:D \exp_after:wN { \luatex_expanded:D {#1} }
           }
       }
   }
\cs_new:Npn \__str_if_eq_x_return:nn #1 #2
  {
    \if_int_compare:w \__str_if_eq_x:nn {#1} {#2} = 0 \exp_stop_f:
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\prg_new_conditional:Npnn \str_if_eq:nn #1#2 { p , T , F , TF }
  {
    \if_int_compare:w
      \__str_if_eq_x:nn { \exp_not:n {#1} } { \exp_not:n {#2} }
      = 0 \exp_stop_f:
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\cs_generate_variant:Nn \str_if_eq_p:nn {  V ,  o }
\cs_generate_variant:Nn \str_if_eq_p:nn { nV , no , VV }
\cs_generate_variant:Nn \str_if_eq:nnT  {  V ,  o }
\cs_generate_variant:Nn \str_if_eq:nnT  { nV , no , VV }
\cs_generate_variant:Nn \str_if_eq:nnF  {  V ,  o }
\cs_generate_variant:Nn \str_if_eq:nnF  { nV , no , VV }
\cs_generate_variant:Nn \str_if_eq:nnTF {  V ,  o }
\cs_generate_variant:Nn \str_if_eq:nnTF { nV , no , VV }
\prg_new_conditional:Npnn \str_if_eq_x:nn #1#2 { p , T , F , TF }
  {
    \if_int_compare:w \__str_if_eq_x:nn {#1} {#2} = 0 \exp_stop_f:
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \str_if_eq:NN #1#2 { p , TF , T , F }
  {
    \if_int_compare:w \__str_if_eq_x:nn { \tl_to_str:N #1 } { \tl_to_str:N #2 }
      = 0 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi:
  }
\cs_generate_variant:Nn \str_if_eq:NNT  { c , Nc , cc }
\cs_generate_variant:Nn \str_if_eq:NNF  { c , Nc , cc }
\cs_generate_variant:Nn \str_if_eq:NNTF { c , Nc , cc }
\cs_generate_variant:Nn \str_if_eq_p:NN { c , Nc , cc }
\cs_new:Npn \str_case:nn #1#2
  {
    \exp:w
    \__str_case:nnTF {#1} {#2} { } { }
  }
\cs_new:Npn \str_case:nnT #1#2#3
  {
    \exp:w
    \__str_case:nnTF {#1} {#2} {#3} { }
  }
\cs_new:Npn \str_case:nnF #1#2
  {
    \exp:w
    \__str_case:nnTF {#1} {#2} { }
  }
\cs_new:Npn \str_case:nnTF #1#2
  {
    \exp:w
    \__str_case:nnTF {#1} {#2}
  }
\cs_new:Npn \__str_case:nnTF #1#2#3#4
  { \__str_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
\cs_generate_variant:Nn \str_case:nn   { o , nV , nv }
\cs_generate_variant:Nn \str_case:nnT  { o , nV , nv }
\cs_generate_variant:Nn \str_case:nnF  { o , nV , nv }
\cs_generate_variant:Nn \str_case:nnTF { o , nV , nv }
\cs_new:Npn \__str_case:nw #1#2#3
  {
    \str_if_eq:nnTF {#1} {#2}
      { \__str_case_end:nw {#3} }
      { \__str_case:nw {#1} }
  }
\cs_new:Npn \str_case_x:nn #1#2
  {
    \exp:w
    \__str_case_x:nnTF {#1} {#2} { } { }
  }
\cs_new:Npn \str_case_x:nnT #1#2#3
  {
    \exp:w
    \__str_case_x:nnTF {#1} {#2} {#3} { }
  }
\cs_new:Npn \str_case_x:nnF #1#2
  {
    \exp:w
    \__str_case_x:nnTF {#1} {#2} { }
  }
\cs_new:Npn \str_case_x:nnTF #1#2
  {
    \exp:w
    \__str_case_x:nnTF {#1} {#2}
  }
\cs_new:Npn \__str_case_x:nnTF #1#2#3#4
  { \__str_case_x:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
\cs_new:Npn \__str_case_x:nw #1#2#3
  {
    \str_if_eq_x:nnTF {#1} {#2}
      { \__str_case_end:nw {#3} }
      { \__str_case_x:nw {#1} }
  }
\cs_new_eq:NN \__str_case_end:nw \__prg_case_end:nw
\cs_new:Npn \__str_to_other:n #1
  {
    \exp_after:wN \__str_to_other_loop:w
      \tl_to_str:n {#1} ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_mark \q_stop
  }
\group_begin:
\tex_lccode:D `\* = `\  %
\tex_lccode:D `\A = `\A
\tex_lowercase:D
  {
    \group_end:
    \cs_new:Npn \__str_to_other_loop:w
      #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 ~ #7 ~ #8 ~ #9 \q_stop
      {
        \if_meaning:w A #8
          \__str_to_other_end:w
        \fi:
        \__str_to_other_loop:w
        #9 #1 * #2 * #3 * #4 * #5 * #6 * #7 * #8 * \q_stop
      }
    \cs_new:Npn \__str_to_other_end:w \fi: #1 \q_mark #2 * A #3 \q_stop
      { \fi: #2 }
  }
\cs_new:Npn \__str_to_other_fast:n #1
  {
    \exp_after:wN \__str_to_other_fast_loop:w \tl_to_str:n {#1} ~
      A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_stop
  }
\group_begin:
\tex_lccode:D `\* = `\  %
\tex_lccode:D `\A = `\A
\tex_lowercase:D
  {
    \group_end:
    \cs_new:Npn \__str_to_other_fast_loop:w
      #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 ~ #7 ~ #8 ~ #9 ~
      {
        \if_meaning:w A #9
          \__str_to_other_fast_end:w
        \fi:
        #1 * #2 * #3 * #4 * #5 * #6 * #7 * #8 * #9
        \__str_to_other_fast_loop:w *
      }
    \cs_new:Npn \__str_to_other_fast_end:w #1 * A #2 \q_stop {#1}
  }
\cs_new:Npn \str_item:Nn { \exp_args:No \str_item:nn }
\cs_generate_variant:Nn \str_item:Nn { c }
\cs_new:Npn \str_item:nn #1#2
  {
    \exp_args:Nf \tl_to_str:n
      {
        \exp_args:Nf \__str_item:nn
          { \__str_to_other:n {#1} } {#2}
      }
  }
\cs_new:Npn \str_item_ignore_spaces:nn #1
  { \exp_args:No \__str_item:nn { \tl_to_str:n {#1} } }
\cs_new:Npn \__str_item:nn #1#2
  {
    \exp_after:wN \__str_item:w
    \__int_value:w \__int_eval:w #2 \exp_after:wN ;
    \__int_value:w \__str_count:n {#1} ;
    #1 \q_stop
  }
\cs_new:Npn \__str_item:w #1; #2;
  {
    \int_compare:nNnTF {#1} < 0
      {
        \int_compare:nNnTF {#1} < {-#2}
          { \use_none_delimit_by_q_stop:w }
          {
            \exp_after:wN \use_i_delimit_by_q_stop:nw
            \exp:w \exp_after:wN \__str_skip_exp_end:w
              \__int_value:w \__int_eval:w #1 + #2 ;
          }
      }
      {
        \int_compare:nNnTF {#1} > {#2}
          { \use_none_delimit_by_q_stop:w }
          {
            \exp_after:wN \use_i_delimit_by_q_stop:nw
            \exp:w \__str_skip_exp_end:w #1 ; { }
          }
      }
  }
\cs_new:Npn \__str_skip_exp_end:w #1;
  {
    \if_int_compare:w #1 > 8 \exp_stop_f:
      \exp_after:wN \__str_skip_loop:wNNNNNNNN
    \else:
      \exp_after:wN \__str_skip_end:w
      \__int_value:w \__int_eval:w
    \fi:
    #1 ;
  }
\cs_new:Npn \__str_skip_loop:wNNNNNNNN #1; #2#3#4#5#6#7#8#9
  { \exp_after:wN \__str_skip_exp_end:w \__int_value:w \__int_eval:w #1 - 8 ; }
\cs_new:Npn \__str_skip_end:w #1 ;
  {
    \exp_after:wN \__str_skip_end:NNNNNNNN
    \if_case:w #1 \exp_stop_f: \or: \or: \or: \or: \or: \or: \or: \or:
  }
\cs_new:Npn \__str_skip_end:NNNNNNNN #1#2#3#4#5#6#7#8 { \fi: \exp_end: }
\cs_new:Npn \str_range:Nnn { \exp_args:No \str_range:nnn }
\cs_generate_variant:Nn \str_range:Nnn { c }
\cs_new:Npn \str_range:nnn #1#2#3
  {
    \exp_args:Nf \tl_to_str:n
      {
        \exp_args:Nf \__str_range:nnn
          { \__str_to_other:n {#1} } {#2} {#3}
      }
  }
\cs_new:Npn \str_range_ignore_spaces:nnn #1
  { \exp_args:No \__str_range:nnn { \tl_to_str:n {#1} } }
\cs_new:Npn \__str_range:nnn #1#2#3
  {
    \exp_after:wN \__str_range:w
    \__int_value:w \__str_count:n {#1} \exp_after:wN ;
    \__int_value:w \__int_eval:w #2 - 1 \exp_after:wN ;
    \__int_value:w \__int_eval:w #3 ;
    #1 \q_stop
  }
\cs_new:Npn \__str_range:w #1; #2; #3;
  {
    \exp_args:Nf \__str_range:nnw
      { \__str_range_normalize:nn {#2} {#1} }
      { \__str_range_normalize:nn {#3} {#1} }
  }
\cs_new:Npn \__str_range:nnw #1#2
  {
    \exp_after:wN \__str_collect_delimit_by_q_stop:w
    \__int_value:w \__int_eval:w #2 - #1 \exp_after:wN ;
    \exp:w \__str_skip_exp_end:w #1 ;
  }
\cs_new:Npn \__str_range_normalize:nn #1#2
  {
    \int_eval:n
      {
        \if_int_compare:w #1 < 0 \exp_stop_f:
          \if_int_compare:w #1 < -#2 \exp_stop_f:
            0
          \else:
            #1 + #2 + 1
          \fi:
        \else:
          \if_int_compare:w #1 < #2 \exp_stop_f:
            #1
          \else:
            #2
          \fi:
        \fi:
      }
  }
\cs_new:Npn \__str_collect_delimit_by_q_stop:w #1;
  { \__str_collect_loop:wn #1 ; { } }
\cs_new:Npn \__str_collect_loop:wn #1 ;
  {
    \if_int_compare:w #1 > 7 \exp_stop_f:
      \exp_after:wN \__str_collect_loop:wnNNNNNNN
    \else:
      \exp_after:wN \__str_collect_end:wn
    \fi:
    #1 ;
  }
\cs_new:Npn \__str_collect_loop:wnNNNNNNN #1; #2 #3#4#5#6#7#8#9
  {
    \exp_after:wN \__str_collect_loop:wn
    \__int_value:w \__int_eval:w #1 - 7 ;
    { #2 #3#4#5#6#7#8#9 }
  }
\cs_new:Npn \__str_collect_end:wn #1 ;
  {
    \exp_after:wN \__str_collect_end:nnnnnnnnw
    \if_case:w \if_int_compare:w #1 > 0 \exp_stop_f: #1 \else: 0 \fi: \exp_stop_f:
    \or: \or: \or: \or: \or: \or: \fi:
  }
\cs_new:Npn \__str_collect_end:nnnnnnnnw #1#2#3#4#5#6#7#8 #9 \q_stop
  { #1#2#3#4#5#6#7#8 }
\cs_new:Npn \str_count_spaces:N
  { \exp_args:No \str_count_spaces:n }
\cs_generate_variant:Nn \str_count_spaces:N { c }
\cs_new:Npn \str_count_spaces:n #1
  {
    \int_eval:n
      {
        \exp_after:wN \__str_count_spaces_loop:w
        \tl_to_str:n {#1} ~
        X 7 ~ X 6 ~ X 5 ~ X 4 ~ X 3 ~ X 2 ~ X 1 ~ X 0 ~ X -1 ~
        \q_stop
      }
  }
\cs_new:Npn \__str_count_spaces_loop:w #1~#2~#3~#4~#5~#6~#7~#8~#9~
  {
    \if_meaning:w X #9
      \use_i_delimit_by_q_stop:nw
    \fi:
    9 + \__str_count_spaces_loop:w
  }
\cs_new:Npn \str_count:N { \exp_args:No \str_count:n }
\cs_generate_variant:Nn \str_count:N { c }
\cs_new:Npn \str_count:n #1
  {
    \__str_count_aux:n
      {
        \str_count_spaces:n {#1}
        + \exp_after:wN \__str_count_loop:NNNNNNNNN \tl_to_str:n {#1}
      }
  }
\cs_new:Npn \__str_count:n #1
  {
    \__str_count_aux:n
      { \__str_count_loop:NNNNNNNNN #1 }
  }
\cs_new:Npn \str_count_ignore_spaces:n #1
  {
    \__str_count_aux:n
      { \exp_after:wN \__str_count_loop:NNNNNNNNN \tl_to_str:n {#1} }
  }
\cs_new:Npn \__str_count_aux:n #1
  {
    \int_eval:n
      {
        #1
        { X 8 } { X 7 } { X 6 }
        { X 5 } { X 4 } { X 3 }
        { X 2 } { X 1 } { X 0 }
        \q_stop
      }
  }
\cs_new:Npn \__str_count_loop:NNNNNNNNN #1#2#3#4#5#6#7#8#9
  {
    \if_meaning:w X #9
      \exp_after:wN \use_none_delimit_by_q_stop:w
    \fi:
    9 + \__str_count_loop:NNNNNNNNN
  }
\cs_new:Npn \str_head:N { \exp_args:No \str_head:n }
\cs_generate_variant:Nn \str_head:N { c }
\cs_new:Npn \str_head:n #1
  {
    \exp_after:wN \__str_head:w
    \tl_to_str:n {#1}
    { { } } ~ \q_stop
  }
\cs_new:Npn \__str_head:w #1 ~ %
  { \use_i_delimit_by_q_stop:nw #1 { ~ } }
\cs_new:Npn \str_head_ignore_spaces:n #1
  {
    \exp_after:wN \use_i_delimit_by_q_stop:nw
    \tl_to_str:n {#1} { } \q_stop
  }
\cs_new:Npn \str_tail:N { \exp_args:No \str_tail:n }
\cs_generate_variant:Nn \str_tail:N { c }
\cs_new:Npn \str_tail:n #1
  {
    \exp_after:wN \__str_tail_auxi:w
    \reverse_if:N \if_charcode:w
        \scan_stop: \tl_to_str:n {#1} X X \q_stop
  }
\cs_new:Npn \__str_tail_auxi:w #1 X #2 \q_stop { \fi: #1 }
\cs_new:Npn \str_tail_ignore_spaces:n #1
  {
    \exp_after:wN \__str_tail_auxii:w
    \tl_to_str:n {#1} \q_mark \q_mark \q_stop
  }
\cs_new:Npn \__str_tail_auxii:w #1 #2 \q_mark #3 \q_stop { #2 }
\cs_new:Npn \str_fold_case:n  #1 { \__str_change_case:nn {#1} { fold } }
\cs_new:Npn \str_lower_case:n #1 { \__str_change_case:nn {#1} { lower } }
\cs_new:Npn \str_upper_case:n #1 { \__str_change_case:nn {#1} { upper } }
\cs_generate_variant:Nn \str_fold_case:n  { V }
\cs_generate_variant:Nn \str_lower_case:n { f }
\cs_generate_variant:Nn \str_upper_case:n { f }
\cs_new:Npn \__str_change_case:nn #1
  {
    \exp_after:wN \__str_change_case_aux:nn \exp_after:wN
      { \tl_to_str:n {#1} }
  }
\cs_new:Npn \__str_change_case_aux:nn #1#2
  {
    \__str_change_case_loop:nw {#2} #1 \q_recursion_tail \q_recursion_stop
      \__str_change_case_result:n { }
  }
\cs_new:Npn \__str_change_case_output:nw #1#2 \__str_change_case_result:n #3
  { #2 \__str_change_case_result:n { #3 #1 } }
\cs_generate_variant:Nn  \__str_change_case_output:nw { f }
\cs_new:Npn \__str_change_case_end:wn #1 \__str_change_case_result:n #2 { #2 }
\cs_new:Npn \__str_change_case_loop:nw #1#2 \q_recursion_stop
  {
    \tl_if_head_is_space:nTF {#2}
      { \__str_change_case_space:n }
      { \__str_change_case_char:nN }
    {#1} #2 \q_recursion_stop
  }
\use:x
  { \cs_new:Npn \exp_not:N \__str_change_case_space:n ##1 \c_space_tl }
  {
    \__str_change_case_output:nw { ~ }
    \__str_change_case_loop:nw {#1}
  }
\cs_new:Npn \__str_change_case_char:nN #1#2
  {
    \quark_if_recursion_tail_stop_do:Nn #2
      { \__str_change_case_end:wn }
    \cs_if_exist:cTF { c__unicode_ #1 _ #2 _tl }
      {
        \__str_change_case_output:fw
          { \tl_to_str:c { c__unicode_ #1 _ #2 _tl } }
      }
      { \__str_change_case_char_aux:nN {#1} #2 }
    \__str_change_case_loop:nw {#1}
  }
\cs_if_exist:NTF \utex_char:D
  {
    \cs_new:Npn \__str_change_case_char_aux:nN #1#2
      {
        \int_compare:nNnTF { \use:c { __str_lookup_ #1 :N } #2 } = { 0 }
          { \__str_change_case_output:nw {#2} }
          {
            \__str_change_case_output:fw
              { \utex_char:D \use:c { __str_lookup_ #1 :N } #2 ~ }
          }
      }
    \cs_new_protected:Npn \__str_lookup_lower:N #1 { \tex_lccode:D `#1 }
    \cs_new_protected:Npn \__str_lookup_upper:N #1 { \tex_uccode:D `#1 }
    \cs_new_eq:NN \__str_lookup_fold:N \__str_lookup_lower:N
  }
  {
    \cs_new:Npn \__str_change_case_char_aux:nN #1#2
      { \__str_change_case_output:nw {#2} }
  }
\str_const:Nx \c_ampersand_str   { \cs_to_str:N \& }
\str_const:Nx \c_atsign_str      { \cs_to_str:N \@ }
\str_const:Nx \c_backslash_str   { \cs_to_str:N \\ }
\str_const:Nx \c_left_brace_str  { \cs_to_str:N \{ }
\str_const:Nx \c_right_brace_str { \cs_to_str:N \} }
\str_const:Nx \c_circumflex_str  { \cs_to_str:N \^ }
\str_const:Nx \c_colon_str       { \cs_to_str:N \: }
\str_const:Nx \c_dollar_str      { \cs_to_str:N \$ }
\str_const:Nx \c_hash_str        { \cs_to_str:N \# }
\str_const:Nx \c_percent_str     { \cs_to_str:N \% }
\str_const:Nx \c_tilde_str       { \cs_to_str:N \~ }
\str_const:Nx \c_underscore_str  { \cs_to_str:N \_ }
\str_new:N \l_tmpa_str
\str_new:N \l_tmpb_str
\str_new:N \g_tmpa_str
\str_new:N \g_tmpb_str
\cs_new_eq:NN \str_show:n \tl_show:n
\cs_new_eq:NN \str_show:N \tl_show:N
\cs_generate_variant:Nn \str_show:N { c }
\group_begin:
  \tex_chardef:D \g__unicode_data_ior
    \etex_numexpr:D
      \cs_if_exist:NTF \lastallocatedread
        { \lastallocatedread }
        {
          \cs_if_exist:NTF \c_syst_last_allocated_read
            { \c_syst_last_allocated_read }
            { \tex_count:D 16 ~ }
        }
        + 1
    \scan_stop:
  \cs_set_protected:Npn \__unicode_map_inline:n #1
    {
      \group_begin:
        \tex_catcode:D `\# = 12 \scan_stop:
        \tex_catcode:D `\  = 10 \scan_stop:
        \tex_openin:D \g__unicode_data_ior = #1 \scan_stop:
        \cs_if_exist:NT \utex_char:D
          { \__unicode_map_loop: }
        \tex_closein:D \g__unicode_data_ior
      \group_end:
    }
  \cs_set_protected:Npn \__unicode_map_loop:
    {
      \tex_ifeof:D \g__unicode_data_ior
        \exp_after:wN \use_none:n
      \else:
        \exp_after:wN \use:n
      \fi:
        {
          \tex_read:D \g__unicode_data_ior to \l__unicode_tmp_tl
          \if_meaning:w \c_empty_tl \l__unicode_tmp_tl
          \else:
            \exp_after:wN \__unicode_parse:w \l__unicode_tmp_tl \q_stop
          \fi:
          \__unicode_map_loop:
        }
    }
  \cs_set_protected:Npn \__unicode_parse:w #1#2 \q_stop
    {
      \reverse_if:N \if:w \c_hash_str #1
        \__unicode_parse_auxi:w #1#2 \q_stop
      \else:
        \if_int_compare:w \__str_if_eq_x:nn
          { \exp_not:n {#2} } { ~Conditional~Mappings~ } = 0 \exp_stop_f:
          \cs_set_protected:Npn \__unicode_parse:w ##1 \q_stop { }
        \fi:
      \fi:
    }
  \cs_set_protected:Npn \__unicode_store:nnnnn #1#2#3#4#5
    {
      \tl_const:cx { c__unicode_ #2 _ \utex_char:D "#1 _tl }
        {
          \utex_char:D "#3 ~
          \utex_char:D "#4 ~
          \tl_if_blank:nF {#5}
            { \utex_char:D "#5 }
        }
    }
  \cs_set_protected:Npn \__unicode_parse_auxi:w
    #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 ; #8 ; #9 ;
    { \__unicode_parse_auxii:w #1 ; }
  \cs_set_protected:Npn \__unicode_parse_auxii:w
    #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 \q_stop
    {
      \tl_if_blank:nF {#7}
        {
          \if_int_compare:w \__str_if_eq_x:nn { #5 ~ } {#7} = 0 \exp_stop_f:
          \else:
            \tl_const:cx
              { c__unicode_title_ \utex_char:D "#1 _tl }
              { \utex_char:D "#7 }
          \fi:
        }
    }
  \__unicode_map_inline:n { UnicodeData.txt }
  \cs_set_protected:Npn \__unicode_parse_auxi:w #1 ;~ #2 ;~ #3 ; #4 \q_stop
    {
      \if_int_compare:w \__str_if_eq_x:nn {#2} { C } = 0 \exp_stop_f:
        \if_int_compare:w \tex_lccode:D "#1 = "#3 \scan_stop:
        \else:
          \tl_const:cx
            { c__unicode_fold_ \utex_char:D "#1 _tl }
            { \utex_char:D "#3 ~ }
        \fi:
      \else:
        \if_int_compare:w \__str_if_eq_x:nn {#2} { F } = 0 \exp_stop_f:
          \__unicode_parse_auxii:w #1 ~ #3 ~ \q_stop
        \fi:
      \fi:
    }
  \cs_set_protected:Npn \__unicode_parse_auxii:w #1 ~ #2 ~ #3 ~ #4 \q_stop
    { \__unicode_store:nnnnn {#1} { fold } {#2} {#3} {#4} }
  \__unicode_map_inline:n { CaseFolding.txt }
  \cs_set_protected:Npn \__unicode_parse_auxi:w #1 ;~ #2 ;~ #3 ;~ #4 ; #5 \q_stop
    {
      \use:n { \__unicode_parse_auxii:w #1 ~ lower ~ #2 ~ } ~ \q_stop
      \use:n { \__unicode_parse_auxii:w #1 ~ upper ~ #4 ~ } ~ \q_stop
      \if_int_compare:w \__str_if_eq_x:nn {#3} {#4} = 0 \exp_stop_f:
      \else:
        \use:n { \__unicode_parse_auxii:w #1 ~ title ~ #3 ~ } ~ \q_stop
      \fi:
    }
  \cs_set_protected:Npn \__unicode_parse_auxii:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
    {
      \tl_if_empty:nF {#4}
        { \__unicode_store:nnnnn {#1} {#2} {#3} {#4} {#5} }
    }
  \__unicode_map_inline:n { SpecialCasing.txt }
  \cs_if_exist:NF \utex_char:D
    {
      \cs_set_protected:Npn \__unicode_tmp:NN #1#2
        {
          \if_meaning:w \q_recursion_tail #2
            \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
          \fi:
          \tl_const:cn { c__unicode_fold_  #1 _tl } {#2}
          \tl_const:cn { c__unicode_lower_ #1 _tl } {#2}
          \tl_const:cn { c__unicode_upper_ #2 _tl } {#1}
          \__unicode_tmp:NN
        }
      \__unicode_tmp:NN
        AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
        ? \q_recursion_tail \q_recursion_stop
    }
\group_end:
%% File: l3seq.dtx Copyright (C) 1990-2017 The LaTeX3 Project
\cs_new:Npn \__seq_item:n
  {
    \__msg_kernel_expandable_error:nn { kernel } { misused-sequence }
    \use_none:n
  }
\tl_new:N \l__seq_internal_a_tl
\tl_new:N \l__seq_internal_b_tl
\cs_new_eq:NN \__seq_tmp:w ?
\tl_const:Nn \c_empty_seq { \s__seq }
\cs_new_protected:Npn \seq_new:N #1
  {
    \__chk_if_free_cs:N #1
    \cs_gset_eq:NN #1 \c_empty_seq
  }
\cs_generate_variant:Nn \seq_new:N { c }
\cs_new_protected:Npn \seq_clear:N  #1
  { \seq_set_eq:NN #1 \c_empty_seq }
\cs_generate_variant:Nn \seq_clear:N  { c }
\cs_new_protected:Npn \seq_gclear:N #1
  { \seq_gset_eq:NN #1 \c_empty_seq }
\cs_generate_variant:Nn \seq_gclear:N { c }
\cs_new_protected:Npn \seq_clear_new:N  #1
  { \seq_if_exist:NTF #1 { \seq_clear:N #1 } { \seq_new:N #1 } }
\cs_generate_variant:Nn \seq_clear_new:N  { c }
\cs_new_protected:Npn \seq_gclear_new:N #1
  { \seq_if_exist:NTF #1 { \seq_gclear:N #1 } { \seq_new:N #1 } }
\cs_generate_variant:Nn \seq_gclear_new:N { c }
\cs_new_eq:NN \seq_set_eq:NN  \tl_set_eq:NN
\cs_new_eq:NN \seq_set_eq:Nc  \tl_set_eq:Nc
\cs_new_eq:NN \seq_set_eq:cN  \tl_set_eq:cN
\cs_new_eq:NN \seq_set_eq:cc  \tl_set_eq:cc
\cs_new_eq:NN \seq_gset_eq:NN \tl_gset_eq:NN
\cs_new_eq:NN \seq_gset_eq:Nc \tl_gset_eq:Nc
\cs_new_eq:NN \seq_gset_eq:cN \tl_gset_eq:cN
\cs_new_eq:NN \seq_gset_eq:cc \tl_gset_eq:cc
\cs_new_protected:Npn \seq_set_from_clist:NN #1#2
  {
    \tl_set:Nx #1
      { \s__seq \clist_map_function:NN #2 \__seq_wrap_item:n }
  }
\cs_new_protected:Npn \seq_set_from_clist:Nn #1#2
  {
    \tl_set:Nx #1
      { \s__seq \clist_map_function:nN {#2} \__seq_wrap_item:n }
  }
\cs_new_protected:Npn \seq_gset_from_clist:NN #1#2
  {
    \tl_gset:Nx #1
      { \s__seq \clist_map_function:NN #2 \__seq_wrap_item:n }
  }
\cs_new_protected:Npn \seq_gset_from_clist:Nn #1#2
  {
    \tl_gset:Nx #1
      { \s__seq \clist_map_function:nN {#2} \__seq_wrap_item:n }
  }
\cs_generate_variant:Nn \seq_set_from_clist:NN  {     Nc }
\cs_generate_variant:Nn \seq_set_from_clist:NN  { c , cc }
\cs_generate_variant:Nn \seq_set_from_clist:Nn  { c      }
\cs_generate_variant:Nn \seq_gset_from_clist:NN {     Nc }
\cs_generate_variant:Nn \seq_gset_from_clist:NN { c , cc }
\cs_generate_variant:Nn \seq_gset_from_clist:Nn { c      }
\cs_new_protected:Npn \seq_set_split:Nnn
  { \__seq_set_split:NNnn \tl_set:Nx }
\cs_new_protected:Npn \seq_gset_split:Nnn
  { \__seq_set_split:NNnn \tl_gset:Nx }
\cs_new_protected:Npn \__seq_set_split:NNnn #1#2#3#4
  {
    \tl_if_empty:nTF {#3}
      {
        \tl_set:Nn \l__seq_internal_a_tl
          { \tl_map_function:nN {#4} \__seq_wrap_item:n }
      }
      {
        \tl_set:Nn \l__seq_internal_a_tl
          {
            \__seq_set_split_auxi:w \prg_do_nothing:
            #4
            \__seq_set_split_end:
          }
        \tl_replace_all:Nnn \l__seq_internal_a_tl { #3 }
          {
            \__seq_set_split_end:
            \__seq_set_split_auxi:w \prg_do_nothing:
          }
        \tl_set:Nx \l__seq_internal_a_tl { \l__seq_internal_a_tl }
      }
    #1 #2 { \s__seq \l__seq_internal_a_tl }
  }
\cs_new:Npn \__seq_set_split_auxi:w #1 \__seq_set_split_end:
  {
    \exp_not:N \__seq_set_split_auxii:w
    \exp_args:No \tl_trim_spaces:n {#1}
    \exp_not:N \__seq_set_split_end:
  }
\cs_new:Npn \__seq_set_split_auxii:w #1 \__seq_set_split_end:
  { \__seq_wrap_item:n {#1} }
\cs_generate_variant:Nn \seq_set_split:Nnn  { NnV }
\cs_generate_variant:Nn \seq_gset_split:Nnn { NnV }
\cs_new_protected:Npn \seq_concat:NNN #1#2#3
  { \tl_set:Nf #1 { \exp_after:wN \use_i:nn \exp_after:wN #2 #3 } }
\cs_new_protected:Npn \seq_gconcat:NNN #1#2#3
  { \tl_gset:Nf #1 { \exp_after:wN \use_i:nn \exp_after:wN #2 #3 } }
\cs_generate_variant:Nn \seq_concat:NNN  { ccc }
\cs_generate_variant:Nn \seq_gconcat:NNN { ccc }
\prg_new_eq_conditional:NNn \seq_if_exist:N \cs_if_exist:N
  { TF , T , F , p }
\prg_new_eq_conditional:NNn \seq_if_exist:c \cs_if_exist:c
  { TF , T , F , p }
\cs_new_protected:Npn \seq_put_left:Nn #1#2
  {
    \tl_set:Nx #1
      {
        \exp_not:n { \s__seq \__seq_item:n {#2} }
        \exp_not:f { \exp_after:wN \__seq_put_left_aux:w #1 }
      }
  }
\cs_new_protected:Npn \seq_gput_left:Nn #1#2
  {
    \tl_gset:Nx #1
      {
        \exp_not:n { \s__seq \__seq_item:n {#2} }
        \exp_not:f { \exp_after:wN \__seq_put_left_aux:w #1 }
      }
  }
\cs_new:Npn \__seq_put_left_aux:w \s__seq { \exp_stop_f: }
\cs_generate_variant:Nn \seq_put_left:Nn  {     NV , Nv , No , Nx }
\cs_generate_variant:Nn \seq_put_left:Nn  { c , cV , cv , co , cx }
\cs_generate_variant:Nn \seq_gput_left:Nn  {     NV , Nv , No , Nx }
\cs_generate_variant:Nn \seq_gput_left:Nn  { c , cV , cv , co , cx }
\cs_new_protected:Npn \seq_put_right:Nn #1#2
  { \tl_put_right:Nn #1 { \__seq_item:n {#2} } }
\cs_new_protected:Npn \seq_gput_right:Nn #1#2
  { \tl_gput_right:Nn #1 { \__seq_item:n {#2} } }
\cs_generate_variant:Nn \seq_gput_right:Nn {     NV , Nv , No , Nx }
\cs_generate_variant:Nn \seq_gput_right:Nn { c , cV , cv , co , cx }
\cs_generate_variant:Nn \seq_put_right:Nn {     NV , Nv , No , Nx }
\cs_generate_variant:Nn \seq_put_right:Nn { c , cV , cv , co , cx }
\cs_new:Npn \__seq_wrap_item:n #1 { \exp_not:n { \__seq_item:n {#1} } }
\seq_new:N \l__seq_remove_seq
\cs_new_protected:Npn \seq_remove_duplicates:N
  { \__seq_remove_duplicates:NN \seq_set_eq:NN }
\cs_new_protected:Npn \seq_gremove_duplicates:N
  { \__seq_remove_duplicates:NN \seq_gset_eq:NN }
\cs_new_protected:Npn \__seq_remove_duplicates:NN #1#2
  {
    \seq_clear:N \l__seq_remove_seq
    \seq_map_inline:Nn #2
      {
        \seq_if_in:NnF \l__seq_remove_seq {##1}
          { \seq_put_right:Nn \l__seq_remove_seq {##1} }
      }
    #1 #2 \l__seq_remove_seq
  }
\cs_generate_variant:Nn \seq_remove_duplicates:N  { c }
\cs_generate_variant:Nn \seq_gremove_duplicates:N { c }
\cs_new_protected:Npn \seq_remove_all:Nn
  { \__seq_remove_all_aux:NNn \tl_set:Nx }
\cs_new_protected:Npn \seq_gremove_all:Nn
  { \__seq_remove_all_aux:NNn \tl_gset:Nx }
\cs_new_protected:Npn \__seq_remove_all_aux:NNn #1#2#3
  {
    \__seq_push_item_def:n
      {
        \str_if_eq:nnT {##1} {#3}
          {
            \if_false: { \fi: }
            \tl_set:Nn \l__seq_internal_b_tl {##1}
            #1 #2
               { \if_false: } \fi:
                 \exp_not:o {#2}
                 \tl_if_eq:NNT \l__seq_internal_a_tl \l__seq_internal_b_tl
                   { \use_none:nn }
          }
        \__seq_wrap_item:n {##1}
      }
    \tl_set:Nn \l__seq_internal_a_tl {#3}
    #1 #2 {#2}
    \__seq_pop_item_def:
  }
\cs_generate_variant:Nn \seq_remove_all:Nn  { c }
\cs_generate_variant:Nn \seq_gremove_all:Nn { c }
\cs_new_protected:Npn \seq_reverse:N
  { \__seq_reverse:NN \tl_set:Nx }
\cs_new_protected:Npn \seq_greverse:N
  { \__seq_reverse:NN \tl_gset:Nx }
\cs_new_protected:Npn \__seq_reverse:NN #1 #2
  {
    \cs_set_eq:NN \__seq_tmp:w \__seq_item:n
    \cs_set_eq:NN \__seq_item:n \__seq_reverse_item:nwn
    #1 #2 { #2 \exp_not:n { } }
    \cs_set_eq:NN \__seq_item:n \__seq_tmp:w
  }
\cs_new:Npn \__seq_reverse_item:nwn #1 #2 \exp_not:n #3
  {
    #2
    \exp_not:n { \__seq_item:n {#1} #3 }
  }
\cs_generate_variant:Nn \seq_reverse:N  { c }
\cs_generate_variant:Nn \seq_greverse:N { c }
\prg_new_conditional:Npnn \seq_if_empty:N #1 { p , T , F , TF }
  {
    \if_meaning:w #1 \c_empty_seq
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_generate_variant:Nn \seq_if_empty_p:N { c }
\cs_generate_variant:Nn \seq_if_empty:NT { c }
\cs_generate_variant:Nn \seq_if_empty:NF { c }
\cs_generate_variant:Nn \seq_if_empty:NTF { c }
\prg_new_protected_conditional:Npnn \seq_if_in:Nn #1#2
  { T , F , TF }
  {
    \group_begin:
      \tl_set:Nn \l__seq_internal_a_tl {#2}
      \cs_set_protected:Npn \__seq_item:n ##1
        {
          \tl_set:Nn \l__seq_internal_b_tl {##1}
          \if_meaning:w \l__seq_internal_a_tl \l__seq_internal_b_tl
            \exp_after:wN \__seq_if_in:
          \fi:
        }
      #1
    \group_end:
    \prg_return_false:
    \__prg_break_point:
  }
\cs_new:Npn \__seq_if_in:
  { \__prg_break:n { \group_end: \prg_return_true: } }
\cs_generate_variant:Nn \seq_if_in:NnT  {     NV , Nv , No , Nx }
\cs_generate_variant:Nn \seq_if_in:NnT  { c , cV , cv , co , cx }
\cs_generate_variant:Nn \seq_if_in:NnF  {     NV , Nv , No , Nx }
\cs_generate_variant:Nn \seq_if_in:NnF  { c , cV , cv , co , cx }
\cs_generate_variant:Nn \seq_if_in:NnTF {     NV , Nv , No , Nx }
\cs_generate_variant:Nn \seq_if_in:NnTF { c , cV , cv , co , cx }
\cs_new_protected:Npn \__seq_pop:NNNN #1#2#3#4
  {
    \if_meaning:w #3 \c_empty_seq
      \tl_set:Nn #4 { \q_no_value }
    \else:
      #1#2#3#4
    \fi:
  }
\cs_new_protected:Npn \__seq_pop_TF:NNNN #1#2#3#4
  {
    \if_meaning:w #3 \c_empty_seq
      % \tl_set:Nn #4 { \q_no_value }
      \prg_return_false:
    \else:
      #1#2#3#4
      \prg_return_true:
    \fi:
  }
\cs_new_protected:Npn \seq_get_left:NN #1#2
  {
    \tl_set:Nx #2
      {
        \exp_after:wN \__seq_get_left:wnw
        #1 \__seq_item:n { \q_no_value } \q_stop
      }
  }
\cs_new:Npn \__seq_get_left:wnw #1 \__seq_item:n #2#3 \q_stop
  { \exp_not:n {#2} }
\cs_generate_variant:Nn \seq_get_left:NN { c }
\cs_new_protected:Npn \seq_pop_left:NN
  { \__seq_pop:NNNN \__seq_pop_left:NNN \tl_set:Nn }
\cs_new_protected:Npn \seq_gpop_left:NN
  { \__seq_pop:NNNN \__seq_pop_left:NNN \tl_gset:Nn }
\cs_new_protected:Npn \__seq_pop_left:NNN #1#2#3
  { \exp_after:wN \__seq_pop_left:wnwNNN #2 \q_stop #1#2#3 }
\cs_new_protected:Npn \__seq_pop_left:wnwNNN
    #1 \__seq_item:n #2#3 \q_stop #4#5#6
  {
    #4 #5 { #1 #3 }
    \tl_set:Nn #6 {#2}
  }
\cs_generate_variant:Nn \seq_pop_left:NN  { c }
\cs_generate_variant:Nn \seq_gpop_left:NN { c }
\cs_new_protected:Npn \seq_get_right:NN #1#2
  {
    \exp_after:wN \use_i_ii:nnn
    \exp_after:wN \__seq_get_right_loop:nn
    \exp_after:wN \q_no_value
    #1
    { ?? \tl_set:Nn #2 }
    { } { }
  }
\cs_new_protected:Npn \__seq_get_right_loop:nn #1#2
  {
    \use_none:nn #2 {#1}
    \__seq_get_right_loop:nn
  }
\cs_generate_variant:Nn \seq_get_right:NN { c }
\cs_new_protected:Npn \seq_pop_right:NN
  { \__seq_pop:NNNN \__seq_pop_right:NNN \tl_set:Nx }
\cs_new_protected:Npn \seq_gpop_right:NN
  { \__seq_pop:NNNN \__seq_pop_right:NNN \tl_gset:Nx }
\cs_new_protected:Npn \__seq_pop_right:NNN #1#2#3
  {
    \cs_set_eq:NN \__seq_tmp:w \__seq_item:n
    \cs_set_eq:NN \__seq_item:n \scan_stop:
    #1 #2
      { \if_false: } \fi: \s__seq
        \exp_after:wN \use_i:nnn
        \exp_after:wN \__seq_pop_right_loop:nn
        #2
        {
          \if_false: { \fi: }
          \tl_set:Nx #3
        }
        { } \use_none:nn
    \cs_set_eq:NN \__seq_item:n \__seq_tmp:w
  }
\cs_new:Npn \__seq_pop_right_loop:nn #1#2
  {
    #2 { \exp_not:n {#1} }
    \__seq_pop_right_loop:nn
  }
\cs_generate_variant:Nn \seq_pop_right:NN  { c }
\cs_generate_variant:Nn \seq_gpop_right:NN { c }
\prg_new_protected_conditional:Npnn \seq_get_left:NN #1#2 { T , F , TF }
  { \__seq_pop_TF:NNNN \prg_do_nothing: \seq_get_left:NN #1#2 }
\prg_new_protected_conditional:Npnn \seq_get_right:NN #1#2 { T , F , TF }
  { \__seq_pop_TF:NNNN \prg_do_nothing: \seq_get_right:NN #1#2 }
\cs_generate_variant:Nn \seq_get_left:NNT   { c }
\cs_generate_variant:Nn \seq_get_left:NNF   { c }
\cs_generate_variant:Nn \seq_get_left:NNTF  { c }
\cs_generate_variant:Nn \seq_get_right:NNT  { c }
\cs_generate_variant:Nn \seq_get_right:NNF  { c }
\cs_generate_variant:Nn \seq_get_right:NNTF { c }
\prg_new_protected_conditional:Npnn \seq_pop_left:NN #1#2 { T , F , TF }
  { \__seq_pop_TF:NNNN \__seq_pop_left:NNN \tl_set:Nn #1 #2 }
\prg_new_protected_conditional:Npnn \seq_gpop_left:NN #1#2 { T , F , TF }
  { \__seq_pop_TF:NNNN \__seq_pop_left:NNN \tl_gset:Nn #1 #2 }
\prg_new_protected_conditional:Npnn \seq_pop_right:NN #1#2 { T , F , TF }
  { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \tl_set:Nx #1 #2 }
\prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2 { T , F , TF }
  { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \tl_gset:Nx #1 #2 }
\cs_generate_variant:Nn \seq_pop_left:NNT    { c }
\cs_generate_variant:Nn \seq_pop_left:NNF    { c }
\cs_generate_variant:Nn \seq_pop_left:NNTF   { c }
\cs_generate_variant:Nn \seq_gpop_left:NNT   { c }
\cs_generate_variant:Nn \seq_gpop_left:NNF   { c }
\cs_generate_variant:Nn \seq_gpop_left:NNTF  { c }
\cs_generate_variant:Nn \seq_pop_right:NNT   { c }
\cs_generate_variant:Nn \seq_pop_right:NNF   { c }
\cs_generate_variant:Nn \seq_pop_right:NNTF  { c }
\cs_generate_variant:Nn \seq_gpop_right:NNT  { c }
\cs_generate_variant:Nn \seq_gpop_right:NNF  { c }
\cs_generate_variant:Nn \seq_gpop_right:NNTF { c }
\cs_new:Npn \seq_item:Nn #1
  { \exp_after:wN \__seq_item:wNn #1 \q_stop #1 }
\cs_new:Npn \__seq_item:wNn \s__seq #1 \q_stop #2#3
  {
    \exp_args:Nf \__seq_item:nnn
      { \exp_args:Nf \__seq_item:nN { \int_eval:n {#3} } #2 }
    #1
    { ? \__prg_break: } { }
    \__prg_break_point:
  }
\cs_new:Npn \__seq_item:nN #1#2
  {
    \int_compare:nNnTF {#1} < 0
      { \int_eval:n { \seq_count:N #2 + 1 + #1 } }
      {#1}
  }
\cs_new:Npn \__seq_item:nnn #1#2#3
  {
    \use_none:n #2
    \int_compare:nNnTF {#1} = 1
      { \__prg_break:n { \exp_not:n {#3} } }
      { \exp_args:Nf \__seq_item:nnn { \int_eval:n { #1 - 1 } } }
  }
\cs_generate_variant:Nn \seq_item:Nn { c }
\cs_new:Npn \seq_map_break:
  { \__prg_map_break:Nn \seq_map_break: { } }
\cs_new:Npn \seq_map_break:n
  { \__prg_map_break:Nn \seq_map_break: }
\cs_new:Npn \seq_map_function:NN #1#2
  {
    \exp_after:wN \use_i_ii:nnn
    \exp_after:wN \__seq_map_function:NNn
    \exp_after:wN #2
    #1
    { ? \seq_map_break: } { }
    \__prg_break_point:Nn \seq_map_break: { }
  }
\cs_new:Npn \__seq_map_function:NNn #1#2#3
  {
    \use_none:n #2
    #1 {#3}
    \__seq_map_function:NNn #1
  }
\cs_generate_variant:Nn \seq_map_function:NN { c }
\cs_new_protected:Npn \__seq_push_item_def:n
  {
    \__seq_push_item_def:
    \cs_gset:Npn \__seq_item:n ##1
  }
\cs_new_protected:Npn \__seq_push_item_def:x
  {
    \__seq_push_item_def:
    \cs_gset:Npx \__seq_item:n ##1
  }
\cs_new_protected:Npn \__seq_push_item_def:
  {
    \int_gincr:N \g__prg_map_int
    \cs_gset_eq:cN { __prg_map_ \int_use:N \g__prg_map_int :w }
      \__seq_item:n
  }
\cs_new_protected:Npn \__seq_pop_item_def:
  {
    \cs_gset_eq:Nc \__seq_item:n
      { __prg_map_ \int_use:N \g__prg_map_int :w }
    \int_gdecr:N \g__prg_map_int
  }
\cs_new_protected:Npn \seq_map_inline:Nn #1#2
  {
    \__seq_push_item_def:n {#2}
    #1
    \__prg_break_point:Nn \seq_map_break: { \__seq_pop_item_def: }
  }
\cs_generate_variant:Nn \seq_map_inline:Nn { c }
\cs_new_protected:Npn \seq_map_variable:NNn #1#2#3
  {
    \__seq_push_item_def:x
      {
        \tl_set:Nn \exp_not:N #2 {##1}
        \exp_not:n {#3}
      }
    #1
    \__prg_break_point:Nn \seq_map_break: { \__seq_pop_item_def: }
  }
\cs_generate_variant:Nn \seq_map_variable:NNn {     Nc }
\cs_generate_variant:Nn \seq_map_variable:NNn { c , cc }
\cs_new:Npn \seq_count:N #1
  {
    \int_eval:n
      {
        0
        \seq_map_function:NN #1 \__seq_count:n
      }
  }
\cs_new:Npn \__seq_count:n #1 { + 1 }
\cs_generate_variant:Nn \seq_count:N { c }
\cs_new:Npn \seq_use:Nnnn #1#2#3#4
  {
    \seq_if_exist:NTF #1
      {
        \int_case:nnF { \seq_count:N #1 }
          {
            { 0 } { }
            { 1 } { \exp_after:wN \__seq_use:NNnNnn #1 ? { } { } }
            { 2 } { \exp_after:wN \__seq_use:NNnNnn #1 {#2} }
          }
          {
            \exp_after:wN \__seq_use_setup:w #1 \__seq_item:n
            \q_mark { \__seq_use:nwwwwnwn {#3} }
            \q_mark { \__seq_use:nwwn {#4} }
            \q_stop { }
          }
      }
      {
        \__msg_kernel_expandable_error:nnn
          { kernel } { bad-variable } {#1}
      }
  }
\cs_generate_variant:Nn \seq_use:Nnnn { c }
\cs_new:Npn \__seq_use:NNnNnn #1#2#3#4#5#6 { \exp_not:n { #3 #6 #5 } }
\cs_new:Npn \__seq_use_setup:w \s__seq { \__seq_use:nwwwwnwn { } }
\cs_new:Npn \__seq_use:nwwwwnwn
    #1 \__seq_item:n #2 \__seq_item:n #3 \__seq_item:n #4#5
    \q_mark #6#7 \q_stop #8
  {
    #6 \__seq_item:n {#3} \__seq_item:n {#4} #5
    \q_mark {#6} #7 \q_stop { #8 #1 #2 }
  }
\cs_new:Npn \__seq_use:nwwn #1 \__seq_item:n #2 #3 \q_stop #4
  { \exp_not:n { #4 #1 #2 } }
\cs_new:Npn \seq_use:Nn #1#2
  { \seq_use:Nnnn #1 {#2} {#2} {#2} }
\cs_generate_variant:Nn \seq_use:Nn { c }
\cs_new_eq:NN \seq_push:Nn  \seq_put_left:Nn
\cs_new_eq:NN \seq_push:NV  \seq_put_left:NV
\cs_new_eq:NN \seq_push:Nv  \seq_put_left:Nv
\cs_new_eq:NN \seq_push:No  \seq_put_left:No
\cs_new_eq:NN \seq_push:Nx  \seq_put_left:Nx
\cs_new_eq:NN \seq_push:cn  \seq_put_left:cn
\cs_new_eq:NN \seq_push:cV  \seq_put_left:cV
\cs_new_eq:NN \seq_push:cv  \seq_put_left:cv
\cs_new_eq:NN \seq_push:co  \seq_put_left:co
\cs_new_eq:NN \seq_push:cx  \seq_put_left:cx
\cs_new_eq:NN \seq_gpush:Nn \seq_gput_left:Nn
\cs_new_eq:NN \seq_gpush:NV \seq_gput_left:NV
\cs_new_eq:NN \seq_gpush:Nv \seq_gput_left:Nv
\cs_new_eq:NN \seq_gpush:No \seq_gput_left:No
\cs_new_eq:NN \seq_gpush:Nx \seq_gput_left:Nx
\cs_new_eq:NN \seq_gpush:cn \seq_gput_left:cn
\cs_new_eq:NN \seq_gpush:cV \seq_gput_left:cV
\cs_new_eq:NN \seq_gpush:cv \seq_gput_left:cv
\cs_new_eq:NN \seq_gpush:co \seq_gput_left:co
\cs_new_eq:NN \seq_gpush:cx \seq_gput_left:cx
\cs_new_eq:NN \seq_get:NN \seq_get_left:NN
\cs_new_eq:NN \seq_get:cN \seq_get_left:cN
\cs_new_eq:NN \seq_pop:NN \seq_pop_left:NN
\cs_new_eq:NN \seq_pop:cN \seq_pop_left:cN
\cs_new_eq:NN \seq_gpop:NN \seq_gpop_left:NN
\cs_new_eq:NN \seq_gpop:cN \seq_gpop_left:cN
\prg_new_eq_conditional:NNn \seq_get:NN  \seq_get_left:NN  { T , F , TF }
\prg_new_eq_conditional:NNn \seq_get:cN  \seq_get_left:cN  { T , F , TF }
\prg_new_eq_conditional:NNn \seq_pop:NN  \seq_pop_left:NN  { T , F , TF }
\prg_new_eq_conditional:NNn \seq_pop:cN  \seq_pop_left:cN  { T , F , TF }
\prg_new_eq_conditional:NNn \seq_gpop:NN \seq_gpop_left:NN { T , F , TF }
\prg_new_eq_conditional:NNn \seq_gpop:cN \seq_gpop_left:cN { T , F , TF }
\cs_new_protected:Npn \seq_show:N #1
  {
    \__msg_show_variable:NNNnn #1
      \seq_if_exist:NTF \seq_if_empty:NTF { seq }
      { \seq_map_function:NN #1 \__msg_show_item:n }
  }
\cs_generate_variant:Nn \seq_show:N { c }
\cs_new_protected:Npn \seq_log:N
  { \__msg_log_next: \seq_show:N }
\cs_generate_variant:Nn \seq_log:N { c }
\seq_new:N \l_tmpa_seq
\seq_new:N \l_tmpb_seq
\seq_new:N \g_tmpa_seq
\seq_new:N \g_tmpb_seq
%% File: l3int.dtx Copyright (C) 1990-2017 The LaTeX3 Project
\cs_new_eq:NN \__int_value:w      \tex_number:D
\cs_new_eq:NN \__int_eval:w       \etex_numexpr:D
\cs_new_eq:NN \__int_eval_end:    \tex_relax:D
\cs_new_eq:NN \if_int_odd:w     \tex_ifodd:D
\cs_new_eq:NN \if_case:w        \tex_ifcase:D
\cs_new:Npn \int_eval:n #1
  { \__int_value:w \__int_eval:w #1 \__int_eval_end: }
\cs_new:Npn \int_abs:n #1
  {
    \__int_value:w \exp_after:wN \__int_abs:N
      \__int_value:w \__int_eval:w #1 \__int_eval_end:
    \exp_stop_f:
  }
\cs_new:Npn \__int_abs:N #1
  { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: }
\cs_set:Npn \int_max:nn #1#2
  {
    \__int_value:w \exp_after:wN \__int_maxmin:wwN
      \__int_value:w \__int_eval:w #1 \exp_after:wN ;
      \__int_value:w \__int_eval:w #2 ;
      >
    \exp_stop_f:
  }
\cs_set:Npn \int_min:nn #1#2
  {
    \__int_value:w \exp_after:wN \__int_maxmin:wwN
      \__int_value:w \__int_eval:w #1 \exp_after:wN ;
      \__int_value:w \__int_eval:w #2 ;
      <
    \exp_stop_f:
  }
\cs_new:Npn \__int_maxmin:wwN #1 ; #2 ; #3
  {
    \if_int_compare:w #1 #3 #2 ~
      #1
    \else:
      #2
    \fi:
  }
\cs_new:Npn \int_div_truncate:nn #1#2
  {
    \__int_value:w \__int_eval:w
      \exp_after:wN \__int_div_truncate:NwNw
      \__int_value:w \__int_eval:w #1 \exp_after:wN ;
      \__int_value:w \__int_eval:w #2 ;
    \__int_eval_end:
  }
\cs_new:Npn \__int_div_truncate:NwNw #1#2; #3#4;
  {
    \if_meaning:w 0 #1
      0
    \else:
      (
        #1#2
        \if_meaning:w - #1 + \else: - \fi:
        ( \if_meaning:w - #3 - \fi: #3#4 - 1 ) / 2
      )
    \fi:
    / #3#4
  }
\cs_new:Npn \int_div_round:nn #1#2
  { \__int_value:w \__int_eval:w ( #1 ) / ( #2 ) \__int_eval_end: }
\cs_new:Npn \int_mod:nn #1#2
  {
    \__int_value:w \__int_eval:w \exp_after:wN \__int_mod:ww
      \__int_value:w \__int_eval:w #1 \exp_after:wN ;
      \__int_value:w \__int_eval:w #2 ;
    \__int_eval_end:
  }
\cs_new:Npn \__int_mod:ww #1; #2;
  { #1 - ( \__int_div_truncate:NwNw #1 ; #2 ; ) * #2 }
\cs_new_protected:Npn \int_new:N #1
  {
    \__chk_if_free_cs:N #1
    \cs:w newcount \cs_end: #1
  }
\cs_generate_variant:Nn \int_new:N { c }
\cs_new_protected:Npn \int_const:Nn #1#2
  {
    \int_compare:nNnTF {#2} < \c_zero
      {
        \int_new:N #1
        \int_gset:Nn #1 {#2}
      }
      {
        \int_compare:nNnTF {#2} > \c__max_constdef_int
          {
            \int_new:N #1
            \int_gset:Nn #1 {#2}
          }
          {
            \__chk_if_free_cs:N #1
            \tex_global:D \__int_constdef:Nw #1 =
              \__int_eval:w #2 \__int_eval_end:
          }
      }
  }
\cs_generate_variant:Nn \int_const:Nn { c }
\if_int_odd:w 0
  \cs_if_exist:NT \luatex_luatexversion:D  { 1 }
  \cs_if_exist:NT \uptex_disablecjktoken:D
    { \if_int_compare:w \ptex_jis:D "2121 = "3000 ~ 1 \fi: }
  \cs_if_exist:NT \xetex_XeTeXversion:D    { 1 } ~
    \cs_if_exist:NTF \uptex_disablecjktoken:D
      { \cs_new_eq:NN \__int_constdef:Nw \uptex_kchardef:D }
      { \cs_new_eq:NN \__int_constdef:Nw \tex_chardef:D }
    \__int_constdef:Nw \c__max_constdef_int 1114111 ~
\else:
  \cs_new_eq:NN \__int_constdef:Nw \tex_mathchardef:D
  \tex_mathchardef:D \c__max_constdef_int 32767 ~
\fi:
\cs_new_protected:Npn \int_zero:N  #1 { #1 = \c_zero }
\cs_new_protected:Npn \int_gzero:N #1 { \tex_global:D #1 = \c_zero }
\cs_generate_variant:Nn \int_zero:N  { c }
\cs_generate_variant:Nn \int_gzero:N { c }
\cs_new_protected:Npn \int_zero_new:N  #1
  { \int_if_exist:NTF #1 { \int_zero:N #1 } { \int_new:N #1 } }
\cs_new_protected:Npn \int_gzero_new:N #1
  { \int_if_exist:NTF #1 { \int_gzero:N #1 } { \int_new:N #1 } }
\cs_generate_variant:Nn \int_zero_new:N  { c }
\cs_generate_variant:Nn \int_gzero_new:N { c }
\cs_new_protected:Npn \int_set_eq:NN #1#2 { #1 = #2 }
\cs_generate_variant:Nn \int_set_eq:NN {       c }
\cs_generate_variant:Nn \int_set_eq:NN { Nc , cc }
\cs_new_protected:Npn \int_gset_eq:NN #1#2 { \tex_global:D #1 = #2 }
\cs_generate_variant:Nn \int_gset_eq:NN {       c }
\cs_generate_variant:Nn \int_gset_eq:NN { Nc , cc }
\prg_new_eq_conditional:NNn \int_if_exist:N \cs_if_exist:N
  { TF , T , F , p }
\prg_new_eq_conditional:NNn \int_if_exist:c \cs_if_exist:c
  { TF , T , F , p }
\cs_new_protected:Npn \int_add:Nn #1#2
  { \tex_advance:D #1 by \__int_eval:w #2 \__int_eval_end: }
\cs_new_protected:Npn \int_sub:Nn #1#2
  { \tex_advance:D #1 by - \__int_eval:w #2 \__int_eval_end: }
\cs_new_protected:Npn \int_gadd:Nn
  { \tex_global:D \int_add:Nn }
\cs_new_protected:Npn \int_gsub:Nn
  { \tex_global:D \int_sub:Nn }
\cs_generate_variant:Nn \int_add:Nn  { c }
\cs_generate_variant:Nn \int_gadd:Nn { c }
\cs_generate_variant:Nn \int_sub:Nn  { c }
\cs_generate_variant:Nn \int_gsub:Nn { c }
\cs_new_protected:Npn \int_incr:N #1
  { \tex_advance:D #1 \c_one }
\cs_new_protected:Npn \int_decr:N #1
  { \tex_advance:D #1 - \c_one }
\cs_new_protected:Npn \int_gincr:N
  { \tex_global:D \int_incr:N }
\cs_new_protected:Npn \int_gdecr:N
  { \tex_global:D \int_decr:N }
\cs_generate_variant:Nn \int_incr:N  { c }
\cs_generate_variant:Nn \int_decr:N  { c }
\cs_generate_variant:Nn \int_gincr:N { c }
\cs_generate_variant:Nn \int_gdecr:N { c }
\cs_new_protected:Npn \int_set:Nn #1#2
  { #1 ~ \__int_eval:w #2 \__int_eval_end: }
\cs_new_protected:Npn \int_gset:Nn { \tex_global:D \int_set:Nn }
\cs_generate_variant:Nn \int_set:Nn  { c }
\cs_generate_variant:Nn \int_gset:Nn { c }
\cs_new_eq:NN \int_use:N \tex_the:D
\cs_new:Npn \int_use:c #1 { \tex_the:D \cs:w #1 \cs_end: }
\cs_new_protected:Npn \__prg_compare_error:
  {
    \if_int_compare:w \c_zero \c_zero \fi:
    =
    \__prg_compare_error:
  }
\cs_new:Npn \__prg_compare_error:Nw
    #1#2 \q_stop
  {
    { }
    \c_zero \fi:
    \__msg_kernel_expandable_error:nnn
      { kernel } { unknown-comparison } {#1}
    \prg_return_false:
  }
\prg_new_conditional:Npnn \int_compare:n #1 { p , T , F , TF }
  {
    \exp_after:wN \__int_compare:w
    \__int_value:w \__int_eval:w #1 \__prg_compare_error:
  }
\cs_new:Npn \__int_compare:w #1 \__prg_compare_error:
  {
    \exp_after:wN \if_false: \__int_value:w
      \__int_compare:Nw #1 e { = nd_ } \q_stop
  }
\cs_new:Npn \__int_compare:Nw #1#2 \q_stop
  {
    \exp_after:wN \__int_compare:NNw
      \__int_to_roman:w - 0 #2 \q_mark
    #1#2 \q_stop
  }
\cs_new:Npn \__int_compare:NNw #1#2#3 \q_mark
  {
    \etex_unexpanded:D
    \use:c
      {
        __int_compare_ \token_to_str:N #1
        \if_meaning:w = #2 =  \fi:
        :NNw
      }
      \__prg_compare_error:Nw #1
  }
\cs_new:cpn { __int_compare_end_=:NNw } #1#2#3 e #4 \q_stop
  {
    {#3} \exp_stop_f:
    \prg_return_false: \else: \prg_return_true: \fi:
  }
\cs_new:Npn \__int_compare:nnN #1#2#3
  {
        {#2} \exp_stop_f:
      \prg_return_false: \exp_after:wN \use_none_delimit_by_q_stop:w
    \fi:
    #1 #2 #3 \exp_after:wN \__int_compare:Nw \__int_value:w \__int_eval:w
  }
\cs_new:cpn { __int_compare_=:NNw } #1#2#3 =
  { \__int_compare:nnN { \reverse_if:N \if_int_compare:w } {#3} = }
\cs_new:cpn { __int_compare_<:NNw } #1#2#3 <
  { \__int_compare:nnN { \reverse_if:N \if_int_compare:w } {#3} < }
\cs_new:cpn { __int_compare_>:NNw } #1#2#3 >
  { \__int_compare:nnN { \reverse_if:N \if_int_compare:w } {#3} > }
\cs_new:cpn { __int_compare_==:NNw } #1#2#3 ==
  { \__int_compare:nnN { \reverse_if:N \if_int_compare:w } {#3} = }
\cs_new:cpn { __int_compare_!=:NNw } #1#2#3 !=
  { \__int_compare:nnN { \if_int_compare:w } {#3} = }
\cs_new:cpn { __int_compare_<=:NNw } #1#2#3 <=
  { \__int_compare:nnN { \if_int_compare:w } {#3} > }
\cs_new:cpn { __int_compare_>=:NNw } #1#2#3 >=
  { \__int_compare:nnN { \if_int_compare:w } {#3} < }
\prg_new_conditional:Npnn \int_compare:nNn #1#2#3 { p , T , F , TF }
  {
    \if_int_compare:w \__int_eval:w #1 #2 \__int_eval:w #3 \__int_eval_end:
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_new:Npn \int_case:nnTF #1
  {
    \exp:w
    \exp_args:Nf \__int_case:nnTF { \int_eval:n {#1} }
  }
\cs_new:Npn \int_case:nnT #1#2#3
  {
    \exp:w
    \exp_args:Nf \__int_case:nnTF { \int_eval:n {#1} } {#2} {#3} { }
  }
\cs_new:Npn \int_case:nnF #1#2
  {
    \exp:w
    \exp_args:Nf \__int_case:nnTF { \int_eval:n {#1} } {#2} { }
  }
\cs_new:Npn \int_case:nn #1#2
  {
    \exp:w
    \exp_args:Nf \__int_case:nnTF { \int_eval:n {#1} } {#2} { } { }
  }
\cs_new:Npn \__int_case:nnTF #1#2#3#4
  { \__int_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
\cs_new:Npn \__int_case:nw #1#2#3
  {
    \int_compare:nNnTF {#1} = {#2}
      { \__int_case_end:nw {#3} }
      { \__int_case:nw {#1} }
  }
\cs_new_eq:NN \__int_case_end:nw \__prg_case_end:nw
\prg_new_conditional:Npnn \int_if_odd:n #1 { p , T , F , TF}
  {
    \if_int_odd:w \__int_eval:w #1 \__int_eval_end:
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\prg_new_conditional:Npnn \int_if_even:n #1 { p , T , F , TF}
  {
    \if_int_odd:w \__int_eval:w #1 \__int_eval_end:
      \prg_return_false:
    \else:
      \prg_return_true:
    \fi:
  }
\cs_new:Npn \int_while_do:nn #1#2
  {
    \int_compare:nT {#1}
      {
        #2
        \int_while_do:nn {#1} {#2}
      }
  }
\cs_new:Npn \int_until_do:nn #1#2
  {
    \int_compare:nF {#1}
      {
        #2
        \int_until_do:nn {#1} {#2}
      }
  }
\cs_new:Npn \int_do_while:nn #1#2
  {
    #2
    \int_compare:nT {#1}
      { \int_do_while:nn {#1} {#2} }
  }
\cs_new:Npn \int_do_until:nn #1#2
  {
    #2
    \int_compare:nF {#1}
      { \int_do_until:nn {#1} {#2} }
  }
\cs_new:Npn \int_while_do:nNnn #1#2#3#4
  {
    \int_compare:nNnT {#1} #2 {#3}
      {
        #4
        \int_while_do:nNnn {#1} #2 {#3} {#4}
      }
  }
\cs_new:Npn \int_until_do:nNnn #1#2#3#4
  {
    \int_compare:nNnF {#1} #2 {#3}
      {
        #4
        \int_until_do:nNnn {#1} #2 {#3} {#4}
      }
  }
\cs_new:Npn \int_do_while:nNnn #1#2#3#4
  {
    #4
    \int_compare:nNnT {#1} #2 {#3}
      { \int_do_while:nNnn {#1} #2 {#3} {#4} }
  }
\cs_new:Npn \int_do_until:nNnn #1#2#3#4
  {
    #4
    \int_compare:nNnF {#1} #2 {#3}
      { \int_do_until:nNnn {#1} #2 {#3} {#4} }
  }
\cs_new:Npn \int_step_function:nnnN #1#2#3
  {
    \exp_after:wN \__int_step:wwwN
    \__int_value:w \__int_eval:w #1 \exp_after:wN ;
    \__int_value:w \__int_eval:w #2 \exp_after:wN ;
    \__int_value:w \__int_eval:w #3 ;
  }
\cs_new:Npn \__int_step:wwwN #1; #2; #3; #4
  {
    \int_compare:nNnTF {#2} > \c_zero
      { \__int_step:NnnnN > }
      {
        \int_compare:nNnTF {#2} = \c_zero
          {
            \__msg_kernel_expandable_error:nnn { kernel } { zero-step } {#4}
            \use_none:nnnn
          }
          { \__int_step:NnnnN < }
      }
      {#1} {#2} {#3} #4
  }
\cs_new:Npn \__int_step:NnnnN #1#2#3#4#5
  {
    \int_compare:nNnF {#2} #1 {#4}
      {
        #5 {#2}
        \exp_args:NNf \__int_step:NnnnN
          #1 { \int_eval:n { #2 + #3 } } {#3} {#4} #5
      }
  }
\cs_new_protected:Npn \int_step_inline:nnnn
  {
    \int_gincr:N \g__prg_map_int
    \exp_args:NNc \__int_step:NNnnnn
      \cs_gset_protected:Npn
      { __prg_map_ \int_use:N \g__prg_map_int :w }
  }
\cs_new_protected:Npn \int_step_variable:nnnNn #1#2#3#4#5
  {
    \int_gincr:N \g__prg_map_int
    \exp_args:NNc \__int_step:NNnnnn
      \cs_gset_protected:Npx
      { __prg_map_ \int_use:N \g__prg_map_int :w }
      {#1}{#2}{#3}
      {
        \tl_set:Nn \exp_not:N #4 {##1}
        \exp_not:n {#5}
      }
  }
\cs_new_protected:Npn \__int_step:NNnnnn #1#2#3#4#5#6
  {
    #1 #2 ##1 {#6}
    \int_step_function:nnnN {#3} {#4} {#5} #2
    \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int }
  }
\cs_new_eq:NN \int_to_arabic:n \int_eval:n
\cs_new:Npn \int_to_symbols:nnn #1#2#3
  {
    \int_compare:nNnTF {#1} > {#2}
      {
        \exp_args:NNo \exp_args:No \__int_to_symbols:nnnn
          {
            \int_case:nn
              { 1 + \int_mod:nn { #1 - 1 } {#2} }
              {#3}
          }
          {#1} {#2} {#3}
      }
      { \int_case:nn {#1} {#3} }
  }
\cs_new:Npn \__int_to_symbols:nnnn #1#2#3#4
  {
    \exp_args:Nf \int_to_symbols:nnn
      { \int_div_truncate:nn { #2 - 1 } {#3} } {#3} {#4}
    #1
  }
\cs_new:Npn \int_to_alph:n #1
  {
    \int_to_symbols:nnn {#1} { 26 }
      {
        {  1 } { a }
        {  2 } { b }
        {  3 } { c }
        {  4 } { d }
        {  5 } { e }
        {  6 } { f }
        {  7 } { g }
        {  8 } { h }
        {  9 } { i }
        { 10 } { j }
        { 11 } { k }
        { 12 } { l }
        { 13 } { m }
        { 14 } { n }
        { 15 } { o }
        { 16 } { p }
        { 17 } { q }
        { 18 } { r }
        { 19 } { s }
        { 20 } { t }
        { 21 } { u }
        { 22 } { v }
        { 23 } { w }
        { 24 } { x }
        { 25 } { y }
        { 26 } { z }
      }
  }
\cs_new:Npn \int_to_Alph:n #1
  {
    \int_to_symbols:nnn {#1} { 26 }
      {
        {  1 } { A }
        {  2 } { B }
        {  3 } { C }
        {  4 } { D }
        {  5 } { E }
        {  6 } { F }
        {  7 } { G }
        {  8 } { H }
        {  9 } { I }
        { 10 } { J }
        { 11 } { K }
        { 12 } { L }
        { 13 } { M }
        { 14 } { N }
        { 15 } { O }
        { 16 } { P }
        { 17 } { Q }
        { 18 } { R }
        { 19 } { S }
        { 20 } { T }
        { 21 } { U }
        { 22 } { V }
        { 23 } { W }
        { 24 } { X }
        { 25 } { Y }
        { 26 } { Z }
      }
  }
\cs_new:Npn \int_to_base:nn #1
  { \exp_args:Nf \__int_to_base:nn { \int_eval:n {#1} } }
\cs_new:Npn \int_to_Base:nn #1
  { \exp_args:Nf \__int_to_Base:nn { \int_eval:n {#1} } }
\cs_new:Npn \__int_to_base:nn #1#2
  {
    \int_compare:nNnTF {#1} < 0
      { \exp_args:No \__int_to_base:nnN { \use_none:n #1 } {#2} - }
      { \__int_to_base:nnN {#1} {#2} \c_empty_tl }
  }
\cs_new:Npn \__int_to_Base:nn #1#2
  {
    \int_compare:nNnTF {#1} < 0
      { \exp_args:No \__int_to_Base:nnN { \use_none:n #1 } {#2} - }
      { \__int_to_Base:nnN {#1} {#2} \c_empty_tl }
  }
\cs_new:Npn \__int_to_base:nnN #1#2#3
  {
    \int_compare:nNnTF {#1} < {#2}
      { \exp_last_unbraced:Nf #3 { \__int_to_letter:n {#1} } }
      {
        \exp_args:Nf \__int_to_base:nnnN
          { \__int_to_letter:n { \int_mod:nn {#1} {#2} } }
          {#1}
          {#2}
          #3
      }
  }
\cs_new:Npn \__int_to_base:nnnN #1#2#3#4
  {
    \exp_args:Nf \__int_to_base:nnN
      { \int_div_truncate:nn {#2} {#3} }
      {#3}
      #4
    #1
  }
\cs_new:Npn \__int_to_Base:nnN #1#2#3
  {
    \int_compare:nNnTF {#1} < {#2}
      { \exp_last_unbraced:Nf #3 { \__int_to_Letter:n {#1} } }
      {
        \exp_args:Nf \__int_to_Base:nnnN
          { \__int_to_Letter:n { \int_mod:nn {#1} {#2} } }
          {#1}
          {#2}
          #3
      }
  }
\cs_new:Npn \__int_to_Base:nnnN #1#2#3#4
  {
    \exp_args:Nf \__int_to_Base:nnN
      { \int_div_truncate:nn {#2} {#3} }
      {#3}
      #4
    #1
  }
\cs_new:Npn \__int_to_letter:n #1
  {
    \exp_after:wN \exp_after:wN
    \if_case:w \__int_eval:w #1 - 10 \__int_eval_end:
         a
    \or: b
    \or: c
    \or: d
    \or: e
    \or: f
    \or: g
    \or: h
    \or: i
    \or: j
    \or: k
    \or: l
    \or: m
    \or: n
    \or: o
    \or: p
    \or: q
    \or: r
    \or: s
    \or: t
    \or: u
    \or: v
    \or: w
    \or: x
    \or: y
    \or: z
    \else: \__int_value:w \__int_eval:w #1 \exp_after:wN \__int_eval_end:
    \fi:
  }
\cs_new:Npn \__int_to_Letter:n #1
  {
    \exp_after:wN \exp_after:wN
    \if_case:w \__int_eval:w #1 - 10 \__int_eval_end:
         A
    \or: B
    \or: C
    \or: D
    \or: E
    \or: F
    \or: G
    \or: H
    \or: I
    \or: J
    \or: K
    \or: L
    \or: M
    \or: N
    \or: O
    \or: P
    \or: Q
    \or: R
    \or: S
    \or: T
    \or: U
    \or: V
    \or: W
    \or: X
    \or: Y
    \or: Z
    \else: \__int_value:w \__int_eval:w #1 \exp_after:wN \__int_eval_end:
    \fi:
  }
\cs_new:Npn \int_to_bin:n #1
  { \int_to_base:nn {#1} { 2 } }
\cs_new:Npn \int_to_hex:n #1
  { \int_to_base:nn {#1} { 16 } }
\cs_new:Npn \int_to_Hex:n #1
  { \int_to_Base:nn {#1} { 16 } }
\cs_new:Npn \int_to_oct:n #1
  { \int_to_base:nn {#1} { 8 } }
\cs_new:Npn \int_to_roman:n #1
  {
    \exp_after:wN \__int_to_roman:N
      \__int_to_roman:w \int_eval:n {#1} Q
  }
\cs_new:Npn \__int_to_roman:N #1
  {
    \use:c { __int_to_roman_ #1 :w }
    \__int_to_roman:N
  }
\cs_new:Npn \int_to_Roman:n #1
  {
    \exp_after:wN \__int_to_Roman_aux:N
      \__int_to_roman:w \int_eval:n {#1} Q
  }
\cs_new:Npn \__int_to_Roman_aux:N #1
  {
    \use:c { __int_to_Roman_ #1 :w }
    \__int_to_Roman_aux:N
  }
\cs_new:Npn \__int_to_roman_i:w { i }
\cs_new:Npn \__int_to_roman_v:w { v }
\cs_new:Npn \__int_to_roman_x:w { x }
\cs_new:Npn \__int_to_roman_l:w { l }
\cs_new:Npn \__int_to_roman_c:w { c }
\cs_new:Npn \__int_to_roman_d:w { d }
\cs_new:Npn \__int_to_roman_m:w { m }
\cs_new:Npn \__int_to_roman_Q:w #1 { }
\cs_new:Npn \__int_to_Roman_i:w { I }
\cs_new:Npn \__int_to_Roman_v:w { V }
\cs_new:Npn \__int_to_Roman_x:w { X }
\cs_new:Npn \__int_to_Roman_l:w { L }
\cs_new:Npn \__int_to_Roman_c:w { C }
\cs_new:Npn \__int_to_Roman_d:w { D }
\cs_new:Npn \__int_to_Roman_m:w { M }
\cs_new:Npn \__int_to_Roman_Q:w #1 { }
\cs_new:Npn \__int_pass_signs:wn #1
  {
    \if:w + \if:w - \exp_not:N #1 + \fi: \exp_not:N #1
      \exp_after:wN \__int_pass_signs:wn
    \else:
      \exp_after:wN \__int_pass_signs_end:wn
      \exp_after:wN #1
    \fi:
  }
\cs_new:Npn \__int_pass_signs_end:wn #1 \q_stop #2 { #2 #1 }
\cs_new:Npn \int_from_alph:n #1
  {
    \int_eval:n
      {
        \exp_after:wN \__int_pass_signs:wn \tl_to_str:n {#1}
          \q_stop { \__int_from_alph:nN { 0 } }
        \q_recursion_tail \q_recursion_stop
      }
  }
\cs_new:Npn \__int_from_alph:nN #1#2
  {
    \quark_if_recursion_tail_stop_do:Nn #2 {#1}
    \exp_args:Nf \__int_from_alph:nN
      { \int_eval:n { #1 * 26 + \__int_from_alph:N #2 } }
  }
\cs_new:Npn \__int_from_alph:N #1
  { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 64 } { 96 } }
\cs_new:Npn \int_from_base:nn #1#2
  {
    \int_eval:n
      {
        \exp_after:wN \__int_pass_signs:wn \tl_to_str:n {#1}
          \q_stop { \__int_from_base:nnN { 0 } {#2} }
        \q_recursion_tail \q_recursion_stop
      }
  }
\cs_new:Npn \__int_from_base:nnN #1#2#3
  {
    \quark_if_recursion_tail_stop_do:Nn #3 {#1}
    \exp_args:Nf \__int_from_base:nnN
      { \int_eval:n { #1 * #2 + \__int_from_base:N #3 } }
      {#2}
  }
\cs_new:Npn \__int_from_base:N #1
  {
    \int_compare:nNnTF { `#1 } < { 58 }
      {#1}
      { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 55 } { 87 } }
  }
\cs_new:Npn \int_from_bin:n #1
  { \int_from_base:nn {#1} { 2 } }
\cs_new:Npn \int_from_hex:n #1
  { \int_from_base:nn {#1} { 16 } }
\cs_new:Npn \int_from_oct:n #1
  { \int_from_base:nn {#1} { 8 } }
\int_const:cn { c__int_from_roman_i_int } { 1 }
\int_const:cn { c__int_from_roman_v_int } { 5 }
\int_const:cn { c__int_from_roman_x_int } { 10 }
\int_const:cn { c__int_from_roman_l_int } { 50 }
\int_const:cn { c__int_from_roman_c_int } { 100 }
\int_const:cn { c__int_from_roman_d_int } { 500 }
\int_const:cn { c__int_from_roman_m_int } { 1000 }
\int_const:cn { c__int_from_roman_I_int } { 1 }
\int_const:cn { c__int_from_roman_V_int } { 5 }
\int_const:cn { c__int_from_roman_X_int } { 10 }
\int_const:cn { c__int_from_roman_L_int } { 50 }
\int_const:cn { c__int_from_roman_C_int } { 100 }
\int_const:cn { c__int_from_roman_D_int } { 500 }
\int_const:cn { c__int_from_roman_M_int } { 1000 }
\cs_new:Npn \int_from_roman:n #1
  {
    \int_eval:n
      {
        (
          0
          \exp_after:wN \__int_from_roman:NN \tl_to_str:n {#1}
          \q_recursion_tail \q_recursion_tail \q_recursion_stop
        )
      }
  }
\cs_new:Npn \__int_from_roman:NN #1#2
  {
    \quark_if_recursion_tail_stop:N #1
    \int_if_exist:cF { c__int_from_roman_ #1 _int }
      { \__int_from_roman_error:w }
    \quark_if_recursion_tail_stop_do:Nn #2
      { + \use:c { c__int_from_roman_ #1 _int } }
    \int_if_exist:cF { c__int_from_roman_ #2 _int }
      { \__int_from_roman_error:w }
    \int_compare:nNnTF
      { \use:c { c__int_from_roman_ #1 _int } }
      <
      { \use:c { c__int_from_roman_ #2 _int } }
      {
        + \use:c { c__int_from_roman_ #2 _int }
        - \use:c { c__int_from_roman_ #1 _int }
        \__int_from_roman:NN
      }
      {
        + \use:c { c__int_from_roman_ #1 _int }
        \__int_from_roman:NN #2
      }
  }
\cs_new:Npn \__int_from_roman_error:w #1 \q_recursion_stop #2
  { #2 * 0 - 1 }
\cs_new_eq:NN \int_show:N \__kernel_register_show:N
\cs_generate_variant:Nn \int_show:N { c }
\cs_new_protected:Npn \int_show:n
  { \__msg_show_wrap:Nn \int_eval:n }
\cs_new_eq:NN \int_log:N \__kernel_register_log:N
\cs_generate_variant:Nn \int_log:N { c }
\cs_new_protected:Npn \int_log:n
  { \__msg_log_next: \int_show:n }
\int_const:Nn \c_one      {  1 }
\int_const:Nn \c_two      {  2 }
\int_const:Nn \c_three    {  3 }
\int_const:Nn \c_four     {  4 }
\int_const:Nn \c_five     {  5 }
\int_const:Nn \c_six      {  6 }
\int_const:Nn \c_seven    {  7 }
\int_const:Nn \c_eight    {  8 }
\int_const:Nn \c_nine     {  9 }
\int_const:Nn \c_ten      { 10 }
\int_const:Nn \c_eleven   { 11 }
\int_const:Nn \c_twelve   { 12 }
\int_const:Nn \c_thirteen { 13 }
\int_const:Nn \c_fourteen { 14 }
\int_const:Nn \c_fifteen  { 15 }
\int_const:Nn \c_sixteen  { 16 }
\int_const:Nn \c_thirty_two { 32 }
\int_const:Nn \c_two_hundred_fifty_five { 255 }
\int_const:Nn \c_two_hundred_fifty_six  { 256 }
\int_const:Nn \c_one_hundred  {   100 }
\int_const:Nn \c_one_thousand {  1000 }
\int_const:Nn \c_ten_thousand { 10000 }
\int_const:Nn \c_max_int { 2 147 483 647 }
\int_const:Nn \c_max_char_int
  {
    \if_int_odd:w 0
      \cs_if_exist:NT \luatex_luatexversion:D  { 1 }
      \cs_if_exist:NT \xetex_XeTeXversion:D    { 1 } ~
      "10FFFF
    \else:
      "FF
    \fi:
  }
\int_new:N \l_tmpa_int
\int_new:N \l_tmpb_int
\int_new:N \g_tmpa_int
\int_new:N \g_tmpb_int
\cs_new_eq:NN \c_minus_one \m@ne
%% File: l3flag.dtx Copyright (C) 2011-2012,2014-2017 The LaTeX3 Project
\cs_new_protected:Npn \flag_new:n #1
  {
    \cs_new:cpn { flag~#1 } ##1 ;
      { \exp_after:wN \use_none:n \cs:w flag~#1~##1 \cs_end: }
  }
\cs_new_protected:Npn \flag_clear:n { \__flag_clear:wn 0 ; }
\cs_new_protected:Npn \__flag_clear:wn #1 ; #2
  {
    \if_cs_exist:w flag~#2~#1 \cs_end:
      \cs_set_eq:cN { flag~#2~#1 } \tex_undefined:D
      \exp_after:wN \__flag_clear:wn
      \__int_value:w \__int_eval:w 1 + #1
    \else:
      \use_i:nnn
    \fi:
    ; {#2}
  }
\cs_new_protected:Npn \flag_clear_new:n #1
  { \flag_if_exist:nTF {#1} { \flag_clear:n } { \flag_new:n } {#1} }
\cs_new_protected:Npn \flag_show:n #1
  {
    \exp_args:Nc \__msg_show_variable:NNNnn { flag~#1 } \cs_if_exist:NTF ? { }
      { > ~ flag ~ #1 ~ height = \flag_height:n {#1} }
  }
\cs_new_protected:Npn \flag_log:n
  { \__msg_log_next: \flag_show:n }
\prg_new_conditional:Npnn \flag_if_exist:n #1 { p , T , F , TF }
  {
    \cs_if_exist:cTF { flag~#1 }
      { \prg_return_true: } { \prg_return_false: }
  }
\prg_new_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF }
  {
    \if_cs_exist:w flag~#1~0 \cs_end:
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_new:Npn \flag_height:n { \__flag_height_loop:wn 0; }
\cs_new:Npn \__flag_height_loop:wn #1 ; #2
  {
    \if_cs_exist:w flag~#2~#1 \cs_end:
      \exp_after:wN \__flag_height_loop:wn \__int_value:w \__int_eval:w 1 +
    \else:
      \exp_after:wN \__flag_height_end:wn
    \fi:
    #1 ; {#2}
  }
\cs_new:Npn \__flag_height_end:wn #1 ; #2 {#1}
\cs_new:Npn \flag_raise:n #1
  {
    \cs:w flag~#1 \exp_after:wN \cs_end:
    \__int_value:w \flag_height:n {#1} ;
  }
\tex_ifodd:D \l@expl@check@declarations@bool
  \cs_set_protected:Npn \flag_clear:n #1
    {
      \exp_args:Nc \__chk_if_exist_var:N { flag~#1 }
      \__flag_clear:wn 0 ; {#1}
    }
  \cs_set:Npn \__flag_chk_exist:n #1
    {
      \flag_if_exist:nF {#1}
        {
          \__msg_kernel_expandable_error:nnn
            { kernel } { bad-variable } { flag~#1~ }
        }
    }
  \cs_set:Npn \flag_height:n #1
    {
      \__flag_chk_exist:n {#1}
      \__flag_height_loop:wn 0; {#1}
    }
  \prg_set_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF }
    {
      \__flag_chk_exist:n {#1}
      \if_cs_exist:w flag~#1~0 \cs_end:
        \prg_return_true:
      \else:
        \prg_return_false:
      \fi:
    }
\fi:
%% File: l3quark.dtx Copyright (C) 1990-2017 The LaTeX3 Project
\cs_new_protected:Npn \quark_new:N #1 { \tl_const:Nn #1 {#1} }
\quark_new:N \q_nil
\quark_new:N \q_mark
\quark_new:N \q_no_value
\quark_new:N \q_stop
\quark_new:N \q_recursion_tail
\quark_new:N \q_recursion_stop
\cs_new:Npn \quark_if_recursion_tail_stop:N #1
  {
    \if_meaning:w \q_recursion_tail #1
      \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
    \fi:
  }
\cs_new:Npn \quark_if_recursion_tail_stop_do:Nn #1
  {
    \if_meaning:w \q_recursion_tail #1
      \exp_after:wN \use_i_delimit_by_q_recursion_stop:nw
    \else:
      \exp_after:wN \use_none:n
    \fi:
  }
\cs_new:Npn \quark_if_recursion_tail_stop:n #1
  {
    \tl_if_empty:oTF
      { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! }
      { \use_none_delimit_by_q_recursion_stop:w }
      { }
  }
\cs_new:Npn \quark_if_recursion_tail_stop_do:nn #1
  {
    \tl_if_empty:oTF
      { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! }
      { \use_i_delimit_by_q_recursion_stop:nw }
      { \use_none:n }
  }
\cs_new:Npn \__quark_if_recursion_tail:w
    #1 \q_recursion_tail #2 ? #3 ?! { #1 #2 }
\cs_generate_variant:Nn \quark_if_recursion_tail_stop:n { o }
\cs_generate_variant:Nn \quark_if_recursion_tail_stop_do:nn { o }
\cs_new:Npn \__quark_if_recursion_tail_break:NN #1#2
  {
    \if_meaning:w \q_recursion_tail #1
      \exp_after:wN #2
    \fi:
  }
\cs_new:Npn \__quark_if_recursion_tail_break:nN #1#2
  {
    \tl_if_empty:oTF
      { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! }
      {#2}
      { }
  }
\prg_new_conditional:Npnn \quark_if_nil:N #1 { p, T , F , TF }
  {
    \if_meaning:w \q_nil #1
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\prg_new_conditional:Npnn \quark_if_no_value:N #1 { p, T , F , TF }
  {
    \if_meaning:w \q_no_value #1
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_generate_variant:Nn \quark_if_no_value_p:N { c }
\cs_generate_variant:Nn \quark_if_no_value:NT  { c }
\cs_generate_variant:Nn \quark_if_no_value:NF  { c }
\cs_generate_variant:Nn \quark_if_no_value:NTF { c }
\prg_new_conditional:Npnn \quark_if_nil:n #1 { p, T , F , TF }
  {
    \__tl_if_empty_return:o
      { \__quark_if_nil:w {} #1 {} ? ! \q_nil ? ? ! }
  }
\cs_new:Npn \__quark_if_nil:w #1 \q_nil #2 ? #3 ? ! { #1 #2 }
\prg_new_conditional:Npnn \quark_if_no_value:n #1 { p, T , F , TF }
  {
    \__tl_if_empty_return:o
      { \__quark_if_no_value:w {} #1 {} ? ! \q_no_value ? ? ! }
  }
\cs_new:Npn \__quark_if_no_value:w #1 \q_no_value #2 ? #3 ? ! { #1 #2 }
\cs_generate_variant:Nn \quark_if_nil_p:n { V , o }
\cs_generate_variant:Nn \quark_if_nil:nTF { V , o }
\cs_generate_variant:Nn \quark_if_nil:nT  { V , o }
\cs_generate_variant:Nn \quark_if_nil:nF  { V , o }
\quark_new:N \q__tl_act_mark
\quark_new:N \q__tl_act_stop
\tl_new:N \g__scan_marks_tl
\cs_new_protected:Npn \__scan_new:N #1
  {
    \tl_if_in:NnTF \g__scan_marks_tl { #1 }
      {
        \__msg_kernel_error:nnx { kernel } { scanmark-already-defined }
          { \token_to_str:N #1 }
      }
      {
        \tl_gput_right:Nn \g__scan_marks_tl {#1}
        \cs_new_eq:NN #1 \scan_stop:
      }
  }
\__scan_new:N \s__stop
\cs_new:Npn \__use_none_delimit_by_s__stop:w #1 \s__stop { }
\__scan_new:N \s__seq
%% File: l3prg.dtx Copyright (C) 2005-2017 The LaTeX3 Project
\cs_new_eq:NN \if_bool:N      \tex_ifodd:D
\cs_new_eq:NN \if_predicate:w \tex_ifodd:D
\cs_new_protected:Npn \bool_new:N #1 { \cs_new_eq:NN #1 \c_false_bool }
\cs_generate_variant:Nn \bool_new:N { c }
\cs_new_protected:Npn \bool_set_true:N #1
  { \cs_set_eq:NN #1 \c_true_bool }
\cs_new_protected:Npn \bool_set_false:N #1
  { \cs_set_eq:NN #1 \c_false_bool }
\cs_new_protected:Npn \bool_gset_true:N #1
  { \cs_gset_eq:NN #1 \c_true_bool }
\cs_new_protected:Npn \bool_gset_false:N #1
  { \cs_gset_eq:NN #1 \c_false_bool }
\cs_generate_variant:Nn \bool_set_true:N   { c }
\cs_generate_variant:Nn \bool_set_false:N  { c }
\cs_generate_variant:Nn \bool_gset_true:N  { c }
\cs_generate_variant:Nn \bool_gset_false:N { c }
\cs_new_eq:NN \bool_set_eq:NN  \cs_set_eq:NN
\cs_new_eq:NN \bool_set_eq:Nc  \cs_set_eq:Nc
\cs_new_eq:NN \bool_set_eq:cN  \cs_set_eq:cN
\cs_new_eq:NN \bool_set_eq:cc  \cs_set_eq:cc
\cs_new_eq:NN \bool_gset_eq:NN \cs_gset_eq:NN
\cs_new_eq:NN \bool_gset_eq:Nc \cs_gset_eq:Nc
\cs_new_eq:NN \bool_gset_eq:cN \cs_gset_eq:cN
\cs_new_eq:NN \bool_gset_eq:cc \cs_gset_eq:cc
\cs_new_protected:Npn \bool_set:Nn #1#2
  { \tex_chardef:D #1 = \bool_if_p:n {#2} }
\cs_new_protected:Npn \bool_gset:Nn #1#2
  { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} }
\cs_generate_variant:Nn \bool_set:Nn  { c }
\cs_generate_variant:Nn \bool_gset:Nn { c }
\if_bool:N \l@expl@check@declarations@bool
  \cs_set_protected:Npn \bool_set_true:N #1
    {
      \__chk_if_exist_var:N #1
      \cs_set_eq:NN #1 \c_true_bool
    }
  \cs_set_protected:Npn \bool_set_false:N #1
    {
      \__chk_if_exist_var:N #1
      \cs_set_eq:NN #1 \c_false_bool
    }
  \cs_set_protected:Npn \bool_gset_true:N #1
    {
      \__chk_if_exist_var:N #1
      \cs_gset_eq:NN #1 \c_true_bool
    }
  \cs_set_protected:Npn \bool_gset_false:N #1
    {
      \__chk_if_exist_var:N #1
      \cs_gset_eq:NN #1 \c_false_bool
    }
  \cs_set_protected:Npn \bool_set_eq:NN  #1
    {
      \__chk_if_exist_var:N #1
      \cs_set_eq:NN #1
    }
  \cs_set_protected:Npn \bool_gset_eq:NN  #1
    {
      \__chk_if_exist_var:N #1
      \cs_gset_eq:NN #1
    }
  \cs_set_protected:Npn \bool_set:Nn #1#2
    {
      \__chk_if_exist_var:N #1
      \tex_chardef:D #1 = \bool_if_p:n {#2}
    }
  \cs_set_protected:Npn \bool_gset:Nn #1#2
    {
      \__chk_if_exist_var:N #1
      \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2}
    }
\fi:
\prg_new_conditional:Npnn \bool_if:N #1 { p , T , F , TF }
  {
    \if_meaning:w \c_true_bool #1
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_generate_variant:Nn \bool_if_p:N { c }
\cs_generate_variant:Nn \bool_if:NT  { c }
\cs_generate_variant:Nn \bool_if:NF  { c }
\cs_generate_variant:Nn \bool_if:NTF { c }
\cs_new_protected:Npn \bool_show:N #1
  {
    \__msg_show_variable:NNNnn #1 \bool_if_exist:NTF ? { }
      { > ~ \token_to_str:N #1 = \__bool_to_str:n {#1} }
  }
\cs_new_protected:Npn \bool_show:n
  { \__msg_show_wrap:Nn \__bool_to_str:n }
\cs_new:Npn \__bool_to_str:n #1
  { \bool_if:nTF {#1} { true } { false } }
\cs_generate_variant:Nn \bool_show:N { c }
\cs_new_protected:Npn \bool_log:N
  { \__msg_log_next: \bool_show:N }
\cs_new_protected:Npn \bool_log:n
  { \__msg_log_next: \bool_show:n }
\cs_generate_variant:Nn \bool_log:N { c }
\bool_new:N \l_tmpa_bool
\bool_new:N \l_tmpb_bool
\bool_new:N \g_tmpa_bool
\bool_new:N \g_tmpb_bool
\prg_new_eq_conditional:NNn \bool_if_exist:N \cs_if_exist:N
  { TF , T , F , p }
\prg_new_eq_conditional:NNn \bool_if_exist:c \cs_if_exist:c
  { TF , T , F , p }
\prg_new_conditional:Npnn \bool_if:n #1 { T , F , TF }
  {
    \if_predicate:w \bool_if_p:n {#1}
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_new:Npn \bool_if_p:n #1
  {
    \group_align_safe_begin:
    \__bool_if_left_parentheses:wwwn \q_nil
      #1 \q_mark { }
      (  \q_mark { \__bool_if_right_parentheses:wwwn \q_nil }
      )  \q_mark { \__bool_if_or:wwwn \q_nil }
      || \q_mark \__bool_if_parse:NNNww
    \q_stop
  }
\cs_new:Npn \__bool_if_left_parentheses:wwwn #1 \q_nil #2 ( #3 \q_mark #4
  { #4 \__bool_if_left_parentheses:wwwn #1 #2 (( \q_nil #3 \q_mark {#4} }
\cs_new:Npn \__bool_if_right_parentheses:wwwn #1 \q_nil #2 ) #3 \q_mark #4
  { #4 \__bool_if_right_parentheses:wwwn #1 #2 )) \q_nil #3 \q_mark {#4} }
\cs_new:Npn \__bool_if_or:wwwn #1 \q_nil #2 || #3 \q_mark #4
  { #4 \__bool_if_or:wwwn #1 #2 )||( \q_nil #3 \q_mark {#4} }
\cs_new:Npn \__bool_if_parse:NNNww #1#2#3#4 \q_mark #5 \q_stop
  {
    \__bool_get_next:NN \use_i:nn (( #4 )) S
  }
\cs_new:Npn \__bool_get_next:NN #1#2
  {
    \use:c
      {
        __bool_
        \if_meaning:w !#2 ! \else: \if_meaning:w (#2 ( \else: p \fi: \fi:
        :Nw
      }
      #1 #2
  }
\cs_new:cpn { __bool_!:Nw } #1#2
  { \exp_after:wN \__bool_get_next:NN #1 \use_ii:nn \use_i:nn }
\cs_new:cpn { __bool_(:Nw } #1#2
  {
    \exp_after:wN \__bool_choose:NNN \exp_after:wN #1
    \__int_value:w \__bool_get_next:NN \use_i:nn
  }
\cs_new:cpn { __bool_p:Nw } #1
  { \exp_after:wN \__bool_choose:NNN \exp_after:wN #1 \__int_value:w }
\cs_new:Npn \__bool_choose:NNN #1#2#3
  {
    \use:c
      {
        __bool_ #3 _
        #1 #2 { \if_meaning:w 0 #2 1 \else: 0 \fi: }
        :w
      }
  }
\cs_new:cpn { __bool_)_0:w } { \c_false_bool }
\cs_new:cpn { __bool_)_1:w } { \c_true_bool }
\cs_new:cpn { __bool_S_0:w } { \group_align_safe_end: \c_false_bool }
\cs_new:cpn { __bool_S_1:w } { \group_align_safe_end: \c_true_bool }
\cs_new:cpn { __bool_&_1:w } & { \__bool_get_next:NN \use_i:nn }
\cs_new:cpn { __bool_|_0:w } | { \__bool_get_next:NN \use_i:nn }
\cs_new:cpn { __bool_&_0:w } &
  { \__bool_eval_skip_to_end_auxi:Nw \c_false_bool }
\cs_new:cpn { __bool_|_1:w } |
  { \__bool_eval_skip_to_end_auxi:Nw \c_true_bool }
%% (
\cs_new:Npn \__bool_eval_skip_to_end_auxi:Nw #1#2 )
  {
    \__bool_eval_skip_to_end_auxii:Nw #1#2 ( % )
    \q_no_value \q_stop
    {#2}
  }
\cs_new:Npn \__bool_eval_skip_to_end_auxii:Nw #1#2 ( #3#4 \q_stop #5 % )
  {
    \quark_if_no_value:NTF #3
    {#1}
    { \__bool_eval_skip_to_end_auxiii:Nw #1 #5 }
  }
\cs_new:Npn \__bool_eval_skip_to_end_auxiii:Nw #1#2 ( #3 )
  { % (
    \__bool_eval_skip_to_end_auxi:Nw #1#3 )
  }
\prg_new_conditional:Npnn \bool_lazy_all:n #1 { p , T , F , TF }
  { \__bool_lazy_all:n #1 \q_recursion_tail \q_recursion_stop }
\cs_new:Npn \__bool_lazy_all:n #1
  {
    \quark_if_recursion_tail_stop_do:nn {#1} { \prg_return_true: }
    \bool_if:nF {#1}
      { \use_i_delimit_by_q_recursion_stop:nw { \prg_return_false: } }
    \__bool_lazy_all:n
  }
\prg_new_conditional:Npnn \bool_lazy_and:nn #1#2 { p , T , F , TF }
  {
    \bool_if:nTF {#1}
      { \bool_if:nTF {#2} { \prg_return_true: } { \prg_return_false: } }
      { \prg_return_false: }
  }
\prg_new_conditional:Npnn \bool_lazy_any:n #1 { p , T , F , TF }
  { \__bool_lazy_any:n #1 \q_recursion_tail \q_recursion_stop }
\cs_new:Npn \__bool_lazy_any:n #1
  {
    \quark_if_recursion_tail_stop_do:nn {#1} { \prg_return_false: }
    \bool_if:nT {#1}
      { \use_i_delimit_by_q_recursion_stop:nw { \prg_return_true: } }
    \__bool_lazy_any:n
  }
\prg_new_conditional:Npnn \bool_lazy_or:nn #1#2 { p , T , F , TF }
  {
    \bool_if:nTF {#1}
      { \prg_return_true: }
      { \bool_if:nTF {#2} { \prg_return_true: } { \prg_return_false: } }
  }
\cs_new:Npn \bool_not_p:n #1 { \bool_if_p:n { ! ( #1 ) } }
\cs_new:Npn \bool_xor_p:nn #1#2
  {
    \int_compare:nNnTF { \bool_if_p:n {#1} } = { \bool_if_p:n {#2} }
      \c_false_bool
      \c_true_bool
  }
\cs_new:Npn \bool_while_do:Nn #1#2
  { \bool_if:NT #1 { #2 \bool_while_do:Nn #1 {#2} } }
\cs_new:Npn \bool_until_do:Nn #1#2
  { \bool_if:NF #1 { #2 \bool_until_do:Nn #1 {#2} } }
\cs_generate_variant:Nn \bool_while_do:Nn { c }
\cs_generate_variant:Nn \bool_until_do:Nn { c }
\cs_new:Npn \bool_do_while:Nn #1#2
  { #2 \bool_if:NT #1 { \bool_do_while:Nn #1 {#2} } }
\cs_new:Npn \bool_do_until:Nn #1#2
  { #2 \bool_if:NF #1 { \bool_do_until:Nn #1 {#2} } }
\cs_generate_variant:Nn \bool_do_while:Nn { c }
\cs_generate_variant:Nn \bool_do_until:Nn { c }
\cs_new:Npn \bool_while_do:nn #1#2
  {
    \bool_if:nT {#1}
      {
        #2
        \bool_while_do:nn {#1} {#2}
      }
  }
\cs_new:Npn \bool_do_while:nn #1#2
  {
    #2
    \bool_if:nT {#1} { \bool_do_while:nn {#1} {#2} }
  }
\cs_new:Npn \bool_until_do:nn #1#2
  {
    \bool_if:nF {#1}
      {
        #2
        \bool_until_do:nn {#1} {#2}
      }
  }
\cs_new:Npn \bool_do_until:nn #1#2
  {
    #2
    \bool_if:nF {#1} { \bool_do_until:nn {#1} {#2}  }
  }
\cs_new:Npn \prg_replicate:nn #1
  {
    \exp:w
      \exp_after:wN \__prg_replicate_first:N
        \__int_value:w \__int_eval:w #1 \__int_eval_end:
      \cs_end:
  }
\cs_new:Npn \__prg_replicate:N #1
  { \cs:w __prg_replicate_#1 :n \__prg_replicate:N }
\cs_new:Npn \__prg_replicate_first:N #1
  { \cs:w __prg_replicate_first_ #1 :n \__prg_replicate:N }
\cs_new:Npn \__prg_replicate_ :n #1 { \cs_end: }
\cs_new:cpn { __prg_replicate_0:n } #1
  { \cs_end: {#1#1#1#1#1#1#1#1#1#1} }
\cs_new:cpn { __prg_replicate_1:n } #1
  { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1 }
\cs_new:cpn { __prg_replicate_2:n } #1
  { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1 }
\cs_new:cpn { __prg_replicate_3:n } #1
  { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1 }
\cs_new:cpn { __prg_replicate_4:n } #1
  { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1#1 }
\cs_new:cpn { __prg_replicate_5:n } #1
  { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1#1#1 }
\cs_new:cpn { __prg_replicate_6:n } #1
  { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1#1#1#1 }
\cs_new:cpn { __prg_replicate_7:n } #1
  { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1#1#1#1#1 }
\cs_new:cpn { __prg_replicate_8:n } #1
  { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1#1#1#1#1#1 }
\cs_new:cpn { __prg_replicate_9:n } #1
  { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1#1#1#1#1#1#1 }
\cs_new:cpn { __prg_replicate_first_-:n } #1
  {
    \exp_end:
    \__msg_kernel_expandable_error:nn { kernel } { negative-replication }
  }
\cs_new:cpn { __prg_replicate_first_0:n } #1 { \exp_end: }
\cs_new:cpn { __prg_replicate_first_1:n } #1 { \exp_end: #1 }
\cs_new:cpn { __prg_replicate_first_2:n } #1 { \exp_end: #1#1 }
\cs_new:cpn { __prg_replicate_first_3:n } #1 { \exp_end: #1#1#1 }
\cs_new:cpn { __prg_replicate_first_4:n } #1 { \exp_end: #1#1#1#1 }
\cs_new:cpn { __prg_replicate_first_5:n } #1 { \exp_end: #1#1#1#1#1 }
\cs_new:cpn { __prg_replicate_first_6:n } #1 { \exp_end: #1#1#1#1#1#1 }
\cs_new:cpn { __prg_replicate_first_7:n } #1 { \exp_end: #1#1#1#1#1#1#1 }
\cs_new:cpn { __prg_replicate_first_8:n } #1 { \exp_end: #1#1#1#1#1#1#1#1 }
\cs_new:cpn { __prg_replicate_first_9:n } #1 { \exp_end: #1#1#1#1#1#1#1#1#1 }
\prg_new_conditional:Npnn \mode_if_vertical: { p , T , F , TF }
  { \if_mode_vertical: \prg_return_true: \else: \prg_return_false: \fi: }
\prg_new_conditional:Npnn \mode_if_horizontal: { p , T , F , TF }
  { \if_mode_horizontal: \prg_return_true: \else: \prg_return_false: \fi: }
\prg_new_conditional:Npnn \mode_if_inner: { p , T , F , TF }
  { \if_mode_inner: \prg_return_true: \else: \prg_return_false: \fi: }
\prg_new_conditional:Npnn \mode_if_math: { p , T , F , TF }
  { \if_mode_math: \prg_return_true: \else: \prg_return_false: \fi: }
\cs_new:Npn \group_align_safe_begin:
  { \if_int_compare:w \if_false: { \fi: `} = \c_zero \fi: }
\cs_new:Npn \group_align_safe_end:
  { \if_int_compare:w `{ = \c_zero } \fi: }
\int_new:N \g__prg_map_int
%% File: l3clist.dtx Copyright (C) 2004-2011 Frank Mittelbach,
%%                                 The LaTeX3 project
%%                             (C) 2012-2017 The LaTeX3 Project
\cs_new_eq:NN \c_empty_clist \c_empty_tl
\tl_new:N \l__clist_internal_clist
\cs_new_protected:Npn \__clist_tmp:w { }
\cs_new_eq:NN \clist_new:N \tl_new:N
\cs_new_eq:NN \clist_new:c \tl_new:c
\cs_new_protected:Npn \clist_const:Nn #1#2
  { \tl_const:Nx #1 { \__clist_trim_spaces:n {#2} } }
\cs_generate_variant:Nn \clist_const:Nn { c , Nx , cx }
\cs_new_eq:NN \clist_clear:N  \tl_clear:N
\cs_new_eq:NN \clist_clear:c  \tl_clear:c
\cs_new_eq:NN \clist_gclear:N \tl_gclear:N
\cs_new_eq:NN \clist_gclear:c \tl_gclear:c
\cs_new_eq:NN \clist_clear_new:N  \tl_clear_new:N
\cs_new_eq:NN \clist_clear_new:c  \tl_clear_new:c
\cs_new_eq:NN \clist_gclear_new:N \tl_gclear_new:N
\cs_new_eq:NN \clist_gclear_new:c \tl_gclear_new:c
\cs_new_eq:NN \clist_set_eq:NN  \tl_set_eq:NN
\cs_new_eq:NN \clist_set_eq:Nc  \tl_set_eq:Nc
\cs_new_eq:NN \clist_set_eq:cN  \tl_set_eq:cN
\cs_new_eq:NN \clist_set_eq:cc  \tl_set_eq:cc
\cs_new_eq:NN \clist_gset_eq:NN \tl_gset_eq:NN
\cs_new_eq:NN \clist_gset_eq:Nc \tl_gset_eq:Nc
\cs_new_eq:NN \clist_gset_eq:cN \tl_gset_eq:cN
\cs_new_eq:NN \clist_gset_eq:cc \tl_gset_eq:cc
\cs_new_protected:Npn \clist_set_from_seq:NN
  { \__clist_set_from_seq:NNNN \clist_clear:N  \tl_set:Nx  }
\cs_new_protected:Npn \clist_gset_from_seq:NN
  { \__clist_set_from_seq:NNNN \clist_gclear:N \tl_gset:Nx }
\cs_new_protected:Npn \__clist_set_from_seq:NNNN #1#2#3#4
  {
    \seq_if_empty:NTF #4
      { #1 #3 }
      {
        #2 #3
          {
            \exp_last_unbraced:Nf \use_none:n
              { \seq_map_function:NN #4 \__clist_wrap_item:n }
          }
      }
  }
\cs_new:Npn \__clist_wrap_item:n #1
  {
    ,
    \tl_if_empty:oTF { \__clist_set_from_seq:w #1 ~ , #1 ~ }
      { \exp_not:n   {#1}   }
      { \exp_not:n { {#1} } }
  }
\cs_new:Npn \__clist_set_from_seq:w #1 , #2 ~ { }
\cs_generate_variant:Nn \clist_set_from_seq:NN  {     Nc }
\cs_generate_variant:Nn \clist_set_from_seq:NN  { c , cc }
\cs_generate_variant:Nn \clist_gset_from_seq:NN {     Nc }
\cs_generate_variant:Nn \clist_gset_from_seq:NN { c , cc }
\cs_new_protected:Npn \clist_concat:NNN
  { \__clist_concat:NNNN \tl_set:Nx }
\cs_new_protected:Npn \clist_gconcat:NNN
  { \__clist_concat:NNNN \tl_gset:Nx }
\cs_new_protected:Npn \__clist_concat:NNNN #1#2#3#4
  {
    #1 #2
      {
        \exp_not:o #3
        \clist_if_empty:NF #3 { \clist_if_empty:NF #4 { , } }
        \exp_not:o #4
      }
  }
\cs_generate_variant:Nn \clist_concat:NNN  { ccc }
\cs_generate_variant:Nn \clist_gconcat:NNN { ccc }
\prg_new_eq_conditional:NNn \clist_if_exist:N \cs_if_exist:N
  { TF , T , F , p }
\prg_new_eq_conditional:NNn \clist_if_exist:c \cs_if_exist:c
  { TF , T , F , p }
\cs_new:Npn \__clist_trim_spaces_generic:nw #1#2 ,
  {
    \__tl_trim_spaces:nn {#2}
      { \exp_args:No \__clist_trim_spaces_generic:nn } {#1}
  }
\cs_new:Npn \__clist_trim_spaces_generic:nn #1#2 { #2 {#1} }
\cs_new:Npn \__clist_trim_spaces:n #1
  {
    \__clist_trim_spaces_generic:nw
      { \__clist_trim_spaces:nn { } }
      \q_mark #1 ,
    \q_recursion_tail, \q_recursion_stop
  }
\cs_new:Npn \__clist_trim_spaces:nn #1 #2
  {
    \quark_if_recursion_tail_stop:n {#2}
    \tl_if_empty:nTF {#2}
      {
        \__clist_trim_spaces_generic:nw
          { \__clist_trim_spaces:nn {#1} } \q_mark
      }
      {
        #1 \exp_not:n {#2}
        \__clist_trim_spaces_generic:nw
          { \__clist_trim_spaces:nn { , } } \q_mark
      }
  }
\cs_new_protected:Npn \clist_set:Nn #1#2
  { \tl_set:Nx #1 { \__clist_trim_spaces:n {#2} } }
\cs_new_protected:Npn \clist_gset:Nn #1#2
  { \tl_gset:Nx #1 { \__clist_trim_spaces:n {#2} } }
\cs_generate_variant:Nn \clist_set:Nn  { NV , No , Nx , c , cV , co , cx }
\cs_generate_variant:Nn \clist_gset:Nn { NV , No , Nx , c , cV , co , cx }
\cs_new_protected:Npn \clist_put_left:Nn
  { \__clist_put_left:NNNn \clist_concat:NNN \clist_set:Nn }
\cs_new_protected:Npn \clist_gput_left:Nn
  { \__clist_put_left:NNNn \clist_gconcat:NNN \clist_set:Nn }
\cs_new_protected:Npn \__clist_put_left:NNNn #1#2#3#4
  {
    #2 \l__clist_internal_clist {#4}
    #1 #3 \l__clist_internal_clist #3
  }
\cs_generate_variant:Nn \clist_put_left:Nn  {     NV , No , Nx }
\cs_generate_variant:Nn \clist_put_left:Nn  { c , cV , co , cx }
\cs_generate_variant:Nn \clist_gput_left:Nn {     NV , No , Nx }
\cs_generate_variant:Nn \clist_gput_left:Nn { c , cV , co , cx }
\cs_new_protected:Npn \clist_put_right:Nn
  { \__clist_put_right:NNNn \clist_concat:NNN \clist_set:Nn }
\cs_new_protected:Npn \clist_gput_right:Nn
  { \__clist_put_right:NNNn \clist_gconcat:NNN \clist_set:Nn }
\cs_new_protected:Npn \__clist_put_right:NNNn #1#2#3#4
  {
    #2 \l__clist_internal_clist {#4}
    #1 #3 #3 \l__clist_internal_clist
  }
\cs_generate_variant:Nn \clist_put_right:Nn  {     NV , No , Nx }
\cs_generate_variant:Nn \clist_put_right:Nn  { c , cV , co , cx }
\cs_generate_variant:Nn \clist_gput_right:Nn {     NV , No , Nx }
\cs_generate_variant:Nn \clist_gput_right:Nn { c , cV , co , cx }
\cs_new_protected:Npn \clist_get:NN #1#2
  {
    \if_meaning:w #1 \c_empty_clist
      \tl_set:Nn #2 { \q_no_value }
    \else:
      \exp_after:wN \__clist_get:wN #1 , \q_stop #2
    \fi:
  }
\cs_new_protected:Npn \__clist_get:wN #1 , #2 \q_stop #3
  { \tl_set:Nn #3 {#1} }
\cs_generate_variant:Nn \clist_get:NN { c }
\cs_new_protected:Npn \clist_pop:NN
  { \__clist_pop:NNN \tl_set:Nx }
\cs_new_protected:Npn \clist_gpop:NN
  { \__clist_pop:NNN \tl_gset:Nx }
\cs_new_protected:Npn \__clist_pop:NNN #1#2#3
  {
    \if_meaning:w #2 \c_empty_clist
      \tl_set:Nn #3 { \q_no_value }
    \else:
      \exp_after:wN \__clist_pop:wwNNN #2 , \q_mark \q_stop #1#2#3
    \fi:
  }
\cs_new_protected:Npn \__clist_pop:wwNNN #1 , #2 \q_stop #3#4#5
  {
    \tl_set:Nn #5 {#1}
    #3 #4
      {
        \__clist_pop:wN \prg_do_nothing:
          #2 \exp_not:o
          , \q_mark \use_none:n
        \q_stop
      }
  }
\cs_new:Npn \__clist_pop:wN #1 , \q_mark #2 #3 \q_stop { #2 {#1} }
\cs_generate_variant:Nn \clist_pop:NN  { c }
\cs_generate_variant:Nn \clist_gpop:NN { c }
\prg_new_protected_conditional:Npnn \clist_get:NN #1#2 { T , F , TF }
  {
    \if_meaning:w #1 \c_empty_clist
      \prg_return_false:
    \else:
      \exp_after:wN \__clist_get:wN #1 , \q_stop #2
      \prg_return_true:
    \fi:
  }
\cs_generate_variant:Nn \clist_get:NNT  { c }
\cs_generate_variant:Nn \clist_get:NNF  { c }
\cs_generate_variant:Nn \clist_get:NNTF { c }
\prg_new_protected_conditional:Npnn \clist_pop:NN #1#2 { T , F , TF }
  { \__clist_pop_TF:NNN \tl_set:Nx #1 #2 }
\prg_new_protected_conditional:Npnn \clist_gpop:NN #1#2 { T , F , TF }
  { \__clist_pop_TF:NNN \tl_gset:Nx #1 #2 }
\cs_new_protected:Npn \__clist_pop_TF:NNN #1#2#3
  {
    \if_meaning:w #2 \c_empty_clist
      \prg_return_false:
    \else:
      \exp_after:wN \__clist_pop:wwNNN #2 , \q_mark \q_stop #1#2#3
      \prg_return_true:
    \fi:
  }
\cs_generate_variant:Nn \clist_pop:NNT   { c }
\cs_generate_variant:Nn \clist_pop:NNF   { c }
\cs_generate_variant:Nn \clist_pop:NNTF  { c }
\cs_generate_variant:Nn \clist_gpop:NNT  { c }
\cs_generate_variant:Nn \clist_gpop:NNF  { c }
\cs_generate_variant:Nn \clist_gpop:NNTF { c }
\cs_new_eq:NN \clist_push:Nn  \clist_put_left:Nn
\cs_new_eq:NN \clist_push:NV  \clist_put_left:NV
\cs_new_eq:NN \clist_push:No  \clist_put_left:No
\cs_new_eq:NN \clist_push:Nx  \clist_put_left:Nx
\cs_new_eq:NN \clist_push:cn  \clist_put_left:cn
\cs_new_eq:NN \clist_push:cV  \clist_put_left:cV
\cs_new_eq:NN \clist_push:co  \clist_put_left:co
\cs_new_eq:NN \clist_push:cx  \clist_put_left:cx
\cs_new_eq:NN \clist_gpush:Nn \clist_gput_left:Nn
\cs_new_eq:NN \clist_gpush:NV \clist_gput_left:NV
\cs_new_eq:NN \clist_gpush:No \clist_gput_left:No
\cs_new_eq:NN \clist_gpush:Nx \clist_gput_left:Nx
\cs_new_eq:NN \clist_gpush:cn \clist_gput_left:cn
\cs_new_eq:NN \clist_gpush:cV \clist_gput_left:cV
\cs_new_eq:NN \clist_gpush:co \clist_gput_left:co
\cs_new_eq:NN \clist_gpush:cx \clist_gput_left:cx
\clist_new:N \l__clist_internal_remove_clist
\cs_new_protected:Npn \clist_remove_duplicates:N
  { \__clist_remove_duplicates:NN \clist_set_eq:NN }
\cs_new_protected:Npn \clist_gremove_duplicates:N
  { \__clist_remove_duplicates:NN \clist_gset_eq:NN }
\cs_new_protected:Npn \__clist_remove_duplicates:NN #1#2
  {
    \clist_clear:N \l__clist_internal_remove_clist
    \clist_map_inline:Nn #2
      {
        \clist_if_in:NnF \l__clist_internal_remove_clist {##1}
          { \clist_put_right:Nn \l__clist_internal_remove_clist {##1} }
      }
    #1 #2 \l__clist_internal_remove_clist
  }
\cs_generate_variant:Nn \clist_remove_duplicates:N  { c }
\cs_generate_variant:Nn \clist_gremove_duplicates:N { c }
\cs_new_protected:Npn \clist_remove_all:Nn
  { \__clist_remove_all:NNn \tl_set:Nx }
\cs_new_protected:Npn \clist_gremove_all:Nn
  { \__clist_remove_all:NNn \tl_gset:Nx }
\cs_new_protected:Npn \__clist_remove_all:NNn #1#2#3
  {
    \cs_set:Npn \__clist_tmp:w ##1 , #3 ,
      {
        ##1
        , \q_mark , \use_none_delimit_by_q_stop:w ,
        \__clist_remove_all:
      }
    #1 #2
      {
        \exp_after:wN \__clist_remove_all:
        #2 , \q_mark , #3 , \q_stop
      }
    \clist_if_empty:NF #2
      {
        #1 #2
          {
            \exp_args:No \exp_not:o
              { \exp_after:wN \use_none:n #2 }
          }
      }
  }
\cs_new:Npn \__clist_remove_all:
  { \exp_after:wN \__clist_remove_all:w \__clist_tmp:w , }
\cs_new:Npn \__clist_remove_all:w #1 , \q_mark , #2 , { \exp_not:n {#1} }
\cs_generate_variant:Nn \clist_remove_all:Nn  { c }
\cs_generate_variant:Nn \clist_gremove_all:Nn { c }
\cs_new_protected:Npn \clist_reverse:N #1
  { \tl_set:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
\cs_new_protected:Npn \clist_greverse:N #1
  { \tl_gset:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
\cs_generate_variant:Nn \clist_reverse:N { c }
\cs_generate_variant:Nn \clist_greverse:N { c }
\cs_new:Npn \clist_reverse:n #1
  {
    \__clist_reverse:wwNww ? #1 ,
      \q_mark \__clist_reverse:wwNww ! ,
      \q_mark \__clist_reverse_end:ww
      \q_stop ? \q_mark
  }
\cs_new:Npn \__clist_reverse:wwNww
    #1 , #2 \q_mark #3 #4 \q_stop ? #5 \q_mark
  { #3 ? #2 \q_mark #3 #4 \q_stop #1 , #5 \q_mark }
\cs_new:Npn \__clist_reverse_end:ww #1 ! #2 , \q_mark
  { \exp_not:o { \use_none:n #2 } }
\prg_new_eq_conditional:NNn \clist_if_empty:N \tl_if_empty:N
  { p , T , F , TF }
\prg_new_eq_conditional:NNn \clist_if_empty:c \tl_if_empty:c
  { p , T , F , TF }
\prg_new_conditional:Npnn \clist_if_empty:n #1 { p , T , F , TF }
  {
    \__clist_if_empty_n:w ? #1
    , \q_mark \prg_return_false:
    , \q_mark \prg_return_true:
    \q_stop
  }
\cs_new:Npn \__clist_if_empty_n:w #1 ,
  {
    \tl_if_empty:oTF { \use_none:nn #1 ? }
      { \__clist_if_empty_n:w ? }
      { \__clist_if_empty_n:wNw }
  }
\cs_new:Npn \__clist_if_empty_n:wNw #1 \q_mark #2#3 \q_stop {#2}
\prg_new_protected_conditional:Npnn \clist_if_in:Nn #1#2 { T  , F , TF }
  {
    \exp_args:No \__clist_if_in_return:nn #1 {#2}
  }
\prg_new_protected_conditional:Npnn \clist_if_in:nn #1#2 { T  , F , TF }
  {
    \clist_set:Nn \l__clist_internal_clist {#1}
    \exp_args:No \__clist_if_in_return:nn \l__clist_internal_clist {#2}
  }
\cs_new_protected:Npn \__clist_if_in_return:nn #1#2
  {
    \cs_set:Npn \__clist_tmp:w ##1 ,#2, { }
    \tl_if_empty:oTF
      { \__clist_tmp:w ,#1, {} {} ,#2, }
      { \prg_return_false: } { \prg_return_true: }
  }
\cs_generate_variant:Nn \clist_if_in:NnT  {     NV , No }
\cs_generate_variant:Nn \clist_if_in:NnT  { c , cV , co }
\cs_generate_variant:Nn \clist_if_in:NnF  {     NV , No }
\cs_generate_variant:Nn \clist_if_in:NnF  { c , cV , co }
\cs_generate_variant:Nn \clist_if_in:NnTF {     NV , No }
\cs_generate_variant:Nn \clist_if_in:NnTF { c , cV , co }
\cs_generate_variant:Nn \clist_if_in:nnT  {     nV , no }
\cs_generate_variant:Nn \clist_if_in:nnF  {     nV , no }
\cs_generate_variant:Nn \clist_if_in:nnTF {     nV , no }
\cs_new:Npn \clist_map_function:NN #1#2
  {
    \clist_if_empty:NF #1
      {
        \exp_last_unbraced:NNo \__clist_map_function:Nw #2 #1
          , \q_recursion_tail ,
        \__prg_break_point:Nn \clist_map_break: { }
      }
  }
\cs_new:Npn \__clist_map_function:Nw #1#2 ,
  {
    \__quark_if_recursion_tail_break:nN {#2} \clist_map_break:
    #1 {#2}
    \__clist_map_function:Nw #1
  }
\cs_generate_variant:Nn \clist_map_function:NN { c }
\cs_new:Npn \clist_map_function:nN #1#2
  {
    \__clist_trim_spaces_generic:nw { \__clist_map_function_n:Nn #2 }
    \q_mark #1, \q_recursion_tail,
    \__prg_break_point:Nn \clist_map_break: { }
  }
\cs_new:Npn \__clist_map_function_n:Nn #1 #2
  {
    \__quark_if_recursion_tail_break:nN {#2} \clist_map_break:
    \tl_if_empty:nF {#2} { \__clist_map_unbrace:Nw #1 #2, }
    \__clist_trim_spaces_generic:nw { \__clist_map_function_n:Nn #1 }
    \q_mark
  }
\cs_new:Npn \__clist_map_unbrace:Nw #1 #2, { #1 {#2} }
\cs_new_protected:Npn \clist_map_inline:Nn #1#2
  {
    \clist_if_empty:NF #1
      {
        \int_gincr:N \g__prg_map_int
        \cs_gset_protected:cpn
          { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2}
        \exp_last_unbraced:Nco \__clist_map_function:Nw
          { __prg_map_ \int_use:N \g__prg_map_int :w }
          #1 , \q_recursion_tail ,
        \__prg_break_point:Nn \clist_map_break:
          { \int_gdecr:N \g__prg_map_int }
      }
  }
\cs_new_protected:Npn \clist_map_inline:nn #1
  {
    \clist_set:Nn \l__clist_internal_clist {#1}
    \clist_map_inline:Nn \l__clist_internal_clist
  }
\cs_generate_variant:Nn \clist_map_inline:Nn { c }
\cs_new_protected:Npn \clist_map_variable:NNn #1#2#3
  {
    \clist_if_empty:NF #1
      {
        \exp_args:Nno \use:nn
          { \__clist_map_variable:Nnw #2 {#3} }
          #1
          , \q_recursion_tail , \q_recursion_stop
        \__prg_break_point:Nn \clist_map_break: { }
      }
  }
\cs_new_protected:Npn \clist_map_variable:nNn #1
  {
    \clist_set:Nn \l__clist_internal_clist {#1}
    \clist_map_variable:NNn \l__clist_internal_clist
  }
\cs_new_protected:Npn \__clist_map_variable:Nnw #1#2#3,
  {
    \tl_set:Nn #1 {#3}
    \quark_if_recursion_tail_stop:N #1
    \use:n {#2}
    \__clist_map_variable:Nnw #1 {#2}
  }
\cs_generate_variant:Nn \clist_map_variable:NNn { c }
\cs_new:Npn \clist_map_break:
  { \__prg_map_break:Nn \clist_map_break: { } }
\cs_new:Npn \clist_map_break:n
  { \__prg_map_break:Nn \clist_map_break: }
\cs_new:Npn \clist_count:N #1
  {
    \int_eval:n
      {
        0
        \clist_map_function:NN #1 \__clist_count:n
      }
  }
\cs_generate_variant:Nn \clist_count:N { c }
\cs_new:Npx \clist_count:n #1
  {
    \exp_not:N \int_eval:n
      {
        0
        \exp_not:N \__clist_count:w \c_space_tl
        #1 \exp_not:n { , \q_recursion_tail , \q_recursion_stop }
      }
  }
\cs_new:Npn \__clist_count:n #1 { + 1 }
\cs_new:Npx \__clist_count:w #1 ,
  {
    \exp_not:n { \exp_args:Nf \quark_if_recursion_tail_stop:n } {#1}
    \exp_not:N \tl_if_blank:nF {#1} { + 1 }
    \exp_not:N \__clist_count:w \c_space_tl
  }
\cs_new:Npn \clist_use:Nnnn #1#2#3#4
  {
    \clist_if_exist:NTF #1
      {
        \int_case:nnF { \clist_count:N #1 }
          {
            { 0 } { }
            { 1 } { \exp_after:wN \__clist_use:wwn #1 , , { } }
            { 2 } { \exp_after:wN \__clist_use:wwn #1 , {#2} }
          }
          {
            \exp_after:wN \__clist_use:nwwwwnwn
            \exp_after:wN { \exp_after:wN } #1 ,
            \q_mark , { \__clist_use:nwwwwnwn {#3} }
            \q_mark , { \__clist_use:nwwn {#4} }
            \q_stop { }
          }
      }
      {
        \__msg_kernel_expandable_error:nnn
          { kernel } { bad-variable } {#1}
      }
  }
\cs_generate_variant:Nn \clist_use:Nnnn { c }
\cs_new:Npn \__clist_use:wwn #1 , #2 , #3 { \exp_not:n { #1 #3 #2 } }
\cs_new:Npn \__clist_use:nwwwwnwn
    #1#2 , #3 , #4 , #5 \q_mark , #6#7 \q_stop #8
  { #6 {#3} , {#4} , #5 \q_mark , {#6} #7 \q_stop { #8 #1 #2 } }
\cs_new:Npn \__clist_use:nwwn #1#2 , #3 \q_stop #4
  { \exp_not:n { #4 #1 #2 } }
\cs_new:Npn \clist_use:Nn #1#2
  { \clist_use:Nnnn #1 {#2} {#2} {#2} }
\cs_generate_variant:Nn \clist_use:Nn { c }
\cs_new:Npn \clist_item:Nn #1#2
  {
    \__clist_item:ffoN
      { \clist_count:N #1 }
      { \int_eval:n {#2} }
      #1
      \__clist_item_N_loop:nw
  }
\cs_new:Npn \__clist_item:nnnN #1#2#3#4
  {
    \int_compare:nNnTF {#2} < 0
      {
        \int_compare:nNnTF {#2} < { - #1 }
          { \use_none_delimit_by_q_stop:w }
          { \exp_args:Nf #4 { \int_eval:n { #2 + 1 + #1 } } }
      }
      {
        \int_compare:nNnTF {#2} > {#1}
          { \use_none_delimit_by_q_stop:w }
          { #4 {#2} }
      }
    { } , #3 , \q_stop
  }
\cs_generate_variant:Nn \__clist_item:nnnN { ffo, ff }
\cs_new:Npn \__clist_item_N_loop:nw #1 #2,
  {
    \int_compare:nNnTF {#1} = 0
      { \use_i_delimit_by_q_stop:nw { \exp_not:n {#2} } }
      { \exp_args:Nf \__clist_item_N_loop:nw { \int_eval:n { #1 - 1 } } }
  }
\cs_generate_variant:Nn \clist_item:Nn { c }
\cs_new:Npn \clist_item:nn #1#2
  {
    \__clist_item:ffnN
      { \clist_count:n {#1} }
      { \int_eval:n {#2} }
      {#1}
      \__clist_item_n:nw
  }
\cs_new:Npn \__clist_item_n:nw #1
  { \__clist_item_n_loop:nw {#1} \prg_do_nothing: }
\cs_new:Npn \__clist_item_n_loop:nw #1 #2,
  {
    \exp_args:No \tl_if_blank:nTF {#2}
      { \__clist_item_n_loop:nw {#1} \prg_do_nothing: }
      {
        \int_compare:nNnTF {#1} = 0
          { \exp_args:No \__clist_item_n_end:n {#2} }
          {
            \exp_args:Nf \__clist_item_n_loop:nw
              { \int_eval:n { #1 - 1 } }
              \prg_do_nothing:
          }
      }
  }
\cs_new:Npn \__clist_item_n_end:n #1 #2 \q_stop
  {
    \__tl_trim_spaces:nn { \q_mark #1 }
      { \exp_last_unbraced:No \__clist_item_n_strip:w } ,
  }
\cs_new:Npn \__clist_item_n_strip:w #1 , { \exp_not:n {#1} }
\cs_new_protected:Npn \clist_show:N #1
  {
    \__msg_show_variable:NNNnn #1
      \clist_if_exist:NTF \clist_if_empty:NTF { clist }
      { \clist_map_function:NN #1 \__msg_show_item:n }
  }
\cs_new_protected:Npn \clist_show:n #1
  {
    \__msg_show_pre:nnxxxx { LaTeX / kernel } { show-clist }
      { } { \clist_if_empty:nF {#1} { ? } } { } { }
    \__msg_show_wrap:n
      { \clist_map_function:nN {#1} \__msg_show_item:n }
  }
\cs_generate_variant:Nn \clist_show:N { c }
\cs_new_protected:Npn \clist_log:N
  { \__msg_log_next: \clist_show:N }
\cs_new_protected:Npn \clist_log:n
  { \__msg_log_next: \clist_show:n }
\cs_generate_variant:Nn \clist_log:N { c }
\clist_new:N \l_tmpa_clist
\clist_new:N \l_tmpb_clist
\clist_new:N \g_tmpa_clist
\clist_new:N \g_tmpb_clist
%% File: l3token.dtx Copyright (C) 2005-2017 The LaTeX3 Project
\cs_new_protected:Npn \char_set_catcode:nn #1#2
  {
    \tex_catcode:D \__int_eval:w #1 \__int_eval_end:
      = \__int_eval:w #2 \__int_eval_end:
   }
\cs_new:Npn \char_value_catcode:n #1
  { \tex_the:D \tex_catcode:D \__int_eval:w #1\__int_eval_end: }
\cs_new_protected:Npn \char_show_value_catcode:n #1
  { \__msg_show_wrap:n { > ~ \char_value_catcode:n {#1} } }
\cs_new_protected:Npn \char_set_catcode_escape:N #1
  { \char_set_catcode:nn { `#1 } { 0 } }
\cs_new_protected:Npn \char_set_catcode_group_begin:N #1
  { \char_set_catcode:nn { `#1 } { 1 } }
\cs_new_protected:Npn \char_set_catcode_group_end:N #1
  { \char_set_catcode:nn { `#1 } { 2 } }
\cs_new_protected:Npn \char_set_catcode_math_toggle:N #1
  { \char_set_catcode:nn { `#1 } { 3 } }
\cs_new_protected:Npn \char_set_catcode_alignment:N #1
  { \char_set_catcode:nn { `#1 } { 4 } }
\cs_new_protected:Npn \char_set_catcode_end_line:N #1
  { \char_set_catcode:nn { `#1 } { 5 } }
\cs_new_protected:Npn \char_set_catcode_parameter:N #1
  { \char_set_catcode:nn { `#1 } { 6 } }
\cs_new_protected:Npn \char_set_catcode_math_superscript:N #1
  { \char_set_catcode:nn { `#1 } { 7 } }
\cs_new_protected:Npn \char_set_catcode_math_subscript:N #1
  { \char_set_catcode:nn { `#1 } { 8 } }
\cs_new_protected:Npn \char_set_catcode_ignore:N #1
  { \char_set_catcode:nn { `#1 } { 9 } }
\cs_new_protected:Npn \char_set_catcode_space:N #1
  { \char_set_catcode:nn { `#1 } { 10 } }
\cs_new_protected:Npn \char_set_catcode_letter:N #1
  { \char_set_catcode:nn { `#1 } { 11 } }
\cs_new_protected:Npn \char_set_catcode_other:N #1
  { \char_set_catcode:nn { `#1 } { 12 } }
\cs_new_protected:Npn \char_set_catcode_active:N #1
  { \char_set_catcode:nn { `#1 } { 13 } }
\cs_new_protected:Npn \char_set_catcode_comment:N #1
  { \char_set_catcode:nn { `#1 } { 14 } }
\cs_new_protected:Npn \char_set_catcode_invalid:N #1
  { \char_set_catcode:nn { `#1 } { 15 } }
\cs_new_protected:Npn \char_set_catcode_escape:n #1
  { \char_set_catcode:nn {#1} { 0 } }
\cs_new_protected:Npn \char_set_catcode_group_begin:n #1
  { \char_set_catcode:nn {#1} { 1 } }
\cs_new_protected:Npn \char_set_catcode_group_end:n #1
  { \char_set_catcode:nn {#1} { 2 } }
\cs_new_protected:Npn \char_set_catcode_math_toggle:n #1
  { \char_set_catcode:nn {#1} { 3 } }
\cs_new_protected:Npn \char_set_catcode_alignment:n #1
  { \char_set_catcode:nn {#1} { 4 } }
\cs_new_protected:Npn \char_set_catcode_end_line:n #1
  { \char_set_catcode:nn {#1} { 5 } }
\cs_new_protected:Npn \char_set_catcode_parameter:n #1
  { \char_set_catcode:nn {#1} { 6 } }
\cs_new_protected:Npn \char_set_catcode_math_superscript:n #1
  { \char_set_catcode:nn {#1} { 7 } }
\cs_new_protected:Npn \char_set_catcode_math_subscript:n #1
  { \char_set_catcode:nn {#1} { 8 } }
\cs_new_protected:Npn \char_set_catcode_ignore:n #1
  { \char_set_catcode:nn {#1} { 9 } }
\cs_new_protected:Npn \char_set_catcode_space:n #1
  { \char_set_catcode:nn {#1} { 10 } }
\cs_new_protected:Npn \char_set_catcode_letter:n #1
  { \char_set_catcode:nn {#1} { 11 } }
\cs_new_protected:Npn \char_set_catcode_other:n #1
  { \char_set_catcode:nn {#1} { 12 } }
\cs_new_protected:Npn \char_set_catcode_active:n #1
  { \char_set_catcode:nn {#1} { 13 } }
\cs_new_protected:Npn \char_set_catcode_comment:n #1
  { \char_set_catcode:nn {#1} { 14 } }
\cs_new_protected:Npn \char_set_catcode_invalid:n #1
  { \char_set_catcode:nn {#1} { 15 } }
\cs_new_protected:Npn \char_set_mathcode:nn #1#2
  {
    \tex_mathcode:D \__int_eval:w #1 \__int_eval_end:
    = \__int_eval:w #2 \__int_eval_end:
  }
\cs_new:Npn \char_value_mathcode:n #1
  { \tex_the:D \tex_mathcode:D \__int_eval:w #1\__int_eval_end: }
\cs_new_protected:Npn \char_show_value_mathcode:n #1
  { \__msg_show_wrap:n { > ~ \char_value_mathcode:n {#1} } }
\cs_new_protected:Npn \char_set_lccode:nn #1#2
  {
    \tex_lccode:D \__int_eval:w #1 \__int_eval_end:
    = \__int_eval:w #2 \__int_eval_end:
  }
\cs_new:Npn \char_value_lccode:n #1
  { \tex_the:D \tex_lccode:D \__int_eval:w #1\__int_eval_end: }
\cs_new_protected:Npn \char_show_value_lccode:n #1
  { \__msg_show_wrap:n { > ~ \char_value_lccode:n {#1} } }
\cs_new_protected:Npn \char_set_uccode:nn #1#2
  {
    \tex_uccode:D \__int_eval:w #1 \__int_eval_end:
    = \__int_eval:w #2 \__int_eval_end:
  }
\cs_new:Npn \char_value_uccode:n #1
  { \tex_the:D \tex_uccode:D \__int_eval:w #1\__int_eval_end: }
\cs_new_protected:Npn \char_show_value_uccode:n #1
  { \__msg_show_wrap:n { > ~ \char_value_uccode:n {#1} } }
\cs_new_protected:Npn \char_set_sfcode:nn #1#2
  {
    \tex_sfcode:D \__int_eval:w #1 \__int_eval_end:
    = \__int_eval:w #2 \__int_eval_end:
  }
\cs_new:Npn \char_value_sfcode:n #1
  { \tex_the:D \tex_sfcode:D \__int_eval:w #1\__int_eval_end: }
\cs_new_protected:Npn \char_show_value_sfcode:n #1
  { \__msg_show_wrap:n { > ~ \char_value_sfcode:n {#1} } }
\seq_new:N \l_char_special_seq
\seq_set_split:Nnn \l_char_special_seq { }
  { \  \" \# \$ \% \& \\ \^ \_ \{ \} \~ }
\seq_new:N \l_char_active_seq
\seq_set_split:Nnn \l_char_active_seq { }
  { \" \$ \& \^ \_ \~ }
\group_begin:
  \char_set_catcode_active:N \^^@
  \cs_set_protected:Npn \__char_tmp:nN #1#2
    {
      \cs_new_protected:cpn { #1 :nN } ##1
        {
          \group_begin:
            \char_set_lccode:nn { `\^^@ } { ##1 }
          \tex_lowercase:D { \group_end: #2 ^^@ }
        }
      \cs_new_protected:cpx { #1 :NN } ##1
        { \exp_not:c { #1 : nN } { `##1 } }
    }
  \__char_tmp:nN { char_set_active_eq }  \cs_set_eq:NN
  \__char_tmp:nN { char_gset_active_eq } \cs_gset_eq:NN
\group_end:
\cs_generate_variant:Nn \char_set_active_eq:NN  { Nc }
\cs_generate_variant:Nn \char_gset_active_eq:NN { Nc }
\cs_generate_variant:Nn \char_set_active_eq:nN  { nc }
\cs_generate_variant:Nn \char_gset_active_eq:nN { nc }
\cs_new:Npn \char_generate:nn #1#2
  {
    \exp:w \exp_after:wN \__char_generate_aux:w
      \__int_value:w \__int_eval:w #1 \exp_after:wN ;
      \__int_value:w \__int_eval:w #2 ;
  }
\cs_new:Npn \__char_generate:nn #1#2
  {
    \exp:w \exp_after:wN
      \__char_generate_aux:nnw \exp_after:wN
        { \__int_value:w \__int_eval:w #1 \exp_after:wN }
          {#2} \exp_end:
  }
\cs_new:Npn \__char_generate_aux:w #1 ; #2 ;
  {
    \if_int_compare:w #2 = 13 \exp_stop_f:
      \__msg_kernel_expandable_error:nn { kernel } { char-active }
    \else:
      \if_int_compare:w #2 = 10 \exp_stop_f:
        \if_int_compare:w #1 =  0 \exp_stop_f:
          \__msg_kernel_expandable_error:nn { kernel } { char-null-space }
        \else:
          \__msg_kernel_expandable_error:nn { kernel } { char-space }
        \fi:
      \else:
        \if_int_odd:w 0
            \if_int_compare:w #2 < 1  \exp_stop_f: 1 \fi:
            \if_int_compare:w #2 = 5  \exp_stop_f: 1 \fi:
            \if_int_compare:w #2 = 9  \exp_stop_f: 1 \fi:
            \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
          \__msg_kernel_expandable_error:nn { kernel }
            { char-invalid-catcode }
        \else:
          \if_int_odd:w 0
            \if_int_compare:w #1 < 0 \exp_stop_f: 1 \fi:
            \if_int_compare:w #1 > \c__char_max_int 1 \fi: \exp_stop_f:
            \__msg_kernel_expandable_error:nn { kernel }
              { char-out-of-range }
          \else:
            \__char_generate_aux:nnw {#1} {#2}
          \fi:
        \fi:
      \fi:
    \fi:
    \exp_end:
  }
\tl_new:N \l__char_tmp_tl
\group_begin:
  \char_set_catcode_active:N \^^L
  \cs_set:Npn ^^L { }
  \char_set_catcode_other:n { 0 }
  \if_int_odd:w 0
      \cs_if_exist:NT \luatex_directlua:D { 1 }
      \cs_if_exist:NT \utex_charcat:D     { 1 } \exp_stop_f:
    \int_const:Nn \c__char_max_int { 1114111 }
    \cs_if_exist:NTF \luatex_directlua:D
      {
        \cs_new:Npn \__char_generate_aux:nnw #1#2#3 \exp_end:
          {
            #3
            \exp_after:wN \exp_end:
            \luatex_directlua:D { l3kernel.charcat(#1, #2) }
          }
      }
      {
        \cs_new:Npn \__char_generate_aux:nnw #1#2#3 \exp_end:
          {
            #3
            \exp_after:wN \exp_end:
            \utex_charcat:D  #1 ~ #2 ~
          }
      }
  \else:
      \int_const:Nn \c__char_max_int { 255 }
      \tl_set:Nn \l__char_tmp_tl { \exp_not:N \or: }
      \char_set_catcode_group_begin:n { 0 } % {
      \tl_put_right:Nn \l__char_tmp_tl { ^^@ \if_false: } }
      \char_set_catcode_group_end:n { 0 }
      \tl_put_right:Nn \l__char_tmp_tl { { \fi: \exp_not:N \or: ^^@ } % }
      \tl_set:Nx \l__char_tmp_tl { \l__char_tmp_tl }
      \char_set_catcode_math_toggle:n { 0 }
      \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ }
      \char_set_catcode_alignment:n { 0 }
      \tl_put_right:Nn \l__char_tmp_tl
        {
          \or:
            \etex_unexpanded:D \exp_after:wN
              { \exp_after:wN ^^@ \exp_after:wN }
        }
      \tl_put_right:Nn \l__char_tmp_tl { \or: }
      \char_set_catcode_parameter:n { 0 }
      \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ }
      \char_set_catcode_math_superscript:n { 0 }
      \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ }
      \char_set_catcode_math_subscript:n { 0 }
      \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ }
      \tl_put_right:Nn \l__char_tmp_tl { \or: }
      \char_set_catcode_space:n { 0 }
      \tl_put_right:No \l__char_tmp_tl { \use:n { \or: } ^^@ }
      \char_set_catcode_letter:n { 0 }
      \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ }
      \char_set_catcode_other:n { 0 }
      \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ }
      \char_set_catcode_active:n { 0 }
      \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ }
      \cs_set_protected:Npn \__char_tmp:n #1
        {
          \char_set_lccode:nn { 0 } {#1}
          \char_set_lccode:nn { 32 } {#1}
          \exp_args:Nx \tex_lowercase:D
            {
              \tl_const:Nn
                \exp_not:c { c__char_ \__int_to_roman:w #1 _tl }
                { \exp_not:o \l__char_tmp_tl }
            }
        }
      \int_step_function:nnnN { 0 }  { 1 } { 11 }  \__char_tmp:n
      \group_begin:
        \tl_replace_once:Nnn \l__char_tmp_tl { ^^@ } { \ERROR }
        \__char_tmp:n { 12 }
      \group_end:
      \int_step_function:nnnN { 13 } { 1 } { 255 } \__char_tmp:n
      \cs_new:Npn \__char_generate_aux:nnw #1#2#3 \exp_end:
        {
          #3
          \exp_after:wN \exp_after:wN
          \exp_after:wN \exp_end:
          \exp_after:wN \exp_after:wN
          \if_case:w #2
            \exp_last_unbraced:Nv \exp_stop_f:
              { c__char_ \__int_to_roman:w #1 _tl }
          \fi:
        }
  \fi:
\group_end:
\cs_new_protected:Npn \token_new:Nn #1#2 { \cs_new_eq:NN #1 #2 }
\group_begin:
  \__chk_if_free_cs:N \c_group_begin_token
  \tex_global:D \tex_let:D \c_group_begin_token {
  \__chk_if_free_cs:N \c_group_end_token
  \tex_global:D \tex_let:D \c_group_end_token }
  \char_set_catcode_math_toggle:N \*
  \cs_new_eq:NN \c_math_toggle_token *
  \char_set_catcode_alignment:N \*
  \cs_new_eq:NN \c_alignment_token *
  \cs_new_eq:NN \c_parameter_token #
  \cs_new_eq:NN \c_math_superscript_token ^
  \char_set_catcode_math_subscript:N \*
  \cs_new_eq:NN \c_math_subscript_token *
  \__chk_if_free_cs:N \c_space_token
  \use:n { \tex_global:D \tex_let:D \c_space_token = ~ } ~
  \cs_new_eq:NN \c_catcode_letter_token a
  \cs_new_eq:NN \c_catcode_other_token 1
\group_end:
\group_begin:
  \char_set_catcode_active:N \*
  \tl_const:Nn \c_catcode_active_tl { \exp_not:N * }
\group_end:
\prg_new_conditional:Npnn \token_if_group_begin:N #1 { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \c_group_begin_token
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \token_if_group_end:N #1 { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \c_group_end_token
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \token_if_math_toggle:N #1 { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \c_math_toggle_token
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \token_if_alignment:N #1 { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \c_alignment_token
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\group_begin:
\cs_set_eq:NN \c_parameter_token \scan_stop:
\prg_new_conditional:Npnn \token_if_parameter:N #1 { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \c_parameter_token
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\group_end:
\prg_new_conditional:Npnn \token_if_math_superscript:N #1
  { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \c_math_superscript_token
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \token_if_math_subscript:N #1 { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \c_math_subscript_token
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \token_if_space:N #1 { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \c_space_token
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \token_if_letter:N #1 { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \c_catcode_letter_token
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \token_if_other:N #1 { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \c_catcode_other_token
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \token_if_active:N #1 { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \c_catcode_active_tl
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \token_if_eq_meaning:NN #1#2 { p , T ,  F , TF }
  {
    \if_meaning:w  #1  #2
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \token_if_eq_catcode:NN #1#2 { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \exp_not:N #2
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \token_if_eq_charcode:NN #1#2 { p , T ,  F , TF }
  {
    \if_charcode:w \exp_not:N #1 \exp_not:N #2
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\use:x
  {
    \prg_new_conditional:Npnn \exp_not:N \token_if_macro:N ##1
      { p , T ,  F , TF }
      {
        \exp_not:N \exp_after:wN \exp_not:N \__token_if_macro_p:w
        \exp_not:N \token_to_meaning:N ##1 \tl_to_str:n { ma : }
          \exp_not:N \q_stop
      }
    \cs_new:Npn \exp_not:N  \__token_if_macro_p:w
      ##1 \tl_to_str:n { ma } ##2 \c_colon_str ##3 \exp_not:N \q_stop
  }
      {
        \if_int_compare:w \__str_if_eq_x:nn { #2 } { cro } = 0 \exp_stop_f:
            \prg_return_true:
        \else:
            \prg_return_false:
        \fi:
      }
\prg_new_conditional:Npnn \token_if_cs:N #1 { p , T ,  F , TF }
  {
    \if_catcode:w \exp_not:N #1 \scan_stop:
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \token_if_expandable:N #1 { p , T ,  F , TF }
  {
    \exp_after:wN \if_meaning:w \exp_not:N #1 #1
      \prg_return_false:
    \else:
      \if_cs_exist:N #1
        \prg_return_true:
      \else:
        \prg_return_false:
      \fi:
    \fi:
  }
\group_begin:
\cs_set_protected:Npn \__token_tmp:w #1
  {
    \use:x
      {
        \cs_new:Npn \exp_not:c { __token_delimit_by_ #1 :w }
            ####1 \tl_to_str:n {#1} ####2 \exp_not:N \q_stop
          { ####1 \tl_to_str:n {#1} }
      }
  }
\__token_tmp:w { char" }
\__token_tmp:w { count }
\__token_tmp:w { dimen }
\__token_tmp:w { macro }
\__token_tmp:w { muskip }
\__token_tmp:w { skip }
\__token_tmp:w { toks }
\group_end:
\group_begin:
\cs_set_protected:Npn \__token_tmp:w #1#2#3
  {
    \use:x
      {
        \prg_new_conditional:Npnn \exp_not:c { token_if_ #1 :N } ####1
          { p , T ,  F , TF }
          {
            \cs_if_exist:cT { tex_ #2 :D }
              {
                \exp_not:N \if_meaning:w ####1 \exp_not:c { tex_ #2 :D }
                \exp_not:N \prg_return_false:
                \exp_not:N \else:
                \exp_not:N \if_meaning:w ####1 \exp_not:c { tex_ #2 def:D }
                \exp_not:N \prg_return_false:
                \exp_not:N \else:
              }
            \exp_not:N \__str_if_eq_x_return:nn
              {
                \exp_not:N \exp_after:wN
                \exp_not:c { __token_delimit_by_ #2 :w }
                \exp_not:N \token_to_meaning:N ####1
                ? \tl_to_str:n {#2} \exp_not:N \q_stop
              }
              { \exp_not:n {#3} }
            \cs_if_exist:cT { tex_ #2 :D }
              {
                \exp_not:N \fi:
                \exp_not:N \fi:
              }
          }
      }
  }
\__token_tmp:w { chardef } { char" } { \token_to_str:N \char" }
\__token_tmp:w { mathchardef } { char" } { \token_to_str:N \mathchar" }
\__token_tmp:w { long_macro } { macro } { \tl_to_str:n { \long } macro }
\__token_tmp:w { protected_macro } { macro }
  { \tl_to_str:n { \protected } macro }
\__token_tmp:w { protected_long_macro } { macro }
  { \token_to_str:N \protected \tl_to_str:n { \long } macro }
\__token_tmp:w { dim_register } { dimen } { \token_to_str:N \dimen }
\__token_tmp:w { int_register } { count } { \token_to_str:N \count }
\__token_tmp:w { muskip_register } { muskip } { \token_to_str:N \muskip }
\__token_tmp:w { skip_register } { skip } { \token_to_str:N \skip }
\__token_tmp:w { toks_register } { toks } { \token_to_str:N \toks }
\group_end:
\tex_chardef:D \c__token_A_int = `A ~ %
\use:x
  {
    \prg_new_conditional:Npnn \exp_not:N \token_if_primitive:N ##1
      { p , T , F , TF }
      {
        \exp_not:N \token_if_macro:NTF ##1
          \exp_not:N \prg_return_false:
          {
            \exp_not:N \exp_after:wN \exp_not:N \__token_if_primitive:NNw
            \exp_not:N \token_to_meaning:N ##1
              \tl_to_str:n { : : : } \exp_not:N \q_stop ##1
          }
      }
    \cs_new:Npn \exp_not:N \__token_if_primitive:NNw
      ##1##2 ##3 \c_colon_str ##4 \exp_not:N \q_stop
      {
        \exp_not:N \tl_if_empty:oTF
          { \exp_not:N \__token_if_primitive_space:w ##3 ~ }
          {
            \exp_not:N \__token_if_primitive_loop:N ##3
              \c_colon_str \exp_not:N \q_stop
          }
          { \exp_not:N \__token_if_primitive_nullfont:N }
      }
  }
\cs_new:Npn \__token_if_primitive_space:w #1 ~ { }
\cs_new:Npn \__token_if_primitive_nullfont:N #1
  {
    \if_meaning:w \tex_nullfont:D #1
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_new:Npn \__token_if_primitive_loop:N #1
  {
    \if_int_compare:w `#1 < \c__token_A_int %
      \exp_after:wN \__token_if_primitive:Nw
      \exp_after:wN #1
    \else:
      \exp_after:wN \__token_if_primitive_loop:N
    \fi:
  }
\cs_new:Npn \__token_if_primitive:Nw #1 #2 \q_stop
  {
    \if:w : #1
      \exp_after:wN \__token_if_primitive_undefined:N
    \else:
      \prg_return_false:
      \exp_after:wN \use_none:n
    \fi:
  }
\cs_new:Npn \__token_if_primitive_undefined:N #1
  {
    \if_cs_exist:N #1
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_new_eq:NN \l_peek_token ?
\cs_new_eq:NN \g_peek_token ?
\cs_new_eq:NN \l__peek_search_token ?
\tl_new:N \l__peek_search_tl
\cs_new:Npn \__peek_true:w  { }
\cs_new:Npn \__peek_true_aux:w  { }
\cs_new:Npn \__peek_false:w { }
\cs_new:Npn \__peek_tmp:w { }
\cs_new_protected:Npn \peek_after:Nw
  { \tex_futurelet:D \l_peek_token }
\cs_new_protected:Npn \peek_gafter:Nw
  { \tex_global:D \tex_futurelet:D \g_peek_token }
\cs_new_protected:Npn \__peek_true_remove:w
  {
    \group_align_safe_end:
    \tex_afterassignment:D \__peek_true_aux:w
    \cs_set_eq:NN \__peek_tmp:w
  }
\cs_new_protected:Npn \__peek_token_generic:NNTF #1#2#3#4
  {
    \cs_set_eq:NN \l__peek_search_token #2
    \tl_set:Nn \l__peek_search_tl {#2}
    \cs_set:Npx \__peek_true:w
      {
        \exp_not:N \group_align_safe_end:
        \exp_not:n {#3}
      }
    \cs_set:Npx \__peek_false:w
      {
        \exp_not:N \group_align_safe_end:
        \exp_not:n {#4}
      }
    \group_align_safe_begin:
      \peek_after:Nw #1
  }
\cs_new_protected:Npn \__peek_token_generic:NNT #1#2#3
  { \__peek_token_generic:NNTF #1 #2 {#3} { } }
\cs_new_protected:Npn \__peek_token_generic:NNF #1#2#3
  { \__peek_token_generic:NNTF #1 #2 { } {#3} }
\cs_new_protected:Npn \__peek_token_remove_generic:NNTF #1#2#3#4
  {
    \cs_set_eq:NN \l__peek_search_token #2
    \tl_set:Nn \l__peek_search_tl {#2}
    \cs_set_eq:NN \__peek_true:w \__peek_true_remove:w
    \cs_set:Npx \__peek_true_aux:w { \exp_not:n {#3} }
    \cs_set:Npx \__peek_false:w
      {
        \exp_not:N \group_align_safe_end:
        \exp_not:n {#4}
      }
    \group_align_safe_begin:
      \peek_after:Nw #1
  }
\cs_new_protected:Npn \__peek_token_remove_generic:NNT #1#2#3
  { \__peek_token_remove_generic:NNTF #1 #2 {#3} { } }
\cs_new_protected:Npn \__peek_token_remove_generic:NNF #1#2#3
  { \__peek_token_remove_generic:NNTF #1 #2 { } {#3} }
\cs_new:Npn \__peek_execute_branches_meaning:
  {
    \if_meaning:w \l_peek_token \l__peek_search_token
      \exp_after:wN \__peek_true:w
    \else:
      \exp_after:wN \__peek_false:w
    \fi:
  }
\cs_new:Npn \__peek_execute_branches_catcode:
  { \if_catcode:w \__peek_execute_branches_catcode_aux: }
\cs_new:Npn \__peek_execute_branches_charcode:
  { \if_charcode:w \__peek_execute_branches_catcode_aux: }
\cs_new:Npn \__peek_execute_branches_catcode_aux:
  {
        \if_catcode:w \exp_not:N \l_peek_token \scan_stop:
          \exp_after:wN \exp_after:wN
          \exp_after:wN \__peek_execute_branches_catcode_auxii:N
          \exp_after:wN \exp_not:N
        \else:
          \exp_after:wN \__peek_execute_branches_catcode_auxiii:
        \fi:
  }
\cs_new:Npn \__peek_execute_branches_catcode_auxii:N #1
  {
        \exp_not:N #1
        \exp_after:wN \exp_not:N \l__peek_search_tl
      \exp_after:wN \__peek_true:w
    \else:
      \exp_after:wN \__peek_false:w
    \fi:
    #1
  }
\cs_new:Npn \__peek_execute_branches_catcode_auxiii:
  {
        \exp_not:N \l_peek_token
        \exp_after:wN \exp_not:N \l__peek_search_tl
      \exp_after:wN \__peek_true:w
    \else:
      \exp_after:wN \__peek_false:w
    \fi:
  }
\cs_new_protected:Npn \__peek_ignore_spaces_execute_branches:
  {
    \if_meaning:w \l_peek_token \c_space_token
      \exp_after:wN \peek_after:Nw
      \exp_after:wN \__peek_ignore_spaces_execute_branches:
      \exp:w \exp_end_continue_f:w
    \else:
      \exp_after:wN \__peek_execute_branches:
    \fi:
  }
\group_begin:
  \cs_set:Npn \__peek_def:nnnn #1#2#3#4
    {
      \__peek_def:nnnnn {#1} {#2} {#3} {#4} { TF }
      \__peek_def:nnnnn {#1} {#2} {#3} {#4} { T }
      \__peek_def:nnnnn {#1} {#2} {#3} {#4} { F }
    }
  \cs_set:Npn \__peek_def:nnnnn #1#2#3#4#5
    {
      \cs_new_protected:cpx { #1 #5 }
        {
          \tl_if_empty:nF {#2}
            { \exp_not:n { \cs_set_eq:NN \__peek_execute_branches: #2 } }
          \exp_not:c { #3 #5 }
          \exp_not:n {#4}
        }
    }
  \__peek_def:nnnn { peek_catcode:N }
    { }
    { __peek_token_generic:NN }
    { \__peek_execute_branches_catcode: }
  \__peek_def:nnnn { peek_catcode_ignore_spaces:N }
    { \__peek_execute_branches_catcode: }
    { __peek_token_generic:NN }
    { \__peek_ignore_spaces_execute_branches: }
  \__peek_def:nnnn { peek_catcode_remove:N }
    { }
    { __peek_token_remove_generic:NN }
    { \__peek_execute_branches_catcode: }
  \__peek_def:nnnn { peek_catcode_remove_ignore_spaces:N }
    { \__peek_execute_branches_catcode: }
    { __peek_token_remove_generic:NN }
    { \__peek_ignore_spaces_execute_branches: }
  \__peek_def:nnnn { peek_charcode:N }
    { }
    { __peek_token_generic:NN }
    { \__peek_execute_branches_charcode: }
  \__peek_def:nnnn { peek_charcode_ignore_spaces:N }
    { \__peek_execute_branches_charcode: }
    { __peek_token_generic:NN }
    { \__peek_ignore_spaces_execute_branches: }
  \__peek_def:nnnn { peek_charcode_remove:N }
    { }
    { __peek_token_remove_generic:NN }
    { \__peek_execute_branches_charcode: }
  \__peek_def:nnnn { peek_charcode_remove_ignore_spaces:N }
    { \__peek_execute_branches_charcode: }
    { __peek_token_remove_generic:NN }
    { \__peek_ignore_spaces_execute_branches: }
  \__peek_def:nnnn { peek_meaning:N }
    { }
    { __peek_token_generic:NN }
    { \__peek_execute_branches_meaning: }
  \__peek_def:nnnn { peek_meaning_ignore_spaces:N }
    { \__peek_execute_branches_meaning: }
    { __peek_token_generic:NN }
    { \__peek_ignore_spaces_execute_branches: }
  \__peek_def:nnnn { peek_meaning_remove:N }
    { }
    { __peek_token_remove_generic:NN }
    { \__peek_execute_branches_meaning: }
  \__peek_def:nnnn { peek_meaning_remove_ignore_spaces:N }
    { \__peek_execute_branches_meaning: }
    { __peek_token_remove_generic:NN }
    { \__peek_ignore_spaces_execute_branches: }
\group_end:
\exp_args:Nno \use:nn
  { \cs_new:Npn \__peek_get_prefix_arg_replacement:wN #1 }
  { \tl_to_str:n { macro : } #2 -> #3 \q_stop #4 }
  { #4 {#1} {#2} {#3} }
\cs_new:Npn \token_get_prefix_spec:N #1
  {
    \token_if_macro:NTF #1
      {
        \exp_after:wN \__peek_get_prefix_arg_replacement:wN
          \token_to_meaning:N #1 \q_stop \use_i:nnn
      }
      { \scan_stop: }
  }
\cs_new:Npn \token_get_arg_spec:N #1
  {
    \token_if_macro:NTF #1
      {
        \exp_after:wN \__peek_get_prefix_arg_replacement:wN
          \token_to_meaning:N #1 \q_stop \use_ii:nnn
      }
      { \scan_stop: }
  }
\cs_new:Npn \token_get_replacement_spec:N #1
  {
    \token_if_macro:NTF #1
      {
        \exp_after:wN \__peek_get_prefix_arg_replacement:wN
          \token_to_meaning:N #1 \q_stop \use_iii:nnn
      }
      { \scan_stop: }
  }
%% File: l3prop.dtx Copyright (C) 1990-2017 The LaTeX3 Project
\__scan_new:N \s__prop
\cs_new:Npn \__prop_pair:wn #1 \s__prop #2
  { \__msg_kernel_expandable_error:nn { kernel } { misused-prop } }
\tl_new:N \l__prop_internal_tl
\tl_const:Nn \c_empty_prop { \s__prop }
\cs_new_protected:Npn \prop_new:N #1
  {
    \__chk_if_free_cs:N #1
    \cs_gset_eq:NN #1 \c_empty_prop
  }
\cs_generate_variant:Nn \prop_new:N { c }
\cs_new_protected:Npn \prop_clear:N  #1
  { \prop_set_eq:NN #1 \c_empty_prop }
\cs_generate_variant:Nn \prop_clear:N  { c }
\cs_new_protected:Npn \prop_gclear:N #1
  { \prop_gset_eq:NN #1 \c_empty_prop }
\cs_generate_variant:Nn \prop_gclear:N { c }
\cs_new_protected:Npn \prop_clear_new:N  #1
  { \prop_if_exist:NTF #1 { \prop_clear:N #1 } { \prop_new:N #1 } }
\cs_generate_variant:Nn \prop_clear_new:N  { c }
\cs_new_protected:Npn \prop_gclear_new:N #1
  { \prop_if_exist:NTF #1 { \prop_gclear:N #1 } { \prop_new:N #1 } }
\cs_generate_variant:Nn \prop_gclear_new:N { c }
\cs_new_eq:NN \prop_set_eq:NN  \tl_set_eq:NN
\cs_new_eq:NN \prop_set_eq:Nc  \tl_set_eq:Nc
\cs_new_eq:NN \prop_set_eq:cN  \tl_set_eq:cN
\cs_new_eq:NN \prop_set_eq:cc  \tl_set_eq:cc
\cs_new_eq:NN \prop_gset_eq:NN \tl_gset_eq:NN
\cs_new_eq:NN \prop_gset_eq:Nc \tl_gset_eq:Nc
\cs_new_eq:NN \prop_gset_eq:cN \tl_gset_eq:cN
\cs_new_eq:NN \prop_gset_eq:cc \tl_gset_eq:cc
\prop_new:N \l_tmpa_prop
\prop_new:N \l_tmpb_prop
\prop_new:N \g_tmpa_prop
\prop_new:N \g_tmpb_prop
\cs_new_protected:Npn \__prop_split:NnTF #1#2
  { \exp_args:NNo \__prop_split_aux:NnTF #1 { \tl_to_str:n {#2} } }
\cs_new_protected:Npn \__prop_split_aux:NnTF #1#2#3#4
  {
    \cs_set:Npn \__prop_split_aux:w ##1
      \__prop_pair:wn #2 \s__prop ##2 ##3 \q_mark ##4 ##5 \q_stop
      { ##4 {#3} {#4} }
    \exp_after:wN \__prop_split_aux:w #1 \q_mark \use_i:nn
      \__prop_pair:wn #2 \s__prop { } \q_mark \use_ii:nn \q_stop
  }
\cs_new:Npn \__prop_split_aux:w { }
\cs_new_protected:Npn \prop_remove:Nn #1#2
  {
    \__prop_split:NnTF #1 {#2}
      { \tl_set:Nn #1 { ##1 ##3 } }
      { }
  }
\cs_new_protected:Npn \prop_gremove:Nn #1#2
  {
    \__prop_split:NnTF #1 {#2}
      { \tl_gset:Nn #1 { ##1 ##3 } }
      { }
  }
\cs_generate_variant:Nn \prop_remove:Nn  {     NV }
\cs_generate_variant:Nn \prop_remove:Nn  { c , cV }
\cs_generate_variant:Nn \prop_gremove:Nn {     NV }
\cs_generate_variant:Nn \prop_gremove:Nn { c , cV }
\cs_new_protected:Npn \prop_get:NnN #1#2#3
  {
    \__prop_split:NnTF #1 {#2}
      { \tl_set:Nn #3 {##2} }
      { \tl_set:Nn #3 { \q_no_value } }
  }
\cs_generate_variant:Nn \prop_get:NnN {     NV , No }
\cs_generate_variant:Nn \prop_get:NnN { c , cV , co }
\cs_new_protected:Npn \prop_pop:NnN #1#2#3
  {
    \__prop_split:NnTF #1 {#2}
      {
        \tl_set:Nn #3 {##2}
        \tl_set:Nn #1 { ##1 ##3 }
      }
      { \tl_set:Nn #3 { \q_no_value } }
  }
\cs_new_protected:Npn \prop_gpop:NnN #1#2#3
  {
    \__prop_split:NnTF #1 {#2}
      {
        \tl_set:Nn #3 {##2}
        \tl_gset:Nn #1 { ##1 ##3 }
      }
      { \tl_set:Nn #3 { \q_no_value } }
  }
\cs_generate_variant:Nn \prop_pop:NnN  {     No }
\cs_generate_variant:Nn \prop_pop:NnN  { c , co }
\cs_generate_variant:Nn \prop_gpop:NnN {     No }
\cs_generate_variant:Nn \prop_gpop:NnN { c , co }
\cs_new:Npn \prop_item:Nn #1#2
  {
    \exp_last_unbraced:Noo \__prop_item_Nn:nwwn { \tl_to_str:n {#2} } #1
      \__prop_pair:wn \tl_to_str:n {#2} \s__prop { }
    \__prg_break_point:
  }
\cs_new:Npn \__prop_item_Nn:nwwn #1#2 \__prop_pair:wn #3 \s__prop #4
  {
    \str_if_eq_x:nnTF {#1} {#3}
      { \__prg_break:n { \exp_not:n {#4} } }
      { \__prop_item_Nn:nwwn {#1} }
  }
\cs_generate_variant:Nn \prop_item:Nn { c }
\prg_new_protected_conditional:Npnn \prop_pop:NnN #1#2#3 { T , F , TF }
  {
    \__prop_split:NnTF #1 {#2}
      {
        \tl_set:Nn #3 {##2}
        \tl_set:Nn #1 { ##1 ##3 }
        \prg_return_true:
      }
      { \prg_return_false: }
  }
\prg_new_protected_conditional:Npnn \prop_gpop:NnN #1#2#3 { T , F , TF }
  {
    \__prop_split:NnTF #1 {#2}
      {
        \tl_set:Nn #3 {##2}
        \tl_gset:Nn #1 { ##1 ##3 }
        \prg_return_true:
      }
      { \prg_return_false: }
  }
\cs_generate_variant:Nn \prop_pop:NnNT   { c }
\cs_generate_variant:Nn \prop_pop:NnNF   { c }
\cs_generate_variant:Nn \prop_pop:NnNTF  { c }
\cs_generate_variant:Nn \prop_gpop:NnNT  { c }
\cs_generate_variant:Nn \prop_gpop:NnNF  { c }
\cs_generate_variant:Nn \prop_gpop:NnNTF { c }
\cs_new_protected:Npn \prop_put:Nnn  { \__prop_put:NNnn \tl_set:Nx }
\cs_new_protected:Npn \prop_gput:Nnn { \__prop_put:NNnn \tl_gset:Nx }
\cs_new_protected:Npn \__prop_put:NNnn #1#2#3#4
  {
    \tl_set:Nn \l__prop_internal_tl
      {
        \exp_not:N \__prop_pair:wn \tl_to_str:n {#3}
        \s__prop { \exp_not:n {#4} }
      }
    \__prop_split:NnTF #2 {#3}
      { #1 #2 { \exp_not:n {##1} \l__prop_internal_tl \exp_not:n {##3} } }
      { #1 #2 { \exp_not:o {#2} \l__prop_internal_tl } }
  }
\cs_generate_variant:Nn \prop_put:Nnn
  {     NnV , Nno , Nnx , NV , NVV , No , Noo }
\cs_generate_variant:Nn \prop_put:Nnn
  { c , cnV , cno , cnx , cV , cVV , co , coo }
\cs_generate_variant:Nn \prop_gput:Nnn
  {     NnV , Nno , Nnx , NV , NVV , No , Noo }
\cs_generate_variant:Nn \prop_gput:Nnn
  { c , cnV , cno , cnx , cV , cVV , co , coo }
\cs_new_protected:Npn \prop_put_if_new:Nnn
  { \__prop_put_if_new:NNnn \tl_set:Nx }
\cs_new_protected:Npn \prop_gput_if_new:Nnn
  { \__prop_put_if_new:NNnn \tl_gset:Nx }
\cs_new_protected:Npn \__prop_put_if_new:NNnn #1#2#3#4
  {
    \tl_set:Nn \l__prop_internal_tl
      {
        \exp_not:N \__prop_pair:wn \tl_to_str:n {#3}
        \s__prop \exp_not:n { {#4} }
      }
    \__prop_split:NnTF #2 {#3}
      { }
      { #1 #2 { \exp_not:o {#2} \l__prop_internal_tl } }
  }
\cs_generate_variant:Nn \prop_put_if_new:Nnn  { c }
\cs_generate_variant:Nn \prop_gput_if_new:Nnn { c }
\prg_new_eq_conditional:NNn \prop_if_exist:N \cs_if_exist:N
  { TF , T , F , p }
\prg_new_eq_conditional:NNn \prop_if_exist:c \cs_if_exist:c
  { TF , T , F , p }
\prg_new_conditional:Npnn \prop_if_empty:N #1 { p , T , F , TF }
  {
    \tl_if_eq:NNTF #1 \c_empty_prop
      \prg_return_true: \prg_return_false:
  }
\cs_generate_variant:Nn \prop_if_empty_p:N { c }
\cs_generate_variant:Nn \prop_if_empty:NT { c }
\cs_generate_variant:Nn \prop_if_empty:NF { c }
\cs_generate_variant:Nn \prop_if_empty:NTF { c }
\prg_new_conditional:Npnn \prop_if_in:Nn #1#2 { p , T , F , TF }
  {
    \exp_last_unbraced:Noo \__prop_if_in:nwwn { \tl_to_str:n {#2} } #1
      \__prop_pair:wn \tl_to_str:n {#2} \s__prop { }
      \q_recursion_tail
    \__prg_break_point:
  }
\cs_new:Npn \__prop_if_in:nwwn #1#2 \__prop_pair:wn #3 \s__prop #4
  {
    \str_if_eq_x:nnTF {#1} {#3}
      { \__prop_if_in:N }
      { \__prop_if_in:nwwn {#1} }
  }
\cs_new:Npn \__prop_if_in:N #1
  {
    \if_meaning:w \q_recursion_tail #1
      \prg_return_false:
    \else:
      \prg_return_true:
    \fi:
    \__prg_break:
  }
\cs_generate_variant:Nn \prop_if_in_p:Nn {     NV , No }
\cs_generate_variant:Nn \prop_if_in_p:Nn { c , cV , co }
\cs_generate_variant:Nn \prop_if_in:NnT  {     NV , No }
\cs_generate_variant:Nn \prop_if_in:NnT  { c , cV , co }
\cs_generate_variant:Nn \prop_if_in:NnF  {     NV , No }
\cs_generate_variant:Nn \prop_if_in:NnF  { c , cV , co }
\cs_generate_variant:Nn \prop_if_in:NnTF {     NV , No }
\cs_generate_variant:Nn \prop_if_in:NnTF { c , cV , co }
\prg_new_protected_conditional:Npnn \prop_get:NnN #1#2#3 { T , F , TF }
  {
    \__prop_split:NnTF #1 {#2}
      {
        \tl_set:Nn #3 {##2}
        \prg_return_true:
      }
      { \prg_return_false: }
  }
\cs_generate_variant:Nn \prop_get:NnNT  {     NV , No }
\cs_generate_variant:Nn \prop_get:NnNF  {     NV , No }
\cs_generate_variant:Nn \prop_get:NnNTF {     NV , No }
\cs_generate_variant:Nn \prop_get:NnNT  { c , cV , co }
\cs_generate_variant:Nn \prop_get:NnNF  { c , cV , co }
\cs_generate_variant:Nn \prop_get:NnNTF { c , cV , co }
\cs_new:Npn \prop_map_function:NN #1#2
  {
    \exp_last_unbraced:NNo \__prop_map_function:Nwwn #2 #1
      \__prop_pair:wn \q_recursion_tail \s__prop { }
    \__prg_break_point:Nn \prop_map_break: { }
  }
\cs_new:Npn \__prop_map_function:Nwwn #1#2 \__prop_pair:wn #3 \s__prop #4
  {
    \if_meaning:w \q_recursion_tail #3
      \exp_after:wN \prop_map_break:
    \fi:
    #1 {#3} {#4}
    \__prop_map_function:Nwwn #1
  }
\cs_generate_variant:Nn \prop_map_function:NN {     Nc }
\cs_generate_variant:Nn \prop_map_function:NN { c , cc }
\cs_new_protected:Npn \prop_map_inline:Nn #1#2
  {
    \cs_gset_eq:cN
      { __prg_map_ \int_use:N \g__prg_map_int :wn } \__prop_pair:wn
    \int_gincr:N \g__prg_map_int
    \cs_gset_protected:Npn \__prop_pair:wn ##1 \s__prop ##2 {#2}
    #1
    \__prg_break_point:Nn \prop_map_break:
      {
        \int_gdecr:N \g__prg_map_int
        \cs_gset_eq:Nc \__prop_pair:wn
          { __prg_map_ \int_use:N \g__prg_map_int :wn }
      }
  }
\cs_generate_variant:Nn \prop_map_inline:Nn { c }
\cs_new:Npn \prop_map_break:
  { \__prg_map_break:Nn \prop_map_break: { } }
\cs_new:Npn \prop_map_break:n
  { \__prg_map_break:Nn \prop_map_break: }
\cs_new_protected:Npn \prop_show:N #1
  {
    \__msg_show_variable:NNNnn #1
      \prop_if_exist:NTF \prop_if_empty:NTF { prop }
      { \prop_map_function:NN #1 \__msg_show_item:nn }
  }
\cs_generate_variant:Nn \prop_show:N { c }
\cs_new_protected:Npn \prop_log:N
  { \__msg_log_next: \prop_show:N }
\cs_generate_variant:Nn \prop_log:N { c }
%% File: l3msg.dtx Copyright (C) 2009-2017 The LaTeX3 Project
\tl_new:N \l__msg_internal_tl
\bool_new:N \l__msg_line_context_bool
\tl_const:Nn \c__msg_text_prefix_tl      { msg~text~>~ }
\tl_const:Nn \c__msg_more_text_prefix_tl { msg~extra~text~>~ }
\prg_new_conditional:Npnn \msg_if_exist:nn #1#2 { p , T , F , TF }
  {
    \cs_if_exist:cTF { \c__msg_text_prefix_tl #1 / #2 }
      { \prg_return_true: } { \prg_return_false: }
  }
\cs_new_protected:Npn \__chk_if_free_msg:nn #1#2
  {
    \msg_if_exist:nnT {#1} {#2}
      {
        \__msg_kernel_error:nnxx { kernel } { message-already-defined }
          {#1} {#2}
      }
  }
\if_bool:N \l@expl@log@functions@bool
  \cs_gset_protected:Npn \__chk_if_free_msg:nn #1#2
    {
      \msg_if_exist:nnT {#1} {#2}
        {
          \__msg_kernel_error:nnxx { kernel } { message-already-defined }
            {#1} {#2}
        }
      \__chk_log:x { Defining~message~ #1 / #2 ~\msg_line_context: }
    }
\fi:
\cs_new_protected:Npn \msg_new:nnnn #1#2
  {
    \__chk_if_free_msg:nn {#1} {#2}
    \msg_gset:nnnn {#1} {#2}
  }
\cs_new_protected:Npn \msg_new:nnn #1#2#3
  { \msg_new:nnnn {#1} {#2} {#3} { } }
\cs_new_protected:Npn \msg_set:nnnn #1#2#3#4
  {
    \cs_set:cpn { \c__msg_text_prefix_tl #1 / #2 }
      ##1##2##3##4 {#3}
    \cs_set:cpn { \c__msg_more_text_prefix_tl #1 / #2 }
      ##1##2##3##4 {#4}
  }
\cs_new_protected:Npn \msg_set:nnn #1#2#3
  { \msg_set:nnnn {#1} {#2} {#3} { } }
\cs_new_protected:Npn \msg_gset:nnnn #1#2#3#4
  {
    \cs_gset:cpn { \c__msg_text_prefix_tl #1 / #2 }
      ##1##2##3##4 {#3}
    \cs_gset:cpn { \c__msg_more_text_prefix_tl #1 / #2 }
      ##1##2##3##4 {#4}
  }
\cs_new_protected:Npn \msg_gset:nnn #1#2#3
  { \msg_gset:nnnn {#1} {#2} {#3} { } }
\tl_const:Nn \c__msg_coding_error_text_tl
  {
    This~is~a~coding~error.
    \\ \\
  }
\tl_const:Nn \c__msg_continue_text_tl
  { Type~<return>~to~continue }
\tl_const:Nn \c__msg_critical_text_tl
  { Reading~the~current~file~'\g_file_current_name_tl'~will~stop. }
\tl_const:Nn \c__msg_fatal_text_tl
  { This~is~a~fatal~error:~LaTeX~will~abort. }
\tl_const:Nn \c__msg_help_text_tl
  { For~immediate~help~type~H~<return> }
\tl_const:Nn \c__msg_no_info_text_tl
  {
    LaTeX~does~not~know~anything~more~about~this~error,~sorry.
    \c__msg_return_text_tl
  }
\tl_const:Nn \c__msg_on_line_text_tl { on~line }
\tl_const:Nn \c__msg_return_text_tl
  {
    \\ \\
    Try~typing~<return>~to~proceed.
    \\
    If~that~doesn't~work,~type~X~<return>~to~quit.
  }
\tl_const:Nn \c__msg_trouble_text_tl
  {
    \\ \\
    More~errors~will~almost~certainly~follow: \\
    the~LaTeX~run~should~be~aborted.
  }
\cs_new:Npn \msg_line_number: { \int_use:N \tex_inputlineno:D }
\cs_gset:Npn \msg_line_context:
  {
    \c__msg_on_line_text_tl
    \c_space_tl
    \msg_line_number:
  }
\cs_new_protected:Npn \msg_interrupt:nnn #1#2#3
  {
    \tl_if_empty:nTF {#3}
      {
        \__msg_interrupt_wrap:nn { \\ \c__msg_no_info_text_tl }
          {#1 \\\\ #2 \\\\ \c__msg_continue_text_tl }
      }
      {
        \__msg_interrupt_wrap:nn { \\ #3 }
          {#1 \\\\ #2 \\\\ \c__msg_help_text_tl }
      }
  }
\cs_new_protected:Npn \__msg_interrupt_wrap:nn #1#2
  {
    \iow_wrap:nnnN {#1} { | ~ } { } \__msg_interrupt_more_text:n
    \iow_wrap:nnnN {#2} { ! ~ } { } \__msg_interrupt_text:n
  }
\cs_new_protected:Npn \__msg_interrupt_more_text:n #1
  {
    \exp_args:Nx \tex_errhelp:D
      {
        |'''''''''''''''''''''''''''''''''''''''''''''''
        #1 \iow_newline:
        |...............................................
      }
  }

\group_begin:
  \char_set_lccode:nn {`\{} {`\ }
  \char_set_lccode:nn {`\}} {`\ }
  \char_set_lccode:nn {`\&} {`\!}
  \char_set_catcode_active:N \&
\tex_lowercase:D
  {
    \group_end:
    \cs_new_protected:Npn \__msg_interrupt_text:n #1
      {
        \iow_term:x
          {
            \iow_newline:
            !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            \iow_newline:
            !
          }
        \__iow_with:Nnn \tex_newlinechar:D { `\^^J }
          {
            \__iow_with:Nnn \tex_errorcontextlines:D { -1 }
              {
                \group_begin:
                  \cs_set_protected:Npn &
                    {
                      \tex_errmessage:D
                        {
                          #1
                          \use_none:n
                            { ............................................ }
                        }
                    }
                  \exp_after:wN
                \group_end:
                &
              }
          }
      }
  }
\cs_new_protected:Npn \msg_log:n #1
  {
    \iow_log:n { ................................................. }
    \iow_wrap:nnnN { . ~ #1} { . ~ } { } \iow_log:n
    \iow_log:n { ................................................. }
  }
\cs_new_protected:Npn \msg_term:n #1
  {
    \iow_term:n { ************************************************* }
    \iow_wrap:nnnN { * ~ #1} { * ~ } { } \iow_term:n
    \iow_term:n { ************************************************* }
  }
\cs_new:Npn \msg_fatal_text:n #1
  {
    Fatal~#1~error
    \bool_if:NT \l__msg_line_context_bool { ~ \msg_line_context: }
  }
\cs_new:Npn \msg_critical_text:n #1
  {
    Critical~#1~error
    \bool_if:NT \l__msg_line_context_bool { ~ \msg_line_context: }
  }
\cs_new:Npn \msg_error_text:n #1
  {
    #1~error
    \bool_if:NT \l__msg_line_context_bool { ~ \msg_line_context: }
  }
\cs_new:Npn \msg_warning_text:n #1
  {
    #1~warning
    \bool_if:NT \l__msg_line_context_bool { ~ \msg_line_context: }
  }
\cs_new:Npn \msg_info_text:n #1
  {
    #1~info
    \bool_if:NT \l__msg_line_context_bool { ~ \msg_line_context: }
  }
\cs_new:Npn \msg_see_documentation_text:n #1
  {
    \\ \\ See~the~
    \str_if_eq:nnTF {#1} { LaTeX } { LaTeX3 } {#1} ~
    documentation~for~further~information.
  }
\group_begin:
  \cs_set_protected:Npn \__msg_class_new:nn #1#2
    {
      \prop_new:c { l__msg_redirect_ #1 _prop }
      \cs_new_protected:cpn { __msg_ #1 _code:nnnnnn }
          ##1##2##3##4##5##6 {#2}
      \cs_new_protected:cpn { msg_ #1 :nnnnnn } ##1##2##3##4##5##6
        {
          \use:x
            {
              \exp_not:n { \__msg_use:nnnnnnn {#1} {##1} {##2} }
                { \tl_to_str:n {##3} } { \tl_to_str:n {##4} }
                { \tl_to_str:n {##5} } { \tl_to_str:n {##6} }
            }
        }
      \cs_new_protected:cpx { msg_ #1 :nnnnn } ##1##2##3##4##5
        { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } }
      \cs_new_protected:cpx { msg_ #1 :nnnn } ##1##2##3##4
        { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } }
      \cs_new_protected:cpx { msg_ #1 :nnn } ##1##2##3
        { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} {##3} { } { } { } }
      \cs_new_protected:cpx { msg_ #1 :nn } ##1##2
        { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} { } { } { } { } }
      \cs_new_protected:cpx { msg_ #1 :nnxxxx } ##1##2##3##4##5##6
        {
          \use:x
            {
              \exp_not:N \exp_not:n
                { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} }
                {##3} {##4} {##5} {##6}
            }
        }
      \cs_new_protected:cpx { msg_ #1 :nnxxx } ##1##2##3##4##5
        { \exp_not:c { msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } }
      \cs_new_protected:cpx { msg_ #1 :nnxx } ##1##2##3##4
        { \exp_not:c { msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } }
      \cs_new_protected:cpx { msg_ #1 :nnx } ##1##2##3
        { \exp_not:c { msg_ #1 :nnxxxx } {##1} {##2} {##3} { } { } { } }
    }
  \__msg_class_new:nn { fatal }
    {
      \msg_interrupt:nnn
        { \msg_fatal_text:n {#1} : ~ "#2" }
        {
          \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6}
          \msg_see_documentation_text:n {#1}
        }
        { \c__msg_fatal_text_tl }
      \tex_end:D
    }
  \__msg_class_new:nn { critical }
    {
      \msg_interrupt:nnn
        { \msg_critical_text:n {#1} : ~ "#2" }
        {
          \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6}
          \msg_see_documentation_text:n {#1}
        }
        { \c__msg_critical_text_tl }
      \tex_endinput:D
    }
  \__msg_class_new:nn { error }
    {
      \__msg_error:cnnnnn
        { \c__msg_more_text_prefix_tl #1 / #2 }
        {#3} {#4} {#5} {#6}
        {
          \msg_interrupt:nnn
            { \msg_error_text:n {#1} : ~ "#2" }
            {
              \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6}
              \msg_see_documentation_text:n {#1}
            }
       }
    }
  \cs_new_protected:Npn \__msg_error:cnnnnn #1#2#3#4#5#6
    {
      \cs_if_eq:cNTF {#1} \__msg_no_more_text:nnnn
        { #6 { } }
        { #6 { \use:c {#1} {#2} {#3} {#4} {#5} } }
    }
  \cs_new:Npn \__msg_no_more_text:nnnn #1#2#3#4 { }
  \__msg_class_new:nn { warning }
    {
      \msg_term:n
        {
          \msg_warning_text:n {#1} : ~ "#2" \\ \\
          \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6}
        }
    }
  \__msg_class_new:nn { info }
    {
      \msg_log:n
        {
          \msg_info_text:n {#1} : ~ "#2" \\ \\
          \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6}
        }
    }
  \__msg_class_new:nn { log }
    {
      \iow_wrap:nnnN
        { \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} }
        { } { } \iow_log:n
    }
  \__msg_class_new:nn { none } { }
\group_end:
\cs_new:Npn \__msg_class_chk_exist:nT #1
  {
    \cs_if_free:cTF { __msg_ #1 _code:nnnnnn }
      { \__msg_kernel_error:nnx { kernel } { message-class-unknown } {#1} }
  }
\tl_new:N \l__msg_class_tl
\tl_new:N \l__msg_current_class_tl
\prop_new:N \l__msg_redirect_prop
\seq_new:N \l__msg_hierarchy_seq
\seq_new:N \l__msg_class_loop_seq
\cs_new_protected:Npn \__msg_use:nnnnnnn #1#2#3#4#5#6#7
  {
    \msg_if_exist:nnTF {#2} {#3}
      {
        \__msg_class_chk_exist:nT {#1}
          {
            \tl_set:Nn \l__msg_current_class_tl {#1}
            \cs_set_protected:Npx \__msg_use_code:
              {
                \exp_not:n
                  {
                    \use:c { __msg_ \l__msg_class_tl _code:nnnnnn }
                      {#2} {#3} {#4} {#5} {#6} {#7}
                  }
              }
            \__msg_use_redirect_name:n { #2 / #3 }
          }
      }
      { \__msg_kernel_error:nnxx { kernel } { message-unknown } {#2} {#3} }
  }
\cs_new_protected:Npn \__msg_use_code: { }
\cs_new_protected:Npn \__msg_use_redirect_name:n #1
  {
    \prop_get:NnNTF \l__msg_redirect_prop { / #1 } \l__msg_class_tl
      { \__msg_use_code: }
      {
        \seq_clear:N \l__msg_hierarchy_seq
        \__msg_use_hierarchy:nwwN { }
          #1 \q_mark \__msg_use_hierarchy:nwwN
          /  \q_mark \use_none_delimit_by_q_stop:w
          \q_stop
        \__msg_use_redirect_module:n { }
      }
  }
\cs_new_protected:Npn \__msg_use_hierarchy:nwwN #1#2 / #3 \q_mark #4
  {
    \seq_put_left:Nn \l__msg_hierarchy_seq {#1}
    #4 { #1 / #2 } #3 \q_mark #4
  }
\cs_new_protected:Npn \__msg_use_redirect_module:n #1
  {
    \seq_map_inline:Nn \l__msg_hierarchy_seq
      {
        \prop_get:cnNTF { l__msg_redirect_ \l__msg_current_class_tl _prop }
          {##1} \l__msg_class_tl
          {
            \seq_map_break:n
              {
                \tl_if_eq:NNTF \l__msg_current_class_tl \l__msg_class_tl
                  { \__msg_use_code: }
                  {
                    \tl_set_eq:NN \l__msg_current_class_tl \l__msg_class_tl
                    \__msg_use_redirect_module:n {##1}
                  }
              }
          }
          {
            \str_if_eq:nnT {##1} {#1}
              {
                \tl_set_eq:NN \l__msg_class_tl \l__msg_current_class_tl
                \seq_map_break:n { \__msg_use_code: }
              }
          }
      }
  }
\cs_new_protected:Npn \msg_redirect_name:nnn #1#2#3
  {
    \tl_if_empty:nTF {#3}
      { \prop_remove:Nn \l__msg_redirect_prop { / #1 / #2 } }
      {
        \__msg_class_chk_exist:nT {#3}
          { \prop_put:Nnn \l__msg_redirect_prop { / #1 / #2 } {#3} }
      }
  }
\cs_new_protected:Npn \msg_redirect_class:nn
  { \__msg_redirect:nnn { } }
\cs_new_protected:Npn \msg_redirect_module:nnn #1
  { \__msg_redirect:nnn { / #1 } }
\cs_new_protected:Npn \__msg_redirect:nnn #1#2#3
  {
    \__msg_class_chk_exist:nT {#2}
      {
        \tl_if_empty:nTF {#3}
          { \prop_remove:cn { l__msg_redirect_ #2 _prop } {#1} }
          {
            \__msg_class_chk_exist:nT {#3}
              {
                \prop_put:cnn { l__msg_redirect_ #2 _prop } {#1} {#3}
                \tl_set:Nn \l__msg_current_class_tl {#2}
                \seq_clear:N \l__msg_class_loop_seq
                \__msg_redirect_loop_chk:nnn {#2} {#3} {#1}
              }
          }
      }
  }
\cs_new_protected:Npn \__msg_redirect_loop_chk:nnn #1#2#3
  {
    \seq_put_right:Nn \l__msg_class_loop_seq {#1}
    \prop_get:cnNT { l__msg_redirect_ #1 _prop } {#3} \l__msg_class_tl
      {
        \str_if_eq_x:nnF { \l__msg_class_tl } {#1}
          {
            \tl_if_eq:NNTF \l__msg_class_tl \l__msg_current_class_tl
              {
                \prop_put:cnn { l__msg_redirect_ #2 _prop } {#3} {#2}
                \__msg_kernel_warning:nnxxxx
                  { kernel } { message-redirect-loop }
                  { \seq_item:Nn \l__msg_class_loop_seq { 1 } }
                  { \seq_item:Nn \l__msg_class_loop_seq { 2 } }
                  {#3}
                  {
                    \seq_map_function:NN \l__msg_class_loop_seq
                      \__msg_redirect_loop_list:n
                    { \seq_item:Nn \l__msg_class_loop_seq { 1 } }
                  }
              }
              { \__msg_redirect_loop_chk:onn \l__msg_class_tl {#2} {#3} }
          }
      }
  }
\cs_generate_variant:Nn \__msg_redirect_loop_chk:nnn { o }
\cs_new:Npn \__msg_redirect_loop_list:n #1 { {#1} ~ => ~ }
\cs_new_protected:Npn \__msg_kernel_new:nnnn #1#2
  { \msg_new:nnnn { LaTeX } { #1 / #2 } }
\cs_new_protected:Npn \__msg_kernel_new:nnn #1#2
  { \msg_new:nnn { LaTeX } { #1 / #2 } }
\cs_new_protected:Npn \__msg_kernel_set:nnnn #1#2
  { \msg_set:nnnn { LaTeX } { #1 / #2 } }
\cs_new_protected:Npn \__msg_kernel_set:nnn #1#2
  { \msg_set:nnn { LaTeX } { #1 / #2 } }
\group_begin:
  \cs_set_protected:Npn \__msg_kernel_class_new:nN #1
    { \__msg_kernel_class_new_aux:nN { kernel_ #1 } }
  \cs_set_protected:Npn \__msg_kernel_class_new_aux:nN #1#2
    {
      \cs_new_protected:cpn { __msg_ #1 :nnnnnn } ##1##2##3##4##5##6
        {
          \use:x
            {
              \exp_not:n { #2 { LaTeX } { ##1 / ##2 } }
                { \tl_to_str:n {##3} } { \tl_to_str:n {##4} }
                { \tl_to_str:n {##5} } { \tl_to_str:n {##6} }
            }
        }
      \cs_new_protected:cpx { __msg_ #1 :nnnnn } ##1##2##3##4##5
        { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } }
      \cs_new_protected:cpx { __msg_ #1 :nnnn } ##1##2##3##4
        { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } }
      \cs_new_protected:cpx { __msg_ #1 :nnn } ##1##2##3
        { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} {##3} { } { } { } }
      \cs_new_protected:cpx { __msg_ #1 :nn } ##1##2
        { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} { } { } { } { } }
      \cs_new_protected:cpx { __msg_ #1 :nnxxxx } ##1##2##3##4##5##6
        {
          \use:x
            {
              \exp_not:N \exp_not:n
                { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} }
                {##3} {##4} {##5} {##6}
            }
        }
      \cs_new_protected:cpx { __msg_ #1 :nnxxx } ##1##2##3##4##5
        { \exp_not:c { __msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } }
      \cs_new_protected:cpx { __msg_ #1 :nnxx } ##1##2##3##4
        { \exp_not:c { __msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } }
      \cs_new_protected:cpx { __msg_ #1 :nnx } ##1##2##3
        { \exp_not:c { __msg_ #1 :nnxxxx } {##1} {##2} {##3} { } { } { } }
    }
  \__msg_kernel_class_new:nN { fatal } \__msg_fatal_code:nnnnnn
  \cs_undefine:N \__msg_kernel_error:nnxx
  \cs_undefine:N \__msg_kernel_error:nnx
  \cs_undefine:N \__msg_kernel_error:nn
  \__msg_kernel_class_new:nN { error } \__msg_error_code:nnnnnn
  \__msg_kernel_class_new:nN { warning } \msg_warning:nnxxxx
  \__msg_kernel_class_new:nN { info } \msg_info:nnxxxx
\group_end:
\__msg_kernel_new:nnnn { kernel } { message-already-defined }
  { Message~'#2'~for~module~'#1'~already~defined. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~was~asked~to~define~a~new~message~called~'#2'\\
    by~the~module~'#1':~this~message~already~exists.
    \c__msg_return_text_tl
  }
\__msg_kernel_new:nnnn { kernel } { message-unknown }
  { Unknown~message~'#2'~for~module~'#1'. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~was~asked~to~display~a~message~called~'#2'\\
    by~the~module~'#1':~this~message~does~not~exist.
    \c__msg_return_text_tl
  }
\__msg_kernel_new:nnnn { kernel } { message-class-unknown }
  { Unknown~message~class~'#1'. }
  {
    LaTeX~has~been~asked~to~redirect~messages~to~a~class~'#1':\\
    this~was~never~defined.
    \c__msg_return_text_tl
  }
\__msg_kernel_new:nnnn { kernel } { message-redirect-loop }
  {
    Message~redirection~loop~caused~by~ {#1} ~=>~ {#2}
    \tl_if_empty:nF {#3} { ~for~module~' \use_none:n #3 ' } .
  }
  {
    Adding~the~message~redirection~ {#1} ~=>~ {#2}
    \tl_if_empty:nF {#3} { ~for~the~module~' \use_none:n #3 ' } ~
    created~an~infinite~loop\\\\
    \iow_indent:n { #4 \\\\ }
  }
\__msg_kernel_new:nnnn { kernel } { bad-number-of-arguments }
  { Function~'#1'~cannot~be~defined~with~#2~arguments. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~has~been~asked~to~define~a~function~'#1'~with~
    #2~arguments.~
    TeX~allows~between~0~and~9~arguments~for~a~single~function.
  }
\__msg_kernel_new:nnn { kernel } { char-active }
  { Cannot~generate~active~chars. }
\__msg_kernel_new:nnn { kernel } { char-invalid-catcode }
  { Invalid~catcode~for~char~generation. }
\__msg_kernel_new:nnn { kernel } { char-null-space }
  { Cannot~generate~null~char~as~a~space. }
\__msg_kernel_new:nnn { kernel } { char-out-of-range }
  { Charcode~requested~out~of~engine~range. }
\__msg_kernel_new:nnn { kernel } { char-space }
  { Cannot~generate~space~chars. }
\__msg_kernel_new:nnnn { kernel } { command-already-defined }
  { Control~sequence~#1~already~defined. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~has~been~asked~to~create~a~new~control~sequence~'#1'~
    but~this~name~has~already~been~used~elsewhere. \\ \\
    The~current~meaning~is:\\
    \ \ #2
  }
\__msg_kernel_new:nnnn { kernel } { command-not-defined }
  { Control~sequence~#1~undefined. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~has~been~asked~to~use~a~control~sequence~'#1':\\
    this~has~not~been~defined~yet.
  }
\__msg_kernel_new:nnn { kernel } { deprecated-command }
  {
    The~deprecated~command~'#2'~has~been~or~will~be~removed~on~#1.
    \tl_if_empty:nF {#3} { ~Use~instead~'#3'. }
  }
\__msg_kernel_new:nnnn { kernel } { empty-search-pattern }
  { Empty~search~pattern. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~has~been~asked~to~replace~an~empty~pattern~by~'#1':~that~
    would~lead~to~an~infinite~loop!
  }
\__msg_kernel_new:nnnn { kernel } { out-of-registers }
  { No~room~for~a~new~#1. }
  {
    TeX~only~supports~\int_use:N \c_max_register_int \ %
    of~each~type.~All~the~#1~registers~have~been~used.~
    This~run~will~be~aborted~now.
  }
\__msg_kernel_new:nnnn { kernel } { non-base-function }
  { Function~'#1'~is~not~a~base~function }
  {
    \c__msg_coding_error_text_tl
    Functions~defined~through~\iow_char:N\\cs_new:Nn~must~have~
    a~signature~consisting~of~only~normal~arguments~'N'~and~'n'.~
    To~define~variants~use~\iow_char:N\\cs_generate_variant:Nn~
    and~to~define~other~functions~use~\iow_char:N\\cs_new:Npn.
  }
\__msg_kernel_new:nnnn { kernel } { missing-colon }
  { Function~'#1'~contains~no~':'. }
  {
    \c__msg_coding_error_text_tl
    Code-level~functions~must~contain~':'~to~separate~the~
    argument~specification~from~the~function~name.~This~is~
    needed~when~defining~conditionals~or~variants,~or~when~building~a~
    parameter~text~from~the~number~of~arguments~of~the~function.
  }
\__msg_kernel_new:nnnn { kernel } { protected-predicate }
  { Predicate~'#1'~must~be~expandable. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~has~been~asked~to~define~'#1'~as~a~protected~predicate.~
    Only~expandable~tests~can~have~a~predicate~version.
  }
\__msg_kernel_new:nnnn { kernel } { conditional-form-unknown }
  { Conditional~form~'#1'~for~function~'#2'~unknown. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~has~been~asked~to~define~the~conditional~form~'#1'~of~
    the~function~'#2',~but~only~'TF',~'T',~'F',~and~'p'~forms~exist.
  }
\bool_if:NT \l@expl@check@declarations@bool
  {
    \__msg_kernel_new:nnnn { check } { non-declared-variable }
      { The~variable~#1~has~not~been~declared~\msg_line_context:. }
      {
        Checking~is~active,~and~you~have~tried~do~so~something~like: \\
        \ \ \tl_set:Nn ~ #1 ~ \{ ~ ... ~ \} \\
        without~first~having: \\
        \ \ \tl_new:N ~ #1  \\
        \\
        LaTeX~will~create~the~variable~and~continue.
      }
  }
\__msg_kernel_new:nnnn { kernel } { scanmark-already-defined }
  { Scan~mark~#1~already~defined. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~has~been~asked~to~create~a~new~scan~mark~'#1'~
    but~this~name~has~already~been~used~for~a~scan~mark.
  }
\__msg_kernel_new:nnnn { kernel } { variable-not-defined }
  { Variable~#1~undefined. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~has~been~asked~to~show~a~variable~#1,~but~this~has~not~
    been~defined~yet.
  }
\__msg_kernel_new:nnnn { kernel } { variant-too-long }
  { Variant~form~'#1'~longer~than~base~signature~of~'#2'. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~has~been~asked~to~create~a~variant~of~the~function~'#2'~
    with~a~signature~starting~with~'#1',~but~that~is~longer~than~
    the~signature~(part~after~the~colon)~of~'#2'.
  }
\__msg_kernel_new:nnnn { kernel } { invalid-variant }
  { Variant~form~'#1'~invalid~for~base~form~'#2'. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~has~been~asked~to~create~a~variant~of~the~function~'#2'~
    with~a~signature~starting~with~'#1',~but~cannot~change~an~argument~
    from~type~'#3'~to~type~'#4'.
  }
\__msg_kernel_new:nnn { kernel } { bad-variable }
  { Erroneous~variable~#1 used! }
\__msg_kernel_new:nnn { kernel } { misused-sequence }
  { A~sequence~was~misused. }
\__msg_kernel_new:nnn { kernel } { misused-prop }
  { A~property~list~was~misused. }
\__msg_kernel_new:nnn { kernel } { negative-replication }
  { Negative~argument~for~\prg_replicate:nn. }
\__msg_kernel_new:nnn { kernel } { unknown-comparison }
  { Relation~'#1'~unknown:~use~=,~<,~>,~==,~!=,~<=,~>=. }
\__msg_kernel_new:nnn { kernel } { zero-step }
  { Zero~step~size~for~step~function~#1. }
\__msg_kernel_new:nnn { kernel } { show-clist }
  {
    The~comma~list~ \tl_if_empty:nF {#1} { #1 ~ }
    \tl_if_empty:nTF {#2}
      { is~empty }
      { contains~the~items~(without~outer~braces): }
  }
\__msg_kernel_new:nnn { kernel } { show-prop }
  {
    The~property~list~#1~
    \tl_if_empty:nTF {#2}
      { is~empty }
      { contains~the~pairs~(without~outer~braces): }
  }
\__msg_kernel_new:nnn { kernel } { show-seq }
  {
    The~sequence~#1~
    \tl_if_empty:nTF {#2}
      { is~empty }
      { contains~the~items~(without~outer~braces): }
  }
\__msg_kernel_new:nnn { kernel } { show-streams }
  {
    \tl_if_empty:nTF {#2} { No~ } { The~following~ }
    \str_case:nn {#1}
      {
        { ior } { input ~ }
        { iow } { output ~ }
      }
    streams~are~
    \tl_if_empty:nTF {#2} { open } { in~use: }
  }
\group_begin:
\cs_set_protected:Npn \__msg_tmp:w #1#2
  {
    \cs_new:Npn \__msg_expandable_error:n ##1
      {
        \exp:w
        \exp_after:wN \exp_after:wN
        \exp_after:wN \__msg_expandable_error:w
        \exp_after:wN \exp_after:wN
        \exp_after:wN \exp_end:
        \use:n { #1 #2 ##1 } #2
      }
    \cs_new:Npn \__msg_expandable_error:w ##1 #2 ##2 #2 {##1}
  }
\exp_args:Ncx \__msg_tmp:w { LaTeX3~error: }
  { \char_generate:nn { `\  } { 7 } }
\group_end:
\cs_new:Npn \__msg_kernel_expandable_error:nnnnnn #1#2#3#4#5#6
  {
    \exp_args:Nf \__msg_expandable_error:n
      {
        \exp_args:NNc \exp_after:wN \exp_stop_f:
          { \c__msg_text_prefix_tl LaTeX / #1 / #2 }
          {#3} {#4} {#5} {#6}
      }
  }
\cs_new:Npn \__msg_kernel_expandable_error:nnnnn #1#2#3#4#5
  {
    \__msg_kernel_expandable_error:nnnnnn
      {#1} {#2} {#3} {#4} {#5} { }
  }
\cs_new:Npn \__msg_kernel_expandable_error:nnnn #1#2#3#4
  {
    \__msg_kernel_expandable_error:nnnnnn
      {#1} {#2} {#3} {#4} { } { }
  }
\cs_new:Npn \__msg_kernel_expandable_error:nnn #1#2#3
  {
    \__msg_kernel_expandable_error:nnnnnn
      {#1} {#2} {#3} { } { } { }
  }
\cs_new:Npn \__msg_kernel_expandable_error:nn #1#2
  {
    \__msg_kernel_expandable_error:nnnnnn
      {#1} {#2} { } { } { } { }
  }
\bool_new:N \g__msg_log_next_bool
\cs_new_protected:Npn \__msg_log_next:
  { \bool_gset_true:N \g__msg_log_next_bool }
\cs_new_protected:Npn \__msg_show_pre:nnnnnn #1#2#3#4#5#6
  {
    \exp_args:Nx \iow_wrap:nnnN
      {
        \exp_not:c { \c__msg_text_prefix_tl #1 / #2 }
          { \tl_to_str:n {#3} }
          { \tl_to_str:n {#4} }
          { \tl_to_str:n {#5} }
          { \tl_to_str:n {#6} }
      }
      { } { } \__msg_show_pre_aux:n
  }
\cs_new_protected:Npn \__msg_show_pre:nnxxxx #1#2#3#4#5#6
  {
    \use:x
      { \exp_not:n { \__msg_show_pre:nnnnnn {#1} {#2} } {#3} {#4} {#5} {#6} }
  }
\cs_generate_variant:Nn \__msg_show_pre:nnnnnn { nnnnnV }
\cs_new_protected:Npn \__msg_show_pre_aux:n
  { \bool_if:NTF \g__msg_log_next_bool { \iow_log:n } { \iow_term:n } }
\cs_new_protected:Npn \__msg_show_variable:NNNnn #1#2#3#4#5
  {
    #2 #1
      {
        \tl_if_empty:nF {#4}
          {
            \__msg_show_pre:nnxxxx { LaTeX / kernel } { show- #4 }
              { \token_to_str:N #1 } { #3 #1 { } { ? } } { } { }
          }
        \__msg_show_wrap:n {#5}
      }
      {
        \__msg_kernel_error:nnx { kernel } { variable-not-defined }
          { \token_to_str:N #1 }
        \bool_gset_false:N \g__msg_log_next_bool
      }
  }
\cs_new_protected:Npn \__msg_show_wrap:Nn #1#2
  {
    \exp_args:Nx \__msg_show_wrap:n
      {
        > ~ \exp_not:n { \tl_to_str:n {#2} } =
        \exp_not:N \tl_to_str:n { #1 {#2} }
      }
  }
\cs_new_protected:Npn \__msg_show_wrap:n #1
  { \iow_wrap:nnnN { #1 . } { } { } \__msg_show_wrap_aux:n }
\cs_new_protected:Npn \__msg_show_wrap_aux:n #1
  {
    \tl_if_single:nTF {#1}
      { \tl_clear:N \l__msg_internal_tl }
      { \tl_set:Nf \l__msg_internal_tl { \__msg_show_wrap_aux:w #1 \q_stop } }
    \bool_if:NTF \g__msg_log_next_bool
      {
        \iow_log:x { > ~ \l__msg_internal_tl . }
        \bool_gset_false:N \g__msg_log_next_bool
      }
      {
        \__iow_with:Nnn \tex_newlinechar:D { 10 }
          {
            \__iow_with:Nnn \tex_errorcontextlines:D { -1 }
              {
                \etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
                  { \exp_after:wN \l__msg_internal_tl }
              }
          }
      }
  }
\cs_new:Npn \__msg_show_wrap_aux:w #1 > #2 . \q_stop {#2}
\cs_new:Npn \__msg_show_item:n #1
  {
    \\ > \ \ \{ \tl_to_str:n {#1} \}
  }
\cs_new:Npn \__msg_show_item:nn #1#2
  {
    \\ > \ \ \{ \tl_to_str:n {#1} \}
    \ \ => \ \ \{ \tl_to_str:n {#2} \}
  }
\cs_new:Npn \__msg_show_item_unbraced:nn #1#2
  {
    \\ > \ \ \tl_to_str:n {#1}
    \ \ => \ \ \tl_to_str:n {#2}
  }
%% File: l3file.dtx Copyright (C) 1990-2017 The LaTeX3 Project
\tl_new:N \g_file_current_name_tl
\cs_if_exist:NT \@currname
  { \tl_gset_eq:NN \g_file_current_name_tl \@currname }
\seq_new:N \g__file_stack_seq
\seq_new:N \g__file_record_seq
\tl_new:N \l__file_internal_tl
\tl_new:N \l__file_internal_name_tl
\seq_new:N \l__file_search_path_seq
\seq_new:N \l__file_saved_search_path_seq
\seq_new:N \l__file_internal_seq
\cs_new_protected:Npn \__file_name_sanitize:nn #1#2
  {
    \group_begin:
      \seq_map_inline:Nn \l_char_active_seq
        {
          \tl_set:Nx \l__file_internal_tl { \iow_char:N ##1 }
          \char_set_active_eq:NN ##1 \l__file_internal_tl
        }
      \tl_set:Nx \l__file_internal_name_tl {#1}
      \tl_set:Nx \l__file_internal_name_tl
        { \tl_to_str:N \l__file_internal_name_tl }
      \int_compare:nNnTF
        {
          \int_mod:nn
            {
              0 \tl_map_function:NN \l__file_internal_name_tl
                \__file_name_sanitize_aux:n
            }
            { 2 }
        }
        = 0
        {
          \tl_remove_all:Nn \l__file_internal_name_tl { " }
          \tl_if_in:NnT \l__file_internal_name_tl { ~ }
            {
              \tl_set:Nx \l__file_internal_name_tl
                { " \exp_not:V \l__file_internal_name_tl " }
            }
        }
        {
          \__msg_kernel_error:nnx
            { kernel } { unbalanced-quote-in-filename }
            { \l__file_internal_name_tl }
        }
      \use:x
        {
          \group_end:
          \exp_not:n {#2} { \l__file_internal_name_tl }
        }
  }
\cs_new:Npn \__file_name_sanitize_aux:n #1
  { \token_if_eq_charcode:NNT #1 " { + 1 } }
\cs_new_protected:Npn \file_add_path:nN #1
  { \__file_name_sanitize:nn {#1} { \__file_add_path:nN } }
\cs_new_protected:Npn \__file_add_path:nN #1#2
  {
    \__ior_open:Nn \g__file_internal_ior {#1}
    \ior_if_eof:NTF \g__file_internal_ior
      { \__file_add_path_search:nN {#1} #2 }
      { \tl_set:Nn #2 {#1} }
    \ior_close:N \g__file_internal_ior
  }
\cs_new_protected:Npn \__file_add_path_search:nN #1#2
  {
    \tl_set:Nn #2 { \q_no_value  }
    \cs_if_exist:NT \input@path
      {
        \seq_set_eq:NN \l__file_saved_search_path_seq
          \l__file_search_path_seq
        \seq_set_split:NnV \l__file_internal_seq { , } \input@path
        \seq_concat:NNN \l__file_search_path_seq
          \l__file_search_path_seq \l__file_internal_seq
      }
    \seq_map_inline:Nn \l__file_search_path_seq
      {
        \__ior_open:Nn \g__file_internal_ior { ##1 #1 }
        \ior_if_eof:NF \g__file_internal_ior
          {
            \tl_set:Nx #2 { ##1 #1 }
            \seq_map_break:
          }
      }
    \cs_if_exist:NT \input@path
      {
        \seq_set_eq:NN \l__file_search_path_seq
          \l__file_saved_search_path_seq
      }
  }
\prg_new_protected_conditional:Npnn \file_if_exist:n #1 { T , F , TF }
  {
    \file_add_path:nN {#1} \l__file_internal_name_tl
    \quark_if_no_value:NTF \l__file_internal_name_tl
      { \prg_return_false: }
      { \prg_return_true: }
  }
\cs_new_protected:Npn \file_input:n #1
  {
    \__file_if_exist:nT {#1}
      { \__file_input:V \l__file_internal_name_tl }
  }
\cs_new_protected:Npn \__file_if_exist:nT #1#2
  {
    \file_if_exist:nTF {#1}
      {#2}
      {
        \__file_name_sanitize:nn {#1}
          { \__msg_kernel_error:nnx { kernel } { file-not-found } }
      }
  }
\cs_new_protected:Npn \__file_input:n #1
  {
    \tl_if_in:nnTF {#1} { . }
      { \__file_input_aux:n {#1} }
      { \__file_input_aux:o { \tl_to_str:n { #1 . tex } } }
  }
\cs_generate_variant:Nn \__file_input:n { V }
\cs_new_protected:Npn \__file_input_aux:n #1
  {
    \clist_if_exist:NTF \@filelist
      { \@addtofilelist {#1} }
      { \seq_gput_right:Nn \g__file_record_seq {#1} }
    \seq_gpush:No \g__file_stack_seq \g_file_current_name_tl
    \tl_gset:Nn \g_file_current_name_tl {#1}
    \tex_input:D #1 \c_space_tl
    \seq_gpop:NN \g__file_stack_seq \l__file_internal_tl
    \tl_gset_eq:NN \g_file_current_name_tl \l__file_internal_tl
  }
\cs_generate_variant:Nn \__file_input_aux:n { o }
\cs_new_protected:Npn \file_path_include:n #1
  { \__file_name_sanitize:nn {#1} { \__file_path_include:n } }
\cs_new_protected:Npn \__file_path_include:n #1
  {
    \seq_if_in:NnF \l__file_search_path_seq {#1}
      { \seq_put_right:Nn \l__file_search_path_seq {#1} }
  }
\cs_new_protected:Npn \file_path_remove:n #1
  {
    \__file_name_sanitize:nn {#1}
      { \seq_remove_all:Nn \l__file_search_path_seq }
  }
\cs_new_protected:Npn \file_list:
  {
    \seq_set_eq:NN \l__file_internal_seq \g__file_record_seq
    \clist_if_exist:NT \@filelist
      {
        \clist_map_inline:Nn \@filelist
          {
            \seq_put_right:No \l__file_internal_seq
              { \tl_to_str:n {##1} }
          }
      }
    \seq_remove_duplicates:N \l__file_internal_seq
    \iow_log:n { *~File~List~* }
    \seq_map_inline:Nn \l__file_internal_seq { \iow_log:n {##1} }
    \iow_log:n { ************* }
  }
\AtBeginDocument
  {
    \clist_map_inline:Nn \@filelist
      { \seq_gput_right:No \g__file_record_seq { \tl_to_str:n {#1} } }
  }
\int_const:Nn \c_term_ior { 16 }
\seq_new:N \g__ior_streams_seq
\tl_new:N \l__ior_stream_tl
\prop_new:N \g__ior_streams_prop
\int_step_inline:nnnn
  { 0 }
  { 1 }
  {
    \cs_if_exist:NTF \normalend
      { \tex_count:D 38 \scan_stop: }
      {
        \tex_count:D 16 \scan_stop:
          \cs_if_exist:NT \loccount { - 1 }
      }
  }
  {
    \prop_gput:Nnn \g__ior_streams_prop {#1} { Reserved~by~format }
  }
\cs_new_protected:Npn \ior_new:N #1 { \cs_new_eq:NN #1 \c_term_ior }
\cs_generate_variant:Nn \ior_new:N { c }
\cs_new_protected:Npn \ior_open:Nn #1#2
  { \__file_name_sanitize:nn {#2} { \__ior_open_aux:Nn #1 } }
\cs_generate_variant:Nn \ior_open:Nn { c }
\cs_new_protected:Npn \__ior_open_aux:Nn #1#2
  {
    \file_add_path:nN {#2} \l__file_internal_name_tl
    \quark_if_no_value:NTF \l__file_internal_name_tl
      { \__msg_kernel_error:nnx { kernel } { file-not-found } {#2} }
      { \__ior_open:No #1 \l__file_internal_name_tl }
  }
\prg_new_protected_conditional:Npnn \ior_open:Nn #1#2 { T , F , TF }
  { \__file_name_sanitize:nn {#2} { \__ior_open_aux:NnTF #1 } }
\cs_generate_variant:Nn \ior_open:NnT  { c }
\cs_generate_variant:Nn \ior_open:NnF  { c }
\cs_generate_variant:Nn \ior_open:NnTF { c }
\cs_new_protected:Npn \__ior_open_aux:NnTF #1#2
  {
    \file_add_path:nN {#2} \l__file_internal_name_tl
    \quark_if_no_value:NTF \l__file_internal_name_tl
      { \prg_return_false: }
      {
        \__ior_open:No #1 \l__file_internal_name_tl
        \prg_return_true:
      }
  }
\exp_args:NNf \cs_new_protected:Npn \__ior_new:N
  { \exp_args:NNc \exp_after:wN \exp_stop_f: { newread } }
\cs_new_protected:Npn \__ior_open:Nn #1#2
  {
    \ior_close:N #1
    \seq_gpop:NNTF \g__ior_streams_seq \l__ior_stream_tl
      { \__ior_open_stream:Nn #1 {#2} }
      {
        \__ior_new:N #1
        \tl_set:Nx \l__ior_stream_tl { \int_eval:n {#1} }
        \__ior_open_stream:Nn #1 {#2}
      }
  }
\cs_generate_variant:Nn \__ior_open:Nn { No }
\cs_new_protected:Npn \__ior_open_stream:Nn #1#2
  {
    \tex_global:D \tex_chardef:D #1 = \l__ior_stream_tl \scan_stop:
    \prop_gput:NVn \g__ior_streams_prop #1 {#2}
    \tex_openin:D #1 #2 \scan_stop:
  }
\cs_new_protected:Npn \ior_close:N #1
  {
    \int_compare:nT { -1 < #1 < \c_term_ior }
      {
        \tex_closein:D #1
        \prop_gremove:NV \g__ior_streams_prop #1
        \seq_if_in:NVF \g__ior_streams_seq #1
          { \seq_gpush:NV \g__ior_streams_seq #1 }
        \cs_gset_eq:NN #1 \c_term_ior
      }
  }
\cs_generate_variant:Nn \ior_close:N { c }
\cs_new_protected:Npn \ior_list_streams:
  { \__ior_list_streams:Nn \g__ior_streams_prop { ior } }
\cs_new_protected:Npn \__ior_list_streams:Nn #1#2
  {
    \__msg_show_pre:nnxxxx { LaTeX / kernel } { show-streams }
      {#2} { \prop_if_empty:NF #1 { ? } } { } { }
    \__msg_show_wrap:n
      { \prop_map_function:NN #1 \__msg_show_item_unbraced:nn }
  }
\cs_new_eq:NN \if_eof:w \tex_ifeof:D
\prg_new_conditional:Npnn \ior_if_eof:N #1 { p , T , F , TF }
  {
    \cs_if_exist:NTF #1
      {
        \int_compare:nTF { -1 < #1 < \c_term_ior }
          {
            \if_eof:w #1
              \prg_return_true:
            \else:
              \prg_return_false:
            \fi:
          }
          { \prg_return_true: }
      }
      { \prg_return_true: }
  }
\cs_new_protected:Npn \ior_get:NN #1#2
  { \tex_read:D #1 to #2 }
\cs_new_protected:Npn \ior_str_get:NN #1#2
  {
    \use:x
      {
        \int_set:Nn \tex_endlinechar:D { -1 }
        \exp_not:n { \etex_readline:D #1 to #2 }
        \int_set:Nn \tex_endlinechar:D { \int_use:N \tex_endlinechar:D }
      }
  }
\ior_new:N \g__file_internal_ior
\int_const:Nn \c_log_iow  { -1 }
\int_const:Nn \c_term_iow
  {
    \cs_if_exist:NTF \luatex_directlua:D
      {
        \int_compare:nNnTF \luatex_luatexversion:D > { 80 }
          { 128 }
          { 16 }
      }
      { 16 }
  }
\seq_new:N \g__iow_streams_seq
\tl_new:N \l__iow_stream_tl
\prop_new:N \g__iow_streams_prop
\int_step_inline:nnnn
  { 0 }
  { 1 }
  {
    \cs_if_exist:NTF \normalend
      { \tex_count:D 39 \scan_stop: }
      {
        \tex_count:D 17 \scan_stop:
          \cs_if_exist:NT \loccount { - 1 }
      }
  }
  {
    \prop_gput:Nnn \g__iow_streams_prop {#1} { Reserved~by~format }
  }
\cs_new_protected:Npn \iow_new:N #1 { \cs_new_eq:NN #1 \c_term_iow }
\cs_generate_variant:Nn \iow_new:N { c }
\exp_args:NNf \cs_new_protected:Npn \__iow_new:N
  { \exp_args:NNc \exp_after:wN \exp_stop_f: { newwrite } }
\cs_new_protected:Npn \iow_open:Nn #1#2
  { \__file_name_sanitize:nn {#2} { \__iow_open:Nn #1 } }
\cs_generate_variant:Nn \iow_open:Nn { c }
\cs_new_protected:Npn \__iow_open:Nn #1#2
  {
    \iow_close:N #1
    \seq_gpop:NNTF \g__iow_streams_seq \l__iow_stream_tl
      { \__iow_open_stream:Nn #1 {#2} }
      {
        \__iow_new:N #1
        \tl_set:Nx \l__iow_stream_tl { \int_eval:n {#1} }
        \__iow_open_stream:Nn #1 {#2}
      }
  }
\cs_generate_variant:Nn \__iow_open:Nn { No }
\cs_new_protected:Npn \__iow_open_stream:Nn #1#2
  {
    \tex_global:D \tex_chardef:D #1 = \l__iow_stream_tl \scan_stop:
    \prop_gput:NVn \g__iow_streams_prop #1 {#2}
    \tex_immediate:D \tex_openout:D #1 #2 \scan_stop:
  }
\cs_new_protected:Npn \iow_close:N #1
  {
    \int_compare:nT { - \c_log_iow < #1 < \c_term_iow }
      {
        \tex_immediate:D \tex_closeout:D #1
        \prop_gremove:NV \g__iow_streams_prop #1
        \seq_if_in:NVF \g__iow_streams_seq #1
          { \seq_gpush:NV \g__iow_streams_seq #1 }
        \cs_gset_eq:NN #1 \c_term_iow
      }
  }
\cs_generate_variant:Nn \iow_close:N { c }
\cs_new_protected:Npn \iow_list_streams:
  { \__iow_list_streams:Nn \g__iow_streams_prop { iow } }
\cs_new_eq:NN \__iow_list_streams:Nn \__ior_list_streams:Nn
\cs_new_protected:Npn \iow_shipout_x:Nn #1#2
  { \tex_write:D #1 {#2} }
\cs_generate_variant:Nn \iow_shipout_x:Nn { c, Nx, cx }
\cs_new_protected:Npn \iow_shipout:Nn #1#2
  { \tex_write:D #1 { \exp_not:n {#2} } }
\cs_generate_variant:Nn \iow_shipout:Nn { c, Nx, cx }
\cs_new_protected:Npn \__iow_with:Nnn #1#2
  {
    \int_compare:nNnTF {#1} = {#2}
      { \use:n }
      { \exp_args:No \__iow_with_aux:nNnn { \int_use:N #1 } #1 {#2} }
  }
\cs_new_protected:Npn \__iow_with_aux:nNnn #1#2#3#4
  {
    \int_set:Nn #2 {#3}
    #4
    \int_set:Nn #2 {#1}
  }
\cs_new_protected:Npn \iow_now:Nn #1#2
  {
    \__iow_with:Nnn \tex_newlinechar:D { `\^^J }
      { \tex_immediate:D \tex_write:D #1 { \exp_not:n {#2} } }
  }
\cs_generate_variant:Nn \iow_now:Nn { c, Nx, cx }
\cs_set_protected:Npn \iow_log:x  { \iow_now:Nx \c_log_iow  }
\cs_new_protected:Npn \iow_log:n  { \iow_now:Nn \c_log_iow  }
\cs_set_protected:Npn \iow_term:x { \iow_now:Nx \c_term_iow }
\cs_new_protected:Npn \iow_term:n { \iow_now:Nn \c_term_iow }
\cs_new:Npn \iow_newline: { ^^J }
\cs_new_eq:NN \iow_char:N \cs_to_str:N
\tl_const:Nx \c_catcode_other_space_tl { \char_generate:nn { `\  } { 12 } }
\int_new:N  \l_iow_line_count_int
\int_set:Nn \l_iow_line_count_int { 78 }
\tl_new:N \l__iow_newline_tl
\int_new:N \l__iow_line_target_int
\tl_new:N \l__iow_one_indent_tl
\int_new:N \l__iow_one_indent_int
\cs_new:Npn \__iow_unindent:w { }
\cs_new_protected:Npn \__iow_set_indent:n #1
  {
    \tl_set:Nx \l__iow_one_indent_tl
      { \exp_args:No \__str_to_other_fast:n { \tl_to_str:n {#1} } }
    \int_set:Nn \l__iow_one_indent_int { \str_count:N \l__iow_one_indent_tl }
    \exp_last_unbraced:NNo
      \cs_set:Npn \__iow_unindent:w \l__iow_one_indent_tl { }
  }
\exp_args:Nx \__iow_set_indent:n { \prg_replicate:nn { 4 } { ~ } }
\tl_new:N \l__iow_indent_tl
\int_new:N \l__iow_indent_int
\tl_new:N \l__iow_line_tl
\tl_new:N \l__iow_line_part_tl
\bool_new:N \l__iow_line_break_bool
\tl_new:N \l__iow_wrap_tl
\group_begin:
  \int_set:Nn \tex_escapechar:D { -1 }
  \tl_const:Nx \c__iow_wrap_marker_tl
    { \tl_to_str:n { \^^I \^^O \^^W \^^_ \^^W \^^R \^^A \^^P } }
\group_end:
\tl_map_inline:nn
  { { end } { newline } { indent } { unindent } }
  {
    \tl_const:cx { c__iow_wrap_ #1 _marker_tl }
      {
        \c__iow_wrap_marker_tl
        #1
        \c_catcode_other_space_tl
      }
  }
\cs_new_protected:Npn \iow_indent:n #1
  {
    \__msg_kernel_error:nnnnn { kernel } { iow-indent }
      { \iow_wrap:nnnN } { \iow_indent:n } {#1}
    #1
  }
\cs_new:Npx \__iow_indent:n #1
  {
    \c__iow_wrap_indent_marker_tl
    #1
    \c__iow_wrap_unindent_marker_tl
  }
\cs_new:Npn \__iow_indent_error:n #1
  {
    \__msg_kernel_expandable_error:nnnnn { kernel } { iow-indent }
      { \iow_wrap:nnnN } { \iow_indent:n } {#1}
    #1
  }
\cs_new_protected:Npn \iow_wrap:nnnN #1#2#3#4
  {
    \group_begin:
      \int_set:Nn \tex_escapechar:D { -1 }
      \cs_set:Npx \{ { \token_to_str:N \{ }
      \cs_set:Npx \# { \token_to_str:N \# }
      \cs_set:Npx \} { \token_to_str:N \} }
      \cs_set:Npx \% { \token_to_str:N \% }
      \cs_set:Npx \~ { \token_to_str:N \~ }
      \int_set:Nn \tex_escapechar:D { 92 }
      \cs_set_eq:NN \\ \c__iow_wrap_newline_marker_tl
      \cs_set_eq:NN \  \c_catcode_other_space_tl
      \cs_set_eq:NN \iow_indent:n \__iow_indent:n
      #3
      \__iow_wrap_set:Nx \l__iow_wrap_tl {#1}
      \cs_set_eq:NN \iow_indent:n \__iow_indent_error:n
      \tl_set:Nx \l__iow_newline_tl { \iow_newline: #2 }
      \tl_set:Nx \l__iow_newline_tl { \tl_to_str:N \l__iow_newline_tl }
      \int_set:Nn \l__iow_line_target_int
        { \l_iow_line_count_int - \str_count:N \l__iow_newline_tl + 1 }
      \__iow_wrap_do:
    \exp_args:NNf \group_end:
    #4 { \tl_to_str:N \l__iow_wrap_tl }
  }
\cs_new_eq:NN \__iow_wrap_set:Nx \protected@edef
\cs_new_protected:Npn \__iow_wrap_do:
  {
    \tl_set:Nx \l__iow_wrap_tl
      {
        \exp_args:No \__str_to_other_fast:n \l__iow_wrap_tl
        \c__iow_wrap_end_marker_tl
      }
    \exp_after:wN \__iow_wrap_start:w \l__iow_wrap_tl
  }
\cs_new_protected:Npn \__iow_wrap_start:w
  {
    \bool_set_false:N \l__iow_line_break_bool
    \tl_clear:N \l__iow_line_tl
    \tl_clear:N \l__iow_line_part_tl
    \tl_set:Nn \l__iow_wrap_tl { ~ \use_none:n }
    \int_zero:N \l__iow_indent_int
    \tl_clear:N \l__iow_indent_tl
    \__iow_wrap_chunk:nw { \l_iow_line_count_int }
  }
\cs_set_protected:Npn \__iow_tmp:w #1#2
  {
    \cs_new_protected:Npn \__iow_wrap_chunk:nw ##1##2 #2
      {
        \tl_if_empty:nTF {##2}
          {
            \tl_clear:N \l__iow_line_part_tl
            \__iow_wrap_next:nw {##1}
          }
          {
            \tl_if_empty:NTF \l__iow_line_tl
              {
                \__iow_wrap_line:nw
                  { \l__iow_indent_tl }
                  ##1 - \l__iow_indent_int ;
              }
              { \__iow_wrap_line:nw { } ##1 ; }
            ##2 #1
            \__iow_wrap_end_chunk:w 7 6 5 4 3 2 1 0 \q_stop
          }
      }
    \cs_new_protected:Npn \__iow_wrap_next:nw ##1##2 #1
      { \use:c { __iow_wrap_##2:n } {##1} }
  }
\exp_args:NVV \__iow_tmp:w \c_catcode_other_space_tl \c__iow_wrap_marker_tl
\cs_new_protected:Npn \__iow_wrap_line:nw #1
  {
    \tex_edef:D \l__iow_line_part_tl { \if_false: } \fi:
    #1
    \exp_after:wN \__iow_wrap_line_loop:w
    \__int_value:w \__int_eval:w
  }
\cs_new:Npn \__iow_wrap_line_loop:w #1 ; #2#3#4#5#6#7#8#9
  {
    \if_int_compare:w #1 < 8 \exp_stop_f:
      \__iow_wrap_line_aux:Nw #1
    \fi:
    #2 #3 #4 #5 #6 #7 #8 #9
    \exp_after:wN \__iow_wrap_line_loop:w
    \__int_value:w \__int_eval:w #1 - 8 ;
  }
\cs_new:Npn \__iow_wrap_line_aux:Nw #1#2#3 \exp_after:wN #4 ;
  {
    #2
    \exp_after:wN \__iow_wrap_line_end:NnnnnnnnN
    \exp_after:wN #1
    \exp:w \exp_end_continue_f:w
    \exp_after:wN \exp_after:wN
    \if_case:w #1 \exp_stop_f:
         \prg_do_nothing:
    \or: \use_none:n
    \or: \use_none:nn
    \or: \use_none:nnn
    \or: \use_none:nnnn
    \or: \use_none:nnnnn
    \or: \use_none:nnnnnn
    \or: \use_none:nnnnnnn
    \fi:
    { } { } { } { } { } { } { } #3
  }
\cs_new:Npn \__iow_wrap_line_end:NnnnnnnnN #1#2#3#4#5#6#7#8#9
  {
    #2 #3 #4 #5 #6 #7 #8
    \use_none:nnnnn \__int_eval:w 8 - ; #9
    \token_if_eq_charcode:NNTF \c_space_token #9
      { \__iow_wrap_line_end:nw { } }
      { \if_false: { \fi: } \__iow_wrap_break:w #9 }
  }
\cs_new:Npn \__iow_wrap_line_end:nw #1
  {
    \if_false: { \fi: }
    \__iow_wrap_store_do:n {#1}
    \__iow_wrap_next_line:w
  }
\cs_new:Npn \__iow_wrap_end_chunk:w
    #1 \__int_eval:w #2 - #3 ; #4#5 \q_stop
  {
    \if_false: { \fi: }
    \exp_args:Nf \__iow_wrap_next:nw { \int_eval:n { #2 - #4 } }
  }
\cs_set_protected:Npn \__iow_tmp:w #1
  {
    \cs_new:Npn \__iow_wrap_break:w
      {
        \tex_edef:D \l__iow_line_part_tl
          { \if_false: } \fi:
            \exp_after:wN \__iow_wrap_break_first:w
            \l__iow_line_part_tl
            #1
            { ? \__iow_wrap_break_end:w }
            \q_mark
      }
    \cs_new:Npn \__iow_wrap_break_first:w ##1 #1 ##2
      {
        \use_none:nn ##2 \__iow_wrap_break_none:w
        \__iow_wrap_break_loop:w ##1 #1 ##2
      }
    \cs_new:Npn \__iow_wrap_break_none:w ##1##2 #1 ##3 \q_mark ##4 #1
      {
        \tl_if_empty:NTF \l__iow_line_tl
          { ##2 ##4 \__iow_wrap_line_end:nw { } }
          { \__iow_wrap_line_end:nw { \__iow_wrap_trim:N } ##2 ##4 #1 }
      }
    \cs_new:Npn \__iow_wrap_break_loop:w ##1 #1 ##2 #1 ##3
      {
        \use_none:n ##3
        ##1 #1
        \__iow_wrap_break_loop:w ##2 #1 ##3
      }
    \cs_new:Npn \__iow_wrap_break_end:w ##1 #1 ##2 ##3 #1 ##4 \q_mark
      { ##1 \__iow_wrap_line_end:nw { } ##3 }
  }
\exp_args:NV \__iow_tmp:w \c_catcode_other_space_tl
\cs_new_protected:Npn \__iow_wrap_next_line:w #1#2 \q_stop
  {
    \tl_clear:N \l__iow_line_tl
    \token_if_eq_meaning:NNTF #1 \__iow_wrap_end_chunk:w
      {
        \tl_clear:N \l__iow_line_part_tl
        \bool_set_true:N \l__iow_line_break_bool
        \__iow_wrap_next:nw { \l__iow_line_target_int }
      }
      {
        \__iow_wrap_line:nw
          { \l__iow_indent_tl }
          \l__iow_line_target_int - \l__iow_indent_int ;
          #1 #2 \q_stop
      }
  }
\cs_new_protected:Npn \__iow_wrap_indent:n #1
  {
    \tl_put_right:Nx \l__iow_line_tl { \l__iow_line_part_tl }
    \bool_set_false:N \l__iow_line_break_bool
    \int_add:Nn \l__iow_indent_int { \l__iow_one_indent_int }
    \tl_put_right:No \l__iow_indent_tl { \l__iow_one_indent_tl }
    \__iow_wrap_chunk:nw {#1}
  }
\cs_new_protected:Npn \__iow_wrap_unindent:n #1
  {
    \tl_put_right:Nx \l__iow_line_tl { \l__iow_line_part_tl }
    \bool_set_false:N \l__iow_line_break_bool
    \int_sub:Nn \l__iow_indent_int { \l__iow_one_indent_int }
    \tl_set:Nx \l__iow_indent_tl
      { \exp_after:wN \__iow_unindent:w \l__iow_indent_tl }
    \__iow_wrap_chunk:nw {#1}
  }
\cs_new_protected:Npn \__iow_wrap_newline:n #1
  {
    \bool_if:NF \l__iow_line_break_bool
      { \__iow_wrap_store_do:n { \__iow_wrap_trim:N } }
    \bool_set_false:N \l__iow_line_break_bool
    \__iow_wrap_chunk:nw { \l__iow_line_target_int }
  }
\cs_new_protected:Npn \__iow_wrap_end:n #1
  {
    \bool_if:NF \l__iow_line_break_bool
      { \__iow_wrap_store_do:n { \__iow_wrap_trim:N } }
    \bool_set_false:N \l__iow_line_break_bool
  }
\cs_new_protected:Npn \__iow_wrap_store_do:n #1
  {
    \tl_set:Nx \l__iow_line_tl
      { \l__iow_line_tl \l__iow_line_part_tl }
    \tl_set:Nx \l__iow_wrap_tl
      {
        \l__iow_wrap_tl
        \l__iow_newline_tl
        #1 \l__iow_line_tl
      }
    \tl_clear:N \l__iow_line_tl
  }
\cs_set_protected:Npn \__iow_tmp:w #1
  {
    \cs_new:Npn \__iow_wrap_trim:N ##1
      { \tl_if_empty:NF ##1 { \exp_after:wN \__iow_wrap_trim:w ##1 \q_stop } }
    \cs_new:Npn \__iow_wrap_trim:w ##1 #1 \q_stop {##1}
  }
\exp_args:NV \__iow_tmp:w \c_catcode_other_space_tl
\__msg_kernel_new:nnnn { kernel } { file-not-found }
  { File~'#1'~not~found. }
  {
    The~requested~file~could~not~be~found~in~the~current~directory,~
    in~the~TeX~search~path~or~in~the~LaTeX~search~path.
  }
\__msg_kernel_new:nnnn { kernel } { input-streams-exhausted }
  { Input~streams~exhausted }
  {
    TeX~can~only~open~up~to~16~input~streams~at~one~time.\\
    All~16~are~currently~in~use,~and~something~wanted~to~open~
    another~one.
  }
\__msg_kernel_new:nnnn { kernel } { output-streams-exhausted }
  { Output~streams~exhausted }
  {
    TeX~can~only~open~up~to~16~output~streams~at~one~time.\\
    All~16~are~currently~in~use,~and~something~wanted~to~open~
    another~one.
  }
\__msg_kernel_new:nnnn { kernel } { unbalanced-quote-in-filename }
  { Unbalanced~quotes~in~file~name~'#1'. }
  {
    File~names~must~contain~balanced~numbers~of~quotes~(").
  }
\__msg_kernel_new:nnnn { kernel } { iow-indent }
  { Only~#1 (arg~1)~allows~#2 }
  {
    The~command~#2 can~only~be~used~in~messages~
    which~will~be~wrapped~using~#1.~
    It~was~called~with~argument~'#3'.
  }
\cs_new_protected:Npn \ior_get_str:NN
  {
    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
      { 2017-12-31 }
      { \token_to_str:N \ior_get_str:NN }
      { \token_to_str:N \ior_str_get:NN }
    \cs_gset_eq:NN \ior_get_str:NN \ior_str_get:NN
    \ior_str_get:NN
  }
%% File: l3skip.dtx Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX3 Project
%%                            (C) 2012-2017 The LaTeX3 Project
\cs_new_eq:NN \if_dim:w      \tex_ifdim:D
\cs_new_eq:NN \__dim_eval:w      \etex_dimexpr:D
\cs_new_eq:NN \__dim_eval_end:   \tex_relax:D
\cs_new_protected:Npn \dim_new:N #1
  {
    \__chk_if_free_cs:N #1
    \cs:w newdimen \cs_end: #1
  }
\cs_generate_variant:Nn \dim_new:N { c }
\cs_new_protected:Npn \dim_const:Nn #1
  {
    \dim_new:N #1
    \dim_gset:Nn #1
  }
\cs_generate_variant:Nn \dim_const:Nn { c }
\cs_new_protected:Npn \dim_zero:N #1 { #1 \c_zero_dim }
\cs_new_protected:Npn \dim_gzero:N { \tex_global:D \dim_zero:N }
\cs_generate_variant:Nn \dim_zero:N  { c }
\cs_generate_variant:Nn \dim_gzero:N { c }
\cs_new_protected:Npn \dim_zero_new:N  #1
  { \dim_if_exist:NTF #1 { \dim_zero:N #1 } { \dim_new:N #1 } }
\cs_new_protected:Npn \dim_gzero_new:N #1
  { \dim_if_exist:NTF #1 { \dim_gzero:N #1 } { \dim_new:N #1 } }
\cs_generate_variant:Nn \dim_zero_new:N  { c }
\cs_generate_variant:Nn \dim_gzero_new:N { c }
\prg_new_eq_conditional:NNn \dim_if_exist:N \cs_if_exist:N
  { TF , T , F , p }
\prg_new_eq_conditional:NNn \dim_if_exist:c \cs_if_exist:c
  { TF , T , F , p }
\cs_new_protected:Npn \dim_set:Nn #1#2
  { #1 ~ \__dim_eval:w #2 \__dim_eval_end: }
\cs_new_protected:Npn \dim_gset:Nn { \tex_global:D \dim_set:Nn }
\cs_generate_variant:Nn \dim_set:Nn  { c }
\cs_generate_variant:Nn \dim_gset:Nn { c }
\cs_new_protected:Npn \dim_set_eq:NN #1#2 { #1 = #2 }
\cs_generate_variant:Nn \dim_set_eq:NN {       c }
\cs_generate_variant:Nn \dim_set_eq:NN { Nc , cc }
\cs_new_protected:Npn \dim_gset_eq:NN #1#2 { \tex_global:D #1 = #2 }
\cs_generate_variant:Nn \dim_gset_eq:NN {       c }
\cs_generate_variant:Nn \dim_gset_eq:NN { Nc , cc }
\cs_new_protected:Npn \dim_add:Nn #1#2
  { \tex_advance:D #1 by \__dim_eval:w #2 \__dim_eval_end: }
\cs_new_protected:Npn \dim_gadd:Nn { \tex_global:D \dim_add:Nn }
\cs_generate_variant:Nn \dim_add:Nn  { c }
\cs_generate_variant:Nn \dim_gadd:Nn { c }
\cs_new_protected:Npn \dim_sub:Nn #1#2
  { \tex_advance:D #1 by - \__dim_eval:w #2 \__dim_eval_end: }
\cs_new_protected:Npn \dim_gsub:Nn { \tex_global:D \dim_sub:Nn }
\cs_generate_variant:Nn \dim_sub:Nn  { c }
\cs_generate_variant:Nn \dim_gsub:Nn { c }
\cs_new:Npn \dim_abs:n #1
  {
    \exp_after:wN \__dim_abs:N
    \dim_use:N \__dim_eval:w #1 \__dim_eval_end:
  }
\cs_new:Npn \__dim_abs:N #1
  { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: }
\cs_new:Npn \dim_max:nn #1#2
  {
    \dim_use:N \__dim_eval:w \exp_after:wN \__dim_maxmin:wwN
      \dim_use:N \__dim_eval:w #1 \exp_after:wN ;
      \dim_use:N \__dim_eval:w #2 ;
      >
    \__dim_eval_end:
  }
\cs_new:Npn \dim_min:nn #1#2
  {
    \dim_use:N \__dim_eval:w \exp_after:wN \__dim_maxmin:wwN
      \dim_use:N \__dim_eval:w #1 \exp_after:wN ;
      \dim_use:N \__dim_eval:w #2 ;
      <
    \__dim_eval_end:
  }
\cs_new:Npn \__dim_maxmin:wwN #1 ; #2 ; #3
  {
    \if_dim:w #1 #3 #2 ~
      #1
    \else:
      #2
    \fi:
  }
\cs_new:Npn \dim_ratio:nn #1#2
  { \__dim_ratio:n {#1} / \__dim_ratio:n {#2} }
\cs_new:Npn \__dim_ratio:n #1
  { \__int_value:w \__dim_eval:w #1 \__dim_eval_end: }
\prg_new_conditional:Npnn \dim_compare:nNn #1#2#3 { p , T , F , TF }
  {
    \if_dim:w \__dim_eval:w #1 #2 \__dim_eval:w #3 \__dim_eval_end:
      \prg_return_true: \else: \prg_return_false: \fi:
  }
\prg_new_conditional:Npnn \dim_compare:n #1 { p , T , F , TF }
  {
    \exp_after:wN \__dim_compare:w
    \dim_use:N \__dim_eval:w #1 \__prg_compare_error:
  }
\cs_new:Npn \__dim_compare:w #1 \__prg_compare_error:
  {
    \exp_after:wN \if_false: \exp:w \exp_end_continue_f:w
      \__dim_compare:wNN #1 ? { = \__dim_compare_end:w \else: } \q_stop
  }
\exp_args:Nno \use:nn
  { \cs_new:Npn \__dim_compare:wNN #1 }
  { \tl_to_str:n {pt} }
  #2#3
  {
      \if_meaning:w = #3
        \use:c { __dim_compare_#2:w }
      \fi:
        #1 pt \exp_stop_f:
      \prg_return_false:
      \exp_after:wN \use_none_delimit_by_q_stop:w
    \fi:
    \reverse_if:N \if_dim:w #1 pt #2
      \exp_after:wN \__dim_compare:wNN
      \dim_use:N \__dim_eval:w #3
  }
\cs_new:cpn { __dim_compare_ ! :w }
    #1 \reverse_if:N #2 ! #3 = { #1 #2 = #3 }
\cs_new:cpn { __dim_compare_ = :w }
    #1 \__dim_eval:w = { #1 \__dim_eval:w }
\cs_new:cpn { __dim_compare_ < :w }
    #1 \reverse_if:N #2 < #3 = { #1 #2 > #3 }
\cs_new:cpn { __dim_compare_ > :w }
    #1 \reverse_if:N #2 > #3 = { #1 #2 < #3 }
\cs_new:Npn \__dim_compare_end:w #1 \prg_return_false: #2 \q_stop
  { #1 \prg_return_false: \else: \prg_return_true: \fi: }
\cs_new:Npn \dim_case:nnTF #1
  {
    \exp:w
    \exp_args:Nf \__dim_case:nnTF { \dim_eval:n {#1} }
  }
\cs_new:Npn \dim_case:nnT #1#2#3
  {
    \exp:w
    \exp_args:Nf \__dim_case:nnTF { \dim_eval:n {#1} } {#2} {#3} { }
  }
\cs_new:Npn \dim_case:nnF #1#2
  {
    \exp:w
    \exp_args:Nf \__dim_case:nnTF { \dim_eval:n {#1} } {#2} { }
  }
\cs_new:Npn \dim_case:nn #1#2
  {
    \exp:w
    \exp_args:Nf \__dim_case:nnTF { \dim_eval:n {#1} } {#2} { } { }
  }
\cs_new:Npn \__dim_case:nnTF #1#2#3#4
  { \__dim_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
\cs_new:Npn \__dim_case:nw #1#2#3
  {
    \dim_compare:nNnTF {#1} = {#2}
      { \__dim_case_end:nw {#3} }
      { \__dim_case:nw {#1} }
  }
\cs_new_eq:NN \__dim_case_end:nw \__prg_case_end:nw
\cs_new:Npn \dim_while_do:nn #1#2
  {
    \dim_compare:nT {#1}
      {
        #2
        \dim_while_do:nn {#1} {#2}
      }
  }
\cs_new:Npn \dim_until_do:nn #1#2
  {
    \dim_compare:nF {#1}
      {
        #2
        \dim_until_do:nn {#1} {#2}
      }
  }
\cs_new:Npn \dim_do_while:nn #1#2
  {
    #2
    \dim_compare:nT {#1}
      { \dim_do_while:nn {#1} {#2} }
  }
\cs_new:Npn \dim_do_until:nn #1#2
  {
    #2
    \dim_compare:nF {#1}
      { \dim_do_until:nn {#1} {#2} }
  }
\cs_new:Npn \dim_while_do:nNnn #1#2#3#4
  {
    \dim_compare:nNnT {#1} #2 {#3}
      {
        #4
        \dim_while_do:nNnn {#1} #2 {#3} {#4}
      }
  }
\cs_new:Npn \dim_until_do:nNnn #1#2#3#4
  {
  \dim_compare:nNnF {#1} #2 {#3}
    {
      #4
      \dim_until_do:nNnn {#1} #2 {#3} {#4}
    }
  }
\cs_new:Npn \dim_do_while:nNnn #1#2#3#4
  {
    #4
    \dim_compare:nNnT {#1} #2 {#3}
      { \dim_do_while:nNnn {#1} #2 {#3} {#4} }
  }
\cs_new:Npn \dim_do_until:nNnn #1#2#3#4
  {
    #4
    \dim_compare:nNnF {#1} #2 {#3}
      { \dim_do_until:nNnn {#1} #2 {#3} {#4} }
  }
\cs_new:Npn \dim_eval:n #1
  { \dim_use:N \__dim_eval:w #1 \__dim_eval_end: }
\cs_new_eq:NN \dim_use:N \tex_the:D
\cs_new:Npn \dim_use:c #1 { \tex_the:D \cs:w #1 \cs_end: }
\cs_new:Npn \dim_to_decimal:n #1
  {
    \exp_after:wN
      \__dim_to_decimal:w \dim_use:N \__dim_eval:w (#1) \__dim_eval_end:
  }
\use:x
  {
    \cs_new:Npn \exp_not:N \__dim_to_decimal:w
      ##1 . ##2 \tl_to_str:n { pt }
  }
      {
        \int_compare:nNnTF {#2} > { 0 }
          { #1 . #2 }
          { #1 }
      }
\cs_new:Npn \dim_to_decimal_in_bp:n #1
  { \dim_to_decimal:n { ( #1 ) * 800 / 803 } }
\cs_new:Npn \dim_to_decimal_in_sp:n #1
  { \int_eval:n { \__dim_eval:w #1 \__dim_eval_end: } }
\cs_new:Npn \dim_to_decimal_in_unit:nn #1#2
  {
    \dim_to_decimal:n
      {
        1pt *
        \dim_ratio:nn {#1} {#2}
      }
  }
\cs_new_eq:NN  \dim_show:N \__kernel_register_show:N
\cs_generate_variant:Nn \dim_show:N { c }
\cs_new_protected:Npn \dim_show:n
  { \__msg_show_wrap:Nn \dim_eval:n }
\cs_new_eq:NN \dim_log:N \__kernel_register_log:N
\cs_new_eq:NN \dim_log:c \__kernel_register_log:c
\cs_new_protected:Npn \dim_log:n
  { \__msg_log_next: \dim_show:n }
\dim_const:Nn \c_zero_dim { 0 pt }
\dim_const:Nn \c_max_dim { 16383.99999 pt }
\dim_new:N \l_tmpa_dim
\dim_new:N \l_tmpb_dim
\dim_new:N \g_tmpa_dim
\dim_new:N \g_tmpb_dim
\cs_new_protected:Npn \skip_new:N #1
  {
    \__chk_if_free_cs:N #1
    \cs:w newskip \cs_end: #1
  }
\cs_generate_variant:Nn \skip_new:N { c }
\cs_new_protected:Npn \skip_const:Nn #1
  {
    \skip_new:N #1
    \skip_gset:Nn #1
  }
\cs_generate_variant:Nn \skip_const:Nn { c }
\cs_new_protected:Npn \skip_zero:N #1 { #1 \c_zero_skip }
\cs_new_protected:Npn \skip_gzero:N { \tex_global:D \skip_zero:N }
\cs_generate_variant:Nn \skip_zero:N  { c }
\cs_generate_variant:Nn \skip_gzero:N { c }
\cs_new_protected:Npn \skip_zero_new:N  #1
  { \skip_if_exist:NTF #1 { \skip_zero:N #1 } { \skip_new:N #1 } }
\cs_new_protected:Npn \skip_gzero_new:N #1
  { \skip_if_exist:NTF #1 { \skip_gzero:N #1 } { \skip_new:N #1 } }
\cs_generate_variant:Nn \skip_zero_new:N  { c }
\cs_generate_variant:Nn \skip_gzero_new:N { c }
\prg_new_eq_conditional:NNn \skip_if_exist:N \cs_if_exist:N
  { TF , T , F , p }
\prg_new_eq_conditional:NNn \skip_if_exist:c \cs_if_exist:c
  { TF , T , F , p }
\cs_new_protected:Npn \skip_set:Nn #1#2
  { #1 ~ \etex_glueexpr:D #2 \scan_stop: }
\cs_new_protected:Npn \skip_gset:Nn { \tex_global:D \skip_set:Nn }
\cs_generate_variant:Nn \skip_set:Nn  { c }
\cs_generate_variant:Nn \skip_gset:Nn { c }
\cs_new_protected:Npn \skip_set_eq:NN #1#2 { #1 = #2 }
\cs_generate_variant:Nn \skip_set_eq:NN {       c }
\cs_generate_variant:Nn \skip_set_eq:NN { Nc , cc }
\cs_new_protected:Npn \skip_gset_eq:NN #1#2 { \tex_global:D #1 = #2 }
\cs_generate_variant:Nn \skip_gset_eq:NN {       c }
\cs_generate_variant:Nn \skip_gset_eq:NN { Nc , cc }
\cs_new_protected:Npn \skip_add:Nn #1#2
  { \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: }
\cs_new_protected:Npn \skip_gadd:Nn { \tex_global:D \skip_add:Nn }
\cs_generate_variant:Nn \skip_add:Nn  { c }
\cs_generate_variant:Nn \skip_gadd:Nn { c }
\cs_new_protected:Npn \skip_sub:Nn #1#2
  { \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: }
\cs_new_protected:Npn \skip_gsub:Nn { \tex_global:D \skip_sub:Nn }
\cs_generate_variant:Nn \skip_sub:Nn  { c }
\cs_generate_variant:Nn \skip_gsub:Nn { c }
\prg_new_conditional:Npnn \skip_if_eq:nn #1#2 { p , T , F , TF }
  {
    \if_int_compare:w
      \__str_if_eq_x:nn { \skip_eval:n { #1 } } { \skip_eval:n { #2 } }
      = 0 \exp_stop_f:
        \prg_return_true:
    \else:
        \prg_return_false:
    \fi:
  }
\cs_set_protected:Npn \__cs_tmp:w #1
  {
    \prg_new_conditional:Npnn \skip_if_finite:n ##1 { p , T , F , TF }
      {
        \exp_after:wN \__skip_if_finite:wwNw
        \skip_use:N \etex_glueexpr:D ##1 ; \prg_return_false:
        #1 ; \prg_return_true: \q_stop
      }
    \cs_new:Npn \__skip_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \q_stop {##3}
  }
\exp_args:No \__cs_tmp:w { \tl_to_str:n { fil } }
\cs_new:Npn \skip_eval:n #1
  { \skip_use:N \etex_glueexpr:D #1 \scan_stop: }
\cs_new_eq:NN \skip_use:N \tex_the:D
\cs_new:Npn \skip_use:c #1 { \tex_the:D \cs:w #1 \cs_end: }
\cs_new_eq:NN  \skip_horizontal:N \tex_hskip:D
\cs_new:Npn \skip_horizontal:n #1
  { \skip_horizontal:N \etex_glueexpr:D #1 \scan_stop: }
\cs_new_eq:NN  \skip_vertical:N \tex_vskip:D
\cs_new:Npn \skip_vertical:n #1
  { \skip_vertical:N \etex_glueexpr:D #1 \scan_stop: }
\cs_generate_variant:Nn \skip_horizontal:N { c }
\cs_generate_variant:Nn \skip_vertical:N { c }
\cs_new_eq:NN  \skip_show:N \__kernel_register_show:N
\cs_generate_variant:Nn \skip_show:N { c }
\cs_new_protected:Npn \skip_show:n
  { \__msg_show_wrap:Nn \skip_eval:n }
\cs_new_eq:NN \skip_log:N \__kernel_register_log:N
\cs_new_eq:NN \skip_log:c \__kernel_register_log:c
\cs_new_protected:Npn \skip_log:n
  { \__msg_log_next: \skip_show:n }
\skip_const:Nn \c_zero_skip { \c_zero_dim }
\skip_const:Nn \c_max_skip { \c_max_dim }
\skip_new:N \l_tmpa_skip
\skip_new:N \l_tmpb_skip
\skip_new:N \g_tmpa_skip
\skip_new:N \g_tmpb_skip
\cs_new_protected:Npn \muskip_new:N #1
  {
    \__chk_if_free_cs:N #1
    \cs:w newmuskip \cs_end: #1
  }
\cs_generate_variant:Nn \muskip_new:N { c }
\cs_new_protected:Npn \muskip_const:Nn #1
  {
    \muskip_new:N #1
    \muskip_gset:Nn #1
  }
\cs_generate_variant:Nn \muskip_const:Nn { c }
\cs_new_protected:Npn \muskip_zero:N #1
  { #1 \c_zero_muskip }
\cs_new_protected:Npn \muskip_gzero:N { \tex_global:D \muskip_zero:N }
\cs_generate_variant:Nn \muskip_zero:N  { c }
\cs_generate_variant:Nn \muskip_gzero:N { c }
\cs_new_protected:Npn \muskip_zero_new:N  #1
  { \muskip_if_exist:NTF #1 { \muskip_zero:N #1 } { \muskip_new:N #1 } }
\cs_new_protected:Npn \muskip_gzero_new:N #1
  { \muskip_if_exist:NTF #1 { \muskip_gzero:N #1 } { \muskip_new:N #1 } }
\cs_generate_variant:Nn \muskip_zero_new:N  { c }
\cs_generate_variant:Nn \muskip_gzero_new:N { c }
\prg_new_eq_conditional:NNn \muskip_if_exist:N \cs_if_exist:N
  { TF , T , F , p }
\prg_new_eq_conditional:NNn \muskip_if_exist:c \cs_if_exist:c
  { TF , T , F , p }
\cs_new_protected:Npn \muskip_set:Nn #1#2
  { #1 ~ \etex_muexpr:D #2 \scan_stop: }
\cs_new_protected:Npn \muskip_gset:Nn { \tex_global:D \muskip_set:Nn }
\cs_generate_variant:Nn \muskip_set:Nn  { c }
\cs_generate_variant:Nn \muskip_gset:Nn { c }
\cs_new_protected:Npn \muskip_set_eq:NN #1#2 { #1 = #2 }
\cs_generate_variant:Nn \muskip_set_eq:NN {       c }
\cs_generate_variant:Nn \muskip_set_eq:NN { Nc , cc }
\cs_new_protected:Npn \muskip_gset_eq:NN #1#2 { \tex_global:D #1 = #2 }
\cs_generate_variant:Nn \muskip_gset_eq:NN {       c }
\cs_generate_variant:Nn \muskip_gset_eq:NN { Nc , cc }
\cs_new_protected:Npn \muskip_add:Nn #1#2
  { \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: }
\cs_new_protected:Npn \muskip_gadd:Nn { \tex_global:D \muskip_add:Nn }
\cs_generate_variant:Nn \muskip_add:Nn  { c }
\cs_generate_variant:Nn \muskip_gadd:Nn { c }
\cs_new_protected:Npn \muskip_sub:Nn #1#2
  { \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: }
\cs_new_protected:Npn \muskip_gsub:Nn { \tex_global:D \muskip_sub:Nn }
\cs_generate_variant:Nn \muskip_sub:Nn  { c }
\cs_generate_variant:Nn \muskip_gsub:Nn { c }
\cs_new:Npn \muskip_eval:n #1
  { \muskip_use:N \etex_muexpr:D #1 \scan_stop: }
\cs_new_eq:NN \muskip_use:N \tex_the:D
\cs_generate_variant:Nn \muskip_use:N { c }
\cs_new_eq:NN  \muskip_show:N \__kernel_register_show:N
\cs_generate_variant:Nn \muskip_show:N { c }
\cs_new_protected:Npn \muskip_show:n
  { \__msg_show_wrap:Nn \muskip_eval:n }
\cs_new_eq:NN \muskip_log:N \__kernel_register_log:N
\cs_new_eq:NN \muskip_log:c \__kernel_register_log:c
\cs_new_protected:Npn \muskip_log:n
  { \__msg_log_next: \muskip_show:n }
\muskip_const:Nn \c_zero_muskip { 0 mu }
\muskip_const:Nn \c_max_muskip  { 16383.99999 mu }
\muskip_new:N \l_tmpa_muskip
\muskip_new:N \l_tmpb_muskip
\muskip_new:N \g_tmpa_muskip
\muskip_new:N \g_tmpb_muskip
%% File: l3keys.dtx Copyright (C) 2006-2017 The LaTeX3 Project
\tl_new:N \l__keyval_key_tl
\tl_new:N \l__keyval_value_tl
\tl_new:N \l__keyval_sanitise_tl
\cs_new_protected:Npn \keyval_parse:NNn #1#2#3
  {
    \tl_set:Nn \l__keyval_sanitise_tl {#3}
    \__keyval_sanitise_equals:
    \__keyval_sanitise_comma:
    \exp_after:wN \__keyval_loop:NNw \exp_after:wN #1 \exp_after:wN #2
      \exp_after:wN \q_mark \l__keyval_sanitise_tl , \q_recursion_tail ,
  }
\group_begin:
  \char_set_catcode_active:n { `\= }
  \char_set_catcode_active:n { `\, }
  \cs_new_protected:Npn \__keyval_sanitise_equals:
    {
      \exp_after:wN \__keyval_sanitise_equals_auxi:w \l__keyval_sanitise_tl
        \q_mark = \q_nil =
      \exp_after:wN \__keyval_sanitise_aux:w \l__keyval_sanitise_tl
    }
    \cs_new_protected:Npn \__keyval_sanitise_equals_auxi:w #1 =
      {
        \tl_set:Nn \l__keyval_sanitise_tl {#1}
        \__keyval_sanitise_equals_auxii:w
      }
    \cs_new_protected:Npn \__keyval_sanitise_equals_auxii:w #1 =
      {
        \if_meaning:w \q_nil #1 \scan_stop:
        \else:
          \tl_set:Nx \l__keyval_sanitise_tl
            {
              \exp_not:o \l__keyval_sanitise_tl
              \token_to_str:N =
              \exp_not:n {#1}
            }
          \exp_after:wN \__keyval_sanitise_equals_auxii:w
        \fi:
      }
  \cs_new_protected:Npn \__keyval_sanitise_comma:
    {
      \exp_after:wN \__keyval_sanitise_comma_auxi:w \l__keyval_sanitise_tl
        \q_mark , \q_nil ,
      \exp_after:wN \__keyval_sanitise_aux:w \l__keyval_sanitise_tl
    }
    \cs_new_protected:Npn \__keyval_sanitise_comma_auxi:w #1 ,
      {
        \tl_set:Nn \l__keyval_sanitise_tl {#1}
        \__keyval_sanitise_comma_auxii:w
      }
    \cs_new_protected:Npn \__keyval_sanitise_comma_auxii:w #1 ,
      {
        \if_meaning:w \q_nil #1 \scan_stop:
        \else:
          \tl_set:Nx \l__keyval_sanitise_tl
            {
              \exp_not:o \l__keyval_sanitise_tl
              \token_to_str:N ,
              \exp_not:n {#1}
            }
          \exp_after:wN \__keyval_sanitise_comma_auxii:w
        \fi:
      }
\group_end:
\cs_new_protected:Npn \__keyval_sanitise_aux:w #1 \q_mark
  { \tl_set:Nn \l__keyval_sanitise_tl {#1} }
\cs_new_protected:Npn \__keyval_loop:NNw #1#2#3 ,
  {
    \exp_after:wN \if_meaning:w \exp_after:wN \q_recursion_tail
      \use_none:n #3 \prg_do_nothing:
    \else:
      \__keyval_split:NNw #1#2#3 == \q_stop
      \exp_after:wN \__keyval_loop:NNw \exp_after:wN #1 \exp_after:wN #2
        \exp_after:wN \q_mark
    \fi:
  }
\cs_new_protected:Npn \__keyval_split:NNw #1#2#3 =
  {
    \__keyval_def:Nn \l__keyval_key_tl {#3}
    \if_meaning:w \l__keyval_key_tl \c_empty_tl
      \exp_after:wN \__keyval_split_tidy:w
    \else:
      \exp_after:wN \__keyval_split_value:NNw \exp_after:wN #1 \exp_after:wN #2
        \exp_after:wN \q_mark
    \fi:
  }
\cs_new_protected:Npn \__keyval_split_value:NNw #1#2#3 = #4 \q_stop
  {
    \if:w \scan_stop: \tl_to_str:n {#4} \scan_stop:
      \cs_set:Npx \__keyval_action:
        { \exp_not:N #1 { \exp_not:o \l__keyval_key_tl } }
    \else:
      \if:w \scan_stop: \etex_detokenize:D \exp_after:wN { \use_none:n #4 }
        \scan_stop:
        \__keyval_def:Nn \l__keyval_value_tl {#3}
        \cs_set:Npx \__keyval_action:
          {
            \exp_not:N #2
              { \exp_not:o \l__keyval_key_tl }
              { \exp_not:o \l__keyval_value_tl }
          }
      \else:
        \cs_set:Npn \__keyval_action:
          { \__msg_kernel_error:nn { kernel } { misplaced-equals-sign } }
      \fi:
    \fi:
    \__keyval_action:
  }
\cs_new_protected:Npn \__keyval_split_tidy:w #1 \q_stop
  {
    \if:w \scan_stop: \etex_detokenize:D \exp_after:wN { \use_none:n #1 }
      \scan_stop:
    \else:
      \exp_after:wN \__keyval_empty_key:
    \fi:
  }
\cs_new:Npn \__keyval_action: { }
\cs_new_protected:Npn \__keyval_empty_key:
  { \__msg_kernel_error:nn { kernel } { misplaced-equals-sign } }
\cs_new_protected:Npn \__keyval_def:Nn #1#2
  { \tl_set:Nx #1 { \__tl_trim_spaces:nn {#2} \__keyval_def_aux:n } }
\cs_new:Npn \__keyval_def_aux:n #1
  { \exp_after:wN \__keyval_def_aux:w #1 \q_stop }
\cs_new:Npn \__keyval_def_aux:w #1 \q_stop { \exp_not:n {#1} }
\__msg_kernel_new:nnnn { kernel } { misplaced-equals-sign }
  { Misplaced~equals~sign~in~key-value~input~\msg_line_number: }
  {
    LaTeX~is~attempting~to~parse~some~key-value~input~but~found~
    two~equals~signs~not~separated~by~a~comma.
  }
\tl_const:Nn \c__keys_code_root_tl     { key~code~>~ }
\tl_const:Nn \c__keys_default_root_tl  { key~default~>~ }
\tl_const:Nn \c__keys_groups_root_tl   { key~groups~>~ }
\tl_const:Nn \c__keys_inherit_root_tl  { key~inherit~>~ }
\tl_const:Nn \c__keys_type_root_tl     { key~type~>~ }
\tl_const:Nn \c__keys_validate_root_tl { key~validate~>~ }
\tl_const:Nn \c__keys_props_root_tl { key~prop~>~ }
\int_new:N \l_keys_choice_int
\tl_new:N \l_keys_choice_tl
\clist_new:N \l__keys_groups_clist
\tl_new:N \l_keys_key_tl
\tl_new:N \l__keys_module_tl
\bool_new:N \l__keys_no_value_bool
\bool_new:N \l__keys_only_known_bool
\tl_new:N \l_keys_path_tl
\tl_new:N \l__keys_property_tl
\bool_new:N \l__keys_selective_bool
\bool_new:N \l__keys_filtered_bool
\seq_new:N \l__keys_selective_seq
\tl_new:N \l__keys_unused_clist
\tl_new:N \l_keys_value_tl
\bool_new:N \l__keys_tmp_bool
\cs_new_protected:Npn \keys_define:nn
  { \__keys_define:onn \l__keys_module_tl }
\cs_new_protected:Npn \__keys_define:nnn #1#2#3
  {
    \tl_set:Nx \l__keys_module_tl { \__keys_remove_spaces:n {#2} }
    \keyval_parse:NNn \__keys_define:n \__keys_define:nn {#3}
    \tl_set:Nn \l__keys_module_tl {#1}
  }
\cs_generate_variant:Nn \__keys_define:nnn { o }
\cs_new_protected:Npn \__keys_define:n #1
  {
    \bool_set_true:N \l__keys_no_value_bool
    \__keys_define_aux:nn {#1} { }
  }
\cs_new_protected:Npn \__keys_define:nn #1#2
  {
    \bool_set_false:N \l__keys_no_value_bool
    \__keys_define_aux:nn {#1} {#2}
  }
\cs_new_protected:Npn \__keys_define_aux:nn #1#2
  {
    \__keys_property_find:n {#1}
    \cs_if_exist:cTF { \c__keys_props_root_tl \l__keys_property_tl }
      { \__keys_define_code:n {#2} }
      {
         \tl_if_empty:NF \l__keys_property_tl
           {
             \__msg_kernel_error:nnxx { kernel } { property-unknown }
              { \l__keys_property_tl } { \l_keys_path_tl }
           }
      }
  }
\cs_new_protected:Npn \__keys_property_find:n #1
  {
    \tl_set:Nx \l__keys_property_tl { \__keys_remove_spaces:n {#1} }
    \exp_after:wN \__keys_property_find:w \l__keys_property_tl . . \q_stop {#1}
  }
\cs_new_protected:Npn \__keys_property_find:w #1 . #2 . #3 \q_stop #4
  {
    \tl_if_blank:nTF {#3}
      {
        \tl_clear:N \l__keys_property_tl
        \__msg_kernel_error:nnn { kernel } { key-no-property } {#4}
      }
      {
        \str_if_eq:nnTF {#3} { . }
          {
            \tl_set:Nx \l_keys_path_tl
              {
                \tl_if_empty:NF \l__keys_module_tl
                  { \l__keys_module_tl  / }
                #1
              }
            \tl_set:Nn \l__keys_property_tl { . #2 }
          }
          {
            \tl_set:Nx \l_keys_path_tl { \l__keys_module_tl / #1 . #2 }
            \__keys_property_search:w #3 \q_stop
          }
      }
  }
\cs_new_protected:Npn \__keys_property_search:w #1 . #2 \q_stop
  {
    \str_if_eq:nnTF {#2} { . }
      {
        \tl_set:Nx \l_keys_path_tl { \l_keys_path_tl }
        \tl_set:Nn \l__keys_property_tl { . #1 }
      }
      {
        \tl_set:Nx \l_keys_path_tl { \l_keys_path_tl . #1 }
        \__keys_property_search:w #2 \q_stop
      }
  }
\cs_new_protected:Npn \__keys_define_code:n #1
  {
    \bool_if:NTF \l__keys_no_value_bool
      {
        \exp_after:wN \__keys_define_code:w
          \l__keys_property_tl \q_stop
          { \use:c { \c__keys_props_root_tl \l__keys_property_tl } }
          {
            \__msg_kernel_error:nnxx { kernel }
              { property-requires-value } { \l__keys_property_tl }
              { \l_keys_path_tl }
            }
      }
      { \use:c { \c__keys_props_root_tl \l__keys_property_tl } {#1} }
  }
\use:x
  {
    \cs_new:Npn \exp_not:N \__keys_define_code:w
      ##1 \c_colon_str ##2 \exp_not:N \q_stop
  }
  { \tl_if_empty:nTF {#2} }
\cs_new_protected:Npn \__keys_bool_set:Nn #1#2
  {
    \bool_if_exist:NF #1 { \bool_new:N #1 }
    \__keys_choice_make:
    \__keys_cmd_set:nx { \l_keys_path_tl / true }
      { \exp_not:c { bool_ #2 set_true:N } \exp_not:N #1 }
    \__keys_cmd_set:nx { \l_keys_path_tl / false }
      { \exp_not:c { bool_ #2 set_false:N } \exp_not:N #1 }
    \__keys_cmd_set:nn { \l_keys_path_tl / unknown }
      {
        \__msg_kernel_error:nnx { kernel } { boolean-values-only }
          { \l_keys_key_tl }
      }
    \__keys_default_set:n { true }
  }
\cs_generate_variant:Nn \__keys_bool_set:Nn { c }
\cs_new_protected:Npn \__keys_bool_set_inverse:Nn #1#2
  {
    \bool_if_exist:NF #1 { \bool_new:N #1 }
    \__keys_choice_make:
    \__keys_cmd_set:nx { \l_keys_path_tl / true }
      { \exp_not:c { bool_ #2 set_false:N } \exp_not:N #1 }
    \__keys_cmd_set:nx { \l_keys_path_tl / false }
      { \exp_not:c { bool_ #2 set_true:N } \exp_not:N #1 }
    \__keys_cmd_set:nn { \l_keys_path_tl / unknown }
      {
        \__msg_kernel_error:nnx { kernel } { boolean-values-only }
          { \l_keys_key_tl }
      }
    \__keys_default_set:n { true }
  }
\cs_generate_variant:Nn \__keys_bool_set_inverse:Nn { c }
\cs_new_protected:Npn \__keys_choice_make:
  { \__keys_choice_make:N \__keys_choice_find:n }
\cs_new_protected:Npn \__keys_multichoice_make:
  { \__keys_choice_make:N \__keys_multichoice_find:n }
\cs_new_protected:Npn \__keys_choice_make:N #1
  {
    \cs_if_exist:cTF
      { \c__keys_type_root_tl \__keys_parent:o \l_keys_path_tl }
      {
        \str_if_eq_x:nnTF
          { \exp_not:v { \c__keys_type_root_tl \__keys_parent:o \l_keys_path_tl } }
          { choice }
          {
            \__msg_kernel_error:nnxx { kernel } { nested-choice-key }
              { \l_keys_path_tl } { \__keys_parent:o \l_keys_path_tl }
          }
          { \__keys_choice_make_aux:N #1 }
      }
      { \__keys_choice_make_aux:N #1 }
  }
\cs_new_protected:Npn \__keys_choice_make_aux:N #1
  {
    \cs_set_nopar:cpn { \c__keys_type_root_tl \l_keys_path_tl } { choice }
    \__keys_cmd_set:nn { \l_keys_path_tl } { #1 {##1} }
    \__keys_cmd_set:nn { \l_keys_path_tl / unknown }
      {
        \__msg_kernel_error:nnxx { kernel } { key-choice-unknown }
          { \l_keys_path_tl } {##1}
      }
  }
\cs_new_protected:Npn \__keys_choices_make:nn
  { \__keys_choices_make:Nnn \__keys_choice_make: }
\cs_new_protected:Npn \__keys_multichoices_make:nn
  { \__keys_choices_make:Nnn \__keys_multichoice_make: }
\cs_new_protected:Npn \__keys_choices_make:Nnn #1#2#3
  {
    #1
    \int_zero:N \l_keys_choice_int
    \clist_map_inline:nn {#2}
      {
        \int_incr:N \l_keys_choice_int
        \__keys_cmd_set:nx { \l_keys_path_tl / \__keys_remove_spaces:n {##1} }
          {
            \tl_set:Nn \exp_not:N \l_keys_choice_tl {##1}
            \int_set:Nn \exp_not:N \l_keys_choice_int
              { \int_use:N \l_keys_choice_int }
            \exp_not:n {#3}
          }
      }
  }
\cs_new_protected:Npn \__keys_cmd_set:nn #1#2
  {
    \cs_if_exist:cF { \c__keys_code_root_tl #1 }
      { \__chk_log:x { Defining~key~#1~\msg_line_context: } }
    \cs_set_protected:cpn { \c__keys_code_root_tl #1 } ##1 {#2}
  }
\cs_generate_variant:Nn \__keys_cmd_set:nn { nx , Vn , Vo }
\cs_new_protected:Npn \__keys_default_set:n #1
  {
    \tl_if_empty:nTF {#1}
      {
        \cs_set_eq:cN
          { \c__keys_default_root_tl \l_keys_path_tl }
          \tex_undefined:D
      }
      {
        \cs_set:cpx
          { \c__keys_default_root_tl \l_keys_path_tl }
          { \exp_not:n {#1} }
      }
  }
\cs_new_protected:Npn \__keys_groups_set:n #1
  {
    \clist_set:Nn \l__keys_groups_clist {#1}
    \clist_if_empty:NTF \l__keys_groups_clist
      {
        \cs_set_eq:cN { \c__keys_groups_root_tl \l_keys_path_tl }
          \tex_undefined:D
      }
      {
        \clist_set_eq:cN { \c__keys_groups_root_tl \l_keys_path_tl }
          \l__keys_groups_clist
      }
  }
\cs_new_protected:Npn \__keys_inherit:n #1
  {
    \__keys_undefine:
    \cs_set_nopar:cpn { \c__keys_inherit_root_tl \l_keys_path_tl } {#1}
  }
\cs_new_protected:Npn \__keys_initialise:n #1
  {
    \cs_if_exist_use:cT { \c__keys_code_root_tl \l_keys_path_tl } { {#1} }
  }
\cs_new_protected:Npn \__keys_meta_make:n #1
  {
    \__keys_cmd_set:Vo \l_keys_path_tl
      {
        \exp_after:wN \keys_set:nn
        \exp_after:wN { \l__keys_module_tl } {#1}
      }
  }
\cs_new_protected:Npn \__keys_meta_make:nn #1#2
  { \__keys_cmd_set:Vn \l_keys_path_tl { \keys_set:nn {#1} {#2} } }
\cs_new_protected:Npn \__keys_undefine:
  {
    \clist_map_inline:nn
      { code , default , groups , inherit , type , validate }
      {
        \cs_set_eq:cN
          { \tl_use:c { c__keys_ ##1 _root_tl } \l_keys_path_tl }
          \tex_undefined:D
      }
  }
\cs_new_protected:Npn \__keys_value_requirement:nn #1#2
  {
    \str_case:nnF {#2}
      {
        { true }
          {
            \cs_set_eq:cc
              { \c__keys_validate_root_tl \l_keys_path_tl }
              { __keys_validate_ #1 : }
          }
        { false }
          {
            \cs_if_eq:ccT
              { \c__keys_validate_root_tl \l_keys_path_tl }
              { __keys_validate_ #1 : }
              {
                \cs_set_eq:cN
                  { \c__keys_validate_root_tl \l_keys_path_tl }
                  \tex_undefined:D
              }
          }
      }
      {
        \__msg_kernel_error:nnx { kernel } { property-boolean-values-only }
          { .value_ #1 :n }
      }
  }
\cs_new_protected:Npn \__keys_validate_forbidden:
  {
    \bool_if:NF \l__keys_no_value_bool
      {
        \__msg_kernel_error:nnxx { kernel } { value-forbidden }
          { \l_keys_path_tl } { \l_keys_value_tl }
        \__keys_validate_cleanup:w
      }
  }
\cs_new_protected:Npn \__keys_validate_required:
  {
    \bool_if:NT \l__keys_no_value_bool
      {
        \__msg_kernel_error:nnx { kernel } { value-required }
          { \l_keys_path_tl }
        \__keys_validate_cleanup:w
      }
  }
\cs_new_protected:Npn \__keys_validate_cleanup:w #1 \cs_end: #2#3 { }
\cs_new_protected:Npn \__keys_variable_set:NnnN #1#2#3#4
  {
    \use:c { #2_if_exist:NF } #1 { \use:c { #2 _new:N } #1 }
    \__keys_cmd_set:nx { \l_keys_path_tl }
      {
        \exp_not:c { #2 _ #3 set:N #4 }
        \exp_not:N #1
        \exp_not:n  { {##1} }
      }
  }
\cs_generate_variant:Nn \__keys_variable_set:NnnN { c }
\cs_new_protected:cpn { \c__keys_props_root_tl .bool_set:N } #1
  { \__keys_bool_set:Nn #1 { } }
\cs_new_protected:cpn { \c__keys_props_root_tl .bool_set:c } #1
  { \__keys_bool_set:cn {#1} { } }
\cs_new_protected:cpn { \c__keys_props_root_tl .bool_gset:N } #1
  { \__keys_bool_set:Nn #1 { g } }
\cs_new_protected:cpn { \c__keys_props_root_tl .bool_gset:c } #1
  { \__keys_bool_set:cn {#1} { g } }
\cs_new_protected:cpn { \c__keys_props_root_tl .bool_set_inverse:N } #1
  { \__keys_bool_set_inverse:Nn #1 { } }
\cs_new_protected:cpn { \c__keys_props_root_tl .bool_set_inverse:c } #1
  { \__keys_bool_set_inverse:cn {#1} { } }
\cs_new_protected:cpn { \c__keys_props_root_tl .bool_gset_inverse:N } #1
  { \__keys_bool_set_inverse:Nn #1 { g } }
\cs_new_protected:cpn { \c__keys_props_root_tl .bool_gset_inverse:c } #1
  { \__keys_bool_set_inverse:cn {#1} { g } }
\cs_new_protected:cpn { \c__keys_props_root_tl .choice: }
  { \__keys_choice_make: }
\cs_new_protected:cpn { \c__keys_props_root_tl .choices:nn } #1
  { \__keys_choices_make:nn #1 }
\cs_new_protected:cpn { \c__keys_props_root_tl .choices:Vn } #1
  { \exp_args:NV \__keys_choices_make:nn #1 }
\cs_new_protected:cpn { \c__keys_props_root_tl .choices:on } #1
  { \exp_args:No \__keys_choices_make:nn #1 }
\cs_new_protected:cpn { \c__keys_props_root_tl .choices:xn } #1
  { \exp_args:Nx \__keys_choices_make:nn #1 }
\cs_new_protected:cpn { \c__keys_props_root_tl .code:n } #1
  { \__keys_cmd_set:nn { \l_keys_path_tl } {#1} }
\cs_new_protected:cpn { \c__keys_props_root_tl .clist_set:N } #1
  { \__keys_variable_set:NnnN #1 { clist } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .clist_set:c } #1
  { \__keys_variable_set:cnnN {#1} { clist } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .clist_gset:N } #1
  { \__keys_variable_set:NnnN #1 { clist } { g } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .clist_gset:c } #1
  { \__keys_variable_set:cnnN {#1} { clist } { g } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .default:n } #1
  { \__keys_default_set:n {#1} }
\cs_new_protected:cpn { \c__keys_props_root_tl .default:V } #1
  { \exp_args:NV \__keys_default_set:n #1 }
\cs_new_protected:cpn { \c__keys_props_root_tl .default:o } #1
  { \exp_args:No \__keys_default_set:n {#1} }
\cs_new_protected:cpn { \c__keys_props_root_tl .default:x } #1
  { \exp_args:Nx \__keys_default_set:n {#1} }
\cs_new_protected:cpn { \c__keys_props_root_tl .dim_set:N } #1
  { \__keys_variable_set:NnnN #1 { dim } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .dim_set:c } #1
  { \__keys_variable_set:cnnN {#1} { dim } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .dim_gset:N } #1
  { \__keys_variable_set:NnnN #1 { dim } { g } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .dim_gset:c } #1
  { \__keys_variable_set:cnnN {#1} { dim } { g } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .fp_set:N } #1
  { \__keys_variable_set:NnnN #1 { fp } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .fp_set:c } #1
  { \__keys_variable_set:cnnN {#1} { fp } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .fp_gset:N } #1
  { \__keys_variable_set:NnnN #1 { fp } { g } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .fp_gset:c } #1
  { \__keys_variable_set:cnnN {#1} { fp } { g } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .groups:n } #1
  { \__keys_groups_set:n {#1} }
\cs_new_protected:cpn { \c__keys_props_root_tl .inherit:n } #1
  { \__keys_inherit:n {#1} }
\cs_new_protected:cpn { \c__keys_props_root_tl .initial:n } #1
  { \__keys_initialise:n {#1} }
\cs_new_protected:cpn { \c__keys_props_root_tl .initial:V } #1
  { \exp_args:NV \__keys_initialise:n #1 }
\cs_new_protected:cpn { \c__keys_props_root_tl .initial:o } #1
  { \exp_args:No \__keys_initialise:n {#1} }
\cs_new_protected:cpn { \c__keys_props_root_tl .initial:x } #1
  { \exp_args:Nx \__keys_initialise:n {#1} }
\cs_new_protected:cpn { \c__keys_props_root_tl .int_set:N } #1
  { \__keys_variable_set:NnnN #1 { int } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .int_set:c } #1
  { \__keys_variable_set:cnnN {#1} { int } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .int_gset:N } #1
  { \__keys_variable_set:NnnN #1 { int } { g } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .int_gset:c } #1
  { \__keys_variable_set:cnnN {#1} { int } { g } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .meta:n } #1
  { \__keys_meta_make:n {#1} }
\cs_new_protected:cpn { \c__keys_props_root_tl .meta:nn } #1
  { \__keys_meta_make:nn #1 }
\cs_new_protected:cpn { \c__keys_props_root_tl .multichoice: }
  { \__keys_multichoice_make: }
\cs_new_protected:cpn { \c__keys_props_root_tl .multichoices:nn } #1
  { \__keys_multichoices_make:nn #1 }
\cs_new_protected:cpn { \c__keys_props_root_tl .multichoices:Vn } #1
  { \exp_args:NV \__keys_multichoices_make:nn #1 }
\cs_new_protected:cpn { \c__keys_props_root_tl .multichoices:on } #1
  { \exp_args:No \__keys_multichoices_make:nn #1 }
\cs_new_protected:cpn { \c__keys_props_root_tl .multichoices:xn } #1
  { \exp_args:Nx \__keys_multichoices_make:nn #1 }
\cs_new_protected:cpn { \c__keys_props_root_tl .skip_set:N } #1
  { \__keys_variable_set:NnnN #1 { skip } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .skip_set:c } #1
  { \__keys_variable_set:cnnN {#1} { skip } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .skip_gset:N } #1
  { \__keys_variable_set:NnnN #1 { skip } { g } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .skip_gset:c } #1
  { \__keys_variable_set:cnnN {#1} { skip } { g } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .tl_set:N } #1
  { \__keys_variable_set:NnnN #1 { tl } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .tl_set:c } #1
  { \__keys_variable_set:cnnN {#1} { tl } { } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .tl_set_x:N } #1
  { \__keys_variable_set:NnnN #1 { tl } { } x }
\cs_new_protected:cpn { \c__keys_props_root_tl .tl_set_x:c } #1
  { \__keys_variable_set:cnnN {#1} { tl } { } x }
\cs_new_protected:cpn { \c__keys_props_root_tl .tl_gset:N } #1
  { \__keys_variable_set:NnnN #1 { tl } { g } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .tl_gset:c } #1
  { \__keys_variable_set:cnnN {#1} { tl } { g } n }
\cs_new_protected:cpn { \c__keys_props_root_tl .tl_gset_x:N } #1
  { \__keys_variable_set:NnnN #1 { tl } { g } x }
\cs_new_protected:cpn { \c__keys_props_root_tl .tl_gset_x:c } #1
  { \__keys_variable_set:cnnN {#1} { tl } { g } x }
\cs_new_protected:cpn { \c__keys_props_root_tl .undefine: }
  { \__keys_undefine: }
\cs_new_protected:cpn { \c__keys_props_root_tl .value_forbidden:n } #1
  { \__keys_value_requirement:nn { forbidden } {#1} }
\cs_new_protected:cpn { \c__keys_props_root_tl .value_required:n } #1
  { \__keys_value_requirement:nn { required } {#1} }
\cs_new_protected:Npn \keys_set:nn
  { \__keys_set:onn { \l__keys_module_tl } }
\cs_new_protected:Npn \__keys_set:nnn #1#2#3
  {
    \tl_set:Nx \l__keys_module_tl { \__keys_remove_spaces:n {#2} }
    \keyval_parse:NNn \__keys_set:n \__keys_set:nn {#3}
    \tl_set:Nn \l__keys_module_tl {#1}
  }
\cs_generate_variant:Nn \keys_set:nn { nV , nv , no }
\cs_generate_variant:Nn \__keys_set:nnn { o }
\cs_new_protected:Npn \keys_set_known:nnN
  { \__keys_set_known:onnN \l__keys_unused_clist }
\cs_generate_variant:Nn \keys_set_known:nnN { nV , nv , no }
\cs_new_protected:Npn \__keys_set_known:nnnN #1#2#3#4
  {
    \clist_clear:N \l__keys_unused_clist
    \keys_set_known:nn {#2} {#3}
    \tl_set:Nx #4 { \exp_not:o { \l__keys_unused_clist } }
    \tl_set:Nn \l__keys_unused_clist {#1}
  }
\cs_generate_variant:Nn \__keys_set_known:nnnN { o }
\cs_new_protected:Npn \keys_set_known:nn #1#2
  {
    \bool_set_true:N \l__keys_only_known_bool
    \keys_set:nn {#1} {#2}
    \bool_set_false:N \l__keys_only_known_bool
  }
\cs_generate_variant:Nn \keys_set_known:nn { nV , nv , no }
\cs_new_protected:Npn \keys_set_filter:nnnN
  {  \__keys_set_filter:onnnN \l__keys_unused_clist }
\cs_generate_variant:Nn \keys_set_filter:nnnN { nnV , nnv , nno }
\cs_new_protected:Npn \__keys_set_filter:nnnnN #1#2#3#4#5
  {
    \clist_clear:N \l__keys_unused_clist
    \keys_set_filter:nnn {#2} {#3} {#4}
    \tl_set:Nx #5 { \exp_not:o { \l__keys_unused_clist } }
    \tl_set:Nn \l__keys_unused_clist {#1}
  }
\cs_generate_variant:Nn \__keys_set_filter:nnnnN { o }
\cs_new_protected:Npn \keys_set_filter:nnn #1#2#3
  {
    \bool_set_true:N \l__keys_selective_bool
    \bool_set_true:N \l__keys_filtered_bool
    \seq_set_from_clist:Nn \l__keys_selective_seq {#2}
    \keys_set:nn {#1} {#3}
    \bool_set_false:N \l__keys_selective_bool
  }
\cs_generate_variant:Nn \keys_set_filter:nnn { nnV , nnv , nno }
\cs_new_protected:Npn \keys_set_groups:nnn #1#2#3
  {
    \bool_set_true:N \l__keys_selective_bool
    \bool_set_false:N \l__keys_filtered_bool
    \seq_set_from_clist:Nn \l__keys_selective_seq {#2}
    \keys_set:nn {#1} {#3}
    \bool_set_false:N \l__keys_selective_bool
  }
\cs_generate_variant:Nn \keys_set_groups:nnn { nnV , nnv , nno }
\cs_new_protected:Npn \__keys_set:n #1
  {
    \bool_set_true:N \l__keys_no_value_bool
    \__keys_set_aux:onn \l__keys_module_tl {#1} { }
  }
\cs_new_protected:Npn \__keys_set:nn #1#2
  {
    \bool_set_false:N \l__keys_no_value_bool
    \__keys_set_aux:onn \l__keys_module_tl {#1} {#2}
  }
\cs_new_protected:Npn \__keys_set_aux:nnn #1#2#3
  {
    \tl_set:Nx \l_keys_path_tl
      {
        \tl_if_blank:nF {#1}
          { #1 / }
        \__keys_remove_spaces:n {#2}
      }
    \tl_clear:N \l__keys_module_tl
    \exp_after:wN \__keys_find_key_module:w \l_keys_path_tl / \q_stop
    \__keys_value_or_default:n {#3}
    \bool_if:NTF \l__keys_selective_bool
      { \__keys_set_selective: }
      { \__keys_execute: }
    \tl_set:Nn \l__keys_module_tl {#1}
  }
\cs_generate_variant:Nn \__keys_set_aux:nnn { o }
\cs_new_protected:Npn \__keys_find_key_module:w #1 / #2 \q_stop
  {
    \tl_if_blank:nTF {#2}
      { \tl_set:Nn \l_keys_key_tl {#1} }
      {
        \tl_put_right:Nx \l__keys_module_tl
          {
            \tl_if_empty:NF \l__keys_module_tl { / }
            #1
          }
        \__keys_find_key_module:w #2 \q_stop
      }
  }
\cs_new_protected:Npn \__keys_set_selective:
  {
    \cs_if_exist:cTF { \c__keys_groups_root_tl \l_keys_path_tl }
      {
        \clist_set_eq:Nc \l__keys_groups_clist
          { \c__keys_groups_root_tl \l_keys_path_tl }
        \__keys_check_groups:
      }
      {
        \bool_if:NTF \l__keys_filtered_bool
          { \__keys_execute: }
          { \__keys_store_unused: }
      }
  }
\cs_new_protected:Npn \__keys_check_groups:
  {
    \bool_set_false:N \l__keys_tmp_bool
    \seq_map_inline:Nn \l__keys_selective_seq
      {
        \clist_map_inline:Nn \l__keys_groups_clist
          {
            \str_if_eq:nnT {##1} {####1}
              {
                \bool_set_true:N \l__keys_tmp_bool
                \clist_map_break:n { \seq_map_break: }
              }
          }
      }
    \bool_if:NTF \l__keys_tmp_bool
      {
        \bool_if:NTF \l__keys_filtered_bool
          { \__keys_store_unused: }
          { \__keys_execute: }
      }
      {
        \bool_if:NTF \l__keys_filtered_bool
          { \__keys_execute: }
          { \__keys_store_unused: }
      }
  }
\cs_new_protected:Npn \__keys_value_or_default:n #1
  {
    \bool_if:NTF \l__keys_no_value_bool
      {
        \cs_if_exist:cTF { \c__keys_default_root_tl \l_keys_path_tl }
          {
            \tl_set_eq:Nc
              \l_keys_value_tl
              { \c__keys_default_root_tl \l_keys_path_tl }
          }
          { \tl_clear:N \l_keys_value_tl }
      }
      { \tl_set:Nn \l_keys_value_tl {#1} }
  }
\cs_new_protected:Npn \__keys_execute:
  {
    \cs_if_exist:cTF { \c__keys_code_root_tl \l_keys_path_tl }
      {
        \cs_if_exist_use:c { \c__keys_validate_root_tl \l_keys_path_tl }
        \cs:w \c__keys_code_root_tl \l_keys_path_tl \exp_after:wN \cs_end:
          \exp_after:wN { \l_keys_value_tl }
      }
      { \__keys_execute_unknown: }
  }
\cs_new_protected:Npn \__keys_execute_unknown:
  {
    \bool_if:NTF \l__keys_only_known_bool
      { \__keys_store_unused: }
      {
        \cs_if_exist:cTF
          { \c__keys_inherit_root_tl \__keys_parent:o \l_keys_path_tl }
          {
            \clist_map_inline:cn
              { \c__keys_inherit_root_tl \__keys_parent:o \l_keys_path_tl }
              {
                \cs_if_exist:cT
                  { \c__keys_code_root_tl ##1 / \l_keys_key_tl }
                  {
                    \cs:w \c__keys_code_root_tl ##1 / \l_keys_key_tl
                      \exp_after:wN \cs_end: \exp_after:wN
                      { \l_keys_value_tl }
                    \clist_map_break:
                  }
              }
          }
          {
            \cs_if_exist:cTF { \c__keys_code_root_tl \l__keys_module_tl / unknown }
              {
                \cs:w \c__keys_code_root_tl \l__keys_module_tl / unknown
                  \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl }
              }
              {
                \__msg_kernel_error:nnxx { kernel } { key-unknown }
                  { \l_keys_path_tl } { \l__keys_module_tl }
              }
          }
       }
  }
\cs_new:Npn \__keys_execute:nn #1#2
  {
    \cs_if_exist:cTF { \c__keys_code_root_tl #1 }
      {
        \cs:w \c__keys_code_root_tl #1 \exp_after:wN \cs_end:
          \exp_after:wN { \l_keys_value_tl }
      }
      {#2}
  }
\cs_new_protected:Npn \__keys_store_unused:
  {
    \clist_put_right:Nx \l__keys_unused_clist
      {
        \exp_not:o \l_keys_key_tl
        \bool_if:NF \l__keys_no_value_bool
          { = { \exp_not:o \l_keys_value_tl } }
      }
  }
\cs_new:Npn \__keys_choice_find:n #1
  {
    \__keys_execute:nn { \l_keys_path_tl / \__keys_remove_spaces:n {#1} }
      { \__keys_execute:nn { \l_keys_path_tl / unknown } { } }
  }
\cs_new:Npn \__keys_multichoice_find:n #1
  { \clist_map_function:nN {#1} \__keys_choice_find:n }
\cs_new:Npn \__keys_parent:n #1
  { \__keys_parent:w #1 / / \q_stop { } }
\cs_generate_variant:Nn \__keys_parent:n { o }
\cs_new:Npn \__keys_parent:w #1 / #2 / #3 \q_stop #4
  {
    \tl_if_blank:nTF {#2}
      { \use_none:n #4 }
      {
        \__keys_parent:w #2 / #3 \q_stop { #4 / #1 }
      }
  }
\cs_new:Npn \__keys_remove_spaces:n #1
  {
    \exp_after:wN \__keys_remove_spaces:w \tl_to_str:n {#1}
    \use_none:nn ? ~
  }
\cs_new:Npn \__keys_remove_spaces:w #1 ~
  { #1 \__keys_remove_spaces:w }
\prg_new_conditional:Npnn \keys_if_exist:nn #1#2 { p , T , F , TF }
  {
    \cs_if_exist:cTF
      { \c__keys_code_root_tl \__keys_remove_spaces:n { #1 / #2 } }
      { \prg_return_true: }
      { \prg_return_false: }
  }
\prg_new_conditional:Npnn \keys_if_choice_exist:nnn #1#2#3
  { p , T , F , TF }
  {
    \cs_if_exist:cTF
      { \c__keys_code_root_tl \__keys_remove_spaces:n { #1 / #2 / #3 } }
      { \prg_return_true: }
      { \prg_return_false: }
  }
\cs_new_protected:Npn \keys_show:nn #1#2
  {
    \keys_if_exist:nnTF {#1} {#2}
      {
        \__msg_show_pre:nnxxxx { LaTeX / kernel } { show-key }
          { \__keys_remove_spaces:n { #1 / #2 } } { t } { } { }
        \exp_args:Nc \__keys_show:N
          { \c__keys_code_root_tl \__keys_remove_spaces:n { #1 / #2 } }
      }
      {
        \__msg_show_pre:nnxxxx { LaTeX / kernel } { show-key }
          { \__keys_remove_spaces:n { #1 / #2 } } { f } { } { }
        \__msg_show_wrap:n { }
      }
  }
\cs_new_protected:Npn \__keys_show:N #1
  {
    \use:x
      {
        \__msg_show_wrap:n
          {
            \exp_not:N \__msg_show_item_unbraced:nn { code }
              { \token_get_replacement_spec:N #1 }
          }
      }
  }
\cs_new_protected:Npn \keys_log:nn
  { \__msg_log_next: \keys_show:nn }
\__msg_kernel_new:nnnn { kernel } { boolean-values-only }
  { Key~'#1'~accepts~boolean~values~only. }
  { The~key~'#1'~only~accepts~the~values~'true'~and~'false'. }
\__msg_kernel_new:nnnn { kernel } { key-choice-unknown }
  { Key~'#1'~accepts~only~a~fixed~set~of~choices. }
  {
    The~key~'#1'~only~accepts~predefined~values,~
    and~'#2'~is~not~one~of~these.
  }
\__msg_kernel_new:nnnn { kernel } { key-no-property }
  { No~property~given~in~definition~of~key~'#1'. }
  {
    \c__msg_coding_error_text_tl
    Inside~\keys_define:nn  each~key~name~
    needs~a~property:  \\ \\
    \iow_indent:n { #1 .<property> } \\ \\
    LaTeX~did~not~find~a~'.'~to~indicate~the~start~of~a~property.
  }
\__msg_kernel_new:nnnn { kernel } { key-unknown }
  { The~key~'#1'~is~unknown~and~is~being~ignored. }
  {
    The~module~'#2'~does~not~have~a~key~called~'#1'.\\
    Check~that~you~have~spelled~the~key~name~correctly.
  }
\__msg_kernel_new:nnnn { kernel } { nested-choice-key }
  { Attempt~to~define~'#1'~as~a~nested~choice~key. }
  {
    The~key~'#1'~cannot~be~defined~as~a~choice~as~the~parent~key~'#2'~is~
    itself~a~choice.
  }
\__msg_kernel_new:nnnn { kernel } { property-boolean-values-only }
  { The~property~'#1'~accepts~boolean~values~only. }
  {
    \c__msg_coding_error_text_tl
    The~property~'#1'~only~accepts~the~values~'true'~and~'false'.
  }
\__msg_kernel_new:nnnn { kernel } { property-requires-value }
  { The~property~'#1'~requires~a~value. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~was~asked~to~set~property~'#1'~for~key~'#2'.\\
    No~value~was~given~for~the~property,~and~one~is~required.
  }
\__msg_kernel_new:nnnn { kernel } { property-unknown }
  { The~key~property~'#1'~is~unknown. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~has~been~asked~to~set~the~property~'#1'~for~key~'#2':~
    this~property~is~not~defined.
  }
\__msg_kernel_new:nnnn { kernel } { value-forbidden }
  { The~key~'#1'~does~not~take~a~value. }
  {
    The~key~'#1'~should~be~given~without~a~value.\\
    The~value~'#2'~was~present:~the~key~will~be~ignored.
  }
\__msg_kernel_new:nnnn { kernel } { value-required }
  { The~key~'#1'~requires~a~value. }
  {
    The~key~'#1'~must~have~a~value.\\
    No~value~was~present:~the~key~will~be~ignored.
  }
\__msg_kernel_new:nnn { kernel } { show-key }
  {
    The~key~#1~
    \str_if_eq:nnTF {#2} { t }
      { has~the~properties: }
      { is~undefined. }
  }
%% File: l3fp.dtx Copyright (C) 2011-2017 The LaTeX3 Project
%% File: l3fp-aux.dtx Copyright(C) 2011-2014,2016-2017 The LaTeX3 Project
\cs_new:Npn \__fp_use_none_stop_f:n #1 { \exp_stop_f: }
\cs_new:Npn \__fp_use_s:n #1 { #1; }
\cs_new:Npn \__fp_use_s:nn #1#2 { #1#2; }
\cs_new:Npn \__fp_use_none_until_s:w #1; { }
\cs_new:Npn \__fp_use_i_until_s:nw #1#2; {#1}
\cs_new:Npn \__fp_use_ii_until_s:nnw #1#2#3; {#2}
\cs_new:Npn \__fp_reverse_args:Nww #1 #2; #3; { #1 #3; #2; }
\cs_new:Npn \__fp_rrot:www #1; #2; #3; { #2; #3; #1; }
\cs_new:Npn \__fp_use_i:ww #1; #2; { #1; }
\cs_new:Npn \__fp_use_i:www #1; #2; #3; { #1; }
\__scan_new:N \s__fp
\cs_new_protected:Npn \__fp_chk:w #1 ;
  {
    \__msg_kernel_error:nnx { kernel } { misused-fp }
      { \fp_to_tl:n { \s__fp \__fp_chk:w #1 ; } }
  }
\__scan_new:N \s__fp_mark
\__scan_new:N \s__fp_stop
\__scan_new:N \s__fp_invalid
\__scan_new:N \s__fp_underflow
\__scan_new:N \s__fp_overflow
\__scan_new:N \s__fp_division
\__scan_new:N \s__fp_exact
\tl_const:Nn \c_zero_fp       { \s__fp \__fp_chk:w 0 0 \s__fp_exact ; }
\tl_const:Nn \c_minus_zero_fp { \s__fp \__fp_chk:w 0 2 \s__fp_exact ; }
\tl_const:Nn \c_inf_fp        { \s__fp \__fp_chk:w 2 0 \s__fp_exact ; }
\tl_const:Nn \c_minus_inf_fp  { \s__fp \__fp_chk:w 2 2 \s__fp_exact ; }
\tl_const:Nn \c_nan_fp        { \s__fp \__fp_chk:w 3 1 \s__fp_exact ; }
\int_const:Nn \c__fp_prec_int { 16 }
\int_const:Nn \c__fp_half_prec_int { 8 }
\int_const:Nn \c__fp_block_int { 4 }
\int_const:Nn \c__fp_myriad_int { 10000 }
\int_const:Nn \c__fp_minus_min_exponent_int { 10000 }
\int_const:Nn \c__fp_max_exponent_int { 10000 }
\int_const:Nn \c__fp_max_exp_exponent_int { 5 }
\tl_const:Nx \c__fp_overflowing_fp
  {
    \s__fp \__fp_chk:w 1 0
      { \int_eval:n { \c__fp_max_exponent_int + 1 } }
      {1000} {0000} {0000} {0000} ;
  }
\cs_new:Npn \__fp_zero_fp:N #1
  { \s__fp \__fp_chk:w 0 #1 \s__fp_underflow ; }
\cs_new:Npn \__fp_inf_fp:N #1
  { \s__fp \__fp_chk:w 2 #1 \s__fp_overflow ; }
\cs_new:Npn \__fp_exponent:w \s__fp \__fp_chk:w #1
  {
    \if_meaning:w 1 #1
      \exp_after:wN \__fp_use_ii_until_s:nnw
    \else:
      \exp_after:wN \__fp_use_i_until_s:nw
      \exp_after:wN 0
    \fi:
  }
\cs_new:Npn \__fp_neg_sign:N #1
  { \__int_eval:w 2 - #1 \__int_eval_end: }
\cs_new:Npn \__fp_sanitize:Nw #1 #2;
  {
    \if_case:w
        \if_int_compare:w #2 > \c__fp_max_exponent_int 1 ~ \else:
        \if_int_compare:w #2 < - \c__fp_minus_min_exponent_int 2 ~ \else:
        \if_meaning:w 1 #1 3 ~ \fi: \fi: \fi: 0 ~
    \or: \exp_after:wN \__fp_overflow:w
    \or: \exp_after:wN \__fp_underflow:w
    \or: \exp_after:wN \__fp_sanitize_zero:w
    \fi:
    \s__fp \__fp_chk:w 1 #1 {#2}
  }
\cs_new:Npn \__fp_sanitize:wN #1; #2 { \__fp_sanitize:Nw #2 #1; }
\cs_new:Npn \__fp_sanitize_zero:w \s__fp \__fp_chk:w #1 #2 #3;
  { \c_zero_fp }
\cs_new:Npn \__fp_exp_after_o:w \s__fp \__fp_chk:w #1
  {
    \if_meaning:w 1 #1
      \exp_after:wN \__fp_exp_after_normal:nNNw
    \else:
      \exp_after:wN \__fp_exp_after_special:nNNw
    \fi:
    { }
    #1
  }
\cs_new:Npn \__fp_exp_after_f:nw #1 \s__fp \__fp_chk:w #2
  {
    \if_meaning:w 1 #2
      \exp_after:wN \__fp_exp_after_normal:nNNw
    \else:
      \exp_after:wN \__fp_exp_after_special:nNNw
    \fi:
    { \exp:w \exp_end_continue_f:w #1 }
    #2
  }
\cs_new:Npn \__fp_exp_after_special:nNNw #1#2#3#4;
  {
    \exp_after:wN \s__fp
    \exp_after:wN \__fp_chk:w
    \exp_after:wN #2
    \exp_after:wN #3
    \exp_after:wN #4
    \exp_after:wN ;
    #1
  }
\cs_new:Npn \__fp_exp_after_normal:nNNw #1 1 #2 #3 #4#5#6#7;
  {
    \exp_after:wN \__fp_exp_after_normal:Nwwwww
    \exp_after:wN #2
    \__int_value:w #3   \exp_after:wN ;
    \__int_value:w 1 #4 \exp_after:wN ;
    \__int_value:w 1 #5 \exp_after:wN ;
    \__int_value:w 1 #6 \exp_after:wN ;
    \__int_value:w 1 #7 \exp_after:wN ; #1
  }
\cs_new:Npn \__fp_exp_after_normal:Nwwwww
    #1 #2; 1 #3 ; 1 #4 ; 1 #5 ; 1 #6 ;
  { \s__fp \__fp_chk:w 1 #1 {#2} {#3} {#4} {#5} {#6} ; }
\cs_new:Npn \__fp_exp_after_array_f:w #1
  {
    \cs:w __fp_exp_after \__fp_type_from_scan:N #1 _f:nw \cs_end:
      { \__fp_exp_after_array_f:w }
    #1
  }
\cs_new_eq:NN \__fp_exp_after_stop_f:nw \use_none:nn
\int_const:Nn \c__fp_leading_shift_int  { - 5 0000 }
\int_const:Nn \c__fp_middle_shift_int   { 5 0000 *  9999 }
\int_const:Nn \c__fp_trailing_shift_int { 5 0000 * 10000 }
\cs_new:Npn \__fp_pack:NNNNNw #1 #2#3#4#5 #6; { + #1#2#3#4#5 ; {#6} }
\int_const:Nn \c__fp_big_leading_shift_int  { - 15 2374 }
\int_const:Nn \c__fp_big_middle_shift_int   { 15 2374 *  9999 }
\int_const:Nn \c__fp_big_trailing_shift_int { 15 2374 * 10000 }
\cs_new:Npn \__fp_pack_big:NNNNNNw #1#2 #3#4#5#6 #7;
  { + #1#2#3#4#5#6 ; {#7} }
\int_const:Nn \c__fp_Bigg_leading_shift_int  { - 20 0000 }
\int_const:Nn \c__fp_Bigg_middle_shift_int   { 20 0000 *  9999 }
\int_const:Nn \c__fp_Bigg_trailing_shift_int { 20 0000 * 10000 }
\cs_new:Npn \__fp_pack_Bigg:NNNNNNw #1#2 #3#4#5#6 #7;
  { + #1#2#3#4#5#6 ; {#7} }
\cs_new:Npn \__fp_pack_twice_four:wNNNNNNNN #1; #2#3#4#5 #6#7#8#9
  { #1 {#2#3#4#5} {#6#7#8#9} ; }
\cs_new:Npn \__fp_pack_eight:wNNNNNNNN #1; #2#3#4#5 #6#7#8#9
  { #1 {#2#3#4#5#6#7#8#9} ; }
\cs_new:Npn \__fp_basics_pack_low:NNNNNw #1 #2#3#4#5 #6;
  { + #1 - 1 ; {#2#3#4#5} {#6} ; }
\cs_new:Npn \__fp_basics_pack_high:NNNNNw #1 #2#3#4#5 #6;
  {
    \if_meaning:w 2 #1
      \__fp_basics_pack_high_carry:w
    \fi:
    ; {#2#3#4#5} {#6}
  }
\cs_new:Npn \__fp_basics_pack_high_carry:w \fi: ; #1
  { \fi: + 1 ; {1000} }
\cs_new:Npn \__fp_basics_pack_weird_low:NNNNw #1 #2#3#4 #5;
  {
    \if_meaning:w 2 #1
      + 1
    \fi:
    \__int_eval_end:
    #2#3#4; {#5} ;
  }
\cs_new:Npn \__fp_basics_pack_weird_high:NNNNNNNNw
   1 #1#2#3#4 #5#6#7#8 #9; { ; {#1#2#3#4} {#5#6#7#8} {#9} }
\cs_new:Npn \__fp_decimate:nNnnnn #1
  {
    \cs:w
      __fp_decimate_
      \if_int_compare:w \__int_eval:w #1 > \c__fp_prec_int
        tiny
      \else:
        \__int_to_roman:w \__int_eval:w #1
      \fi:
      :Nnnnn
    \cs_end:
  }
\cs_new:Npn \__fp_decimate_:Nnnnn #1 #2#3#4#5
  { #1 0 {#2#3} {#4#5} ; }
\cs_new:Npn \__fp_decimate_tiny:Nnnnn #1 #2#3#4#5
  { #1 1 { 0000 0000 } { 0000 0000 } 0 #2#3#4#5 ; }
\cs_new:Npn \__fp_tmp:w #1 #2 #3
  {
    \cs_new:cpn { __fp_decimate_ #1 :Nnnnn } ##1 ##2##3##4##5
      {
        \exp_after:wN ##1
        \__int_value:w
          \exp_after:wN \__fp_round_digit:Nw #2 ;
        \__fp_decimate_pack:nnnnnnnnnnw #3 ;
      }
  }
\__fp_tmp:w {i}   {\use_none:nnn      #50}{    0{#2}#3{#4}#5               }
\__fp_tmp:w {ii}  {\use_none:nn       #5 }{    00{#2}#3{#4}#5              }
\__fp_tmp:w {iii} {\use_none:n        #5 }{    000{#2}#3{#4}#5             }
\__fp_tmp:w {iv}  {                   #5 }{   {0000}#2{#3}#4 #5            }
\__fp_tmp:w {v}   {\use_none:nnn    #4#5 }{   0{0000}#2{#3}#4 #5           }
\__fp_tmp:w {vi}  {\use_none:nn     #4#5 }{   00{0000}#2{#3}#4 #5          }
\__fp_tmp:w {vii} {\use_none:n      #4#5 }{   000{0000}#2{#3}#4 #5         }
\__fp_tmp:w {viii}{                 #4#5 }{  {0000}0000{#2}#3 #4 #5        }
\__fp_tmp:w {ix}  {\use_none:nnn  #3#4+#5}{  0{0000}0000{#2}#3 #4 #5       }
\__fp_tmp:w {x}   {\use_none:nn   #3#4+#5}{  00{0000}0000{#2}#3 #4 #5      }
\__fp_tmp:w {xi}  {\use_none:n    #3#4+#5}{  000{0000}0000{#2}#3 #4 #5     }
\__fp_tmp:w {xii} {               #3#4+#5}{ {0000}0000{0000}#2 #3 #4 #5    }
\__fp_tmp:w {xiii}{\use_none:nnn#2#3+#4#5}{ 0{0000}0000{0000}#2 #3 #4 #5   }
\__fp_tmp:w {xiv} {\use_none:nn #2#3+#4#5}{ 00{0000}0000{0000}#2 #3 #4 #5  }
\__fp_tmp:w {xv}  {\use_none:n  #2#3+#4#5}{ 000{0000}0000{0000}#2 #3 #4 #5 }
\__fp_tmp:w {xvi} {             #2#3+#4#5}{{0000}0000{0000}0000 #2 #3 #4 #5}
\cs_new:Npn \__fp_decimate_pack:nnnnnnnnnnw #1#2#3#4#5
  { \__fp_decimate_pack:nnnnnnw { #1#2#3#4#5 } }
\cs_new:Npn \__fp_decimate_pack:nnnnnnw #1 #2#3#4#5#6
  { {#1} {#2#3#4#5#6} }
\cs_new:Npn \__fp_case_use:nw #1#2 \fi: #3 \s__fp { \fi: #1 \s__fp }
\cs_new:Npn \__fp_case_return:nw #1#2 \fi: #3 ; { \fi: #1 }
\cs_new:Npn \__fp_case_return_o:Nw #1#2 \fi: #3 \s__fp #4 ;
  { \fi: \exp_after:wN #1 }
\cs_new:Npn \__fp_case_return_same_o:w #1 \fi: #2 \s__fp
  { \fi: \__fp_exp_after_o:w \s__fp }
\cs_new:Npn \__fp_case_return_o:Nww #1#2 \fi: #3 \s__fp #4 ; #5 ;
  { \fi: \exp_after:wN #1 }
\cs_new:Npn \__fp_case_return_i_o:ww #1 \fi: #2 \s__fp #3 ; \s__fp #4 ;
  { \fi: \__fp_exp_after_o:w \s__fp #3 ; }
\cs_new:Npn \__fp_case_return_ii_o:ww #1 \fi: #2 \s__fp #3 ;
  { \fi: \__fp_exp_after_o:w }
\prg_new_conditional:Npnn \__fp_int:w \s__fp \__fp_chk:w #1 #2 #3 #4;
  { TF , T , F , p }
  {
    \if_case:w #1 \exp_stop_f:
           \prg_return_true:
    \or:
      \if_charcode:w 0
        \__fp_decimate:nNnnnn { \c__fp_prec_int - #3 }
          \__fp_use_i_until_s:nw #4
        \prg_return_true:
      \else:
        \prg_return_false:
      \fi:
    \else: \prg_return_false:
    \fi:
  }
\cs_new:Npn \__fp_small_int:wTF \s__fp \__fp_chk:w #1#2
  {
    \if_case:w #1 \exp_stop_f:
           \__fp_case_return:nw { \__fp_small_int_true:wTF 0 ; }
    \or:   \exp_after:wN \__fp_small_int_normal:NnwTF
    \or:
      \__fp_case_return:nw
        {
          \exp_after:wN \__fp_small_int_true:wTF \__int_value:w
            \if_meaning:w 2 #2 - \fi: 1 0000 0000 ;
        }
    \else: \__fp_case_return:nw \use_ii:nn
    \fi:
    #2
  }
\cs_new:Npn \__fp_small_int_true:wTF #1; #2#3 { #2 {#1} }
\cs_new:Npn \__fp_small_int_normal:NnwTF #1#2#3;
  {
    \__fp_decimate:nNnnnn { \c__fp_prec_int - #2 }
      \__fp_small_int_test:NnnwNw
      #3 #1
  }
\cs_new:Npn \__fp_small_int_test:NnnwNw #1#2#3#4; #5
  {
    \if_meaning:w 0 #1
      \exp_after:wN \__fp_small_int_true:wTF
      \__int_value:w \if_meaning:w 2 #5 - \fi:
        \if_int_compare:w #2 > 0 \exp_stop_f:
          1 0000 0000
        \else:
          #3
        \fi:
      \exp_after:wN ;
    \else:
      \exp_after:wN \use_ii:nn
    \fi:
  }
\cs_new:Npn \__fp_array_count:n #1
  {
    \__int_value:w \__int_eval:w 0
      \__fp_array_count_loop:Nw #1 { ? \__prg_break: } ;
      \__prg_break_point:
    \__int_eval_end:
  }
\cs_new:Npn \__fp_array_count_loop:Nw #1#2;
  { \use_none:n #1 + 1 \__fp_array_count_loop:Nw }
\cs_new:Npn \__fp_expand:n #1
  {
    \__fp_expand_loop:nwnN { }
      #1 \prg_do_nothing:
      \s__fp_mark { } \__fp_expand_loop:nwnN
      \s__fp_mark { } \__fp_use_i_until_s:nw ;
  }
\cs_new:Npn \__fp_expand_loop:nwnN #1#2 \s__fp_mark #3 #4
  {
    \exp_after:wN #4 \exp:w \exp_end_continue_f:w
    #2
    \s__fp_mark { #3 #1 } #4
  }
\__msg_kernel_new:nnnn { kernel } { misused-fp }
  { A~floating~point~with~value~'#1'~was~misused. }
  {
    To~obtain~the~value~of~a~floating~point~variable,~use~
    '\token_to_str:N \fp_to_decimal:N',~
    '\token_to_str:N \fp_to_scientific:N',~or~other~
    conversion~functions.
  }
%% File: l3fp-traps.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project
\flag_new:n { fp_invalid_operation }
\flag_new:n { fp_division_by_zero }
\flag_new:n { fp_overflow }
\flag_new:n { fp_underflow }
\cs_new_protected:Npn \fp_trap:nn #1#2
  {
    \cs_if_exist_use:cF { __fp_trap_#1_set_#2: }
      {
        \clist_if_in:nnTF
          { invalid_operation , division_by_zero , overflow , underflow }
          {#1}
          {
            \__msg_kernel_error:nnxx { kernel }
              { unknown-fpu-trap-type } {#1} {#2}
          }
          {
            \__msg_kernel_error:nnx
              { kernel } { unknown-fpu-exception } {#1}
          }
      }
  }
\cs_new_protected:Npn \__fp_trap_invalid_operation_set_error:
  { \__fp_trap_invalid_operation_set:N \prg_do_nothing: }
\cs_new_protected:Npn \__fp_trap_invalid_operation_set_flag:
  { \__fp_trap_invalid_operation_set:N \use_none:nnnnn }
\cs_new_protected:Npn \__fp_trap_invalid_operation_set_none:
  { \__fp_trap_invalid_operation_set:N \use_none:nnnnnnn }
\cs_new_protected:Npn \__fp_trap_invalid_operation_set:N #1
  {
    \exp_args:Nno \use:n
      { \cs_set:Npn \__fp_invalid_operation:nnw ##1##2##3; }
      {
        #1
        \__fp_error:nnfn { fp-invalid } {##2} { \fp_to_tl:n { ##3; } } { }
        \flag_raise:n { fp_invalid_operation }
        ##1
      }
    \exp_args:Nno \use:n
      { \cs_set:Npn \__fp_invalid_operation_o:Nww ##1##2; ##3; }
      {
        #1
        \__fp_error:nffn { fp-invalid-ii }
          { \fp_to_tl:n { ##2; } } { \fp_to_tl:n { ##3; } } {##1}
        \flag_raise:n { fp_invalid_operation }
        \exp_after:wN \c_nan_fp
      }
    \exp_args:Nno \use:n
      { \cs_set:Npn \__fp_invalid_operation_tl_o:ff ##1##2 }
      {
        #1
        \__fp_error:nffn { fp-invalid } {##1} {##2} { }
        \flag_raise:n { fp_invalid_operation }
        \exp_after:wN \c_nan_fp
      }
  }
\cs_new_protected:Npn \__fp_trap_division_by_zero_set_error:
  { \__fp_trap_division_by_zero_set:N \prg_do_nothing: }
\cs_new_protected:Npn \__fp_trap_division_by_zero_set_flag:
  { \__fp_trap_division_by_zero_set:N \use_none:nnnnn }
\cs_new_protected:Npn \__fp_trap_division_by_zero_set_none:
  { \__fp_trap_division_by_zero_set:N \use_none:nnnnnnn }
\cs_new_protected:Npn \__fp_trap_division_by_zero_set:N #1
  {
    \exp_args:Nno \use:n
      { \cs_set:Npn \__fp_division_by_zero_o:Nnw ##1##2##3; }
      {
        #1
        \__fp_error:nnfn { fp-zero-div } {##2} { \fp_to_tl:n { ##3; } } { }
        \flag_raise:n { fp_division_by_zero }
        \exp_after:wN ##1
      }
    \exp_args:Nno \use:n
      { \cs_set:Npn \__fp_division_by_zero_o:NNww ##1##2##3; ##4; }
      {
        #1
        \__fp_error:nffn { fp-zero-div-ii }
          { \fp_to_tl:n { ##3; } } { \fp_to_tl:n { ##4; } } {##2}
        \flag_raise:n { fp_division_by_zero }
        \exp_after:wN ##1
      }
  }
\cs_new_protected:Npn \__fp_trap_overflow_set_error:
  { \__fp_trap_overflow_set:N \prg_do_nothing: }
\cs_new_protected:Npn \__fp_trap_overflow_set_flag:
  { \__fp_trap_overflow_set:N \use_none:nnnnn }
\cs_new_protected:Npn \__fp_trap_overflow_set_none:
  { \__fp_trap_overflow_set:N \use_none:nnnnnnn }
\cs_new_protected:Npn \__fp_trap_overflow_set:N #1
  { \__fp_trap_overflow_set:NnNn #1 { overflow } \__fp_inf_fp:N { inf } }
\cs_new_protected:Npn \__fp_trap_underflow_set_error:
  { \__fp_trap_underflow_set:N \prg_do_nothing: }
\cs_new_protected:Npn \__fp_trap_underflow_set_flag:
  { \__fp_trap_underflow_set:N \use_none:nnnnn }
\cs_new_protected:Npn \__fp_trap_underflow_set_none:
  { \__fp_trap_underflow_set:N \use_none:nnnnnnn }
\cs_new_protected:Npn \__fp_trap_underflow_set:N #1
  { \__fp_trap_overflow_set:NnNn #1 { underflow } \__fp_zero_fp:N { 0 } }
\cs_new_protected:Npn \__fp_trap_overflow_set:NnNn #1#2#3#4
  {
    \exp_args:Nno \use:n
      { \cs_set:cpn { __fp_ #2 :w } \s__fp \__fp_chk:w ##1##2##3; }
      {
        #1
        \__fp_error:nffn
          { fp-flow \if_meaning:w 1 ##1 -to \fi: }
          { \fp_to_tl:n { \s__fp \__fp_chk:w ##1##2##3; } }
          { \token_if_eq_meaning:NNF 0 ##2 { - } #4 }
          {#2}
        \flag_raise:n { fp_#2 }
        #3 ##2
      }
  }
\cs_new:Npn \__fp_invalid_operation:nnw #1#2#3; { }
\cs_new:Npn \__fp_invalid_operation_o:Nww #1#2; #3; { }
\cs_new:Npn \__fp_invalid_operation_tl_o:ff #1 #2 { }
\cs_new:Npn \__fp_division_by_zero_o:Nnw #1#2#3; { }
\cs_new:Npn \__fp_division_by_zero_o:NNww #1#2#3; #4; { }
\cs_new:Npn \__fp_overflow:w { }
\cs_new:Npn \__fp_underflow:w { }
\fp_trap:nn { invalid_operation } { error }
\fp_trap:nn { division_by_zero } { flag }
\fp_trap:nn { overflow } { flag }
\fp_trap:nn { underflow } { flag }
\cs_new:Npn \__fp_invalid_operation_o:nw
  { \__fp_invalid_operation:nnw { \exp_after:wN \c_nan_fp } }
\cs_generate_variant:Nn \__fp_invalid_operation_o:nw { f }
\cs_new:Npn \__fp_error:nnnn
  { \__msg_kernel_expandable_error:nnnnn { kernel } }
\cs_generate_variant:Nn \__fp_error:nnnn { nnf, nff }
\__msg_kernel_new:nnnn { kernel } { unknown-fpu-exception }
  {
    The~FPU~exception~'#1'~is~not~known:~
    that~trap~will~never~be~triggered.
  }
  {
    The~only~exceptions~to~which~traps~can~be~attached~are \\
    \iow_indent:n
      {
        * ~ invalid_operation \\
        * ~ division_by_zero \\
        * ~ overflow \\
        * ~ underflow
      }
  }
\__msg_kernel_new:nnnn { kernel } { unknown-fpu-trap-type }
  { The~FPU~trap~type~'#2'~is~not~known. }
  {
    The~trap~type~must~be~one~of \\
    \iow_indent:n
      {
        * ~ error \\
        * ~ flag \\
        * ~ none
      }
  }
\__msg_kernel_new:nnn { kernel } { fp-flow }
  { An ~ #3 ~ occurred. }
\__msg_kernel_new:nnn { kernel } { fp-flow-to }
  { #1 ~ #3 ed ~ to ~ #2 . }
\__msg_kernel_new:nnn { kernel } { fp-zero-div }
  { Division~by~zero~in~ #1 (#2) }
\__msg_kernel_new:nnn { kernel } { fp-zero-div-ii }
  { Division~by~zero~in~ (#1) #3 (#2) }
\__msg_kernel_new:nnn { kernel } { fp-invalid }
  { Invalid~operation~ #1 (#2) }
\__msg_kernel_new:nnn { kernel } { fp-invalid-ii }
  { Invalid~operation~ (#1) #3 (#2) }
%% File: l3fp-round.dtx Copyright(C) 2011-2012,2014-2017 The LaTeX3 Project
\cs_new:Npn \__fp_parse_word_trunc:N
  { \__fp_parse_function:NNN \__fp_round_o:Nw \__fp_round_to_zero:NNN }
\cs_new:Npn \__fp_parse_word_floor:N
  { \__fp_parse_function:NNN \__fp_round_o:Nw \__fp_round_to_ninf:NNN }
\cs_new:Npn \__fp_parse_word_ceil:N
  { \__fp_parse_function:NNN \__fp_round_o:Nw \__fp_round_to_pinf:NNN }
\cs_new:Npn \__fp_parse_word_round:N #1#2
  {
    \if_meaning:w + #2
      \__fp_parse_round:Nw \__fp_round_to_pinf:NNN
    \else:
      \if_meaning:w 0 #2
        \__fp_parse_round:Nw \__fp_round_to_zero:NNN
      \else:
        \if_meaning:w - #2
          \__fp_parse_round:Nw \__fp_round_to_ninf:NNN
        \fi:
      \fi:
    \fi:
    \__fp_parse_function:NNN
      \__fp_round_o:Nw \__fp_round_to_nearest:NNN #1
    #2
  }
\cs_new:Npn \__fp_parse_round:Nw
    #1 #2 \__fp_round_to_nearest:NNN #3#4 { #2 #1 #3 }
\cs_new:Npn \__fp_parse_round_deprecation_error:Nw
    #1 #2 \__fp_round_to_nearest:NNN #3#4
  {
    \__fp_error:nnfn { fp-deprecated } { round#4() }
      {
        \str_case:nn {#2}
          { { + } { ceil } { 0 } { trunc } { - } { floor } }
      } { }
    #2 #1 #3
  }
\int_const:Nn \c__fp_five_int { 5 }
\cs_new:Npn \__fp_round_return_one:
  { \exp_after:wN 1 \exp_after:wN \exp_stop_f: \exp:w }
\cs_new:Npn \__fp_round_to_ninf:NNN #1 #2 #3
  {
    \if_meaning:w 2 #1
      \if_int_compare:w #3 > 0 \exp_stop_f:
        \__fp_round_return_one:
      \fi:
    \fi:
    0 \exp_stop_f:
  }
\cs_new:Npn \__fp_round_to_zero:NNN #1 #2 #3 { 0 \exp_stop_f: }
\cs_new:Npn \__fp_round_to_pinf:NNN #1 #2 #3
  {
    \if_meaning:w 0 #1
      \if_int_compare:w #3 > 0 \exp_stop_f:
        \__fp_round_return_one:
      \fi:
    \fi:
    0 \exp_stop_f:
  }
\cs_new:Npn \__fp_round_to_nearest:NNN #1 #2 #3
  {
    \if_int_compare:w #3 > \c__fp_five_int
      \__fp_round_return_one:
    \else:
      \if_meaning:w 5 #3
        \if_int_odd:w #2 \exp_stop_f:
          \__fp_round_return_one:
        \fi:
      \fi:
    \fi:
    0 \exp_stop_f:
  }
\cs_new:Npn \__fp_round_to_nearest_ninf:NNN #1 #2 #3
  {
    \if_int_compare:w #3 > \c__fp_five_int
      \__fp_round_return_one:
    \else:
      \if_meaning:w 5 #3
        \if_meaning:w 2 #1
            \__fp_round_return_one:
        \fi:
      \fi:
    \fi:
    0 \exp_stop_f:
  }
\cs_new:Npn \__fp_round_to_nearest_zero:NNN #1 #2 #3
  {
    \if_int_compare:w #3 > \c__fp_five_int
      \__fp_round_return_one:
    \fi:
    0 \exp_stop_f:
  }
\cs_new:Npn \__fp_round_to_nearest_pinf:NNN #1 #2 #3
  {
    \if_int_compare:w #3 > \c__fp_five_int
      \__fp_round_return_one:
    \else:
      \if_meaning:w 5 #3
        \if_meaning:w 0 #1
            \__fp_round_return_one:
        \fi:
      \fi:
    \fi:
    0 \exp_stop_f:
  }
\cs_new_eq:NN \__fp_round:NNN \__fp_round_to_nearest:NNN
\cs_new:Npn \__fp_round_s:NNNw #1 #2 #3 #4;
  {
    \exp_after:wN \__fp_round:NNN
    \exp_after:wN #1
    \exp_after:wN #2
    \__int_value:w \__int_eval:w
      \if_int_odd:w 0 \if_meaning:w 0 #3 1 \fi:
                      \if_meaning:w 5 #3 1 \fi:
                \exp_stop_f:
        \if_int_compare:w \__int_eval:w #4 > 0 \exp_stop_f:
          1 +
        \fi:
      \fi:
      #3
    ;
  }
\cs_new:Npn \__fp_round_digit:Nw #1 #2;
  {
    \if_int_odd:w \if_meaning:w 0 #1 1 \else:
                  \if_meaning:w 5 #1 1 \else:
                  0 \fi: \fi: \exp_stop_f:
      \if_int_compare:w \__int_eval:w #2 > 0 \exp_stop_f:
        \__int_eval:w 1 +
      \fi:
    \fi:
    #1
  }
\cs_new_eq:NN \__fp_round_to_ninf_neg:NNN \__fp_round_to_pinf:NNN
\cs_new:Npn \__fp_round_to_zero_neg:NNN #1 #2 #3
  {
    \if_int_compare:w #3 > 0 \exp_stop_f:
      \__fp_round_return_one:
    \fi:
    0 \exp_stop_f:
  }
\cs_new_eq:NN \__fp_round_to_pinf_neg:NNN \__fp_round_to_ninf:NNN
\cs_new_eq:NN \__fp_round_to_nearest_neg:NNN \__fp_round_to_nearest:NNN
\cs_new_eq:NN \__fp_round_to_nearest_ninf_neg:NNN \__fp_round_to_nearest_pinf:NNN
\cs_new:Npn \__fp_round_to_nearest_zero_neg:NNN #1 #2 #3
  {
    \if_int_compare:w #3 < \c__fp_five_int \else:
      \__fp_round_return_one:
    \fi:
    0 \exp_stop_f:
  }
\cs_new_eq:NN \__fp_round_to_nearest_pinf_neg:NNN \__fp_round_to_nearest_ninf:NNN
\cs_new_eq:NN \__fp_round_neg:NNN \__fp_round_to_nearest_neg:NNN
\cs_new:Npn \__fp_round_o:Nw #1#2 @
  {
    \if_case:w
      \__int_eval:w \__fp_array_count:n {#2} \__int_eval_end:
         \__fp_round_no_arg_o:Nw #1 \exp:w
    \or: \__fp_round:Nwn #1 #2 {0} \exp:w
    \or: \__fp_round:Nww #1 #2 \exp:w
    \else: \__fp_round:Nwww #1 #2 @ \exp:w
    \fi:
    \exp_after:wN \exp_end:
  }
\cs_new:Npn \__fp_round_no_arg_o:Nw #1
  {
    \cs_if_eq:NNTF #1 \__fp_round_to_nearest:NNN
      { \__fp_error:nnnn { fp-num-args } { round () } { 1 } { 3 } }
      {
        \__fp_error:nffn { fp-num-args }
          { \__fp_round_name_from_cs:N #1 () } { 1 } { 2 }
      }
    \exp_after:wN \c_nan_fp
  }
\cs_new:Npn \__fp_round:Nwww #1#2 ; #3 ; \s__fp \__fp_chk:w #4#5#6 ; #7 @
  {
    \cs_if_eq:NNTF #1 \__fp_round_to_nearest:NNN
      {
        \tl_if_empty:nTF {#7}
          {
            \exp_args:Nc \__fp_round:Nww
              {
                __fp_round_to_nearest
                \if_meaning:w 0 #4 _zero \else:
                \if_case:w #5 \exp_stop_f: _pinf \or: \else: _ninf \fi: \fi:
                :NNN
              }
            #2 ; #3 ;
          }
          {
            \__fp_error:nnnn { fp-num-args } { round () } { 1 } { 3 }
            \exp_after:wN \c_nan_fp
          }
      }
      {
        \__fp_error:nffn { fp-num-args }
          { \__fp_round_name_from_cs:N #1 () } { 1 } { 2 }
        \exp_after:wN \c_nan_fp
      }
  }
\cs_new:Npn \__fp_round_name_from_cs:N #1
  {
    \cs_if_eq:NNTF #1 \__fp_round_to_zero:NNN { trunc }
      {
        \cs_if_eq:NNTF #1 \__fp_round_to_ninf:NNN { floor }
          {
            \cs_if_eq:NNTF #1 \__fp_round_to_pinf:NNN { ceil }
              { round }
          }
      }
  }
\cs_new:Npn \__fp_round:Nww #1#2 ; #3 ;
  {
    \__fp_small_int:wTF #3; { \__fp_round:Nwn #1#2; }
      {
        \__fp_invalid_operation_tl_o:ff
          { \__fp_round_name_from_cs:N #1 }
          { \__fp_array_to_clist:n { #2; #3; } }
      }
  }
\cs_new:Npn \__fp_round:Nwn #1 \s__fp \__fp_chk:w #2#3#4; #5
  {
    \if_meaning:w 1 #2
      \exp_after:wN \__fp_round_normal:NwNNnw
      \exp_after:wN #1
      \__int_value:w #5
    \else:
      \exp_after:wN \__fp_exp_after_o:w
    \fi:
    \s__fp \__fp_chk:w #2#3#4;
  }
\cs_new:Npn \__fp_round_normal:NwNNnw #1#2 \s__fp \__fp_chk:w 1#3#4#5;
  {
    \__fp_decimate:nNnnnn { \c__fp_prec_int - #4 - #2 }
      \__fp_round_normal:NnnwNNnn #5 #1 #3 {#4} {#2}
  }
\cs_new:Npn \__fp_round_normal:NnnwNNnn #1#2#3#4; #5#6
  {
    \exp_after:wN \__fp_round_normal:NNwNnn
    \__int_value:w \__int_eval:w
      \if_int_compare:w #2 > 0 \exp_stop_f:
        1 \__int_value:w #2
        \exp_after:wN \__fp_round_pack:Nw
        \__int_value:w \__int_eval:w 1#3 +
      \else:
        \if_int_compare:w #3 > 0 \exp_stop_f:
          1 \__int_value:w #3 +
        \fi:
      \fi:
      \exp_after:wN #5
      \exp_after:wN #6
      \use_none:nnnnnnn #3
      #1
      \__int_eval_end:
      0000 0000 0000 0000 ; #6
  }
\cs_new:Npn \__fp_round_pack:Nw #1
  { \if_meaning:w 2 #1 + 1 \fi: \__int_eval_end: }
\cs_new:Npn \__fp_round_normal:NNwNnn #1 #2
  {
    \if_meaning:w 0 #2
      \exp_after:wN \__fp_round_special:NwwNnn
      \exp_after:wN #1
    \fi:
    \__fp_pack_twice_four:wNNNNNNNN
    \__fp_pack_twice_four:wNNNNNNNN
    \__fp_round_normal_end:wwNnn
    ; #2
  }
\cs_new:Npn \__fp_round_normal_end:wwNnn #1;#2;#3#4#5
  {
    \exp_after:wN \__fp_exp_after_o:w \exp:w \exp_end_continue_f:w
    \__fp_sanitize:Nw #3 #4 ; #1 ;
  }
\cs_new:Npn \__fp_round_special:NwwNnn #1#2;#3;#4#5#6
  {
    \if_meaning:w 0 #1
      \__fp_case_return:nw
        { \exp_after:wN \__fp_zero_fp:N \exp_after:wN #4 }
    \else:
      \exp_after:wN \__fp_round_special_aux:Nw
      \exp_after:wN #4
      \__int_value:w \__int_eval:w 1
        \if_meaning:w 1 #1 -#6 \else: +#5 \fi:
    \fi:
    ;
  }
\cs_new:Npn \__fp_round_special_aux:Nw #1#2;
  {
    \exp_after:wN \__fp_exp_after_o:w \exp:w \exp_end_continue_f:w
    \__fp_sanitize:Nw #1#2; {1000}{0000}{0000}{0000};
  }
%% File: l3fp-parse.dtx Copyright (C) 2011-2017 The LaTeX3 Project
\int_const:Nn \c__fp_prec_funcii_int { 16 }
\int_const:Nn \c__fp_prec_func_int   { 15 }
\int_const:Nn \c__fp_prec_hatii_int  { 14 }
\int_const:Nn \c__fp_prec_hat_int    { 13 }
\int_const:Nn \c__fp_prec_not_int    { 12 }
\int_const:Nn \c__fp_prec_times_int  { 10 }
\int_const:Nn \c__fp_prec_plus_int   { 9 }
\int_const:Nn \c__fp_prec_comp_int   { 7 }
\int_const:Nn \c__fp_prec_and_int    { 6 }
\int_const:Nn \c__fp_prec_or_int     { 5 }
\int_const:Nn \c__fp_prec_quest_int  { 4 }
\int_const:Nn \c__fp_prec_colon_int  { 3 }
\int_const:Nn \c__fp_prec_comma_int  { 2 }
\int_const:Nn \c__fp_prec_paren_int  { 1 }
\int_const:Nn \c__fp_prec_end_int    { 0 }
\cs_new:Npn \__fp_parse_expand:w #1 { \exp_end_continue_f:w #1 }
\cs_new:Npn \__fp_parse_return_semicolon:w
    #1 \fi: \__fp_parse_expand:w { \fi: ; #1 }
\cs_new:Npx \__fp_type_from_scan:N #1
  {
    \exp_not:N \exp_after:wN \exp_not:N \__fp_type_from_scan:w
    \exp_not:N \token_to_str:N #1 \exp_not:N \q_mark
      \tl_to_str:n { s__fp _? } \exp_not:N \q_mark \exp_not:N \q_stop
  }
\use:x
  {
    \cs_new:Npn \exp_not:N \__fp_type_from_scan:w
      ##1 \tl_to_str:n { s__fp } ##2 \exp_not:N \q_mark ##3 \exp_not:N \q_stop
      {##2}
  }
\cs_set_protected:Npn \__fp_tmp:w #1 #2 #3
  {
    \cs_new:cpn { __fp_parse_digits_ #1 :N } ##1
      {
        \if_int_compare:w 9 < 1 \token_to_str:N ##1 \exp_stop_f:
          \token_to_str:N ##1 \exp_after:wN #2 \exp:w
        \else:
          \__fp_parse_return_semicolon:w #3 ##1
        \fi:
        \__fp_parse_expand:w
      }
  }
\__fp_tmp:w {vii}  \__fp_parse_digits_vi:N   { 0000000 ; 7 }
\__fp_tmp:w {vi}   \__fp_parse_digits_v:N    { 000000 ; 6 }
\__fp_tmp:w {v}    \__fp_parse_digits_iv:N   { 00000 ; 5 }
\__fp_tmp:w {iv}   \__fp_parse_digits_iii:N  { 0000 ; 4 }
\__fp_tmp:w {iii}  \__fp_parse_digits_ii:N   { 000 ; 3 }
\__fp_tmp:w {ii}   \__fp_parse_digits_i:N    { 00 ; 2 }
\__fp_tmp:w {i}    \__fp_parse_digits_:N     { 0 ; 1 }
\cs_new:Npn \__fp_parse_digits_:N { ; ; 0 }
\cs_new:Npn \__fp_parse_one:Nw #1 #2
  {
    \if_catcode:w \scan_stop: \exp_not:N #2
      \exp_after:wN \if_meaning:w \exp_not:N #2 #2 \else:
        \exp_after:wN \reverse_if:N
      \fi:
      \if_meaning:w \scan_stop: #2
        \exp_after:wN \exp_after:wN
        \exp_after:wN \__fp_parse_one_fp:NN
      \else:
        \exp_after:wN \exp_after:wN
        \exp_after:wN \__fp_parse_one_register:NN
      \fi:
    \else:
      \if_int_compare:w 9 < 1 \token_to_str:N #2 \exp_stop_f:
        \exp_after:wN \exp_after:wN
        \exp_after:wN \__fp_parse_one_digit:NN
      \else:
        \exp_after:wN \exp_after:wN
        \exp_after:wN \__fp_parse_one_other:NN
      \fi:
    \fi:
    #1 #2
  }
\cs_new:Npn \__fp_parse_one_fp:NN #1#2
  {
    \cs:w __fp_exp_after \__fp_type_from_scan:N #2 _f:nw \cs_end:
      {
        \exp_after:wN \__fp_parse_infix:NN
        \exp_after:wN #1 \exp:w \__fp_parse_expand:w
      }
    #2
  }
\cs_new:Npn \__fp_exp_after_mark_f:nw #1
  {
    \__msg_kernel_expandable_error:nn { kernel } { fp-early-end }
    \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w #1
  }
\cs_new:cpn { __fp_exp_after_?_f:nw } #1#2
  {
    \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#2}
    \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w #1
  }
\cs_set_protected:Npn \__fp_tmp:w #1
  {
    \cs_if_exist:NT #1
      {
        \cs_gset:cpn { __fp_exp_after_?_f:nw } ##1##2
          {
            \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w ##1
            \str_if_eq:nnTF {##2} { \protect }
              {
                \cs_if_eq:NNTF ##2 #1 { \use_i:nn } { \use:n }
                { \__msg_kernel_expandable_error:nnn { kernel } { fp-robust-cmd } }
              }
              { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {##2} }
          }
      }
  }
\exp_args:Nc \__fp_tmp:w { @unexpandable@protect }
\cs_new:Npn \__fp_parse_one_register:NN #1#2
  {
    \exp_after:wN \__fp_parse_infix_after_operand:NwN
    \exp_after:wN #1
    \exp:w \exp_end_continue_f:w
      \if_meaning:w \box_wd:N #2 \__fp_parse_one_register_wd:w \fi:
      \if_meaning:w \box_ht:N #2 \__fp_parse_one_register_wd:w \fi:
      \if_meaning:w \box_dp:N #2 \__fp_parse_one_register_wd:w \fi:
      \exp_after:wN \__fp_parse_one_register_aux:Nw
      \exp_after:wN #2
      \__int_value:w
        \exp_after:wN \__fp_parse_exponent:N
        \exp:w \__fp_parse_expand:w
  }
\cs_new:Npx \__fp_parse_one_register_aux:Nw #1
  {
    \exp_not:n
      {
        \exp_after:wN \use:nn
        \exp_after:wN \__fp_parse_one_register_auxii:wwwNw
      }
    \exp_not:N \exp_after:wN { \exp_not:N \tex_the:D #1 }
      ; \exp_not:N \__fp_parse_one_register_dim:ww
      \tl_to_str:n { pt } ; \exp_not:N \__fp_parse_one_register_mu:www
      . \tl_to_str:n { pt } ; \exp_not:N \__fp_parse_one_register_int:www
      \exp_not:N \q_stop
  }
\use:x
  {
    \cs_new:Npn \exp_not:N \__fp_parse_one_register_auxii:wwwNw
        ##1 . ##2 \tl_to_str:n { pt } ##3 ; ##4##5 \exp_not:N \q_stop
        { ##4 ##1.##2; }
    \cs_new:Npn \exp_not:N \__fp_parse_one_register_mu:www
      ##1 \tl_to_str:n { mu } ; ##2 ;
      { \exp_not:N \__fp_parse_one_register_dim:ww ##1 ; }
  }
\cs_new:Npn \__fp_parse_one_register_int:www #1; #2.; #3;
  { \__fp_parse:n { #1 e #3 } }
\cs_new:Npn \__fp_parse_one_register_dim:ww #1; #2;
  {
    \exp_after:wN \__fp_from_dim_test:ww
    \__int_value:w #2 \exp_after:wN ,
    \__int_value:w \__dim_eval:w #1 pt ;
  }
\cs_new:Npn \__fp_parse_one_register_wd:w
    #1#2 \exp_after:wN #3#4 \__fp_parse_expand:w
  {
    #1
    \exp_after:wN \__fp_parse_one_register_wd:Nw
    #4 \__fp_parse_expand:w e
  }
\cs_new:Npn \__fp_parse_one_register_wd:Nw #1#2 ;
  {
    \exp_after:wN \__fp_from_dim_test:ww
    \exp_after:wN 0 \exp_after:wN ,
    \__int_value:w \__dim_eval:w
      \exp_after:wN \use:n \exp_after:wN { \tex_the:D #1 #2 } ;
  }
\cs_new:Npn \__fp_parse_one_digit:NN #1
  {
    \exp_after:wN \__fp_parse_infix_after_operand:NwN
    \exp_after:wN #1
    \exp:w \exp_end_continue_f:w
      \exp_after:wN \__fp_sanitize:wN
      \__int_value:w \__int_eval:w 0 \__fp_parse_trim_zeros:N
  }
\cs_new:Npn \__fp_parse_one_other:NN #1 #2
  {
    \if_int_compare:w
        \__int_eval:w
          ( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26
        = 3 \exp_stop_f:
      \exp_after:wN \__fp_parse_word:Nw
      \exp_after:wN #1
      \exp_after:wN #2
      \exp:w \exp_after:wN \__fp_parse_letters:N
      \exp:w
    \else:
      \exp_after:wN \__fp_parse_prefix:NNN
      \exp_after:wN #1
      \exp_after:wN #2
      \cs:w
        __fp_parse_prefix_ \token_to_str:N #2 :Nw
        \exp_after:wN
      \cs_end:
      \exp:w
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_word:Nw #1#2;
  {
    \cs_if_exist_use:cF { __fp_parse_word_#2:N }
      {
        \cs_if_exist_use:cF { __fp_parse_caseless_ \str_fold_case:n {#2} :N }
          {
            \__msg_kernel_expandable_error:nnn
              { kernel } { unknown-fp-word } {#2}
            \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w
            \__fp_parse_infix:NN
          }
      }
      #1
  }
\cs_new:Npn \__fp_parse_letters:N #1
  {
    \exp_end_continue_f:w
    \if_int_compare:w
        \if_catcode:w \scan_stop: \exp_not:N #1
          0
        \else:
          \__int_eval:w
            ( `#1 \if_int_compare:w `#1 > `Z - 32 \fi: ) / 26
        \fi:
        = 3 \exp_stop_f:
      \exp_after:wN #1
      \exp:w \exp_after:wN \__fp_parse_letters:N
      \exp:w
    \else:
      \__fp_parse_return_semicolon:w #1
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_prefix:NNN #1#2#3
  {
    \if_meaning:w \scan_stop: #3
      \exp_after:wN \__fp_parse_prefix_unknown:NNN
      \exp_after:wN #2
    \fi:
    #3 #1
  }
\cs_new:Npn \__fp_parse_prefix_unknown:NNN #1#2#3
  {
    \cs_if_exist:cTF { __fp_parse_infix_ \token_to_str:N #1 :N }
      {
        \__msg_kernel_expandable_error:nnn
          { kernel } { fp-missing-number } {#1}
        \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w
        \__fp_parse_infix:NN #3 #1
      }
      {
        \__msg_kernel_expandable_error:nnn
          { kernel } { fp-unknown-symbol } {#1}
        \__fp_parse_one:Nw #3
      }
  }
\cs_new:Npn \__fp_parse_trim_zeros:N #1
  {
    \if:w 0 \exp_not:N #1
      \exp_after:wN \__fp_parse_trim_zeros:N
      \exp:w
    \else:
      \if:w . \exp_not:N #1
        \exp_after:wN \__fp_parse_strim_zeros:N
        \exp:w
      \else:
        \__fp_parse_trim_end:w #1
      \fi:
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_trim_end:w #1 \fi: \fi: \__fp_parse_expand:w
  {
      \fi:
    \fi:
    \if_int_compare:w 9 < 1 \token_to_str:N #1 \exp_stop_f:
      \exp_after:wN \__fp_parse_large:N
    \else:
      \exp_after:wN \__fp_parse_zero:
    \fi:
    #1
  }
\cs_new:Npn \__fp_parse_strim_zeros:N #1
  {
    \if:w 0 \exp_not:N #1
      - 1
      \exp_after:wN \__fp_parse_strim_zeros:N \exp:w
    \else:
      \__fp_parse_strim_end:w #1
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_strim_end:w #1 \fi: \__fp_parse_expand:w
  {
    \fi:
    \if_int_compare:w 9 < 1 \token_to_str:N #1 \exp_stop_f:
      \exp_after:wN \__fp_parse_small:N
    \else:
      \exp_after:wN \__fp_parse_zero:
    \fi:
    #1
  }
\cs_new:Npn \__fp_parse_zero:
  {
    \exp_after:wN ; \exp_after:wN 1
    \__int_value:w \__fp_parse_exponent:N
  }
\cs_new:Npn \__fp_parse_small:N #1
  {
    \exp_after:wN \__fp_parse_pack_leading:NNNNNww
    \__int_value:w \__int_eval:w 1 \token_to_str:N #1
      \exp_after:wN \__fp_parse_small_leading:wwNN
      \__int_value:w 1
        \exp_after:wN \__fp_parse_digits_vii:N
        \exp:w \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_small_leading:wwNN 1 #1 ; #2; #3 #4
  {
    #1 #2
    \exp_after:wN \__fp_parse_pack_trailing:NNNNNNww
    \exp_after:wN 0
    \__int_value:w \__int_eval:w 1
      \if_int_compare:w 9 < 1 \token_to_str:N #4 \exp_stop_f:
        \token_to_str:N #4
        \exp_after:wN \__fp_parse_small_trailing:wwNN
        \__int_value:w 1
          \exp_after:wN \__fp_parse_digits_vi:N
          \exp:w
      \else:
        0000 0000 \__fp_parse_exponent:Nw #4
      \fi:
      \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_small_trailing:wwNN 1 #1 ; #2; #3 #4
  {
    #1 #2
    \if_int_compare:w 9 < 1 \token_to_str:N #4 \exp_stop_f:
      \token_to_str:N #4
      \exp_after:wN \__fp_parse_small_round:NN
      \exp_after:wN #4
      \exp:w
    \else:
      0 \__fp_parse_exponent:Nw #4
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_pack_trailing:NNNNNNww #1 #2 #3#4#5#6 #7; #8 ;
  {
    \if_meaning:w 2 #2 + 1 \fi:
    ; #8 + #1 ; {#3#4#5#6} {#7};
  }
\cs_new:Npn \__fp_parse_pack_leading:NNNNNww #1 #2#3#4#5 #6; #7;
  {
    + #7
    \if_meaning:w 2 #1 \__fp_parse_pack_carry:w \fi:
    ; 0 {#2#3#4#5} {#6}
  }
\cs_new:Npn \__fp_parse_pack_carry:w \fi: ; 0 #1
  { \fi: + 1 ; 0 {1000} }
\cs_new:Npn \__fp_parse_large:N #1
  {
    \exp_after:wN \__fp_parse_large_leading:wwNN
    \__int_value:w 1 \token_to_str:N #1
      \exp_after:wN \__fp_parse_digits_vii:N
      \exp:w \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_large_leading:wwNN 1 #1 ; #2; #3 #4
  {
    + \c__fp_half_prec_int - #3
    \exp_after:wN \__fp_parse_pack_leading:NNNNNww
    \__int_value:w \__int_eval:w 1 #1
      \if_int_compare:w 9 < 1 \token_to_str:N #4 \exp_stop_f:
        \exp_after:wN \__fp_parse_large_trailing:wwNN
        \__int_value:w 1 \token_to_str:N #4
          \exp_after:wN \__fp_parse_digits_vi:N
          \exp:w
      \else:
        \if:w . \exp_not:N #4
          \exp_after:wN \__fp_parse_small_leading:wwNN
          \__int_value:w 1
            \cs:w
              __fp_parse_digits_
              \__int_to_roman:w #3
              :N \exp_after:wN
            \cs_end:
            \exp:w
        \else:
          #2
          \exp_after:wN \__fp_parse_pack_trailing:NNNNNNww
          \exp_after:wN 0
          \__int_value:w 1 0000 0000
          \__fp_parse_exponent:Nw #4
        \fi:
      \fi:
      \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_large_trailing:wwNN 1 #1 ; #2; #3 #4
  {
    \if_int_compare:w 9 < 1 \token_to_str:N #4 \exp_stop_f:
      \exp_after:wN \__fp_parse_pack_trailing:NNNNNNww
      \exp_after:wN \c__fp_half_prec_int
      \__int_value:w \__int_eval:w 1 #1 \token_to_str:N #4
        \exp_after:wN \__fp_parse_large_round:NN
        \exp_after:wN #4
        \exp:w
    \else:
      \exp_after:wN \__fp_parse_pack_trailing:NNNNNNww
      \__int_value:w \__int_eval:w 7 - #3 \exp_stop_f:
      \__int_value:w \__int_eval:w 1 #1
        \if:w . \exp_not:N #4
          \exp_after:wN \__fp_parse_small_trailing:wwNN
          \__int_value:w 1
            \cs:w
              __fp_parse_digits_
              \__int_to_roman:w #3
              :N \exp_after:wN
            \cs_end:
            \exp:w
        \else:
          #2 0 \__fp_parse_exponent:Nw #4
        \fi:
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_round_loop:N #1
  {
    \if_int_compare:w 9 < 1 \token_to_str:N #1 \exp_stop_f:
      + 1
      \if:w 0 \token_to_str:N #1
        \exp_after:wN \__fp_parse_round_loop:N
        \exp:w
      \else:
        \exp_after:wN \__fp_parse_round_up:N
        \exp:w
      \fi:
    \else:
      \__fp_parse_return_semicolon:w 0 #1
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_round_up:N #1
  {
    \if_int_compare:w 9 < 1 \token_to_str:N #1 \exp_stop_f:
      + 1
      \exp_after:wN \__fp_parse_round_up:N
      \exp:w
    \else:
      \__fp_parse_return_semicolon:w 1 #1
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_round_after:wN #1; #2
  {
    + #2 \exp_after:wN ;
    \__int_value:w \__int_eval:w #1 + \__fp_parse_exponent:N
  }
\cs_new:Npn \__fp_parse_small_round:NN #1#2
  {
    \if_int_compare:w 9 < 1 \token_to_str:N #2 \exp_stop_f:
      +
      \exp_after:wN \__fp_round_s:NNNw
      \exp_after:wN 0
      \exp_after:wN #1
      \exp_after:wN #2
      \__int_value:w \__int_eval:w
        \exp_after:wN \__fp_parse_round_after:wN
        \__int_value:w \__int_eval:w 0 * \__int_eval:w 0
          \exp_after:wN \__fp_parse_round_loop:N
          \exp:w
    \else:
      \__fp_parse_exponent:Nw #2
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_large_round:NN #1#2
  {
    \if_int_compare:w 9 < 1 \token_to_str:N #2 \exp_stop_f:
      +
      \exp_after:wN \__fp_round_s:NNNw
      \exp_after:wN 0
      \exp_after:wN #1
      \exp_after:wN #2
      \__int_value:w \__int_eval:w
        \exp_after:wN \__fp_parse_large_round_aux:wNN
        \__int_value:w \__int_eval:w 1
          \exp_after:wN \__fp_parse_round_loop:N
    \else: %^^A could be dot, or e, or other
      \exp_after:wN \__fp_parse_large_round_test:NN
      \exp_after:wN #1
      \exp_after:wN #2
    \fi:
  }
\cs_new:Npn \__fp_parse_large_round_test:NN #1#2
  {
    \if:w . \exp_not:N #2
      \exp_after:wN \__fp_parse_small_round:NN
      \exp_after:wN #1
      \exp:w
    \else:
      \__fp_parse_exponent:Nw #2
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_large_round_aux:wNN #1 ; #2 #3
  {
    + #2
    \exp_after:wN \__fp_parse_round_after:wN
    \__int_value:w \__int_eval:w #1
      \if:w . \exp_not:N #3
        + 0 * \__int_eval:w 0
          \exp_after:wN \__fp_parse_round_loop:N
          \exp:w \exp_after:wN \__fp_parse_expand:w
      \else:
        \exp_after:wN ;
        \exp_after:wN 0
        \exp_after:wN #3
      \fi:
  }
\cs_new:Npn \__fp_parse_exponent:Nw #1 #2 \__fp_parse_expand:w
  {
    \exp_after:wN ;
    \__int_value:w #2 \__fp_parse_exponent:N #1
  }
\cs_new:Npn \__fp_parse_exponent:N #1
  {
    \if:w e \exp_not:N #1
      \exp_after:wN \__fp_parse_exponent_aux:N
      \exp:w
    \else:
      0 \__fp_parse_return_semicolon:w #1
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_exponent_aux:N #1
  {
    \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #1
                0 \else: `#1 \fi: > `9 \exp_stop_f:
      0 \exp_after:wN ; \exp_after:wN e
    \else:
      \exp_after:wN \__fp_parse_exponent_sign:N
    \fi:
    #1
  }
\cs_new:Npn \__fp_parse_exponent_sign:N #1
  {
    \if:w + \if:w - \exp_not:N #1 + \fi: \token_to_str:N #1
      \exp_after:wN \__fp_parse_exponent_sign:N
      \exp:w \exp_after:wN \__fp_parse_expand:w
    \else:
      \exp_after:wN \__fp_parse_exponent_body:N
      \exp_after:wN #1
    \fi:
  }
\cs_new:Npn \__fp_parse_exponent_body:N #1
  {
    \if_int_compare:w 9 < 1 \token_to_str:N #1 \exp_stop_f:
      \token_to_str:N #1
      \exp_after:wN \__fp_parse_exponent_digits:N
      \exp:w
    \else:
      \__fp_parse_exponent_keep:NTF #1
        { \__fp_parse_return_semicolon:w #1 }
        {
          \exp_after:wN ;
          \exp:w
        }
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_exponent_digits:N #1
  {
    \if_int_compare:w 9 < 1 \token_to_str:N #1 \exp_stop_f:
      \token_to_str:N #1
      \exp_after:wN \__fp_parse_exponent_digits:N
      \exp:w
    \else:
      \__fp_parse_return_semicolon:w #1
    \fi:
    \__fp_parse_expand:w
  }
\prg_new_conditional:Npnn \__fp_parse_exponent_keep:N #1 { TF }
  {
    \if_catcode:w \scan_stop: \exp_not:N #1
      \if_meaning:w \scan_stop: #1
        \if_int_compare:w
            \__str_if_eq_x:nn { \s__fp } { \exp_not:N #1 }
            = 0 \exp_stop_f:
          0
          \__msg_kernel_expandable_error:nnn
            { kernel } { fp-after-e } { floating~point~ }
          \prg_return_true:
        \else:
          0
          \__msg_kernel_expandable_error:nnn
            { kernel } { bad-variable } {#1}
          \prg_return_false:
        \fi:
      \else:
        \if_int_compare:w
            \__str_if_eq_x:nn { \__int_value:w #1 } { \tex_the:D #1 }
            = 0 \exp_stop_f:
          \__int_value:w #1
        \else:
          0
          \__msg_kernel_expandable_error:nnn
            { kernel } { fp-after-e } { dimension~#1 }
        \fi:
        \prg_return_false:
      \fi:
    \else:
      0
      \__msg_kernel_expandable_error:nnn
        { kernel } { fp-missing } { exponent }
      \prg_return_true:
    \fi:
  }
\cs_new_eq:cN { __fp_parse_prefix_+:Nw } \__fp_parse_one:Nw
\cs_new:Npn \__fp_parse_apply_unary:NNNwN #1#2#3#4@#5
  {
    #3 #2 #4 @
    \exp:w \exp_end_continue_f:w #5 #1
  }
\cs_set_protected:Npn \__fp_tmp:w #1#2#3#4
  {
    \cs_new:cpn { __fp_parse_prefix_ #1 :Nw } ##1
      {
        \exp_after:wN \__fp_parse_apply_unary:NNNwN
        \exp_after:wN ##1
        \exp_after:wN #4
        \exp_after:wN #3
        \exp:w
        \if_int_compare:w #2 < ##1
          \__fp_parse_operand:Nw ##1
        \else:
          \__fp_parse_operand:Nw #2
        \fi:
        \__fp_parse_expand:w
      }
  }
\__fp_tmp:w - \c__fp_prec_not_int \__fp_set_sign_o:w 2
\__fp_tmp:w ! \c__fp_prec_not_int \__fp_not_o:w ?
\cs_new:cpn { __fp_parse_prefix_.:Nw } #1
  {
    \exp_after:wN \__fp_parse_infix_after_operand:NwN
    \exp_after:wN #1
    \exp:w \exp_end_continue_f:w
      \exp_after:wN \__fp_sanitize:wN
      \__int_value:w \__int_eval:w 0 \__fp_parse_strim_zeros:N
  }
\cs_new:cpn { __fp_parse_prefix_(:Nw } #1
  {
    \exp_after:wN \__fp_parse_lparen_after:NwN
    \exp_after:wN #1
    \exp:w
    \if_int_compare:w #1 = \c__fp_prec_funcii_int
      \__fp_parse_operand:Nw \c__fp_prec_comma_int
    \else:
      \__fp_parse_operand:Nw \c__fp_prec_paren_int
    \fi:
    \__fp_parse_expand:w
  }
\cs_new:Npx \__fp_parse_lparen_after:NwN #1#2 @ #3
  {
    \exp_not:N \token_if_eq_meaning:NNTF #3
      \exp_not:c { __fp_parse_infix_):N }
      {
        \exp_not:N \__fp_exp_after_array_f:w #2 \s__fp_stop
        \exp_not:N \exp_after:wN
        \exp_not:N \__fp_parse_infix:NN
        \exp_not:N \exp_after:wN #1
        \exp_not:N \exp:w
        \exp_not:N \__fp_parse_expand:w
      }
      {
        \exp_not:N \__msg_kernel_expandable_error:nnn
          { kernel } { fp-missing } { ) }
        #2 @
        \exp_not:N \use_none:n #3
      }
  }
\cs_new:cpn { __fp_parse_prefix_):Nw } #1
  {
    \if_int_compare:w #1 = \c__fp_prec_comma_int
    \else:
      \__msg_kernel_expandable_error:nnn
        { kernel } { fp-missing-number } { ) }
      \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w
    \fi:
    \__fp_parse_infix:NN #1 )
  }
\cs_set_protected:Npn \__fp_tmp:w #1 #2
  {
    \cs_new:cpn { __fp_parse_word_#1:N }
      { \exp_after:wN #2 \exp:w \exp_end_continue_f:w \__fp_parse_infix:NN }
  }
\__fp_tmp:w { inf } \c_inf_fp
\__fp_tmp:w { nan } \c_nan_fp
\__fp_tmp:w { pi  } \c_pi_fp
\__fp_tmp:w { deg } \c_one_degree_fp
\__fp_tmp:w { true } \c_one_fp
\__fp_tmp:w { false } \c_zero_fp
\cs_new_eq:NN \__fp_parse_caseless_inf:N \__fp_parse_word_inf:N
\cs_new_eq:NN \__fp_parse_caseless_infinity:N \__fp_parse_word_inf:N
\cs_new_eq:NN \__fp_parse_caseless_nan:N \__fp_parse_word_nan:N
\cs_set_protected:Npn \__fp_tmp:w #1 #2
  {
    \cs_new:cpn { __fp_parse_word_#1:N }
      {
        \__fp_exp_after_f:nw { \__fp_parse_infix:NN }
        \s__fp \__fp_chk:w 10 #2 ;
      }
  }
\__fp_tmp:w {pt} { {1} {1000} {0000} {0000} {0000} }
\__fp_tmp:w {in} { {2} {7227} {0000} {0000} {0000} }
\__fp_tmp:w {pc} { {2} {1200} {0000} {0000} {0000} }
\__fp_tmp:w {cm} { {2} {2845} {2755} {9055} {1181} }
\__fp_tmp:w {mm} { {1} {2845} {2755} {9055} {1181} }
\__fp_tmp:w {dd} { {1} {1070} {0085} {6496} {0630} }
\__fp_tmp:w {cc} { {2} {1284} {0102} {7795} {2756} }
\__fp_tmp:w {nd} { {1} {1066} {9783} {4645} {6693} }
\__fp_tmp:w {nc} { {2} {1280} {3740} {1574} {8031} }
\__fp_tmp:w {bp} { {1} {1003} {7500} {0000} {0000} }
\__fp_tmp:w {sp} { {-4} {1525} {8789} {0625} {0000} }
\tl_map_inline:nn { {em} {ex} }
  {
    \cs_new:cpn { __fp_parse_word_#1:N }
      {
        \exp_after:wN \__fp_from_dim_test:ww
        \exp_after:wN 0 \exp_after:wN ,
        \__int_value:w \__dim_eval:w 1 #1 \exp_after:wN ;
        \exp:w \exp_end_continue_f:w \__fp_parse_infix:NN
      }
  }
\cs_new:Npn \__fp_parse_unary_function:NNN #1#2#3
  {
    \exp_after:wN \__fp_parse_apply_unary:NNNwN
    \exp_after:wN #3
    \exp_after:wN #2
    \exp_after:wN #1
    \exp:w
    \__fp_parse_operand:Nw \c__fp_prec_func_int \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_function:NNN #1#2#3
  {
    \exp_after:wN \__fp_parse_apply_unary:NNNwN
    \exp_after:wN #3
    \exp_after:wN #2
    \exp_after:wN #1
    \exp:w
    \__fp_parse_operand:Nw \c__fp_prec_funcii_int \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse:n #1
  {
    \exp:w
      \exp_after:wN \__fp_parse_after:ww
      \exp:w
        \__fp_parse_operand:Nw \c__fp_prec_end_int
        \__fp_parse_expand:w #1
        \s__fp_mark \__fp_parse_infix_end:N
      \s__fp_stop
  }
\cs_new:Npn \__fp_parse_after:ww
    #1@ \__fp_parse_infix_end:N \s__fp_stop
  { \exp_end: #1 }
\cs_new:Npn \__fp_parse_o:n #1
  {
    \exp_after:wN \exp_after:wN
    \exp_after:wN \__fp_exp_after_o:w
      \__fp_parse:n {#1}
  }
\cs_new:Npn \__fp_parse_operand:Nw #1
  {
    \exp_end_continue_f:w
    \exp_after:wN \__fp_parse_continue:NwN
    \exp_after:wN #1
    \exp:w \exp_end_continue_f:w
    \exp_after:wN \__fp_parse_one:Nw
    \exp_after:wN #1
    \exp:w
  }
\cs_new:Npn \__fp_parse_continue:NwN #1 #2 @ #3 { #3 #1 #2 @ }
\cs_new:Npn \__fp_parse_apply_binary:NwNwN #1 #2@ #3 #4@ #5
  {
    \exp_after:wN \__fp_parse_continue:NwN
    \exp_after:wN #1
    \exp:w \exp_end_continue_f:w \cs:w __fp_#3_o:ww \cs_end: #2 #4
    \exp:w \exp_end_continue_f:w #5 #1
  }
\cs_new:Npn \__fp_parse_infix_after_operand:NwN #1 #2;
  {
    \__fp_exp_after_f:nw { \__fp_parse_infix:NN #1 }
    #2;
  }
  \cs_new:Npn \__fp_parse_infix:NN #1 #2
    {
      \if_catcode:w \scan_stop: \exp_not:N #2
        \if_int_compare:w
            \__str_if_eq_x:nn { \s__fp_mark } { \exp_not:N #2 }
            = 0 \exp_stop_f:
          \exp_after:wN \exp_after:wN
          \exp_after:wN \__fp_parse_infix_mark:NNN
        \else:
          \exp_after:wN \exp_after:wN
          \exp_after:wN \__fp_parse_infix_juxtapose:N
        \fi:
      \else:
        \if_int_compare:w
            \__int_eval:w
              ( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26
            = 3 \exp_stop_f:
          \exp_after:wN \exp_after:wN
          \exp_after:wN \__fp_parse_infix_juxtapose:N
        \else:
          \exp_after:wN \__fp_parse_infix_check:NNN
          \cs:w
            __fp_parse_infix_ \token_to_str:N #2 :N
            \exp_after:wN \exp_after:wN \exp_after:wN
          \cs_end:
        \fi:
      \fi:
      #1
      #2
    }
\cs_new:Npx \__fp_parse_infix_check:NNN #1#2#3
  {
    \exp_not:N \if_meaning:w \scan_stop: #1
      \exp_not:N \__msg_kernel_expandable_error:nnn
        { kernel } { fp-missing } { * }
      \exp_not:N \exp_after:wN
      \exp_not:c { __fp_parse_infix_*:N }
      \exp_not:N \exp_after:wN #2
      \exp_not:N \exp_after:wN #3
    \exp_not:N \else:
      \exp_not:N \exp_after:wN #1
      \exp_not:N \exp_after:wN #2
      \exp_not:N \exp:w
      \exp_not:N \exp_after:wN
      \exp_not:N \__fp_parse_expand:w
    \exp_not:N \fi:
  }
\cs_new:Npn \__fp_parse_infix_mark:NNN #1#2#3 { #3 #1 }
\cs_new:Npn \__fp_parse_infix_end:N #1
  { @ \use_none:n \__fp_parse_infix_end:N }
\cs_set_protected:Npn \__fp_tmp:w #1
  {
    \cs_new:Npn #1 ##1
      {
        \if_int_compare:w ##1 < \c__fp_prec_paren_int
          \__msg_kernel_expandable_error:nnn { kernel } { fp-extra } { ) }
          \exp_after:wN \__fp_parse_infix:NN
          \exp_after:wN ##1
          \exp:w \exp_after:wN \__fp_parse_expand:w
        \else:
          \exp_after:wN @
          \exp_after:wN \use_none:n
          \exp_after:wN #1
        \fi:
      }
  }
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_):N }
\cs_set_protected:Npn \__fp_tmp:w #1
  {
    \cs_new:Npn #1 ##1
      {
        \if_int_compare:w ##1 > \c__fp_prec_comma_int
          \exp_after:wN @
          \exp_after:wN \use_none:n
          \exp_after:wN #1
        \else:
          \if_int_compare:w ##1 < \c__fp_prec_comma_int
            \__fp_parse_infix_comma_error:w
          \fi:
          \exp_after:wN \__fp_parse_infix_comma:w
          \exp:w \__fp_parse_operand:Nw \c__fp_prec_comma_int
          \exp_after:wN \__fp_parse_expand:w
        \fi:
      }
  }
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_,:N }
\cs_new:Npn \__fp_parse_infix_comma:w #1 @
  { #1 @ \use_none:n }
\cs_new:Npn \__fp_parse_infix_comma_error:w #1 \exp:w
  {
    \fi:
    \__msg_kernel_expandable_error:nn { kernel } { fp-extra-comma }
    \exp_after:wN @
    \exp_after:wN \__fp_parse_apply_binary:NwNwN
    \exp_after:wN ,
    \exp:w
  }
\cs_set_protected:Npn \__fp_tmp:w #1
  {
    \cs_new:Npn #1 ##1
      {
        \if_meaning:w \s__fp ##1
          \exp_after:wN \__fp_use_i_until_s:nw
          \exp_after:wN #1
        \fi:
        \exp_after:wN \c_nan_fp
        ##1
      }
  }
\exp_args:Nc \__fp_tmp:w { __fp_,_o:ww }
\cs_set_protected:Npn \__fp_tmp:w #1#2#3#4
  {
    \cs_new:Npn #1 ##1
      {
        \if_int_compare:w ##1 < #3
          \exp_after:wN @
          \exp_after:wN \__fp_parse_apply_binary:NwNwN
          \exp_after:wN #2
          \exp:w
          \__fp_parse_operand:Nw #4
          \exp_after:wN \__fp_parse_expand:w
        \else:
          \exp_after:wN @
          \exp_after:wN \use_none:n
          \exp_after:wN #1
        \fi:
      }
  }
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_^:N }   ^
  \c__fp_prec_hatii_int \c__fp_prec_hat_int
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_/:N }   /
  \c__fp_prec_times_int \c__fp_prec_times_int
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_mul:N } *
  \c__fp_prec_times_int \c__fp_prec_times_int
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_-:N }   -
  \c__fp_prec_plus_int  \c__fp_prec_plus_int
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_+:N }   +
  \c__fp_prec_plus_int  \c__fp_prec_plus_int
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_and:N } &
  \c__fp_prec_and_int   \c__fp_prec_and_int
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_or:N }  |
  \c__fp_prec_or_int    \c__fp_prec_or_int
\cs_new:cpn { __fp_parse_infix_(:N } #1
  { \__fp_parse_infix_juxtapose:N #1 ( }
\cs_new:Npn \__fp_parse_infix_juxtapose:N #1
  {
    \if_int_compare:w #1 < \c__fp_prec_times_int
      \exp_after:wN @
      \exp_after:wN \__fp_parse_apply_juxtapose:NwwN
      \exp:w
      \__fp_parse_operand:Nw \c__fp_prec_times_int
      \exp_after:wN \__fp_parse_expand:w
    \else:
      \exp_after:wN @
      \exp_after:wN \use_none:n
      \exp_after:wN \__fp_parse_infix_juxtapose:N
    \fi:
  }
\cs_new:Npn \__fp_parse_apply_juxtapose:NwwN #1 #2;#3@ #4;#5@
  {
    \if_catcode:w ^ \tl_to_str:n { #3 #5 } ^
    \else:
      \__fp_error:nffn { fp-invalid-ii }
        { \__fp_array_to_clist:n { #2; #3 } }
        { \__fp_array_to_clist:n { #4; #5 } }
        { }
    \fi:
    \__fp_parse_apply_binary:NwNwN #1 #2;@ * #4;@
  }
\cs_set_protected:Npn \__fp_tmp:w #1
  {
    \cs_new:cpn { __fp_parse_infix_*:N } ##1##2
      {
        \if:w * \exp_not:N ##2
          \exp_after:wN #1
          \exp_after:wN ##1
        \else:
          \exp_after:wN \__fp_parse_infix_mul:N
          \exp_after:wN ##1
          \exp_after:wN ##2
        \fi:
      }
  }
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_^:N }
\cs_set_protected:Npn \__fp_tmp:w #1#2#3
  {
    \cs_new:Npn #1 ##1##2
      {
        \if:w #2 \exp_not:N ##2
          \exp_after:wN #1
          \exp_after:wN ##1
          \exp:w \exp_after:wN \__fp_parse_expand:w
        \else:
          \exp_after:wN #3
          \exp_after:wN ##1
          \exp_after:wN ##2
        \fi:
      }
  }
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_|:N } | \__fp_parse_infix_or:N
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_&:N } & \__fp_parse_infix_and:N
\cs_set_protected:Npn \__fp_tmp:w #1#2#3#4
  {
    \cs_new:Npn #1 ##1
      {
        \if_int_compare:w ##1 < \c__fp_prec_quest_int
          #4
          \exp_after:wN @
          \exp_after:wN #2
          \exp:w
          \__fp_parse_operand:Nw #3
          \exp_after:wN \__fp_parse_expand:w
        \else:
          \exp_after:wN @
          \exp_after:wN \use_none:n
          \exp_after:wN #1
        \fi:
      }
  }
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_?:N }
  \__fp_ternary:NwwN \c__fp_prec_quest_int { }
\exp_args:Nc \__fp_tmp:w { __fp_parse_infix_::N }
  \__fp_ternary_auxii:NwwN \c__fp_prec_colon_int
  {
    \__msg_kernel_expandable_error:nnnn
      { kernel } { fp-missing } { ? } { ~for~?: }
  }
\cs_new:cpn { __fp_parse_infix_<:N } #1
  { \__fp_parse_compare:NNNNNNN #1 1 0 0 0 0 < }
\cs_new:cpn { __fp_parse_infix_=:N } #1
  { \__fp_parse_compare:NNNNNNN #1 1 0 0 0 0 = }
\cs_new:cpn { __fp_parse_infix_>:N } #1
  { \__fp_parse_compare:NNNNNNN #1 1 0 0 0 0 > }
\cs_new:cpn { __fp_parse_infix_!:N } #1
  {
    \exp_after:wN \__fp_parse_compare:NNNNNNN
    \exp_after:wN #1
    \exp_after:wN 0
    \exp_after:wN 1
    \exp_after:wN 1
    \exp_after:wN 1
    \exp_after:wN 1
  }
\cs_new:Npn \__fp_parse_excl_error:
  {
    \__msg_kernel_expandable_error:nnnn
      { kernel } { fp-missing } { = } { ~after~!. }
  }
\cs_new:Npn \__fp_parse_compare:NNNNNNN #1
  {
    \if_int_compare:w #1 < \c__fp_prec_comp_int
      \exp_after:wN \__fp_parse_compare_auxi:NNNNNNN
      \exp_after:wN \__fp_parse_excl_error:
    \else:
      \exp_after:wN @
      \exp_after:wN \use_none:n
      \exp_after:wN \__fp_parse_compare:NNNNNNN
    \fi:
  }
\cs_new:Npn \__fp_parse_compare_auxi:NNNNNNN #1#2#3#4#5#6#7
  {
    \if_case:w
      \__int_eval:w \exp_after:wN ` \token_to_str:N #7 - `< \__int_eval_end:
         \__fp_parse_compare_auxii:NNNNN #2#2#4#5#6
    \or: \__fp_parse_compare_auxii:NNNNN #2#3#2#5#6
    \or: \__fp_parse_compare_auxii:NNNNN #2#3#4#2#6
    \or: \__fp_parse_compare_auxii:NNNNN #2#3#4#5#2
    \else: #1 \__fp_parse_compare_end:NNNNw #3#4#5#6#7
    \fi:
  }
\cs_new:Npn \__fp_parse_compare_auxii:NNNNN #1#2#3#4#5
  {
    \exp_after:wN \__fp_parse_compare_auxi:NNNNNNN
    \exp_after:wN \prg_do_nothing:
    \exp_after:wN #1
    \exp_after:wN #2
    \exp_after:wN #3
    \exp_after:wN #4
    \exp_after:wN #5
    \exp:w \exp_after:wN \__fp_parse_expand:w
  }
\cs_new:Npn \__fp_parse_compare_end:NNNNw #1#2#3#4#5 \fi:
  {
    \fi:
    \exp_after:wN @
    \exp_after:wN \__fp_parse_apply_compare:NwNNNNNwN
    \exp_after:wN \c_one_fp
    \exp_after:wN #1
    \exp_after:wN #2
    \exp_after:wN #3
    \exp_after:wN #4
    \exp:w
    \__fp_parse_operand:Nw \c__fp_prec_comp_int \__fp_parse_expand:w #5
  }
\cs_new:Npn \__fp_parse_apply_compare:NwNNNNNwN
    #1 #2@ #3 #4#5#6#7 #8@ #9
  {
    \if_int_odd:w
        \if_meaning:w \c_zero_fp #3
          0
        \else:
          \if_case:w \__fp_compare_back:ww #8 #2 \exp_stop_f:
            #5 \or: #6 \or: #7 \else: #4
          \fi:
        \fi:
        \exp_stop_f:
      \exp_after:wN \__fp_parse_apply_compare_aux:NNwN
      \exp_after:wN \c_one_fp
    \else:
      \exp_after:wN \__fp_parse_apply_compare_aux:NNwN
      \exp_after:wN \c_zero_fp
    \fi:
    #1 #8 #9
  }
\cs_new:Npn \__fp_parse_apply_compare_aux:NNwN #1 #2 #3; #4
  {
    \if_meaning:w \__fp_parse_compare:NNNNNNN #4
      \exp_after:wN \__fp_parse_continue_compare:NNwNN
      \exp_after:wN #1
      \exp_after:wN #2
      \exp:w \exp_end_continue_f:w
      \__fp_exp_after_o:w #3;
      \exp:w \exp_end_continue_f:w
    \else:
      \exp_after:wN \__fp_parse_continue:NwN
      \exp_after:wN #2
      \exp:w \exp_end_continue_f:w
      \exp_after:wN #1
      \exp:w \exp_end_continue_f:w
    \fi:
    #4 #2
  }
\cs_new:Npn \__fp_parse_continue_compare:NNwNN #1#2 #3@ #4#5
  { #4 #2 #3@ #1 }
\cs_new:Npn \fp_function:Nw #1
  {
    \exp_after:wN \__fp_function_apply:nw
    \exp_after:wN #1
    \exp:w
      \__fp_parse_operand:Nw \c__fp_prec_funcii_int \__fp_parse_expand:w
  }
\cs_new_protected:Npn \fp_new_function:Npn #1#2#
  {
    \__fp_new_function:Ncfnn #1
      { __fp_user_ \cs_to_str:N #1 }
      { \int_eval:n { \tl_count:n {#2} / 2 } }
      {#2}
  }
\cs_new_protected:Npn \__fp_new_function:NNnnn #1#2#3#4#5
  {
    \cs_new:Npn #1
      {
        \exp_after:wN \__fp_function_apply:nw \exp_after:wN
          {
            \exp_after:wN \__fp_function_args:Nwn
            \exp_after:wN #2
            \__int_value:w #3 \exp_after:wN ; \exp_after:wN
          }
        \exp:w
          \__fp_parse_operand:Nw \c__fp_prec_funcii_int \__fp_parse_expand:w
      }
    \cs_new:Npn #2 #4 {#5}
  }
\cs_generate_variant:Nn \__fp_new_function:NNnnn { Ncf }
\cs_new:Npn \__fp_function_args:Nwn #1#2; #3
  {
    \int_compare:nNnTF { \tl_count:n {#3} } = {#2}
      { #1 #3 }
      {
        \__msg_kernel_expandable_error:nnnnn
          { kernel } { fp-num-args } { #1() } {#2} {#2}
        \c_nan_fp
      }
  }
\cs_new:Npn \__fp_function_apply:nw #1#2 @
  {
    \__fp_parse:n
      {
        \__fp_function_store:wwNwnn #2
          \s__fp_mark \__fp_function_store:wwNwnn ;
          \s__fp_mark \__fp_function_store_end:wnnn
        \s__fp_stop { } { } {#1}
      }
    \s__fp_mark
  }
\cs_new:Npn \__fp_function_store:wwNwnn
    #1; #2 \s__fp_mark #3#4 \s__fp_stop #5#6
  { #3 #2 \s__fp_mark #3#4 \s__fp_stop { #5 #6 } { { #1; } } }
\cs_new:Npn \__fp_function_store_end:wnnn
    #1 \s__fp_stop #2#3#4
  { #4 {#2} }
\__msg_kernel_new:nnn { kernel } { fp-deprecated }
  { '#1'~deprecated;~use~'#2' }
\__msg_kernel_new:nnn { kernel } { unknown-fp-word }
  { Unknown~fp~word~#1. }
\__msg_kernel_new:nnn { kernel } { fp-missing }
  { Missing~#1~inserted #2. }
\__msg_kernel_new:nnn { kernel } { fp-extra }
  { Extra~#1~ignored. }
\__msg_kernel_new:nnn { kernel } { fp-early-end }
  { Premature~end~in~fp~expression. }
\__msg_kernel_new:nnn { kernel } { fp-after-e }
  { Cannot~use~#1 after~'e'. }
\__msg_kernel_new:nnn { kernel } { fp-missing-number }
  { Missing~number~before~'#1'. }
\__msg_kernel_new:nnn { kernel } { fp-unknown-symbol }
  { Unknown~symbol~#1~ignored. }
\__msg_kernel_new:nnn { kernel } { fp-extra-comma }
  { Unexpected~comma:~extra~arguments~ignored. }
\__msg_kernel_new:nnn { kernel } { fp-num-args }
  { #1~expects~between~#2~and~#3~arguments. }
\cs_if_exist:cT { @unexpandable@protect }
  {
    \__msg_kernel_new:nnn { kernel } { fp-robust-cmd }
      { Robust~command~#1 invalid~in~fp~expression! }
  }
%% File: l3fp-logic.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project
\cs_new:Npn \__fp_parse_word_max:N
  { \__fp_parse_function:NNN \__fp_minmax_o:Nw 2 }
\cs_new:Npn \__fp_parse_word_min:N
  { \__fp_parse_function:NNN \__fp_minmax_o:Nw 0 }
\prg_new_eq_conditional:NNn \fp_if_exist:N \cs_if_exist:N { TF , T , F , p }
\prg_new_eq_conditional:NNn \fp_if_exist:c \cs_if_exist:c { TF , T , F , p }
\prg_new_conditional:Npnn \fp_compare:n #1 { p , T , F , TF }
  {
    \exp_after:wN \__fp_compare_return:w
    \exp:w \exp_end_continue_f:w \__fp_parse:n {#1}
  }
\cs_new:Npn \__fp_compare_return:w \s__fp \__fp_chk:w #1#2;
  {
    \if_meaning:w 0 #1
      \prg_return_false:
    \else:
      \prg_return_true:
    \fi:
  }
\prg_new_conditional:Npnn \fp_compare:nNn #1#2#3 { p , T , F , TF }
  {
    \if_int_compare:w
        \exp_after:wN \__fp_compare_aux:wn
          \exp:w \exp_end_continue_f:w \__fp_parse:n {#1} {#3}
        = \__int_eval:w `#2 - `= \__int_eval_end:
      \prg_return_true:
    \else:
      \prg_return_false:
    \fi:
  }
\cs_new:Npn \__fp_compare_aux:wn #1; #2
  {
    \exp_after:wN \__fp_compare_back:ww
      \exp:w \exp_end_continue_f:w \__fp_parse:n {#2} #1;
  }
\cs_new:Npn \__fp_compare_back:ww
    \s__fp \__fp_chk:w #1 #2 #3;
    \s__fp \__fp_chk:w #4 #5 #6;
  {
    \__int_value:w
      \if_meaning:w 3 #1 \exp_after:wN \__fp_compare_nan:w \fi:
      \if_meaning:w 3 #4 \exp_after:wN \__fp_compare_nan:w \fi:
      \if_meaning:w 2 #5 - \fi:
      \if_meaning:w #2 #5
        \if_meaning:w #1 #4
          \if_meaning:w 1 #1
            \__fp_compare_npos:nwnw #6; #3;
          \else:
            0
          \fi:
        \else:
          \if_int_compare:w #4 < #1 - \fi: 1
        \fi:
      \else:
        \if_int_compare:w #1#4 = 0 \exp_stop_f:
          0
        \else:
          1
        \fi:
      \fi:
    \exp_stop_f:
  }
\cs_new:Npn \__fp_compare_nan:w #1 \fi: \exp_stop_f: { 2 \exp_stop_f: }
\cs_new:Npn \__fp_compare_npos:nwnw #1#2; #3#4;
  {
    \if_int_compare:w #1 = #3 \exp_stop_f:
      \__fp_compare_significand:nnnnnnnn #2 #4
    \else:
      \if_int_compare:w #1 < #3 - \fi: 1
    \fi:
  }
\cs_new:Npn \__fp_compare_significand:nnnnnnnn #1#2#3#4#5#6#7#8
  {
    \if_int_compare:w #1#2 = #5#6 \exp_stop_f:
      \if_int_compare:w #3#4 = #7#8 \exp_stop_f:
        0
      \else:
        \if_int_compare:w #3#4 < #7#8 - \fi: 1
      \fi:
    \else:
      \if_int_compare:w #1#2 < #5#6 - \fi: 1
    \fi:
  }
\cs_new:Npn \fp_do_until:nn #1#2
  {
    #2
    \fp_compare:nF {#1}
      { \fp_do_until:nn {#1} {#2} }
  }
\cs_new:Npn \fp_do_while:nn #1#2
  {
    #2
    \fp_compare:nT {#1}
      { \fp_do_while:nn {#1} {#2} }
  }
\cs_new:Npn \fp_until_do:nn #1#2
  {
    \fp_compare:nF {#1}
      {
        #2
        \fp_until_do:nn {#1} {#2}
      }
  }
\cs_new:Npn \fp_while_do:nn #1#2
  {
    \fp_compare:nT {#1}
      {
        #2
        \fp_while_do:nn {#1} {#2}
      }
  }
\cs_new:Npn \fp_do_until:nNnn #1#2#3#4
  {
    #4
    \fp_compare:nNnF {#1} #2 {#3}
      { \fp_do_until:nNnn {#1} #2 {#3} {#4} }
  }
\cs_new:Npn \fp_do_while:nNnn #1#2#3#4
  {
    #4
    \fp_compare:nNnT {#1} #2 {#3}
      { \fp_do_while:nNnn {#1} #2 {#3} {#4} }
  }
\cs_new:Npn \fp_until_do:nNnn #1#2#3#4
  {
    \fp_compare:nNnF {#1} #2 {#3}
      {
        #4
        \fp_until_do:nNnn {#1} #2 {#3} {#4}
      }
  }
\cs_new:Npn \fp_while_do:nNnn #1#2#3#4
  {
    \fp_compare:nNnT {#1} #2 {#3}
      {
        #4
        \fp_while_do:nNnn {#1} #2 {#3} {#4}
      }
  }
\cs_new:Npn \fp_step_function:nnnN #1#2#3
  {
    \exp_after:wN \__fp_step:wwwN
      \exp:w \exp_end_continue_f:w \__fp_parse_o:n {#1}
      \exp:w \exp_end_continue_f:w \__fp_parse_o:n {#2}
      \exp:w \exp_end_continue_f:w \__fp_parse:n {#3}
  }
\cs_generate_variant:Nn \fp_step_function:nnnN { nnnc }
\cs_new:Npn \__fp_step:wwwN #1 ; \s__fp \__fp_chk:w #2#3#4 ; #5; #6
  {
    \token_if_eq_meaning:NNTF #2 1
      {
        \token_if_eq_meaning:NNTF #3 0
          { \__fp_step:NnnnnN > }
          { \__fp_step:NnnnnN < }
      }
      {
        \token_if_eq_meaning:NNTF #2 0
          { \__msg_kernel_expandable_error:nnn { kernel } { zero-step } {#6} }
          {
            \__fp_error:nnfn { fp-bad-step } { }
              { \fp_to_tl:n { \s__fp \__fp_chk:w #2#3#4 ; } } {#6}
          }
        \use_none:nnnnn
      }
      { #1 ; } { \c_nan_fp } { \s__fp \__fp_chk:w #2#3#4 ; } { #5 ; } #6
  }
\cs_new:Npn \__fp_step:NnnnnN #1#2#3#4#5#6
  {
    \fp_compare:nNnTF {#2} = {#3}
      {
        \__fp_error:nffn { fp-tiny-step }
          { \fp_to_tl:n {#3} } { \fp_to_tl:n {#4} } {#6}
      }
      {
        \fp_compare:nNnF {#2} #1 {#5}
          {
            \exp_args:Nf #6 { \__fp_to_decimal_dispatch:w #2 }
            \__fp_step:NfnnnN
              #1 { \__fp_parse:n { #2 + #4 } } {#2} {#4} {#5} #6
          }
      }
  }
\cs_generate_variant:Nn \__fp_step:NnnnnN { Nf }
\cs_new_protected:Npn \fp_step_inline:nnnn
  {
    \int_gincr:N \g__prg_map_int
    \exp_args:NNc \__fp_step:NNnnnn
      \cs_gset_protected:Npn
      { __prg_map_ \int_use:N \g__prg_map_int :w }
  }
\cs_new_protected:Npn \fp_step_variable:nnnNn #1#2#3#4#5
  {
    \int_gincr:N \g__prg_map_int
    \exp_args:NNc \__fp_step:NNnnnn
      \cs_gset_protected:Npx
      { __prg_map_ \int_use:N \g__prg_map_int :w }
      {#1} {#2} {#3}
      {
        \tl_set:Nn \exp_not:N #4 {##1}
        \exp_not:n {#5}
      }
  }
\cs_new_protected:Npn \__fp_step:NNnnnn #1#2#3#4#5#6
  {
    #1 #2 ##1 {#6}
    \fp_step_function:nnnN {#3} {#4} {#5} #2
    \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int }
  }
\__msg_kernel_new:nnn { kernel } { fp-bad-step }
  { Invalid~step~size~#2~in~step~function~#3. }
\__msg_kernel_new:nnn { kernel } { fp-tiny-step }
  { Tiny~step~size~(#1+#2=#1)~in~step~function~#3. }
\cs_new:Npn \__fp_minmax_o:Nw #1#2 @
  {
    \if_meaning:w 0 #1
      \exp_after:wN \__fp_minmax_loop:Nww \exp_after:wN +
    \else:
      \exp_after:wN \__fp_minmax_loop:Nww \exp_after:wN -
    \fi:
    #2
    \s__fp \__fp_chk:w 2 #1 \s__fp_exact ;
    \s__fp \__fp_chk:w { 3 \__fp_minmax_break_o:w } ;
  }
\cs_new:Npn \__fp_minmax_loop:Nww
    #1 \s__fp \__fp_chk:w #2#3; \s__fp \__fp_chk:w #4#5;
  {
    \if_meaning:w 3 #4
      \if_meaning:w 3 #2
        \__fp_minmax_auxi:ww
      \else:
        \__fp_minmax_auxii:ww
      \fi:
    \else:
      \if_int_compare:w
          \__fp_compare_back:ww
            \s__fp \__fp_chk:w #4#5;
            \s__fp \__fp_chk:w #2#3;
          = #1 1 \exp_stop_f:
        \__fp_minmax_auxii:ww
      \else:
        \__fp_minmax_auxi:ww
      \fi:
    \fi:
    \__fp_minmax_loop:Nww #1
      \s__fp \__fp_chk:w #2#3;
      \s__fp \__fp_chk:w #4#5;
  }
\cs_new:Npn \__fp_minmax_auxi:ww  #1 \fi: \fi: #2 \s__fp #3 ; \s__fp #4;
  { \fi: \fi: #2 \s__fp #3 ; }
\cs_new:Npn \__fp_minmax_auxii:ww #1 \fi: \fi: #2 \s__fp #3 ;
  { \fi: \fi: #2 }
\cs_new:Npn \__fp_minmax_break_o:w #1 \fi: \fi: #2 \s__fp #3; #4;
  { \fi: \__fp_exp_after_o:w \s__fp #3; }
\cs_new:cpn { __fp_not_o:w } #1 \s__fp \__fp_chk:w #2#3; @
  {
    \if_meaning:w 0 #2
      \exp_after:wN \exp_after:wN \exp_after:wN \c_one_fp
    \else:
      \exp_after:wN \exp_after:wN \exp_after:wN \c_zero_fp
    \fi:
  }
\group_begin:
  \char_set_catcode_letter:N &
  \char_set_catcode_letter:N |
  \cs_new:Npn \__fp_&_o:ww #1 \s__fp \__fp_chk:w #2#3;
    {
      \if_meaning:w 0 #2 #1
        \__fp_and_return:wNw \s__fp \__fp_chk:w #2#3;
      \fi:
      \__fp_exp_after_o:w
    }
  \cs_new:Npn \__fp_|_o:ww { \__fp_&_o:ww \else: }
\group_end:
\cs_new:Npn \__fp_and_return:wNw #1; \fi: #2#3; { \fi: #2 #1; }
\cs_new:Npn \__fp_ternary:NwwN #1 #2@ #3@ #4
  {
    \if_meaning:w \__fp_parse_infix_::N #4
      \__fp_ternary_loop:Nw
        #2
        \s__fp \__fp_chk:w { \__fp_ternary_loop_break:w } ;
      \__fp_ternary_break_point:n { \exp_after:wN \__fp_ternary_auxi:NwwN }
      \exp_after:wN #1
      \exp:w \exp_end_continue_f:w
      \__fp_exp_after_array_f:w #3 \s__fp_stop
      \exp_after:wN @
      \exp:w
        \__fp_parse_operand:Nw \c__fp_prec_colon_int
        \__fp_parse_expand:w
    \else:
      \__msg_kernel_expandable_error:nnnn
        { kernel } { fp-missing } { : } { ~for~?: }
      \exp_after:wN \__fp_parse_continue:NwN
      \exp_after:wN #1
      \exp:w \exp_end_continue_f:w
      \__fp_exp_after_array_f:w #3 \s__fp_stop
      \exp_after:wN #4
      \exp_after:wN #1
    \fi:
  }
\cs_new:Npn \__fp_ternary_loop_break:w
    #1 \fi: #2 \__fp_ternary_break_point:n #3
  {
    0 = 0 \exp_stop_f: \fi:
    \exp_after:wN \__fp_ternary_auxii:NwwN
  }
\cs_new:Npn \__fp_ternary_loop:Nw \s__fp \__fp_chk:w #1#2;
  {
    \if_int_compare:w #1 > 0 \exp_stop_f:
      \exp_after:wN \__fp_ternary_map_break:
    \fi:
    \__fp_ternary_loop:Nw
  }
\cs_new:Npn \__fp_ternary_map_break: #1 \__fp_ternary_break_point:n #2 {#2}
\cs_new:Npn \__fp_ternary_auxi:NwwN #1#2@#3@#4
  {
    \exp_after:wN \__fp_parse_continue:NwN
    \exp_after:wN #1
    \exp:w \exp_end_continue_f:w
    \__fp_exp_after_array_f:w #2 \s__fp_stop
    #4 #1
  }
\cs_new:Npn \__fp_ternary_auxii:NwwN #1#2@#3@#4
  {
    \exp_after:wN \__fp_parse_continue:NwN
    \exp_after:wN #1
    \exp:w \exp_end_continue_f:w
    \__fp_exp_after_array_f:w #3 \s__fp_stop
    #4 #1
  }
%% File: l3fp-basics.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project
\cs_new:Npn \__fp_parse_word_abs:N
  { \__fp_parse_unary_function:NNN \__fp_set_sign_o:w 0 }
\cs_new:Npn \__fp_parse_word_sign:N
  { \__fp_parse_unary_function:NNN \__fp_sign_o:w ? }
\cs_new:Npn \__fp_parse_word_sqrt:N
  { \__fp_parse_unary_function:NNN \__fp_sqrt_o:w ? }
\cs_new:cpx { __fp_-_o:ww } \s__fp
  {
    \exp_not:c { __fp_+_o:ww }
    \exp_not:n { \s__fp \__fp_neg_sign:N }
  }
\cs_new:cpn { __fp_+_o:ww }
    \s__fp #1 \__fp_chk:w #2 #3 ; \s__fp \__fp_chk:w #4 #5
  {
    \if_case:w
      \if_meaning:w #2 #4
        #2
      \else:
        \if_int_compare:w #2 > #4 \exp_stop_f:
          3
        \else:
          4
        \fi:
      \fi:
      \exp_stop_f:
           \exp_after:wN \__fp_add_zeros_o:Nww \__int_value:w
    \or:   \exp_after:wN \__fp_add_normal_o:Nww \__int_value:w
    \or:   \exp_after:wN \__fp_add_inf_o:Nww \__int_value:w
    \or:   \__fp_case_return_i_o:ww
    \else: \exp_after:wN \__fp_add_return_ii_o:Nww \__int_value:w
    \fi:
    #1 #5
    \s__fp \__fp_chk:w #2 #3 ;
    \s__fp \__fp_chk:w #4 #5
  }
\cs_new:Npn \__fp_add_return_ii_o:Nww #1 #2 ; \s__fp \__fp_chk:w #3 #4
  { \__fp_exp_after_o:w \s__fp \__fp_chk:w #3 #1 }
\cs_new:Npn \__fp_add_zeros_o:Nww #1 \s__fp \__fp_chk:w 0 #2
  {
    \if_int_compare:w #2 #1 = 20 \exp_stop_f:
      \exp_after:wN \__fp_add_return_ii_o:Nww
    \else:
      \__fp_case_return_i_o:ww
    \fi:
    #1
    \s__fp \__fp_chk:w 0 #2
  }
\cs_new:Npn \__fp_add_inf_o:Nww
    #1 \s__fp \__fp_chk:w 2 #2 #3; \s__fp \__fp_chk:w 2 #4
  {
    \if_meaning:w #1 #2
      \__fp_case_return_i_o:ww
    \else:
      \__fp_case_use:nw
        {
          \exp_last_unbraced:Nf \__fp_invalid_operation_o:Nww
            { \token_if_eq_meaning:NNTF #1 #4 + - }
        }
    \fi:
    \s__fp \__fp_chk:w 2 #2 #3;
    \s__fp \__fp_chk:w 2 #4
  }
\cs_new:Npn \__fp_add_normal_o:Nww #1 \s__fp \__fp_chk:w 1 #2
  {
    \if_meaning:w #1#2
      \exp_after:wN \__fp_add_npos_o:NnwNnw
    \else:
      \exp_after:wN \__fp_sub_npos_o:NnwNnw
    \fi:
    #2
  }
\cs_new:Npn \__fp_add_npos_o:NnwNnw #1#2#3 ; \s__fp \__fp_chk:w 1 #4 #5
  {
    \exp_after:wN \__fp_sanitize:Nw
    \exp_after:wN #1
    \__int_value:w \__int_eval:w
      \if_int_compare:w #2 > #5 \exp_stop_f:
        #2
        \exp_after:wN \__fp_add_big_i_o:wNww \__int_value:w -
      \else:
        #5
        \exp_after:wN \__fp_add_big_ii_o:wNww \__int_value:w
      \fi:
      \__int_eval:w #5 - #2 ; #1 #3;
  }
\cs_new:Npn \__fp_add_big_i_o:wNww #1; #2 #3; #4;
  {
    \__fp_decimate:nNnnnn {#1}
      \__fp_add_significand_o:NnnwnnnnN
      #4
    #3
    #2
  }
\cs_new:Npn \__fp_add_big_ii_o:wNww #1; #2 #3; #4;
  {
    \__fp_decimate:nNnnnn {#1}
      \__fp_add_significand_o:NnnwnnnnN
      #3
    #4
    #2
  }
\cs_new:Npn \__fp_add_significand_o:NnnwnnnnN #1 #2#3 #4; #5#6#7#8
  {
    \exp_after:wN \__fp_add_significand_test_o:N
    \__int_value:w \__int_eval:w 1#5#6 + #2
      \exp_after:wN \__fp_add_significand_pack:NNNNNNN
      \__int_value:w \__int_eval:w 1#7#8 + #3 ; #1
  }
\cs_new:Npn \__fp_add_significand_pack:NNNNNNN #1 #2#3#4#5#6#7
  {
    \if_meaning:w 2 #1
      + 1
    \fi:
    ; #2 #3 #4 #5 #6 #7 ;
  }
\cs_new:Npn \__fp_add_significand_test_o:N #1
  {
    \if_meaning:w 2 #1
      \exp_after:wN \__fp_add_significand_carry_o:wwwNN
    \else:
      \exp_after:wN \__fp_add_significand_no_carry_o:wwwNN
    \fi:
  }
\cs_new:Npn \__fp_add_significand_no_carry_o:wwwNN
    #1; #2; #3#4 ; #5#6
  {
    \exp_after:wN \__fp_basics_pack_high:NNNNNw
    \__int_value:w \__int_eval:w 1 #1
      \exp_after:wN \__fp_basics_pack_low:NNNNNw
      \__int_value:w \__int_eval:w 1 #2 #3#4
        + \__fp_round:NNN #6 #4 #5
        \exp_after:wN ;
  }
\cs_new:Npn \__fp_add_significand_carry_o:wwwNN
    #1; #2; #3#4; #5#6
  {
    + 1
    \exp_after:wN \__fp_basics_pack_weird_high:NNNNNNNNw
    \__int_value:w \__int_eval:w 1 1 #1
      \exp_after:wN \__fp_basics_pack_weird_low:NNNNw
      \__int_value:w \__int_eval:w 1 #2#3 +
        \exp_after:wN \__fp_round:NNN
        \exp_after:wN #6
        \exp_after:wN #3
        \__int_value:w \__fp_round_digit:Nw #4 #5 ;
        \exp_after:wN ;
  }
\cs_new:Npn \__fp_sub_npos_o:NnwNnw #1#2#3; \s__fp \__fp_chk:w 1 #4#5#6;
  {
    \if_case:w \__fp_compare_npos:nwnw {#2} #3; {#5} #6; \exp_stop_f:
      \exp_after:wN \__fp_sub_eq_o:Nnwnw
    \or:
      \exp_after:wN \__fp_sub_npos_i_o:Nnwnw
    \else:
      \exp_after:wN \__fp_sub_npos_ii_o:Nnwnw
    \fi:
    #1 {#2} #3; {#5} #6;
  }
\cs_new:Npn \__fp_sub_eq_o:Nnwnw #1#2; #3; { \exp_after:wN \c_zero_fp }
\cs_new:Npn \__fp_sub_npos_ii_o:Nnwnw #1 #2; #3;
  {
    \exp_after:wN \__fp_sub_npos_i_o:Nnwnw
      \__int_value:w \__fp_neg_sign:N #1
      #3; #2;
  }
\cs_new:Npn \__fp_sub_npos_i_o:Nnwnw #1 #2#3; #4#5;
  {
    \exp_after:wN \__fp_sanitize:Nw
    \exp_after:wN #1
    \__int_value:w \__int_eval:w
      #2
      \if_int_compare:w #2 = #4 \exp_stop_f:
        \exp_after:wN \__fp_sub_back_near_o:nnnnnnnnN
      \else:
        \exp_after:wN \__fp_decimate:nNnnnn \exp_after:wN
          { \__int_value:w \__int_eval:w #2 - #4 - 1 \exp_after:wN }
          \exp_after:wN \__fp_sub_back_far_o:NnnwnnnnN
      \fi:
        #5
      #3
      #1
  }
\cs_new:Npn \__fp_sub_back_near_o:nnnnnnnnN #1#2#3#4 #5#6#7#8 #9
  {
    \exp_after:wN \__fp_sub_back_near_after:wNNNNw
    \__int_value:w \__int_eval:w 10#5#6 - #1#2 - 11
      \exp_after:wN \__fp_sub_back_near_pack:NNNNNNw
      \__int_value:w \__int_eval:w 11#7#8 - #3#4 \exp_after:wN ;
  }
\cs_new:Npn \__fp_sub_back_near_pack:NNNNNNw #1#2#3#4#5#6#7 ;
  { + #1#2 ; {#3#4#5#6} {#7} ; }
\cs_new:Npn \__fp_sub_back_near_after:wNNNNw 10 #1#2#3#4 #5 ;
  {
    \if_meaning:w 0 #1
      \exp_after:wN \__fp_sub_back_shift:wnnnn
    \fi:
    ; {#1#2#3#4} {#5}
  }
\cs_new:Npn \__fp_sub_back_shift:wnnnn ; #1#2
  {
    \exp_after:wN \__fp_sub_back_shift_ii:ww
    \__int_value:w #1 #2 0 ;
  }
\cs_new:Npn \__fp_sub_back_shift_ii:ww #1 0 ; #2#3 ;
  {
    \if_meaning:w @ #1 @
      - 7
      - \exp_after:wN \use_i:nnn
        \exp_after:wN \__fp_sub_back_shift_iii:NNNNNNNNw
        \__int_value:w #2#3 0 ~ 123456789;
    \else:
      - \__fp_sub_back_shift_iii:NNNNNNNNw #1 123456789;
    \fi:
    \exp_after:wN \__fp_pack_twice_four:wNNNNNNNN
    \exp_after:wN \__fp_pack_twice_four:wNNNNNNNN
    \exp_after:wN \__fp_sub_back_shift_iv:nnnnw
    \exp_after:wN ;
    \__int_value:w
    #1 ~ #2#3 0 ~ 0000 0000 0000 000 ;
  }
\cs_new:Npn \__fp_sub_back_shift_iii:NNNNNNNNw #1#2#3#4#5#6#7#8#9; {#8}
\cs_new:Npn \__fp_sub_back_shift_iv:nnnnw #1 ; #2 ; { ; #1 ; }
\cs_new:Npn \__fp_sub_back_far_o:NnnwnnnnN #1 #2#3 #4; #5#6#7#8
  {
    \if_case:w
      \if_int_compare:w 1 #2 = #5#6 \use_i:nnnn #7 \exp_stop_f:
        \if_int_compare:w #3 = \use_none:n #7#8 0 \exp_stop_f:
          0
        \else:
          \if_int_compare:w #3 > \use_none:n #7#8 0 - \fi: 1
        \fi:
      \else:
        \if_int_compare:w 1 #2 > #5#6 \use_i:nnnn #7 - \fi: 1
      \fi:
      \exp_stop_f:
           \exp_after:wN \__fp_sub_back_quite_far_o:wwNN
    \or:   \exp_after:wN \__fp_sub_back_very_far_o:wwwwNN
    \else: \exp_after:wN \__fp_sub_back_not_far_o:wwwwNN
    \fi:
    #2 ~ #3 ; #5 #6 ~ #7 #8 ; #1
  }
\cs_new:Npn \__fp_sub_back_quite_far_o:wwNN #1; #2; #3#4
  {
    \exp_after:wN \__fp_sub_back_quite_far_ii:NN
    \exp_after:wN #3
    \exp_after:wN #4
  }
\cs_new:Npn \__fp_sub_back_quite_far_ii:NN #1#2
  {
    \if_case:w \__fp_round_neg:NNN #2 0 #1
      \exp_after:wN \use_i:nn
    \else:
      \exp_after:wN \use_ii:nn
    \fi:
      { ; {1000} {0000} {0000} {0000} ; }
      { - 1 ; {9999} {9999} {9999} {9999} ; }
  }
\cs_new:Npn \__fp_sub_back_not_far_o:wwwwNN #1 ~ #2; #3 ~ #4; #5#6
  {
    - 1
    \exp_after:wN \__fp_sub_back_near_after:wNNNNw
    \__int_value:w \__int_eval:w 1#30 - #1 - 11
      \exp_after:wN \__fp_sub_back_near_pack:NNNNNNw
      \__int_value:w \__int_eval:w 11 0000 0000 + #40 - #2
        - \exp_after:wN \__fp_round_neg:NNN
          \exp_after:wN #6
          \use_none:nnnnnnn #2 #5
        \exp_after:wN ;
  }
\cs_new:Npn \__fp_sub_back_very_far_o:wwwwNN #1#2#3#4#5#6#7
  {
    \__fp_pack_eight:wNNNNNNNN
    \__fp_sub_back_very_far_ii_o:nnNwwNN
    { 0 #1#2#3 #4#5#6#7 }
    ;
  }
\cs_new:Npn \__fp_sub_back_very_far_ii_o:nnNwwNN #1#2 ; #3 ; #4 ~ #5; #6#7
  {
    \exp_after:wN \__fp_basics_pack_high:NNNNNw
    \__int_value:w \__int_eval:w 1#4 - #1 - 1
      \exp_after:wN \__fp_basics_pack_low:NNNNNw
      \__int_value:w \__int_eval:w 2#5 - #2
        - \exp_after:wN \__fp_round_neg:NNN
          \exp_after:wN #7
          \__int_value:w
            \if_int_odd:w \__int_eval:w #5 - #2 \__int_eval_end:
              1 \else: 2 \fi:
          \__int_value:w \__fp_round_digit:Nw #3 #6 ;
      \exp_after:wN ;
  }
\cs_new:cpn { __fp_*_o:ww }
  {
    \__fp_mul_cases_o:NnNnww
      *
      { - 2 + }
      \__fp_mul_npos_o:Nww
      { }
  }
\cs_new:Npn \__fp_mul_cases_o:NnNnww
    #1#2#3#4 \s__fp \__fp_chk:w #5#6#7; \s__fp \__fp_chk:w #8#9
  {
    \if_case:w \__int_eval:w
                 \if_int_compare:w #5 #8 = 11 ~
                   1
                 \else:
                   \if_meaning:w 3 #8
                     3
                   \else:
                     \if_meaning:w 3 #5
                       2
                     \else:
                       \if_int_compare:w #5 #8 = 10 ~
                         9 #2 - 2
                       \else:
                         (#5 #2 #8) / 2 * 2 + 7
                       \fi:
                     \fi:
                   \fi:
                 \fi:
                 \if_meaning:w #6 #9 - 1 \fi:
               \__int_eval_end:
         \__fp_case_use:nw { #3 0 }
    \or: \__fp_case_use:nw { #3 2 }
    \or: \__fp_case_return_i_o:ww
    \or: \__fp_case_return_ii_o:ww
    \or: \__fp_case_return_o:Nww \c_zero_fp
    \or: \__fp_case_return_o:Nww \c_minus_zero_fp
    \or: \__fp_case_use:nw { \__fp_invalid_operation_o:Nww #1 }
    \or: \__fp_case_use:nw { \__fp_invalid_operation_o:Nww #1 }
    \or: \__fp_case_return_o:Nww \c_inf_fp
    \or: \__fp_case_return_o:Nww \c_minus_inf_fp
    #4
    \fi:
    \s__fp \__fp_chk:w #5 #6 #7;
    \s__fp \__fp_chk:w #8 #9
  }
\cs_new:Npn \__fp_mul_npos_o:Nww
    #1 \s__fp \__fp_chk:w #2 #3 #4 #5 ; \s__fp \__fp_chk:w #6 #7 #8 #9 ;
  {
    \exp_after:wN \__fp_sanitize:Nw
    \exp_after:wN #1
    \__int_value:w \__int_eval:w
      #4 + #8
      \__fp_mul_significand_o:nnnnNnnnn #5 #1 #9
  }
\cs_new:Npn \__fp_mul_significand_o:nnnnNnnnn #1#2#3#4 #5 #6#7#8#9
  {
    \exp_after:wN \__fp_mul_significand_test_f:NNN
    \exp_after:wN #5
    \__int_value:w \__int_eval:w 99990000 + #1*#6 +
      \exp_after:wN \__fp_mul_significand_keep:NNNNNw
      \__int_value:w \__int_eval:w 99990000 + #1*#7 + #2*#6 +
        \exp_after:wN \__fp_mul_significand_keep:NNNNNw
        \__int_value:w \__int_eval:w 99990000 + #1*#8 + #2*#7 + #3*#6 +
          \exp_after:wN \__fp_mul_significand_drop:NNNNNw
          \__int_value:w \__int_eval:w 99990000 + #1*#9 + #2*#8 + #3*#7 + #4*#6 +
            \exp_after:wN \__fp_mul_significand_drop:NNNNNw
            \__int_value:w \__int_eval:w 99990000 + #2*#9 + #3*#8 + #4*#7 +
              \exp_after:wN \__fp_mul_significand_drop:NNNNNw
              \__int_value:w \__int_eval:w 99990000 + #3*#9 + #4*#8 +
                \exp_after:wN \__fp_mul_significand_drop:NNNNNw
                \__int_value:w \__int_eval:w 100000000 + #4*#9 ;
    ; \exp_after:wN ;
  }
\cs_new:Npn \__fp_mul_significand_drop:NNNNNw #1#2#3#4#5 #6;
  { #1#2#3#4#5 ; + #6 }
\cs_new:Npn \__fp_mul_significand_keep:NNNNNw #1#2#3#4#5 #6;
  { #1#2#3#4#5 ; #6 ; }
\cs_new:Npn \__fp_mul_significand_test_f:NNN #1 #2 #3
  {
    \if_meaning:w 0 #3
      \exp_after:wN \__fp_mul_significand_small_f:NNwwwN
    \else:
      \exp_after:wN \__fp_mul_significand_large_f:NwwNNNN
    \fi:
    #1 #3
  }
\cs_new:Npn \__fp_mul_significand_large_f:NwwNNNN #1 #2; #3; #4#5#6#7; +
  {
    \exp_after:wN \__fp_basics_pack_high:NNNNNw
    \__int_value:w \__int_eval:w 1#2
      \exp_after:wN \__fp_basics_pack_low:NNNNNw
      \__int_value:w \__int_eval:w 1#3#4#5#6#7
        + \exp_after:wN \__fp_round:NNN
          \exp_after:wN #1
          \exp_after:wN #7
          \__int_value:w \__fp_round_digit:Nw
  }
\cs_new:Npn \__fp_mul_significand_small_f:NNwwwN #1 #2#3; #4#5; #6; + #7
  {
    - 1
    \exp_after:wN \__fp_basics_pack_high:NNNNNw
    \__int_value:w \__int_eval:w 1#3#4
      \exp_after:wN \__fp_basics_pack_low:NNNNNw
      \__int_value:w \__int_eval:w 1#5#6#7
        + \exp_after:wN \__fp_round:NNN
          \exp_after:wN #1
          \exp_after:wN #7
          \__int_value:w \__fp_round_digit:Nw
  }
\cs_new:cpn { __fp_/_o:ww }
  {
    \__fp_mul_cases_o:NnNnww
      /
      { - }
      \__fp_div_npos_o:Nww
      {
        \or:
          \__fp_case_use:nw
            { \__fp_division_by_zero_o:NNww \c_inf_fp / }
        \or:
          \__fp_case_use:nw
            { \__fp_division_by_zero_o:NNww \c_minus_inf_fp / }
      }
  }
\cs_new:Npn \__fp_div_npos_o:Nww
    #1 \s__fp \__fp_chk:w 1 #2 #3 #4 ; \s__fp \__fp_chk:w 1 #5 #6 #7#8#9;
  {
    \exp_after:wN \__fp_sanitize:Nw
    \exp_after:wN #1
    \__int_value:w \__int_eval:w
      #3 - #6
      \exp_after:wN \__fp_div_significand_i_o:wnnw
        \__int_value:w \__int_eval:w #7 \use_i:nnnn #8 + 1 ;
        #4
        {#7}{#8}#9 ;
        #1
  }
\cs_new:Npn \__fp_div_significand_i_o:wnnw #1 ; #2#3 #4 ;
  {
    \exp_after:wN \__fp_div_significand_test_o:w
    \__int_value:w \__int_eval:w
      \exp_after:wN \__fp_div_significand_calc:wwnnnnnnn
      \__int_value:w \__int_eval:w 999999 + #2 #3 0 / #1 ;
        #2 #3 ;
        #4
        { \exp_after:wN \__fp_div_significand_ii:wwn \__int_value:w #1 }
        { \exp_after:wN \__fp_div_significand_ii:wwn \__int_value:w #1 }
        { \exp_after:wN \__fp_div_significand_ii:wwn \__int_value:w #1 }
        { \exp_after:wN \__fp_div_significand_iii:wwnnnnn \__int_value:w #1 }
  }
\cs_new:Npn \__fp_div_significand_calc:wwnnnnnnn 1#1
  {
    \if_meaning:w 1 #1
      \exp_after:wN \__fp_div_significand_calc_i:wwnnnnnnn
    \else:
      \exp_after:wN \__fp_div_significand_calc_ii:wwnnnnnnn
    \fi:
  }
\cs_new:Npn \__fp_div_significand_calc_i:wwnnnnnnn #1; #2;#3#4 #5#6#7#8 #9
  {
    1 1 #1
    #9 \exp_after:wN ;
    \__int_value:w \__int_eval:w \c__fp_Bigg_leading_shift_int
      + #2 - #1 * #5 - #5#60
      \exp_after:wN \__fp_pack_Bigg:NNNNNNw
      \__int_value:w \__int_eval:w \c__fp_Bigg_middle_shift_int
        + #3 - #1 * #6 - #70
        \exp_after:wN \__fp_pack_Bigg:NNNNNNw
        \__int_value:w \__int_eval:w \c__fp_Bigg_middle_shift_int
          + #4 - #1 * #7 - #80
          \exp_after:wN \__fp_pack_Bigg:NNNNNNw
          \__int_value:w \__int_eval:w \c__fp_Bigg_trailing_shift_int
            - #1 * #8 ;
    {#5}{#6}{#7}{#8}
  }
\cs_new:Npn \__fp_div_significand_calc_ii:wwnnnnnnn #1; #2;#3#4 #5#6#7#8 #9
  {
    1 0 #1
    #9 \exp_after:wN ;
    \__int_value:w \__int_eval:w \c__fp_Bigg_leading_shift_int
      + #2 - #1 * #5
      \exp_after:wN \__fp_pack_Bigg:NNNNNNw
      \__int_value:w \__int_eval:w \c__fp_Bigg_middle_shift_int
        + #3 - #1 * #6
        \exp_after:wN \__fp_pack_Bigg:NNNNNNw
        \__int_value:w \__int_eval:w \c__fp_Bigg_middle_shift_int
          + #4 - #1 * #7
          \exp_after:wN \__fp_pack_Bigg:NNNNNNw
          \__int_value:w \__int_eval:w \c__fp_Bigg_trailing_shift_int
            - #1 * #8 ;
    {#5}{#6}{#7}{#8}
  }
\cs_new:Npn \__fp_div_significand_ii:wwn #1; #2;#3
  {
    \exp_after:wN \__fp_div_significand_pack:NNN
    \__int_value:w \__int_eval:w
      \exp_after:wN \__fp_div_significand_calc:wwnnnnnnn
      \__int_value:w \__int_eval:w 999999 + #2 #3 0 / #1 ; #2 #3 ;
  }
\cs_new:Npn \__fp_div_significand_iii:wwnnnnn #1; #2;#3#4#5 #6#7
  {
    0
    \exp_after:wN \__fp_div_significand_iv:wwnnnnnnn
    \__int_value:w \__int_eval:w ( 2 * #2 #3) / #6 #7 ; % <- P
      #2 ; {#3} {#4} {#5}
      {#6} {#7}
  }
\cs_new:Npn \__fp_div_significand_iv:wwnnnnnnn #1; #2;#3#4#5 #6#7#8#9
  {
    + 5 * #1
    \exp_after:wN \__fp_div_significand_vi:Nw
    \__int_value:w \__int_eval:w -20 + 2*#2#3 - #1*#6#7 +
      \exp_after:wN \__fp_div_significand_v:NN
      \__int_value:w \__int_eval:w 199980 + 2*#4 - #1*#8 +
        \exp_after:wN \__fp_div_significand_v:NN
        \__int_value:w \__int_eval:w 200000 + 2*#5 - #1*#9 ;
  }
\cs_new:Npn \__fp_div_significand_v:NN #1#2 { #1#2 \__int_eval_end: + }
\cs_new:Npn \__fp_div_significand_vi:Nw #1#2;
  {
    \if_meaning:w 0 #1
      \if_int_compare:w \__int_eval:w #2 > 0 + 1 \fi:
    \else:
      \if_meaning:w - #1 - \else: + \fi: 1
    \fi:
    ;
  }
\cs_new:Npn \__fp_div_significand_pack:NNN 1 #1 #2 { + #1 #2 ; }
\cs_new:Npn \__fp_div_significand_test_o:w 10 #1
  {
    \if_meaning:w 0 #1
      \exp_after:wN \__fp_div_significand_small_o:wwwNNNNwN
    \else:
      \exp_after:wN \__fp_div_significand_large_o:wwwNNNNwN
    \fi:
    #1
  }
\cs_new:Npn \__fp_div_significand_small_o:wwwNNNNwN
    0 #1; #2; #3; #4#5#6#7#8; #9
  {
    \exp_after:wN \__fp_basics_pack_high:NNNNNw
    \__int_value:w \__int_eval:w 1 #1#2
      \exp_after:wN \__fp_basics_pack_low:NNNNNw
      \__int_value:w \__int_eval:w 1 #3#4#5#6#7
        + \__fp_round:NNN #9 #7 #8
        \exp_after:wN ;
  }
\cs_new:Npn \__fp_div_significand_large_o:wwwNNNNwN
    #1; #2; #3; #4#5#6#7#8; #9
  {
    + 1
    \exp_after:wN \__fp_basics_pack_weird_high:NNNNNNNNw
    \__int_value:w \__int_eval:w 1 #1 #2
      \exp_after:wN \__fp_basics_pack_weird_low:NNNNw
      \__int_value:w \__int_eval:w 1 #3 #4 #5 #6 +
        \exp_after:wN \__fp_round:NNN
        \exp_after:wN #9
        \exp_after:wN #6
        \__int_value:w \__fp_round_digit:Nw #7 #8 ;
      \exp_after:wN ;
  }
\cs_new:Npn \__fp_sqrt_o:w #1 \s__fp \__fp_chk:w #2#3#4; @
  {
    \if_meaning:w 0 #2 \__fp_case_return_same_o:w \fi:
    \if_meaning:w 2 #3
      \__fp_case_use:nw { \__fp_invalid_operation_o:nw { sqrt } }
    \fi:
    \if_meaning:w 1 #2 \else: \__fp_case_return_same_o:w \fi:
    \__fp_sqrt_npos_o:w
    \s__fp \__fp_chk:w #2 #3 #4;
  }
\cs_new:Npn \__fp_sqrt_npos_o:w \s__fp \__fp_chk:w 1 0 #1#2#3#4#5;
  {
    \exp_after:wN \__fp_sanitize:Nw
    \exp_after:wN 0
    \__int_value:w \__int_eval:w
      \if_int_odd:w #1 \exp_stop_f:
        \exp_after:wN \__fp_sqrt_npos_auxi_o:wwnnN
      \fi:
      #1 / 2
      \__fp_sqrt_Newton_o:wwn 56234133; 0; {#2#3} {#4#5} 0
  }
\cs_new:Npn \__fp_sqrt_npos_auxi_o:wwnnN #1 / 2 #2; 0; #3#4#5
  {
    ( #1 + 1 ) / 2
    \__fp_pack_eight:wNNNNNNNN
    \__fp_sqrt_npos_auxii_o:wNNNNNNNN
    ;
    0 #3 #4
  }
\cs_new:Npn \__fp_sqrt_npos_auxii_o:wNNNNNNNN #1; #2#3#4#5#6#7#8#9
  { \__fp_sqrt_Newton_o:wwn 17782794; 0; {#1} {#2#3#4#5#6#7#8#9} }
\cs_new:Npn \__fp_sqrt_Newton_o:wwn #1; #2; #3
  {
    \if_int_compare:w #1 = #2 \exp_stop_f:
      \exp_after:wN \__fp_sqrt_auxi_o:NNNNwnnN
      \__int_value:w \__int_eval:w 9999 9999 +
        \exp_after:wN \__fp_use_none_until_s:w
    \fi:
    \exp_after:wN \__fp_sqrt_Newton_o:wwn
    \__int_value:w \__int_eval:w (#1 + #3 * 1 0000 0000 / #1) / 2 ;
    #1; {#3}
  }
\cs_new:Npn \__fp_sqrt_auxi_o:NNNNwnnN 1 #1#2#3#4#5;
  {
    \__fp_sqrt_auxii_o:NnnnnnnnN
      \__fp_sqrt_auxiii_o:wnnnnnnnn
      {#1#2#3#4} {#5} {2499} {9988} {7500}
  }
\cs_new:Npn \__fp_sqrt_auxii_o:NnnnnnnnN #1 #2#3#4#5#6 #7#8#9
  {
    \exp_after:wN #1
    \__int_value:w \__int_eval:w \c__fp_big_leading_shift_int
      + #7 - #2 * #2
      \exp_after:wN \__fp_pack_big:NNNNNNw
      \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int
        - 2 * #2 * #3
        \exp_after:wN \__fp_pack_big:NNNNNNw
        \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int
          + #8 - #3 * #3 - 2 * #2 * #4
          \exp_after:wN \__fp_pack_big:NNNNNNw
          \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int
            - 2 * #3 * #4 - 2 * #2 * #5
            \exp_after:wN \__fp_pack_big:NNNNNNw
            \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int
              + #9 000 0000 - #4 * #4 - 2 * #3 * #5 - 2 * #2 * #6
              \exp_after:wN \__fp_pack_big:NNNNNNw
              \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int
                - 2 * #4 * #5 - 2 * #3 * #6
                \exp_after:wN \__fp_pack_big:NNNNNNw
                \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int
                  - #5 * #5 - 2 * #4 * #6
                  \exp_after:wN \__fp_pack_big:NNNNNNw
                  \__int_value:w \__int_eval:w
                    \c__fp_big_middle_shift_int
                    - 2 * #5 * #6
                    \exp_after:wN \__fp_pack_big:NNNNNNw
                    \__int_value:w \__int_eval:w
                      \c__fp_big_trailing_shift_int
                      - #6 * #6 ;
    % (
    - 257 ) * 5000 0000 / (#2#3 + 1) + 10 0000 0000 ;
    {#2}{#3}{#4}{#5}{#6} {#7}{#8}#9
  }
\cs_new:Npn \__fp_sqrt_auxiii_o:wnnnnnnnn
    #1; #2#3#4#5#6#7#8#9
  {
    \if_int_compare:w #1 > 1 \exp_stop_f:
      \exp_after:wN \__fp_sqrt_auxiv_o:NNNNNw
      \__int_value:w \__int_eval:w (#1#2 %)
    \else:
      \if_int_compare:w #1#2 > 1 \exp_stop_f:
        \exp_after:wN \__fp_sqrt_auxv_o:NNNNNw
        \__int_value:w \__int_eval:w (#1#2#3 %)
      \else:
        \if_int_compare:w #1#2#3 > 1 \exp_stop_f:
          \exp_after:wN \__fp_sqrt_auxvi_o:NNNNNw
          \__int_value:w \__int_eval:w (#1#2#3#4 %)
        \else:
          \exp_after:wN \__fp_sqrt_auxvii_o:NNNNNw
          \__int_value:w \__int_eval:w (#1#2#3#4#5 %)
        \fi:
      \fi:
    \fi:
  }
\cs_new:Npn \__fp_sqrt_auxiv_o:NNNNNw 1#1#2#3#4#5#6;
  { \__fp_sqrt_auxviii_o:nnnnnnn {#1#2#3#4#5#6} {00000000} }
\cs_new:Npn \__fp_sqrt_auxv_o:NNNNNw 1#1#2#3#4#5#6;
  { \__fp_sqrt_auxviii_o:nnnnnnn {000#1#2#3#4#5} {#60000} }
\cs_new:Npn \__fp_sqrt_auxvi_o:NNNNNw 1#1#2#3#4#5#6;
  { \__fp_sqrt_auxviii_o:nnnnnnn {0000000#1} {#2#3#4#5#6} }
\cs_new:Npn \__fp_sqrt_auxvii_o:NNNNNw 1#1#2#3#4#5#6;
  {
    \if_int_compare:w #1#2 = 0 \exp_stop_f:
      \exp_after:wN \__fp_sqrt_auxx_o:Nnnnnnnn
    \fi:
    \__fp_sqrt_auxviii_o:nnnnnnn {00000000} {000#1#2#3#4#5}
  }
\cs_new:Npn \__fp_sqrt_auxviii_o:nnnnnnn #1#2 #3#4#5#6#7
  {
    \exp_after:wN \__fp_sqrt_auxix_o:wnwnw
    \__int_value:w \__int_eval:w #3
      \exp_after:wN \__fp_basics_pack_low:NNNNNw
      \__int_value:w \__int_eval:w #1 + 1#4#5
        \exp_after:wN \__fp_basics_pack_low:NNNNNw
        \__int_value:w \__int_eval:w #2 + 1#6#7 ;
  }
\cs_new:Npn \__fp_sqrt_auxix_o:wnwnw #1; #2#3; #4#5;
  {
    \__fp_sqrt_auxii_o:NnnnnnnnN
      \__fp_sqrt_auxiii_o:wnnnnnnnn {#1}{#2}{#3}{#4}{#5}
  }
\cs_new:Npn \__fp_sqrt_auxx_o:Nnnnnnnn #1#2#3 #4#5#6#7#8
  {
    \exp_after:wN \__fp_sqrt_auxxi_o:wwnnN
    \__int_value:w \__int_eval:w
      (#8 + 2499) / 5000 * 5000 ;
      {#4} {#5} {#6} {#7} ;
  }
\cs_new:Npn \__fp_sqrt_auxxi_o:wwnnN #1; #2; #3#4#5
  {
    \__fp_sqrt_auxii_o:NnnnnnnnN
      \__fp_sqrt_auxxii_o:nnnnnnnnw
      #2 {#1}
      {#3} { #4 + 1 } #5
  }
\cs_new:Npn \__fp_sqrt_auxxii_o:nnnnnnnnw 0; #1#2#3#4#5#6#7#8 #9;
  {
    \if_int_compare:w #1#2 > 0 \exp_stop_f:
      \if_int_compare:w #1#2 = 1 \exp_stop_f:
        \if_int_compare:w #3#4 = 0 \exp_stop_f:
          \if_int_compare:w #5#6 = 0 \exp_stop_f:
            \if_int_compare:w #7#8 = 0 \exp_stop_f:
              \__fp_sqrt_auxxiii_o:w
            \fi:
          \fi:
        \fi:
      \fi:
      \exp_after:wN \__fp_sqrt_auxxiv_o:wnnnnnnnN
      \__int_value:w 9998
    \else:
      \exp_after:wN \__fp_sqrt_auxxiv_o:wnnnnnnnN
      \__int_value:w 10000
    \fi:
    ;
  }
\cs_new:Npn \__fp_sqrt_auxxiii_o:w \fi: \fi: \fi: \fi: #1 \fi: ;
  {
    \fi: \fi: \fi: \fi: \fi:
    \__fp_sqrt_auxxiv_o:wnnnnnnnN 9999 ;
  }
\cs_new:Npn \__fp_sqrt_auxxiv_o:wnnnnnnnN #1; #2#3#4#5#6 #7#8#9
  {
    \exp_after:wN \__fp_basics_pack_high:NNNNNw
    \__int_value:w \__int_eval:w 1 0000 0000 + #2#3
      \exp_after:wN \__fp_basics_pack_low:NNNNNw
      \__int_value:w \__int_eval:w 1 0000 0000
        + #4#5
        \if_int_compare:w #6 > #1 \exp_stop_f: + 1 \fi:
        + \exp_after:wN \__fp_round:NNN
          \exp_after:wN 0
          \exp_after:wN 0
          \__int_value:w
            \exp_after:wN \use_i:nn
            \exp_after:wN \__fp_round_digit:Nw
            \__int_value:w \__int_eval:w #6 + 19999 - #1 ;
    \exp_after:wN ;
  }
\cs_new:Npn \__fp_sign_o:w ? \s__fp \__fp_chk:w #1#2; @
  {
    \if_case:w #1 \exp_stop_f:
           \__fp_case_return_same_o:w
    \or:   \exp_after:wN \__fp_sign_aux_o:w
    \or:   \exp_after:wN \__fp_sign_aux_o:w
    \else: \__fp_case_return_same_o:w
    \fi:
    \s__fp \__fp_chk:w #1 #2;
  }
\cs_new:Npn \__fp_sign_aux_o:w \s__fp \__fp_chk:w #1 #2 #3 ;
  { \exp_after:wN \__fp_set_sign_o:w \exp_after:wN #2 \c_one_fp @ }
\cs_new:Npn \__fp_set_sign_o:w #1 \s__fp \__fp_chk:w #2#3#4; @
  {
    \exp_after:wN \__fp_exp_after_o:w
    \exp_after:wN \s__fp
    \exp_after:wN \__fp_chk:w
    \exp_after:wN #2
    \__int_value:w
      \if_case:w #3 \exp_stop_f: #1 \or: 1 \or: 0 \fi: \exp_stop_f:
    #4;
  }
%% File: l3fp-extended.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project
\tl_const:Nn \c__fp_one_fixed_tl
  { {10000} {0000} {0000} {0000} {0000} {0000} ; }
\cs_new:Npn \__fp_fixed_continue:wn #1; #2 { #2 #1; }
\cs_new:Npn \__fp_fixed_add_one:wN #1#2; #3
  {
    \exp_after:wN #3 \exp_after:wN
      { \__int_value:w \__int_eval:w \c__fp_myriad_int + #1 } #2 ;
  }
\cs_new:Npn \__fp_fixed_div_myriad:wn #1#2#3#4#5#6;
  {
    \exp_after:wN \__fp_fixed_mul_after:wwn
    \__int_value:w \__int_eval:w \c__fp_leading_shift_int
      \exp_after:wN \__fp_pack:NNNNNw
      \__int_value:w \__int_eval:w \c__fp_trailing_shift_int
        + #1 ; {#2}{#3}{#4}{#5};
  }
\cs_new:Npn \__fp_fixed_mul_after:wwn #1; #2; #3 { #3 {#1} #2; }
\cs_new:Npn \__fp_fixed_mul_short:wwn #1#2#3#4#5#6; #7#8#9;
  {
    \exp_after:wN \__fp_fixed_mul_after:wwn
    \__int_value:w \__int_eval:w \c__fp_leading_shift_int
      + #1*#7
      \exp_after:wN \__fp_pack:NNNNNw
      \__int_value:w \__int_eval:w \c__fp_middle_shift_int
        + #1*#8 + #2*#7
        \exp_after:wN \__fp_pack:NNNNNw
        \__int_value:w \__int_eval:w \c__fp_middle_shift_int
          + #1*#9 + #2*#8 + #3*#7
          \exp_after:wN \__fp_pack:NNNNNw
          \__int_value:w \__int_eval:w \c__fp_middle_shift_int
            + #2*#9 + #3*#8 + #4*#7
            \exp_after:wN \__fp_pack:NNNNNw
            \__int_value:w \__int_eval:w \c__fp_middle_shift_int
              + #3*#9 + #4*#8 + #5*#7
              \exp_after:wN \__fp_pack:NNNNNw
              \__int_value:w \__int_eval:w \c__fp_trailing_shift_int
                + #4*#9 + #5*#8 + #6*#7
                + ( #5*#9 + #6*#8 + #6*#9 / \c__fp_myriad_int )
                / \c__fp_myriad_int ; ;
  }
\cs_new:Npn \__fp_fixed_div_int:wwN #1#2#3#4#5#6 ; #7 ; #8
  {
    \exp_after:wN \__fp_fixed_div_int_after:Nw
    \exp_after:wN #8
    \__int_value:w \__int_eval:w - 1
      \__fp_fixed_div_int:wnN
      #1; {#7} \__fp_fixed_div_int_auxi:wnn
      #2; {#7} \__fp_fixed_div_int_auxi:wnn
      #3; {#7} \__fp_fixed_div_int_auxi:wnn
      #4; {#7} \__fp_fixed_div_int_auxi:wnn
      #5; {#7} \__fp_fixed_div_int_auxi:wnn
      #6; {#7} \__fp_fixed_div_int_auxii:wnn ;
  }
\cs_new:Npn \__fp_fixed_div_int:wnN #1; #2 #3
  {
    \exp_after:wN #3
    \__int_value:w \__int_eval:w #1 / #2 - 1 ;
    {#2}
    {#1}
  }
\cs_new:Npn \__fp_fixed_div_int_auxi:wnn #1; #2 #3
  {
    + #1
    \exp_after:wN \__fp_fixed_div_int_pack:Nw
    \__int_value:w \__int_eval:w 9999
      \exp_after:wN \__fp_fixed_div_int:wnN
      \__int_value:w \__int_eval:w #3 - #1*#2 \__int_eval_end:
  }
\cs_new:Npn \__fp_fixed_div_int_auxii:wnn #1; #2 #3 { + #1 + 2 ; }
\cs_new:Npn \__fp_fixed_div_int_pack:Nw #1 #2; { + #1; {#2} }
\cs_new:Npn \__fp_fixed_div_int_after:Nw #1 #2; { #1 {#2} }
\cs_new:Npn \__fp_fixed_add:wwn { \__fp_fixed_add:Nnnnnwnn + }
\cs_new:Npn \__fp_fixed_sub:wwn { \__fp_fixed_add:Nnnnnwnn - }
\cs_new:Npn \__fp_fixed_add:Nnnnnwnn #1 #2#3#4#5 #6; #7#8
  {
    \exp_after:wN \__fp_fixed_add_after:NNNNNwn
    \__int_value:w \__int_eval:w 9 9999 9998 + #2#3 #1 #7#8
      \exp_after:wN \__fp_fixed_add_pack:NNNNNwn
      \__int_value:w \__int_eval:w 1 9999 9998 + #4#5
        \__fp_fixed_add:nnNnnnwn #6 #1
  }
\cs_new:Npn \__fp_fixed_add:nnNnnnwn #1#2 #3 #4#5 #6#7 ; #8
  {
    #3 #4#5
    \exp_after:wN \__fp_fixed_add_pack:NNNNNwn
    \__int_value:w \__int_eval:w 2 0000 0000 #3 #6#7 + #1#2 ; {#8} ;
  }
\cs_new:Npn \__fp_fixed_add_pack:NNNNNwn #1 #2#3#4#5 #6; #7
  { + #1 ; {#7} {#2#3#4#5} {#6} }
\cs_new:Npn \__fp_fixed_add_after:NNNNNwn 1 #1 #2#3#4#5 #6; #7
  { #7 {#1#2#3#4#5} {#6} }
\cs_new:Npn \__fp_fixed_mul:wwn #1#2#3#4 #5; #6#7#8#9
  {
    \exp_after:wN \__fp_fixed_mul_after:wwn
    \__int_value:w \__int_eval:w \c__fp_leading_shift_int
      \exp_after:wN \__fp_pack:NNNNNw
      \__int_value:w \__int_eval:w \c__fp_middle_shift_int
        + #1*#6
        \exp_after:wN \__fp_pack:NNNNNw
        \__int_value:w \__int_eval:w \c__fp_middle_shift_int
          + #1*#7 + #2*#6
          \exp_after:wN \__fp_pack:NNNNNw
          \__int_value:w \__int_eval:w \c__fp_middle_shift_int
            + #1*#8 + #2*#7 + #3*#6
            \exp_after:wN \__fp_pack:NNNNNw
            \__int_value:w \__int_eval:w \c__fp_middle_shift_int
              + #1*#9 + #2*#8 + #3*#7 + #4*#6
              \exp_after:wN \__fp_pack:NNNNNw
              \__int_value:w \__int_eval:w \c__fp_trailing_shift_int
                + #2*#9 + #3*#8 + #4*#7
                + ( #3*#9 + #4*#8
                  + \__fp_fixed_mul:nnnnnnnw #5 {#6}{#7}  {#1}{#2}
  }
\cs_new:Npn \__fp_fixed_mul:nnnnnnnw #1#2 #3#4 #5#6 #7#8 ;
  {
    #1*#4 + #2*#3 + #5*#8 + #6*#7 ) / \c__fp_myriad_int
    + #1*#3 + #5*#7 ; ;
  }
\cs_new:Npn \__fp_fixed_mul_add:wwwn #1; #2; #3#4#5#6#7#8;
  {
    \exp_after:wN \__fp_fixed_mul_after:wwn
    \__int_value:w \__int_eval:w \c__fp_big_leading_shift_int
      \exp_after:wN \__fp_pack_big:NNNNNNw
      \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int + #3 #4
        \__fp_fixed_mul_add:Nwnnnwnnn +
          + #5 #6 ; #2 ; #1 ; #2 ; +
          + #7 #8 ; ;
  }
\cs_new:Npn \__fp_fixed_mul_sub_back:wwwn #1; #2; #3#4#5#6#7#8;
  {
    \exp_after:wN \__fp_fixed_mul_after:wwn
    \__int_value:w \__int_eval:w \c__fp_big_leading_shift_int
      \exp_after:wN \__fp_pack_big:NNNNNNw
      \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int + #3 #4
        \__fp_fixed_mul_add:Nwnnnwnnn -
          + #5 #6 ; #2 ; #1 ; #2 ; -
          + #7 #8 ; ;
  }
\cs_new:Npn \__fp_fixed_one_minus_mul:wwn #1; #2;
  {
    \exp_after:wN \__fp_fixed_mul_after:wwn
    \__int_value:w \__int_eval:w \c__fp_big_leading_shift_int
      \exp_after:wN \__fp_pack_big:NNNNNNw
      \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int + 1 0000 0000
        \__fp_fixed_mul_add:Nwnnnwnnn -
          ; #2 ; #1 ; #2 ; -
          ; ;
  }
\cs_new:Npn \__fp_fixed_mul_add:Nwnnnwnnn #1 #2; #3#4#5#6; #7#8#9
  {
    #1 #7*#3
    \exp_after:wN \__fp_pack_big:NNNNNNw
    \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int
      #1 #7*#4 #1 #8*#3
      \exp_after:wN \__fp_pack_big:NNNNNNw
      \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int
        #1 #7*#5 #1 #8*#4 #1 #9*#3 #2
        \exp_after:wN \__fp_pack_big:NNNNNNw
        \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int
          #1 \__fp_fixed_mul_add:nnnnwnnnn {#7}{#8}{#9}
  }
\cs_new:Npn \__fp_fixed_mul_add:nnnnwnnnn #1#2#3#4#5; #6#7#8#9
  {
    ( #1*#9 + #2*#8 + #3*#7 + #4*#6 )
    \exp_after:wN \__fp_pack_big:NNNNNNw
    \__int_value:w \__int_eval:w \c__fp_big_trailing_shift_int
      \__fp_fixed_mul_add:nnnnwnnwN
        { #6 + #4*#7 + #3*#8 + #2*#9 + #1 }
        { #7 + #4*#8 + #3*#9 + #2 }
        {#1} #5;
        {#6}
  }
\cs_new:Npn \__fp_fixed_mul_add:nnnnwnnwN #1#2 #3#4#5; #6#7#8; #9
  {
    #9 (#4* #1 *#7)
    #9 (#5*#6+#4* #2 *#7+#3*#8) / \c__fp_myriad_int
  }
\cs_new:Npn \__fp_ep_to_fixed:wwn #1,#2
  {
    \exp_after:wN \__fp_ep_to_fixed_auxi:www
    \__int_value:w \__int_eval:w 1 0000 0000 + #2 \exp_after:wN ;
    \exp:w \exp_end_continue_f:w
    \prg_replicate:nn { 4 - \int_max:nn {#1} { -32 } } { 0 } ;
  }
\cs_new:Npn \__fp_ep_to_fixed_auxi:www 1#1; #2; #3#4#5#6#7;
  {
    \__fp_pack_eight:wNNNNNNNN
    \__fp_pack_twice_four:wNNNNNNNN
    \__fp_pack_twice_four:wNNNNNNNN
    \__fp_pack_twice_four:wNNNNNNNN
    \__fp_ep_to_fixed_auxii:nnnnnnnwn ;
    #2 #1#3#4#5#6#7 0000 !
  }
\cs_new:Npn \__fp_ep_to_fixed_auxii:nnnnnnnwn #1#2#3#4#5#6#7; #8! #9
  { #9 {#1#2}{#3}{#4}{#5}{#6}{#7}; }
\cs_new:Npn \__fp_ep_to_ep:wwN #1,#2#3#4#5#6#7; #8
  {
    \exp_after:wN #8
    \__int_value:w \__int_eval:w #1 + 4
      \exp_after:wN \use_i:nn
      \exp_after:wN \__fp_ep_to_ep_loop:N
      \__int_value:w \__int_eval:w 1 0000 0000 + #2 \__int_eval_end:
      #3#4#5#6#7 ; ; !
  }
\cs_new:Npn \__fp_ep_to_ep_loop:N #1
  {
    \if_meaning:w 0 #1
      - 1
    \else:
      \__fp_ep_to_ep_end:www #1
    \fi:
    \__fp_ep_to_ep_loop:N
  }
\cs_new:Npn \__fp_ep_to_ep_end:www
    #1 \fi: \__fp_ep_to_ep_loop:N #2; #3!
  {
    \fi:
    \if_meaning:w ; #1
      - 2 * \c__fp_max_exponent_int
      \__fp_ep_to_ep_zero:ww
    \fi:
    \__fp_pack_twice_four:wNNNNNNNN
    \__fp_pack_twice_four:wNNNNNNNN
    \__fp_pack_twice_four:wNNNNNNNN
    \__fp_use_i:ww , ;
    #1 #2 0000 0000 0000 0000 0000 0000 ;
  }
\cs_new:Npn \__fp_ep_to_ep_zero:ww \fi: #1; #2; #3;
  { \fi: , {1000}{0000}{0000}{0000}{0000}{0000} ; }
\cs_new:Npn \__fp_ep_compare:wwww #1,#2#3#4#5#6#7;
  { \__fp_ep_compare_aux:wwww {#1}{#2}{#3}{#4}{#5}; #6#7; }
\cs_new:Npn \__fp_ep_compare_aux:wwww #1;#2;#3,#4#5#6#7#8#9;
  {
    \if_case:w
      \__fp_compare_npos:nwnw #1; {#3}{#4}{#5}{#6}{#7}; \exp_stop_f:
            \if_int_compare:w #2 = #8#9 \exp_stop_f:
              0
            \else:
              \if_int_compare:w #2 < #8#9 - \fi: 1
            \fi:
    \or:    1
    \else: -1
    \fi:
  }
\cs_new:Npn \__fp_ep_mul:wwwwn #1,#2; #3,#4;
  {
    \__fp_ep_to_ep:wwN #3,#4;
    \__fp_fixed_continue:wn
    {
      \__fp_ep_to_ep:wwN #1,#2;
      \__fp_ep_mul_raw:wwwwN
    }
    \__fp_fixed_continue:wn
  }
\cs_new:Npn \__fp_ep_mul_raw:wwwwN #1,#2; #3,#4; #5
  {
    \__fp_fixed_mul:wwn #2; #4;
    { \exp_after:wN #5 \__int_value:w \__int_eval:w #1 + #3 , }
  }
\cs_new:Npn \__fp_ep_div:wwwwn #1,#2; #3,#4;
  {
    \__fp_ep_to_ep:wwN #1,#2;
    \__fp_fixed_continue:wn
    {
      \__fp_ep_to_ep:wwN #3,#4;
      \__fp_ep_div_esti:wwwwn
    }
  }
\cs_new:Npn \__fp_ep_div_esti:wwwwn #1,#2#3; #4,
  {
    \exp_after:wN \__fp_ep_div_estii:wwnnwwn
    \__int_value:w \__int_eval:w 10 0000 0000 / ( #2 + 1 )
      \exp_after:wN ;
    \__int_value:w \__int_eval:w #4 - #1 + 1 ,
    {#2} #3;
  }
\cs_new:Npn \__fp_ep_div_estii:wwnnwwn #1; #2,#3#4#5; #6; #7
  {
    \exp_after:wN \__fp_ep_div_estiii:NNNNNwwwn
    \__int_value:w \__int_eval:w 10 0000 0000 - 1750
      + #1 000 + (10 0000 0000 / #3 - #1) * (1000 - #4 / 10) ;
    {#3}{#4}#5; #6; { #7 #2, }
  }
\cs_new:Npn \__fp_ep_div_estiii:NNNNNwwwn 1#1#2#3#4#5#6; #7;
  {
    \__fp_fixed_mul_short:wwn #7; {#1}{#2#3#4#5}{#6};
    \__fp_ep_div_epsi:wnNNNNNn {#1#2#3#4}#5#6
    \__fp_fixed_mul:wwn
  }
\cs_new:Npn \__fp_ep_div_epsi:wnNNNNNn #1#2#3#4#5#6;
  {
    \exp_after:wN \__fp_ep_div_epsii:wwnNNNNNn
    \__int_value:w \__int_eval:w 1 9998 - #2
      \exp_after:wN \__fp_ep_div_eps_pack:NNNNNw
      \__int_value:w \__int_eval:w 1 9999 9998 - #3#4
        \exp_after:wN \__fp_ep_div_eps_pack:NNNNNw
        \__int_value:w \__int_eval:w 2 0000 0000 - #5#6 ; ;
  }
\cs_new:Npn \__fp_ep_div_eps_pack:NNNNNw #1#2#3#4#5#6;
  { + #1 ; {#2#3#4#5} {#6} }
\cs_new:Npn \__fp_ep_div_epsii:wwnNNNNNn 1#1; #2; #3#4#5#6#7#8
  {
    \__fp_fixed_mul:wwn {0000}{#1}#2; {0000}{#1}#2;
    \__fp_fixed_add_one:wN
    \__fp_fixed_mul:wwn {10000} {#1} #2 ;
    {
      \__fp_fixed_mul_short:wwn {0000}{#1}#2; {#3}{#4#5#6#7}{#8000};
      \__fp_fixed_div_myriad:wn
      \__fp_fixed_mul:wwn
    }
    \__fp_fixed_add:wwn {#3}{#4#5#6#7}{#8000}{0000}{0000}{0000};
  }
\cs_new:Npn \__fp_ep_isqrt:wwn #1,#2;
  {
    \__fp_ep_to_ep:wwN #1,#2;
    \__fp_ep_isqrt_auxi:wwn
  }
\cs_new:Npn \__fp_ep_isqrt_auxi:wwn #1,
  {
    \exp_after:wN \__fp_ep_isqrt_auxii:wwnnnwn
    \__int_value:w \__int_eval:w
      \int_if_odd:nTF {#1}
        { (1 - #1) / 2 , 535 , { 0 } { } }
        { 1 - #1 / 2 , 168 , { } { 0 } }
  }
\cs_new:Npn \__fp_ep_isqrt_auxii:wwnnnwn #1, #2, #3#4 #5#6; #7
  {
    \__fp_ep_isqrt_esti:wwwnnwn #2, 0, #5, {#3} {#4}
      {#5} #6 ; { #7 #1 , }
  }
\cs_new:Npn \__fp_ep_isqrt_esti:wwwnnwn #1, #2, #3, #4
  {
    \if_int_compare:w #1 = #2 \exp_stop_f:
      \exp_after:wN \__fp_ep_isqrt_estii:wwwnnwn
    \fi:
    \exp_after:wN \__fp_ep_isqrt_esti:wwwnnwn
    \__int_value:w \__int_eval:w
      (#1 + 1 0050 0000 #4 / (#1 * #3)) / 2 ,
    #1, #3, {#4}
  }
\cs_new:Npn \__fp_ep_isqrt_estii:wwwnnwn #1, #2, #3, #4#5
  {
    \exp_after:wN \__fp_ep_isqrt_estiii:NNNNNwwwn
    \__int_value:w \__int_eval:w 1000 0000 + #2 * #2 #5 * 5
      \exp_after:wN , \__int_value:w \__int_eval:w 10000 + #2 ;
  }
\cs_new:Npn \__fp_ep_isqrt_estiii:NNNNNwwwn 1#1#2#3#4#5#6, 1#7#8; #9;
  {
    \__fp_fixed_mul_short:wwn #9; {#1} {#2#3#4#5} {#600} ;
    \__fp_ep_isqrt_epsi:wN
    \__fp_fixed_mul_short:wwn {#7} {#80} {0000} ;
  }
\cs_new:Npn \__fp_ep_isqrt_epsi:wN #1;
  {
    \__fp_fixed_sub:wwn {15000}{0000}{0000}{0000}{0000}{0000}; #1;
    \__fp_ep_isqrt_epsii:wwN #1;
    \__fp_ep_isqrt_epsii:wwN #1;
    \__fp_ep_isqrt_epsii:wwN #1;
  }
\cs_new:Npn \__fp_ep_isqrt_epsii:wwN #1; #2;
  {
    \__fp_fixed_mul:wwn #1; #1;
    \__fp_fixed_mul_sub_back:wwwn #2;
      {15000}{0000}{0000}{0000}{0000}{0000};
    \__fp_fixed_mul:wwn #1;
  }
\cs_new:Npn \__fp_ep_to_float_o:wwN #1,
  { + \__int_eval:w #1 \__fp_fixed_to_float_o:wN }
\cs_new:Npn \__fp_ep_inv_to_float_o:wwN #1,#2;
  {
    \__fp_ep_div:wwwwn 1,{1000}{0000}{0000}{0000}{0000}{0000}; #1,#2;
    \__fp_ep_to_float_o:wwN
  }
\cs_new:Npn \__fp_fixed_inv_to_float_o:wN
  { \__fp_ep_inv_to_float_o:wwN 0, }
\cs_new:Npn \__fp_fixed_to_float_rad_o:wN #1;
  {
    \__fp_fixed_mul:wwn #1; {5729}{5779}{5130}{8232}{0876}{7981};
    { \__fp_ep_to_float_o:wwN 2, }
  }
\cs_new:Npn \__fp_fixed_to_float_o:Nw #1#2; { \__fp_fixed_to_float_o:wN #2; #1 }
\cs_new:Npn \__fp_fixed_to_float_o:wN #1#2#3#4#5#6; #7
  {
    + \__int_eval:w \c__fp_block_int % for the 8-digit-at-the-start thing.
    \exp_after:wN \exp_after:wN
    \exp_after:wN \__fp_fixed_to_loop:N
    \exp_after:wN \use_none:n
    \__int_value:w \__int_eval:w
      1 0000 0000 + #1   \exp_after:wN \__fp_use_none_stop_f:n
      \__int_value:w   1#2 \exp_after:wN \__fp_use_none_stop_f:n
      \__int_value:w 1#3#4 \exp_after:wN \__fp_use_none_stop_f:n
      \__int_value:w 1#5#6
    \exp_after:wN ;
    \exp_after:wN ;
  }
\cs_new:Npn \__fp_fixed_to_loop:N #1
  {
    \if_meaning:w 0 #1
      - 1
      \exp_after:wN \__fp_fixed_to_loop:N
    \else:
      \exp_after:wN \__fp_fixed_to_loop_end:w
      \exp_after:wN #1
    \fi:
  }
\cs_new:Npn \__fp_fixed_to_loop_end:w #1 #2 ;
  {
    \if_meaning:w ; #1
      \exp_after:wN \__fp_fixed_to_float_zero:w
    \else:
      \exp_after:wN \__fp_pack_twice_four:wNNNNNNNN
      \exp_after:wN \__fp_pack_twice_four:wNNNNNNNN
      \exp_after:wN \__fp_fixed_to_float_pack:ww
      \exp_after:wN ;
    \fi:
    #1 #2 0000 0000 0000 0000 ;
  }
\cs_new:Npn \__fp_fixed_to_float_zero:w ; 0000 0000 0000 0000 ;
  {
    - 2 * \c__fp_max_exponent_int ;
    {0000} {0000} {0000} {0000} ;
  }
\cs_new:Npn \__fp_fixed_to_float_pack:ww #1 ; #2#3 ; ;
  {
    \if_int_compare:w #2 > 4 \exp_stop_f:
      \exp_after:wN \__fp_fixed_to_float_round_up:wnnnnw
    \fi:
    ; #1 ;
  }
\cs_new:Npn \__fp_fixed_to_float_round_up:wnnnnw ; #1#2#3#4 ;
  {
    \exp_after:wN \__fp_basics_pack_high:NNNNNw
    \__int_value:w \__int_eval:w 1 #1#2
      \exp_after:wN \__fp_basics_pack_low:NNNNNw
      \__int_value:w \__int_eval:w 1 #3#4 + 1 ;
  }
%% File: l3fp-expo.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project
\cs_new:Npn \__fp_parse_word_exp:N
  { \__fp_parse_unary_function:NNN \__fp_exp_o:w ? }
\cs_new:Npn \__fp_parse_word_ln:N
  { \__fp_parse_unary_function:NNN \__fp_ln_o:w ? }
\tl_const:Nn \c__fp_ln_i_fixed_tl   { {0000}{0000}{0000}{0000}{0000}{0000};}
\tl_const:Nn \c__fp_ln_ii_fixed_tl  { {6931}{4718}{0559}{9453}{0941}{7232};}
\tl_const:Nn \c__fp_ln_iii_fixed_tl {{10986}{1228}{8668}{1096}{9139}{5245};}
\tl_const:Nn \c__fp_ln_iv_fixed_tl  {{13862}{9436}{1119}{8906}{1883}{4464};}
\tl_const:Nn \c__fp_ln_vi_fixed_tl  {{17917}{5946}{9228}{0550}{0081}{2477};}
\tl_const:Nn \c__fp_ln_vii_fixed_tl {{19459}{1014}{9055}{3133}{0510}{5353};}
\tl_const:Nn \c__fp_ln_viii_fixed_tl{{20794}{4154}{1679}{8359}{2825}{1696};}
\tl_const:Nn \c__fp_ln_ix_fixed_tl  {{21972}{2457}{7336}{2193}{8279}{0490};}
\tl_const:Nn \c__fp_ln_x_fixed_tl   {{23025}{8509}{2994}{0456}{8401}{7991};}
\cs_new:Npn \__fp_ln_o:w #1 \s__fp \__fp_chk:w #2#3#4; @
  {
    \if_meaning:w 2 #3
      \__fp_case_use:nw { \__fp_invalid_operation_o:nw { ln } }
    \fi:
    \if_case:w #2 \exp_stop_f:
      \__fp_case_use:nw
        { \__fp_division_by_zero_o:Nnw \c_minus_inf_fp { ln } }
    \or:
    \else:
      \__fp_case_return_same_o:w
    \fi:
    \__fp_ln_npos_o:w \s__fp \__fp_chk:w #2#3#4;
  }
\cs_new:Npn \__fp_ln_npos_o:w \s__fp \__fp_chk:w 10#1#2#3;
  { %^^A todo: ln(1) should be "exact zero", not "underflow"
    \exp_after:wN \__fp_sanitize:Nw
    \__int_value:w % for the overall sign
      \if_int_compare:w #1 < 1 \exp_stop_f:
        2
      \else:
        0
      \fi:
      \exp_after:wN \exp_stop_f:
      \__int_value:w \__int_eval:w % for the exponent
        \__fp_ln_significand:NNNNnnnN #2#3
        \__fp_ln_exponent:wn {#1}
  }
\cs_new:Npn \__fp_ln_significand:NNNNnnnN #1#2#3#4
  {
    \exp_after:wN \__fp_ln_x_ii:wnnnn
    \__int_value:w
      \if_case:w #1 \exp_stop_f:
      \or:
        \if_int_compare:w #2 < 4 \exp_stop_f:
          \__int_eval:w 10 - #2
        \else:
          6
        \fi:
      \or: 4
      \or: 3
      \or: 2
      \or: 2
      \or: 2
      \else: 1
      \fi:
    ; { #1 #2 #3 #4 }
  }
\cs_new:Npn \__fp_ln_x_ii:wnnnn #1; #2#3#4#5
  {
    \exp_after:wN \__fp_ln_div_after:Nw
    \cs:w c__fp_ln_ \__int_to_roman:w #1 _fixed_tl \exp_after:wN \cs_end:
    \__int_value:w
      \exp_after:wN \__fp_ln_x_iv:wnnnnnnnn
      \__int_value:w \__int_eval:w
        \exp_after:wN \__fp_ln_x_iii_var:NNNNNw
        \__int_value:w \__int_eval:w 9999 9990 + #1*#2#3 +
          \exp_after:wN \__fp_ln_x_iii:NNNNNNw
          \__int_value:w \__int_eval:w 10 0000 0000 + #1*#4#5 ;
    {20000} {0000} {0000} {0000}
  } %^^A todo: reoptimize (a generalization attempt failed).
\cs_new:Npn \__fp_ln_x_iii:NNNNNNw #1#2 #3#4#5#6 #7;
  { #1#2; {#3#4#5#6} {#7} }
\cs_new:Npn \__fp_ln_x_iii_var:NNNNNw #1 #2#3#4#5 #6;
  {
    #1#2#3#4#5 + 1 ;
    {#1#2#3#4#5} {#6}
  }
\cs_new:Npn \__fp_ln_x_iv:wnnnnnnnn #1; #2#3#4#5 #6#7#8#9
  {
    \exp_after:wN \__fp_div_significand_pack:NNN
    \__int_value:w \__int_eval:w
    \__fp_ln_div_i:w #1 ;
      #6 #7 ; {#8} {#9}
      {#2} {#3} {#4} {#5}
      { \exp_after:wN \__fp_ln_div_ii:wwn \__int_value:w #1 }
      { \exp_after:wN \__fp_ln_div_ii:wwn \__int_value:w #1 }
      { \exp_after:wN \__fp_ln_div_ii:wwn \__int_value:w #1 }
      { \exp_after:wN \__fp_ln_div_ii:wwn \__int_value:w #1 }
      { \exp_after:wN \__fp_ln_div_vi:wwn \__int_value:w #1 }
  }
\cs_new:Npn \__fp_ln_div_i:w #1;
  {
    \exp_after:wN \__fp_div_significand_calc:wwnnnnnnn
    \__int_value:w \__int_eval:w 999999 + 2 0000 0000 / #1 ; % Q1
  }
\cs_new:Npn \__fp_ln_div_ii:wwn #1; #2;#3 % y; B1;B2 <- for k=1
  {
    \exp_after:wN \__fp_div_significand_pack:NNN
    \__int_value:w \__int_eval:w
      \exp_after:wN \__fp_div_significand_calc:wwnnnnnnn
      \__int_value:w \__int_eval:w 999999 + #2 #3 / #1 ; % Q2
      #2 #3 ;
  }
\cs_new:Npn \__fp_ln_div_vi:wwn #1; #2;#3#4#5 #6#7#8#9 %y;F1;F2F3F4x1x2x3x4
  {
    \exp_after:wN \__fp_div_significand_pack:NNN
    \__int_value:w \__int_eval:w 1000000 + #2 #3 / #1 ; % Q6
  }
\cs_new:Npn \__fp_ln_div_after:Nw #1#2;
  {
    \if_meaning:w 0 #2
      \exp_after:wN \__fp_ln_t_small:Nw
    \else:
      \exp_after:wN \__fp_ln_t_large:NNw
      \exp_after:wN -
    \fi:
    #1
  }
\cs_new:Npn \__fp_ln_t_small:Nw #1 #2; #3; #4; #5; #6; #7;
  {
    \exp_after:wN \__fp_ln_t_large:NNw
    \exp_after:wN + % <sign>
    \exp_after:wN #1
    \__int_value:w \__int_eval:w 9999 - #2 \exp_after:wN ;
    \__int_value:w \__int_eval:w 9999 - #3 \exp_after:wN ;
    \__int_value:w \__int_eval:w 9999 - #4 \exp_after:wN ;
    \__int_value:w \__int_eval:w 9999 - #5 \exp_after:wN ;
    \__int_value:w \__int_eval:w 9999 - #6 \exp_after:wN ;
    \__int_value:w \__int_eval:w 1 0000 - #7 ;
  }
\cs_new:Npn \__fp_ln_t_large:NNw #1 #2 #3; #4; #5; #6; #7; #8;
  {
    \exp_after:wN \__fp_ln_square_t_after:w
    \__int_value:w \__int_eval:w 9999 0000 + #3*#3
      \exp_after:wN \__fp_ln_square_t_pack:NNNNNw
      \__int_value:w \__int_eval:w 9999 0000 + 2*#3*#4
        \exp_after:wN \__fp_ln_square_t_pack:NNNNNw
        \__int_value:w \__int_eval:w 9999 0000 + 2*#3*#5 + #4*#4
          \exp_after:wN \__fp_ln_square_t_pack:NNNNNw
          \__int_value:w \__int_eval:w 9999 0000 + 2*#3*#6 + 2*#4*#5
            \exp_after:wN \__fp_ln_square_t_pack:NNNNNw
            \__int_value:w \__int_eval:w 1 0000 0000 + 2*#3*#7 + 2*#4*#6 + #5*#5
              + (2*#3*#8 + 2*#4*#7 + 2*#5*#6) / 1 0000
              % ; ; ;
    \exp_after:wN \__fp_ln_twice_t_after:w
    \__int_value:w \__int_eval:w -1 + 2*#3
      \exp_after:wN \__fp_ln_twice_t_pack:Nw
      \__int_value:w \__int_eval:w 9999 + 2*#4
        \exp_after:wN \__fp_ln_twice_t_pack:Nw
        \__int_value:w \__int_eval:w 9999 + 2*#5
          \exp_after:wN \__fp_ln_twice_t_pack:Nw
          \__int_value:w \__int_eval:w 9999 + 2*#6
            \exp_after:wN \__fp_ln_twice_t_pack:Nw
            \__int_value:w \__int_eval:w 9999 + 2*#7
              \exp_after:wN \__fp_ln_twice_t_pack:Nw
              \__int_value:w \__int_eval:w 10000 + 2*#8 ; ;
    { \__fp_ln_c:NwNw #1 }
    #2
  }
\cs_new:Npn \__fp_ln_twice_t_pack:Nw #1 #2; { + #1 ; {#2} }
\cs_new:Npn \__fp_ln_twice_t_after:w #1; { ;;; {#1} }
\cs_new:Npn \__fp_ln_square_t_pack:NNNNNw #1 #2#3#4#5 #6;
  { + #1#2#3#4#5 ; {#6} }
\cs_new:Npn \__fp_ln_square_t_after:w 1 0 #1#2#3 #4;
  { \__fp_ln_Taylor:wwNw {0#1#2#3} {#4} }
\cs_new:Npn \__fp_ln_Taylor:wwNw
  { \__fp_ln_Taylor_loop:www 21 ; {0000}{0000}{0000}{0000}{0000}{0000} ; }
\cs_new:Npn \__fp_ln_Taylor_loop:www #1; #2; #3;
  {
    \if_int_compare:w #1 = 1 \exp_stop_f:
      \__fp_ln_Taylor_break:w
    \fi:
    \exp_after:wN \__fp_fixed_div_int:wwN \c__fp_one_fixed_tl #1;
    \__fp_fixed_add:wwn #2;
    \__fp_fixed_mul:wwn #3;
    {
      \exp_after:wN \__fp_ln_Taylor_loop:www
      \__int_value:w \__int_eval:w #1 - 2 ;
    }
    #3;
  }
\cs_new:Npn \__fp_ln_Taylor_break:w \fi: #1 \__fp_fixed_add:wwn #2#3; #4 ;;
  {
    \fi:
    \exp_after:wN \__fp_fixed_mul:wwn
    \exp_after:wN { \__int_value:w \__int_eval:w 10000 + #2 } #3;
  }
\cs_new:Npn \__fp_ln_c:NwNw #1 #2; #3
  {
    \if_meaning:w + #1
      \exp_after:wN \exp_after:wN \exp_after:wN \__fp_fixed_sub:wwn
    \else:
      \exp_after:wN \exp_after:wN \exp_after:wN \__fp_fixed_add:wwn
    \fi:
    #3 #2 ;
  }
\cs_new:Npn \__fp_ln_exponent:wn #1; #2
  {
    \if_case:w #2 \exp_stop_f:
      0 \__fp_case_return:nw { \__fp_fixed_to_float_o:Nw 2 }
    \or:
      \exp_after:wN \__fp_ln_exponent_one:ww \__int_value:w
    \else:
      \if_int_compare:w #2 > 0 \exp_stop_f:
        \exp_after:wN \__fp_ln_exponent_small:NNww
        \exp_after:wN 0
        \exp_after:wN \__fp_fixed_sub:wwn \__int_value:w
      \else:
        \exp_after:wN \__fp_ln_exponent_small:NNww
        \exp_after:wN 2
        \exp_after:wN \__fp_fixed_add:wwn \__int_value:w -
      \fi:
    \fi:
    #2; #1;
  }
\cs_new:Npn \__fp_ln_exponent_one:ww 1; #1;
  {
    0
    \exp_after:wN \__fp_fixed_sub:wwn \c__fp_ln_x_fixed_tl #1;
    \__fp_fixed_to_float_o:wN 0
  }
\cs_new:Npn \__fp_ln_exponent_small:NNww #1#2#3; #4#5#6#7#8#9;
  {
    4
    \exp_after:wN \__fp_fixed_mul:wwn
      \c__fp_ln_x_fixed_tl
      {#3}{0000}{0000}{0000}{0000}{0000} ;
    #2
      {0000}{#4}{#5}{#6}{#7}{#8};
    \__fp_fixed_to_float_o:wN #1
  }
\cs_new:Npn \__fp_exp_o:w #1 \s__fp \__fp_chk:w #2#3#4; @
  {
    \if_case:w #2 \exp_stop_f:
      \__fp_case_return_o:Nw \c_one_fp
    \or:
      \exp_after:wN \__fp_exp_normal_o:w
    \or:
      \if_meaning:w 0 #3
        \exp_after:wN \__fp_case_return_o:Nw
        \exp_after:wN \c_inf_fp
      \else:
        \exp_after:wN \__fp_case_return_o:Nw
        \exp_after:wN \c_zero_fp
      \fi:
    \or:
      \__fp_case_return_same_o:w
    \fi:
    \s__fp \__fp_chk:w #2#3#4;
  }
\cs_new:Npn \__fp_exp_normal_o:w \s__fp \__fp_chk:w 1#1
  {
    \if_meaning:w 0 #1
      \__fp_exp_pos_o:NNwnw + \__fp_fixed_to_float_o:wN
    \else:
      \__fp_exp_pos_o:NNwnw - \__fp_fixed_inv_to_float_o:wN
    \fi:
  }
\cs_new:Npn \__fp_exp_pos_o:NNwnw #1#2#3 \fi: #4#5;
  {
    \fi:
    \if_int_compare:w #4 > \c__fp_max_exp_exponent_int
      \token_if_eq_charcode:NNTF + #1
        { \__fp_exp_overflow:NN \__fp_overflow:w \c_inf_fp }
        { \__fp_exp_overflow:NN \__fp_underflow:w \c_zero_fp }
      \exp:w
    \else:
      \exp_after:wN \__fp_sanitize:Nw
      \exp_after:wN 0
      \__int_value:w #1 \__int_eval:w
        \if_int_compare:w #4 < 0 \exp_stop_f:
          \exp_after:wN \use_i:nn
        \else:
          \exp_after:wN \use_ii:nn
        \fi:
        {
          0
          \__fp_decimate:nNnnnn { - #4 }
            \__fp_exp_Taylor:Nnnwn
        }
        {
          \__fp_decimate:nNnnnn { \c__fp_prec_int - #4 }
            \__fp_exp_pos_large:NnnNwn
        }
        #5
        {#4}
        #1 #2 0
        \exp:w
    \fi:
    \exp_after:wN \exp_end:
  }
\cs_new:Npn \__fp_exp_overflow:NN #1#2
  {
    \exp_after:wN \exp_after:wN
    \exp_after:wN #1
    \exp_after:wN #2
  }
\cs_new:Npn \__fp_exp_Taylor:Nnnwn #1#2#3 #4; #5 #6
  {
    #6
    \__fp_pack_twice_four:wNNNNNNNN
    \__fp_pack_twice_four:wNNNNNNNN
    \__fp_pack_twice_four:wNNNNNNNN
    \__fp_exp_Taylor_ii:ww
    ; #2#3#4 0000 0000 ;
  }
\cs_new:Npn \__fp_exp_Taylor_ii:ww #1; #2;
  { \__fp_exp_Taylor_loop:www 10 ; #1 ; #1 ; \s__stop }
\cs_new:Npn \__fp_exp_Taylor_loop:www #1; #2; #3;
  {
    \if_int_compare:w #1 = 1 \exp_stop_f:
      \exp_after:wN \__fp_exp_Taylor_break:Nww
    \fi:
    \__fp_fixed_div_int:wwN #3 ; #1 ;
    \__fp_fixed_add_one:wN
    \__fp_fixed_mul:wwn #2 ;
    {
      \exp_after:wN \__fp_exp_Taylor_loop:www
      \__int_value:w \__int_eval:w #1 - 1 ;
      #2 ;
    }
  }
\cs_new:Npn \__fp_exp_Taylor_break:Nww #1 #2; #3 \s__stop
  { \__fp_fixed_add_one:wN #2 ; }
\cs_new:Npn \__fp_exp_pos_large:NnnNwn #1#2#3 #4#5; #6
  {
    \exp_after:wN \exp_after:wN
    \cs:w __fp_exp_large_ \__int_to_roman:w #6 :wN \exp_after:wN \cs_end:
    \exp_after:wN \c__fp_one_fixed_tl
    \__int_value:w #3 #4 \exp_stop_f:
    #5 00000 ;
  }
\cs_new:Npn \__fp_exp_large:w #1 \or: #2 \fi:
  { \fi: \__fp_fixed_mul:wwn #1; }
\cs_new:Npn \__fp_exp_large_v:wN #1; #2
  {
    \if_case:w #2 ~           \exp_after:wN \__fp_fixed_continue:wn  \or:
      +  4343 \__fp_exp_large:w {8806}{8182}{2566}{2921}{5872}{6150} \or:
      +  8686 \__fp_exp_large:w {7756}{0047}{2598}{6861}{0458}{3204} \or:
      + 13029 \__fp_exp_large:w {6830}{5723}{7791}{4884}{1932}{7351} \or:
      + 17372 \__fp_exp_large:w {6015}{5609}{3095}{3052}{3494}{7574} \or:
      + 21715 \__fp_exp_large:w {5297}{7951}{6443}{0315}{3251}{3576} \or:
      + 26058 \__fp_exp_large:w {4665}{6719}{0099}{3379}{5527}{2929} \or:
      + 30401 \__fp_exp_large:w {4108}{9724}{3326}{3186}{5271}{5665} \or:
      + 34744 \__fp_exp_large:w {3618}{6973}{3140}{0875}{3856}{4102} \or:
      + 39087 \__fp_exp_large:w {3186}{9209}{6113}{3900}{6705}{9685} \or:
    \fi:
    #1;
    \__fp_exp_large_iv:wN
  }
\cs_new:Npn \__fp_exp_large_iv:wN #1; #2
  {
    \if_case:w #2 ~          \exp_after:wN \__fp_fixed_continue:wn  \or:
      +  435 \__fp_exp_large:w {1970}{0711}{1401}{7046}{9938}{8888} \or:
      +  869 \__fp_exp_large:w {3881}{1801}{9428}{4368}{5764}{8232} \or:
      + 1303 \__fp_exp_large:w {7646}{2009}{8905}{4704}{8893}{1073} \or:
      + 1738 \__fp_exp_large:w {1506}{3559}{7005}{0524}{9009}{7592} \or:
      + 2172 \__fp_exp_large:w {2967}{6283}{8402}{3667}{0689}{6630} \or:
      + 2606 \__fp_exp_large:w {5846}{4389}{5650}{2114}{7278}{5046} \or:
      + 3041 \__fp_exp_large:w {1151}{7900}{5080}{6878}{2914}{4154} \or:
      + 3475 \__fp_exp_large:w {2269}{1083}{0850}{6857}{8724}{4002} \or:
      + 3909 \__fp_exp_large:w {4470}{3047}{3316}{5442}{6408}{6591} \or:
    \fi:
    #1;
    \__fp_exp_large_iii:wN
  }
\cs_new:Npn \__fp_exp_large_iii:wN #1; #2
  {
    \if_case:w #2 ~         \exp_after:wN \__fp_fixed_continue:wn  \or:
      +  44 \__fp_exp_large:w {2688}{1171}{4181}{6135}{4484}{1263} \or:
      +  87 \__fp_exp_large:w {7225}{9737}{6812}{5749}{2581}{7748} \or:
      + 131 \__fp_exp_large:w {1942}{4263}{9524}{1255}{9365}{8421} \or:
      + 174 \__fp_exp_large:w {5221}{4696}{8976}{4143}{9505}{8876} \or:
      + 218 \__fp_exp_large:w {1403}{5922}{1785}{2837}{4107}{3977} \or:
      + 261 \__fp_exp_large:w {3773}{0203}{0092}{9939}{8234}{0143} \or:
      + 305 \__fp_exp_large:w {1014}{2320}{5473}{5004}{5094}{5533} \or:
      + 348 \__fp_exp_large:w {2726}{3745}{7211}{2566}{5673}{6478} \or:
      + 391 \__fp_exp_large:w {7328}{8142}{2230}{7421}{7051}{8866} \or:
    \fi:
    #1;
    \__fp_exp_large_ii:wN
  }
\cs_new:Npn \__fp_exp_large_ii:wN #1; #2
  {
    \if_case:w #2 ~        \exp_after:wN \__fp_fixed_continue:wn  \or:
      +  5 \__fp_exp_large:w {2202}{6465}{7948}{0671}{6516}{9579} \or:
      +  9 \__fp_exp_large:w {4851}{6519}{5409}{7902}{7796}{9107} \or:
      + 14 \__fp_exp_large:w {1068}{6474}{5815}{2446}{2146}{9905} \or:
      + 18 \__fp_exp_large:w {2353}{8526}{6837}{0199}{8540}{7900} \or:
      + 22 \__fp_exp_large:w {5184}{7055}{2858}{7072}{4640}{8745} \or:
      + 27 \__fp_exp_large:w {1142}{0073}{8981}{5684}{2836}{6296} \or:
      + 31 \__fp_exp_large:w {2515}{4386}{7091}{9167}{0062}{6578} \or:
      + 35 \__fp_exp_large:w {5540}{6223}{8439}{3510}{0525}{7117} \or:
      + 40 \__fp_exp_large:w {1220}{4032}{9431}{7840}{8020}{0271} \or:
    \fi:
    #1;
    \__fp_exp_large_i:wN
  }
\cs_new:Npn \__fp_exp_large_i:wN #1; #2
  {
    \if_case:w #2 ~       \exp_after:wN \__fp_fixed_continue:wn  \or:
      + 1 \__fp_exp_large:w {2718}{2818}{2845}{9045}{2353}{6029} \or:
      + 1 \__fp_exp_large:w {7389}{0560}{9893}{0650}{2272}{3043} \or:
      + 2 \__fp_exp_large:w {2008}{5536}{9231}{8766}{7740}{9285} \or:
      + 2 \__fp_exp_large:w {5459}{8150}{0331}{4423}{9078}{1103} \or:
      + 3 \__fp_exp_large:w {1484}{1315}{9102}{5766}{0342}{1116} \or:
      + 3 \__fp_exp_large:w {4034}{2879}{3492}{7351}{2260}{8387} \or:
      + 4 \__fp_exp_large:w {1096}{6331}{5842}{8458}{5992}{6372} \or:
      + 4 \__fp_exp_large:w {2980}{9579}{8704}{1728}{2747}{4359} \or:
      + 4 \__fp_exp_large:w {8103}{0839}{2757}{5384}{0077}{1000} \or:
    \fi:
    #1;
    \__fp_exp_large_:wN
  }
\cs_new:Npn \__fp_exp_large_:wN #1; #2
  {
    \if_case:w #2 ~       \exp_after:wN \__fp_fixed_continue:wn  \or:
      + 1 \__fp_exp_large:w {1105}{1709}{1807}{5647}{6248}{1171} \or:
      + 1 \__fp_exp_large:w {1221}{4027}{5816}{0169}{8339}{2107} \or:
      + 1 \__fp_exp_large:w {1349}{8588}{0757}{6003}{1039}{8374} \or:
      + 1 \__fp_exp_large:w {1491}{8246}{9764}{1270}{3178}{2485} \or:
      + 1 \__fp_exp_large:w {1648}{7212}{7070}{0128}{1468}{4865} \or:
      + 1 \__fp_exp_large:w {1822}{1188}{0039}{0508}{9748}{7537} \or:
      + 1 \__fp_exp_large:w {2013}{7527}{0747}{0476}{5216}{2455} \or:
      + 1 \__fp_exp_large:w {2225}{5409}{2849}{2467}{6045}{7954} \or:
      + 1 \__fp_exp_large:w {2459}{6031}{1115}{6949}{6638}{0013} \or:
    \fi:
    #1;
    \__fp_exp_large_after:wwn
  }
\cs_new:Npn \__fp_exp_large_after:wwn #1; #2; #3
  {
    \__fp_exp_Taylor:Nnnwn ? { } { } 0 #2; {} #3
    \__fp_fixed_mul:wwn #1;
  }
\cs_new:cpn { __fp_ \iow_char:N \^ _o:ww }
    \s__fp \__fp_chk:w #1#2#3; \s__fp \__fp_chk:w #4#5#6;
  {
    \if_meaning:w 0 #4
      \__fp_case_return_o:Nw \c_one_fp
    \fi:
    \if_case:w #2 \exp_stop_f:
      \exp_after:wN \use_i:nn
    \or:
      \__fp_case_return_o:Nw \c_nan_fp
    \else:
      \exp_after:wN \__fp_pow_neg:www
      \exp:w \exp_end_continue_f:w \exp_after:wN \use:nn
    \fi:
    {
      \if_meaning:w 1 #1
        \exp_after:wN \__fp_pow_normal_o:ww
      \else:
        \exp_after:wN \__fp_pow_zero_or_inf:ww
      \fi:
      \s__fp \__fp_chk:w #1#2#3;
    }
    { \s__fp \__fp_chk:w #4#5#6; \s__fp \__fp_chk:w #1#2#3; }
    \s__fp \__fp_chk:w #4#5#6;
  }
\cs_new:Npn \__fp_pow_zero_or_inf:ww
    \s__fp \__fp_chk:w #1#2; \s__fp \__fp_chk:w #3#4
  {
    \if_meaning:w 1 #4
      \__fp_case_return_same_o:w
    \fi:
    \if_meaning:w #1 #4
      \__fp_case_return_o:Nw \c_zero_fp
    \fi:
    \if_meaning:w 2 #1
      \__fp_case_return_o:Nw \c_inf_fp
    \fi:
    \if_meaning:w 2 #3
      \__fp_case_return_o:Nw \c_inf_fp
    \else:
      \__fp_case_use:nw
        {
          \__fp_division_by_zero_o:NNww \c_inf_fp ^
            \s__fp \__fp_chk:w #1 #2 ;
        }
    \fi:
    \s__fp \__fp_chk:w #3#4
  }
\cs_new:Npn \__fp_pow_normal_o:ww
    \s__fp \__fp_chk:w 1 #1#2#3; \s__fp \__fp_chk:w #4#5
  {
    \if_int_compare:w \__str_if_eq_x:nn { #2 #3 }
              { 1 {1000} {0000} {0000} {0000} } = 0 \exp_stop_f:
      \if_int_compare:w #4 #1 = 32 \exp_stop_f:
        \exp_after:wN \__fp_case_return_ii_o:ww
      \fi:
      \__fp_case_return_o:Nww \c_one_fp
    \fi:
    \if_case:w #4 \exp_stop_f:
    \or:
      \exp_after:wN \__fp_pow_npos_o:Nww
      \exp_after:wN #5
    \or:
      \if_meaning:w 2 #5 \exp_after:wN \reverse_if:N \fi:
      \if_int_compare:w #2 > 0 \exp_stop_f:
        \exp_after:wN \__fp_case_return_o:Nww
        \exp_after:wN \c_inf_fp
      \else:
        \exp_after:wN \__fp_case_return_o:Nww
        \exp_after:wN \c_zero_fp
      \fi:
    \or:
      \__fp_case_return_ii_o:ww
    \fi:
    \s__fp \__fp_chk:w 1 #1 {#2} #3 ;
    \s__fp \__fp_chk:w #4 #5
  }
\cs_new:Npn \__fp_pow_npos_o:Nww #1 \s__fp \__fp_chk:w 1#2#3
  {
    \exp_after:wN \__fp_sanitize:Nw
    \exp_after:wN 0
    \__int_value:w
      \if:w #1 \if_int_compare:w #3 > 0 \exp_stop_f: 0 \else: 2 \fi:
        \exp_after:wN \__fp_pow_npos_aux:NNnww
        \exp_after:wN +
        \exp_after:wN \__fp_fixed_to_float_o:wN
      \else:
        \exp_after:wN \__fp_pow_npos_aux:NNnww
        \exp_after:wN -
        \exp_after:wN \__fp_fixed_inv_to_float_o:wN
      \fi:
      {#3}
  }
\cs_new:Npn \__fp_pow_npos_aux:NNnww #1#2#3#4#5; \s__fp \__fp_chk:w 1#6#7#8;
  {
    #1
    \__int_eval:w
      \__fp_ln_significand:NNNNnnnN #4#5
      \__fp_pow_exponent:wnN {#3}
      \__fp_fixed_mul:wwn #8 {0000}{0000} ;
      \__fp_pow_B:wwN #7;
      #1 #2 0 % fixed_to_float_o:wN
  }
\cs_new:Npn \__fp_pow_exponent:wnN #1; #2
  {
    \if_int_compare:w #2 > 0 \exp_stop_f:
      \exp_after:wN \__fp_pow_exponent:Nwnnnnnw % n\ln(10) - (-\ln(x))
      \exp_after:wN +
    \else:
      \exp_after:wN \__fp_pow_exponent:Nwnnnnnw % -(|n|\ln(10) + (-\ln(x)))
      \exp_after:wN -
    \fi:
    #2; #1;
  }
\cs_new:Npn \__fp_pow_exponent:Nwnnnnnw #1#2; #3#4#5#6#7#8;
  { %^^A todo: use that in ln.
    \exp_after:wN \__fp_fixed_mul_after:wwn
    \__int_value:w \__int_eval:w \c__fp_leading_shift_int
      \exp_after:wN \__fp_pack:NNNNNw
      \__int_value:w \__int_eval:w \c__fp_middle_shift_int
        #1#2*23025 - #1 #3
        \exp_after:wN \__fp_pack:NNNNNw
        \__int_value:w \__int_eval:w \c__fp_middle_shift_int
          #1 #2*8509 - #1 #4
          \exp_after:wN \__fp_pack:NNNNNw
          \__int_value:w \__int_eval:w \c__fp_middle_shift_int
            #1 #2*2994 - #1 #5
            \exp_after:wN \__fp_pack:NNNNNw
            \__int_value:w \__int_eval:w \c__fp_middle_shift_int
              #1 #2*0456 - #1 #6
              \exp_after:wN \__fp_pack:NNNNNw
              \__int_value:w \__int_eval:w \c__fp_trailing_shift_int
                #1 #2*8401 - #1 #7
                #1 ( #2*7991 - #8 ) / 1 0000 ; ;
  }
\cs_new:Npn \__fp_pow_B:wwN #1#2#3#4#5#6; #7;
  {
    \if_int_compare:w #7 < 0 \exp_stop_f:
      \exp_after:wN \__fp_pow_C_neg:w \__int_value:w -
    \else:
      \if_int_compare:w #7 < 22 \exp_stop_f:
        \exp_after:wN \__fp_pow_C_pos:w \__int_value:w
      \else:
        \exp_after:wN \__fp_pow_C_overflow:w \__int_value:w
      \fi:
    \fi:
    #7 \exp_after:wN ;
    \__int_value:w \__int_eval:w 10 0000 + #1 \__int_eval_end:
    #2#3#4#5#6 0000 0000 0000 0000 0000 0000 ; %^^A todo: how many 0?
  }
\cs_new:Npn \__fp_pow_C_overflow:w #1; #2; #3
  {
    + 2 * \c__fp_max_exponent_int
    \exp_after:wN \__fp_fixed_continue:wn \c__fp_one_fixed_tl
  }
\cs_new:Npn \__fp_pow_C_neg:w #1 ; 1
  {
    \exp_after:wN \exp_after:wN \exp_after:wN \__fp_pow_C_pack:w
    \prg_replicate:nn {#1} {0}
  }
\cs_new:Npn \__fp_pow_C_pos:w #1; 1
  { \__fp_pow_C_pos_loop:wN #1; }
\cs_new:Npn \__fp_pow_C_pos_loop:wN #1; #2
  {
    \if_meaning:w 0 #1
      \exp_after:wN \__fp_pow_C_pack:w
      \exp_after:wN #2
    \else:
      \if_meaning:w 0 #2
        \exp_after:wN \__fp_pow_C_pos_loop:wN \__int_value:w
      \else:
        \exp_after:wN \__fp_pow_C_overflow:w \__int_value:w
      \fi:
      \__int_eval:w #1 - 1 \exp_after:wN ;
    \fi:
  }
\cs_new:Npn \__fp_pow_C_pack:w
  { \exp_after:wN \__fp_exp_large_v:wN \c__fp_one_fixed_tl }
\cs_new:Npn \__fp_pow_neg:www \s__fp \__fp_chk:w #1#2; #3; #4;
  {
    \if_case:w \__fp_pow_neg_case:w #4 ;
      \exp_after:wN \__fp_pow_neg_aux:wNN
    \or:
      \if_int_compare:w \__int_eval:w #1 / 2 = 1 \exp_stop_f:
        \__fp_invalid_operation_o:Nww ^ #3; #4;
        \exp:w \exp_end_continue_f:w
        \exp_after:wN \exp_after:wN
        \exp_after:wN \__fp_use_none_until_s:w
      \fi:
    \fi:
    \__fp_exp_after_o:w
    \s__fp \__fp_chk:w #1#2;
  }
\cs_new:Npn \__fp_pow_neg_aux:wNN #1 \s__fp \__fp_chk:w #2#3
  {
    \exp_after:wN \__fp_exp_after_o:w
    \exp_after:wN \s__fp
    \exp_after:wN \__fp_chk:w
    \exp_after:wN #2
    \__int_value:w \__int_eval:w 2 - #3 \__int_eval_end:
  }
\cs_new:Npn \__fp_pow_neg_case:w \s__fp \__fp_chk:w #1#2#3;
  {
    \if_case:w #1 \exp_stop_f:
           -1
    \or:   \__fp_pow_neg_case_aux:nnnnn #3
    \or:   -1
    \else: 1
    \fi:
    \exp_stop_f:
  }
\cs_new:Npn \__fp_pow_neg_case_aux:nnnnn #1#2#3#4#5
  { \__fp_pow_neg_case_aux:w #1 ; #2 #3 ; #4 #5 ; }
\cs_new:Npn \__fp_pow_neg_case_aux:w #1 ; #2 ; #3 ;
  {
    \if_int_compare:w #1 > \c__fp_prec_int
      -1
    \else:
      \if_int_odd:w #3 \exp_stop_f:
        \if_int_compare:w #1 = \c__fp_prec_int
          0
        \else:
          1
        \fi:
      \else:
        \exp_after:wN \__fp_pow_neg_case_aux:w
        \__int_value:w \__int_eval:w #1 + 1 \exp_after:wN ;
        \__int_value:w \__int_eval:w (#2 + 1) / 2 - 1 \exp_after:wN ;
        \__int_value:w \__int_eval:w
          \if_int_odd:w #2 \exp_stop_f: 5000 0000 + \fi: #3 / 2 ;
      \fi:
    \fi:
  }
%% File: l3fp-trig.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project
\tl_map_inline:nn
  {
    {acos} {acsc} {asec} {asin}
    {cos} {cot} {csc} {sec} {sin} {tan}
  }
  {
    \cs_new:cpx { __fp_parse_word_#1:N }
      {
        \exp_not:N \__fp_parse_unary_function:NNN
        \exp_not:c { __fp_#1_o:w }
        \exp_not:N \use_i:nn
      }
    \cs_new:cpx { __fp_parse_word_#1d:N }
      {
        \exp_not:N \__fp_parse_unary_function:NNN
        \exp_not:c { __fp_#1_o:w }
        \exp_not:N \use_ii:nn
      }
  }
\cs_new:Npn \__fp_parse_word_acot:N
  { \__fp_parse_function:NNN \__fp_acot_o:Nw \use_i:nn }
\cs_new:Npn \__fp_parse_word_acotd:N
  { \__fp_parse_function:NNN \__fp_acot_o:Nw \use_ii:nn }
\cs_new:Npn \__fp_parse_word_atan:N
  { \__fp_parse_function:NNN \__fp_atan_o:Nw \use_i:nn }
\cs_new:Npn \__fp_parse_word_atand:N
  { \__fp_parse_function:NNN \__fp_atan_o:Nw \use_ii:nn }
\cs_new:Npn \__fp_sin_o:w #1 \s__fp \__fp_chk:w #2#3#4; @
  {
    \if_case:w #2 \exp_stop_f:
           \__fp_case_return_same_o:w
    \or:   \__fp_case_use:nw
             {
               \__fp_trig:NNNNNwn #1 \__fp_sin_series_o:NNwwww
                 \__fp_ep_to_float_o:wwN #3 0
             }
    \or:   \__fp_case_use:nw
             { \__fp_invalid_operation_o:fw { #1 { sin } { sind } } }
    \else: \__fp_case_return_same_o:w
    \fi:
    \s__fp \__fp_chk:w #2 #3 #4;
  }
\cs_new:Npn \__fp_cos_o:w #1 \s__fp \__fp_chk:w #2#3; @
  {
    \if_case:w #2 \exp_stop_f:
           \__fp_case_return_o:Nw \c_one_fp
    \or:   \__fp_case_use:nw
             {
               \__fp_trig:NNNNNwn #1 \__fp_sin_series_o:NNwwww
                 \__fp_ep_to_float_o:wwN 0 2
             }
    \or:   \__fp_case_use:nw
             { \__fp_invalid_operation_o:fw { #1 { cos } { cosd } } }
    \else: \__fp_case_return_same_o:w
    \fi:
    \s__fp \__fp_chk:w #2 #3;
  }
\cs_new:Npn \__fp_csc_o:w #1 \s__fp \__fp_chk:w #2#3#4; @
  {
    \if_case:w #2 \exp_stop_f:
           \__fp_cot_zero_o:Nfw #3 { #1 { csc } { cscd } }
    \or:   \__fp_case_use:nw
             {
               \__fp_trig:NNNNNwn #1 \__fp_sin_series_o:NNwwww
                 \__fp_ep_inv_to_float_o:wwN #3 0
             }
    \or:   \__fp_case_use:nw
             { \__fp_invalid_operation_o:fw { #1 { csc } { cscd } } }
    \else: \__fp_case_return_same_o:w
    \fi:
    \s__fp \__fp_chk:w #2 #3 #4;
  }
\cs_new:Npn \__fp_sec_o:w #1 \s__fp \__fp_chk:w #2#3; @
  {
    \if_case:w #2 \exp_stop_f:
           \__fp_case_return_o:Nw \c_one_fp
    \or:   \__fp_case_use:nw
             {
               \__fp_trig:NNNNNwn #1 \__fp_sin_series_o:NNwwww
                 \__fp_ep_inv_to_float_o:wwN 0 2
             }
    \or:   \__fp_case_use:nw
             { \__fp_invalid_operation_o:fw { #1 { sec } { secd } } }
    \else: \__fp_case_return_same_o:w
    \fi:
    \s__fp \__fp_chk:w #2 #3;
  }
\cs_new:Npn \__fp_tan_o:w #1 \s__fp \__fp_chk:w #2#3#4; @
  {
    \if_case:w #2 \exp_stop_f:
           \__fp_case_return_same_o:w
    \or:   \__fp_case_use:nw
             {
               \__fp_trig:NNNNNwn #1
                 \__fp_tan_series_o:NNwwww 0 #3 1
             }
    \or:   \__fp_case_use:nw
             { \__fp_invalid_operation_o:fw { #1 { tan } { tand } } }
    \else: \__fp_case_return_same_o:w
    \fi:
    \s__fp \__fp_chk:w #2 #3 #4;
  }
\cs_new:Npn \__fp_cot_o:w #1 \s__fp \__fp_chk:w #2#3#4; @
  {
    \if_case:w #2 \exp_stop_f:
           \__fp_cot_zero_o:Nfw #3 { #1 { cot } { cotd } }
    \or:   \__fp_case_use:nw
             {
               \__fp_trig:NNNNNwn #1
                 \__fp_tan_series_o:NNwwww 2 #3 3
             }
    \or:   \__fp_case_use:nw
             { \__fp_invalid_operation_o:fw { #1 { cot } { cotd } } }
    \else: \__fp_case_return_same_o:w
    \fi:
    \s__fp \__fp_chk:w #2 #3 #4;
  }
\cs_new:Npn \__fp_cot_zero_o:Nfw #1#2#3 \fi:
  {
    \fi:
    \token_if_eq_meaning:NNTF 0 #1
      { \exp_args:NNf \__fp_division_by_zero_o:Nnw \c_inf_fp }
      { \exp_args:NNf \__fp_division_by_zero_o:Nnw \c_minus_inf_fp }
    {#2}
  }
\cs_new:Npn \__fp_trig:NNNNNwn #1#2#3#4#5 \s__fp \__fp_chk:w 1#6#7#8;
  {
    \exp_after:wN #2
    \exp_after:wN #3
    \exp_after:wN #4
    \__int_value:w \__int_eval:w #5
      \exp_after:wN \exp_after:wN \exp_after:wN \exp_after:wN
      \if_int_compare:w #7 > #1 0 1 \exp_stop_f:
        #1 \__fp_trig_large:ww \__fp_trigd_large:ww
      \else:
        #1 \__fp_trig_small:ww \__fp_trigd_small:ww
      \fi:
    #7,#8{0000}{0000};
  }
\cs_new:Npn \__fp_trig_small:ww #1,#2;
  { \__fp_ep_to_fixed:wwn #1,#2; . #1,#2; }
\cs_new:Npn \__fp_trigd_small:ww #1,#2;
  {
    \__fp_ep_mul_raw:wwwwN
      -1,{1745}{3292}{5199}{4329}{5769}{2369}; #1,#2;
    \__fp_trig_small:ww
  }
\cs_new:Npn \__fp_trigd_large:ww #1, #2#3#4#5#6#7;
  {
    \exp_after:wN \__fp_pack_eight:wNNNNNNNN
    \exp_after:wN \__fp_pack_eight:wNNNNNNNN
    \exp_after:wN \__fp_pack_twice_four:wNNNNNNNN
    \exp_after:wN \__fp_pack_twice_four:wNNNNNNNN
    \exp_after:wN \__fp_trigd_large_auxi:nnnnwNNNN
    \exp_after:wN ;
    \exp:w \exp_end_continue_f:w
    \prg_replicate:nn { \int_max:nn { 22 - #1 } { 0 } } { 0 }
    #2#3#4#5#6#7 0000 0000 0000 !
  }
\cs_new:Npn \__fp_trigd_large_auxi:nnnnwNNNN #1#2#3#4#5; #6#7#8#9
  {
    \exp_after:wN \__fp_trigd_large_auxii:wNw
    \__int_value:w \__int_eval:w #1 + #2
      - (#1 + #2 - 4) / 9 * 9 \__int_eval_end:
    #3;
    #4; #5{#6#7#8#9};
  }
\cs_new:Npn \__fp_trigd_large_auxii:wNw #1; #2#3;
  {
    + (#1#2 - 4) / 9 * 2
    \exp_after:wN \__fp_trigd_large_auxiii:www
    \__int_value:w \__int_eval:w #1#2
      - (#1#2 - 4) / 9 * 9 \__int_eval_end: #3 ;
  }
\cs_new:Npn \__fp_trigd_large_auxiii:www #1; #2; #3!
  {
    \if_int_compare:w #1 < 4500 \exp_stop_f:
      \exp_after:wN \__fp_use_i_until_s:nw
      \exp_after:wN \__fp_fixed_continue:wn
    \else:
      + 1
    \fi:
    \__fp_fixed_sub:wwn {9000}{0000}{0000}{0000}{0000}{0000};
      {#1}#2{0000}{0000};
    { \__fp_trigd_small:ww 2, }
  }
\cs_new:Npx \__fp_trig_inverse_two_pi:
  {
    \exp_not:n { \exp_after:wN \use_none:n \token_to_str:N }
    \cs:w , , !
    0000000000000000159154943091895335768883763372514362034459645740 ~
    4564487476673440588967976342265350901138027662530859560728427267 ~
    5795803689291184611457865287796741073169983922923996693740907757 ~
    3077746396925307688717392896217397661693362390241723629011832380 ~
    1142226997557159404618900869026739561204894109369378440855287230 ~
    9994644340024867234773945961089832309678307490616698646280469944 ~
    8652187881574786566964241038995874139348609983868099199962442875 ~
    5851711788584311175187671605465475369880097394603647593337680593 ~
    0249449663530532715677550322032477781639716602294674811959816584 ~
    0606016803035998133911987498832786654435279755070016240677564388 ~
    8495713108801221993761476813777647378906330680464579784817613124 ~
    2731406996077502450029775985708905690279678513152521001631774602 ~
    0924811606240561456203146484089248459191435211575407556200871526 ~
    6068022171591407574745827225977462853998751553293908139817724093 ~
    5825479707332871904069997590765770784934703935898280871734256403 ~
    6689511662545705943327631268650026122717971153211259950438667945 ~
    0376255608363171169525975812822494162333431451061235368785631136 ~
    3669216714206974696012925057833605311960859450983955671870995474 ~
    6510431623815517580839442979970999505254387566129445883306846050 ~
    7852915151410404892988506388160776196993073410389995786918905980 ~
    9373777206187543222718930136625526123878038753888110681406765434 ~
    0828278526933426799556070790386060352738996245125995749276297023 ~
    5940955843011648296411855777124057544494570217897697924094903272 ~
    9477021664960356531815354400384068987471769158876319096650696440 ~
    4776970687683656778104779795450353395758301881838687937766124814 ~
    9530599655802190835987510351271290432315804987196868777594656634 ~
    6221034204440855497850379273869429353661937782928735937843470323 ~
    0237145837923557118636341929460183182291964165008783079331353497 ~
    7909974586492902674506098936890945883050337030538054731232158094 ~
    3197676032283131418980974982243833517435698984750103950068388003 ~
    9786723599608024002739010874954854787923568261139948903268997427 ~
    0834961149208289037767847430355045684560836714793084567233270354 ~
    8539255620208683932409956221175331839402097079357077496549880868 ~
    6066360968661967037474542102831219251846224834991161149566556037 ~
    9696761399312829960776082779901007830360023382729879085402387615 ~
    5744543092601191005433799838904654921248295160707285300522721023 ~
    6017523313173179759311050328155109373913639645305792607180083617 ~
    9548767246459804739772924481092009371257869183328958862839904358 ~
    6866663975673445140950363732719174311388066383072592302759734506 ~
    0548212778037065337783032170987734966568490800326988506741791464 ~
    6835082816168533143361607309951498531198197337584442098416559541 ~
    5225064339431286444038388356150879771645017064706751877456059160 ~
    8716857857939226234756331711132998655941596890719850688744230057 ~
    5191977056900382183925622033874235362568083541565172971088117217 ~
    9593683256488518749974870855311659830610139214454460161488452770 ~
    2511411070248521739745103866736403872860099674893173561812071174 ~
    0478899368886556923078485023057057144063638632023685201074100574 ~
    8592281115721968003978247595300166958522123034641877365043546764 ~
    6456565971901123084767099309708591283646669191776938791433315566 ~
    5066981321641521008957117286238426070678451760111345080069947684 ~
    2235698962488051577598095339708085475059753626564903439445420581 ~
    7886435683042000315095594743439252544850674914290864751442303321 ~
    3324569511634945677539394240360905438335528292434220349484366151 ~
    4663228602477666660495314065734357553014090827988091478669343492 ~
    2737602634997829957018161964321233140475762897484082891174097478 ~
    2637899181699939487497715198981872666294601830539583275209236350 ~
    6853889228468247259972528300766856937583659722919824429747406163 ~
    8183113958306744348516928597383237392662402434501997809940402189 ~
    6134834273613676449913827154166063424829363741850612261086132119 ~
    9863346284709941839942742955915628333990480382117501161211667205 ~
    1912579303552929241134403116134112495318385926958490443846807849 ~
    0973982808855297045153053991400988698840883654836652224668624087 ~
    2540140400911787421220452307533473972538149403884190586842311594 ~
    6322744339066125162393106283195323883392131534556381511752035108 ~
    7459558201123754359768155340187407394340363397803881721004531691 ~
    8295194879591767395417787924352761740724605939160273228287946819 ~
    3649128949714953432552723591659298072479985806126900733218844526 ~
    7943350455801952492566306204876616134365339920287545208555344144 ~
    0990512982727454659118132223284051166615650709837557433729548631 ~
    2041121716380915606161165732000083306114606181280326258695951602 ~
    4632166138576614804719932707771316441201594960110632830520759583 ~
    4850305079095584982982186740289838551383239570208076397550429225 ~
    9847647071016426974384504309165864528360324933604354657237557916 ~
    1366324120457809969715663402215880545794313282780055246132088901 ~
    8742121092448910410052154968097113720754005710963406643135745439 ~
    9159769435788920793425617783022237011486424925239248728713132021 ~
    7667360756645598272609574156602343787436291321097485897150713073 ~
    9104072643541417970572226547980381512759579124002534468048220261 ~
    7342299001020483062463033796474678190501811830375153802879523433 ~
    4195502135689770912905614317878792086205744999257897569018492103 ~
    2420647138519113881475640209760554895793785141404145305151583964 ~
    2823265406020603311891586570272086250269916393751527887360608114 ~
    5569484210322407772727421651364234366992716340309405307480652685 ~
    0930165892136921414312937134106157153714062039784761842650297807 ~
    8606266969960809184223476335047746719017450451446166382846208240 ~
    8673595102371302904443779408535034454426334130626307459513830310 ~
    2293146934466832851766328241515210179422644395718121717021756492 ~
    1964449396532222187658488244511909401340504432139858628621083179 ~
    3939608443898019147873897723310286310131486955212620518278063494 ~
    5711866277825659883100535155231665984394090221806314454521212978 ~
    9734471488741258268223860236027109981191520568823472398358013366 ~
    0683786328867928619732367253606685216856320119489780733958419190 ~
    6659583867852941241871821727987506103946064819585745620060892122 ~
    8416394373846549589932028481236433466119707324309545859073361878 ~
    6290631850165106267576851216357588696307451999220010776676830946 ~
    9814975622682434793671310841210219520899481912444048751171059184 ~
    4139907889455775184621619041530934543802808938628073237578615267 ~
    7971143323241969857805637630180884386640607175368321362629671224 ~
    2609428540110963218262765120117022552929289655594608204938409069 ~
    0760692003954646191640021567336017909631872891998634341086903200 ~
    5796637103128612356988817640364252540837098108148351903121318624 ~
    7228181050845123690190646632235938872454630737272808789830041018 ~
    9485913673742589418124056729191238003306344998219631580386381054 ~
    2457893450084553280313511884341007373060595654437362488771292628 ~
    9807423539074061786905784443105274262641767830058221486462289361 ~
    9296692992033046693328438158053564864073184440599549689353773183 ~
    6726613130108623588021288043289344562140479789454233736058506327 ~
    0439981932635916687341943656783901281912202816229500333012236091 ~
    8587559201959081224153679499095448881099758919890811581163538891 ~
    6339402923722049848375224236209100834097566791710084167957022331 ~
    7897107102928884897013099533995424415335060625843921452433864640 ~
    3432440657317477553405404481006177612569084746461432976543900008 ~
    3826521145210162366431119798731902751191441213616962045693602633 ~
    6102355962140467029012156796418735746835873172331004745963339773 ~
    2477044918885134415363760091537564267438450166221393719306748706 ~
    2881595464819775192207710236743289062690709117919412776212245117 ~
    2354677115640433357720616661564674474627305622913332030953340551 ~
    3841718194605321501426328000879551813296754972846701883657425342 ~
    5016994231069156343106626043412205213831587971115075454063290657 ~
    0248488648697402872037259869281149360627403842332874942332178578 ~
    7750735571857043787379693402336902911446961448649769719434527467 ~
    4429603089437192540526658890710662062575509930379976658367936112 ~
    8137451104971506153783743579555867972129358764463093757203221320 ~
    2460565661129971310275869112846043251843432691552928458573495971 ~
    5042565399302112184947232132380516549802909919676815118022483192 ~
    5127372199792134331067642187484426215985121676396779352982985195 ~
    8545392106957880586853123277545433229161989053189053725391582222 ~
    9232597278133427818256064882333760719681014481453198336237910767 ~
    1255017528826351836492103572587410356573894694875444694018175923 ~
    0609370828146501857425324969212764624247832210765473750568198834 ~
    5641035458027261252285503154325039591848918982630498759115406321 ~
    0354263890012837426155187877318375862355175378506956599570028011 ~
    5841258870150030170259167463020842412449128392380525772514737141 ~
    2310230172563968305553583262840383638157686828464330456805994018 ~
    7001071952092970177990583216417579868116586547147748964716547948 ~
    8312140431836079844314055731179349677763739898930227765607058530 ~
    4083747752640947435070395214524701683884070908706147194437225650 ~
    2823145872995869738316897126851939042297110721350756978037262545 ~
    8141095038270388987364516284820180468288205829135339013835649144 ~
    3004015706509887926715417450706686888783438055583501196745862340 ~
    8059532724727843829259395771584036885940989939255241688378793572 ~
    7967951654076673927031256418760962190243046993485989199060012977 ~
    7469214532970421677817261517850653008552559997940209969455431545 ~
    2745856704403686680428648404512881182309793496962721836492935516 ~
    2029872469583299481932978335803459023227052612542114437084359584 ~
    9443383638388317751841160881711251279233374577219339820819005406 ~
    3292937775306906607415304997682647124407768817248673421685881509 ~
    9133422075930947173855159340808957124410634720893194912880783576 ~
    3115829400549708918023366596077070927599010527028150868897828549 ~
    4340372642729262103487013992868853550062061514343078665396085995 ~
    0058714939141652065302070085265624074703660736605333805263766757 ~
    2018839497277047222153633851135483463624619855425993871933367482 ~
    0422097449956672702505446423243957506869591330193746919142980999 ~
    3424230550172665212092414559625960554427590951996824313084279693 ~
    7113207021049823238195747175985519501864630940297594363194450091 ~
    9150616049228764323192129703446093584259267276386814363309856853 ~
    2786024332141052330760658841495858718197071242995959226781172796 ~
    4438853796763139274314227953114500064922126500133268623021550837
    \cs_end:
  }
\cs_new:Npn \__fp_trig_large:ww #1, #2#3#4#5#6;
  {
    \exp_after:wN \__fp_trig_large_auxi:wwwwww
    \__int_value:w \__int_eval:w (#1 - 32) / 64 \exp_after:wN ,
    \__int_value:w \__int_eval:w (#1 - 4) / 8 \exp_after:wN ,
    \__int_value:w #1 \__fp_trig_inverse_two_pi: ;
    {#2}{#3}{#4}{#5} ;
  }
\cs_new:Npn \__fp_trig_large_auxi:wwwwww #1, #2, #3, #4!
  {
    \prg_replicate:nn {#1} { \__fp_trig_large_auxii:ww }
    \prg_replicate:nn { #2 - #1 * 8 }
      { \__fp_trig_large_auxiii:wNNNNNNNN }
    \prg_replicate:nn { #3 - #2 * 8 }
      { \__fp_trig_large_auxiv:wN }
    \prg_replicate:nn { 8 } { \__fp_pack_twice_four:wNNNNNNNN }
    \__fp_trig_large_auxv:www
    ;
  }
\cs_new:Npn \__fp_trig_large_auxii:ww #1; #2 ~ { #1; }
\cs_new:Npn \__fp_trig_large_auxiii:wNNNNNNNN
  #1; #2#3#4#5#6#7#8#9 { #1; }
\cs_new:Npn \__fp_trig_large_auxiv:wN #1; #2 { #1; }
\cs_new:Npn \__fp_trig_large_auxv:www #1; #2; #3;
  {
    \exp_after:wN \__fp_use_i_until_s:nw
    \exp_after:wN \__fp_trig_large_auxvii:w
    \__int_value:w \__int_eval:w \c__fp_leading_shift_int
      \prg_replicate:nn { 13 }
        { \__fp_trig_large_auxvi:wnnnnnnnn }
      + \c__fp_trailing_shift_int - \c__fp_middle_shift_int
      \__fp_use_i_until_s:nw
      ; #3 #1 ; ;
  }
\cs_new:Npn \__fp_trig_large_auxvi:wnnnnnnnn #1; #2#3#4#5#6#7#8#9
  {
    \exp_after:wN \__fp_trig_large_pack:NNNNNw
    \__int_value:w \__int_eval:w \c__fp_middle_shift_int
      + #2*#9 + #3*#8 + #4*#7 + #5*#6
      #1; {#2}{#3}{#4}{#5} {#7}{#8}{#9}
  }
\cs_new:Npn \__fp_trig_large_pack:NNNNNw #1#2#3#4#5#6;
  { + #1#2#3#4#5 ; #6 }
\cs_new:Npn \__fp_trig_large_auxvii:w #1#2#3
  {
    \exp_after:wN \__fp_trig_large_auxviii:ww
    \__int_value:w \__int_eval:w (#1#2#3 - 62) / 125 ;
    #1#2#3
  }
\cs_new:Npn \__fp_trig_large_auxviii:ww #1;
  {
    + #1
    \if_int_odd:w #1 \exp_stop_f:
      \exp_after:wN \__fp_trig_large_auxix:Nw
      \exp_after:wN -
    \else:
      \exp_after:wN \__fp_trig_large_auxix:Nw
      \exp_after:wN +
    \fi:
  }
\cs_new:Npn \__fp_trig_large_auxix:Nw
  {
    \exp_after:wN \__fp_use_i_until_s:nw
    \exp_after:wN \__fp_trig_large_auxxi:w
    \__int_value:w \__int_eval:w \c__fp_leading_shift_int
      \prg_replicate:nn { 13 }
        { \__fp_trig_large_auxx:wNNNNN }
      + \c__fp_trailing_shift_int - \c__fp_middle_shift_int
      ;
  }
\cs_new:Npn \__fp_trig_large_auxx:wNNNNN #1; #2 #3#4#5#6
  {
    \exp_after:wN \__fp_trig_large_pack:NNNNNw
    \__int_value:w \__int_eval:w \c__fp_middle_shift_int
      #2 8 * #3#4#5#6
      #1; #2
  }
\cs_new:Npn \__fp_trig_large_auxxi:w #1;
  {
    \exp_after:wN \__fp_ep_mul_raw:wwwwN
    \__int_value:w \__int_eval:w 0 \__fp_ep_to_ep_loop:N #1 ; ; !
    0,{7853}{9816}{3397}{4483}{0961}{5661};
    \__fp_trig_small:ww
  }
\cs_new:Npn \__fp_sin_series_o:NNwwww #1#2#3. #4;
  {
    \__fp_fixed_mul:wwn #4; #4;
    {
      \exp_after:wN \__fp_sin_series_aux_o:NNnwww
      \exp_after:wN #1
      \__int_value:w
        \if_int_odd:w \__int_eval:w (#3 + 2) / 4 \__int_eval_end:
          #2
        \else:
          \if_meaning:w #2 0 2 \else: 0 \fi:
        \fi:
      {#3}
    }
  }
\cs_new:Npn \__fp_sin_series_aux_o:NNnwww #1#2#3 #4; #5,#6;
  {
    \if_int_odd:w \__int_eval:w #3 / 2 \__int_eval_end:
      \exp_after:wN \use_i:nn
    \else:
      \exp_after:wN \use_ii:nn
    \fi:
    { % 1/18!
      \__fp_fixed_mul_sub_back:wwwn    {0000}{0000}{0000}{0001}{5619}{2070};
                                  #4;{0000}{0000}{0000}{0477}{9477}{3324};
      \__fp_fixed_mul_sub_back:wwwn #4;{0000}{0000}{0011}{4707}{4559}{7730};
      \__fp_fixed_mul_sub_back:wwwn #4;{0000}{0000}{2087}{6756}{9878}{6810};
      \__fp_fixed_mul_sub_back:wwwn #4;{0000}{0027}{5573}{1922}{3985}{8907};
      \__fp_fixed_mul_sub_back:wwwn #4;{0000}{2480}{1587}{3015}{8730}{1587};
      \__fp_fixed_mul_sub_back:wwwn #4;{0013}{8888}{8888}{8888}{8888}{8889};
      \__fp_fixed_mul_sub_back:wwwn #4;{0416}{6666}{6666}{6666}{6666}{6667};
      \__fp_fixed_mul_sub_back:wwwn #4;{5000}{0000}{0000}{0000}{0000}{0000};
      \__fp_fixed_mul_sub_back:wwwn#4;{10000}{0000}{0000}{0000}{0000}{0000};
      { \__fp_fixed_continue:wn 0, }
    }
    { % 1/17!
      \__fp_fixed_mul_sub_back:wwwn    {0000}{0000}{0000}{0028}{1145}{7254};
                                  #4;{0000}{0000}{0000}{7647}{1637}{3182};
      \__fp_fixed_mul_sub_back:wwwn #4;{0000}{0000}{0160}{5904}{3836}{8216};
      \__fp_fixed_mul_sub_back:wwwn #4;{0000}{0002}{5052}{1083}{8544}{1719};
      \__fp_fixed_mul_sub_back:wwwn #4;{0000}{0275}{5731}{9223}{9858}{9065};
      \__fp_fixed_mul_sub_back:wwwn #4;{0001}{9841}{2698}{4126}{9841}{2698};
      \__fp_fixed_mul_sub_back:wwwn #4;{0083}{3333}{3333}{3333}{3333}{3333};
      \__fp_fixed_mul_sub_back:wwwn #4;{1666}{6666}{6666}{6666}{6666}{6667};
      \__fp_fixed_mul_sub_back:wwwn#4;{10000}{0000}{0000}{0000}{0000}{0000};
      { \__fp_ep_mul:wwwwn 0, } #5,#6;
    }
    {
      \exp_after:wN \__fp_sanitize:Nw
      \exp_after:wN #2
      \__int_value:w \__int_eval:w #1
    }
    #2
  }
\cs_new:Npn \__fp_tan_series_o:NNwwww #1#2#3. #4;
  {
    \__fp_fixed_mul:wwn #4; #4;
    {
      \exp_after:wN \__fp_tan_series_aux_o:Nnwww
      \__int_value:w
        \if_int_odd:w \__int_eval:w #3 / 2 \__int_eval_end:
          \exp_after:wN \reverse_if:N
        \fi:
        \if_meaning:w #1#2 2 \else: 0 \fi:
      {#3}
    }
  }
\cs_new:Npn \__fp_tan_series_aux_o:Nnwww #1 #2 #3; #4,#5;
  {
    \__fp_fixed_mul_sub_back:wwwn     {0000}{0000}{1527}{3493}{0856}{7059};
                                #3; {0000}{0159}{6080}{0274}{5257}{6472};
    \__fp_fixed_mul_sub_back:wwwn #3; {0002}{4571}{2320}{0157}{2558}{8481};
    \__fp_fixed_mul_sub_back:wwwn #3; {0115}{5830}{7533}{5397}{3168}{2147};
    \__fp_fixed_mul_sub_back:wwwn #3; {1929}{8245}{6140}{3508}{7719}{2982};
    \__fp_fixed_mul_sub_back:wwwn #3;{10000}{0000}{0000}{0000}{0000}{0000};
    { \__fp_ep_mul:wwwwn 0, } #4,#5;
    {
      \__fp_fixed_mul_sub_back:wwwn    {0000}{0007}{0258}{0681}{9408}{4706};
                                  #3;{0000}{2343}{7175}{1399}{6151}{7670};
      \__fp_fixed_mul_sub_back:wwwn #3;{0019}{2638}{4588}{9232}{8861}{3691};
      \__fp_fixed_mul_sub_back:wwwn #3;{0536}{6357}{0691}{4344}{6852}{4252};
      \__fp_fixed_mul_sub_back:wwwn #3;{5263}{1578}{9473}{6842}{1052}{6315};
      \__fp_fixed_mul_sub_back:wwwn#3;{10000}{0000}{0000}{0000}{0000}{0000};
      {
        \reverse_if:N \if_int_odd:w
            \__int_eval:w (#2 - 1) / 2 \__int_eval_end:
          \exp_after:wN \__fp_reverse_args:Nww
        \fi:
        \__fp_ep_div:wwwwn 0,
      }
    }
    {
      \exp_after:wN \__fp_sanitize:Nw
      \exp_after:wN #1
      \__int_value:w \__int_eval:w \__fp_ep_to_float_o:wwN
    }
    #1
  }
\cs_new:Npn \__fp_atan_o:Nw
  {
    \__fp_atan_dispatch_o:NNnNw
      \__fp_acotii_o:Nww \__fp_atanii_o:Nww { atan }
  }
\cs_new:Npn \__fp_acot_o:Nw
  {
    \__fp_atan_dispatch_o:NNnNw
      \__fp_atanii_o:Nww \__fp_acotii_o:Nww { acot }
  }
\cs_new:Npn \__fp_atan_dispatch_o:NNnNw #1#2#3#4#5@
  {
    \if_case:w
      \__int_eval:w \__fp_array_count:n {#5} - 1 \__int_eval_end:
         \exp_after:wN #1 \exp_after:wN #4 \c_one_fp #5
         \exp:w
    \or: #2 #4 #5 \exp:w
    \else:
      \__msg_kernel_expandable_error:nnnnn
        { kernel } { fp-num-args } { #3() } { 1 } { 2 }
      \exp_after:wN \c_nan_fp \exp:w
    \fi:
    \exp_after:wN \exp_end:
  }
\cs_new:Npn \__fp_atanii_o:Nww
    #1 \s__fp \__fp_chk:w #2#3#4; \s__fp \__fp_chk:w #5
  {
    \if_meaning:w 3 #2 \__fp_case_return_i_o:ww \fi:
    \if_meaning:w 3 #5 \__fp_case_return_ii_o:ww \fi:
    \if_case:w
      \if_meaning:w #2 #5
        \if_meaning:w 1 #2 10 \else: 0 \fi:
      \else:
        \if_int_compare:w #2 > #5 \exp_stop_f: 1 \else: 2 \fi:
      \fi:
      \exp_stop_f:
         \__fp_case_return:nw { \__fp_atan_inf_o:NNNw #1 #3 2 }
    \or: \__fp_case_return:nw { \__fp_atan_inf_o:NNNw #1 #3 4 }
    \or: \__fp_case_return:nw { \__fp_atan_inf_o:NNNw #1 #3 0 }
    \fi:
    \__fp_atan_normal_o:NNnwNnw #1
    \s__fp \__fp_chk:w #2#3#4;
    \s__fp \__fp_chk:w #5
  }
\cs_new:Npn \__fp_acotii_o:Nww #1#2; #3;
  { \__fp_atanii_o:Nww #1#3; #2; }
\cs_new:Npn \__fp_atan_inf_o:NNNw #1#2#3 \s__fp \__fp_chk:w #4#5#6;
  {
    \exp_after:wN \__fp_atan_combine_o:NwwwwwN
    \exp_after:wN #2
    \__int_value:w \__int_eval:w
      \if_meaning:w 2 #5 7 - \fi: #3 \exp_after:wN ;
    \c__fp_one_fixed_tl
    {0000}{0000}{0000}{0000}{0000}{0000};
    0,{0000}{0000}{0000}{0000}{0000}{0000}; #1
  }
\cs_new_protected:Npn \__fp_atan_normal_o:NNnwNnw
    #1 \s__fp \__fp_chk:w 1#2#3#4; \s__fp \__fp_chk:w 1#5#6#7;
  {
    \__fp_atan_test_o:NwwNwwN
      #2 #3, #4{0000}{0000};
      #5 #6, #7{0000}{0000}; #1
  }
\cs_new:Npn \__fp_atan_test_o:NwwNwwN #1#2,#3; #4#5,#6;
  {
    \exp_after:wN \__fp_atan_combine_o:NwwwwwN
    \exp_after:wN #1
    \__int_value:w \__int_eval:w
      \if_meaning:w 2 #4
        7 - \__int_eval:w
      \fi:
      \if_int_compare:w
          \__fp_ep_compare:wwww #2,#3; #5,#6; > 0 \exp_stop_f:
        3 -
        \exp_after:wN \__fp_reverse_args:Nww
      \fi:
      \__fp_atan_div:wnwwnw #2,#3; #5,#6;
  }
\cs_new:Npn \__fp_atan_div:wnwwnw #1,#2#3; #4,#5#6;
  {
    \if_int_compare:w
      \__int_eval:w 41421 * #5 < #2 000
        \if_case:w \__int_eval:w #4 - #1 \__int_eval_end: 00 \or: 0 \fi:
      \exp_stop_f:
      \exp_after:wN \__fp_atan_near:wwwn
    \fi:
    0
    \__fp_ep_div:wwwwn #1,{#2}#3; #4,{#5}#6;
    \__fp_atan_auxi:ww
  }
\cs_new:Npn \__fp_atan_near:wwwn
    0 \__fp_ep_div:wwwwn #1,#2; #3,
  {
    1
    \__fp_ep_to_fixed:wwn #1 - #3, #2;
    \__fp_atan_near_aux:wwn
  }
\cs_new:Npn \__fp_atan_near_aux:wwn #1; #2;
  {
    \__fp_fixed_add:wwn #1; #2;
    { \__fp_fixed_sub:wwn #2; #1; { \__fp_ep_div:wwwwn 0, } 0, }
  }
\cs_new:Npn \__fp_atan_auxi:ww #1,#2;
  { \__fp_ep_to_fixed:wwn #1,#2; \__fp_atan_auxii:w #1,#2; }
\cs_new:Npn \__fp_atan_auxii:w #1;
  {
    \__fp_fixed_mul:wwn #1; #1;
    {
      \__fp_atan_Taylor_loop:www 39 ;
        {0000}{0000}{0000}{0000}{0000}{0000} ;
    }
    ! #1;
  }
\cs_new:Npn \__fp_atan_Taylor_loop:www #1; #2; #3;
  {
    \if_int_compare:w #1 = -1 \exp_stop_f:
      \__fp_atan_Taylor_break:w
    \fi:
    \exp_after:wN \__fp_fixed_div_int:wwN \c__fp_one_fixed_tl #1;
    \__fp_rrot:www \__fp_fixed_mul_sub_back:wwwn #2; #3;
    {
      \exp_after:wN \__fp_atan_Taylor_loop:www
      \__int_value:w \__int_eval:w #1 - 2 ;
    }
    #3;
  }
\cs_new:Npn \__fp_atan_Taylor_break:w
    \fi: #1 \__fp_fixed_mul_sub_back:wwwn #2; #3 !
  { \fi: ; #2 ; }
\cs_new:Npn \__fp_atan_combine_o:NwwwwwN #1 #2; #3; #4; #5,#6; #7
  {
    \exp_after:wN \__fp_sanitize:Nw
    \exp_after:wN #1
    \__int_value:w \__int_eval:w
      \if_meaning:w 0 #2
        \exp_after:wN \use_i:nn
      \else:
        \exp_after:wN \use_ii:nn
      \fi:
      { #5 \__fp_fixed_mul:wwn #3; #6; }
      {
        \__fp_fixed_mul:wwn #3; #4;
        {
          \exp_after:wN \__fp_atan_combine_aux:ww
          \__int_value:w \__int_eval:w #2 / 2 ; #2;
        }
      }
      { #7 \__fp_fixed_to_float_o:wN \__fp_fixed_to_float_rad_o:wN }
      #1
  }
\cs_new:Npn \__fp_atan_combine_aux:ww #1; #2;
  {
    \__fp_fixed_mul_short:wwn
      {7853}{9816}{3397}{4483}{0961}{5661};
      {#1}{0000}{0000};
    {
      \if_int_odd:w #2 \exp_stop_f:
        \exp_after:wN \__fp_fixed_sub:wwn
      \else:
        \exp_after:wN \__fp_fixed_add:wwn
      \fi:
    }
  }
\cs_new:Npn \__fp_asin_o:w #1 \s__fp \__fp_chk:w #2#3; @
  {
    \if_case:w #2 \exp_stop_f:
      \__fp_case_return_same_o:w
    \or:
      \__fp_case_use:nw
        { \__fp_asin_normal_o:NfwNnnnnw #1 { #1 { asin } { asind } } }
    \or:
      \__fp_case_use:nw
        { \__fp_invalid_operation_o:fw { #1 { asin } { asind } } }
    \else:
      \__fp_case_return_same_o:w
    \fi:
    \s__fp \__fp_chk:w #2 #3;
  }
\cs_new:Npn \__fp_acos_o:w #1 \s__fp \__fp_chk:w #2#3; @
  {
    \if_case:w #2 \exp_stop_f:
      \__fp_case_use:nw { \__fp_atan_inf_o:NNNw #1 0 4 }
    \or:
      \__fp_case_use:nw
        {
          \__fp_asin_normal_o:NfwNnnnnw #1 { #1 { acos } { acosd } }
            \__fp_reverse_args:Nww
        }
    \or:
      \__fp_case_use:nw
        { \__fp_invalid_operation_o:fw { #1 { acos } { acosd } } }
    \else:
      \__fp_case_return_same_o:w
    \fi:
    \s__fp \__fp_chk:w #2 #3;
  }
\cs_new:Npn \__fp_asin_normal_o:NfwNnnnnw
    #1#2#3 \s__fp \__fp_chk:w 1#4#5#6#7#8#9;
  {
    \if_int_compare:w #5 < 1 \exp_stop_f:
      \exp_after:wN \__fp_use_none_until_s:w
    \fi:
    \if_int_compare:w \__int_eval:w #5 + #6#7 + #8#9 = 1000 0001 ~
      \exp_after:wN \__fp_use_none_until_s:w
    \fi:
    \__fp_use_i:ww
    \__fp_invalid_operation_o:fw {#2}
      \s__fp \__fp_chk:w 1#4{#5}{#6}{#7}{#8}{#9};
    \__fp_asin_auxi_o:NnNww
      #1 {#3} #4 #5,{#6}{#7}{#8}{#9}{0000}{0000};
  }
\cs_new:Npn \__fp_asin_auxi_o:NnNww #1#2#3#4,#5;
  {
    \__fp_ep_to_fixed:wwn #4,#5;
    \__fp_asin_isqrt:wn
    \__fp_ep_mul:wwwwn #4,#5;
    \__fp_ep_to_ep:wwN
    \__fp_fixed_continue:wn
    { #2 \__fp_atan_test_o:NwwNwwN #3 }
    0 1,{1000}{0000}{0000}{0000}{0000}{0000}; #1
  }
\cs_new:Npn \__fp_asin_isqrt:wn #1;
  {
    \exp_after:wN \__fp_fixed_sub:wwn \c__fp_one_fixed_tl #1;
    {
      \__fp_fixed_add_one:wN #1;
      \__fp_fixed_continue:wn { \__fp_ep_mul:wwwwn 0, } 0,
    }
    \__fp_ep_isqrt:wwn
  }
\cs_new:Npn \__fp_acsc_o:w #1 \s__fp \__fp_chk:w #2#3#4; @
  {
    \if_case:w \if_meaning:w 2 #2 #3 \fi: #2 \exp_stop_f:
           \__fp_case_use:nw
             { \__fp_invalid_operation_o:fw { #1 { acsc } { acscd } } }
    \or:   \__fp_case_use:nw
             { \__fp_acsc_normal_o:NfwNnw #1 { #1 { acsc } { acscd } } }
    \or:   \__fp_case_return_o:Nw \c_zero_fp
    \or:   \__fp_case_return_same_o:w
    \else: \__fp_case_return_o:Nw \c_minus_zero_fp
    \fi:
    \s__fp \__fp_chk:w #2 #3 #4;
  }
\cs_new:Npn \__fp_asec_o:w #1 \s__fp \__fp_chk:w #2#3; @
  {
    \if_case:w #2 \exp_stop_f:
      \__fp_case_use:nw
        { \__fp_invalid_operation_o:fw { #1 { asec } { asecd } } }
    \or:
      \__fp_case_use:nw
        {
          \__fp_acsc_normal_o:NfwNnw #1 { #1 { asec } { asecd } }
            \__fp_reverse_args:Nww
        }
    \or:   \__fp_case_use:nw { \__fp_atan_inf_o:NNNw #1 0 4 }
    \else: \__fp_case_return_same_o:w
    \fi:
    \s__fp \__fp_chk:w #2 #3;
  }
\cs_new:Npn \__fp_acsc_normal_o:NfwNnw #1#2#3 \s__fp \__fp_chk:w 1#4#5#6;
  {
    \int_compare:nNnTF {#5} < 1
      {
        \__fp_invalid_operation_o:fw {#2}
          \s__fp \__fp_chk:w 1#4{#5}#6;
      }
      {
        \__fp_ep_div:wwwwn
          1,{1000}{0000}{0000}{0000}{0000}{0000};
          #5,#6{0000}{0000};
        { \__fp_asin_auxi_o:NnNww #1 {#3} #4 }
      }
  }
%% File: l3fp-convert.dtx Copyright(C) 2011-2014,2016,2017 The LaTeX3 Project
\cs_new:Npn \__fp_trim_zeros:w #1 ;
  {
    \__fp_trim_zeros_loop:w #1
      ; \__fp_trim_zeros_loop:w 0; \__fp_trim_zeros_dot:w .; \s__stop
  }
\cs_new:Npn \__fp_trim_zeros_loop:w #1 0; #2 { #2 #1 ; #2 }
\cs_new:Npn \__fp_trim_zeros_dot:w #1 .; { \__fp_trim_zeros_end:w #1 ; }
\cs_new:Npn \__fp_trim_zeros_end:w #1 ; #2 \s__stop { #1 }
\cs_new:Npn \fp_to_scientific:N #1
  { \exp_after:wN \__fp_to_scientific_dispatch:w #1 }
\cs_generate_variant:Nn \fp_to_scientific:N { c }
\cs_new:Npn \fp_to_scientific:n
  {
    \exp_after:wN \__fp_to_scientific_dispatch:w
    \exp:w \exp_end_continue_f:w \__fp_parse:n
  }
\cs_new:Npn \__fp_to_scientific_dispatch:w \s__fp \__fp_chk:w #1#2
  {
    \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi:
    \if_case:w #1 \exp_stop_f:
         \__fp_case_return:nw { 0.000000000000000e0 }
    \or: \exp_after:wN \__fp_to_scientific_normal:wnnnnn
    \or:
      \__fp_case_use:nw
        {
          \__fp_invalid_operation:nnw
            { \fp_to_scientific:N \c__fp_overflowing_fp }
            { fp_to_scientific }
        }
    \or:
      \__fp_case_use:nw
        {
          \__fp_invalid_operation:nnw
            { \fp_to_scientific:N \c_zero_fp }
            { fp_to_scientific }
        }
    \fi:
    \s__fp \__fp_chk:w #1 #2
  }
\cs_new:Npn \__fp_to_scientific_normal:wnnnnn
  \s__fp \__fp_chk:w 1 #1 #2 #3#4#5#6 ;
  {
    \exp_after:wN \__fp_to_scientific_normal:wNw
    \exp_after:wN e
    \__int_value:w \__int_eval:w #2 - 1
    ; #3 #4 #5 #6 ;
  }
\cs_new:Npn \__fp_to_scientific_normal:wNw #1 ; #2#3;
  { #2.#3 #1 }
\cs_new:Npn \fp_to_decimal:N #1
  { \exp_after:wN \__fp_to_decimal_dispatch:w #1 }
\cs_generate_variant:Nn \fp_to_decimal:N { c }
\cs_new:Npn \fp_to_decimal:n
  {
    \exp_after:wN \__fp_to_decimal_dispatch:w
    \exp:w \exp_end_continue_f:w \__fp_parse:n
  }
\cs_new:Npn \__fp_to_decimal_dispatch:w \s__fp \__fp_chk:w #1#2
  {
    \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi:
    \if_case:w #1 \exp_stop_f:
         \__fp_case_return:nw { 0 }
    \or: \exp_after:wN \__fp_to_decimal_normal:wnnnnn
    \or:
      \__fp_case_use:nw
        {
          \__fp_invalid_operation:nnw
            { \fp_to_decimal:N \c__fp_overflowing_fp }
            { fp_to_decimal }
        }
    \or:
      \__fp_case_use:nw
        {
          \__fp_invalid_operation:nnw
            { 0 }
            { fp_to_decimal }
        }
    \fi:
    \s__fp \__fp_chk:w #1 #2
  }
\cs_new:Npn \__fp_to_decimal_normal:wnnnnn
    \s__fp \__fp_chk:w 1 #1 #2 #3#4#5#6 ;
  {
    \int_compare:nNnTF {#2} > 0
      {
        \int_compare:nNnTF {#2} < \c__fp_prec_int
          {
            \__fp_decimate:nNnnnn { \c__fp_prec_int - #2 }
              \__fp_to_decimal_large:Nnnw
          }
          {
            \exp_after:wN \exp_after:wN
            \exp_after:wN \__fp_to_decimal_huge:wnnnn
            \prg_replicate:nn { #2 - \c__fp_prec_int } { 0 } ;
          }
        {#3} {#4} {#5} {#6}
      }
      {
        \exp_after:wN \__fp_trim_zeros:w
        \exp_after:wN 0
        \exp_after:wN .
        \exp:w \exp_end_continue_f:w \prg_replicate:nn { - #2 } { 0 }
        #3#4#5#6 ;
      }
  }
\cs_new:Npn \__fp_to_decimal_large:Nnnw #1#2#3#4;
  {
    \exp_after:wN \__fp_trim_zeros:w \__int_value:w
      \if_int_compare:w #2 > 0 \exp_stop_f:
        #2
      \fi:
      \exp_stop_f:
      #3.#4 ;
  }
\cs_new:Npn \__fp_to_decimal_huge:wnnnn #1; #2#3#4#5 { #2#3#4#5 #1 }
\cs_new:Npn \fp_to_tl:N #1 { \exp_after:wN \__fp_to_tl_dispatch:w #1 }
\cs_generate_variant:Nn \fp_to_tl:N { c }
\cs_new:Npn \fp_to_tl:n
  {
    \exp_after:wN \__fp_to_tl_dispatch:w
    \exp:w \exp_end_continue_f:w \__fp_parse:n
  }
\cs_new:Npn \__fp_to_tl_dispatch:w \s__fp \__fp_chk:w #1#2
  {
    \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi:
    \if_case:w #1 \exp_stop_f:
           \__fp_case_return:nw { 0 }
    \or:   \exp_after:wN \__fp_to_tl_normal:nnnnn
    \or:   \__fp_case_return:nw { inf }
    \else: \__fp_case_return:nw { nan }
    \fi:
  }
\cs_new:Npn \__fp_to_tl_normal:nnnnn #1
  {
    \int_compare:nTF
      { -2 <= #1 <= \c__fp_prec_int }
      { \__fp_to_decimal_normal:wnnnnn }
      { \__fp_to_tl_scientific:wnnnnn }
    \s__fp \__fp_chk:w 1 0 {#1}
  }
\cs_new:Npn \__fp_to_tl_scientific:wnnnnn
  \s__fp \__fp_chk:w 1 #1 #2 #3#4#5#6 ;
  {
    \exp_after:wN \__fp_to_tl_scientific:wNw
    \exp_after:wN e
    \__int_value:w \__int_eval:w #2 - 1
    ; #3 #4 #5 #6 ;
  }
\cs_new:Npn \__fp_to_tl_scientific:wNw #1 ; #2#3;
  { \__fp_trim_zeros:w #2.#3 ; #1 }
\cs_new:Npn \fp_to_dim:N #1
  { \fp_to_decimal:N #1 pt }
\cs_generate_variant:Nn \fp_to_dim:N { c }
\cs_new:Npn \fp_to_dim:n #1
  { \fp_to_decimal:n {#1} pt }
\cs_new:Npn \fp_to_int:N #1 { \exp_after:wN \__fp_to_int_dispatch:w #1 }
\cs_generate_variant:Nn \fp_to_int:N { c }
\cs_new:Npn \fp_to_int:n
  {
    \exp_after:wN \__fp_to_int_dispatch:w
    \exp:w \exp_end_continue_f:w \__fp_parse:n
  }
\cs_new:Npn \__fp_to_int_dispatch:w #1;
  {
    \exp_after:wN \__fp_to_decimal_dispatch:w \exp:w \exp_end_continue_f:w
    \__fp_round:Nwn \__fp_round_to_nearest:NNN #1; { 0 }
  }
\cs_new:Npn \dim_to_fp:n #1
  {
    \exp_after:wN \__fp_from_dim_test:ww
    \exp_after:wN 0
    \exp_after:wN ,
    \__int_value:w \etex_glueexpr:D #1 ;
  }
\cs_new:Npn \__fp_from_dim_test:ww #1, #2
  {
    \if_meaning:w 0 #2
      \__fp_case_return:nw { \exp_after:wN \c_zero_fp }
    \else:
      \exp_after:wN \__fp_from_dim:wNw
      \__int_value:w \__int_eval:w #1 - 4
        \if_meaning:w - #2
          \exp_after:wN , \exp_after:wN 2 \__int_value:w
        \else:
          \exp_after:wN , \exp_after:wN 0 \__int_value:w #2
        \fi:
    \fi:
  }
\cs_new:Npn \__fp_from_dim:wNw #1,#2#3;
  {
    \__fp_pack_twice_four:wNNNNNNNN \__fp_from_dim:wNNnnnnnn ;
    #3 000 0000 00 {10}987654321; #2 {#1}
  }
\cs_new:Npn \__fp_from_dim:wNNnnnnnn #1; #2#3#4#5#6#7#8#9
  { \__fp_from_dim:wnnnnwNn #1 {#2#300} {0000} ; }
\cs_new:Npn \__fp_from_dim:wnnnnwNn #1; #2#3#4#5#6; #7#8
  {
    \__fp_mul_npos_o:Nww #7
      \s__fp \__fp_chk:w 1 #7 {#5} #1 ;
      \s__fp \__fp_chk:w 1 0 {#8} {1525} {8789} {0625} {0000} ;
      \prg_do_nothing:
  }
\cs_new_eq:NN \fp_use:N \fp_to_decimal:N
\cs_generate_variant:Nn \fp_use:N { c }
\cs_new_eq:NN \fp_eval:n \fp_to_decimal:n
\cs_new:Npn \fp_abs:n #1
  { \fp_to_decimal:n { abs \__fp_parse:n {#1} } }
\cs_new:Npn \fp_max:nn #1#2
  { \fp_to_decimal:n { max ( \__fp_parse:n {#1} , \__fp_parse:n {#2} ) } }
\cs_new:Npn \fp_min:nn #1#2
  { \fp_to_decimal:n { min ( \__fp_parse:n {#1} , \__fp_parse:n {#2} ) } }
\cs_new:Npn \__fp_array_to_clist:n #1
  {
    \tl_if_empty:nF {#1}
      {
        \__fp_expand:n
          {
            { \use_ii:nn }
            \__fp_array_to_clist_loop:Nw #1 { ? \__prg_break: } ;
            \__prg_break_point:
          }
      }
  }
\cs_new:Npx \__fp_array_to_clist_loop:Nw #1#2;
  {
    \exp_not:N \use_none:n #1
    \exp_not:N \exp_after:wN
                 {
    \exp_not:N     \exp_after:wN ,
    \exp_not:N     \exp_after:wN \c_space_tl
    \exp_not:N     \exp:w
    \exp_not:N     \exp_end_continue_f:w
    \exp_not:N     \__fp_to_tl_dispatch:w #1 #2 ;
                 }
    \exp_not:N \__fp_array_to_clist_loop:Nw
  }
%% File: l3fp-random.dtx Copyright (C) 2016,2017 The LaTeX3 Project
\cs_new:Npn \__fp_parse_word_rand:N
  { \__fp_parse_function:NNN \__fp_rand_o:Nw ? }
\cs_new:Npn \__fp_parse_word_randint:N
  { \__fp_parse_function:NNN \__fp_randint_o:Nw ? }
\cs_if_exist:NF \pdftex_uniformdeviate:D
  {
    \__msg_kernel_new:nnn { kernel } { fp-no-random }
      { Random~numbers~unavailable }
    \cs_new:Npn \__fp_rand_o:Nw ? #1 @
      {
        \__msg_kernel_expandable_error:nn { kernel } { fp-no-random }
        \exp_after:wN \c_nan_fp
      }
    \cs_new_eq:NN \__fp_randint_o:Nw \__fp_rand_o:Nw
  }
\cs_if_exist:NT \pdftex_uniformdeviate:D
  {
\cs_new:Npn \__fp_rand_uniform:
  { \pdftex_uniformdeviate:D \c__fp_rand_size_int }
\int_const:Nn \c__fp_rand_size_int   { 268 435 456 }
\int_const:Nn \c__fp_rand_four_int   { 268 430 000 }
\int_const:Nn \c__fp_rand_eight_int  { 200 000 000 }
\cs_new:Npn \__fp_rand_myriads:n #1
  {
    \__fp_rand_myriads_loop:nn #1
      { ? \use_i_delimit_by_q_stop:nw \__fp_rand_myriads_last: }
      { ? \use_none_delimit_by_q_stop:w } \q_stop
  }
\cs_new:Npn \__fp_rand_myriads_loop:nn #1#2
  {
    \use_none:n #2
    \exp_after:wN \__fp_rand_myriads_get:w
    \__int_value:w \__fp_rand_uniform: ; {#1}{#2}
  }
\cs_new:Npn \__fp_rand_myriads_get:w #1 ;
  {
    \if_int_compare:w #1 < \c__fp_rand_eight_int
      \exp_after:wN \use_none:n
      \__int_value:w \__int_eval:w
        \c__fp_rand_eight_int + #1 \__int_eval_end:
      \exp_after:wN \use_i:nnn
    \else:
      \if_int_compare:w #1 < \c__fp_rand_four_int
        \exp_after:wN \use_none:nnnnn
        \__int_value:w \__int_eval:w
          \c__fp_rand_four_int + #1 \__int_eval_end:
        \exp_after:wN \exp_after:wN \exp_after:wN \use_i:nn
      \fi:
    \fi:
    \__fp_rand_myriads_loop:nn
  }
\cs_new:Npn \__fp_rand_myriads_last:
  {
    \exp_after:wN \__fp_rand_myriads_last:w
    \__int_value:w \__fp_rand_uniform: ;
  }
\cs_new:Npn \__fp_rand_myriads_last:w #1 ;
  {
    \if_int_compare:w #1 < \c__fp_rand_four_int
      \exp_after:wN \use_none:nnnnn
      \__int_value:w \__int_eval:w
        \c__fp_rand_four_int + #1 \__int_eval_end:
    \else:
      \exp_after:wN \__fp_rand_myriads_last:
    \fi:
  }
\cs_new:Npn \__fp_rand_o:Nw ? #1 @
  {
    \tl_if_empty:nTF {#1}
      { \__fp_rand_o: }
      {
        \__msg_kernel_expandable_error:nnnnn
          { kernel } { fp-num-args } { rand() } { 0 } { 0 }
        \exp_after:wN \c_nan_fp
      }
  }
\cs_new:Npn \__fp_rand_o:
  { \__fp_parse_o:n { . \__fp_rand_myriads:n { xxxx } } }
\cs_new:Npn \__fp_randint_o:Nw ? #1 @
  {
    \if_case:w
      \__int_eval:w \__fp_array_count:n {#1} - 1 \__int_eval_end:
         \exp_after:wN \__fp_randint_e:w \c_one_fp #1
    \or: \__fp_randint_e:w #1
    \else:
      \__msg_kernel_expandable_error:nnnnn
        { kernel } { fp-num-args } { randint() } { 1 } { 2 }
      \exp_after:wN \c_nan_fp \exp:w
    \fi:
    \exp_after:wN \exp_end:
  }
\cs_new:Npn \__fp_randint_badarg:w \s__fp \__fp_chk:w #1#2#3;
  {
    \__fp_int:wTF \s__fp \__fp_chk:w #1#2#3;
      {
        \if_meaning:w 1 #1
          \if_int_compare:w
            \use_i_delimit_by_q_stop:nw #3 \q_stop > \c__fp_prec_int
            1 \exp_stop_f:
          \fi:
        \fi:
      }
      { 1 \exp_stop_f: }
  }
\cs_new:Npn \__fp_randint_e:w #1; #2;
  {
    \if_case:w
        \__fp_randint_badarg:w #1;
        \__fp_randint_badarg:w #2;
        \fp_compare:nNnTF { #1; } > { #2; } { 1 } { 0 } \exp_stop_f:
      \exp_after:wN \exp_after:wN \exp_after:wN \__fp_randint_e:wnn
        \__fp_parse:n { #2; - #1; } { #1; } { #2; }
    \or:
      \__fp_invalid_operation_tl_o:ff
        { randint } { \__fp_array_to_clist:n { #1; #2; } }
      \exp:w
    \fi:
  }
\cs_new:Npn \__fp_randint_e:wnn #1;
  {
    \exp_after:wN \__fp_randint_e:wwNnn
    \__int_value:w \__fp_rand_uniform: \exp_after:wN ;
    \exp:w \exp_end_continue_f:w
      \fp_compare:nNnTF { #1 ; } < \c__fp_rand_size_int
        { \fp_to_int:n { #1 ; + 1 } ; \__fp_randint_narrow_e:nnnn }
        { \fp_to_int:n { floor(#1 ; * 1e-8 + 1) } ; \__fp_randint_wide_e:nnnn }
  }
\cs_new:Npn \__fp_randint_e:wwNnn #1 ; #2 ;
  {
    \exp_after:wN \__fp_randint_e:wwwNnn
    \__int_value:w \int_mod:nn {#1} {#2} ; #1 ; #2 ;
  }
\cs_new:Npn \__fp_randint_e:wwwNnn #1 ; #2 ; #3 ; #4
  {
    \int_compare:nNnTF { #2 - #1 + #3 } > \c__fp_rand_size_int
      {
        \exp_after:wN \__fp_randint_e:wwNnn
          \__int_value:w \__fp_rand_uniform: ; #3 ; #4
      }
      { #4 {#1} {#3} }
  }
\cs_new:Npn \__fp_randint_narrow_e:nnnn #1#2#3#4
  { \__fp_parse_o:n { #3 + #1 } \exp:w }
\cs_new:Npn \__fp_randint_wide_e:nnnn #1#2#3#4
  {
    \exp_after:wN \exp_after:wN
    \exp_after:wN \__fp_randint_wide_e:wnnn
      \__fp_parse:n { #3 + #1e8 + \__fp_rand_myriads:n { xx } }
      {#2} {#3} {#4}
  }
\cs_new:Npn \__fp_randint_wide_e:wnnn #1 ; #2#3#4
  {
    \fp_compare:nNnTF { #1 ; } > {#4}
      {
        \exp_after:wN \__fp_randint_e:wwNnn
          \__int_value:w \__fp_rand_uniform: ; #2 ;
          \__fp_randint_wide_e:nnnn {#3} {#4}
      }
      { \__fp_exp_after_o:w #1 ; \exp:w }
  }
  }
%% File: l3fp-assign.dtx Copyright (C) 2011-2017 The LaTeX3 project
\cs_new_protected:Npn \fp_new:N #1
  { \cs_new_eq:NN #1 \c_zero_fp }
\cs_generate_variant:Nn \fp_new:N {c}
\cs_new_protected:Npn \fp_set:Nn   #1#2
  { \tl_set:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
\cs_new_protected:Npn \fp_gset:Nn  #1#2
  { \tl_gset:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
\cs_new_protected:Npn \fp_const:Nn #1#2
  { \tl_const:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } }
\cs_generate_variant:Nn \fp_set:Nn {c}
\cs_generate_variant:Nn \fp_gset:Nn {c}
\cs_generate_variant:Nn \fp_const:Nn {c}
\cs_new_eq:NN \fp_set_eq:NN  \tl_set_eq:NN
\cs_new_eq:NN \fp_gset_eq:NN \tl_gset_eq:NN
\cs_generate_variant:Nn \fp_set_eq:NN  { c , Nc , cc }
\cs_generate_variant:Nn \fp_gset_eq:NN { c , Nc , cc }
\cs_new_protected:Npn \fp_zero:N #1 { \fp_set_eq:NN #1 \c_zero_fp }
\cs_new_protected:Npn \fp_gzero:N #1 { \fp_gset_eq:NN #1 \c_zero_fp }
\cs_generate_variant:Nn \fp_zero:N  { c }
\cs_generate_variant:Nn \fp_gzero:N { c }
\cs_new_protected:Npn \fp_zero_new:N #1
  { \fp_if_exist:NTF #1 { \fp_zero:N #1 } { \fp_new:N #1 } }
\cs_new_protected:Npn \fp_gzero_new:N #1
  { \fp_if_exist:NTF #1 { \fp_gzero:N #1 } { \fp_new:N #1 } }
\cs_generate_variant:Nn \fp_zero_new:N  { c }
\cs_generate_variant:Nn \fp_gzero_new:N { c }
\cs_new_protected:Npn \fp_add:Nn  { \__fp_add:NNNn \fp_set:Nn  + }
\cs_new_protected:Npn \fp_gadd:Nn { \__fp_add:NNNn \fp_gset:Nn + }
\cs_new_protected:Npn \fp_sub:Nn  { \__fp_add:NNNn \fp_set:Nn  - }
\cs_new_protected:Npn \fp_gsub:Nn { \__fp_add:NNNn \fp_gset:Nn - }
\cs_new_protected:Npn \__fp_add:NNNn #1#2#3#4
  { #1 #3 { #3 #2 \__fp_parse:n {#4} } }
\cs_generate_variant:Nn \fp_add:Nn  { c }
\cs_generate_variant:Nn \fp_gadd:Nn { c }
\cs_generate_variant:Nn \fp_sub:Nn  { c }
\cs_generate_variant:Nn \fp_gsub:Nn { c }
\cs_new_protected:Npn \fp_show:N #1
  {
    \__msg_show_variable:NNNnn #1 \fp_if_exist:NTF ? { }
      { > ~ \token_to_str:N #1 = \fp_to_tl:N #1 }
  }
\cs_new_protected:Npn \fp_show:n
  { \__msg_show_wrap:Nn \fp_to_tl:n }
\cs_generate_variant:Nn \fp_show:N { c }
\cs_new_protected:Npn \fp_log:N
  { \__msg_log_next: \fp_show:N }
\cs_new_protected:Npn \fp_log:n
  { \__msg_log_next: \fp_show:n }
\cs_generate_variant:Nn \fp_log:N { c }
\fp_const:Nn \c_e_fp          { 2.718 2818 2845 9045 }
\fp_const:Nn \c_one_fp        { 1 }
\fp_const:Nn \c_pi_fp         { 3.141 5926 5358 9793 }
\fp_const:Nn \c_one_degree_fp { 0.0 1745 3292 5199 4330 }
\fp_new:N \l_tmpa_fp
\fp_new:N \l_tmpb_fp
\fp_new:N \g_tmpa_fp
\fp_new:N \g_tmpb_fp
%% File l3sort.dtx (C) Copyright 2012,2014-2017 The LaTeX3 Project
\int_new:N \l__sort_length_int
\int_new:N \l__sort_min_int
\int_new:N \l__sort_top_int
\int_new:N \l__sort_max_int
\int_new:N \l__sort_true_max_int
\int_new:N \l__sort_block_int
\int_new:N \l__sort_begin_int
\int_new:N \l__sort_end_int
\int_new:N \l__sort_A_int
\int_new:N \l__sort_B_int
\int_new:N \l__sort_C_int
\cs_new_protected:Npn \__sort_shrink_range:
  {
    \int_set:Nn \l__sort_A_int
      { \l__sort_true_max_int - \l__sort_min_int + 1 }
    \int_set:Nn \l__sort_block_int { \c_max_register_int / 2 }
    \__sort_shrink_range_loop:
    \int_set:Nn \l__sort_max_int
      {
        \int_compare:nNnTF
          { \l__sort_block_int * 3 / 2 } > \l__sort_A_int
          {
            \l__sort_min_int
            + ( \l__sort_A_int - 1 ) / 2
            + \l__sort_block_int / 4
            - 1
          }
          { \l__sort_true_max_int - \l__sort_block_int / 2 }
      }
  }
\cs_new_protected:Npn \__sort_shrink_range_loop:
  {
    \if_int_compare:w \l__sort_A_int < \l__sort_block_int
      \tex_divide:D \l__sort_block_int 2 \exp_stop_f:
      \exp_after:wN \__sort_shrink_range_loop:
    \fi:
  }
\cs_new_protected:Npn \__sort_compute_range:
  {
    \int_set:Nn \l__sort_min_int { \tex_count:D 15 + 1 }
    \int_set:Nn \l__sort_true_max_int { \c_max_register_int + 1 }
    \__sort_shrink_range:
    \if_meaning:w \loctoks \tex_undefined:D \else:
      \if_meaning:w \loctoks \scan_stop: \else:
        \__sort_redefine_compute_range:
        \__sort_compute_range:
      \fi:
    \fi:
  }
\cs_new_protected:Npn \__sort_redefine_compute_range:
  {
    \cs_if_exist:cTF { ver@elocalloc.sty }
      {
        \cs_gset_protected:Npn \__sort_compute_range:
          {
            \int_set:Nn \l__sort_min_int { \tex_count:D 265 }
            \int_set_eq:NN \l__sort_true_max_int \e@alloc@top
            \__sort_shrink_range:
          }
      }
      {
        \cs_gset_protected:Npn \__sort_compute_range:
          {
            \int_set:Nn \l__sort_min_int { \tex_count:D 265 }
            \int_set:Nn \l__sort_true_max_int { \tex_count:D 275 }
            \__sort_shrink_range:
          }
      }
  }
\cs_if_exist:NT \loctoks { \__sort_redefine_compute_range: }
\tl_map_inline:nn { \lastallocatedtoks \c_syst_last_allocated_toks }
  {
    \cs_if_exist:NT #1
      {
        \cs_gset_protected:Npn \__sort_compute_range:
          {
            \int_set:Nn \l__sort_min_int { #1 + 1 }
            \int_set:Nn \l__sort_true_max_int { \c_max_register_int + 1 }
            \__sort_shrink_range:
          }
      }
  }
\cs_new_protected:Npn \__sort_main:NNNnNn #1#2#3#4#5#6
  {
    \group_begin:
      \__sort_disable_toksdef:
      \__sort_compute_range:
      \int_set_eq:NN \l__sort_top_int \l__sort_min_int
      #2 #5
        {
          \if_int_compare:w \l__sort_top_int = \l__sort_max_int
            \__sort_too_long_error:NNw #3 #5
          \fi:
          \tex_toks:D \l__sort_top_int {##1}
          \int_incr:N \l__sort_top_int
        }
      \int_set:Nn \l__sort_length_int
        { \l__sort_top_int - \l__sort_min_int }
      \cs_set:Npn \__sort_compare:nn ##1 ##2 { #6 }
      \int_set:Nn \l__sort_block_int { 1 }
      \__sort_level:
      \use:x
        {
          \group_end:
          #1 \exp_not:N #5 {#4}
        }
  }
\cs_new_protected:Npn \seq_sort:Nn
  {
    \__sort_main:NNNnNn \tl_set:Nn
      \seq_map_inline:Nn \seq_map_break:n
      { \s__seq \__sort_toks:NN \exp_not:N \__seq_item:n }
  }
\cs_generate_variant:Nn \seq_sort:Nn { c }
\cs_new_protected:Npn \seq_gsort:Nn
  {
    \__sort_main:NNNnNn \tl_gset:Nn
      \seq_map_inline:Nn \seq_map_break:n
      { \s__seq \__sort_toks:NN \exp_not:N \__seq_item:n }
  }
\cs_generate_variant:Nn \seq_gsort:Nn { c }
\cs_new_protected:Npn \tl_sort:Nn
  {
    \__sort_main:NNNnNn \tl_set:Nn
      \tl_map_inline:Nn \tl_map_break:n
      { \__sort_toks:NN \prg_do_nothing: \prg_do_nothing: }
  }
\cs_generate_variant:Nn \tl_sort:Nn { c }
\cs_new_protected:Npn \tl_gsort:Nn
  {
    \__sort_main:NNNnNn \tl_gset:Nn
      \tl_map_inline:Nn \tl_map_break:n
      { \__sort_toks:NN \prg_do_nothing: \prg_do_nothing: }
  }
\cs_generate_variant:Nn \tl_gsort:Nn { c }
\cs_new_protected:Npn \clist_sort:Nn
  { \__sort_clist:NNn \tl_set:Nn }
\cs_new_protected:Npn \clist_gsort:Nn
  { \__sort_clist:NNn \tl_gset:Nn }
\cs_generate_variant:Nn \clist_sort:Nn  { c }
\cs_generate_variant:Nn \clist_gsort:Nn { c }
\cs_new_protected:Npn \__sort_clist:NNn #1#2#3
  {
    \clist_if_empty:NF #2
      {
        \__sort_main:NNNnNn #1
          \clist_map_inline:Nn \clist_map_break:n
          {
            \exp_last_unbraced:Nf \use_none:n
              { \__sort_toks:NN \exp_args:No \__clist_wrap_item:n }
          }
          #2 {#3}
      }
  }
\cs_new:Npn \__sort_toks:NN #1#2
  { \__sort_toks:NNw #1 #2 \l__sort_min_int ; }
\cs_new:Npn \__sort_toks:NNw #1#2#3 ;
  {
    \if_int_compare:w #3 < \l__sort_top_int
      #1 #2 { \tex_the:D \tex_toks:D #3 }
      \exp_after:wN \__sort_toks:NNw \exp_after:wN #1 \exp_after:wN #2
      \__int_value:w \__int_eval:w #3 + 1 \exp_after:wN ;
    \fi:
  }
\cs_new_protected:Npn \__sort_level:
  {
    \if_int_compare:w \l__sort_block_int < \l__sort_length_int
      \l__sort_end_int \l__sort_min_int
      \__sort_merge_blocks:
      \tex_advance:D \l__sort_block_int \l__sort_block_int
      \exp_after:wN \__sort_level:
    \fi:
  }
\cs_new_protected:Npn \__sort_merge_blocks:
  {
    \l__sort_begin_int \l__sort_end_int
    \tex_advance:D \l__sort_end_int \l__sort_block_int
    \if_int_compare:w \l__sort_end_int < \l__sort_top_int
      \l__sort_A_int \l__sort_end_int
      \tex_advance:D \l__sort_end_int \l__sort_block_int
      \if_int_compare:w \l__sort_end_int > \l__sort_top_int
        \l__sort_end_int \l__sort_top_int
      \fi:
      \l__sort_B_int \l__sort_A_int
      \l__sort_C_int \l__sort_top_int
      \__sort_copy_block:
      \int_decr:N \l__sort_A_int
      \int_decr:N \l__sort_B_int
      \int_decr:N \l__sort_C_int
      \exp_after:wN \__sort_merge_blocks_aux:
      \exp_after:wN \__sort_merge_blocks:
    \fi:
  }
\cs_new_protected:Npn \__sort_copy_block:
  {
    \tex_toks:D \l__sort_C_int \tex_toks:D \l__sort_B_int
    \int_incr:N \l__sort_C_int
    \int_incr:N \l__sort_B_int
    \if_int_compare:w \l__sort_B_int = \l__sort_end_int
      \use_i:nn
    \fi:
    \__sort_copy_block:
  }
\cs_new_protected:Npn \__sort_merge_blocks_aux:
  {
    \exp_after:wN \__sort_compare:nn \exp_after:wN
      { \tex_the:D \tex_toks:D \exp_after:wN \l__sort_A_int \exp_after:wN }
      \exp_after:wN { \tex_the:D \tex_toks:D \l__sort_C_int }
    \prg_do_nothing:
    \__sort_return_mark:N
    \__sort_return_mark:N
    \__sort_return_none_error:
  }
\cs_new_protected:Npn \sort_return_same: #1 \__sort_return_mark:N
  { #1 \__sort_return_mark:N \__sort_return_two_error:w \__sort_return_same: }
\cs_new_protected:Npn \sort_return_swapped: #1 \__sort_return_mark:N
  { #1 \__sort_return_mark:N \__sort_return_two_error:w \__sort_return_swapped: }
\cs_new_protected:Npn \__sort_return_mark:N #1 { }
\cs_new_protected:Npn \__sort_return_none_error:
  {
    \__msg_kernel_error:nnxx { sort } { return-none }
      { \tex_the:D \tex_toks:D \l__sort_A_int }
      { \tex_the:D \tex_toks:D \l__sort_C_int }
    \__sort_return_same:
  }
\cs_new_protected:Npn \__sort_return_two_error:w
    #1 \__sort_return_none_error:
  { \__msg_kernel_error:nn { sort } { return-two } }
\cs_new_protected:Npn \__sort_return_same:
  {
    \tex_toks:D \l__sort_B_int \tex_toks:D \l__sort_C_int
    \int_decr:N \l__sort_B_int
    \int_decr:N \l__sort_C_int
    \if_int_compare:w \l__sort_C_int < \l__sort_top_int
      \use_i:nn
    \fi:
    \__sort_merge_blocks_aux:
  }
\cs_new_protected:Npn \__sort_return_swapped:
  {
    \tex_toks:D \l__sort_B_int \tex_toks:D \l__sort_A_int
    \int_decr:N \l__sort_B_int
    \int_decr:N \l__sort_A_int
    \if_int_compare:w \l__sort_A_int < \l__sort_begin_int
      \__sort_merge_blocks_end: \use_i:nn
    \fi:
    \__sort_merge_blocks_aux:
  }
\cs_new_protected:Npn \__sort_merge_blocks_end:
  {
    \tex_toks:D \l__sort_B_int \tex_toks:D \l__sort_C_int
    \int_decr:N \l__sort_B_int
    \int_decr:N \l__sort_C_int
    \if_int_compare:w \l__sort_B_int < \l__sort_begin_int
      \use_i:nn
    \fi:
    \__sort_merge_blocks_end:
  }
\cs_new:Npn \tl_sort:nN #1#2
  {
    \exp_not:f
      {
        \tl_if_blank:nF {#1}
          {
            \__sort_quick_prepare:Nnnn #2 { } { }
              #1
              { \__prg_break_point: \__sort_quick_prepare_end:NNNnw }
            \q_stop
          }
      }
  }
\cs_new:Npn \__sort_quick_prepare:Nnnn #1#2#3#4
  {
    \__prg_break: #4 \__prg_break_point:
    \__sort_quick_prepare:Nnnn #1 { #2 #3 } { #1 {#4} }
  }
\cs_new:Npn \__sort_quick_prepare_end:NNNnw #1#2#3#4#5 \q_stop
  {
    \__sort_quick_split:NnNn #4 \__sort_quick_end:nnTFNn { }
    \q_mark { \__sort_quick_cleanup:w \exp_stop_f: }
    \s__stop \q_stop
  }
\cs_new:Npn \__sort_quick_cleanup:w #1 \s__stop \q_stop {#1}
\cs_new:Npn \__sort_quick_split:NnNn #1#2#3#4
  {
    #3 {#2} {#4} \__sort_quick_only_ii:NnnnnNn \__sort_quick_only_i:NnnnnNn
      \__sort_quick_single_end:nnnwnw
      { #3 {#4} } { } { } {#2}
  }
\cs_new:Npn \__sort_quick_only_i:NnnnnNn #1#2#3#4#5#6#7
  {
    #6 {#5} {#7} \__sort_quick_split_ii:NnnnnNn \__sort_quick_only_i:NnnnnNn
      \__sort_quick_only_i_end:nnnwnw
      { #6 {#7} } { #3 #2 } { } {#5}
  }
\cs_new:Npn \__sort_quick_only_ii:NnnnnNn #1#2#3#4#5#6#7
  {
    #6 {#5} {#7} \__sort_quick_only_ii:NnnnnNn \__sort_quick_split_i:NnnnnNn
      \__sort_quick_only_ii_end:nnnwnw
      { #6 {#7} } { } { #4 #2 } {#5}
  }
\cs_new:Npn \__sort_quick_split_i:NnnnnNn #1#2#3#4#5#6#7
  {
    #6 {#5} {#7} \__sort_quick_split_ii:NnnnnNn \__sort_quick_split_i:NnnnnNn
      \__sort_quick_split_end:nnnwnw
      { #6 {#7} } { #3 #2 } {#4} {#5}
  }
\cs_new:Npn \__sort_quick_split_ii:NnnnnNn #1#2#3#4#5#6#7
  {
    #6 {#5} {#7} \__sort_quick_split_ii:NnnnnNn \__sort_quick_split_i:NnnnnNn
      \__sort_quick_split_end:nnnwnw
      { #6 {#7} } {#3} { #4 #2 } {#5}
  }
\cs_new:Npn \__sort_quick_end:nnTFNn #1#2#3#4#5#6 {#5}
\cs_new:Npn \__sort_quick_single_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop
  { #5 {#3} #6 \q_stop }
\cs_new:Npn \__sort_quick_only_i_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop
  {
    \__sort_quick_split:NnNn #1
      \__sort_quick_end:nnTFNn { } \q_mark {#5}
    {#3}
    #6 \q_stop
  }
\cs_new:Npn \__sort_quick_only_ii_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop
  {
    \__sort_quick_split:NnNn #2
      \__sort_quick_end:nnTFNn { } \q_mark { #5 {#3} }
    #6 \q_stop
  }
\cs_new:Npn \__sort_quick_split_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop
  {
    \__sort_quick_split:NnNn #2 \__sort_quick_end:nnTFNn { } \q_mark
      {
        \__sort_quick_split:NnNn #1
          \__sort_quick_end:nnTFNn { } \q_mark {#5}
        {#3}
      }
    #6 \q_stop
  }
\cs_new_protected:Npn \__sort_error:
  {
    \cs_set_eq:NN \__sort_merge_blocks_aux: \prg_do_nothing:
    \cs_set_eq:NN \__sort_merge_blocks: \prg_do_nothing:
    \cs_set_protected:Npn \__sort_level: \use:x ##1 { \group_end: }
  }
\cs_new_protected:Npn \__sort_disable_toksdef:
  { \cs_set_eq:NN \toksdef \__sort_disabled_toksdef:n }
\cs_new_protected:Npn \__sort_disabled_toksdef:n #1
  {
    \__msg_kernel_error:nnx { sort } { toksdef }
      { \token_to_str:N #1 }
    \__sort_error:
    \tex_toksdef:D #1
  }
\__msg_kernel_new:nnnn { sort } { toksdef }
  { Allocation~of~\iow_char:N\\toks~registers~impossible~while~sorting. }
  {
    The~comparison~code~used~for~sorting~a~list~has~attempted~to~
    define~#1~as~a~new~\iow_char:N\\toks~register~using~\iow_char:N\\newtoks~
    or~a~similar~command.~The~list~will~not~be~sorted.
  }
\cs_new_protected:Npn \__sort_too_long_error:NNw #1#2 \fi:
  {
    \fi:
    \__msg_kernel_error:nnxxx { sort } { too-large }
      { \token_to_str:N #2 }
      { \int_eval:n { \l__sort_true_max_int - \l__sort_min_int } }
      { \int_eval:n { \l__sort_top_int - \l__sort_min_int } }
    #1 \__sort_error:
  }
\__msg_kernel_new:nnnn { sort } { too-large }
  { The~list~#1~is~too~long~to~be~sorted~by~TeX. }
  {
    TeX~has~#2~toks~registers~still~available:~
    this~only~allows~to~sort~with~up~to~#3~
    items.~All~extra~items~will~be~deleted.
  }
\__msg_kernel_new:nnnn { sort } { return-none }
  { The~comparison~code~did~not~return. }
  {
    When~sorting~a~list,~the~code~to~compare~items~#1~and~#2~
    did~not~call~
    \iow_char:N\\sort_return_same: ~nor~
    \iow_char:N\\sort_return_swapped: .~
    Exactly~one~of~these~should~be~called.
  }
\__msg_kernel_new:nnnn { sort } { return-two }
  { The~comparison~code~returned~multiple~times. }
  {
    When~sorting~a~list,~the~code~to~compare~items~called~
    \iow_char:N\\sort_return_same: ~or~
    \iow_char:N\\sort_return_swapped: ~multiple~times.~
    Exactly~one~of~these~should~be~called.
  }
\cs_new_protected:Npn \sort_ordered:
  {
    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
      { 2018-12-31 }
      { \token_to_str:N \sort_ordered: }
      { \token_to_str:N \sort_return_same: }
    \cs_gset_eq:NN \sort_ordered: \sort_return_same:
    \sort_return_same:
  }
\cs_new_protected:Npn \sort_reversed:
  {
    \__msg_kernel_warning:nnxxx { kernel } { deprecated-command }
      { 2018-12-31 }
      { \token_to_str:N \sort_reversed: }
      { \token_to_str:N \sort_return_swapped: }
    \cs_gset_eq:NN \sort_reversed: \sort_return_swapped:
    \sort_return_swapped:
  }
%% File: l3box.dtx Copyright (C) 2005-2017 The LaTeX3 Project
\cs_new_protected:Npn \box_new:N #1
  {
    \__chk_if_free_cs:N #1
    \cs:w newbox \cs_end: #1
  }
\cs_generate_variant:Nn \box_new:N { c }
\cs_new_protected:Npn \box_clear:N #1
  { \box_set_eq:NN  #1 \c_empty_box }
\cs_new_protected:Npn \box_gclear:N #1
  { \box_gset_eq:NN #1 \c_empty_box }
\cs_generate_variant:Nn \box_clear:N  { c }
\cs_generate_variant:Nn \box_gclear:N { c }
\cs_new_protected:Npn \box_clear_new:N #1
  { \box_if_exist:NTF #1 { \box_clear:N #1 } { \box_new:N #1 } }
\cs_new_protected:Npn \box_gclear_new:N #1
  { \box_if_exist:NTF #1 { \box_gclear:N #1 } { \box_new:N #1 } }
\cs_generate_variant:Nn \box_clear_new:N  { c }
\cs_generate_variant:Nn \box_gclear_new:N { c }
\cs_new_protected:Npn \box_set_eq:NN #1#2
  { \tex_setbox:D #1 \tex_copy:D #2 }
\cs_new_protected:Npn \box_gset_eq:NN
  { \tex_global:D \box_set_eq:NN }
\cs_generate_variant:Nn \box_set_eq:NN  { c , Nc , cc }
\cs_generate_variant:Nn \box_gset_eq:NN { c , Nc , cc }
\cs_new_protected:Npn \box_set_eq_clear:NN #1#2
  { \tex_setbox:D #1 \tex_box:D #2 }
\cs_new_protected:Npn \box_gset_eq_clear:NN
  { \tex_global:D  \box_set_eq_clear:NN }
\cs_generate_variant:Nn \box_set_eq_clear:NN  { c , Nc , cc }
\cs_generate_variant:Nn \box_gset_eq_clear:NN { c , Nc , cc }
\prg_new_eq_conditional:NNn \box_if_exist:N \cs_if_exist:N
  { TF , T , F , p }
\prg_new_eq_conditional:NNn \box_if_exist:c \cs_if_exist:c
  { TF , T , F , p }
\cs_new_eq:NN \box_ht:N \tex_ht:D
\cs_new_eq:NN \box_dp:N \tex_dp:D
\cs_new_eq:NN \box_wd:N \tex_wd:D
\cs_generate_variant:Nn \box_ht:N { c }
\cs_generate_variant:Nn \box_dp:N { c }
\cs_generate_variant:Nn \box_wd:N { c }
\cs_new_protected:Npn \box_set_dp:Nn #1#2
  { \box_dp:N #1 \__dim_eval:w #2 \__dim_eval_end: }
\cs_new_protected:Npn \box_set_ht:Nn #1#2
  { \box_ht:N #1 \__dim_eval:w #2 \__dim_eval_end: }
\cs_new_protected:Npn \box_set_wd:Nn #1#2
  { \box_wd:N #1 \__dim_eval:w #2 \__dim_eval_end: }
\cs_generate_variant:Nn \box_set_ht:Nn { c }
\cs_generate_variant:Nn \box_set_dp:Nn { c }
\cs_generate_variant:Nn \box_set_wd:Nn { c }
\cs_new_eq:NN \box_use_clear:N \tex_box:D
\cs_new_eq:NN \box_use:N \tex_copy:D
\cs_generate_variant:Nn \box_use_clear:N { c }
\cs_generate_variant:Nn \box_use:N { c }
\cs_new_protected:Npn \box_move_left:nn #1#2
  { \tex_moveleft:D \__dim_eval:w #1 \__dim_eval_end: #2 }
\cs_new_protected:Npn \box_move_right:nn #1#2
  { \tex_moveright:D \__dim_eval:w #1 \__dim_eval_end: #2 }
\cs_new_protected:Npn \box_move_up:nn #1#2
  { \tex_raise:D \__dim_eval:w #1 \__dim_eval_end: #2 }
\cs_new_protected:Npn \box_move_down:nn #1#2
  { \tex_lower:D \__dim_eval:w #1 \__dim_eval_end: #2 }
\cs_new_eq:NN \if_hbox:N      \tex_ifhbox:D
\cs_new_eq:NN \if_vbox:N      \tex_ifvbox:D
\cs_new_eq:NN \if_box_empty:N \tex_ifvoid:D
\prg_new_conditional:Npnn \box_if_horizontal:N #1 { p , T , F , TF }
  { \if_hbox:N #1 \prg_return_true: \else: \prg_return_false: \fi: }
\prg_new_conditional:Npnn \box_if_vertical:N #1 { p , T , F , TF }
  { \if_vbox:N #1 \prg_return_true: \else: \prg_return_false: \fi: }
\cs_generate_variant:Nn \box_if_horizontal_p:N { c }
\cs_generate_variant:Nn \box_if_horizontal:NT  { c }
\cs_generate_variant:Nn \box_if_horizontal:NF  { c }
\cs_generate_variant:Nn \box_if_horizontal:NTF { c }
\cs_generate_variant:Nn \box_if_vertical_p:N { c }
\cs_generate_variant:Nn \box_if_vertical:NT  { c }
\cs_generate_variant:Nn \box_if_vertical:NF  { c }
\cs_generate_variant:Nn \box_if_vertical:NTF { c }
\prg_new_conditional:Npnn \box_if_empty:N #1 { p , T , F , TF }
  { \if_box_empty:N #1 \prg_return_true: \else: \prg_return_false: \fi: }
\cs_generate_variant:Nn \box_if_empty_p:N { c }
\cs_generate_variant:Nn \box_if_empty:NT  { c }
\cs_generate_variant:Nn \box_if_empty:NF  { c }
\cs_generate_variant:Nn \box_if_empty:NTF { c }
\cs_new_protected:Npn \box_set_to_last:N #1
  { \tex_setbox:D #1 \tex_lastbox:D }
\cs_new_protected:Npn \box_gset_to_last:N
  { \tex_global:D \box_set_to_last:N }
\cs_generate_variant:Nn \box_set_to_last:N  { c }
\cs_generate_variant:Nn \box_gset_to_last:N { c }
\box_new:N \c_empty_box
\box_new:N \l_tmpa_box
\box_new:N \l_tmpb_box
\box_new:N \g_tmpa_box
\box_new:N \g_tmpb_box
\cs_new_protected:Npn \box_show:N #1
  { \box_show:Nnn #1 \c_max_int \c_max_int }
\cs_generate_variant:Nn \box_show:N { c }
\cs_new_protected:Npn \box_show:Nnn #1#2#3
  { \__box_show:NNff 1 #1 { \int_eval:n {#2} } { \int_eval:n {#3} } }
\cs_generate_variant:Nn \box_show:Nnn { c }
\cs_new_protected:Npn \box_log:N #1
  { \box_log:Nnn #1 \c_max_int \c_max_int }
\cs_generate_variant:Nn \box_log:N { c }
\cs_new_protected:Npn \box_log:Nnn
  { \exp_args:No \__box_log:nNnn { \tex_the:D \etex_interactionmode:D } }
\cs_new_protected:Npn \__box_log:nNnn #1#2#3#4
  {
    \int_set:Nn \etex_interactionmode:D { 0 }
    \__box_show:NNff 0 #2 { \int_eval:n {#3} } { \int_eval:n {#4} }
    \int_set:Nn \etex_interactionmode:D {#1}
  }
\cs_generate_variant:Nn \box_log:Nnn { c }
\cs_new_protected:Npn \__box_show:NNnn #1#2#3#4
  {
    \box_if_exist:NTF #2
      {
        \group_begin:
          \int_set:Nn \tex_showboxbreadth:D {#3}
          \int_set:Nn \tex_showboxdepth:D   {#4}
          \int_set:Nn \tex_tracingonline:D  {#1}
          \int_set:Nn \tex_errorcontextlines:D { -1 }
          \tex_showbox:D \use:n {#2}
        \group_end:
      }
      {
        \__msg_kernel_error:nnx { kernel } { variable-not-defined }
          { \token_to_str:N #2 }
      }
  }
\cs_generate_variant:Nn \__box_show:NNnn { NNff }
\cs_new_protected:Npn \hbox:n #1
  { \tex_hbox:D \scan_stop: { \group_begin: #1 \group_end: } }
\cs_new_protected:Npn \hbox_set:Nn #1#2
  { \tex_setbox:D #1 \tex_hbox:D { \group_begin: #2 \group_end: } }
\cs_new_protected:Npn \hbox_gset:Nn { \tex_global:D \hbox_set:Nn }
\cs_generate_variant:Nn \hbox_set:Nn { c }
\cs_generate_variant:Nn \hbox_gset:Nn { c }
\cs_new_protected:Npn \hbox_set_to_wd:Nnn #1#2#3
  {
    \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:w #2 \__dim_eval_end:
      { \group_begin: #3 \group_end: }
  }
\cs_new_protected:Npn \hbox_gset_to_wd:Nnn
  { \tex_global:D \hbox_set_to_wd:Nnn }
\cs_generate_variant:Nn \hbox_set_to_wd:Nnn { c }
\cs_generate_variant:Nn \hbox_gset_to_wd:Nnn { c }
\cs_new_protected:Npn \hbox_set:Nw  #1
  {
    \tex_setbox:D #1 \tex_hbox:D
      \c_group_begin_token
        \group_begin:
  }
\cs_new_protected:Npn \hbox_gset:Nw
  { \tex_global:D \hbox_set:Nw }
\cs_generate_variant:Nn \hbox_set:Nw  { c }
\cs_generate_variant:Nn \hbox_gset:Nw { c }
\cs_new_protected:Npn \hbox_set_end:
  {
      \group_end:
    \c_group_end_token
  }
\cs_new_eq:NN \hbox_gset_end: \hbox_set_end:
\cs_new_protected:Npn \hbox_to_wd:nn #1#2
   {
     \tex_hbox:D to \__dim_eval:w #1 \__dim_eval_end:
       { \group_begin: #2 \group_end: }
   }
\cs_new_protected:Npn \hbox_to_zero:n #1
  { \tex_hbox:D to \c_zero_dim { \group_begin: #1 \group_end: } }
\cs_new_protected:Npn \hbox_overlap_left:n  #1
  { \hbox_to_zero:n { \tex_hss:D #1 } }
\cs_new_protected:Npn \hbox_overlap_right:n #1
  { \hbox_to_zero:n { #1 \tex_hss:D } }
\cs_new_eq:NN \hbox_unpack:N \tex_unhcopy:D
\cs_new_eq:NN \hbox_unpack_clear:N \tex_unhbox:D
\cs_generate_variant:Nn \hbox_unpack:N { c }
\cs_generate_variant:Nn \hbox_unpack_clear:N { c }
\cs_new_protected:Npn \vbox:n #1
  { \tex_vbox:D { \group_begin: #1 \par \group_end: } }
\cs_new_protected:Npn \vbox_top:n #1
  { \tex_vtop:D { \group_begin: #1 \par \group_end: } }
\cs_new_protected:Npn \vbox_to_ht:nn #1#2
  {
    \tex_vbox:D to \__dim_eval:w #1 \__dim_eval_end:
      { \group_begin: #2 \par \group_end: }
  }
\cs_new_protected:Npn \vbox_to_zero:n #1
  {
    \tex_vbox:D to \c_zero_dim
      { \group_begin: #1 \par \group_end: }
  }
\cs_new_protected:Npn \vbox_set:Nn #1#2
  {
    \tex_setbox:D #1 \tex_vbox:D
      { \group_begin: #2 \par \group_end: }
  }
\cs_new_protected:Npn \vbox_gset:Nn  { \tex_global:D \vbox_set:Nn }
\cs_generate_variant:Nn \vbox_set:Nn  { c }
\cs_generate_variant:Nn \vbox_gset:Nn { c }
\cs_new_protected:Npn \vbox_set_top:Nn #1#2
  {
    \tex_setbox:D #1 \tex_vtop:D
      { \group_begin: #2 \par \group_end: }
  }
\cs_new_protected:Npn \vbox_gset_top:Nn
  { \tex_global:D \vbox_set_top:Nn }
\cs_generate_variant:Nn \vbox_set_top:Nn { c }
\cs_generate_variant:Nn \vbox_gset_top:Nn { c }
\cs_new_protected:Npn \vbox_set_to_ht:Nnn #1#2#3
  {
    \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:w #2 \__dim_eval_end:
      { \group_begin: #3 \par \group_end: }
  }
\cs_new_protected:Npn \vbox_gset_to_ht:Nnn
  { \tex_global:D \vbox_set_to_ht:Nnn }
\cs_generate_variant:Nn \vbox_set_to_ht:Nnn  { c }
\cs_generate_variant:Nn \vbox_gset_to_ht:Nnn { c }
\cs_new_protected:Npn \vbox_set:Nw #1
  {
    \tex_setbox:D #1 \tex_vbox:D
      \c_group_begin_token
        \group_begin:
  }
\cs_new_protected:Npn \vbox_gset:Nw
  { \tex_global:D \vbox_set:Nw }
\cs_generate_variant:Nn \vbox_set:Nw  { c }
\cs_generate_variant:Nn \vbox_gset:Nw { c }
\cs_new_protected:Npn \vbox_set_end:
  {
        \par
      \group_end:
    \c_group_end_token
  }
\cs_new_eq:NN \vbox_gset_end: \vbox_set_end:
\cs_new_eq:NN \vbox_unpack:N \tex_unvcopy:D
\cs_new_eq:NN \vbox_unpack_clear:N \tex_unvbox:D
\cs_generate_variant:Nn \vbox_unpack:N { c }
\cs_generate_variant:Nn \vbox_unpack_clear:N { c }
\cs_new_protected:Npn \vbox_set_split_to_ht:NNn #1#2#3
  { \tex_setbox:D #1 \tex_vsplit:D #2 to \__dim_eval:w #3 \__dim_eval_end: }
\fp_new:N \l__box_angle_fp
\fp_new:N \l__box_cos_fp
\fp_new:N \l__box_sin_fp
\dim_new:N \l__box_top_dim
\dim_new:N \l__box_bottom_dim
\dim_new:N \l__box_left_dim
\dim_new:N \l__box_right_dim
\dim_new:N \l__box_top_new_dim
\dim_new:N \l__box_bottom_new_dim
\dim_new:N \l__box_left_new_dim
\dim_new:N \l__box_right_new_dim
\box_new:N \l__box_internal_box
\cs_new_protected:Npn \box_rotate:Nn #1#2
  {
    \hbox_set:Nn #1
      {
        \fp_set:Nn \l__box_angle_fp {#2}
        \fp_set:Nn \l__box_sin_fp { sind ( \l__box_angle_fp ) }
        \fp_set:Nn \l__box_cos_fp { cosd ( \l__box_angle_fp ) }
        \__box_rotate:N #1
      }
  }
\cs_new_protected:Npn \__box_rotate:N #1
  {
    \dim_set:Nn \l__box_top_dim    {  \box_ht:N #1 }
    \dim_set:Nn \l__box_bottom_dim { -\box_dp:N #1 }
    \dim_set:Nn \l__box_right_dim  {  \box_wd:N #1 }
    \dim_zero:N \l__box_left_dim
    \fp_compare:nNnTF \l__box_sin_fp > \c_zero_fp
      {
        \fp_compare:nNnTF \l__box_cos_fp > \c_zero_fp
          { \__box_rotate_quadrant_one: }
          { \__box_rotate_quadrant_two: }
      }
      {
        \fp_compare:nNnTF \l__box_cos_fp < \c_zero_fp
          { \__box_rotate_quadrant_three: }
          { \__box_rotate_quadrant_four: }
      }
    \hbox_set:Nn \l__box_internal_box { \box_use:N #1 }
    \hbox_set:Nn \l__box_internal_box
      {
        \tex_kern:D -\l__box_left_new_dim
        \hbox:n
          {
            \__driver_box_use_rotate:Nn
              \l__box_internal_box
              \l__box_angle_fp
          }
      }
    \box_set_ht:Nn \l__box_internal_box {  \l__box_top_new_dim }
    \box_set_dp:Nn \l__box_internal_box { -\l__box_bottom_new_dim }
    \box_set_wd:Nn \l__box_internal_box
      { \l__box_right_new_dim - \l__box_left_new_dim }
    \box_use:N \l__box_internal_box
  }
\cs_new_protected:Npn \__box_rotate_x:nnN #1#2#3
  {
    \dim_set:Nn #3
      {
        \fp_to_dim:n
          {
              \l__box_cos_fp * \dim_to_fp:n {#1}
            - \l__box_sin_fp * \dim_to_fp:n {#2}
          }
      }
  }
\cs_new_protected:Npn \__box_rotate_y:nnN #1#2#3
  {
    \dim_set:Nn #3
      {
        \fp_to_dim:n
          {
              \l__box_sin_fp * \dim_to_fp:n {#1}
            + \l__box_cos_fp * \dim_to_fp:n {#2}
          }
      }
  }
\cs_new_protected:Npn \__box_rotate_quadrant_one:
  {
    \__box_rotate_y:nnN \l__box_right_dim \l__box_top_dim
      \l__box_top_new_dim
    \__box_rotate_y:nnN \l__box_left_dim  \l__box_bottom_dim
      \l__box_bottom_new_dim
    \__box_rotate_x:nnN \l__box_left_dim  \l__box_top_dim
      \l__box_left_new_dim
    \__box_rotate_x:nnN \l__box_right_dim \l__box_bottom_dim
      \l__box_right_new_dim
  }
\cs_new_protected:Npn \__box_rotate_quadrant_two:
  {
    \__box_rotate_y:nnN \l__box_right_dim \l__box_bottom_dim
      \l__box_top_new_dim
    \__box_rotate_y:nnN \l__box_left_dim  \l__box_top_dim
      \l__box_bottom_new_dim
    \__box_rotate_x:nnN \l__box_right_dim  \l__box_top_dim
      \l__box_left_new_dim
    \__box_rotate_x:nnN \l__box_left_dim   \l__box_bottom_dim
      \l__box_right_new_dim
  }
\cs_new_protected:Npn \__box_rotate_quadrant_three:
  {
    \__box_rotate_y:nnN \l__box_left_dim  \l__box_bottom_dim
      \l__box_top_new_dim
    \__box_rotate_y:nnN \l__box_right_dim \l__box_top_dim
      \l__box_bottom_new_dim
    \__box_rotate_x:nnN \l__box_right_dim \l__box_bottom_dim
      \l__box_left_new_dim
    \__box_rotate_x:nnN \l__box_left_dim   \l__box_top_dim
      \l__box_right_new_dim
  }
\cs_new_protected:Npn \__box_rotate_quadrant_four:
  {
    \__box_rotate_y:nnN \l__box_left_dim  \l__box_top_dim
      \l__box_top_new_dim
    \__box_rotate_y:nnN \l__box_right_dim \l__box_bottom_dim
      \l__box_bottom_new_dim
    \__box_rotate_x:nnN \l__box_left_dim  \l__box_bottom_dim
      \l__box_left_new_dim
    \__box_rotate_x:nnN \l__box_right_dim \l__box_top_dim
      \l__box_right_new_dim
  }
\fp_new:N \l__box_scale_x_fp
\fp_new:N \l__box_scale_y_fp
\cs_new_protected:Npn \box_resize_to_wd_and_ht_plus_dp:Nnn #1#2#3
  {
    \hbox_set:Nn #1
      {
        \__box_resize_set_corners:N #1
        \fp_set:Nn \l__box_scale_x_fp
          { \dim_to_fp:n {#2} / \dim_to_fp:n { \l__box_right_dim } }
        \fp_set:Nn \l__box_scale_y_fp
          {
              \dim_to_fp:n {#3}
            / \dim_to_fp:n { \l__box_top_dim - \l__box_bottom_dim }
          }
        \__box_resize:N #1
      }
  }
\cs_generate_variant:Nn \box_resize_to_wd_and_ht_plus_dp:Nnn { c }
\cs_new_protected:Npn \__box_resize_set_corners:N #1
  {
    \dim_set:Nn \l__box_top_dim    {  \box_ht:N #1 }
    \dim_set:Nn \l__box_bottom_dim { -\box_dp:N #1 }
    \dim_set:Nn \l__box_right_dim  {  \box_wd:N #1 }
    \dim_zero:N \l__box_left_dim
  }
\cs_new_protected:Npn \__box_resize:N #1
  {
    \__box_resize:NNN \l__box_right_new_dim
      \l__box_scale_x_fp \l__box_right_dim
    \__box_resize:NNN \l__box_bottom_new_dim
      \l__box_scale_y_fp \l__box_bottom_dim
    \__box_resize:NNN \l__box_top_new_dim
      \l__box_scale_y_fp \l__box_top_dim
    \__box_resize_common:N #1
  }
\cs_new_protected:Npn \__box_resize:NNN #1#2#3
  {
    \dim_set:Nn #1
      { \fp_to_dim:n { \fp_abs:n { #2 } * \dim_to_fp:n { #3 } } }
  }
\cs_new_protected:Npn \box_resize_to_ht:Nn #1#2
  {
    \hbox_set:Nn #1
      {
        \__box_resize_set_corners:N #1
        \fp_set:Nn \l__box_scale_y_fp
          {
              \dim_to_fp:n {#2}
            / \dim_to_fp:n { \l__box_top_dim }
          }
        \fp_set_eq:NN \l__box_scale_x_fp \l__box_scale_y_fp
        \__box_resize:N #1
      }
  }
\cs_generate_variant:Nn \box_resize_to_ht:Nn { c }
\cs_new_protected:Npn \box_resize_to_ht_plus_dp:Nn #1#2
  {
    \hbox_set:Nn #1
      {
        \__box_resize_set_corners:N #1
        \fp_set:Nn \l__box_scale_y_fp
          {
              \dim_to_fp:n {#2}
            / \dim_to_fp:n { \l__box_top_dim - \l__box_bottom_dim }
          }
        \fp_set_eq:NN \l__box_scale_x_fp \l__box_scale_y_fp
        \__box_resize:N #1
      }
  }
\cs_generate_variant:Nn \box_resize_to_ht_plus_dp:Nn { c }
\cs_new_protected:Npn \box_resize_to_wd:Nn #1#2
  {
    \hbox_set:Nn #1
      {
        \__box_resize_set_corners:N #1
        \fp_set:Nn \l__box_scale_x_fp
          { \dim_to_fp:n {#2} / \dim_to_fp:n { \l__box_right_dim } }
        \fp_set_eq:NN \l__box_scale_y_fp \l__box_scale_x_fp
        \__box_resize:N #1
      }
  }
\cs_generate_variant:Nn \box_resize_to_wd:Nn { c }
\cs_new_protected:Npn \box_resize_to_wd_and_ht:Nnn #1#2#3
  {
    \hbox_set:Nn #1
      {
        \__box_resize_set_corners:N #1
        \fp_set:Nn \l__box_scale_x_fp
          { \dim_to_fp:n {#2} / \dim_to_fp:n { \l__box_right_dim } }
        \fp_set:Nn \l__box_scale_y_fp
          {
              \dim_to_fp:n {#3}
            / \dim_to_fp:n { \l__box_top_dim }
          }
        \__box_resize:N #1
      }
  }
\cs_generate_variant:Nn \box_resize_to_wd_and_ht:Nnn { c }
\cs_new_protected:Npn \box_scale:Nnn #1#2#3
  {
    \hbox_set:Nn #1
      {
        \fp_set:Nn \l__box_scale_x_fp {#2}
        \fp_set:Nn \l__box_scale_y_fp {#3}
        \__box_scale_aux:N #1
      }
  }
\cs_generate_variant:Nn \box_scale:Nnn { c }
\cs_new_protected:Npn \__box_scale_aux:N #1
  {
    \dim_set:Nn \l__box_top_dim    {  \box_ht:N #1 }
    \dim_set:Nn \l__box_bottom_dim { -\box_dp:N #1 }
    \dim_set:Nn \l__box_right_dim  {  \box_wd:N #1 }
    \dim_zero:N \l__box_left_dim
    \dim_set:Nn \l__box_top_new_dim
      { \fp_abs:n { \l__box_scale_y_fp } \l__box_top_dim }
    \dim_set:Nn \l__box_bottom_new_dim
      { \fp_abs:n { \l__box_scale_y_fp } \l__box_bottom_dim }
    \dim_set:Nn \l__box_right_new_dim
      { \fp_abs:n { \l__box_scale_x_fp } \l__box_right_dim }
    \__box_resize_common:N #1
  }
\cs_new_protected:Npn \box_autosize_to_wd_and_ht:Nnn #1#2#3
  { \__box_autosize:Nnnn #1 {#2} {#3} { \box_ht:N #1 } }
\cs_generate_variant:Nn \box_autosize_to_wd_and_ht:Nnn { c }
\cs_new_protected:Npn \box_autosize_to_wd_and_ht_plus_dp:Nnn #1#2#3
  { \__box_autosize:Nnnn #1 {#2} {#3} { \box_ht:N #1 + \box_dp:N #1 } }
\cs_generate_variant:Nn \box_autosize_to_wd_and_ht_plus_dp:Nnn { c }
\cs_new_protected:Npn \__box_autosize:Nnnn #1#2#3#4
  {
    \hbox_set:Nn #1
      {
        \fp_set:Nn \l__box_scale_x_fp { ( #2 ) / \box_wd:N #1 }
        \fp_set:Nn \l__box_scale_y_fp { ( #3 ) / ( #4 ) }
        \fp_compare:nNnTF \l__box_scale_x_fp > \l__box_scale_y_fp
          { \fp_set_eq:NN \l__box_scale_x_fp \l__box_scale_y_fp }
          { \fp_set_eq:NN \l__box_scale_y_fp \l__box_scale_x_fp }
        \__box_scale_aux:N #1
      }
  }
\cs_new_protected:Npn \__box_resize_common:N #1
  {
    \hbox_set:Nn \l__box_internal_box
      {
        \__driver_box_use_scale:Nnn
          #1
          \l__box_scale_x_fp
          \l__box_scale_y_fp
      }
    \fp_compare:nNnTF \l__box_scale_y_fp > \c_zero_fp
      {
        \box_set_ht:Nn \l__box_internal_box { \l__box_top_new_dim }
        \box_set_dp:Nn \l__box_internal_box { -\l__box_bottom_new_dim }
      }
      {
        \box_set_dp:Nn \l__box_internal_box { \l__box_top_new_dim }
        \box_set_ht:Nn \l__box_internal_box { -\l__box_bottom_new_dim }
      }
    \fp_compare:nNnTF \l__box_scale_x_fp < \c_zero_fp
      {
        \hbox_to_wd:nn { \l__box_right_new_dim }
          {
            \tex_kern:D \l__box_right_new_dim
            \box_use:N \l__box_internal_box
            \tex_hss:D
          }
      }
      {
        \box_set_wd:Nn \l__box_internal_box { \l__box_right_new_dim }
        \hbox:n
          {
            \tex_kern:D \c_zero_dim
            \box_use:N \l__box_internal_box
            \tex_hss:D
          }
      }
  }
\cs_new_eq:NN \box_resize:Nnn \box_resize_to_wd_and_ht_plus_dp:Nnn
\cs_new_eq:NN \box_resize:cnn \box_resize_to_wd_and_ht_plus_dp:cnn
%% File: l3coffins.dtx Copyright(C) 2010-2017 The LaTeX3 Project
\box_new:N \l__coffin_internal_box
\dim_new:N \l__coffin_internal_dim
\tl_new:N  \l__coffin_internal_tl
\prop_new:N \c__coffin_corners_prop
\prop_put:Nnn \c__coffin_corners_prop { tl } { { 0pt } { 0pt } }
\prop_put:Nnn \c__coffin_corners_prop { tr } { { 0pt } { 0pt } }
\prop_put:Nnn \c__coffin_corners_prop { bl } { { 0pt } { 0pt } }
\prop_put:Nnn \c__coffin_corners_prop { br } { { 0pt } { 0pt } }
\prop_new:N \c__coffin_poles_prop
\tl_set:Nn \l__coffin_internal_tl { { 0pt } { 0pt } { 0pt } { 1000pt } }
\prop_put:Nno \c__coffin_poles_prop { l }  { \l__coffin_internal_tl }
\prop_put:Nno \c__coffin_poles_prop { hc } { \l__coffin_internal_tl }
\prop_put:Nno \c__coffin_poles_prop { r }  { \l__coffin_internal_tl }
\tl_set:Nn \l__coffin_internal_tl { { 0pt } { 0pt } { 1000pt } { 0pt } }
\prop_put:Nno \c__coffin_poles_prop { b }  { \l__coffin_internal_tl }
\prop_put:Nno \c__coffin_poles_prop { vc } { \l__coffin_internal_tl }
\prop_put:Nno \c__coffin_poles_prop { t }  { \l__coffin_internal_tl }
\prop_put:Nno \c__coffin_poles_prop { B }  { \l__coffin_internal_tl }
\prop_put:Nno \c__coffin_poles_prop { H }  { \l__coffin_internal_tl }
\prop_put:Nno \c__coffin_poles_prop { T }  { \l__coffin_internal_tl }
\fp_new:N \l__coffin_slope_x_fp
\fp_new:N \l__coffin_slope_y_fp
\bool_new:N \l__coffin_error_bool
\dim_new:N \l__coffin_offset_x_dim
\dim_new:N \l__coffin_offset_y_dim
\tl_new:N \l__coffin_pole_a_tl
\tl_new:N \l__coffin_pole_b_tl
\dim_new:N \l__coffin_x_dim
\dim_new:N \l__coffin_y_dim
\dim_new:N \l__coffin_x_prime_dim
\dim_new:N \l__coffin_y_prime_dim
\prg_new_conditional:Npnn \coffin_if_exist:N #1 { p , T , F , TF }
  {
    \cs_if_exist:NTF #1
      {
        \cs_if_exist:cTF { l__coffin_poles_ \__int_value:w #1 _prop }
          { \prg_return_true: }
          { \prg_return_false: }
      }
      { \prg_return_false: }
  }
\cs_generate_variant:Nn \coffin_if_exist_p:N { c }
\cs_generate_variant:Nn \coffin_if_exist:NT  { c }
\cs_generate_variant:Nn \coffin_if_exist:NF  { c }
\cs_generate_variant:Nn \coffin_if_exist:NTF { c }
\cs_new_protected:Npn \__coffin_if_exist:NT #1#2
  {
    \coffin_if_exist:NTF #1
      { #2 }
      {
        \__msg_kernel_error:nnx { kernel } { unknown-coffin }
          { \token_to_str:N #1 }
      }
  }
\cs_new_protected:Npn \coffin_clear:N #1
  {
    \__coffin_if_exist:NT #1
      {
        \box_clear:N #1
        \__coffin_reset_structure:N #1
      }
  }
\cs_generate_variant:Nn \coffin_clear:N { c }
\cs_new_protected:Npn \coffin_new:N #1
  {
    \box_new:N #1
    \__chk_suspend_log:
    \prop_clear_new:c { l__coffin_corners_ \__int_value:w #1 _prop }
    \prop_clear_new:c { l__coffin_poles_   \__int_value:w #1 _prop }
    \prop_gset_eq:cN { l__coffin_corners_ \__int_value:w #1 _prop }
      \c__coffin_corners_prop
    \prop_gset_eq:cN { l__coffin_poles_ \__int_value:w #1 _prop }
      \c__coffin_poles_prop
    \__chk_resume_log:
  }
\cs_generate_variant:Nn \coffin_new:N { c }
\cs_new_protected:Npn \hcoffin_set:Nn #1#2
  {
    \__coffin_if_exist:NT #1
      {
        \hbox_set:Nn #1
          {
            \color_ensure_current:
            #2
          }
        \__coffin_reset_structure:N #1
        \__coffin_update_poles:N #1
        \__coffin_update_corners:N #1
      }
  }
\cs_generate_variant:Nn \hcoffin_set:Nn { c }
\cs_new_protected:Npn \vcoffin_set:Nnn #1#2#3
  {
    \__coffin_if_exist:NT #1
      {
        \vbox_set:Nn #1
          {
            \dim_set:Nn \tex_hsize:D {#2}
            \dim_set_eq:NN \linewidth   \tex_hsize:D
            \dim_set_eq:NN \columnwidth \tex_hsize:D
            #3
          }
        \__coffin_reset_structure:N #1
        \__coffin_update_poles:N #1
        \__coffin_update_corners:N #1
        \vbox_set_top:Nn \l__coffin_internal_box { \vbox_unpack:N #1 }
        \__coffin_set_pole:Nnx #1 { T }
          {
            { 0pt }
            {
              \dim_eval:n
                { \box_ht:N #1 - \box_ht:N \l__coffin_internal_box }
            }
            { 1000pt }
            { 0pt }
          }
        \box_clear:N \l__coffin_internal_box
      }
  }
\cs_generate_variant:Nn \vcoffin_set:Nnn { c }
\cs_new_protected:Npn \hcoffin_set:Nw #1
  {
    \__coffin_if_exist:NT #1
      {
        \hbox_set:Nw #1 \color_ensure_current:
          \cs_set_protected:Npn \hcoffin_set_end:
            {
              \hbox_set_end:
              \__coffin_reset_structure:N #1
              \__coffin_update_poles:N #1
              \__coffin_update_corners:N #1
            }
      }
  }
\cs_new_protected:Npn \hcoffin_set_end: { }
\cs_generate_variant:Nn \hcoffin_set:Nw { c }
\cs_new_protected:Npn \vcoffin_set:Nnw #1#2
  {
    \__coffin_if_exist:NT #1
      {
        \vbox_set:Nw #1
          \dim_set:Nn \tex_hsize:D {#2}
            \dim_set_eq:NN \linewidth   \tex_hsize:D
            \dim_set_eq:NN \columnwidth \tex_hsize:D
          \cs_set_protected:Npn \vcoffin_set_end:
            {
              \vbox_set_end:
              \__coffin_reset_structure:N #1
              \__coffin_update_poles:N #1
              \__coffin_update_corners:N #1
              \vbox_set_top:Nn \l__coffin_internal_box { \vbox_unpack:N #1 }
              \__coffin_set_pole:Nnx #1 { T }
                {
                  { 0pt }
                  {
                    \dim_eval:n
                      { \box_ht:N #1 - \box_ht:N \l__coffin_internal_box }
                  }
                  { 1000pt }
                  { 0pt }
                }
              \box_clear:N \l__coffin_internal_box
            }
      }
  }
\cs_new_protected:Npn \vcoffin_set_end: { }
\cs_generate_variant:Nn \vcoffin_set:Nnw { c }
\cs_new_protected:Npn \coffin_set_eq:NN #1#2
  {
    \__coffin_if_exist:NT #1
      {
        \box_set_eq:NN #1 #2
        \__coffin_set_eq_structure:NN #1 #2
      }
  }
\cs_generate_variant:Nn \coffin_set_eq:NN { c , Nc , cc }
\coffin_new:N \c_empty_coffin
\hbox_set:Nn  \c_empty_coffin { }
\coffin_new:N \l__coffin_aligned_coffin
\coffin_new:N \l__coffin_aligned_internal_coffin
\coffin_new:N \l_tmpa_coffin
\coffin_new:N \l_tmpb_coffin
\cs_new_eq:NN \coffin_dp:N \box_dp:N
\cs_new_eq:NN \coffin_dp:c \box_dp:c
\cs_new_eq:NN \coffin_ht:N \box_ht:N
\cs_new_eq:NN \coffin_ht:c \box_ht:c
\cs_new_eq:NN \coffin_wd:N \box_wd:N
\cs_new_eq:NN \coffin_wd:c \box_wd:c
\cs_new_protected:Npn \__coffin_get_pole:NnN #1#2#3
  {
    \prop_get:cnNF
      { l__coffin_poles_ \__int_value:w #1 _prop } {#2} #3
      {
        \__msg_kernel_error:nnxx { kernel } { unknown-coffin-pole }
          {#2} { \token_to_str:N #1 }
        \tl_set:Nn #3 { { 0pt } { 0pt } { 0pt } { 0pt } }
      }
  }
\cs_new_protected:Npn \__coffin_reset_structure:N #1
  {
    \prop_set_eq:cN { l__coffin_corners_ \__int_value:w #1 _prop }
      \c__coffin_corners_prop
    \prop_set_eq:cN { l__coffin_poles_ \__int_value:w #1 _prop }
      \c__coffin_poles_prop
  }
\cs_new_protected:Npn \__coffin_set_eq_structure:NN #1#2
  {
    \prop_set_eq:cc { l__coffin_corners_ \__int_value:w #1 _prop }
      { l__coffin_corners_ \__int_value:w #2 _prop }
    \prop_set_eq:cc { l__coffin_poles_ \__int_value:w #1 _prop }
      { l__coffin_poles_ \__int_value:w #2 _prop }
  }
\cs_new_protected:Npn \__coffin_gset_eq_structure:NN #1#2
  {
    \prop_gset_eq:cc { l__coffin_corners_ \__int_value:w #1 _prop }
      { l__coffin_corners_ \__int_value:w #2 _prop }
    \prop_gset_eq:cc { l__coffin_poles_ \__int_value:w #1 _prop }
      { l__coffin_poles_ \__int_value:w #2 _prop }
  }
\cs_new_protected:Npn \coffin_set_horizontal_pole:Nnn #1#2#3
  {
    \__coffin_if_exist:NT #1
      {
        \__coffin_set_pole:Nnx #1 {#2}
          {
            { 0pt } { \dim_eval:n {#3} }
            { 1000pt } { 0pt }
          }
      }
  }
\cs_new_protected:Npn \coffin_set_vertical_pole:Nnn #1#2#3
  {
    \__coffin_if_exist:NT #1
      {
        \__coffin_set_pole:Nnx #1 {#2}
          {
            { \dim_eval:n {#3} } { 0pt }
            { 0pt } { 1000pt }
          }
      }
  }
\cs_new_protected:Npn \__coffin_set_pole:Nnn #1#2#3
  { \prop_put:cnn { l__coffin_poles_ \__int_value:w #1 _prop } {#2} {#3} }
\cs_generate_variant:Nn \coffin_set_horizontal_pole:Nnn { c }
\cs_generate_variant:Nn \coffin_set_vertical_pole:Nnn { c }
\cs_generate_variant:Nn \__coffin_set_pole:Nnn { Nnx }
\cs_new_protected:Npn \__coffin_update_corners:N #1
  {
    \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } { tl }
      { { 0pt } { \dim_eval:n { \box_ht:N #1 } } }
    \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } { tr }
      { { \dim_eval:n { \box_wd:N #1 } } { \dim_eval:n { \box_ht:N #1 } } }
    \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } { bl }
      { { 0pt } { \dim_eval:n { -\box_dp:N #1 } } }
    \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } { br }
      { { \dim_eval:n { \box_wd:N #1 } } { \dim_eval:n { -\box_dp:N #1 } } }
  }
\cs_new_protected:Npn \__coffin_update_poles:N #1
  {
    \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } { hc }
      {
        { \dim_eval:n { 0.5 \box_wd:N #1 } }
        { 0pt } { 0pt } { 1000pt }
      }
    \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } { r }
      {
        { \dim_eval:n { \box_wd:N #1 } }
        { 0pt } { 0pt } { 1000pt }
      }
    \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } { vc }
      {
        { 0pt }
        { \dim_eval:n { ( \box_ht:N #1 - \box_dp:N #1 ) / 2 } }
        { 1000pt }
        { 0pt }
      }
    \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } { t }
      {
        { 0pt }
        { \dim_eval:n { \box_ht:N #1 } }
        { 1000pt }
        { 0pt }
      }
    \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } { b }
      {
        { 0pt }
        { \dim_eval:n { -\box_dp:N #1 } }
        { 1000pt }
        { 0pt }
      }
  }
\cs_new_protected:Npn \__coffin_calculate_intersection:Nnn #1#2#3
  {
    \__coffin_get_pole:NnN #1 {#2} \l__coffin_pole_a_tl
    \__coffin_get_pole:NnN #1 {#3} \l__coffin_pole_b_tl
    \bool_set_false:N \l__coffin_error_bool
    \exp_last_two_unbraced:Noo
      \__coffin_calculate_intersection:nnnnnnnn
        \l__coffin_pole_a_tl \l__coffin_pole_b_tl
    \bool_if:NT \l__coffin_error_bool
      {
        \__msg_kernel_error:nn { kernel } { no-pole-intersection }
        \dim_zero:N \l__coffin_x_dim
        \dim_zero:N \l__coffin_y_dim
      }
  }
\cs_new_protected:Npn \__coffin_calculate_intersection:nnnnnnnn
  #1#2#3#4#5#6#7#8
  {
    \dim_compare:nNnTF {#3} = { \c_zero_dim }
      {
        \dim_set:Nn \l__coffin_x_dim {#1}
        \dim_compare:nNnTF {#7} = \c_zero_dim
          { \bool_set_true:N \l__coffin_error_bool }
          {
            \dim_compare:nNnTF {#8} = \c_zero_dim
              { \dim_set:Nn \l__coffin_y_dim {#6} }
              {
                \__coffin_calculate_intersection_aux:nnnnnN
                  {#1} {#5} {#6} {#7} {#8} \l__coffin_y_dim
              }
          }
      }
      {
        \dim_compare:nNnTF {#4} = \c_zero_dim
          {
            \dim_set:Nn \l__coffin_y_dim {#2}
            \dim_compare:nNnTF {#8} = { \c_zero_dim }
              { \bool_set_true:N \l__coffin_error_bool }
              {
                \dim_compare:nNnTF {#7} = \c_zero_dim
                  { \dim_set:Nn \l__coffin_x_dim {#5} }
                  {
                    \__coffin_calculate_intersection_aux:nnnnnN
                      {#2} {#6} {#5} {#8} {#7} \l__coffin_x_dim
                  }
              }
          }
          {
            \dim_compare:nNnTF {#7} = \c_zero_dim
              {
                \dim_set:Nn \l__coffin_x_dim {#5}
                \__coffin_calculate_intersection_aux:nnnnnN
                  {#5} {#1} {#2} {#3} {#4} \l__coffin_y_dim
              }
              {
                \dim_compare:nNnTF {#8} = \c_zero_dim
                  {
                    \dim_set:Nn \l__coffin_y_dim {#6}
                    \__coffin_calculate_intersection_aux:nnnnnN
                      {#6} {#2} {#1} {#4} {#3} \l__coffin_x_dim
                  }
                  {
                    \fp_set:Nn \l__coffin_slope_x_fp
                      { \dim_to_fp:n {#4} / \dim_to_fp:n {#3} }
                    \fp_set:Nn \l__coffin_slope_y_fp
                      { \dim_to_fp:n {#8} / \dim_to_fp:n {#7} }
                    \fp_compare:nNnTF
                      \l__coffin_slope_x_fp = \l__coffin_slope_y_fp
                      { \bool_set_true:N \l__coffin_error_bool }
                      {
                        \dim_set:Nn \l__coffin_x_dim
                          {
                            \fp_to_dim:n
                              {
                                (
                                      \dim_to_fp:n {#1} * \l__coffin_slope_x_fp
                                  - ( \dim_to_fp:n {#5} * \l__coffin_slope_y_fp )
                                  -   \dim_to_fp:n {#2}
                                  +   \dim_to_fp:n {#6}
                                )
                                /
                                ( \l__coffin_slope_x_fp - \l__coffin_slope_y_fp )
                            }
                          }
                        \__coffin_calculate_intersection_aux:nnnnnN
                          { \l__coffin_x_dim }
                          {#5} {#6} {#8} {#7} \l__coffin_y_dim
                      }
                  }
              }
          }
      }
  }
\cs_new_protected:Npn \__coffin_calculate_intersection_aux:nnnnnN
    #1#2#3#4#5#6
  {
    \dim_set:Nn #6
      {
        \fp_to_dim:n
          {
            \dim_to_fp:n {#4} *
            ( \dim_to_fp:n {#1} - \dim_to_fp:n {#2} ) /
            \dim_to_fp:n {#5}
            + \dim_to_fp:n {#3}
          }
      }
  }
\cs_new_protected:Npn \coffin_join:NnnNnnnn #1#2#3#4#5#6#7#8
  {
    \__coffin_align:NnnNnnnnN
      #1 {#2} {#3} #4 {#5} {#6} {#7} {#8} \l__coffin_aligned_coffin
    \hbox_set:Nn \l__coffin_aligned_coffin
      {
        \dim_compare:nNnT { \l__coffin_offset_x_dim } < \c_zero_dim
          { \tex_kern:D -\l__coffin_offset_x_dim }
        \hbox_unpack:N \l__coffin_aligned_coffin
        \dim_set:Nn \l__coffin_internal_dim
          { \l__coffin_offset_x_dim - \box_wd:N #1 + \box_wd:N #4 }
        \dim_compare:nNnT \l__coffin_internal_dim < \c_zero_dim
          { \tex_kern:D -\l__coffin_internal_dim }
      }
   \__coffin_reset_structure:N \l__coffin_aligned_coffin
   \prop_clear:c
     { l__coffin_corners_ \__int_value:w \l__coffin_aligned_coffin _ prop }
   \__coffin_update_poles:N \l__coffin_aligned_coffin
    \dim_compare:nNnTF \l__coffin_offset_x_dim < \c_zero_dim
      {
        \__coffin_offset_poles:Nnn #1 { -\l__coffin_offset_x_dim } { 0pt }
        \__coffin_offset_poles:Nnn #4 { 0pt } { \l__coffin_offset_y_dim }
        \__coffin_offset_corners:Nnn #1 { -\l__coffin_offset_x_dim } { 0pt }
        \__coffin_offset_corners:Nnn #4 { 0pt } { \l__coffin_offset_y_dim }
      }
      {
        \__coffin_offset_poles:Nnn #1 { 0pt } { 0pt }
        \__coffin_offset_poles:Nnn #4
          { \l__coffin_offset_x_dim } { \l__coffin_offset_y_dim }
        \__coffin_offset_corners:Nnn #1 { 0pt } { 0pt }
        \__coffin_offset_corners:Nnn #4
          { \l__coffin_offset_x_dim } { \l__coffin_offset_y_dim }
      }
    \__coffin_update_vertical_poles:NNN #1 #4 \l__coffin_aligned_coffin
    \coffin_set_eq:NN #1 \l__coffin_aligned_coffin
  }
\cs_generate_variant:Nn \coffin_join:NnnNnnnn { c , Nnnc , cnnc }
\cs_new_protected:Npn \coffin_attach:NnnNnnnn #1#2#3#4#5#6#7#8
  {
    \__coffin_align:NnnNnnnnN
      #1 {#2} {#3} #4 {#5} {#6} {#7} {#8} \l__coffin_aligned_coffin
    \box_set_ht:Nn \l__coffin_aligned_coffin { \box_ht:N #1 }
    \box_set_dp:Nn \l__coffin_aligned_coffin { \box_dp:N #1 }
    \box_set_wd:Nn \l__coffin_aligned_coffin { \box_wd:N #1 }
    \__coffin_reset_structure:N \l__coffin_aligned_coffin
    \prop_set_eq:cc
      { l__coffin_corners_ \__int_value:w \l__coffin_aligned_coffin _prop }
      { l__coffin_corners_ \__int_value:w #1 _prop }
    \__coffin_update_poles:N  \l__coffin_aligned_coffin
    \__coffin_offset_poles:Nnn #1 { 0pt } { 0pt }
    \__coffin_offset_poles:Nnn #4
      { \l__coffin_offset_x_dim } { \l__coffin_offset_y_dim }
    \__coffin_update_vertical_poles:NNN #1 #4 \l__coffin_aligned_coffin
    \coffin_set_eq:NN #1 \l__coffin_aligned_coffin
  }
\cs_new_protected:Npn \coffin_attach_mark:NnnNnnnn #1#2#3#4#5#6#7#8
  {
    \__coffin_align:NnnNnnnnN
      #1 {#2} {#3} #4 {#5} {#6} {#7} {#8} \l__coffin_aligned_coffin
    \box_set_ht:Nn \l__coffin_aligned_coffin { \box_ht:N #1 }
    \box_set_dp:Nn \l__coffin_aligned_coffin { \box_dp:N #1 }
    \box_set_wd:Nn \l__coffin_aligned_coffin { \box_wd:N #1 }
    \box_set_eq:NN #1 \l__coffin_aligned_coffin
  }
\cs_generate_variant:Nn \coffin_attach:NnnNnnnn { c , Nnnc , cnnc }
\cs_new_protected:Npn \__coffin_align:NnnNnnnnN #1#2#3#4#5#6#7#8#9
  {
    \__coffin_calculate_intersection:Nnn #4 {#5} {#6}
    \dim_set:Nn \l__coffin_x_prime_dim { \l__coffin_x_dim }
    \dim_set:Nn \l__coffin_y_prime_dim { \l__coffin_y_dim }
    \__coffin_calculate_intersection:Nnn #1 {#2} {#3}
    \dim_set:Nn \l__coffin_offset_x_dim
      { \l__coffin_x_dim - \l__coffin_x_prime_dim + #7 }
    \dim_set:Nn \l__coffin_offset_y_dim
      { \l__coffin_y_dim - \l__coffin_y_prime_dim + #8 }
    \hbox_set:Nn \l__coffin_aligned_internal_coffin
      {
        \box_use:N #1
        \tex_kern:D -\box_wd:N #1
        \tex_kern:D \l__coffin_offset_x_dim
        \box_move_up:nn { \l__coffin_offset_y_dim } { \box_use:N #4 }
      }
    \coffin_set_eq:NN #9 \l__coffin_aligned_internal_coffin
  }
\cs_new_protected:Npn \__coffin_offset_poles:Nnn #1#2#3
  {
    \prop_map_inline:cn { l__coffin_poles_ \__int_value:w #1 _prop }
      { \__coffin_offset_pole:Nnnnnnn #1 {##1} ##2 {#2} {#3} }
  }
\cs_new_protected:Npn \__coffin_offset_pole:Nnnnnnn #1#2#3#4#5#6#7#8
  {
    \dim_set:Nn \l__coffin_x_dim { #3 + #7 }
    \dim_set:Nn \l__coffin_y_dim { #4 + #8 }
    \tl_if_in:nnTF {#2} { - }
      { \tl_set:Nn \l__coffin_internal_tl { {#2} } }
      { \tl_set:Nn \l__coffin_internal_tl { { #1 - #2 } } }
    \exp_last_unbraced:NNo \__coffin_set_pole:Nnx \l__coffin_aligned_coffin
      { \l__coffin_internal_tl }
      {
        { \dim_use:N \l__coffin_x_dim } { \dim_use:N \l__coffin_y_dim }
        {#5} {#6}
      }
  }
\cs_new_protected:Npn \__coffin_offset_corners:Nnn #1#2#3
  {
    \prop_map_inline:cn { l__coffin_corners_ \__int_value:w #1 _prop }
      { \__coffin_offset_corner:Nnnnn #1 {##1} ##2 {#2} {#3} }
  }
\cs_new_protected:Npn \__coffin_offset_corner:Nnnnn #1#2#3#4#5#6
  {
    \prop_put:cnx
      { l__coffin_corners_ \__int_value:w \l__coffin_aligned_coffin _prop }
      { #1 - #2 }
      {
        { \dim_eval:n { #3 + #5 } }
        { \dim_eval:n { #4 + #6 } }
      }
  }
\cs_new_protected:Npn \__coffin_update_vertical_poles:NNN #1#2#3
  {
    \__coffin_get_pole:NnN #3 { #1 -T } \l__coffin_pole_a_tl
    \__coffin_get_pole:NnN #3 { #2 -T } \l__coffin_pole_b_tl
    \exp_last_two_unbraced:Noo \__coffin_update_T:nnnnnnnnN
      \l__coffin_pole_a_tl \l__coffin_pole_b_tl #3
    \__coffin_get_pole:NnN #3 { #1 -B } \l__coffin_pole_a_tl
    \__coffin_get_pole:NnN #3 { #2 -B } \l__coffin_pole_b_tl
    \exp_last_two_unbraced:Noo \__coffin_update_B:nnnnnnnnN
      \l__coffin_pole_a_tl \l__coffin_pole_b_tl #3
  }
\cs_new_protected:Npn \__coffin_update_T:nnnnnnnnN #1#2#3#4#5#6#7#8#9
  {
    \dim_compare:nNnTF {#2} < {#6}
      {
        \__coffin_set_pole:Nnx #9 { T }
          { { 0pt } {#6} { 1000pt } { 0pt } }
      }
      {
        \__coffin_set_pole:Nnx #9 { T }
          { { 0pt } {#2} { 1000pt } { 0pt } }
      }
  }
\cs_new_protected:Npn \__coffin_update_B:nnnnnnnnN #1#2#3#4#5#6#7#8#9
  {
    \dim_compare:nNnTF {#2} < {#6}
      {
        \__coffin_set_pole:Nnx #9 { B }
          { { 0pt } {#2}  { 1000pt } { 0pt } }
      }
      {
        \__coffin_set_pole:Nnx #9 { B }
          { { 0pt } {#6} { 1000pt } { 0pt } }
      }
  }
\cs_new_protected:Npn \coffin_typeset:Nnnnn #1#2#3#4#5
  {
    \hbox_unpack:N \c_empty_box
    \__coffin_align:NnnNnnnnN \c_empty_coffin { H } { l }
      #1 {#2} {#3} {#4} {#5} \l__coffin_aligned_coffin
    \box_use:N \l__coffin_aligned_coffin
  }
\cs_generate_variant:Nn \coffin_typeset:Nnnnn { c }
\coffin_new:N \l__coffin_display_coffin
\coffin_new:N \l__coffin_display_coord_coffin
\coffin_new:N \l__coffin_display_pole_coffin
\prop_new:N \l__coffin_display_handles_prop
\prop_put:Nnn \l__coffin_display_handles_prop { tl }
  { { b } { r } { -1 } { 1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { thc }
  { { b } { hc } { 0 } { 1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { tr }
  { { b } { l } { 1 } { 1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { vcl }
  { { vc } { r } { -1 } { 0 } }
\prop_put:Nnn \l__coffin_display_handles_prop { vchc }
  { { vc } { hc } { 0 } { 0 } }
\prop_put:Nnn \l__coffin_display_handles_prop { vcr }
  { { vc } { l } { 1 } { 0 } }
\prop_put:Nnn \l__coffin_display_handles_prop { bl }
  { { t } { r } { -1 } { -1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { bhc }
  { { t } { hc } { 0 } { -1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { br }
  { { t } { l } { 1 } { -1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { Tl }
  { { t } { r } { -1 } { -1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { Thc }
  { { t } { hc } { 0 } { -1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { Tr }
  { { t } { l } { 1 } { -1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { Hl }
  { { vc } { r } { -1 } { 1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { Hhc }
  { { vc } { hc } { 0 } { 1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { Hr }
  { { vc } { l } { 1 } { 1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { Bl }
  { { b } { r } { -1 } { -1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { Bhc }
  { { b } { hc } { 0 } { -1 } }
\prop_put:Nnn \l__coffin_display_handles_prop { Br }
  { { b } { l } { 1 } { -1 } }
\dim_new:N  \l__coffin_display_offset_dim
\dim_set:Nn \l__coffin_display_offset_dim { 2pt }
\dim_new:N \l__coffin_display_x_dim
\dim_new:N \l__coffin_display_y_dim
\prop_new:N \l__coffin_display_poles_prop
\tl_new:N  \l__coffin_display_font_tl
\tl_set:Nn \l__coffin_display_font_tl { \sffamily \tiny }
\cs_new_protected:Npn \coffin_mark_handle:Nnnn #1#2#3#4
  {
    \hcoffin_set:Nn \l__coffin_display_pole_coffin
      {
        \color {#4}
        \rule { 1pt } { 1pt }
      }
    \coffin_attach_mark:NnnNnnnn #1 {#2} {#3}
      \l__coffin_display_pole_coffin { hc } { vc } { 0pt } { 0pt }
    \hcoffin_set:Nn \l__coffin_display_coord_coffin
      {
        \color {#4}
        \l__coffin_display_font_tl
        ( \tl_to_str:n { #2 , #3 } )
      }
    \prop_get:NnN \l__coffin_display_handles_prop
      { #2 #3 } \l__coffin_internal_tl
    \quark_if_no_value:NTF \l__coffin_internal_tl
      {
        \prop_get:NnN \l__coffin_display_handles_prop
          { #3 #2 } \l__coffin_internal_tl
        \quark_if_no_value:NTF \l__coffin_internal_tl
          {
            \coffin_attach_mark:NnnNnnnn #1 {#2} {#3}
              \l__coffin_display_coord_coffin { l } { vc }
                { 1pt } { 0pt }
          }
          {
            \exp_last_unbraced:No \__coffin_mark_handle_aux:nnnnNnn
              \l__coffin_internal_tl #1 {#2} {#3}
          }
      }
      {
        \exp_last_unbraced:No \__coffin_mark_handle_aux:nnnnNnn
          \l__coffin_internal_tl #1 {#2} {#3}
      }
  }
\cs_new_protected:Npn \__coffin_mark_handle_aux:nnnnNnn #1#2#3#4#5#6#7
  {
    \coffin_attach_mark:NnnNnnnn #5 {#6} {#7}
      \l__coffin_display_coord_coffin {#1} {#2}
      { #3 \l__coffin_display_offset_dim }
      { #4 \l__coffin_display_offset_dim }
  }
\cs_generate_variant:Nn \coffin_mark_handle:Nnnn { c }
\cs_new_protected:Npn \coffin_display_handles:Nn #1#2
  {
    \hcoffin_set:Nn \l__coffin_display_pole_coffin
      {
        \color {#2}
        \rule { 1pt } { 1pt }
      }
    \prop_set_eq:Nc \l__coffin_display_poles_prop
      { l__coffin_poles_ \__int_value:w #1 _prop }
    \__coffin_get_pole:NnN #1 { H } \l__coffin_pole_a_tl
    \__coffin_get_pole:NnN #1 { T } \l__coffin_pole_b_tl
    \tl_if_eq:NNT \l__coffin_pole_a_tl \l__coffin_pole_b_tl
      { \prop_remove:Nn \l__coffin_display_poles_prop { T } }
    \__coffin_get_pole:NnN #1 { B } \l__coffin_pole_b_tl
    \tl_if_eq:NNT \l__coffin_pole_a_tl \l__coffin_pole_b_tl
      { \prop_remove:Nn \l__coffin_display_poles_prop { B } }
    \coffin_set_eq:NN \l__coffin_display_coffin #1
    \prop_map_inline:Nn \l__coffin_display_poles_prop
      {
        \prop_remove:Nn \l__coffin_display_poles_prop {##1}
        \__coffin_display_handles_aux:nnnnnn {##1} ##2 {#2}
      }
    \box_use:N \l__coffin_display_coffin
  }
\cs_new_protected:Npn \__coffin_display_handles_aux:nnnnnn #1#2#3#4#5#6
  {
    \prop_map_inline:Nn \l__coffin_display_poles_prop
      {
        \bool_set_false:N \l__coffin_error_bool
        \__coffin_calculate_intersection:nnnnnnnn {#2} {#3} {#4} {#5} ##2
        \bool_if:NF \l__coffin_error_bool
          {
            \dim_set:Nn \l__coffin_display_x_dim { \l__coffin_x_dim }
            \dim_set:Nn \l__coffin_display_y_dim { \l__coffin_y_dim }
            \__coffin_display_attach:Nnnnn
              \l__coffin_display_pole_coffin { hc } { vc }
              { 0pt } { 0pt }
            \hcoffin_set:Nn \l__coffin_display_coord_coffin
              {
                \color {#6}
                \l__coffin_display_font_tl
                ( \tl_to_str:n { #1 , ##1 } )
              }
            \prop_get:NnN \l__coffin_display_handles_prop
              { #1 ##1 } \l__coffin_internal_tl
            \quark_if_no_value:NTF \l__coffin_internal_tl
              {
                \prop_get:NnN \l__coffin_display_handles_prop
                  { ##1 #1 } \l__coffin_internal_tl
                \quark_if_no_value:NTF \l__coffin_internal_tl
                  {
                    \__coffin_display_attach:Nnnnn
                      \l__coffin_display_coord_coffin { l } { vc }
                      { 1pt } { 0pt }
                  }
                  {
                    \exp_last_unbraced:No
                      \__coffin_display_handles_aux:nnnn
                      \l__coffin_internal_tl
                  }
              }
              {
                \exp_last_unbraced:No \__coffin_display_handles_aux:nnnn
                  \l__coffin_internal_tl
              }
          }
      }
  }
\cs_new_protected:Npn \__coffin_display_handles_aux:nnnn #1#2#3#4
  {
    \__coffin_display_attach:Nnnnn
      \l__coffin_display_coord_coffin {#1} {#2}
      { #3 \l__coffin_display_offset_dim }
      { #4 \l__coffin_display_offset_dim }
  }
\cs_generate_variant:Nn \coffin_display_handles:Nn { c }
\cs_new_protected:Npn \__coffin_display_attach:Nnnnn #1#2#3#4#5
  {
    \__coffin_calculate_intersection:Nnn #1 {#2} {#3}
    \dim_set:Nn \l__coffin_x_prime_dim { \l__coffin_x_dim }
    \dim_set:Nn \l__coffin_y_prime_dim { \l__coffin_y_dim }
    \dim_set:Nn \l__coffin_offset_x_dim
      { \l__coffin_display_x_dim - \l__coffin_x_prime_dim + #4 }
    \dim_set:Nn \l__coffin_offset_y_dim
      { \l__coffin_display_y_dim - \l__coffin_y_prime_dim + #5 }
    \hbox_set:Nn \l__coffin_aligned_coffin
      {
        \box_use:N \l__coffin_display_coffin
        \tex_kern:D -\box_wd:N \l__coffin_display_coffin
        \tex_kern:D \l__coffin_offset_x_dim
        \box_move_up:nn { \l__coffin_offset_y_dim } { \box_use:N #1 }
      }
    \box_set_ht:Nn \l__coffin_aligned_coffin
      { \box_ht:N \l__coffin_display_coffin }
    \box_set_dp:Nn \l__coffin_aligned_coffin
      { \box_dp:N \l__coffin_display_coffin }
    \box_set_wd:Nn \l__coffin_aligned_coffin
      { \box_wd:N \l__coffin_display_coffin }
    \box_set_eq:NN \l__coffin_display_coffin \l__coffin_aligned_coffin
  }
\cs_new_protected:Npn \coffin_show_structure:N #1
  {
    \__coffin_if_exist:NT #1
      {
        \__msg_show_pre:nnxxxx { LaTeX / kernel } { show-coffin }
          { \token_to_str:N #1 }
          { \dim_eval:n { \coffin_ht:N #1 } }
          { \dim_eval:n { \coffin_dp:N #1 } }
          { \dim_eval:n { \coffin_wd:N #1 } }
        \__msg_show_wrap:n
          {
            \prop_map_function:cN
              { l__coffin_poles_ \__int_value:w #1 _prop }
              \__msg_show_item_unbraced:nn
          }
      }
  }
\cs_generate_variant:Nn \coffin_show_structure:N { c }
\cs_new_protected:Npn \coffin_log_structure:N
  { \__msg_log_next: \coffin_show_structure:N }
\cs_generate_variant:Nn \coffin_log_structure:N { c }
\__msg_kernel_new:nnnn { kernel } { no-pole-intersection }
  { No~intersection~between~coffin~poles. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~was~asked~to~find~the~intersection~between~two~poles,~
    but~they~do~not~have~a~unique~meeting~point:~
    the~value~(0~pt,~0~pt)~will~be~used.
  }
\__msg_kernel_new:nnnn { kernel } { unknown-coffin }
  { Unknown~coffin~'#1'. }
  { The~coffin~'#1'~was~never~defined. }
\__msg_kernel_new:nnnn { kernel } { unknown-coffin-pole }
  { Pole~'#1'~unknown~for~coffin~'#2'. }
  {
    \c__msg_coding_error_text_tl
    LaTeX~was~asked~to~find~a~typesetting~pole~for~a~coffin,~
    but~either~the~coffin~does~not~exist~or~the~pole~name~is~wrong.
  }
\__msg_kernel_new:nnn { kernel } { show-coffin }
  {
    Size~of~coffin~#1 : \\
    > ~ ht~=~#2 \\
    > ~ dp~=~#3 \\
    > ~ wd~=~#4 \\
    Poles~of~coffin~#1 :
  }
%% File: l3color.dtx Copyright(C) 2011,2012,2014,2016,2017 The LaTeX3 Project
\cs_new_eq:NN \color_group_begin: \group_begin:
\cs_new_protected:Npn \color_group_end:
  {
      \par
    \group_end:
  }
\cs_new_protected:Npn \color_ensure_current:
  { \__driver_color_ensure_current: }
%% File: l3sys.dtx Copyright (C) 2015-2017 The LaTeX3 Project
\str_const:Nx \c_sys_jobname_str { \tex_jobname:D }
\int_const:Nn \c_sys_minute_int
  { \int_mod:nn { \tex_time:D } { 60 } }
\int_const:Nn \c_sys_hour_int
  { \int_div_truncate:nn { \tex_time:D } { 60 } }
\int_const:Nn \c_sys_day_int   { \tex_day:D }
\int_const:Nn \c_sys_month_int { \tex_month:D }
\int_const:Nn \c_sys_year_int  { \tex_year:D }
\clist_map_inline:nn { lua , pdf , p , up , xe }
  {
    \cs_new_eq:cN { sys_if_engine_ #1 tex:T }  \use_none:n
    \cs_new_eq:cN { sys_if_engine_ #1 tex:F }  \use:n
    \cs_new_eq:cN { sys_if_engine_ #1 tex:TF } \use_ii:nn
    \cs_new_eq:cN { sys_if_engine_ #1 tex_p: } \c_false_bool
  }
\cs_if_exist:NT \luatex_luatexversion:D
  {
    \cs_gset_eq:NN \sys_if_engine_luatex:T  \use:n
    \cs_gset_eq:NN \sys_if_engine_luatex:F  \use_none:n
    \cs_gset_eq:NN \sys_if_engine_luatex:TF \use_i:nn
    \cs_gset_eq:NN \sys_if_engine_luatex_p: \c_true_bool
    \str_const:Nn \c_sys_engine_str { luatex }
  }
\cs_if_exist:NT \pdftex_pdftexversion:D
  {
    \cs_gset_eq:NN \sys_if_engine_pdftex:T  \use:n
    \cs_gset_eq:NN \sys_if_engine_pdftex:F  \use_none:n
    \cs_gset_eq:NN \sys_if_engine_pdftex:TF \use_i:nn
    \cs_gset_eq:NN \sys_if_engine_pdftex_p: \c_true_bool
    \str_const:Nn \c_sys_engine_str { pdftex }
  }
\cs_if_exist:NT \ptex_kanjiskip:D
  {
    \bool_lazy_and:nnTF
      { \cs_if_exist_p:N \uptex_disablecjktoken:D }
      { \int_compare_p:nNn { \ptex_jis:D "2121 } = { "3000 } }
      {
        \cs_gset_eq:NN \sys_if_engine_uptex:T  \use:n
        \cs_gset_eq:NN \sys_if_engine_uptex:F  \use_none:n
        \cs_gset_eq:NN \sys_if_engine_uptex:TF \use_i:nn
        \cs_gset_eq:NN \sys_if_engine_uptex_p: \c_true_bool
        \str_const:Nn \c_sys_engine_str { uptex }
      }
      {
        \cs_gset_eq:NN \sys_if_engine_ptex:T  \use:n
        \cs_gset_eq:NN \sys_if_engine_ptex:F  \use_none:n
        \cs_gset_eq:NN \sys_if_engine_ptex:TF \use_i:nn
        \cs_gset_eq:NN \sys_if_engine_ptex_p: \c_true_bool
        \str_const:Nn \c_sys_engine_str { ptex }
      }
  }
\cs_if_exist:NT \xetex_XeTeXversion:D
  {
    \cs_gset_eq:NN \sys_if_engine_xetex:T  \use:n
    \cs_gset_eq:NN \sys_if_engine_xetex:F  \use_none:n
    \cs_gset_eq:NN \sys_if_engine_xetex:TF \use_i:nn
    \cs_gset_eq:NN \sys_if_engine_xetex_p: \c_true_bool
    \str_const:Nn \c_sys_engine_str { xetex }
  }
\int_compare:nNnTF
  { \cs_if_exist_use:NF \pdftex_pdfoutput:D { 0 } } > { 0 }
  {
    \cs_new_eq:NN \sys_if_output_dvi:T  \use_none:n
    \cs_new_eq:NN \sys_if_output_dvi:F  \use:n
    \cs_new_eq:NN \sys_if_output_dvi:TF \use_ii:nn
    \cs_new_eq:NN \sys_if_output_dvi_p: \c_false_bool
    \cs_new_eq:NN \sys_if_output_pdf:T  \use:n
    \cs_new_eq:NN \sys_if_output_pdf:F  \use_none:n
    \cs_new_eq:NN \sys_if_output_pdf:TF \use_i:nn
    \cs_new_eq:NN \sys_if_output_pdf_p: \c_true_bool
    \str_const:Nn \c_sys_output_str { pdf }
  }
  {
    \cs_new_eq:NN \sys_if_output_dvi:T  \use:n
    \cs_new_eq:NN \sys_if_output_dvi:F  \use_none:n
    \cs_new_eq:NN \sys_if_output_dvi:TF \use_i:nn
    \cs_new_eq:NN \sys_if_output_dvi_p: \c_true_bool
    \cs_new_eq:NN \sys_if_output_pdf:T  \use_none:n
    \cs_new_eq:NN \sys_if_output_pdf:F  \use:n
    \cs_new_eq:NN \sys_if_output_pdf:TF \use_ii:nn
    \cs_new_eq:NN \sys_if_output_pdf_p: \c_false_bool
    \str_const:Nn \c_sys_output_str { dvi }
  }
%% File: l3deprecation.dtx (C) Copyright 2017 The LaTeX3 Project
\cs_new_protected:Npn \__deprecation_error:Nnn #1#2#3
  {
    \etex_protected:D \tex_outer:D \tex_edef:D #1
      {
        \exp_not:N \__msg_kernel_expandable_error:nnnnn
          { kernel } { deprecated-command }
          { \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} }
        \exp_not:N \__msg_kernel_error:nnxxx
          { kernel } { deprecated-command }
          { \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} }
      }
  }
\__deprecation_error:Nnn \c_job_name_tl { \c_sys_jobname_str } { 2017-01-01 }
\__deprecation_error:Nnn \dim_case:nnn { \dim_case:nnF } { 2015-07-14 }
\__deprecation_error:Nnn \int_case:nnn { \int_case:nnF } { 2015-07-14 }
\__deprecation_error:Nnn \int_from_binary:n { \int_from_bin:n } { 2016-01-05 }
\__deprecation_error:Nnn \int_from_hexadecimal:n { \int_from_hex:n } { 2016-01-05 }
\__deprecation_error:Nnn \int_from_octal:n { \int_from_oct:n } { 2016-01-05 }
\__deprecation_error:Nnn \int_to_binary:n { \int_to_bin:n } { 2016-01-05 }
\__deprecation_error:Nnn \int_to_hexadecimal:n { \int_to_hex:n } { 2016-01-05 }
\__deprecation_error:Nnn \int_to_octal:n { \int_to_oct:n } { 2016-01-05 }
\__deprecation_error:Nnn \luatex_if_engine_p: { \sys_if_engine_luatex_p: } { 2017-01-01 }
\__deprecation_error:Nnn \luatex_if_engine:F { \sys_if_engine_luatex:F } { 2017-01-01 }
\__deprecation_error:Nnn \luatex_if_engine:T { \sys_if_engine_luatex:T } { 2017-01-01 }
\__deprecation_error:Nnn \luatex_if_engine:TF { \sys_if_engine_luatex:TF } { 2017-01-01 }
\__deprecation_error:Nnn \pdftex_if_engine_p: { \sys_if_engine_pdftex_p: } { 2017-01-01 }
\__deprecation_error:Nnn \pdftex_if_engine:F { \sys_if_engine_pdftex:F } { 2017-01-01 }
\__deprecation_error:Nnn \pdftex_if_engine:T { \sys_if_engine_pdftex:T } { 2017-01-01 }
\__deprecation_error:Nnn \pdftex_if_engine:TF { \sys_if_engine_pdftex:TF } { 2017-01-01 }
\__deprecation_error:Nnn \prop_get:cn { \prop_item:cn } { 2016-01-05 }
\__deprecation_error:Nnn \prop_get:Nn { \prop_item:Nn } { 2016-01-05 }
\__deprecation_error:Nnn \quark_if_recursion_tail_break:N { } { 2015-07-14 }
\__deprecation_error:Nnn \quark_if_recursion_tail_break:n { }{ 2015-07-14 }
\__deprecation_error:Nnn \scan_align_safe_stop: { protected~commands } { 2017-01-01 }
\__deprecation_error:Nnn \str_case:nnn { \str_case:nnF } { 2015-07-14 }
\__deprecation_error:Nnn \str_case:onn { \str_case:onF } { 2015-07-14 }
\__deprecation_error:Nnn \str_case_x:nnn { \str_case_x:nnF } { 2015-07-14 }
\__deprecation_error:Nnn \tl_case:cnn { \tl_case:cnF } { 2015-07-14 }
\__deprecation_error:Nnn \tl_case:Nnn { \tl_case:NnF } { 2015-07-14 }
\__deprecation_error:Nnn \xetex_if_engine_p: { \sys_if_engine_xetex_p: } { 2017-01-01 }
\__deprecation_error:Nnn \xetex_if_engine:F { \sys_if_engine_xetex:F } { 2017-01-01 }
\__deprecation_error:Nnn \xetex_if_engine:T { \sys_if_engine_xetex:T } { 2017-01-01 }
\__deprecation_error:Nnn \xetex_if_engine:TF { \sys_if_engine_xetex:TF } { 2017-01-01 }
\cs_new_protected:Npn \deprecation_error:
  {
    \__deprecation_error:Nnn \tl_to_lowercase:n { } { 2017-12-31 }
    \__deprecation_error:Nnn \tl_to_uppercase:n { } { 2017-12-31 }
    \__deprecation_error:Nnn \ior_get_str:NN { \ior_str_get:NN } { 2017-12-31 }
    \__deprecation_error:Nnn \box_resize:Nnn { \box_resize_to_wd_and_ht_plus_dp:Nnn } { 2018-12-31 }
    \__deprecation_error:Nnn \box_resize:cnn { \box_resize_to_wd_and_ht_plus_dp:cnn } { 2018-12-31 }
    \__deprecation_error:Nnn \c_minus_one { - 1 } { 2018-12-31 }
    \__deprecation_error:Nnn \sort_ordered: { \sort_return_same: } { 2018-12-31 }
    \__deprecation_error:Nnn \sort_reversed: { \sort_return_swapped: } { 2018-12-31 }
    \cs_set_eq:NN \__fp_parse_round:Nw \__fp_parse_round_deprecation_error:Nw
    \cs_set_eq:NN \deprecation_error: \scan_stop:
  }
%% File: l3candidates.dtx Copyright (C) 2012-2017 The LaTeX3 Project
\cs_new_protected:Npn \box_clip:N #1
  { \hbox_set:Nn #1 { \__driver_box_use_clip:N #1 } }
\cs_generate_variant:Nn \box_clip:N { c }
\cs_new_protected:Npn \box_trim:Nnnnn #1#2#3#4#5
  {
    \hbox_set:Nn \l__box_internal_box
      {
        \tex_kern:D -\__dim_eval:w #2 \__dim_eval_end:
        \box_use:N #1
        \tex_kern:D -\__dim_eval:w #4 \__dim_eval_end:
      }
    \dim_compare:nNnTF { \box_dp:N #1 } > {#3}
      {
        \hbox_set:Nn \l__box_internal_box
          {
            \box_move_down:nn \c_zero_dim
              { \box_use:N \l__box_internal_box }
          }
        \box_set_dp:Nn \l__box_internal_box { \box_dp:N #1 - (#3) }
      }
      {
        \hbox_set:Nn \l__box_internal_box
          {
            \box_move_down:nn { #3 - \box_dp:N #1 }
              { \box_use:N \l__box_internal_box }
          }
        \box_set_dp:Nn \l__box_internal_box \c_zero_dim
      }
    \dim_compare:nNnTF { \box_ht:N \l__box_internal_box } > {#5}
      {
        \hbox_set:Nn \l__box_internal_box
          {
            \box_move_up:nn \c_zero_dim
              { \box_use:N \l__box_internal_box }
          }
        \box_set_ht:Nn \l__box_internal_box
          { \box_ht:N \l__box_internal_box - (#5) }
      }
      {
        \hbox_set:Nn \l__box_internal_box
          {
            \box_move_up:nn { #5 - \box_ht:N \l__box_internal_box }
              { \box_use:N \l__box_internal_box }
          }
        \box_set_ht:Nn \l__box_internal_box \c_zero_dim
      }
    \box_set_eq:NN #1 \l__box_internal_box
  }
\cs_generate_variant:Nn \box_trim:Nnnnn { c }
\cs_new_protected:Npn \box_viewport:Nnnnn #1#2#3#4#5
  {
    \hbox_set:Nn \l__box_internal_box
      {
        \tex_kern:D -\__dim_eval:w #2 \__dim_eval_end:
        \box_use:N #1
        \tex_kern:D \__dim_eval:w #4 - \box_wd:N #1 \__dim_eval_end:
      }
    \dim_compare:nNnTF {#3} < \c_zero_dim
      {
        \hbox_set:Nn \l__box_internal_box
          {
            \box_move_down:nn \c_zero_dim
              { \box_use:N \l__box_internal_box }
          }
        \box_set_dp:Nn \l__box_internal_box { -\dim_eval:n {#3} }
      }
      {
        \hbox_set:Nn \l__box_internal_box
          { \box_move_down:nn {#3} { \box_use:N \l__box_internal_box } }
        \box_set_dp:Nn \l__box_internal_box \c_zero_dim
      }
    \dim_compare:nNnTF {#5} > \c_zero_dim
      {
        \hbox_set:Nn \l__box_internal_box
          {
            \box_move_up:nn \c_zero_dim
              { \box_use:N \l__box_internal_box }
          }
        \box_set_ht:Nn \l__box_internal_box
          {
            #5
            \dim_compare:nNnT {#3} > \c_zero_dim
              { - (#3) }
          }
      }
      {
        \hbox_set:Nn \l__box_internal_box
          {
            \box_move_up:nn { -\dim_eval:n {#5} }
              { \box_use:N \l__box_internal_box }
          }
        \box_set_ht:Nn \l__box_internal_box \c_zero_dim
      }
    \box_set_eq:NN #1 \l__box_internal_box
  }
\cs_generate_variant:Nn \box_viewport:Nnnnn { c }
\cs_new:Npn \clist_rand_item:n #1
  { \exp_args:Nf \__clist_rand_item:nn { \clist_count:n {#1} } {#1} }
\cs_new:Npn \__clist_rand_item:nn #1#2
  {
    \int_compare:nNnF {#1} = 0
      { \clist_item:nn {#2} { \int_rand:nn { 1 } {#1} } }
  }
\cs_new:Npn \clist_rand_item:N #1
  {
    \clist_if_empty:NF #1
      { \clist_item:Nn #1 { \int_rand:nn { 1 } { \clist_count:N #1 } } }
  }
\cs_generate_variant:Nn \clist_rand_item:N { c }
\fp_new:N \l__coffin_sin_fp
\fp_new:N \l__coffin_cos_fp
\prop_new:N \l__coffin_bounding_prop
\dim_new:N \l__coffin_bounding_shift_dim
\dim_new:N \l__coffin_left_corner_dim
\dim_new:N \l__coffin_right_corner_dim
\dim_new:N \l__coffin_bottom_corner_dim
\dim_new:N \l__coffin_top_corner_dim
\cs_new_protected:Npn \coffin_rotate:Nn #1#2
  {
    \fp_set:Nn \l__coffin_sin_fp { sind ( #2 ) }
    \fp_set:Nn \l__coffin_cos_fp { cosd ( #2 ) }
    \prop_map_inline:cn { l__coffin_corners_ \__int_value:w #1 _prop }
      { \__coffin_rotate_corner:Nnnn #1 {##1} ##2 }
    \prop_map_inline:cn { l__coffin_poles_ \__int_value:w #1 _prop }
      { \__coffin_rotate_pole:Nnnnnn #1 {##1} ##2 }
    \__coffin_set_bounding:N #1
    \prop_map_inline:Nn \l__coffin_bounding_prop
      { \__coffin_rotate_bounding:nnn {##1} ##2 }
    \__coffin_find_corner_maxima:N #1
    \__coffin_find_bounding_shift:
    \box_rotate:Nn #1 {#2}
    \hbox_set:Nn \l__coffin_internal_box
      {
        \tex_kern:D
          \__dim_eval:w
            \l__coffin_bounding_shift_dim - \l__coffin_left_corner_dim
          \__dim_eval_end:
        \box_move_down:nn { \l__coffin_bottom_corner_dim }
          { \box_use:N #1 }
      }
    \box_set_ht:Nn \l__coffin_internal_box
      { \l__coffin_top_corner_dim - \l__coffin_bottom_corner_dim }
    \box_set_dp:Nn \l__coffin_internal_box { 0 pt }
    \box_set_wd:Nn \l__coffin_internal_box
      { \l__coffin_right_corner_dim - \l__coffin_left_corner_dim }
    \hbox_set:Nn #1 { \box_use:N \l__coffin_internal_box }
    \prop_map_inline:cn { l__coffin_corners_ \__int_value:w #1 _prop }
      { \__coffin_shift_corner:Nnnn #1 {##1} ##2 }
    \prop_map_inline:cn { l__coffin_poles_ \__int_value:w #1 _prop }
      { \__coffin_shift_pole:Nnnnnn #1 {##1} ##2 }
  }
\cs_generate_variant:Nn \coffin_rotate:Nn { c }
\cs_new_protected:Npn \__coffin_set_bounding:N #1
  {
    \prop_put:Nnx \l__coffin_bounding_prop { tl }
      { { 0 pt } { \dim_eval:n { \box_ht:N #1 } } }
    \prop_put:Nnx \l__coffin_bounding_prop { tr }
      { { \dim_eval:n { \box_wd:N #1 } } { \dim_eval:n { \box_ht:N #1 } } }
    \dim_set:Nn \l__coffin_internal_dim { -\box_dp:N #1 }
    \prop_put:Nnx \l__coffin_bounding_prop { bl }
      { { 0 pt } { \dim_use:N \l__coffin_internal_dim } }
    \prop_put:Nnx \l__coffin_bounding_prop { br }
      { { \dim_eval:n { \box_wd:N #1 } } { \dim_use:N \l__coffin_internal_dim } }
  }
\cs_new_protected:Npn \__coffin_rotate_bounding:nnn #1#2#3
  {
    \__coffin_rotate_vector:nnNN {#2} {#3} \l__coffin_x_dim \l__coffin_y_dim
    \prop_put:Nnx \l__coffin_bounding_prop {#1}
      { { \dim_use:N \l__coffin_x_dim } { \dim_use:N \l__coffin_y_dim } }
  }
\cs_new_protected:Npn \__coffin_rotate_corner:Nnnn #1#2#3#4
  {
    \__coffin_rotate_vector:nnNN {#3} {#4} \l__coffin_x_dim \l__coffin_y_dim
    \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } {#2}
      { { \dim_use:N \l__coffin_x_dim } { \dim_use:N \l__coffin_y_dim } }
  }
\cs_new_protected:Npn \__coffin_rotate_pole:Nnnnnn #1#2#3#4#5#6
  {
    \__coffin_rotate_vector:nnNN {#3} {#4} \l__coffin_x_dim \l__coffin_y_dim
    \__coffin_rotate_vector:nnNN {#5} {#6}
      \l__coffin_x_prime_dim \l__coffin_y_prime_dim
    \__coffin_set_pole:Nnx #1 {#2}
      {
        { \dim_use:N \l__coffin_x_dim } { \dim_use:N \l__coffin_y_dim }
        { \dim_use:N \l__coffin_x_prime_dim }
        { \dim_use:N \l__coffin_y_prime_dim }
      }
  }
\cs_new_protected:Npn \__coffin_rotate_vector:nnNN #1#2#3#4
  {
    \dim_set:Nn #3
      {
        \fp_to_dim:n
          {
              \dim_to_fp:n {#1} * \l__coffin_cos_fp
            - \dim_to_fp:n {#2} * \l__coffin_sin_fp
          }
      }
    \dim_set:Nn #4
      {
        \fp_to_dim:n
          {
              \dim_to_fp:n {#1} * \l__coffin_sin_fp
            + \dim_to_fp:n {#2} * \l__coffin_cos_fp
          }
      }
  }
\cs_new_protected:Npn \__coffin_find_corner_maxima:N #1
  {
    \dim_set:Nn \l__coffin_top_corner_dim   { -\c_max_dim }
    \dim_set:Nn \l__coffin_right_corner_dim { -\c_max_dim }
    \dim_set:Nn \l__coffin_bottom_corner_dim { \c_max_dim }
    \dim_set:Nn \l__coffin_left_corner_dim   { \c_max_dim }
    \prop_map_inline:cn { l__coffin_corners_ \__int_value:w #1 _prop }
      { \__coffin_find_corner_maxima_aux:nn ##2 }
  }
\cs_new_protected:Npn \__coffin_find_corner_maxima_aux:nn #1#2
  {
    \dim_set:Nn \l__coffin_left_corner_dim
     { \dim_min:nn { \l__coffin_left_corner_dim } {#1} }
    \dim_set:Nn \l__coffin_right_corner_dim
     { \dim_max:nn { \l__coffin_right_corner_dim } {#1} }
    \dim_set:Nn \l__coffin_bottom_corner_dim
     { \dim_min:nn { \l__coffin_bottom_corner_dim } {#2} }
    \dim_set:Nn \l__coffin_top_corner_dim
     { \dim_max:nn { \l__coffin_top_corner_dim } {#2} }
  }
\cs_new_protected:Npn \__coffin_find_bounding_shift:
  {
    \dim_set:Nn \l__coffin_bounding_shift_dim { \c_max_dim }
    \prop_map_inline:Nn \l__coffin_bounding_prop
      { \__coffin_find_bounding_shift_aux:nn ##2 }
  }
\cs_new_protected:Npn \__coffin_find_bounding_shift_aux:nn #1#2
  {
    \dim_set:Nn \l__coffin_bounding_shift_dim
      { \dim_min:nn { \l__coffin_bounding_shift_dim } {#1} }
  }
\cs_new_protected:Npn \__coffin_shift_corner:Nnnn #1#2#3#4
  {
    \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _ prop } {#2}
      {
        { \dim_eval:n { #3 - \l__coffin_left_corner_dim } }
        { \dim_eval:n { #4 - \l__coffin_bottom_corner_dim } }
      }
  }
\cs_new_protected:Npn \__coffin_shift_pole:Nnnnnn #1#2#3#4#5#6
  {
    \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _ prop } {#2}
      {
        { \dim_eval:n { #3 - \l__coffin_left_corner_dim } }
        { \dim_eval:n { #4 - \l__coffin_bottom_corner_dim } }
        {#5} {#6}
      }
  }
\fp_new:N \l__coffin_scale_x_fp
\fp_new:N \l__coffin_scale_y_fp
\dim_new:N \l__coffin_scaled_total_height_dim
\dim_new:N \l__coffin_scaled_width_dim
\cs_new_protected:Npn \coffin_resize:Nnn #1#2#3
  {
    \fp_set:Nn \l__coffin_scale_x_fp
      { \dim_to_fp:n {#2} / \dim_to_fp:n { \coffin_wd:N #1 } }
    \fp_set:Nn \l__coffin_scale_y_fp
      {
          \dim_to_fp:n {#3}
        / \dim_to_fp:n { \coffin_ht:N #1 + \coffin_dp:N #1 }
      }
    \box_resize_to_wd_and_ht_plus_dp:Nnn #1 {#2} {#3}
    \__coffin_resize_common:Nnn #1 {#2} {#3}
  }
\cs_generate_variant:Nn \coffin_resize:Nnn { c }
\cs_new_protected:Npn \__coffin_resize_common:Nnn #1#2#3
  {
    \prop_map_inline:cn { l__coffin_corners_ \__int_value:w #1 _prop }
      { \__coffin_scale_corner:Nnnn #1 {##1} ##2 }
    \prop_map_inline:cn { l__coffin_poles_ \__int_value:w #1 _prop }
      { \__coffin_scale_pole:Nnnnnn #1 {##1} ##2 }
    \fp_compare:nNnT \l__coffin_scale_x_fp < \c_zero_fp
      {
        \prop_map_inline:cn { l__coffin_corners_ \__int_value:w #1 _prop }
          { \__coffin_x_shift_corner:Nnnn #1 {##1} ##2 }
        \prop_map_inline:cn { l__coffin_poles_ \__int_value:w #1 _prop }
          { \__coffin_x_shift_pole:Nnnnnn #1 {##1} ##2 }
      }
  }
\cs_new_protected:Npn \coffin_scale:Nnn #1#2#3
  {
    \fp_set:Nn \l__coffin_scale_x_fp {#2}
    \fp_set:Nn \l__coffin_scale_y_fp {#3}
    \box_scale:Nnn #1 { \l__coffin_scale_x_fp } { \l__coffin_scale_y_fp }
    \dim_set:Nn \l__coffin_internal_dim
      { \coffin_ht:N #1 + \coffin_dp:N #1 }
    \dim_set:Nn \l__coffin_scaled_total_height_dim
      { \fp_abs:n { \l__coffin_scale_y_fp } \l__coffin_internal_dim }
    \dim_set:Nn \l__coffin_scaled_width_dim
      { -\fp_abs:n { \l__coffin_scale_x_fp  } \coffin_wd:N #1 }
    \__coffin_resize_common:Nnn #1
      { \l__coffin_scaled_width_dim } { \l__coffin_scaled_total_height_dim }
  }
\cs_generate_variant:Nn \coffin_scale:Nnn { c }
\cs_new_protected:Npn \__coffin_scale_vector:nnNN #1#2#3#4
  {
    \dim_set:Nn #3
      { \fp_to_dim:n { \dim_to_fp:n {#1} * \l__coffin_scale_x_fp } }
    \dim_set:Nn #4
      { \fp_to_dim:n { \dim_to_fp:n {#2} * \l__coffin_scale_y_fp } }
  }
\cs_new_protected:Npn \__coffin_scale_corner:Nnnn #1#2#3#4
  {
    \__coffin_scale_vector:nnNN {#3} {#4} \l__coffin_x_dim \l__coffin_y_dim
    \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } {#2}
      { { \dim_use:N \l__coffin_x_dim } { \dim_use:N \l__coffin_y_dim } }
  }
\cs_new_protected:Npn \__coffin_scale_pole:Nnnnnn #1#2#3#4#5#6
  {
    \__coffin_scale_vector:nnNN {#3} {#4} \l__coffin_x_dim \l__coffin_y_dim
    \__coffin_set_pole:Nnx #1 {#2}
      {
        { \dim_use:N \l__coffin_x_dim } { \dim_use:N \l__coffin_y_dim }
        {#5} {#6}
      }
  }
\cs_new_protected:Npn \__coffin_x_shift_corner:Nnnn #1#2#3#4
  {
    \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } {#2}
      {
        { \dim_eval:n { #3 + \box_wd:N #1 } } {#4}
      }
  }
\cs_new_protected:Npn \__coffin_x_shift_pole:Nnnnnn #1#2#3#4#5#6
  {
    \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } {#2}
      {
        { \dim_eval:n #3 + \box_wd:N #1 } {#4}
        {#5} {#6}
      }
  }
\cs_new_protected:Npn \file_if_exist_input:n #1
  {
    \file_if_exist:nT {#1}
      { \__file_input:V \l__file_internal_name_tl }
  }
\cs_new_protected:Npn \file_if_exist_input:nT #1#2
  {
    \file_if_exist:nT {#1}
      {
        #2
        \__file_input:V \l__file_internal_name_tl
      }
  }
\cs_new_protected:Npn \file_if_exist_input:nF #1
  {
    \file_if_exist:nTF {#1}
      { \__file_input:V \l__file_internal_name_tl }
  }
\cs_new_protected:Npn \file_if_exist_input:nTF #1#2
  {
    \file_if_exist:nTF {#1}
      {
        #2
        \__file_input:V \l__file_internal_name_tl
      }
  }
\cs_new:Npn \ior_map_break:
  { \__prg_map_break:Nn \ior_map_break: { } }
\cs_new:Npn \ior_map_break:n
  { \__prg_map_break:Nn \ior_map_break: }
\cs_new_protected:Npn \ior_map_inline:Nn
  { \__ior_map_inline:NNn \ior_get:NN }
\cs_new_protected:Npn \ior_str_map_inline:Nn
  { \__ior_map_inline:NNn \ior_str_get:NN }
\cs_new_protected:Npn \__ior_map_inline:NNn
  {
    \int_gincr:N \g__prg_map_int
    \exp_args:Nc \__ior_map_inline:NNNn
      { __prg_map_ \int_use:N \g__prg_map_int :n }
  }
\cs_new_protected:Npn \__ior_map_inline:NNNn #1#2#3#4
  {
    \cs_gset_protected:Npn #1 ##1 {#4}
    \ior_if_eof:NF #3 { \__ior_map_inline_loop:NNN #1#2#3 }
    \__prg_break_point:Nn \ior_map_break:
      { \int_gdecr:N \g__prg_map_int }
  }
\cs_new_protected:Npn \__ior_map_inline_loop:NNN #1#2#3
  {
    #2 #3 \l__ior_internal_tl
    \ior_if_eof:NF #3
      {
        \exp_args:No #1 \l__ior_internal_tl
        \__ior_map_inline_loop:NNN #1#2#3
      }
  }
\tl_new:N  \l__ior_internal_tl
\cs_new_protected:Npn \ior_log_streams:
  { \__msg_log_next: \ior_list_streams: }
\cs_new_protected:Npn \iow_log_streams:
  { \__msg_log_next: \iow_list_streams: }
\cs_if_exist:NTF \pdftex_uniformdeviate:D
  {
    \cs_new:Npn \int_rand:nn #1#2
      {
        \exp_after:wN \__int_rand:ww
        \__int_value:w \__int_eval:w #1 \exp_after:wN ;
        \__int_value:w \__int_eval:w #2 ;
      }
    \cs_new:Npn \__int_rand:ww #1; #2;
      {
        \int_compare:nNnTF {#1} > {#2}
          {
            \__msg_kernel_expandable_error:nnnn
              { kernel } { backward-range } {#1} {#2}
            \__int_rand:ww #2; #1;
          }
          {
            \int_compare:nNnTF {#1} > 0
              { \int_compare:nNnTF { #2 - #1 } < \c__fp_rand_size_int }
              { \int_compare:nNnTF {#2} < { #1 + \c__fp_rand_size_int } }
                  {
                    \exp_args:Nf \__int_rand_narrow:nn
                      { \int_eval:n { #2 - #1 + 1 } } {#1}
                  }
                  { \fp_to_int:n { randint(#1,#2) } }
          }
      }
    \cs_new:Npn \__int_rand_narrow:nn
      {
        \exp_args:No \__int_rand_narrow:nnn
          { \pdftex_uniformdeviate:D \c__fp_rand_size_int }
      }
    \cs_new:Npn \__int_rand_narrow:nnn #1#2
      {
        \exp_args:Nf \__int_rand_narrow:nnnn
          { \int_mod:nn {#1} {#2} } {#1} {#2}
      }
    \cs_new:Npn \__int_rand_narrow:nnnn #1#2#3#4
      {
        \int_compare:nNnTF { #2 - #1 + #3 } > \c__fp_rand_size_int
          { \__int_rand_narrow:nn {#3} {#4} }
          { \int_eval:n { #4 + #1 } }
      }
  }
  {
    \cs_new:Npn \int_rand:nn #1#2
      {
        \__msg_kernel_expandable_error:nn { kernel } { fp-no-random }
        \int_eval:n {#1}
      }
  }
\cs_if_exist:NT \pdftex_uniformdeviate:D
  {
    \__msg_kernel_new:nnn { kernel } { backward-range }
      { Bounds~ordered~backwards~in~\int_rand:nn {#1}~{#2}. }
  }
\cs_new:Npn \msg_expandable_error:nnnnnn #1#2#3#4#5#6
  {
    \exp_args:Nf \__msg_expandable_error_module:nn
      {
        \exp_args:Nf \tl_to_str:n
          { \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} }
      }
      {#1}
  }
\cs_new:Npn \msg_expandable_error:nnnnn #1#2#3#4#5
  { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} {#5} { } }
\cs_new:Npn \msg_expandable_error:nnnn #1#2#3#4
  { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} { } { } }
\cs_new:Npn \msg_expandable_error:nnn #1#2#3
  { \msg_expandable_error:nnnnnn {#1} {#2} {#3} { } { } { } }
\cs_new:Npn \msg_expandable_error:nn #1#2
  { \msg_expandable_error:nnnnnn {#1} {#2} { } { } { } { } }
\cs_generate_variant:Nn \msg_expandable_error:nnnnnn { nnffff }
\cs_generate_variant:Nn \msg_expandable_error:nnnnn  { nnfff }
\cs_generate_variant:Nn \msg_expandable_error:nnnn   { nnff }
\cs_generate_variant:Nn \msg_expandable_error:nnn    { nnf }
\cs_new:Npn \__msg_expandable_error_module:nn #1#2
  {
    \exp_after:wN \exp_after:wN
    \exp_after:wN \use_none_delimit_by_q_stop:w
    \use:n { \::error ! ~ #2 : ~ #1 } \q_stop
  }
\cs_new:Npn \prop_count:N #1
  {
    \int_eval:n
      {
        0
        \prop_map_function:NN #1 \__prop_count:nn
      }
  }
\cs_new:Npn \__prop_count:nn #1#2 { + 1 }
\cs_generate_variant:Nn \prop_count:N { c }
\cs_new:Npn \prop_map_tokens:Nn #1#2
  {
    \exp_last_unbraced:Nno \__prop_map_tokens:nwwn {#2} #1
      \__prop_pair:wn \q_recursion_tail \s__prop { }
    \__prg_break_point:Nn \prop_map_break: { }
  }
\cs_new:Npn \__prop_map_tokens:nwwn #1#2 \__prop_pair:wn #3 \s__prop #4
  {
    \if_meaning:w \q_recursion_tail #3
      \exp_after:wN \prop_map_break:
    \fi:
    \use:n {#1} {#3} {#4}
    \__prop_map_tokens:nwwn {#1}
  }
\cs_generate_variant:Nn \prop_map_tokens:Nn { c }
\cs_new:Npn \prop_rand_key_value:N { \__prop_rand:NN \__prop_rand:nNn }
\cs_new:Npn \__prop_rand:nNn #1#2#3 { \exp_not:n { {#1} {#3} } }
\cs_new:Npn \__prop_rand:NN #1#2
  {
    \prop_if_empty:NTF #2 { }
      {
        \exp_after:wN \__prop_rand_item:Nw \exp_after:wN #1
        \__int_value:w \int_rand:nn { 1 } { \prop_count:N #2 } #2
        \q_stop
      }
  }
\cs_new:Npn \__prop_rand_item:Nw #1#2 \s__prop \__prop_pair:wn #3 \s__prop #4
  {
    \int_compare:nNnF {#2} > 1
      { \use_i_delimit_by_q_stop:nw { #1 {#3} \exp_not:n {#4} } }
    \exp_after:wN \__prop_rand_item:Nw \exp_after:wN #1
    \__int_value:w \int_eval:n { #2 - 1 } \s__prop
  }
\cs_generate_variant:Nn \prop_rand_key_value:N { c }
\cs_new:Npn \seq_mapthread_function:NNN #1#2#3
  { \exp_after:wN \__seq_mapthread_function:wNN #2 \q_stop #1 #3 }
\cs_new:Npn \__seq_mapthread_function:wNN \s__seq #1 \q_stop #2#3
  {
    \exp_after:wN \__seq_mapthread_function:wNw #2 \q_stop #3
      #1 { ? \__prg_break: } { }
    \__prg_break_point:
  }
\cs_new:Npn \__seq_mapthread_function:wNw \s__seq #1 \q_stop #2
  {
    \__seq_mapthread_function:Nnnwnn #2
      #1 { ? \__prg_break: } { }
    \q_stop
  }
\cs_new:Npn \__seq_mapthread_function:Nnnwnn #1#2#3#4 \q_stop #5#6
  {
    \use_none:n #2
    \use_none:n #5
    #1 {#3} {#6}
    \__seq_mapthread_function:Nnnwnn #1 #4 \q_stop
  }
\cs_generate_variant:Nn \seq_mapthread_function:NNN {     Nc }
\cs_generate_variant:Nn \seq_mapthread_function:NNN { c , cc }
\cs_new_protected:Npn \seq_set_filter:NNn
  { \__seq_set_filter:NNNn \tl_set:Nx }
\cs_new_protected:Npn \seq_gset_filter:NNn
  { \__seq_set_filter:NNNn \tl_gset:Nx }
\cs_new_protected:Npn \__seq_set_filter:NNNn #1#2#3#4
  {
    \__seq_push_item_def:n { \bool_if:nT {#4} { \__seq_wrap_item:n {##1} } }
    #1 #2 { #3 }
    \__seq_pop_item_def:
  }
\cs_new_protected:Npn \seq_set_map:NNn
  { \__seq_set_map:NNNn \tl_set:Nx }
\cs_new_protected:Npn \seq_gset_map:NNn
  { \__seq_set_map:NNNn \tl_gset:Nx }
\cs_new_protected:Npn \__seq_set_map:NNNn #1#2#3#4
  {
    \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} }
    #1 #2 { #3 }
    \__seq_pop_item_def:
  }
\cs_new:Npn \seq_rand_item:N #1
  {
    \seq_if_empty:NF #1
      { \seq_item:Nn #1 { \int_rand:nn { 1 } { \seq_count:N #1 } } }
  }
\cs_generate_variant:Nn \seq_rand_item:N { c }
\cs_new:Npn \skip_split_finite_else_action:nnNN #1#2#3#4
  {
    \skip_if_finite:nTF {#1}
      {
        #3 = \etex_gluestretch:D #1 \scan_stop:
        #4 = \etex_glueshrink:D  #1 \scan_stop:
      }
      {
        #3 = \c_zero_skip
        #4 = \c_zero_skip
        #2
      }
  }
\cs_if_exist:NTF \pdftex_uniformdeviate:D
  {
    \prg_new_conditional:Npnn \sys_if_rand_exist: { p , T , F , TF }
      { \prg_return_true: }
  }
  {
    \prg_new_conditional:Npnn \sys_if_rand_exist: { p , T , F , TF }
      { \prg_return_false: }
  }
\cs_new:Npn \sys_rand_seed: { \tex_the:D \pdftex_randomseed:D }
\cs_new_protected:Npn \sys_gset_rand_seed:n #1
  { \pdftex_setrandomseed:D \__int_eval:w #1 \__int_eval_end: }
\prg_new_conditional:Npnn \tl_if_single_token:n #1 { p , T , F , TF }
  {
    \tl_if_head_is_N_type:nTF {#1}
      { \__tl_if_empty_return:o { \use_none:n #1 } }
      {
        \tl_if_empty:nTF {#1}
          { \prg_return_false: }
          { \__tl_if_empty_return:o { \exp:w \exp_end_continue_f:w #1 } }
      }
  }
\cs_new:Npn \tl_reverse_tokens:n #1
  {
    \etex_unexpanded:D \exp_after:wN
      {
        \exp:w
        \__tl_act:NNNnn
          \__tl_reverse_normal:nN
          \__tl_reverse_group:nn
          \__tl_reverse_space:n
          { }
          {#1}
      }
  }
\cs_new:Npn \__tl_reverse_group:nn #1
  {
    \__tl_act_group_recurse:Nnn
      \__tl_act_reverse_output:n
      { \tl_reverse_tokens:n }
  }
\cs_new:Npn \__tl_act_group_recurse:Nnn #1#2#3
  {
    \exp_args:Nf #1
      { \exp_after:wN \exp_after:wN \exp_after:wN { #2 {#3} } }
  }
\cs_new:Npn \tl_count_tokens:n #1
  {
    \int_eval:n
      {
        \__tl_act:NNNnn
          \__tl_act_count_normal:nN
          \__tl_act_count_group:nn
          \__tl_act_count_space:n
          { }
          {#1}
      }
  }
\cs_new:Npn \__tl_act_count_normal:nN #1 #2 { 1 + }
\cs_new:Npn \__tl_act_count_space:n #1 { 1 + }
\cs_new:Npn \__tl_act_count_group:nn #1 #2
  { 2 + \tl_count_tokens:n {#2} + }
\cs_new_protected:Npn \tl_set_from_file:Nnn
  { \__tl_set_from_file:NNnn \tl_set:Nn }
\cs_new_protected:Npn \tl_gset_from_file:Nnn
  { \__tl_set_from_file:NNnn \tl_gset:Nn }
\cs_generate_variant:Nn \tl_set_from_file:Nnn  { c }
\cs_generate_variant:Nn \tl_gset_from_file:Nnn { c }
\cs_new_protected:Npn \__tl_set_from_file:NNnn #1#2#3#4
  {
    \__file_if_exist:nT {#4}
      {
        \group_begin:
          \exp_args:No \etex_everyeof:D
            { \c__tl_rescan_marker_tl \exp_not:N }
          #3 \scan_stop:
          \exp_after:wN \__tl_from_file_do:w
          \exp_after:wN \prg_do_nothing:
            \tex_input:D \l__file_internal_name_tl \scan_stop:
        \exp_args:NNNo \group_end:
        #1 #2 \l__tl_internal_a_tl
      }
  }
\exp_args:Nno \use:nn
  { \cs_new_protected:Npn \__tl_from_file_do:w #1 }
  { \c__tl_rescan_marker_tl }
  { \tl_set:No \l__tl_internal_a_tl {#1} }
\cs_new_protected:Npn \tl_set_from_file_x:Nnn
  { \__tl_set_from_file_x:NNnn \tl_set:Nn }
\cs_new_protected:Npn \tl_gset_from_file_x:Nnn
  { \__tl_set_from_file_x:NNnn \tl_gset:Nn }
\cs_generate_variant:Nn \tl_set_from_file_x:Nnn  { c }
\cs_generate_variant:Nn \tl_gset_from_file_x:Nnn { c }
\cs_new_protected:Npn \__tl_set_from_file_x:NNnn #1#2#3#4
  {
    \__file_if_exist:nT {#4}
      {
        \group_begin:
          \etex_everyeof:D { \exp_not:N }
          #3 \scan_stop:
          \tl_set:Nx \l__tl_internal_a_tl
            { \tex_input:D \l__file_internal_name_tl \c_space_token }
        \exp_args:NNNo \group_end:
        #1 #2 \l__tl_internal_a_tl
      }
  }
\cs_generate_variant:Nn \tl_if_head_eq_catcode:nNTF { o }
\cs_new:Npn \tl_lower_case:n { \__tl_change_case:nnn { lower } { } }
\cs_new:Npn \tl_upper_case:n { \__tl_change_case:nnn { upper } { } }
\cs_new:Npn \tl_mixed_case:n { \__tl_mixed_case:nn { } }
\cs_new:Npn \tl_lower_case:nn { \__tl_change_case:nnn { lower } }
\cs_new:Npn \tl_upper_case:nn { \__tl_change_case:nnn { upper } }
\cs_new:Npn \tl_mixed_case:nn { \__tl_mixed_case:nn }
\cs_new:Npn \__tl_change_case:nnn #1#2#3
  {
    \etex_unexpanded:D \exp_after:wN
      {
        \exp:w
        \__tl_change_case_aux:nnn {#1} {#2} {#3}
      }
  }
\cs_new:Npn \__tl_change_case_aux:nnn #1#2#3
  {
    \group_align_safe_begin:
    \__tl_change_case_loop:wnn
      #3 \q_recursion_tail \q_recursion_stop {#1} {#2}
    \__tl_change_case_result:n { }
  }
\cs_new:Npn \__tl_change_case_loop:wnn #1 \q_recursion_stop
  {
    \tl_if_head_is_N_type:nTF {#1}
      { \__tl_change_case_N_type:Nwnn }
      {
        \tl_if_head_is_group:nTF {#1}
          { \__tl_change_case_group:nwnn }
          { \__tl_change_case_space:wnn }
      }
    #1 \q_recursion_stop
  }
\cs_new:Npn \__tl_change_case_output:nwn #1#2 \__tl_change_case_result:n #3
  { #2 \__tl_change_case_result:n { #3 #1 } }
\cs_generate_variant:Nn \__tl_change_case_output:nwn { V , o , v , f }
\cs_new:Npn \__tl_change_case_end:wn #1 \__tl_change_case_result:n #2
  {
    \group_align_safe_end:
    \exp_end:
    #2
  }
\cs_new:Npn \__tl_change_case_group:nwnn #1#2 \q_recursion_stop #3#4
  {
    \__tl_change_case_output:own
      {
        \exp_after:wN
          {
            \exp:w
            \__tl_change_case_aux:nnn {#3} {#4} {#1}
          }
      }
    \__tl_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
  }
\exp_last_unbraced:NNo \cs_new:Npn \__tl_change_case_space:wnn \c_space_tl
  {
    \__tl_change_case_output:nwn { ~ }
    \__tl_change_case_loop:wnn
  }
\cs_new:Npn \__tl_change_case_N_type:Nwnn #1#2 \q_recursion_stop
  {
    \quark_if_recursion_tail_stop_do:Nn #1
      { \__tl_change_case_end:wn }
    \exp_after:wN \__tl_change_case_N_type:NNNnnn
      \exp_after:wN #1 \l_tl_case_change_math_tl
      \q_recursion_tail ? \q_recursion_stop {#2}
  }
\cs_new:Npn \__tl_change_case_N_type:NNNnnn #1#2#3
  {
    \quark_if_recursion_tail_stop_do:Nn #2
     { \__tl_change_case_N_type:Nnnn #1 }
    \token_if_eq_meaning:NNTF #1 #2
      {
        \use_i_delimit_by_q_recursion_stop:nw
           {
             \__tl_change_case_math:NNNnnn
               #1 #3 \__tl_change_case_loop:wnn
           }
      }
      { \__tl_change_case_N_type:NNNnnn #1 }
  }
\cs_new:Npn \__tl_change_case_math:NNNnnn #1#2#3#4
  {
    \__tl_change_case_output:nwn {#1}
    \__tl_change_case_math_loop:wNNnn #4 \q_recursion_stop #2 #3
  }
\cs_new:Npn \__tl_change_case_math_loop:wNNnn #1 \q_recursion_stop
  {
    \tl_if_head_is_N_type:nTF {#1}
      { \__tl_change_case_math:NwNNnn }
      {
        \tl_if_head_is_group:nTF {#1}
          { \__tl_change_case_math_group:nwNNnn }
          { \__tl_change_case_math_space:wNNnn }
      }
    #1 \q_recursion_stop
  }
\cs_new:Npn \__tl_change_case_math:NwNNnn #1#2 \q_recursion_stop #3#4
  {
    \token_if_eq_meaning:NNTF \q_recursion_tail #1
      { \__tl_change_case_end:wn }
      {
        \__tl_change_case_output:nwn {#1}
        \token_if_eq_meaning:NNTF #1 #3
          { #4 #2 \q_recursion_stop }
          { \__tl_change_case_math_loop:wNNnn #2 \q_recursion_stop #3#4 }
      }
  }
\cs_new:Npn \__tl_change_case_math_group:nwNNnn #1#2 \q_recursion_stop
  {
    \__tl_change_case_output:nwn { {#1} }
    \__tl_change_case_math_loop:wNNnn #2 \q_recursion_stop
  }
\exp_last_unbraced:NNo
  \cs_new:Npn \__tl_change_case_math_space:wNNnn \c_space_tl
  {
    \__tl_change_case_output:nwn { ~ }
    \__tl_change_case_math_loop:wNNnn
  }
\cs_new:Npn \__tl_change_case_N_type:Nnnn #1#2#3#4
  {
    \token_if_cs:NTF #1
      { \__tl_change_case_cs_letterlike:Nnn #1 {#3} { } }
      { \__tl_change_case_char:Nnn #1 {#3} {#4} }
    \__tl_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4}
  }
\cs_new:Npn \__tl_change_case_char:Nnn #1#2#3
  {
    \cs_if_exist_use:cF { __tl_change_case_ #2 _ #3 :Nnw }
      { \use_ii:nn }
        #1
        {
          \use:c { __tl_change_case_ #2 _ sigma:Nnw } #1
            { \__tl_change_case_char:nN {#2} #1 }
        }
  }
\cs_if_exist:NTF \utex_char:D
  {
    \cs_new:Npn \__tl_change_case_char:nN #1#2
      { \__tl_change_case_char_auxi:nN {#1} #2 }
  }
  {
    \cs_new:Npn \__tl_change_case_char:nN #1#2
      {
        \int_compare:nNnTF { `#2 } > { "80 }
          {
            \int_compare:nNnTF { `#2 } < { "E0 }
              { \__tl_change_case_char_UTFviii:nNNN {#1} #2 }
              {
                \int_compare:nNnTF { `#2 } < { "F0 }
                  { \__tl_change_case_char_UTFviii:nNNNN {#1} #2 }
                  { \__tl_change_case_char_UTFviii:nNNNNN {#1} #2 }
              }
          }
          { \__tl_change_case_char_auxi:nN {#1} #2 }
       }
  }
\cs_new:Npn \__tl_change_case_char_auxi:nN #1#2
  {
    \__tl_change_case_output:fwn
      {
        \cs_if_exist_use:cF { c__unicode_ #1 _ \token_to_str:N #2 _tl }
          { \__tl_change_case_char_auxii:nN {#1} #2 }
      }
  }
\cs_if_exist:NTF \utex_char:D
  {
    \cs_new:Npn \__tl_change_case_char_auxii:nN #1#2
      {
        \int_compare:nNnTF { \use:c { __tl_lookup_ #1 :N } #2 } = { 0 }
          { \exp_stop_f: #2 }
          {
            \char_generate:nn
              { \use:c { __tl_lookup_ #1 :N } #2 }
              { \char_value_catcode:n { \use:c { __tl_lookup_ #1 :N } #2 } }
          }
      }
    \cs_new_protected:Npn \__tl_lookup_lower:N #1 { \tex_lccode:D `#1 }
    \cs_new_protected:Npn \__tl_lookup_upper:N #1 { \tex_uccode:D `#1 }
    \cs_new_eq:NN \__tl_lookup_title:N \__tl_lookup_upper:N
  }
  {
    \cs_new:Npn \__tl_change_case_char_auxii:nN #1#2 { \exp_stop_f: #2 }
    \cs_new:Npn \__tl_change_case_char_UTFviii:nNNN #1#2#3#4
      { \__tl_change_case_char_UTFviii:nnN {#1} {#2#4} #3 }
    \cs_new:Npn \__tl_change_case_char_UTFviii:nNNNN #1#2#3#4#5
      { \__tl_change_case_char_UTFviii:nnN {#1} {#2#4#5} #3 }
    \cs_new:Npn \__tl_change_case_char_UTFviii:nNNNNN #1#2#3#4#5#6
      { \__tl_change_case_char_UTFviii:nnN {#1} {#2#4#5#6} #3 }
    \cs_new:Npn \__tl_change_case_char_UTFviii:nnN #1#2#3
      {
        \cs_if_exist:cTF { c__unicode_ #1 _ \tl_to_str:n {#2} _tl }
          {
            \__tl_change_case_output:vwn
              { c__unicode_ #1 _ \tl_to_str:n {#2} _tl }
          }
          { \__tl_change_case_output:nwn {#2} }
        #3
      }
  }
\cs_new:Npn \__tl_change_case_cs_letterlike:Nnn #1#2#3
  {
    \cs_if_exist:cTF { c__tl_change_case_ #2 _ \token_to_str:N #1 _tl }
      {
        \__tl_change_case_output:vwn
          { c__tl_change_case_ #2 _ \token_to_str:N #1 _tl }
        #3
      }
      {
        \cs_if_exist:cTF
          {
            c__tl_change_case_
            \str_if_eq:nnTF {#2} { lower } { upper } { lower }
            _ \token_to_str:N #1 _tl
          }
          {
            \__tl_change_case_output:nwn {#1}
            #3
          }
          {
            \exp_after:wN \__tl_change_case_cs_accents:NN
              \exp_after:wN #1 \l_tl_case_change_accents_tl
              \q_recursion_tail \q_recursion_stop
          }
      }
  }
\cs_new:Npn \__tl_change_case_cs_accents:NN #1#2
  {
    \quark_if_recursion_tail_stop_do:Nn #2
      { \__tl_change_case_cs:N #1 }
    \str_if_eq:nnTF {#1} {#2}
      {
        \use_i_delimit_by_q_recursion_stop:nw
          { \__tl_change_case_output:nwn {#1} }
      }
      { \__tl_change_case_cs_accents:NN #1 }
  }
\cs_new:Npn \__tl_change_case_cs:N #1
  {
    \str_if_eq:nnTF {#1} { \protect } { \__tl_change_case_protect:wNN }
    \exp_after:wN \__tl_change_case_cs:NN
      \exp_after:wN #1 \l_tl_case_change_exclude_tl
      \q_recursion_tail \q_recursion_stop
  }
\cs_new:Npn \__tl_change_case_cs:NN #1#2
  {
    \quark_if_recursion_tail_stop_do:Nn #2
      {
        \__tl_change_case_cs_expand:Nnw #1
          { \__tl_change_case_output:nwn {#1} }
      }
    \str_if_eq:nnTF {#1} {#2}
      {
        \use_i_delimit_by_q_recursion_stop:nw
          { \__tl_change_case_cs:NNn #1 }
      }
      { \__tl_change_case_cs:NN #1 }
  }
\cs_new:Npn \__tl_change_case_cs:NNn #1#2#3
  {
    \__tl_change_case_output:nwn { #1 {#3} }
    #2
  }
\cs_new:Npn \__tl_change_case_protect:wNN #1 \q_recursion_stop #2 #3
  { \__tl_change_case_output:nwn { \protect #3 } #2 }
\cs_new:Npn \__tl_change_case_if_expandable:NTF #1
  {
    \token_if_expandable:NTF #1
      {
        \bool_lazy_any:nTF
          {
            { \token_if_eq_meaning_p:NN \q_recursion_tail #1 }
            { \token_if_protected_macro_p:N      #1 }
            { \token_if_protected_long_macro_p:N #1 }
          }
          { \use_ii:nn }
          { \use_i:nn }
      }
      { \use_ii:nn }
  }
\cs_new:Npn \__tl_change_case_cs_expand:Nnw #1#2
  {
    \__tl_change_case_if_expandable:NTF #1
      { \__tl_change_case_cs_expand:NN #1 }
      { #2 }
  }
\cs_new:Npn \__tl_change_case_cs_expand:NN #1#2
  { \exp_after:wN #2 #1 }
\cs_new:Npn \__tl_change_case_lower_sigma:Nnw #1#2#3#4 \q_recursion_stop
  {
    \int_compare:nNnTF { `#1 } = { "03A3 }
      {
        \__tl_change_case_output:fwn
          { \__tl_change_case_lower_sigma:w #4 \q_recursion_stop }
      }
      {#2}
    #3 #4 \q_recursion_stop
  }
\cs_new:Npn \__tl_change_case_lower_sigma:w #1 \q_recursion_stop
  {
    \tl_if_head_is_N_type:nTF {#1}
      { \__tl_change_case_lower_sigma:Nw #1 \q_recursion_stop }
      { \c__unicode_final_sigma_tl }
  }
\cs_new:Npn \__tl_change_case_lower_sigma:Nw #1#2 \q_recursion_stop
  {
    \__tl_change_case_if_expandable:NTF #1
      {
        \exp_after:wN \__tl_change_case_lower_sigma:w #1
          #2 \q_recursion_stop
      }
      {
        \token_if_letter:NTF #1
          { \c__unicode_std_sigma_tl }
          { \c__unicode_final_sigma_tl }
      }
  }
\cs_new_eq:NN \__tl_change_case_upper_sigma:Nnw \use_ii:nn
\cs_if_exist:NTF \utex_char:D
  {
    \cs_new:Npn \__tl_change_case_lower_tr:Nnw #1#2
      {
        \int_compare:nNnTF { `#1 } = { "0049 }
          { \__tl_change_case_lower_tr_auxi:Nw }
          {
            \int_compare:nNnTF { `#1 } = { "0130 }
              { \__tl_change_case_output:nwn { i } }
              {#2}
          }
      }
    \cs_new:Npn \__tl_change_case_lower_tr_auxi:Nw #1#2 \q_recursion_stop
      {
        \tl_if_head_is_N_type:nTF {#2}
          { \__tl_change_case_lower_tr_auxii:Nw #2 \q_recursion_stop }
          { \__tl_change_case_output:Vwn \c__unicode_dotless_i_tl }
        #1 #2 \q_recursion_stop
      }
    \cs_new:Npn \__tl_change_case_lower_tr_auxii:Nw #1#2 \q_recursion_stop
      {
        \__tl_change_case_if_expandable:NTF #1
          {
            \exp_after:wN \__tl_change_case_lower_tr_auxi:Nw #1
              #2 \q_recursion_stop
          }
          {
            \bool_lazy_or:nnTF
              { \token_if_cs_p:N #1 }
              { ! \int_compare_p:nNn { `#1 } = { "0307 } }
              { \__tl_change_case_output:Vwn \c__unicode_dotless_i_tl }
              {
                \__tl_change_case_output:nwn { i }
                \use_i:nn
              }
          }
      }
  }
  {
    \cs_new:Npn \__tl_change_case_lower_tr:Nnw #1#2
      {
        \int_compare:nNnTF { `#1 } = { "0049 }
          { \__tl_change_case_output:Vwn \c__unicode_dotless_i_tl }
          {
            \int_compare:nNnTF { `#1 } = { 196 }
              { \__tl_change_case_lower_tr_auxi:Nw #1 {#2} }
              {#2}
          }
      }
    \cs_new:Npn \__tl_change_case_lower_tr_auxi:Nw #1#2#3#4
      {
        \int_compare:nNnTF { `#4 } = { 176 }
          {
            \__tl_change_case_output:nwn { i }
            #3
          }
          {
            #2
            #3 #4
          }
      }
  }
\cs_new:Npn \__tl_change_case_upper_tr:Nnw #1#2
  {
    \int_compare:nNnTF { `#1 } = { "0069 }
      { \__tl_change_case_output:Vwn \c__unicode_dotted_I_tl }
      {#2}
  }
\cs_new_eq:NN \__tl_change_case_lower_az:Nnw \__tl_change_case_lower_tr:Nnw
\cs_new_eq:NN \__tl_change_case_upper_az:Nnw \__tl_change_case_upper_tr:Nnw
\cs_new:Npn \__tl_change_case_lower_lt:Nnw #1
  {
    \exp_args:Nf \__tl_change_case_lower_lt:nNnw
      { \str_case:nVF #1 \c__unicode_accents_lt_tl \exp_stop_f: }
      #1
  }
\cs_new:Npn \__tl_change_case_lower_lt:nNnw #1#2
  {
    \tl_if_blank:nTF {#1}
      {
        \exp_args:Nf \__tl_change_case_lower_lt:nnw
          {
            \int_case:nnF {`#2}
              {
                { "0049 } i
                { "004A } j
                { "012E } \c__unicode_i_ogonek_tl
              }
              \exp_stop_f:
          }
      }
      {
        \__tl_change_case_output:nwn {#1}
        \use_none:n
      }
  }
\cs_new:Npn \__tl_change_case_lower_lt:nnw #1#2
  {
    \tl_if_blank:nTF {#1}
      {#2}
      {
        \__tl_change_case_output:nwn {#1}
        \__tl_change_case_lower_lt:Nw
      }
  }
\cs_new:Npn \__tl_change_case_lower_lt:Nw #1#2 \q_recursion_stop
  {
    \tl_if_head_is_N_type:nT {#2}
      { \__tl_change_case_lower_lt:NNw }
    #1 #2 \q_recursion_stop
  }
\cs_new:Npn \__tl_change_case_lower_lt:NNw #1#2#3 \q_recursion_stop
  {
    \__tl_change_case_if_expandable:NTF #2
      {
        \exp_after:wN \__tl_change_case_lower_lt:Nw \exp_after:wN #1 #2
          #3 \q_recursion_stop
      }
      {
        \bool_lazy_and:nnT
          { ! \token_if_cs_p:N #2 }
          {
            \bool_lazy_any_p:n
              {
                { \int_compare_p:nNn { `#2 } = { "0300 } }
                { \int_compare_p:nNn { `#2 } = { "0301 } }
                { \int_compare_p:nNn { `#2 } = { "0303 } }
              }
          }
          { \__tl_change_case_output:Vwn \c__unicode_dot_above_tl }
        #1 #2#3 \q_recursion_stop
      }
  }
\cs_new:Npn \__tl_change_case_upper_lt:Nnw #1
  {
    \exp_args:Nf \__tl_change_case_upper_lt:nnw
      {
        \int_case:nnF {`#1}
          {
            { "0069 } I
            { "006A } J
            { "012F } \c__unicode_I_ogonek_tl
          }
          \exp_stop_f:
      }
  }
\cs_new:Npn \__tl_change_case_upper_lt:nnw #1#2
  {
    \tl_if_blank:nTF {#1}
      {#2}
      {
        \__tl_change_case_output:nwn {#1}
        \__tl_change_case_upper_lt:Nw
      }
  }
\cs_new:Npn \__tl_change_case_upper_lt:Nw #1#2 \q_recursion_stop
  {
    \tl_if_head_is_N_type:nT {#2}
      { \__tl_change_case_upper_lt:NNw }
    #1 #2 \q_recursion_stop
  }
\cs_new:Npn \__tl_change_case_upper_lt:NNw #1#2#3 \q_recursion_stop
  {
    \__tl_change_case_if_expandable:NTF #2
      {
        \exp_after:wN \__tl_change_case_upper_lt:Nw \exp_after:wN #1 #2
          #3 \q_recursion_stop
      }
      {
        \bool_lazy_and:nnTF
          { ! \token_if_cs_p:N #2 }
          { \int_compare_p:nNn { `#2 } = { "0307 } }
          { #1 }
          { #1 #2 }
        #3 \q_recursion_stop
      }
  }
\cs_new:cpn { __tl_change_case_upper_de-alt:Nnw } #1#2
  {
    \int_compare:nNnTF { `#1 } = { 223 }
      { \__tl_change_case_output:Vwn \c__unicode_upper_Eszett_tl }
      {#2}
  }
\cs_new:Npn \__unicode_codepoint_to_UTFviii:n #1
  {
    \exp_args:Nf \__unicode_codepoint_to_UTFviii_auxi:n
      { \int_eval:n {#1} }
  }
\cs_new:Npn \__unicode_codepoint_to_UTFviii_auxi:n #1
  {
    \if_int_compare:w #1 > "80 ~
      \if_int_compare:w #1 < "800 ~
        2
        \__unicode_codepoint_to_UTFviii_auxii:Nnn C {#1} { 64 }
        \__unicode_codepoint_to_UTFviii_auxiii:n {#1}
      \else:
        \if_int_compare:w #1 < "10000 ~
          3
          \__unicode_codepoint_to_UTFviii_auxii:Nnn E {#1} { 64 * 64 }
          \__unicode_codepoint_to_UTFviii_auxiii:n {#1}
          \__unicode_codepoint_to_UTFviii_auxiii:n
            { \int_div_truncate:nn {#1} { 64 } }
        \else:
          4
          \__unicode_codepoint_to_UTFviii_auxii:Nnn F
            {#1} { 64 * 64 * 64 }
          \__unicode_codepoint_to_UTFviii_auxiii:n
            { \int_div_truncate:nn {#1} { 64 * 64 } }
          \__unicode_codepoint_to_UTFviii_auxiii:n
            { \int_div_truncate:nn {#1} { 64 } }
          \__unicode_codepoint_to_UTFviii_auxiii:n {#1}

        \fi:
      \fi:
    \else:
      1 {#1}
    \fi:
  }
\cs_new:Npn \__unicode_codepoint_to_UTFviii_auxii:Nnn #1#2#3
  { { \int_eval:n { "#10 + \int_div_truncate:nn {#2} {#3} } } }
\cs_new:Npn \__unicode_codepoint_to_UTFviii_auxiii:n #1
  { { \int_eval:n { \int_mod:nn {#1} { 64 } + 128 } } }
\cs_if_exist:NTF \utex_char:D
  {
    \tl_const:Nx \c__unicode_std_sigma_tl    { \utex_char:D "03C3 ~ }
    \tl_const:Nx \c__unicode_final_sigma_tl  { \utex_char:D "03C2 ~ }
    \tl_const:Nx \c__unicode_accents_lt_tl
      {
        \utex_char:D "00CC ~
          { \utex_char:D "0069 ~ \utex_char:D "0307 ~ \utex_char:D "0300 ~ }
        \utex_char:D "00CD ~
          { \utex_char:D "0069 ~ \utex_char:D "0307 ~ \utex_char:D "0301 ~ }
        \utex_char:D "0128 ~
          { \utex_char:D "0069 ~ \utex_char:D "0307 ~ \utex_char:D "0303 ~ }
      }
    \tl_const:Nx \c__unicode_dot_above_tl    { \utex_char:D "0307 ~ }
    \tl_const:Nx \c__unicode_upper_Eszett_tl { \utex_char:D "1E9E ~ }
  }
  {
      \tl_const:Nn \c__unicode_std_sigma_tl    { }
      \tl_const:Nn \c__unicode_final_sigma_tl  { }
      \tl_const:Nn \c__unicode_accents_lt_tl   { }
      \tl_const:Nn \c__unicode_dot_above_tl    { }
      \tl_const:Nn \c__unicode_upper_Eszett_tl { }
  }
\group_begin:
  \cs_if_exist:NTF \utex_char:D
    {
      \cs_set_protected:Npn \__tl_tmp:w #1#2
        { \tl_const:Nx #1 { \utex_char:D "#2 ~ } }
    }
    {
      \cs_set_protected:Npn \__tl_tmp:w #1#2
        {
          \group_begin:
            \cs_set_protected:Npn \__tl_tmp:w ##1##2##3
              {
                \tl_const:Nx #1
                  {
                    \exp_after:wN \exp_after:wN \exp_after:wN
                      \exp_not:N \__char_generate:nn {##2} { 13 }
                    \exp_after:wN \exp_after:wN \exp_after:wN
                      \exp_not:N \__char_generate:nn {##3} { 13 }
                  }
              }
            \tl_set:Nx \l__tl_internal_a_tl
              { \__unicode_codepoint_to_UTFviii:n {"#2} }
            \exp_after:wN \__tl_tmp:w \l__tl_internal_a_tl
          \group_end:
        }
    }
  \__tl_tmp:w \c__unicode_dotless_i_tl { 0131 }
  \__tl_tmp:w \c__unicode_dotted_I_tl  { 0130 }
  \__tl_tmp:w \c__unicode_i_ogonek_tl  { 012F }
  \__tl_tmp:w \c__unicode_I_ogonek_tl  { 012E }
\group_end:
\group_begin:
  \bool_lazy_or:nnT
    { \sys_if_engine_pdftex_p: }
    { \sys_if_engine_uptex_p: }
    {
      \cs_set_protected:Npn \__tl_loop:nn #1#2
        {
          \quark_if_recursion_tail_stop:n {#1}
          \tl_set:Nx \l__tl_internal_a_tl
            {
              \__unicode_codepoint_to_UTFviii:n {"#1}
              \__unicode_codepoint_to_UTFviii:n {"#2}
            }
          \exp_after:wN \__tl_tmp:w \l__tl_internal_a_tl
          \__tl_loop:nn
        }
      \cs_set_protected:Npn \__tl_tmp:w #1#2#3#4#5#6
        {
          \tl_const:cx
            {
              c__unicode_lower_
              \char_generate:nn {#2} { 12 }
              \char_generate:nn {#3} { 12 }
              _tl
            }
            {
              \exp_after:wN \exp_after:wN \exp_after:wN
                \exp_not:N \__char_generate:nn {#5} { 13 }
              \exp_after:wN \exp_after:wN \exp_after:wN
                \exp_not:N \__char_generate:nn {#6} { 13 }
            }
          \tl_const:cx
            {
              c__unicode_upper_
              \char_generate:nn {#5} { 12 }
              \char_generate:nn {#6} { 12 }
              _tl
            }
            {
              \exp_after:wN \exp_after:wN \exp_after:wN
                \exp_not:N \__char_generate:nn {#2} { 13 }
              \exp_after:wN \exp_after:wN \exp_after:wN
                \exp_not:N \__char_generate:nn {#3} { 13 }
            }
        }
      \__tl_loop:nn
        { 00C0 } { 00E0 }
        { 00C2 } { 00E2 }
        { 00C3 } { 00E3 }
        { 00C4 } { 00E4 }
        { 00C5 } { 00E5 }
        { 00C6 } { 00E6 }
        { 00C7 } { 00E7 }
        { 00C8 } { 00E8 }
        { 00C9 } { 00E9 }
        { 00CA } { 00EA }
        { 00CB } { 00EB }
        { 00CC } { 00EC }
        { 00CD } { 00ED }
        { 00CE } { 00EE }
        { 00CF } { 00EF }
        { 00D0 } { 00F0 }
        { 00D1 } { 00F1 }
        { 00D2 } { 00F2 }
        { 00D3 } { 00F3 }
        { 00D4 } { 00F4 }
        { 00D5 } { 00F5 }
        { 00D6 } { 00F6 }
        { 00D8 } { 00F8 }
        { 00D9 } { 00F9 }
        { 00DA } { 00FA }
        { 00DB } { 00FB }
        { 00DC } { 00FC }
        { 00DD } { 00FD }
        { 00DE } { 00FE }
        { 0100 } { 0101 }
        { 0102 } { 0103 }
        { 0104 } { 0105 }
        { 0106 } { 0107 }
        { 0108 } { 0109 }
        { 010A } { 010B }
        { 010C } { 010D }
        { 010E } { 010F }
        { 0110 } { 0111 }
        { 0112 } { 0113 }
        { 0114 } { 0115 }
        { 0116 } { 0117 }
        { 0118 } { 0119 }
        { 011A } { 011B }
        { 011C } { 011D }
        { 011E } { 011F }
        { 0120 } { 0121 }
        { 0122 } { 0123 }
        { 0124 } { 0125 }
        { 0128 } { 0129 }
        { 012A } { 012B }
        { 012C } { 012D }
        { 012E } { 012F }
        { 0132 } { 0133 }
        { 0134 } { 0135 }
        { 0136 } { 0137 }
        { 0139 } { 013A }
        { 013B } { 013C }
        { 013E } { 013F }
        { 0141 } { 0142 }
        { 0143 } { 0144 }
        { 0145 } { 0146 }
        { 0147 } { 0148 }
        { 014A } { 014B }
        { 014C } { 014D }
        { 014E } { 014F }
        { 0150 } { 0151 }
        { 0152 } { 0153 }
        { 0154 } { 0155 }
        { 0156 } { 0157 }
        { 0158 } { 0159 }
        { 015A } { 015B }
        { 015C } { 015D }
        { 015E } { 015F }
        { 0160 } { 0161 }
        { 0162 } { 0163 }
        { 0164 } { 0165 }
        { 0168 } { 0169 }
        { 016A } { 016B }
        { 016C } { 016D }
        { 016E } { 016F }
        { 0170 } { 0171 }
        { 0172 } { 0173 }
        { 0174 } { 0175 }
        { 0176 } { 0177 }
        { 0178 } { 00FF }
        { 0179 } { 017A }
        { 017B } { 017C }
        { 017D } { 017E }
        { 01CD } { 01CE }
        { 01CF } { 01D0 }
        { 01D1 } { 01D2 }
        { 01D3 } { 01D4 }
        { 01E2 } { 01E3 }
        { 01E6 } { 01E7 }
        { 01E8 } { 01E9 }
        { 01EA } { 01EB }
        { 01F4 } { 01F5 }
        { 0218 } { 0219 }
        { 021A } { 021B }
        \q_recursion_tail ?
        \q_recursion_stop
      \cs_set_protected:Npn \__tl_tmp:w #1#2#3
        {
          \group_begin:
            \cs_set_protected:Npn \__tl_tmp:w ##1##2##3
              {
                \tl_const:cx
                  {
                    c__unicode_ #3 _
                    \char_generate:nn {##2} { 12 }
                    \char_generate:nn {##3} { 12 }
                    _tl
                  }
                    {#2}
              }
            \tl_set:Nx \l__tl_internal_a_tl
              { \__unicode_codepoint_to_UTFviii:n { "#1 } }
            \exp_after:wN \__tl_tmp:w \l__tl_internal_a_tl
          \group_end:
        }
      \__tl_tmp:w { 00DF } { SS } { upper }
      \__tl_tmp:w { 00DF } { Ss } { title }
      \__tl_tmp:w { 0131 } { I }  { upper }
    }
  \group_end:
\group_begin:
  \cs_set_protected:Npn \__tl_change_case_setup:NN #1#2
    {
      \quark_if_recursion_tail_stop:N #1
      \tl_const:cn { c__tl_change_case_lower_ \token_to_str:N #1 _tl } { #2 }
      \tl_const:cn { c__tl_change_case_upper_ \token_to_str:N #2 _tl } { #1 }
      \__tl_change_case_setup:NN
    }
  \__tl_change_case_setup:NN
  \AA \aa
  \AE \ae
  \DH \dh
  \DJ \dj
  \IJ \ij
  \L  \l
  \NG \ng
  \O  \o
  \OE \oe
  \SS \ss
  \TH \th
  \q_recursion_tail ?
  \q_recursion_stop
  \tl_const:cn { c__tl_change_case_upper_ \token_to_str:N \i _tl } { I }
  \tl_const:cn { c__tl_change_case_upper_ \token_to_str:N \j _tl } { J }
\group_end:
\tl_new:N \l_tl_case_change_accents_tl
\tl_set:Nn \l_tl_case_change_accents_tl
  { \" \' \. \^ \` \~ \c \H \k \r \t \u \v }
\cs_new:Npn \__tl_mixed_case:nn #1#2
  {
    \etex_unexpanded:D \exp_after:wN
      {
        \exp:w
        \__tl_mixed_case_aux:nn {#1} {#2}
      }
  }
\cs_new:Npn \__tl_mixed_case_aux:nn #1#2
  {
    \group_align_safe_begin:
    \__tl_mixed_case_loop:wn
      #2 \q_recursion_tail \q_recursion_stop {#1}
    \__tl_change_case_result:n { }
  }
\cs_new:Npn \__tl_mixed_case_loop:wn #1 \q_recursion_stop
  {
    \tl_if_head_is_N_type:nTF {#1}
      { \__tl_mixed_case_N_type:Nwn }
      {
        \tl_if_head_is_group:nTF {#1}
          { \__tl_mixed_case_group:nwn }
          { \__tl_mixed_case_space:wn }
      }
    #1 \q_recursion_stop
  }
\cs_new:Npn \__tl_mixed_case_group:nwn #1#2 \q_recursion_stop #3
  {
    \__tl_change_case_output:own
      {
        \exp_after:wN
          {
            \exp:w
            \__tl_mixed_case_aux:nn {#3} {#1}
          }
      }
    \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
  }
\exp_last_unbraced:NNo \cs_new:Npn \__tl_mixed_case_space:wn \c_space_tl
  {
    \__tl_change_case_output:nwn { ~ }
    \__tl_mixed_case_loop:wn
  }
\cs_new:Npn \__tl_mixed_case_N_type:Nwn #1#2 \q_recursion_stop
  {
    \quark_if_recursion_tail_stop_do:Nn #1
      { \__tl_change_case_end:wn }
    \exp_after:wN \__tl_mixed_case_N_type:NNNnn
      \exp_after:wN #1 \l_tl_case_change_math_tl
      \q_recursion_tail ? \q_recursion_stop {#2}
  }
\cs_new:Npn \__tl_mixed_case_N_type:NNNnn #1#2#3
  {
    \quark_if_recursion_tail_stop_do:Nn #2
      { \__tl_mixed_case_N_type:Nnn #1 }
    \token_if_eq_meaning:NNTF #1 #2
      {
        \use_i_delimit_by_q_recursion_stop:nw
          {
            \__tl_change_case_math:NNNnnn
              #1 #3 \__tl_mixed_case_loop:wn
          }
      }
      { \__tl_mixed_case_N_type:NNNnn #1 }
  }
\cs_new:Npn \__tl_mixed_case_N_type:Nnn #1#2#3
  {
    \token_if_cs:NTF #1
      {
        \__tl_change_case_cs_letterlike:Nnn #1 { upper }
          { \__tl_mixed_case_letterlike:Nw }
        \__tl_mixed_case_loop:wn #2 \q_recursion_stop {#3}
      }
      {
        \__tl_mixed_case_char:Nn #1 {#3}
        \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } {#3}
      }
  }
\cs_new:Npn \__tl_mixed_case_letterlike:Nw #1#2 \q_recursion_stop
  { \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } }
\cs_new:Npn \__tl_mixed_case_char:Nn #1#2
  {
    \cs_if_exist_use:cF { __tl_change_case_mixed_ #2 :Nnw }
      {
        \cs_if_exist_use:cF { __tl_change_case_upper_ #2 :Nnw }
          { \use_ii:nn }
      }
        #1
        { \__tl_mixed_case_skip:N #1 }
  }
\cs_new:Npn \__tl_mixed_case_skip:N #1
  {
    \exp_after:wN \__tl_mixed_case_skip:NN
      \exp_after:wN #1 \l_tl_mixed_case_ignore_tl
      \q_recursion_tail \q_recursion_stop
  }
\cs_new:Npn \__tl_mixed_case_skip:NN #1#2
  {
    \quark_if_recursion_tail_stop_do:nn {#2}
      { \__tl_mixed_case_char:N #1 }
    \int_compare:nNnT { `#1 }  = { `#2 }
      {
        \use_i_delimit_by_q_recursion_stop:nw
          {
            \__tl_change_case_output:nwn {#1}
            \__tl_mixed_case_skip_tidy:Nwn
          }
      }
    \__tl_mixed_case_skip:NN #1
  }
\cs_new:Npn \__tl_mixed_case_skip_tidy:Nwn #1#2 \q_recursion_stop #3
  {
    \__tl_mixed_case_loop:wn #2 \q_recursion_stop
  }
\cs_new:Npn \__tl_mixed_case_char:N #1
  {
    \cs_if_exist:cTF { c__unicode_title_  #1 _tl }
      {
        \__tl_change_case_output:fwn
          { \tl_use:c { c__unicode_title_ #1 _tl } }
      }
      { \__tl_change_case_char:nN { upper } #1 }
  }
\cs_new:Npn \__tl_change_case_mixed_nl:Nnw #1
  {
    \bool_lazy_or:nnTF
      { \int_compare_p:nNn { `#1 } = { `i } }
      { \int_compare_p:nNn { `#1 } = { `I } }
      {
        \__tl_change_case_output:nwn { I }
        \__tl_change_case_mixed_nl:Nw
      }
  }
\cs_new:Npn \__tl_change_case_mixed_nl:Nw #1#2 \q_recursion_stop
  {
    \tl_if_head_is_N_type:nT {#2}
      { \__tl_change_case_mixed_nl:NNw }
    #1 #2 \q_recursion_stop
  }
\cs_new:Npn \__tl_change_case_mixed_nl:NNw #1#2#3 \q_recursion_stop
  {
    \__tl_change_case_if_expandable:NTF #2
      {
        \exp_after:wN \__tl_change_case_mixed_nl:Nw \exp_after:wN #1 #2
          #3 \q_recursion_stop
      }
      {
        \bool_lazy_and:nnTF
          { ! ( \token_if_cs_p:N #2 ) }
          {
            \bool_lazy_or_p:nn
              { \int_compare_p:nNn { `#2 } = { `j } }
              { \int_compare_p:nNn { `#2 } = { `J } }
          }
          {
            \__tl_change_case_output:nwn { J }
            #1
          }
          { #1 #2 }
        #3 \q_recursion_stop
      }
  }
\tl_new:N \l_tl_case_change_math_tl
\tl_set:Nn \l_tl_case_change_math_tl
  { $ $ \( \) }
\tl_new:N \l_tl_case_change_exclude_tl
\tl_set:Nn \l_tl_case_change_exclude_tl
  { \cite \ensuremath \label \ref }
\tl_new:N \l_tl_mixed_case_ignore_tl
\tl_set:Nx \l_tl_mixed_case_ignore_tl
  {
    ( % )
    [ % ]
    \cs_to_str:N \{ % \}
    `
    -
  }
\cs_new:Npn \tl_rand_item:n #1
  {
    \tl_if_blank:nF {#1}
      { \tl_item:nn {#1} { \int_rand:nn { 1 } { \tl_count:n {#1} } } }
  }
\cs_new:Npn \tl_rand_item:N { \exp_args:No \tl_rand_item:n }
\cs_generate_variant:Nn \tl_rand_item:N { c }
\cs_new:Npn \tl_range:Nnn { \exp_args:No \tl_range:nnn }
\cs_generate_variant:Nn \tl_range:Nnn { c }
\cs_new:Npn \tl_range:nnn #1#2#3
  {
    \tl_head:f
      {
        \exp_args:Nf \__tl_range:nnnw { \tl_count:n {#1} } {#2} {#3}
        #1
      }
  }
\cs_new:Npn \__tl_range:nnnw #1#2#3
  {
    \exp_args:Nff \__tl_range:nnw
      {
        \exp_args:Nf \__tl_range_normalize:nn
          { \int_eval:n { #2 - 1 } } {#1}
      }
      {
        \exp_args:Nf \__tl_range_normalize:nn
          { \int_eval:n {#3} } {#1}
      }
  }
\cs_new:Npn \__tl_range:nnw #1#2
  {
    \if_int_compare:w #2 > #1 \exp_stop_f: \else:
      \exp_after:wN { \exp_after:wN }
    \fi:
    \exp_after:wN \__tl_range_collect:w
    \__int_value:w \__int_eval:w #2 - #1 \exp_after:wN ;
    \exp_after:wN { \exp_after:wN }
    \exp:w \__tl_range_skip:w #1 ; { }
  }
\cs_new:Npn \__tl_range_skip:w #1 ; #2
  {
    \if_int_compare:w #1 > 0 \exp_stop_f:
      \exp_after:wN \__tl_range_skip:w
      \__int_value:w \__int_eval:w #1 - 1 \exp_after:wN ;
    \else:
      \exp_after:wN \exp_end:
    \fi:
  }
\cs_new:Npn \__tl_range_collect:w #1 ; #2#3
  {
    \if_int_compare:w #1 > 1 \exp_stop_f:
      \exp_after:wN \__tl_range_collect:w
      \__int_value:w \__int_eval:w #1 - 1 \exp_after:wN ;
    \fi:
    { #2 {#3} }
  }
\cs_new:Npn \__tl_range_normalize:nn #1#2
  {
    \int_eval:n
      {
        \if_int_compare:w #1 < 0 \exp_stop_f:
          \if_int_compare:w #1 < -#2 \exp_stop_f:
            0
          \else:
            #1 + #2 + 1
          \fi:
        \else:
          \if_int_compare:w #1 < #2 \exp_stop_f:
            #1
          \else:
            #2
          \fi:
        \fi:
      }
  }
\group_begin:
  \cs_set_protected:Npn \__peek_tmp:w #1 \q_stop
    {
      \cs_new_protected:Npn \__peek_execute_branches_N_type:
        {
          \if_int_odd:w
              \if_catcode:w \exp_not:N \l_peek_token {   0 \exp_stop_f: \fi:
              \if_catcode:w \exp_not:N \l_peek_token }   0 \exp_stop_f: \fi:
              \if_meaning:w \l_peek_token \c_space_token 0 \exp_stop_f: \fi:
              1 \exp_stop_f:
            \exp_after:wN \__peek_N_type:w
              \token_to_meaning:N \l_peek_token
              \q_mark \__peek_N_type_aux:nnw
              #1 \q_mark \use_none_delimit_by_q_stop:w
              \q_stop
            \exp_after:wN \__peek_true:w
          \else:
            \exp_after:wN \__peek_false:w
          \fi:
        }
      \cs_new_protected:Npn \__peek_N_type:w ##1 #1 ##2 \q_mark ##3
        { ##3 {##1} {##2} }
    }
  \exp_after:wN \__peek_tmp:w \tl_to_str:n { outer } \q_stop
\group_end:
\cs_new_protected:Npn \__peek_N_type_aux:nnw #1 #2 #3 \fi:
  {
    \fi:
    \tl_if_in:noTF {#1} { \tl_to_str:n {ma} }
      { \__peek_true:w }
      { \tl_if_empty:nTF {#2} { \__peek_true:w } { \__peek_false:w } }
  }
\cs_new_protected:Npn \peek_N_type:TF
  { \__peek_token_generic:NNTF \__peek_execute_branches_N_type: \scan_stop: }
\cs_new_protected:Npn \peek_N_type:T
  { \__peek_token_generic:NNT \__peek_execute_branches_N_type: \scan_stop: }
\cs_new_protected:Npn \peek_N_type:F
  { \__peek_token_generic:NNF \__peek_execute_branches_N_type: \scan_stop: }
%% File: l3luatex.dtx Copyright (C) 2010-2017 The LaTeX3 Project
\cs_new:Npn \lua_now_x:n #1 { \luatex_directlua:D {#1} }
\cs_new:Npn \lua_now:n #1   { \lua_now_x:n { \exp_not:n {#1} } }
\cs_new_protected:Npn \lua_shipout_x:n #1 { \luatex_latelua:D {#1} }
\cs_new_protected:Npn \lua_shipout:n #1
  { \lua_shipout_x:n { \exp_not:n {#1} } }
\cs_new:Npn \lua_escape_x:n #1 { \luatex_luaescapestring:D {#1} }
\cs_new:Npn \lua_escape:n #1 { \lua_escape_x:n { \exp_not:n {#1} } }
\sys_if_engine_luatex:F
  {
    \clist_map_inline:nn
      { \lua_now_x:n , \lua_now:n , \lua_escape_x:n , \lua_escape:n }
      {
        \cs_set:Npn #1 ##1
          {
            \__msg_kernel_expandable_error:nnn
              { kernel } { luatex-required } { #1 }
          }
      }
    \clist_map_inline:nn
      { \lua_shipout_x :n , \lua_shipout:n }
      {
        \cs_set_protected:Npn #1 ##1
          {
            \__msg_kernel_error:nnn
              { kernel } { luatex-required } { #1 }
          }
      }
  }
\__msg_kernel_new:nnnn { kernel } { luatex-required }
  { LuaTeX~engine~not~in~use!~Ignoring~#1. }
  {
    The~feature~you~are~using~is~only~available~
    with~the~LuaTeX~engine.~LaTeX3~ignored~'#1'.
  }
%% 
%%
%% End of file `expl3-code.tex'.
