texlive[47705] Master/texmf-dist: l3 (13may18)

commits+karl at tug.org commits+karl at tug.org
Sun May 13 23:56:48 CEST 2018


Revision: 47705
          http://tug.org/svn/texlive?view=revision&revision=47705
Author:   karl
Date:     2018-05-13 23:56:47 +0200 (Sun, 13 May 2018)
Log Message:
-----------
l3 (13may18)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
    trunk/Master/texmf-dist/doc/latex/l3packages/README.md
    trunk/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf
    trunk/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf
    trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
    trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
    trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
    trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty

Added Paths:
-----------
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2018-05-13 21:56:47 UTC (rev 47705)
@@ -1,7 +1,7 @@
 Experimental LaTeX3 Concepts
 ============================
 
-Release 2018-04-30
+Release 2018-05-12
 
 Overview
 --------

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3color/l3color.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2018-05-13 21:56:47 UTC (rev 47705)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2018-04-30
+Release 2018-05-12
 
 Overview
 --------

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3obsolete.txt	2018-05-13 21:56:47 UTC (rev 47705)
@@ -15,11 +15,35 @@
 --------------------------------------
 Function                   Expires end
 --------------------------------------
-\c_minus_one                      2018
 \box_resize:cnn                   2018
 \box_resize:Nnn                   2018
 \box_use_clear:c                  2018
 \box_use_clear:N                  2018
+\c_minus_one                      2018
+\c_zero                           2019
+\c_one                            2019
+\c_two                            2019
+\c_three                          2019
+\c_four                           2019
+\c_five                           2019
+\c_six                            2019
+\c_seven                          2019
+\c_eight                          2019
+\c_nine                           2019
+\c_ten                            2019
+\c_eleven                         2019
+\c_twelve                         2019
+\c_thirteen                       2019
+\c_fourteen                       2019
+\c_fifteen                        2019
+\c_sixteen                        2019
+\c_thirty_two                     2019
+\c_one_hundred                    2019
+\c_two_hundred_fifty_five         2019
+\c_two_hundred_fifty_six          2019
+\c_one_thousand                   2019
+\c_ten_thousand                   2019
+\etex_....:D                      2019
 \file_add_path:nN                 2018
 \file_list:                       2018
 \file_path_include:n              2018
@@ -29,13 +53,19 @@
 \ior_log_streams:                 2018
 \iow_list_streams:                2018
 \iow_log_streams:                 2018
+\luatex_...:D                     2019
+\pdftex_...:D                     2019
+\ptex_...:D                       2019
 \sort_ordered:                    2018
 \sort_reversed:                   2018
 \tl_show_analysis:N               2019
 \tl_show_analysis:n               2019
 \token_new:Nn                     2018
+\uptex_...:D                      2019
+\utex_...:D                       2019
 Variants of n into N/c            2018
 Variants of N into n/o/V/v/f/x    2018
+\xetex_...:D                      2019
 --------------------------------------
 
 Removed functions and variables

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2018-05-13 21:56:47 UTC (rev 47705)
@@ -427,6 +427,7 @@
 \DocInput{l3file.dtx}
 \DocInput{l3skip.dtx}
 \DocInput{l3keys.dtx}
+\DocInput{l3intarray.dtx}
 \DocInput{l3fp.dtx}
 % To get the various submodules of l3fp to appear in the implementation
 % part only, they have to be added to the documentation list after typesetting
@@ -449,7 +450,7 @@
   }
 \ExplSyntaxOff
 
-\DocInput{l3intarray.dtx}
+\DocInput{l3fparray.dtx}
 \DocInput{l3sort.dtx}
 \DocInput{l3tl-analysis.dtx}
 \DocInput{l3regex.dtx}

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/doc/latex/l3packages/README.md	2018-05-13 21:56:47 UTC (rev 47705)
@@ -1,7 +1,7 @@
 LaTeX3 High-Level Concepts
 ==========================
 
-Release 2018-04-30
+Release 2018-05-12
 
 Overview
 --------

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/xfp/xfp.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -263,7 +263,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3color}{2018-04-30}{}
+\ProvidesExplPackage{l3color}{2018-05-12}{}
   {L3 Experimental color support}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -109,7 +109,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -1106,7 +1106,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3draw}{2018-04-30}{}
+\ProvidesExplPackage{l3draw}{2018-05-12}{}
   {L3 Experimental core drawing support}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -234,7 +234,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3str-convert}{2018-04-30}{}
+\ProvidesExplPackage{l3str-convert}{2018-05-12}{}
   {L3 Experimental string encoding conversions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -162,7 +162,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3str-format}{2018-04-30}{}
+\ProvidesExplPackage{l3str-format}{2018-05-12}{}
   {L3 Experimental string formatting}
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -54,7 +54,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -673,7 +673,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2018-04-30}{}
+\ProvidesExplPackage{xcoffins}{2018-05-12}{}
   {L3 Experimental design level coffins}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -59,7 +59,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -685,7 +685,7 @@
 %
 %    \begin{macrocode}
 %<*package>
-\ProvidesExplPackage{l3galley}{2018-04-30}{}
+\ProvidesExplPackage{l3galley}{2018-05-12}{}
   {L3 Experimental galley code}
 %</package>
 %    \end{macrocode}
@@ -993,7 +993,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_initialise_variables:
   {
-    \int_set:Nn \l_@@_group_level_int { \etex_currentgrouplevel:D }
+    \int_set:Nn \l_@@_group_level_int { \tex_currentgrouplevel:D }
     \bool_gset_true:N \g_@@_begin_level_bool
     \bool_gset_false:N \g_@@_cutout_active_bool
     \seq_gclear:N \g_@@_cutout_left_seq
@@ -1182,7 +1182,7 @@
 %    \end{macrocode}
 %   No marker, so really insert a paragraph: the \cs{tex_par:D} is inside a
 %   group to preserve some dynamic settings (for example
-%   \cs{etex_interlinepenalties:D}). In vertical mode, that means just
+%   \cs{tex_interlinepenalties:D}). In vertical mode, that means just
 %   inserting the primitive.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_par_auxii:
@@ -1264,7 +1264,7 @@
           }
         \@@_parshape_set:
       }
-    \int_compare:nNnT \l_@@_group_level_int = \etex_currentgrouplevel:D
+    \int_compare:nNnT \l_@@_group_level_int = \tex_currentgrouplevel:D
       {
         \bool_lazy_and:nnT
           { \seq_if_empty_p:N \g_@@_cutout_left_seq }
@@ -2014,8 +2014,8 @@
       { \galley_vspace_set_single:n {#1} }
       {
         \dim_compare:nNnT
-          { \etex_glueexpr:D \g_@@_interpar_vspace_user_tl } 
-            < { \etex_glueexpr:D (#1) \scan_stop: }
+          { \tex_glueexpr:D \g_@@_interpar_vspace_user_tl } 
+            < { \tex_glueexpr:D (#1) \scan_stop: }
           { \galley_vspace_set_single:n {#1} }
       }
   }
@@ -2063,7 +2063,7 @@
 % \begin{variable}{\l_galley_last_line_fit_int}
 %   One from \eTeX{}.
 %    \begin{macrocode}
-\cs_new_eq:NN \l_galley_last_line_fit_int \etex_lastlinefit:D
+\cs_new_eq:NN \l_galley_last_line_fit_int \tex_lastlinefit:D
 %    \end{macrocode}
 % \end{variable}
 %
@@ -2224,7 +2224,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \galley_display_widow_penalties_set:n #1
   {
-    \etex_displaywidowpenalties:D
+    \tex_displaywidowpenalties:D
       \int_eval:n { \clist_count:n {#1} + 1 } \exp_stop_f:
       \clist_map_function:nN {#1} \@@_set_aux:n
       0 \exp_stop_f:
@@ -2232,7 +2232,7 @@
 \cs_generate_variant:Nn \galley_display_widow_penalties_set:n { V , v }
 \cs_new_protected:Npn \galley_widow_penalties_set:n #1
   {
-    \etex_widowpenalties:D
+    \tex_widowpenalties:D
       \int_eval:n { \clist_count:n {#1} + 1 } \exp_stop_f:
       \clist_map_function:nN {#1} \@@_set_aux:n
       0 \exp_stop_f:
@@ -2283,7 +2283,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \galley_display_club_penalties_set:n #1
   {
-    \etex_clubpenalties:D
+    \tex_clubpenalties:D
       \int_eval:n { \clist_count:n {#1} + 1 } \exp_stop_f:
       \clist_map_function:nN {#1} \@@_set_aux:n
       0 \exp_stop_f:
@@ -2305,13 +2305,13 @@
 %   penalty is removed and the new one is added. If there is currently
 %   no shape set, then after adding the general interline value the
 %   generic build system is invoked (in case the
-%   \cs{etex_interlinepenalties:D} has accidentally been cleared).
+%   \cs{tex_interlinepenalties:D} has accidentally been cleared).
 %    \begin{macrocode}
 \cs_new_protected:Npn \galley_interline_penalty_set:n #1
   {
-    \int_compare:nNnTF { \etex_interlinepenalties:D 0 } = 0
+    \int_compare:nNnTF { \tex_interlinepenalties:D 0 } = 0
       {
-        \etex_interlinepenalties:D 1 = \int_eval:n {#1} \exp_stop_f:
+        \tex_interlinepenalties:D 1 = \int_eval:n {#1} \exp_stop_f:
         \@@_calc_interline_penalties:
       }
       {
@@ -2319,8 +2319,8 @@
           {
             \int_eval:n
               {
-                \etex_interlinepenalties:D ##1
-                - \etex_interlinepenalties:D \etex_interlinepenalties:D 0
+                \tex_interlinepenalties:D ##1
+                - \tex_interlinepenalties:D \tex_interlinepenalties:D 0
                 + #1
               }
               \exp_stop_f:
@@ -2331,16 +2331,16 @@
   }
 \cs_new_protected:Npn \@@_set_interline_penalty:nn #1#2
   {
-    \etex_interlinepenalties:D
-      \etex_interlinepenalties:D 0 \exp_stop_f:
+    \tex_interlinepenalties:D
+      \tex_interlinepenalties:D 0 \exp_stop_f:
       \int_step_function:nN {#1}
         \@@_set_interline_penalty_auxi:n
-      \int_step_function:nnN { #1 + 1 } { \etex_interlinepenalties:D 0 - 1 }
+      \int_step_function:nnN { #1 + 1 } { \tex_interlinepenalties:D 0 - 1 }
         \@@_set_interline_penalty_auxii:n
       \int_eval:n {#2} \exp_stop_f:
   }
 \cs_new:Npn \@@_set_interline_penalty_auxi:n #1
-  { \etex_interlinepenalties:D \int_eval:n {#1} \exp_stop_f: }
+  { \tex_interlinepenalties:D \int_eval:n {#1} \exp_stop_f: }
 \cs_new:Npn \@@_set_interline_penalty_auxii:n #1 { }
 %    \end{macrocode}
 % \end{macro}
@@ -2370,7 +2370,7 @@
           {
             \int_max:nn
               { \clist_count:N \l_galley_line_penalties_clist + 1 }
-              { \etex_clubpenalties:D 0 }
+              { \tex_clubpenalties:D 0 }
           }
       }
       { \clist_count:N \l_galley_line_penalties_clist }
@@ -2383,12 +2383,12 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_calc_interline_penalties:nn #1#2
   {
-    \etex_interlinepenalties:D #1 ~
+    \tex_interlinepenalties:D #1 ~
       \int_step_function:nN {#2}
         \@@_calc_interline_penalties_auxi:n
       \int_step_function:nnN { #2 + 1 } { #1 - 1 }
         \@@_calc_interline_penalties_auxii:n
-      \etex_interlinepenalties:D \etex_interlinepenalties:D 0 \exp_stop_f:
+      \tex_interlinepenalties:D \tex_interlinepenalties:D 0 \exp_stop_f:
   }
 \cs_new:Npn \@@_calc_interline_penalties_auxi:n #1
   {
@@ -2396,7 +2396,7 @@
       {
         \clist_item:Nn \l_galley_line_penalties_clist {#1}
         + 0 \clist_item:Nn \l_galley_club_penalties_clist {#1}
-        - \etex_clubpenalties:D #1 ~
+        - \tex_clubpenalties:D #1 ~
       }
       \exp_stop_f:
   }
@@ -2404,9 +2404,9 @@
   {
     \int_eval:n
       {
-        \etex_interlinepenalties:D \etex_interlinepenalties:D 0 \exp_stop_f:
+        \tex_interlinepenalties:D \tex_interlinepenalties:D 0 \exp_stop_f:
         + 0 \clist_item:Nn \l_galley_club_penalties_clist {#1}
-        - \etex_clubpenalties:D #1 ~
+        - \tex_clubpenalties:D #1 ~
       }
       \exp_stop_f:
   }
@@ -2445,23 +2445,23 @@
   {
     \clist_set:Nx #1
       {
-        \int_step_function:nN { \etex_clubpenalties:D 0 - 1 }
+        \int_step_function:nN { \tex_clubpenalties:D 0 - 1 }
           \@@_save_display_club_penalties:n
       }
   }
 \cs_new:Npn \@@_save_display_club_penalties:n #1
-  { \int_value:w \etex_clubpenalties:D \int_eval:n {#1} , }
+  { \int_value:w \tex_clubpenalties:D \int_eval:n {#1} , }
 \cs_new_protected:Npn \galley_save_display_widow_penalties:N #1
   {
     \clist_set:Nx #1
       {
-        \int_step_function:nN { \etex_displaywidowpenalties:D 0 - 1 }
+        \int_step_function:nN { \tex_displaywidowpenalties:D 0 - 1 }
           \@@_save_display_widow_penalties:n
       }
   }
 \cs_new:Npn \@@_save_display_widow_penalties:n #1
   {
-    \int_value:w \etex_displaywidowpenalties:D
+    \int_value:w \tex_displaywidowpenalties:D
       \int_eval:n {#1} ,
   }
 \cs_new_protected:Npn \galley_save_widow_penalties:N #1
@@ -2468,12 +2468,12 @@
   {
     \clist_set:Nx #1
       {
-        \int_step_function:nN { \etex_widowpenalties:D 0 - 1 }
+        \int_step_function:nN { \tex_widowpenalties:D 0 - 1 }
           \@@_save_widow_penalties:n
       }
   }
 \cs_new:Npn \@@_save_widow_penalties:n #1
-  { \int_value:w \etex_widowpenalties:D \int_eval:n {#1} , }
+  { \int_value:w \tex_widowpenalties:D \int_eval:n {#1} , }
 %    \end{macrocode}
 %   This one is not an array, but is stored in a primitive, so there is
 %   a simple conversion. The general interline penalty is always the
@@ -2480,7 +2480,7 @@
 %   last value in the primitive array.
 %    \begin{macrocode}
 \cs_new_protected:Npn \galley_interline_penalty:
-  { \int_value:w \etex_interlinepenalties:D \etex_interlinepenalties:D 0 \exp_stop_f: }
+  { \int_value:w \tex_interlinepenalties:D \tex_interlinepenalties:D 0 \exp_stop_f: }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -45,7 +45,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -732,7 +732,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2018-04-30}{}
+\ProvidesExplPackage{xgalley}{2018-05-12}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -921,8 +921,8 @@
 % which are constructed using macros as the underlying storage system. The
 % \texttt{check-declarations} option enables checking for all variable
 % assignments, issuing an error if any variables are assigned without being
-% initialised.
-% See also \cs{debug_on:n} \texttt{\{check-declarations\}} for finer control.
+% initialised.  See also \cs{debug_on:n} \texttt{\{check-declarations\}}
+% in \pkg{l3candidates} for finer control.
 %
 % \DescribeOption{log-functions}
 % The \texttt{log-functions} option is used to enable recording of every new
@@ -929,8 +929,8 @@
 % function name in the \texttt{.log} file. This is useful for debugging
 % purposes, as it means that there is a complete list of all functions
 % created by each module loaded (with the exceptions of a very small number
-% required by the bootstrap code for \LaTeX3).
-% See also \cs{debug_on:n} \texttt{\{log-functions\}} for finer control.
+% required by the bootstrap code for \LaTeX3).  See also \cs{debug_on:n}
+% \texttt{\{log-functions\}} in \pkg{l3candidates} for finer control.
 %
 % \DescribeOption{enable-debug}
 % To allow more localized checking and logging than provided by
@@ -993,13 +993,14 @@
 % Any engine which defines |\pdfoutput| (\emph{i.e.}~allows direct production
 % of a PDF file without a DVI intermediate) must also provide |\pdfcolorstack|,
 % |\pdfliteral|, |\pdfmatrix|, |\pdfrestore| and |\pdfsave| or equivalent
-% functionality.
+% functionality. Fully Unicode engines must provide a method for producing
+% character tokens in an expandable manner.
 %
 % Practically, these requirements are met by the engines
 % \begin{itemize}
 %    \item \pdfTeX{} v1.40 or later.
-%    \item \XeTeX{} v0.9994 or later.
-%    \item \LuaTeX{} v0.70 or later.
+%    \item \XeTeX{} v0.99992 or later.
+%    \item \LuaTeX{} v0.76 or later.
 %    \item e-(u)\pTeX{} mid-2012 or later.
 % \end{itemize}
 %
@@ -1732,8 +1733,8 @@
     { xdvipdfmx }
     {
       \bool_lazy_and:nnTF
-        { \cs_if_exist_p:N  \pdftex_pdfoutput:D }
-        { \int_compare_p:nNn \pdftex_pdfoutput:D > 0 }
+        { \cs_if_exist_p:N  \tex_pdfoutput:D }
+        { \int_compare_p:nNn \tex_pdfoutput:D > 0 }
         { pdfmode }
         { dvips }
     }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3.ins	2018-05-13 21:56:47 UTC (rev 47705)
@@ -78,6 +78,7 @@
         \from{l3file.dtx}       {package}
         \from{l3skip.dtx}       {package}
         \from{l3keys.dtx}       {package}
+        \from{l3intarray.dtx}   {package}
         \from{l3fp.dtx}         {package}
         \from{l3fp-aux.dtx}     {package}
         \from{l3fp-traps.dtx}   {package}
@@ -91,7 +92,7 @@
         \from{l3fp-trig.dtx}    {package}
         \from{l3fp-convert.dtx} {package}
         \from{l3fp-random.dtx}  {package}
-        \from{l3intarray.dtx}   {package}
+        \from{l3fparray.dtx}    {package}
         \from{l3sort.dtx}       {package}
         \from{l3tl-analysis.dtx}{package}
         \from{l3regex.dtx}      {package}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -124,7 +124,7 @@
 %   At present there are no \pkg{expl3} allocators for these concepts so the
 %   names and numbers of the tracking variables may change.
 %    \begin{macrocode}
-\etex_ifdefined:D \luatex_luatexversion:D
+\tex_ifdefined:D \tex_luatexversion:D
   \tex_global:D \tex_countdef:D \g_@@_attribute_int  = 21 ~
   \tex_global:D \tex_countdef:D \g_@@_bytecode_int   = 22 ~
   \tex_global:D \tex_countdef:D \g_@@_chunkname_int  = 23 ~
@@ -141,7 +141,7 @@
 \cs_new_protected:Npx \box_new:N #1
   {
     \exp_not:N \@@_reg:nNnN { box }
-      \cs_if_exist:NTF \luatex_luatexversion:D
+      \cs_if_exist:NTF \tex_luatexversion:D
         { \tex_chardef:D }
         { \tex_mathchardef:D }
       \c_max_register_int

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -1203,7 +1203,7 @@
 \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 \reverse_if:N       \tex_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
@@ -1230,8 +1230,8 @@
 % \begin{macro}[EXP]{\if_cs_exist:N, \if_cs_exist:w, \cs:w, \cs_end:}
 %   Building csnames and testing if control sequences exist.
 %    \begin{macrocode}
-\tex_let:D \if_cs_exist:N      \etex_ifdefined:D
-\tex_let:D \if_cs_exist:w      \etex_ifcsname:D
+\tex_let:D \if_cs_exist:N      \tex_ifdefined:D
+\tex_let:D \if_cs_exist:w      \tex_ifcsname:D
 \tex_let:D \cs:w               \tex_csname:D
 \tex_let:D \cs_end:            \tex_endcsname:D
 %    \end{macrocode}
@@ -1243,7 +1243,7 @@
 %    \begin{macrocode}
 \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_not:n          \tex_unexpanded:D
 \tex_let:D \exp:w              \tex_romannumeral:D
 \tex_chardef:D \exp_end:  = 0 ~
 %    \end{macrocode}
@@ -1260,9 +1260,9 @@
 % \begin{macro}[EXP]{\tl_to_str:n, \token_to_str:N, \__kernel_tl_to_str:w}
 %   Making strings.
 %    \begin{macrocode}
-\tex_let:D \tl_to_str:n          \etex_detokenize:D
+\tex_let:D \tl_to_str:n          \tex_detokenize:D
 \tex_let:D \token_to_str:N       \tex_string:D
-\tex_let:D \__kernel_tl_to_str:w \etex_detokenize:D
+\tex_let:D \__kernel_tl_to_str:w \tex_detokenize:D
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1332,8 +1332,8 @@
 %
 % \subsection{Defining some constants}
 %
-% \begin{variable}{\c_zero}
-%   We need the constant \cs{c_zero}
+% \begin{variable}{\c_zero_int}
+%   We need the constant \cs{c_zero_int}
 %   which is used by some functions in the \textsf{l3alloc} module. The
 %   rest are defined in the \textsf{l3int} module -- at least for the
 %   ones that can be defined with \cs{tex_chardef:D} or
@@ -1341,7 +1341,7 @@
 %   required but it can't be used until the allocation has been set
 %   up properly!
 %    \begin{macrocode}
-\tex_chardef:D \c_zero    = 0 ~
+\tex_chardef:D \c_zero_int    = 0 ~
 %    \end{macrocode}
 % \end{variable}
 %
@@ -1349,7 +1349,7 @@
 %   This is here as this particular integer is needed both in package
 %   mode and to bootstrap \pkg{l3alloc}, and is documented in \pkg{l3int}.
 %    \begin{macrocode}
-\etex_ifdefined:D \luatex_luatexversion:D
+\tex_ifdefined:D \tex_luatexversion:D
   \tex_chardef:D \c_max_register_int = 65 535 ~
 \tex_else:D
   \tex_mathchardef:D \c_max_register_int = 32 767 ~
@@ -1375,18 +1375,18 @@
 %    \begin{macrocode}
 \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_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_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_protected:D \tex_long:D \tex_def:D \cs_set_protected_nopar:Npn
+  { \tex_protected:D \tex_def:D }
+\tex_protected:D \tex_long:D \tex_def:D \cs_set_protected_nopar:Npx
+  { \tex_protected:D \tex_edef:D }
+\tex_protected:D \tex_long:D \tex_def:D \cs_set_protected:Npn
+  { \tex_protected:D \tex_long:D \tex_def:D }
+\tex_protected:D \tex_long:D \tex_def:D \cs_set_protected:Npx
+  { \tex_protected:D \tex_long:D \tex_edef:D }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1406,13 +1406,13 @@
 \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 }
+  { \tex_protected:D \tex_gdef:D }
 \cs_set_protected:Npn \cs_gset_protected_nopar:Npx
-  { \etex_protected:D \tex_xdef:D }
+  { \tex_protected:D \tex_xdef:D }
 \cs_set_protected:Npn \cs_gset_protected:Npn
-  { \etex_protected:D \tex_long:D \tex_gdef:D }
+  { \tex_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 }
+  { \tex_protected:D \tex_long:D \tex_xdef:D }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1458,7 +1458,7 @@
 %   A candidate, but needed early as it links to string comparisons.
 %   Currently \LuaTeX-only.
 %    \begin{macrocode}
-\cs_set:Npn \use_x:n #1 { \luatex_expanded:D {#1} }
+\cs_set:Npn \use_x:n #1 { \tex_expanded:D {#1} }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1592,7 +1592,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\debug_on:n, \debug_off:n}
+% \begin{macro}{\debug_on:n, \debug_off:n, \@@_all_on:, \@@_all_off:}
 %
 %    \begin{macrocode}
 \__kernel_if_debug:TF
@@ -1613,6 +1613,26 @@
               { \__kernel_msg_error:nnn { kernel } { debug } {##1} }
           }
       }
+    \cs_set_protected:Npn \@@_all_on:
+      {
+        \debug_on:n
+          {
+            check-declarations ,
+            check-expressions ,
+            deprecation ,
+            log-functions ,
+          }
+      }
+    \cs_set_protected:Npn \@@_all_off:
+      {
+        \debug_off:n
+          {
+            check-declarations ,
+            check-expressions ,
+            deprecation ,
+            log-functions ,
+          }
+      }
   }
   {
     \cs_set_protected:Npn \debug_on:n #1
@@ -1815,7 +1835,7 @@
 %   to convert to integer) before it encounters the final
 %   \cs{tex_relax:D}.  Since \cs{tex_romannumeral:D} does not absorb
 %   \cs{tex_relax:D} the output will be nonempty.  Note that |#3| is
-%   empty except for mu expressions for which it is \cs{etex_mutoglue:D}
+%   empty except for mu expressions for which it is \cs{tex_mutoglue:D}
 %   to avoid an \enquote{incompatible glue units} error.  Note also that
 %   if we had omitted the first \cs{tex_relax:D} then for instance
 %   |1+2\relax+3| would incorrectly be accepted as a valid integer
@@ -2131,7 +2151,7 @@
 %     \prg_set_protected_conditional:Npnn ,
 %     \prg_new_protected_conditional:Npnn ,
 %   }
-% \begin{macro}{\@@_generate_conditional_parm:nnNpnn}
+% \begin{macro}{\@@_generate_conditional_parm:NNNpnn}
 %   The user functions for the types using parameter text from the
 %   programmer. The various functions only differ by which function is
 %   used for the assignment. For those |Npnn| type functions, we must
@@ -2141,23 +2161,24 @@
 %   \Arg{set~or~new} \Arg{maybe~protected} \Arg{parameters} |{TF,...}|
 %   \Arg{code} to the auxiliary function responsible for defining all
 %   conditionals.
+%   Note that |e| stands for expandable and |p| for protected.
 %    \begin{macrocode}
 \cs_set_protected:Npn \prg_set_conditional:Npnn
-  { \@@_generate_conditional_parm:nnNpnn { set } { } }
+  { \@@_generate_conditional_parm:NNNpnn \cs_set:Npn e }
 \cs_set_protected:Npn \prg_new_conditional:Npnn
-  { \@@_generate_conditional_parm:nnNpnn { new } { } }
+  { \@@_generate_conditional_parm:NNNpnn \cs_new:Npn e }
 \cs_set_protected:Npn \prg_set_protected_conditional:Npnn
-  { \@@_generate_conditional_parm:nnNpnn { set } { _protected } }
+  { \@@_generate_conditional_parm:NNNpnn \cs_set_protected:Npn p }
 \cs_set_protected:Npn \prg_new_protected_conditional:Npnn
-  { \@@_generate_conditional_parm:nnNpnn { new } { _protected } }
-\cs_set_protected:Npn \@@_generate_conditional_parm:nnNpnn #1#2#3#4#
+  { \@@_generate_conditional_parm:NNNpnn \cs_new_protected:Npn p }
+\cs_set_protected:Npn \@@_generate_conditional_parm:NNNpnn #1#2#3#4#
   {
     \use:x
       {
-        \@@_generate_conditional:nnNnnnnn
+        \@@_generate_conditional:nnNNNnnn
           \cs_split_function:N #3
       }
-      {#1} {#2} {#4}
+      #1 #2 {#4}
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2172,8 +2193,8 @@
 %   }
 % \begin{macro}
 %   {
-%     \@@_generate_conditional_count:nnNnn ,
-%     \@@_generate_conditional_count:nnNnnnn
+%     \@@_generate_conditional_count:NNNnn ,
+%     \@@_generate_conditional_count:nnNNNnn
 %   }
 %   The user functions for the types automatically inserting the correct
 %   parameter text based on the signature. The various functions only
@@ -2189,26 +2210,26 @@
 %   later.
 %    \begin{macrocode}
 \cs_set_protected:Npn \prg_set_conditional:Nnn
-  { \@@_generate_conditional_count:nnNnn { set } { } }
+  { \@@_generate_conditional_count:NNNnn \cs_set:Npn e }
 \cs_set_protected:Npn \prg_new_conditional:Nnn
-  { \@@_generate_conditional_count:nnNnn { new } { } }
+  { \@@_generate_conditional_count:NNNnn \cs_new:Npn e }
 \cs_set_protected:Npn \prg_set_protected_conditional:Nnn
-  { \@@_generate_conditional_count:nnNnn { set } { _protected } }
+  { \@@_generate_conditional_count:NNNnn \cs_set_protected:Npn p }
 \cs_set_protected:Npn \prg_new_protected_conditional:Nnn
-  { \@@_generate_conditional_count:nnNnn { new } { _protected } }
-\cs_set_protected:Npn \@@_generate_conditional_count:nnNnn #1#2#3
+  { \@@_generate_conditional_count:NNNnn \cs_new_protected:Npn p }
+\cs_set_protected:Npn \@@_generate_conditional_count:NNNnn #1#2#3
   {
     \use:x
       {
-        \@@_generate_conditional_count:nnNnnnn
+        \@@_generate_conditional_count:nnNNNnn
         \cs_split_function:N #3
       }
-      {#1} {#2}
+      #1 #2
   }
-\cs_set_protected:Npn \@@_generate_conditional_count:nnNnnnn #1#2#3#4#5
+\cs_set_protected:Npn \@@_generate_conditional_count:nnNNNnn #1#2#3#4#5
   {
     \__kernel_cs_parm_from_arg_count:nnF
-      { \@@_generate_conditional:nnNnnnnn {#1} {#2} #3 {#4} {#5} }
+      { \@@_generate_conditional:nnNNNnnn {#1} {#2} #3 #4 #5 }
       { \tl_count:n {#2} }
       {
         \__kernel_msg_error:nnxx { kernel } { bad-number-of-arguments }
@@ -2223,8 +2244,10 @@
 %
 % \begin{macro}
 %   {
-%     \@@_generate_conditional:nnNnnnnn,
-%     \@@_generate_conditional:nnnnnnw
+%     \@@_generate_conditional:nnNNNnnn,
+%     \@@_generate_conditional:NNnnnnNw,
+%     \@@_generate_conditional_test:w,
+%     \@@_generate_conditional_fast:nw,
 %   }
 %   The workhorse here is going through a list of desired forms, \emph{i.e.},
 %   |p|, |TF|, |T| and |F|. The first three arguments come from splitting up
@@ -2236,8 +2259,15 @@
 %   empty), the seventh is the list of forms to define, the eighth is the
 %   replacement text which we will augment when defining the forms.
 %   The use of \cs{tl_to_str:n} makes the later loop more robust.
+%
+%   A large number of our low-level conditionals look like \meta{code}
+%   \cs{prg_return_true:} \cs{else:} \cs{prg_return_false:} \cs{fi:} so
+%   we optimize this special case by calling
+%   \cs{@@_generate_conditional_fast:nw} \Arg{code}.  This passes
+%   \cs{use_i:nn} instead of \cs{use_i_ii:nnn} to functions such as
+%   \cs{@@_generate_p_form:wNNnnnnN}.
 %    \begin{macrocode}
-\cs_set_protected:Npn \@@_generate_conditional:nnNnnnnn #1#2#3#4#5#6#7#8
+\cs_set_protected:Npn \@@_generate_conditional:nnNNNnnn #1#2#3#4#5#6#7#8
   {
     \if_meaning:w \c_false_bool #3
       \__kernel_msg_error:nnx { kernel } { missing-colon }
@@ -2246,12 +2276,23 @@
     \fi:
     \use:x
       {
-        \exp_not:N \@@_generate_conditional:nnnnnnw
-        \exp_not:n { {#4} {#5} {#1} {#2} {#6} {#8} }
+        \exp_not:N \@@_generate_conditional:NNnnnnNw
+        \exp_not:n { #4 #5 {#1} {#2} {#6} }
+        \@@_generate_conditional_test:w
+          #8 \q_mark
+            \@@_generate_conditional_fast:nw
+          \prg_return_true: \else: \prg_return_false: \fi: \q_mark
+            \use_none:n
+        \exp_not:n { {#8} \use_i_ii:nnn }
         \tl_to_str:n {#7}
         \exp_not:n { , \q_recursion_tail , \q_recursion_stop }
       }
   }
+\cs_set:Npn \@@_generate_conditional_test:w
+    #1 \prg_return_true: \else: \prg_return_false: \fi: \q_mark #2
+  { #2 {#1} }
+\cs_set:Npn \@@_generate_conditional_fast:nw #1#2 \exp_not:n #3
+  { \exp_not:n { {#1} \use_i:nn } }
 %    \end{macrocode}
 %   Looping through the list of desired forms.  First are six arguments
 %   and seventh is the form.  Use the form to call the
@@ -2258,25 +2299,25 @@
 %   correct type.  If the form does not exist, the \cs{use:c}
 %   construction results in \tn{relax}, and the error message is
 %   displayed (unless the form is empty, to allow for |{T, , F}|),
-%   then \cs{use_none:nnnnnnn} cleans up.  Otherwise, the
+%   then \cs{use_none:nnnnnnnn} cleans up.  Otherwise, the
 %   error message is removed by the variant form.
 %    \begin{macrocode}
-\cs_set_protected:Npn \@@_generate_conditional:nnnnnnw #1#2#3#4#5#6#7 ,
+\cs_set_protected:Npn \@@_generate_conditional:NNnnnnNw #1#2#3#4#5#6#7#8 ,
   {
-    \if_meaning:w \q_recursion_tail #7
+    \if_meaning:w \q_recursion_tail #8
       \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
     \fi:
-    \use:c { @@_generate_ #7 _form:wnnnnnn }
-        \tl_if_empty:nF {#7}
+    \use:c { @@_generate_ #8 _form:wNNnnnnN }
+        \tl_if_empty:nF {#8}
           {
             \__kernel_msg_error:nnxx
               { kernel } { conditional-form-unknown }
-              {#7} { \token_to_str:c { #3 : #4 } }
+              {#8} { \token_to_str:c { #3 : #4 } }
           }
-        \use_none:nnnnnnn
+        \use_none:nnnnnnnn
       \q_stop
-      {#1} {#2} {#3} {#4} {#5} {#6}
-    \@@_generate_conditional:nnnnnnw {#1} {#2} {#3} {#4} {#5} {#6}
+      #1 #2 {#3} {#4} {#5} {#6} #7
+    \@@_generate_conditional:NNnnnnNw #1 #2 {#3} {#4} {#5} {#6} #7
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2283,32 +2324,44 @@
 %
 % \begin{macro}
 %   {
-%     \@@_generate_p_form:wnnnnnn,
-%     \@@_generate_TF_form:wnnnnnn,
-%     \@@_generate_T_form:wnnnnnn,
-%     \@@_generate_F_form:wnnnnnn
+%     \@@_generate_p_form:wNNnnnnN,
+%     \@@_generate_TF_form:wNNnnnnN,
+%     \@@_generate_T_form:wNNnnnnN,
+%     \@@_generate_F_form:wNNnnnnN
 %   }
+% \begin{macro}[EXP]{\@@_p_true:w}
 %   How to generate the various forms. Those functions take the
-%   following arguments: 1: \texttt{set} or \texttt{new}, 2: empty or
-%   \texttt{\_protected}, 3: function name 4: signature, 5: parameter
-%   text (or empty), 6: replacement. Remember that the logic-returning
-%   functions expect two arguments to be present after \cs{exp_end:}:
-%   notice the construction of the different variants relies on this,
-%   and that the |TF| and |F| variants will be slightly faster than the |T|
-%   version.  The |p| form is only valid for expandable tests, we check
-%   for that by making sure that the second argument is empty.
+%   following arguments: 1: junk, 2: \cs{cs_set:Npn} or similar, 3: |p|
+%   (for protected conditionals) or |e|, 4: function name, 5: signature,
+%   6: parameter text, 7: replacement (possibly trimmed by
+%   \cs{@@_generate_conditional_fast:nw}), 8: \cs{use_i_ii:nnn} or
+%   \cs{use_i:nn} (for \enquote{fast} conditionals).  Remember that the
+%   logic-returning functions expect two arguments to be present after
+%   \cs{exp_end:}: notice the construction of the different variants
+%   relies on this, and that the |TF| and |F| variants will be slightly
+%   faster than the |T| version.  The |p| form is only valid for
+%   expandable tests, we check for that by making sure that the second
+%   argument is empty.  For \enquote{fast} conditionals, |#7| has an
+%   extra \cs[no-index]{if_\ldots{}}.  To optimize a bit further we
+%   could replace \cs{exp_after:wN} \cs{use_ii:nnn} and similar by a
+%   single macro similar to \cs{@@_p_true:w}.  The drawback is that if
+%   the |T| or |F| arguments are actually missing, the recovery from
+%   the runaway argument would not insert \cs{fi:} back, messing up
+%   nesting of conditionals.
 %    \begin{macrocode}
-\cs_set_protected:Npn \@@_generate_p_form:wnnnnnn
-    #1 \q_stop #2#3#4#5#6#7
+\cs_set_protected:Npn \@@_generate_p_form:wNNnnnnN
+    #1 \q_stop #2#3#4#5#6#7#8
   {
-    \if_meaning:w \scan_stop: #3 \scan_stop:
+    \if_meaning:w e #3
       \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 }
+        #8
+          { \exp_args:Nc #2 { #4 _p: #5 } #6 }
+          { { #7 \exp_end: \c_true_bool \c_false_bool } }
+          { #7 \@@_p_true:w \fi: \c_false_bool }
       }
       {
         \__kernel_msg_error:nnx { kernel } { protected-predicate }
@@ -2315,26 +2368,34 @@
           { \token_to_str:c { #4 _p: #5 } }
       }
   }
-\cs_set_protected:Npn \@@_generate_T_form:wnnnnnn
-    #1 \q_stop #2#3#4#5#6#7
+\cs_set_protected:Npn \@@_generate_T_form:wNNnnnnN
+    #1 \q_stop #2#3#4#5#6#7#8
   {
-    \exp_args:cc { cs_ #2 #3 :Npn } { #4 : #5 T } #6
-      { #7 \exp_end: \use:n \use_none:n }
+    #8
+      { \exp_args:Nc #2 { #4 : #5 T } #6 }
+      { { #7 \exp_end: \use:n \use_none:n } }
+      { #7 \exp_after:wN \use_ii:nn \fi: \use_none:n }
   }
-\cs_set_protected:Npn \@@_generate_F_form:wnnnnnn
-    #1 \q_stop #2#3#4#5#6#7
+\cs_set_protected:Npn \@@_generate_F_form:wNNnnnnN
+    #1 \q_stop #2#3#4#5#6#7#8
   {
-    \exp_args:cc { cs_ #2 #3 :Npn } { #4 : #5 F } #6
-      { #7 \exp_end: { } }
+    #8
+      { \exp_args:Nc #2 { #4 : #5 F } #6 }
+      { { #7 \exp_end: { } } }
+      { #7 \exp_after:wN \use_none:nn \fi: \use:n }
   }
-\cs_set_protected:Npn \@@_generate_TF_form:wnnnnnn
-    #1 \q_stop #2#3#4#5#6#7
+\cs_set_protected:Npn \@@_generate_TF_form:wNNnnnnN
+    #1 \q_stop #2#3#4#5#6#7#8
   {
-    \exp_args:cc { cs_ #2 #3 :Npn } { #4 : #5 TF } #6
-      { #7 \exp_end: }
+    #8
+      { \exp_args:Nc #2 { #4 : #5 TF } #6 }
+      { { #7 \exp_end: } }
+      { #7 \exp_after:wN \use_ii:nnn \fi: \use_ii:nn }
   }
+\cs_set:Npn \@@_p_true:w \fi: \c_false_bool { \fi: \c_true_bool }
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
 %
 % \begin{macro}{\prg_set_eq_conditional:NNn, \prg_new_eq_conditional:NNn}
 % \begin{macro}{\@@_set_eq_conditional:NNNn}
@@ -2530,10 +2591,10 @@
 %   \verb*|\token_to_str:N \ |, and the auxiliary \cs{@@_to_str:w}
 %   is expanded, feeding |-| as a second character for the test;
 %   the test is false, and \TeX{} skips to \cs{fi:}, then performs
-%   \cs{token_to_str:N}, and stops the \cs{tex_romannumeral:D} with \cs{c_zero}.
+%   \cs{token_to_str:N}, and stops the \cs{tex_romannumeral:D} with \cs{c_zero_int}.
 %   The last case is that the escape character is itself a space. In this
 %   case, the \cs{if:w} test is true, and the auxiliary \cs{@@_to_str:w}
-%   comes into play, inserting |-\int_value:w|, which expands \cs{c_zero}
+%   comes into play, inserting |-\int_value:w|, which expands \cs{c_zero_int}
 %   to the character |0|. The initial \cs{tex_romannumeral:D} then sees
 %   |0|, which is not a terminated number, followed by the escape character,
 %   a space, which is removed, terminating the expansion of
@@ -2545,9 +2606,9 @@
   {
 %    \end{macrocode}
 %    We implement the expansion scheme using \cs{tex_romannumeral:D}
-%    terminating it with \cs{c_zero} rather than using \cs{exp:w} and
+%    terminating it with \cs{c_zero_int} rather than using \cs{exp:w} and
 %    \cs{exp_end:} as we normally do. The reason is that the code
-%    heavily depends on terminating the expansion with \cs{c_zero} so
+%    heavily depends on terminating the expansion with \cs{c_zero_int} so
 %    we make this dependency explicit.
 %    \begin{macrocode}
     \tex_romannumeral:D
@@ -2554,9 +2615,9 @@
       \if:w \token_to_str:N \ \@@_to_str:w \fi:
       \exp_after:wN \@@_to_str:N \token_to_str:N
   }
-\cs_set:Npn \@@_to_str:N #1 { \c_zero }
+\cs_set:Npn \@@_to_str:N #1 { \c_zero_int }
 \cs_set:Npn \@@_to_str:w #1 \@@_to_str:N
-  { - \int_value:w \fi: \exp_after:wN \c_zero }
+  { - \int_value:w \fi: \exp_after:wN \c_zero_int }
 %    \end{macrocode}
 %   If speed is a concern we could use \tn{csstring} in \LuaTeX{}.  For
 %   the empty csname that primitive gives an empty result while the

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -138,7 +138,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -363,8 +363,8 @@
       \LineBreak
       These are available in the engines\LineBreak
       - pdfTeX v1.40\LineBreak
-      - XeTeX v0.9994\LineBreak
-      - LuaTeX v0.70\LineBreak
+      - XeTeX v0.99992\LineBreak
+      - LuaTeX v0.76\LineBreak
       - e-(u)pTeX mid-2012\LineBreak
       or later.\LineBreak
       \LineBreak
@@ -373,7 +373,14 @@
     \expandafter\ifx\csname pdfstrcmp\endcsname\relax
     \else
       \expandafter\ifx\csname pdftexversion\endcsname\relax
-        1%
+        \expandafter\ifx\csname Ucharcat\endcsname\relax
+          \ifx\csname kanjiskip\endcsname\relax
+          \else
+            1%
+          \fi
+        \else
+          1%
+        \fi
       \else
         \ifnum\pdftexversion<140 \else 1\fi
       \fi
@@ -380,7 +387,7 @@
     \fi
     \expandafter\ifx\csname directlua\endcsname\relax
     \else
-      \ifnum\luatexversion<70 \else 1\fi
+      \ifnum\luatexversion<76 \else 1\fi
     \fi
     =0 %
       \newlinechar`\^^J %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -850,7 +850,7 @@
 %   difference with \cs{dim_eval:n} is the lack of \cs{dim_use:N}, to
 %   produce an internal dimension rather than expand it into characters.
 %    \begin{macrocode}
-\cs_new_eq:NN \@@_dim_eval:w \etex_dimexpr:D
+\cs_new_eq:NN \@@_dim_eval:w \tex_dimexpr:D
 \__kernel_patch_args:nNNpn
   {
     {
@@ -1162,12 +1162,12 @@
   { \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 \@@_log:nNnn { \tex_the:D \etex_interactionmode:D } }
+  { \exp_args:No \@@_log:nNnn { \tex_the:D \tex_interactionmode:D } }
 \cs_new_protected:Npn \@@_log:nNnn #1#2#3#4
   {
-    \int_set:Nn \etex_interactionmode:D { 0 }
+    \int_set:Nn \tex_interactionmode:D { 0 }
     \@@_show:NNff 0 #2 { \int_eval:n {#3} } { \int_eval:n {#4} }
-    \int_set:Nn \etex_interactionmode:D {#1}
+    \int_set:Nn \tex_interactionmode:D {#1}
   }
 \cs_generate_variant:Nn \box_log:Nnn { c }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -101,6 +101,7 @@
 %       skip, and muskip expressions are not terminated prematurely;
 %     \item \texttt{deprecation} that makes soon-to-be-deprecated commands produce errors;
 %     \item \texttt{log-functions} that logs function definitions;
+%     \item \texttt{all} that does all of the above.
 %   \end{itemize}
 %   Providing these as switches rather than options allows testing code
 %   even if it relies on other packages: load all other packages, call
@@ -281,6 +282,57 @@
 %   applicable.
 % \end{function}
 %
+% \section{Additions to \pkg{l3fparray}}
+%
+% \begin{function}[added = 2018-05-05]{\fparray_new:Nn}
+%   \begin{syntax}
+%     \cs{fparray_new:Nn} \meta{fparray~var} \Arg{size}
+%   \end{syntax}
+%   Evaluates the integer expression \meta{size} and allocates an
+%   \meta{floating point array variable} with that number of (zero)
+%   entries.  The variable name should start with |\g_| because
+%   assignments are always global.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2018-05-05]{\fparray_count:N}
+%   \begin{syntax}
+%     \cs{fparray_count:N} \meta{fparray~var}
+%   \end{syntax}
+%   Expands to the number of entries in the \meta{floating point array
+%   variable}.  This is performed in constant time.
+% \end{function}
+%
+% \begin{function}[added = 2018-05-05]{\fparray_gset:Nnn}
+%   \begin{syntax}
+%     \cs{fparray_gset:Nnn} \meta{fparray~var} \Arg{position} \Arg{value}
+%   \end{syntax}
+%   Stores the result of evaluating the floating point expression
+%   \meta{value} into the \meta{floating point array variable} at the
+%   (integer expression) \meta{position}.  If the \meta{position} is not
+%   between $1$ and the \cs{fparray_count:N}, an error occurs.
+%   Assignments are always global.
+% \end{function}
+%
+% \begin{function}[added = 2018-05-05]{\fparray_gzero:N}
+%   \begin{syntax}
+%     \cs{fparray_gzero:N} \meta{fparray~var}
+%   \end{syntax}
+%   Sets all entries of the \meta{floating point array variable} to
+%   $+0$.  Assignments are always global.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2018-05-05]
+%   {\fparray_item:Nn, \fparray_item_to_tl:Nn}
+%   \begin{syntax}
+%     \cs{fparray_item:Nn} \meta{fparray~var} \Arg{position}
+%   \end{syntax}
+%   Applies \cs{fp_use:N} or \cs{fp_to_tl:N} (respectively) to the
+%   floating point entry stored at the (integer expression)
+%   \meta{position} in the \meta{floating point array variable}.  If the
+%   \meta{position} is not between $1$ and the \cs{fparray_count:N}, an
+%   error occurs.
+% \end{function}
+%
 % \section{Additions to \pkg{l3file}}
 %
 % \begin{function}[added = 2017-07-11]{\file_get_mdfive_hash:nN}
@@ -371,6 +423,75 @@
 %   locally.
 % \end{function}
 %
+% \section{Additions to \pkg{l3int}}
+%
+% \begin{function}[EXP, added = 2018-05-05]{\int_rand:n}
+%   \begin{syntax}
+%     \cs{int_rand:n} \Arg{intexpr}
+%   \end{syntax}
+%   Evaluates the \meta{integer expression} then produces a
+%   pseudo-random number between $1$ and the \meta{intexpr} (included).
+%   This is not yet available in \XeTeX{}.
+% \end{function}
+%
+% \section{Additions to \pkg{l3intarray}}
+%
+% \begin{function}[EXP, added = 2018-05-05]{\intarray_rand_item:N}
+%   \begin{syntax}
+%     \cs{intarray_rand_item:N} \meta{intarray~var}
+%   \end{syntax}
+%   Selects a pseudo-random item of the \meta{integer array}.  If the
+%   \meta{integer array} is empty, produce an error.  This is not yet
+%   available in \XeTeX{}.
+% \end{function}
+%
+% \begin{function}[added = 2018-05-05]{\intarray_gset_rand:Nnn, \intarray_gset_rand:Nn}
+%   \begin{syntax}
+%     \cs{intarray_gset_rand:Nnn} \meta{intarray~var} \Arg{minimum} \Arg{maximum}
+%     \cs{intarray_gset_rand:Nn} \meta{intarray~var} \Arg{maximum}
+%   \end{syntax}
+%   Evaluates the integer expressions \meta{minimum} and \meta{maximum}
+%   then sets each entry (independently) of the \meta{integer array
+%   variable} to a pseudo-random number between the two (with bounds
+%   included).  If the absolute value of either bound is bigger than
+%   $2^{30}-1$, an error occurs.  Entries are generated in the same way
+%   as repeated calls to \cs{int_rand:nn} or \cs{int_rand:n}
+%   respectively, in particular for the second function the
+%   \meta{minimum} is $1$.  This is not yet available in \XeTeX{}.
+%   Assignments are always global.
+% \end{function}
+%
+% \subsection{Working with contents of integer arrays}
+%
+% \begin{function}[added = 2018-05-04, rEXP]{\intarray_const_from_clist:Nn}
+%   \begin{syntax}
+%     \cs{intarray_const_from_clist:Nn} \meta{intarray~var} \meta{intexpr clist}
+%   \end{syntax}
+%   Creates a new constant \meta{integer array variable} or raises an
+%   error if the name is already taken.  The \meta{integer array
+%   variable} is set (globally) to contain as its items the results of
+%   evaluating each \meta{integer expression} in the \meta{comma list}.
+% \end{function}
+%
+% \begin{function}[added = 2018-05-04, rEXP]{\intarray_to_clist:N}
+%   \begin{syntax}
+%     \cs{intarray_to_clist:N} \meta{intarray~var}
+%   \end{syntax}
+%   Converts the \meta{intarray} to integer denotations separated by
+%   commas.  All tokens have category code other.  If the
+%   \meta{intarray} has no entry the result is empty; otherwise the
+%   result has one fewer comma than the number of items.
+% \end{function}
+%
+% \begin{function}[added = 2018-05-04]{\intarray_show:N, \intarray_log:N}
+%   \begin{syntax}
+%     \cs{intarray_show:N} \meta{intarray~var}
+%     \cs{intarray_log:N} \meta{intarray~var}
+%   \end{syntax}
+%   Displays the items in the \meta{integer array variable} in the
+%   terminal or writes them in the log file.
+% \end{function}
+%
 % \section{Additions to \pkg{l3msg}}
 %
 % In very rare cases it may be necessary to produce errors in an
@@ -470,6 +591,18 @@
 %   the result of evaluating the \meta{boolexpr}.
 % \end{function}
 %
+% \begin{function}[added = 2018-05-10]
+%   {
+%     \bool_set_inverse:N , \bool_set_inverse:c ,
+%     \bool_gset_inverse:N, \bool_gset_inverse:c
+%   }
+%   \begin{syntax}
+%     \cs{bool_set_inverse:N} \meta{boolean}
+%   \end{syntax}
+%   Toggles the \meta{boolean} from \texttt{true} to \texttt{false} and
+%   conversely: sets it to the inverse of its current value.
+% \end{function}
+%
 % \section{Additions to \pkg{l3prop}}
 %
 % \begin{function}[EXP]{\prop_count:N, \prop_count:c}
@@ -677,6 +810,26 @@
 %   \end{texnote}
 % \end{function}
 %
+% \begin{function}[added = 2018-05-03]{\seq_indexed_map_function:NN}
+%   \begin{syntax}
+%     \cs{seq_indexed_map_function:NN} \meta{seq~var} \meta{function}
+%   \end{syntax}
+%   Applies \meta{function} to every entry in the \meta{sequence
+%   variable}.  The \meta{function} should have signature |:nn|.  It
+%   receives two arguments for each iteration: the \meta{index} (namely
+%   |1| for the first entry, then |2| and so on) and the \meta{item}.
+% \end{function}
+%
+% \begin{function}[added = 2018-05-03]{\seq_indexed_map_inline:Nn}
+%   \begin{syntax}
+%     \cs{seq_indexed_map_inline:Nn} \meta{seq~var} \Arg{inline function}
+%   \end{syntax}
+%   Applies \meta{inline function} to every entry in the \meta{sequence
+%   variable}.  The \meta{inline function} should consist of code which
+%   receives the \meta{index} (namely |1| for the first entry, then |2|
+%   and so on) as~|#1| and the \meta{item} as~|#2|.
+% \end{function}
+%
 % \section{Additions to \pkg{l3skip}}
 %
 % \begin{function}{\skip_split_finite_else_action:nnNN}
@@ -695,6 +848,27 @@
 %
 % \section{Additions to \pkg{l3sys}}
 %
+% \begin{variable}[added = 2018-05-02]{\c_sys_engine_version_str}
+%   The version string of the current engine, in the same form as
+%   given in the banner issued when running a job. For \pdfTeX{}
+%   and \LuaTeX{} this is of the form
+%   \begin{quote}
+%     \meta{major}.\meta{minor}.\meta{revision}
+%   \end{quote}
+%   For \XeTeX{}, the form is
+%   \begin{quote}
+%     \meta{major}.\meta{minor}
+%   \end{quote}
+%   For \pTeX{} and \upTeX{}, only releases since \TeX{} Live 2018
+%   make the data available, and the form is more complex, as it comprises
+%   the \pTeX{} version, the \upTeX{} version and the e-\pTeX{} version.
+%   \begin{quote}
+%     p\meta{major}.\meta{minor}.\meta{revision}-u\meta{major}.\meta{minor}^^A
+%     -\meta{epTeX}
+%   \end{quote}
+%   where the |u| part is only present for \upTeX{}.
+% \end{variable}
+%
 % \begin{function}[added = 2017-05-27, EXP, pTF]{\sys_if_rand_exist:}
 %   \begin{syntax}
 %     \cs{sys_if_rand_exist_p:}
@@ -1297,8 +1471,8 @@
 %    \begin{macrocode}
 \cs_new_protected:Npx \mode_leave_vertical:
   {
-    \cs_if_exist:NTF \pdftex_quitvmode:D
-      { \pdftex_quitvmode:D }
+    \cs_if_exist:NTF \tex_quitvmode:D
+      { \tex_quitvmode:D }
       {
         \exp_not:n
           {
@@ -1963,7 +2137,7 @@
 %   using \cs{file_get_full_name:nN} and so are non-expandable \texttt{get}
 %   functions. Much of the code is repetitive but we need to branch for
 %   \LuaTeX{} (emulation in Lua), for the slightly different syntax
-%   needed for \tn{pdftex_mdfivesum:D} and for the fact that primitive
+%   needed for \tn{tex_mdfivesum:D} and for the fact that primitive
 %   coverage varies in other engines.
 %    \begin{macrocode}
 \cs_new_protected:Npn \file_get_mdfive_hash:nN #1#2
@@ -1977,7 +2151,7 @@
     \file_get_full_name:nN {#1} \l_@@_full_name_str
     \str_set:Nx #3
       {
-        \use:c { pdftex_file #2 :D } \exp_after:wN
+        \use:c { tex_file #2 :D } \exp_after:wN
           { \l_@@_full_name_str }
       }
   }
@@ -2002,7 +2176,7 @@
         \file_get_full_name:nN {#1} \l_@@_full_name_str
         \tl_set:Nx #2
           {
-            \pdftex_mdfivesum:D file \exp_after:wN
+            \tex_mdfivesum:D file \exp_after:wN
               { \l_@@_full_name_str }
           }
       }
@@ -2197,6 +2371,19 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[added = 2018-05-10]
+%   {\bool_set_inverse:N, \bool_set_inverse:c, \bool_gset_inverse:N, \bool_gset_inverse:c}
+%   Set to \texttt{false} or \texttt{true} locally or globally.
+%    \begin{macrocode}
+\cs_new_protected:Npn \bool_set_inverse:N #1
+  { \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1 }
+\cs_generate_variant:Nn \bool_set_inverse:N { c }
+\cs_new_protected:Npn \bool_gset_inverse:N #1
+  { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 }
+\cs_generate_variant:Nn \bool_gset_inverse:N { c }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Additions to \pkg{l3prop}}
 %
 %    \begin{macrocode}
@@ -2433,7 +2620,7 @@
 % \begin{macro}{\seq_shuffle:N, \seq_gshuffle:N, \@@_shuffle:NN, \@@_shuffle_item:n}
 % \begin{variable}{\g_@@_internal_seq, \l_@@_internal_a_int, \l_@@_internal_b_int}
 %   We apply the Fisher–Yates shuffle, storing items in \tn{toks}
-%   registers.  We use the primitive \cs{pdftex_uniformdeviate:D} for
+%   registers.  We use the primitive \cs{tex_uniformdeviate:D} for
 %   speed reasons.  Its non-uniformity is of order its argument divided
 %   by $2^{28}$, not too bad for small lists.  For sequences with more
 %   than $13$ elements there are more possible permutations than
@@ -2440,7 +2627,7 @@
 %   possible seeds ($13!>2^{28}$) so the question of uniformity is
 %   somewhat moot.
 %    \begin{macrocode}
-\cs_if_exist:NTF \pdftex_uniformdeviate:D
+\cs_if_exist:NTF \tex_uniformdeviate:D
   {
     \int_new:N \l_@@_internal_a_int
     \int_new:N \l_@@_internal_b_int
@@ -2471,7 +2658,7 @@
       {
         \int_incr:N \l_@@_internal_a_int
         \int_set:Nn \l_@@_internal_b_int
-          { 1 + \pdftex_uniformdeviate:D \l_@@_internal_a_int }
+          { 1 + \tex_uniformdeviate:D \l_@@_internal_a_int }
         \tex_toks:D \l_@@_internal_a_int
           = \tex_toks:D \l_@@_internal_b_int
         \tex_toks:D \l_@@_internal_b_int
@@ -2487,7 +2674,10 @@
   }
   {
     \cs_new_protected:Npn \seq_shuffle:N #1
-      { \__kernel_msg_error:nn { kernel } { fp-no-random } }
+      {
+        \__kernel_msg_error:nnn { kernel } { fp-no-random }
+          { \seq_shuffle:N #1 }
+      }
     \cs_new_eq:NN \seq_gshuffle:N \seq_shuffle:N
   }
 %    \end{macrocode}
@@ -2494,6 +2684,50 @@
 % \end{variable}
 % \end{macro}
 %
+% \begin{macro}
+%   {
+%     \seq_indexed_map_function:NN, \seq_indexed_map_inline:Nn,
+%     \@@_indexed_map:nNN, \@@_indexed_map:Nw
+%   }
+%   Similar to \cs{seq_map_function:NN} but we keep track of the item
+%   index as a |;|-delimited argument of \cs{@@_indexed_map:Nw}.
+%    \begin{macrocode}
+\cs_new:Npn \seq_indexed_map_function:NN #1#2
+  {
+    \@@_indexed_map:NN #1#2
+    \prg_break_point:Nn \seq_map_break: { }
+  }
+\cs_new_protected:Npn \seq_indexed_map_inline:Nn #1#2
+  {
+    \int_gincr:N \g__kernel_prg_map_int
+    \cs_gset_protected:cpn
+      { @@_map_ \int_use:N \g__kernel_prg_map_int :w } ##1##2 {#2}
+    \exp_args:NNc \@@_indexed_map:NN #1
+      { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
+    \prg_break_point:Nn \seq_map_break:
+      { \int_gdecr:N \g__kernel_prg_map_int }
+  }
+\cs_new:Npn \@@_indexed_map:NN #1#2
+  {
+    \exp_after:wN \@@_indexed_map:Nw
+    \exp_after:wN #2
+    \int_value:w 1
+    \exp_after:wN \use_i:nn
+    \exp_after:wN ;
+    #1
+    \prg_break: \@@_item:n { } \prg_break_point:
+  }
+\cs_new:Npn \@@_indexed_map:Nw #1#2 ; #3 \@@_item:n #4
+  {
+    #3
+    #1 {#2} {#4}
+    \exp_after:wN \@@_indexed_map:Nw
+    \exp_after:wN #1
+    \int_value:w \int_eval:w 1 + #2 ;
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Additions to \pkg{l3skip}}
 %
 %    \begin{macrocode}
@@ -2512,8 +2746,8 @@
   {
     \skip_if_finite:nTF {#1}
       {
-        #3 = \etex_gluestretch:D #1 \scan_stop:
-        #4 = \etex_glueshrink:D  #1 \scan_stop:
+        #3 = \tex_gluestretch:D #1 \scan_stop:
+        #4 = \tex_glueshrink:D  #1 \scan_stop:
       }
       {
         #3 = \c_zero_skip
@@ -2530,20 +2764,81 @@
 %<@@=sys>
 %    \end{macrocode}
 %
-% \begin{macro}[EXP, pTF]{\sys_if_rand_exist:}
-%   Currently, randomness exists under \pdfTeX{}, \LuaTeX{}, \pTeX{} and \upTeX{}.
+% \begin{variable}{\c_sys_engine_version_str}
+%   Various different engines, various different ways to extract the
+%   data!
 %    \begin{macrocode}
-\@@_const:nn { sys_if_rand_exist }
-  { \cs_if_exist_p:N \pdftex_uniformdeviate:D }
+\str_const:Nx \c_sys_engine_version_str
+  {
+    \str_case:on \c_sys_engine_str
+      {
+        { pdftex }
+          {
+            \fp_eval:n { round(\int_use:N \tex_pdftexversion:D / 100 , 2) }
+            .
+            \tex_pdftexrevision:D
+          }
+        { ptex }
+          {
+            \cs_if_exist:NT \tex_ptexversion:D
+              {
+                p
+                \int_use:N  \tex_ptexversion:D
+                \int_use:N \tex_ptexminorversion:D
+                \tex_ptexrevision:D
+                -
+                \int_use:N \tex_epTeXversion:D
+              }
+          }
+        { luatex }
+          {
+            \fp_eval:n { round(\int_use:N \tex_luatexversion:D / 100, 2) }
+            .
+            \tex_luatexrevision:D
+          }
+        { uptex }
+          {
+            \cs_if_exist:NT \tex_ptexversion:D
+              {
+                p
+                \int_use:N  \tex_ptexversion:D
+                \int_use:N \tex_ptexminorversion:D
+                \tex_ptexrevision:D
+                -
+                u
+                \int_use:N  \tex_uptexversion:D
+                \tex_uptexrevision:D
+                -
+                \int_use:N \tex_epTeXversion:D
+              }
+          }
+        { xetex }
+          {
+            \int_use:N \tex_XeTeXversion:D
+            .
+            \tex_XeTeXrevision:D
+          }
+      }
+  }
 %    \end{macrocode}
-% \end{macro}
+% \end{variable}
 %
 % \begin{macro}[EXP]{\sys_rand_seed:}
-%   Unpack the primitive.
+%   Unpack the primitive.  When random numbers are not available, we
+%   return zero after an error (and incidentally make sure the number of
+%   expansions needed is the same as with random numbers available).
 %    \begin{macrocode}
-\cs_new:Npn \sys_rand_seed: { \tex_the:D \pdftex_randomseed:D }
-\cs_if_exist:NF \pdftex_randomseed:D
-  { \cs_set:Npn \sys_rand_seed: { 0 } }
+\sys_if_rand_exist:TF
+  { \cs_new:Npn \sys_rand_seed: { \tex_the:D \tex_randomseed:D } }
+  {
+    \cs_new:Npn \sys_rand_seed:
+      {
+        \int_value:w
+        \__kernel_msg_expandable_error:nnn { kernel } { fp-no-random }
+          { \sys_rand_seed: }
+        \c_zero_int
+      }
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2550,8 +2845,18 @@
 % \begin{macro}{\sys_gset_rand_seed:n}
 %   The primitive always assigns the seed globally.
 %    \begin{macrocode}
-\cs_new_protected:Npn \sys_gset_rand_seed:n #1
-  { \pdftex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
+\sys_if_rand_exist:TF
+  {
+    \cs_new_protected:Npn \sys_gset_rand_seed:n #1
+      { \tex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
+  }
+  {
+    \cs_new_protected:Npn \sys_gset_rand_seed:n #1
+      {
+        \__kernel_msg_error:nnn { kernel } { fp-no-random }
+          { \sys_gset_rand_seed:n {#1} }
+      }
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2562,11 +2867,11 @@
   {
     \sys_if_engine_luatex:TF
       {
-        \luatex_directlua:D
+        \tex_directlua:D
           { tex.sprint(status.shell_escape~or~os.execute()) }
       }
       {
-        \pdftex_shellescape:D
+        \tex_shellescape:D
       }
   }
 %    \end{macrocode}
@@ -2652,12 +2957,16 @@
 \prg_new_conditional:Npnn \tl_if_single_token:n #1 { p , T , F , TF }
   {
     \tl_if_head_is_N_type:nTF {#1}
-      { \@@_if_empty_return:o { \use_none:n #1 } }
+      { \@@_if_empty_if:o { \use_none:n #1 } }
       {
         \tl_if_empty:nTF {#1}
-          { \prg_return_false: }
-          { \@@_if_empty_return:o { \exp:w \exp_end_continue_f:w #1 } }
+          { \if_false: }
+          { \@@_if_empty_if:o { \exp:w \exp_end_continue_f:w #1 } }
       }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2708,7 +3017,7 @@
 %   The token count is computed through an \cs{int_eval:n} construction.
 %   Each \texttt{1+} is output to the \emph{left}, into the integer
 %   expression, and the sum is ended by the \cs{exp_end:} inserted by
-%   \cs{@@_act_end:wn} (which is technically implemented as  \cs{c_zero}).
+%   \cs{@@_act_end:wn} (which is technically implemented as  \cs{c_zero_int}).
 %   Somewhat a hack!
 %    \begin{macrocode}
 \cs_new:Npn \tl_count_tokens:n #1
@@ -2757,7 +3066,7 @@
       { \__kernel_file_missing:n {#4} }
       {
         \group_begin:
-          \exp_args:No \etex_everyeof:D
+          \exp_args:No \tex_everyeof:D
             { \c_@@_rescan_marker_tl \exp_not:N }
           #3 \scan_stop:
           \exp_after:wN \@@_from_file_do:w
@@ -2801,7 +3110,7 @@
       { \__kernel_file_missing:n {#4} }
       {
         \group_begin:
-          \etex_everyeof:D { \exp_not:N }
+          \tex_everyeof:D { \exp_not:N }
           #3 \scan_stop:
           \tl_set:Nx \l_@@_internal_a_tl
             { \tex_input:D \l_@@_file_name_str \c_space_token }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -50,10 +50,14 @@
 % \begin{documentation}
 %
 % Comma lists contain ordered data where items can be added to the left
-% or right end of the list.  The features of this data type largely
-% overlap with those of the sequence data type, for instance applying a
-% function to every item, removing duplicate items, extracting a given
-% item, using the comma list with specified separators, and so on.
+% or right end of the list.  This data type allows basic list
+% manipulations such as adding/removing items, applying a function to
+% every item, removing duplicate items, extracting a given item, using
+% the comma list with specified separators, and so on.  Sequences
+% (defined in \pkg{l3seq}) are safer, faster, and provide more features,
+% so they should often be preferred to comma lists.  Comma lists are
+% mostly useful when interfacing with \LaTeXe{} or other code that
+% expects or provides comma list data.
 %
 % Several items can be added at once.  To ease input of comma lists from
 % data provided by a user outside an \cs{ExplSyntaxOn} \ldots{}
@@ -81,9 +85,7 @@
 % or ends with a space, or is a single brace group), surround it with
 % braces.
 %
-% Comma lists are particularly useful when implementing user interfaces,
-% or when interfacing with \LaTeXe{} or other code that expects or
-% provides comma list data.  Almost all operations on comma lists are
+% Almost all operations on comma lists are
 % noticeably slower than those on sequences so converting the data to
 % sequences using \cs{seq_set_from_clist:Nn} (see \pkg{l3seq}) may be
 % advisable if speed is important.  The exception is that

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -73,7 +73,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \__kernel_deprecation_error:Nnn #1#2#3
   {
-    \etex_protected:D \tex_outer:D \tex_edef:D #1
+    \tex_protected:D \tex_outer:D \tex_edef:D #1
       {
         \exp_not:N \__kernel_msg_expandable_error:nnnnn
           { kernel } { deprecated-command }
@@ -176,7 +176,72 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[deprecated = 2019-12-31]{\etex_beginL:D}
+% \begin{macro}{\@@_primitive:NN, \@@_primitive:w}
+%   We renamed all primitives to \cs[no-index]{tex_\ldots{}:D} so all
+%   others are deprecated.  In \pkg{l3names}, \cs{__kernel_primitives:}
+%   is defined to contain \cs{__kernel_primitive:NN} \cs{beginL}
+%   \cs{etex_beginL:D} and so on, one for each deprecated primitive.  We
+%   apply \cs{exp_not:N} to the second argument of
+%   \cs{__kernel_primitive:NN} because it may be outer (both when doing
+%   and undoing deprecation actually), then \cs{@@_primitive:NN} uses
+%   \cs{tex_let:D} to change the meaning of this potentially outer
+%   token.  Then, either turn it into an error or make it equal to the
+%   primitive~|#1|.  To be more precise, |#1| may not be defined, so try
+%   a \cs[no-index]{tex_\ldots{}:D} command as well.
 %    \begin{macrocode}
+\cs_new_protected:Npn \@@_primitive:NN #1#2 { }
+\exp_last_unbraced:NNNNo
+  \cs_new:Npn \@@_primitive:w #1 { \token_to_str:N _ } { }
+\__kernel_deprecation_code:nn
+  {
+    \cs_set_protected:Npn \__kernel_primitive:NN #1
+      {
+        \exp_after:wN \@@_primitive:NN
+        \exp_after:wN #1
+        \exp_not:N
+      }
+    \cs_set_protected:Npn \@@_primitive:NN #1#2
+      {
+        \tex_let:D #2 \scan_stop:
+        \exp_args:NNx \__kernel_deprecation_error:Nnn #2
+          {
+            \iow_char:N \\
+            \cs_if_exist:NTF #1
+              { \cs_to_str:N #1 }
+              {
+                tex_
+                \exp_last_unbraced:Nf
+                \@@_primitive:w { \cs_to_str:N #2 }
+              }
+          }
+          { 2019-12-31 }
+      }
+    \__kernel_primitives:
+  }
+  {
+    \cs_set_protected:Npn \__kernel_primitive:NN #1
+      {
+        \exp_after:wN \@@_primitive:NN
+        \exp_after:wN #1
+        \exp_not:N
+      }
+    \cs_set_protected:Npn \@@_primitive:NN #1#2
+      {
+        \tex_let:D #2 #1
+        \cs_if_exist:cT { tex_ \cs_to_str:N #1 :D }
+          {
+            \exp_args:NNc \cs_set_eq:NN #2
+              { tex_ \cs_to_str:N #1 :D }
+          }
+      }
+    \__kernel_primitives:
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -77,7 +77,7 @@
 %
 % \title{The \cls{l3doc} class}
 % \author{\Team}
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 % \maketitle
 % \tableofcontents
 %
@@ -3855,10 +3855,10 @@
           }
         \tl_if_empty:NF \l_@@_tmpa_tl
           {
-            \int_set:Nn \l_@@_tmpa_int { \etex_interactionmode:D }
+            \int_set:Nn \l_@@_tmpa_int { \tex_interactionmode:D }
             \errorstopmode
             \ClassError { l3doc } { \l_@@_tmpa_tl } { }
-            \int_set:Nn \etex_interactionmode:D { \l_@@_tmpa_int }
+            \int_set:Nn \tex_interactionmode:D { \l_@@_tmpa_int }
           }
       }
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -481,23 +481,23 @@
 %<*package>
 \ProvidesExplFile
 %<*dvipdfmx>
-  {l3dvidpfmx.def}{2018-04-30}{}
+  {l3dvidpfmx.def}{2018-05-12}{}
   {L3 Experimental driver: dvipdfmx}
 %</dvipdfmx>
 %<*dvips>
-  {l3dvips.def}{2018-04-30}{}
+  {l3dvips.def}{2018-05-12}{}
   {L3 Experimental driver: dvips}
 %</dvips>
 %<*dvisvgm>
-  {l3dvisvgm.def}{2018-04-30}{}
+  {l3dvisvgm.def}{2018-05-12}{}
   {L3 Experimental driver: dvisvgm}
 %</dvisvgm>
 %<*pdfmode>
-  {l3pdfmode.def}{2018-04-30}{}
+  {l3pdfmode.def}{2018-05-12}{}
   {L3 Experimental driver: PDF mode}
 %</pdfmode>
 %<*xdvipdfmx>
-  {l3xdvidpfmx.def}{2018-04-30}{}
+  {l3xdvidpfmx.def}{2018-05-12}{}
   {L3 Experimental driver: xdvipdfmx}
 %</xdvipdfmx>
 %</package>
@@ -738,9 +738,9 @@
   { \@@_color_select:n { /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC } }
 \cs_new_protected:Npx \@@_color_select:n #1
   {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D colorstack }
-      { \pdftex_pdfcolorstack:D }
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \tex_pdfextension:D colorstack }
+      { \tex_pdfcolorstack:D }
         \exp_not:N \l_@@_color_stack_int push {#1}
       \group_insert_after:N \exp_not:N \@@_color_reset:
   }
@@ -747,9 +747,9 @@
 \cs_generate_variant:Nn \@@_color_select:n { x }
 \cs_new_protected:Npx \@@_color_reset:
   {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D colorstack }
-      { \pdftex_pdfcolorstack:D }
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \tex_pdfextension:D colorstack }
+      { \tex_pdfcolorstack:D }
         \exp_not:N \l_@@_color_stack_int pop \scan_stop:
   }
 %    \end{macrocode}
@@ -1349,9 +1349,9 @@
 %    \begin{macrocode}
 \cs_new_protected:Npx \@@_literal_pdf:n #1
   {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D literal }
-      { \pdftex_pdfliteral:D }
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \tex_pdfextension:D literal }
+      { \tex_pdfliteral:D }
         { \exp_not:N \exp_not:n {#1} }
   }
 \cs_generate_variant:Nn \@@_literal_pdf:n { x }
@@ -1363,15 +1363,15 @@
 %    \begin{macrocode}
 \cs_new_protected:Npx \@@_scope_begin:
   {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D save \scan_stop: }
-      { \pdftex_pdfsave:D }
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \tex_pdfextension:D save \scan_stop: }
+      { \tex_pdfsave:D }
   }
 \cs_new_protected:Npx \@@_scope_end:
   {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D restore \scan_stop: }
-      { \pdftex_pdfrestore:D }
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \tex_pdfextension:D restore \scan_stop: }
+      { \tex_pdfrestore:D }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1383,9 +1383,9 @@
 %    \begin{macrocode}
 \cs_new_protected:Npx \@@_matrix:n #1
   {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D setmatrix }
-      { \pdftex_pdfsetmatrix:D }
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \tex_pdfextension:D setmatrix }
+      { \tex_pdfsetmatrix:D }
         { \exp_not:N \exp_not:n {#1} }
   }
 \cs_generate_variant:Nn \@@_matrix:n { x }
@@ -1542,13 +1542,13 @@
   }
 %    \begin{macrocode}
 %   Measuring the image is done by boxing up: for PDF images we could
-%   use |\pdftex_pdfximagebbox:D|, but if doesn't work for other types.
+%   use |\tex_pdfximagebbox:D|, but if doesn't work for other types.
 %   As the box always starts at $(0,0)$ there is no need to worry about
 %   the lower-left position.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_image_getbb_auxii:n #1
   {
-    \tex_immediate:D \pdftex_pdfximage:D
+    \tex_immediate:D \tex_pdfximage:D
       \bool_lazy_or:nnT
         { \l_image_interpolate_bool }
         { ! \tl_if_empty_p:N \l_image_decodearray_tl }
@@ -1567,11 +1567,11 @@
         { \l_image_pagebox_tl }
       {#1}
     \hbox_set:Nn \l_@@_tmp_box
-      { \pdftex_pdfrefximage:D \pdftex_pdflastximage:D }
+      { \tex_pdfrefximage:D \tex_pdflastximage:D }
     \dim_set:Nn \l_image_urx_dim { \box_wd:N \l_@@_tmp_box }
     \dim_set:Nn \l_image_ury_dim { \box_ht:N \l_@@_tmp_box }
     \int_const:cn { c_@@_image_ #1 \l_@@_image_attr_tl _int }
-      { \tex_the:D \pdftex_pdflastximage:D }
+      { \tex_the:D \tex_pdflastximage:D }
     \image_bb_save:x { #1 \l_@@_image_attr_tl }
   }
 %    \end{macrocode}
@@ -1586,7 +1586,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_image_include_jpg:n #1
   {
-    \pdftex_pdfrefximage:D
+    \tex_pdfrefximage:D
       \int_use:c { c_@@_image_ #1 \l_@@_image_attr_tl _int }
   }
 \cs_new_eq:NN \@@_image_include_pdf:n \@@_image_include_jpg:n
@@ -1870,7 +1870,7 @@
   {
     \int_zero:N \l_image_page_int
     \tl_clear:N \l_image_pagebox_tl
-    \@@_image_getbb_auxi:nN {#1} \xetex_picfile:D
+    \@@_image_getbb_auxi:nN {#1} \tex_XeTeXpicfile:D
   }
 \cs_new_eq:NN \@@_image_getbb_png:n \@@_image_getbb_jpg:n
 \cs_new_protected:Npn \@@_image_getbb_pdf:n #1
@@ -1877,7 +1877,7 @@
   {
     \tl_clear:N \l_image_decode_tl
     \bool_set_false:N \l_image_interpolate_bool
-    \@@_image_getbb_auxi:nN {#1} \xetex_pdffile:D
+    \@@_image_getbb_auxi:nN {#1} \tex_XeTeXpdffile:D
   }
 \cs_new_protected:Npn \@@_image_getbb_auxi:nN #1#2
   {
@@ -1928,13 +1928,13 @@
 %
 % \begin{macro}{\@@_image_include_pdf:n}
 %   For PDF images, properly supporting the |pagebox| concept in \XeTeX{}
-%   is best done using the |\xetex_pdffile:D| primitive. The syntax here
+%   is best done using the |\tex_XeTeXpdffile:D| primitive. The syntax here
 %   is the same as for the image measurement part, although we know at this
 %   stage that there must be some valid setting for \cs{l_image_pagebox_tl}.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_image_include_pdf:n #1
   {
-    \xetex_pdffile:D "#1" ~
+    \tex_XeTeXpdffile:D "#1" ~
       \int_compare:nNnT \l_image_page_int > 0
         { page~ \int_use:N \l_image_page_int }
       \@@_image_getbb_auxiv:VnNnn \l_image_pagebox_tl

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -521,6 +521,7 @@
 %     \exp_last_unbraced:Nf,
 %     \exp_last_unbraced:NNo,
 %     \exp_last_unbraced:NNV,
+%     \exp_last_unbraced:NNf,
 %     \exp_last_unbraced:Nco,
 %     \exp_last_unbraced:NcV,
 %     \exp_last_unbraced:Nno,
@@ -528,8 +529,10 @@
 %     \exp_last_unbraced:Nfo,
 %     \exp_last_unbraced:NNNo,
 %     \exp_last_unbraced:NNNV,
+%     \exp_last_unbraced:NNNf,
 %     \exp_last_unbraced:NnNo,
 %     \exp_last_unbraced:NNNNo,
+%     \exp_last_unbraced:NNNNf,
 %   }
 %   \begin{syntax}
 %     \cs{exp_last_unbraced:Nno} \meta{token} \Arg{tokens_1} \Arg{tokens_2}
@@ -1424,15 +1427,18 @@
 %     \exp_last_unbraced:Nf,
 %     \exp_last_unbraced:NNo,
 %     \exp_last_unbraced:NNV,
+%     \exp_last_unbraced:NNf,
 %     \exp_last_unbraced:Nco,
 %     \exp_last_unbraced:NcV,
 %     \exp_last_unbraced:NNNo,
 %     \exp_last_unbraced:NNNV,
+%     \exp_last_unbraced:NNNf,
 %     \exp_last_unbraced:Nno,
 %     \exp_last_unbraced:Noo,
 %     \exp_last_unbraced:Nfo,
 %     \exp_last_unbraced:NnNo,
 %     \exp_last_unbraced:NNNNo,
+%     \exp_last_unbraced:NNNNf,
 %   }
 % \begin{macro}{\exp_last_unbraced:Nx}
 %   Now the business end: most of these are hand-tuned for speed, but the
@@ -1453,6 +1459,12 @@
     \exp_after:wN #2
     \exp:w \@@_eval_register:N #3
   }
+\cs_new:Npn \exp_last_unbraced:NNf #1#2#3
+  {
+    \exp_after:wN #1
+    \exp_after:wN #2
+    \exp:w \exp_end_continue_f:w #3
+  }
 \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
@@ -1470,6 +1482,13 @@
     \exp_after:wN #3
     \exp:w \@@_eval_register:N #4
   }
+\cs_new:Npn \exp_last_unbraced:NNNf #1#2#3#4
+  {
+    \exp_after:wN #1
+    \exp_after:wN #2
+    \exp_after:wN #3
+    \exp:w \exp_end_continue_f:w #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 \::: }
@@ -1476,6 +1495,14 @@
 \cs_new:Npn \exp_last_unbraced:NnNo { \::n \::N \::o_unbraced \::: }
 \cs_new:Npn \exp_last_unbraced:NNNNo #1#2#3#4#5
   { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN #3 \exp_after:wN #4 #5 }
+\cs_new:Npn \exp_last_unbraced:NNNNf #1#2#3#4#5
+  {
+    \exp_after:wN #1
+    \exp_after:wN #2
+    \exp_after:wN #3
+    \exp_after:wN #4
+    \exp:w \exp_end_continue_f:w #5
+  }
 \cs_new_protected:Npn \exp_last_unbraced:Nx { \::x_unbraced \::: }
 %    \end{macrocode}
 % \end{macro}
@@ -1505,7 +1532,7 @@
 %   At the kernel level, we need the primitive behaviour to allow expansion
 %   \emph{before} the brace group.
 %    \begin{macrocode}
-\cs_new_eq:NN \__kernel_exp_not:w \etex_unexpanded:D
+\cs_new_eq:NN \__kernel_exp_not:w \tex_unexpanded:D
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1520,7 +1547,7 @@
 \cs_new:Npn \exp_not:c #1 { \exp_after:wN \exp_not:N \cs:w #1 \cs_end: }
 \cs_new:Npn \exp_not:o #1 { \__kernel_exp_not:w \exp_after:wN {#1} }
 \cs_new:Npn \exp_not:f #1
-  { \etex_unexpanded:D \exp_after:wN { \exp:w \exp_end_continue_f:w #1 } }
+  { \tex_unexpanded:D \exp_after:wN { \exp:w \exp_end_continue_f:w #1 } }
 \cs_new:Npn \exp_not:V #1
   {
     \__kernel_exp_not:w \exp_after:wN

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -934,7 +934,7 @@
     \exp_args:Nno \use:n
       {
         \int_set:Nn \tex_endlinechar:D { -1 }
-        \etex_readline:D #1 to #2
+        \tex_readline:D #1 to #2
         \int_set:Nn \tex_endlinechar:D
       }   { \int_use:N \tex_endlinechar:D }
   }
@@ -1020,7 +1020,7 @@
   {
     \bool_lazy_and:nnTF
       { \sys_if_engine_luatex_p: }
-      { \int_compare_p:nNn \luatex_luatexversion:D > { 80 } }
+      { \int_compare_p:nNn \tex_luatexversion:D > { 80 } }
       { 128 }
       { 16 }
   }
@@ -2349,7 +2349,7 @@
 %   Contrarily to most other deprecated commands this is expandable
 %   so we need to put code by hand in two token lists.  We use
 %   \cs{tex_def:D} directly because \cs{g_file_current_name_tl} is made
-%   outer by \cs{debug_deprecation_on:}.
+%   outer by \cs{debug_on:n} \texttt{\{deprecation\}}.
 %    \begin{macrocode}
 \tl_new:N \g_file_current_name_tl
 \tl_gset:Nn \g_file_current_name_tl { \g_file_curr_name_str }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3final.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -122,7 +122,7 @@
 % the set up is easier.
 %    \begin{macrocode}
     \sys_if_engine_uptex:T
-      { \uptex_disablecjktoken:D }
+      { \tex_disablecjktoken:D }
 %    \end{macrocode}
 % The actual mappings: these are kept low-level for performance reasons.
 %    \begin{macrocode}
@@ -335,8 +335,8 @@
 %    \begin{macrocode}
 \dim_set:Nn \tex_hsize:D { 345pt }
 \skip_set:Nn \tex_parfillskip:D { 0pt plus 1fil }
-\cs_if_exist:NT \pdftex_pdfoutput:D
-  { \int_set:Nn \pdftex_pdfoutput:D { 1 } }
+\cs_if_exist:NT \tex_pdfoutput:D
+  { \int_set:Nn \tex_pdfoutput:D { 1 } }
 %    \end{macrocode}
 %
 % \begin{macro}{\stop}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3format.ins	2018-05-13 21:56:47 UTC (rev 47705)
@@ -78,6 +78,7 @@
         \from{l3file.dtx}       {initex}
         \from{l3skip.dtx}       {initex}
         \from{l3keys.dtx}       {initex}
+        \from{l3intarray.dtx}   {initex}
         \from{l3fp.dtx}         {initex}
         \from{l3fp-aux.dtx}     {initex}
         \from{l3fp-traps.dtx}   {initex}
@@ -91,7 +92,7 @@
         \from{l3fp-trig.dtx}    {initex}
         \from{l3fp-convert.dtx} {initex}
         \from{l3fp-random.dtx}  {initex}
-        \from{l3intarray.dtx}   {initex}
+        \from{l3fparray.dtx}    {package}
         \from{l3sort.dtx}       {initex}
         \from{l3tl-analysis.dtx}{initex}
         \from{l3regex.dtx}      {initex}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -71,7 +71,7 @@
 %   use private names. The same is true for \tn{romannumeral}, although it
 %   is used much less widely.
 %    \begin{macrocode}
-\cs_new_eq:NN \@@_int_eval:w \etex_numexpr:D
+\cs_new_eq:NN \@@_int_eval:w \tex_numexpr:D
 \cs_new_eq:NN \@@_int_eval_end: \scan_stop:
 \cs_new_eq:NN \@@_int_to_roman:w \tex_romannumeral:D
 %    \end{macrocode}
@@ -1245,17 +1245,17 @@
 %   No \pkg{l3sys} or \pkg{l3luatex} just yet so we have to define in terms of
 %   primitives.
 %    \begin{macrocode}
-\cs_new:Npn \@@_str_if_eq_x:nn #1#2 { \pdftex_strcmp:D {#1} {#2} }
+\cs_new:Npn \@@_str_if_eq_x:nn #1#2 { \tex_strcmp:D {#1} {#2} }
 \sys_if_engine_luatex:T
   {
     \cs_set:Npn \@@_str_if_eq_x:nn #1#2
       {
-        \luatex_directlua:D
+        \tex_directlua:D
           {
             l3kernel.strcmp
               (
-                " \luatex_luaescapestring:D {#1}",
-                " \luatex_luaescapestring:D {#2}"
+                " \tex_luaescapestring:D {#1}",
+                " \tex_luaescapestring:D {#2}"
               )
           }
       }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -503,7 +503,7 @@
     \exp_after:wN \@@_from_dim_test:ww
     \exp_after:wN 0
     \exp_after:wN ,
-    \int_value:w \etex_glueexpr:D #1 ;
+    \int_value:w \tex_glueexpr:D #1 ;
   }
 \cs_new:Npn \@@_from_dim_test:ww #1, #2
   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -720,17 +720,88 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{variable}{\c_@@_exp_intarray}
+%   The integer array has $6\times 9\times 4=216$ items encoding the
+%   values of $\exp(j\times 10^i)$ for $j=1,\dots,9$ and $i=-1,\dots,4$.
+%   Each value is expressed as $\simeq 10^p \times 0.m_1m_2m_3$ with
+%   three $8$-digit blocks $m_1$, $m_2$, $m_3$ and an integer
+%   exponent~$p$ (one more than the scientific exponent), and these are
+%   stored in the integer array as four items: $p$, $10^8+m_1$,
+%   $10^8+m_2$, $10^8+m_3$.  The various exponentials are stored in
+%   increasing order of $j\times 10^i$.
+%
+%   Storing this data in an integer array makes it slightly harder to
+%   access (slower, too), but uses $16$ bytes of memory per exponential
+%   stored, while storing as tokens used around $40$ tokens; tokens have
+%   an especially large footprint in Unicode-aware engines.
+%    \begin{macrocode}
+\intarray_const_from_clist:Nn \c_@@_exp_intarray
+  {
+         1 , 1 1105 1709 , 1 1807 5647 , 1 6248 1171 ,
+         1 , 1 1221 4027 , 1 5816 0169 , 1 8339 2107 ,
+         1 , 1 1349 8588 , 1 0757 6003 , 1 1039 8374 ,
+         1 , 1 1491 8246 , 1 9764 1270 , 1 3178 2485 ,
+         1 , 1 1648 7212 , 1 7070 0128 , 1 1468 4865 ,
+         1 , 1 1822 1188 , 1 0039 0508 , 1 9748 7537 ,
+         1 , 1 2013 7527 , 1 0747 0476 , 1 5216 2455 ,
+         1 , 1 2225 5409 , 1 2849 2467 , 1 6045 7954 ,
+         1 , 1 2459 6031 , 1 1115 6949 , 1 6638 0013 ,
+         1 , 1 2718 2818 , 1 2845 9045 , 1 2353 6029 ,
+         1 , 1 7389 0560 , 1 9893 0650 , 1 2272 3043 ,
+         2 , 1 2008 5536 , 1 9231 8766 , 1 7740 9285 ,
+         2 , 1 5459 8150 , 1 0331 4423 , 1 9078 1103 ,
+         3 , 1 1484 1315 , 1 9102 5766 , 1 0342 1116 ,
+         3 , 1 4034 2879 , 1 3492 7351 , 1 2260 8387 ,
+         4 , 1 1096 6331 , 1 5842 8458 , 1 5992 6372 ,
+         4 , 1 2980 9579 , 1 8704 1728 , 1 2747 4359 ,
+         4 , 1 8103 0839 , 1 2757 5384 , 1 0077 1000 ,
+         5 , 1 2202 6465 , 1 7948 0671 , 1 6516 9579 ,
+         9 , 1 4851 6519 , 1 5409 7902 , 1 7796 9107 ,
+        14 , 1 1068 6474 , 1 5815 2446 , 1 2146 9905 ,
+        18 , 1 2353 8526 , 1 6837 0199 , 1 8540 7900 ,
+        22 , 1 5184 7055 , 1 2858 7072 , 1 4640 8745 ,
+        27 , 1 1142 0073 , 1 8981 5684 , 1 2836 6296 ,
+        31 , 1 2515 4386 , 1 7091 9167 , 1 0062 6578 ,
+        35 , 1 5540 6223 , 1 8439 3510 , 1 0525 7117 ,
+        40 , 1 1220 4032 , 1 9431 7840 , 1 8020 0271 ,
+        44 , 1 2688 1171 , 1 4181 6135 , 1 4484 1263 ,
+        87 , 1 7225 9737 , 1 6812 5749 , 1 2581 7748 ,
+       131 , 1 1942 4263 , 1 9524 1255 , 1 9365 8421 ,
+       174 , 1 5221 4696 , 1 8976 4143 , 1 9505 8876 ,
+       218 , 1 1403 5922 , 1 1785 2837 , 1 4107 3977 ,
+       261 , 1 3773 0203 , 1 0092 9939 , 1 8234 0143 ,
+       305 , 1 1014 2320 , 1 5473 5004 , 1 5094 5533 ,
+       348 , 1 2726 3745 , 1 7211 2566 , 1 5673 6478 ,
+       391 , 1 7328 8142 , 1 2230 7421 , 1 7051 8866 ,
+       435 , 1 1970 0711 , 1 1401 7046 , 1 9938 8888 ,
+       869 , 1 3881 1801 , 1 9428 4368 , 1 5764 8232 ,
+      1303 , 1 7646 2009 , 1 8905 4704 , 1 8893 1073 ,
+      1738 , 1 1506 3559 , 1 7005 0524 , 1 9009 7592 ,
+      2172 , 1 2967 6283 , 1 8402 3667 , 1 0689 6630 ,
+      2606 , 1 5846 4389 , 1 5650 2114 , 1 7278 5046 ,
+      3041 , 1 1151 7900 , 1 5080 6878 , 1 2914 4154 ,
+      3475 , 1 2269 1083 , 1 0850 6857 , 1 8724 4002 ,
+      3909 , 1 4470 3047 , 1 3316 5442 , 1 6408 6591 ,
+      4343 , 1 8806 8182 , 1 2566 2921 , 1 5872 6150 ,
+      8686 , 1 7756 0047 , 1 2598 6861 , 1 0458 3204 ,
+     13029 , 1 6830 5723 , 1 7791 4884 , 1 1932 7351 ,
+     17372 , 1 6015 5609 , 1 3095 3052 , 1 3494 7574 ,
+     21715 , 1 5297 7951 , 1 6443 0315 , 1 3251 3576 ,
+     26058 , 1 4665 6719 , 1 0099 3379 , 1 5527 2929 ,
+     30401 , 1 4108 9724 , 1 3326 3186 , 1 5271 5665 ,
+     34744 , 1 3618 6973 , 1 3140 0875 , 1 3856 4102 ,
+     39087 , 1 3186 9209 , 1 6113 3900 , 1 6705 9685 ,
+  }
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}[rEXP]
 %   {
 %     \@@_exp_pos_large:NnnNwn ,
 %     \@@_exp_large_after:wwn ,
-%     \@@_exp_large:w ,
-%     \@@_exp_large_v:wN,
-%     \@@_exp_large_iv:wN,
-%     \@@_exp_large_iii:wN,
-%     \@@_exp_large_ii:wN,
-%     \@@_exp_large_i:wN,
-%     \@@_exp_large_:wN,
+%     \@@_exp_large:NwN ,
+%     \@@_exp_intarray:w ,
+%     \@@_exp_intarray_aux:w ,
 %   }
 %   The first two arguments are irrelevant (a rounding digit, and a
 %   brace group with $8$ zeros).  The third argument is the integer part
@@ -740,122 +811,56 @@
 %   ensures that an integer part of $0$ is also removed.  Then read
 %   digits one by one, looking up $\exp(\meta{digit}\cdot
 %   10^{\meta{exponent}})$ in a table, and multiplying that to the
-%   current total.  The loop is done by having the auxiliary for one
-%   exponent call the auxiliary for the next exponent.  The current
-%   total is expressed by leaving the exponent behind in the input
-%   stream (we are currently within an \cs{@@_int_eval:w}), and keeping
-%   track of a fixed point number, |#1| for the numbered auxiliaries.
-%   Our usage of \cs{if_case:w} is somewhat dirty for optimization:
-%   \TeX{} jumps to the appropriate case, but we then close the
-%   \cs{if_case:w} \enquote{by hand}, using \cs{or:} and \cs{fi:} as
-%   delimiters.
+%   current total.  The loop is done by \cs{@@_exp_large:NwN}, whose
+%   |#1| is the \meta{exponent}, |#2| is the current mantissa, and |#3|
+%   is the \meta{digit}.  At the end, \cs{@@_exp_large_after:wwn} moves
+%   on to the Taylor series, eventually multiplied with the mantissa
+%   that we have just computed.
 %    \begin{macrocode}
 \cs_new:Npn \@@_exp_pos_large:NnnNwn #1#2#3 #4#5; #6
   {
-    \exp_after:wN \exp_after:wN
-    \cs:w @@_exp_large_ \@@_int_to_roman:w #6 :wN \exp_after:wN \cs_end:
+    \exp_after:wN \exp_after:wN \exp_after:wN \@@_exp_large:NwN
+    \exp_after:wN \exp_after:wN \exp_after:wN #6
     \exp_after:wN \c_@@_one_fixed_tl
     \int_value:w #3 #4 \exp_stop_f:
     #5 00000 ;
   }
-\cs_new:Npn \@@_exp_large:w #1 \or: #2 \fi:
-  { \fi: \@@_fixed_mul:wwn #1; }
-\cs_new:Npn \@@_exp_large_v:wN #1; #2
+\cs_new:Npn \@@_exp_large:NwN #1#2; #3
   {
-    \if_case:w #2 ~           \exp_after:wN \@@_fixed_continue:wn  \or:
-      +  4343 \@@_exp_large:w {8806}{8182}{2566}{2921}{5872}{6150} \or:
-      +  8686 \@@_exp_large:w {7756}{0047}{2598}{6861}{0458}{3204} \or:
-      + 13029 \@@_exp_large:w {6830}{5723}{7791}{4884}{1932}{7351} \or:
-      + 17372 \@@_exp_large:w {6015}{5609}{3095}{3052}{3494}{7574} \or:
-      + 21715 \@@_exp_large:w {5297}{7951}{6443}{0315}{3251}{3576} \or:
-      + 26058 \@@_exp_large:w {4665}{6719}{0099}{3379}{5527}{2929} \or:
-      + 30401 \@@_exp_large:w {4108}{9724}{3326}{3186}{5271}{5665} \or:
-      + 34744 \@@_exp_large:w {3618}{6973}{3140}{0875}{3856}{4102} \or:
-      + 39087 \@@_exp_large:w {3186}{9209}{6113}{3900}{6705}{9685} \or:
+    \if_case:w #3 ~
+      \exp_after:wN \@@_fixed_continue:wn
+    \else:
+      \exp_after:wN \@@_exp_intarray:w
+      \int_value:w \@@_int_eval:w 36 * #1 + 4 * #3 \exp_after:wN ;
     \fi:
-    #1;
-    \@@_exp_large_iv:wN
+    #2;
+    {
+      \if_meaning:w 0 #1
+        \exp_after:wN \@@_exp_large_after:wwn
+      \else:
+        \exp_after:wN \@@_exp_large:NwN
+        \int_value:w \@@_int_eval:w #1 - 1 \exp_after:wN \scan_stop:
+      \fi:
+    }
   }
-\cs_new:Npn \@@_exp_large_iv:wN #1; #2
+\cs_new:Npn \@@_exp_intarray:w #1 ;
   {
-    \if_case:w #2 ~          \exp_after:wN \@@_fixed_continue:wn  \or:
-      +  435 \@@_exp_large:w {1970}{0711}{1401}{7046}{9938}{8888} \or:
-      +  869 \@@_exp_large:w {3881}{1801}{9428}{4368}{5764}{8232} \or:
-      + 1303 \@@_exp_large:w {7646}{2009}{8905}{4704}{8893}{1073} \or:
-      + 1738 \@@_exp_large:w {1506}{3559}{7005}{0524}{9009}{7592} \or:
-      + 2172 \@@_exp_large:w {2967}{6283}{8402}{3667}{0689}{6630} \or:
-      + 2606 \@@_exp_large:w {5846}{4389}{5650}{2114}{7278}{5046} \or:
-      + 3041 \@@_exp_large:w {1151}{7900}{5080}{6878}{2914}{4154} \or:
-      + 3475 \@@_exp_large:w {2269}{1083}{0850}{6857}{8724}{4002} \or:
-      + 3909 \@@_exp_large:w {4470}{3047}{3316}{5442}{6408}{6591} \or:
-    \fi:
-    #1;
-    \@@_exp_large_iii:wN
+    +
+    \__kernel_intarray_item:Nn \c_@@_exp_intarray
+      { \@@_int_eval:w #1 - 3 \scan_stop: }
+    \exp_after:wN \use_i:nnn
+    \exp_after:wN \@@_fixed_mul:wwn
+    \int_value:w 0
+    \exp_after:wN \@@_exp_intarray_aux:w
+    \int_value:w \__kernel_intarray_item:Nn
+                   \c_@@_exp_intarray { \@@_int_eval:w #1 - 2 }
+    \exp_after:wN \@@_exp_intarray_aux:w
+    \int_value:w \__kernel_intarray_item:Nn
+                   \c_@@_exp_intarray { \@@_int_eval:w #1 - 1 }
+    \exp_after:wN \@@_exp_intarray_aux:w
+    \int_value:w \__kernel_intarray_item:Nn \c_@@_exp_intarray {#1} ; ;
   }
-\cs_new:Npn \@@_exp_large_iii:wN #1; #2
-  {
-    \if_case:w #2 ~         \exp_after:wN \@@_fixed_continue:wn  \or:
-      +  44 \@@_exp_large:w {2688}{1171}{4181}{6135}{4484}{1263} \or:
-      +  87 \@@_exp_large:w {7225}{9737}{6812}{5749}{2581}{7748} \or:
-      + 131 \@@_exp_large:w {1942}{4263}{9524}{1255}{9365}{8421} \or:
-      + 174 \@@_exp_large:w {5221}{4696}{8976}{4143}{9505}{8876} \or:
-      + 218 \@@_exp_large:w {1403}{5922}{1785}{2837}{4107}{3977} \or:
-      + 261 \@@_exp_large:w {3773}{0203}{0092}{9939}{8234}{0143} \or:
-      + 305 \@@_exp_large:w {1014}{2320}{5473}{5004}{5094}{5533} \or:
-      + 348 \@@_exp_large:w {2726}{3745}{7211}{2566}{5673}{6478} \or:
-      + 391 \@@_exp_large:w {7328}{8142}{2230}{7421}{7051}{8866} \or:
-    \fi:
-    #1;
-    \@@_exp_large_ii:wN
-  }
-\cs_new:Npn \@@_exp_large_ii:wN #1; #2
-  {
-    \if_case:w #2 ~        \exp_after:wN \@@_fixed_continue:wn  \or:
-      +  5 \@@_exp_large:w {2202}{6465}{7948}{0671}{6516}{9579} \or:
-      +  9 \@@_exp_large:w {4851}{6519}{5409}{7902}{7796}{9107} \or:
-      + 14 \@@_exp_large:w {1068}{6474}{5815}{2446}{2146}{9905} \or:
-      + 18 \@@_exp_large:w {2353}{8526}{6837}{0199}{8540}{7900} \or:
-      + 22 \@@_exp_large:w {5184}{7055}{2858}{7072}{4640}{8745} \or:
-      + 27 \@@_exp_large:w {1142}{0073}{8981}{5684}{2836}{6296} \or:
-      + 31 \@@_exp_large:w {2515}{4386}{7091}{9167}{0062}{6578} \or:
-      + 35 \@@_exp_large:w {5540}{6223}{8439}{3510}{0525}{7117} \or:
-      + 40 \@@_exp_large:w {1220}{4032}{9431}{7840}{8020}{0271} \or:
-    \fi:
-    #1;
-    \@@_exp_large_i:wN
-  }
-\cs_new:Npn \@@_exp_large_i:wN #1; #2
-  {
-    \if_case:w #2 ~       \exp_after:wN \@@_fixed_continue:wn  \or:
-      + 1 \@@_exp_large:w {2718}{2818}{2845}{9045}{2353}{6029} \or:
-      + 1 \@@_exp_large:w {7389}{0560}{9893}{0650}{2272}{3043} \or:
-      + 2 \@@_exp_large:w {2008}{5536}{9231}{8766}{7740}{9285} \or:
-      + 2 \@@_exp_large:w {5459}{8150}{0331}{4423}{9078}{1103} \or:
-      + 3 \@@_exp_large:w {1484}{1315}{9102}{5766}{0342}{1116} \or:
-      + 3 \@@_exp_large:w {4034}{2879}{3492}{7351}{2260}{8387} \or:
-      + 4 \@@_exp_large:w {1096}{6331}{5842}{8458}{5992}{6372} \or:
-      + 4 \@@_exp_large:w {2980}{9579}{8704}{1728}{2747}{4359} \or:
-      + 4 \@@_exp_large:w {8103}{0839}{2757}{5384}{0077}{1000} \or:
-    \fi:
-    #1;
-    \@@_exp_large_:wN
-  }
-\cs_new:Npn \@@_exp_large_:wN #1; #2
-  {
-    \if_case:w #2 ~       \exp_after:wN \@@_fixed_continue:wn  \or:
-      + 1 \@@_exp_large:w {1105}{1709}{1807}{5647}{6248}{1171} \or:
-      + 1 \@@_exp_large:w {1221}{4027}{5816}{0169}{8339}{2107} \or:
-      + 1 \@@_exp_large:w {1349}{8588}{0757}{6003}{1039}{8374} \or:
-      + 1 \@@_exp_large:w {1491}{8246}{9764}{1270}{3178}{2485} \or:
-      + 1 \@@_exp_large:w {1648}{7212}{7070}{0128}{1468}{4865} \or:
-      + 1 \@@_exp_large:w {1822}{1188}{0039}{0508}{9748}{7537} \or:
-      + 1 \@@_exp_large:w {2013}{7527}{0747}{0476}{5216}{2455} \or:
-      + 1 \@@_exp_large:w {2225}{5409}{2849}{2467}{6045}{7954} \or:
-      + 1 \@@_exp_large:w {2459}{6031}{1115}{6949}{6638}{0013} \or:
-    \fi:
-    #1;
-    \@@_exp_large_after:wwn
-  }
+\cs_new:Npn \@@_exp_intarray_aux:w 1 #1#2#3#4#5 ; { ; {#1#2#3#4} {#5} }
 \cs_new:Npn \@@_exp_large_after:wwn #1; #2; #3
   {
     \@@_exp_Taylor:Nnnwn ? { } { } 0 #2; {} #3
@@ -1142,7 +1147,11 @@
     \fi:
   }
 \cs_new:Npn \@@_pow_C_pack:w
-  { \exp_after:wN \@@_exp_large_v:wN \c_@@_one_fixed_tl }
+  {
+    \exp_after:wN \@@_exp_large:NwN
+    \exp_after:wN 5
+    \c_@@_one_fixed_tl
+  }
 %    \end{macrocode}
 % \end{macro}
 %^^A end[todo]

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -442,7 +442,8 @@
 %     \cs{@@_fixed_mul_sub_back:wwwn} \meta{a} |;| \meta{b} |;| \meta{c} |;| \Arg{continuation}
 %     \cs{@@_fixed_one_minus_mul:wwn} \meta{a} |;| \meta{b} |;| \Arg{continuation}
 %   \end{syntax}
-%   Compute $a\times b + c$, $c - a\times b$, and $1 - a\times b$ and
+%   Sometimes called |FMA| (fused multiply-add), these functions
+%   compute $a\times b + c$, $c - a\times b$, and $1 - a\times b$ and
 %   feed the result to the \meta{continuation}.  Those functions require
 %   $0\leq a_{1}, b_{1}, c_{1} \leq 10000$.  Since those functions are
 %   at the heart of the computation of Taylor expansions, we

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -496,7 +496,7 @@
 %   \item If the next token is a control sequence, it could be the
 %     special marker \cs{s_@@_mark}, and
 %     otherwise it is a case of juxtaposing numbers, such as
-%     |2\c_zero|, with an implied multiplication.
+%     |2\c_zero_int|, with an implied multiplication.
 %   \item If the next token is a letter, it is also a case of
 %     juxtaposition, as letters cannot be proper infix operators.
 %   \item Otherwise (including in the case of digits), if the token is a
@@ -503,7 +503,7 @@
 %     known infix operator, the appropriate
 %     |\__fp_infix_|\meta{operator}|:N| function is built, and if it
 %     does not exist, we complain.  In particular, the juxtaposition
-%     |\c_zero 2| is disallowed.
+%     |\c_zero_int 2| is disallowed.
 % \end{itemize}
 %
 % In the above, we need to test whether a character token~|#1| is a
@@ -2812,113 +2812,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsection{Candidate: defining new \pkg{l3fp} functions}
-%
-% \begin{macro}[EXP]{\fp_function:Nw}
-%   Parse the argument of the function~|#1| using
-%   \cs{@@_parse_operand:Nw} with a precedence of~$16$, and pass the
-%   function and argument to \cs{@@_function_apply:nw}.
-%    \begin{macrocode}
-\cs_new:Npn \fp_function:Nw #1
-  {
-    \exp_after:wN \@@_function_apply:nw
-    \exp_after:wN #1
-    \exp:w
-      \@@_parse_operand:Nw \c_@@_prec_func_int \@@_parse_expand:w
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\fp_new_function:Npn}
-% \begin{macro}{\@@_new_function:NNnnn, \@@_new_function:Ncfnn}
-% \begin{macro}{\@@_function_args:Nwn}
-%   Save the code provided by the user in the control sequence
-%   |\__fp_user_#1|.  Define |#1| to call \cs{@@_function_apply:nw}
-%   after parsing one operand using \cs{@@_parse_operand:Nw} with
-%   precedence~$16$.  The auxiliary \cs{@@_function_args:Nwn} receives
-%   the user function and the number of arguments (half of the number of
-%   tokens in the parameter text~|#2|), followed by the operand (as a
-%   token list of floating points).  It checks the number of arguments,
-%   and applies the user function to the arguments (without the outer
-%   brace group).
-%    \begin{macrocode}
-\cs_new_protected:Npn \fp_new_function:Npn #1#2#
-  {
-    \@@_new_function:Ncfnn #1
-      { @@_user_ \cs_to_str:N #1 }
-      { \int_eval:n { \tl_count:n {#2} / 2 } }
-      {#2}
-  }
-\cs_new_protected:Npn \@@_new_function:NNnnn #1#2#3#4#5
-  {
-    \cs_new:Npn #1
-      {
-        \exp_after:wN \@@_function_apply:nw \exp_after:wN
-          {
-            \exp_after:wN \@@_function_args:Nwn
-            \exp_after:wN #2
-            \int_value:w #3 \exp_after:wN ; \exp_after:wN
-          }
-        \exp:w
-          \@@_parse_operand:Nw \c_@@_prec_func_int \@@_parse_expand:w
-      }
-    \cs_new:Npn #2 #4 {#5}
-  }
-\cs_generate_variant:Nn \@@_new_function:NNnnn { Ncf }
-\cs_new:Npn \@@_function_args:Nwn #1#2; #3
-  {
-    \int_compare:nNnTF { \tl_count:n {#3} } = {#2}
-      { #1 #3 }
-      {
-        \__kernel_msg_expandable_error:nnnnn
-          { kernel } { fp-num-args } { #1() } {#2} {#2}
-        \c_nan_fp
-      }
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]
-%   {
-%     \@@_function_apply:nw,
-%     \@@_function_store:wwNwnn,
-%     \@@_function_store_end:wnnn
-%   }
-%   The auxiliary \cs{@@_function_apply:nw} is called after parsing an
-%   operand, so it receives some code~|#1|, then the operand ending
-%   with~|@|, then a function such as \cs{@@_parse_infix_+:N} (but not
-%   always of this form, see comparisons for instance).  Package the
-%   operand (an array) into a token list with floating point items: this
-%   is the role of \cs{@@_function_store:wwNwnn} and
-%   \cs{@@_function_store_end:wnnn}.  Then apply \cs{@@_parse:n} to the
-%   code~|#1| followed by a brace group with this token list.  This
-%   results in a floating point result, which is then correctly parsed
-%   as the next operand of whatever was looking for one.  The trailing
-%   \cs{s_@@_mark} is used as a special infix operator to indicate that
-%   the next token has already gone through \cs{@@_parse_infix:NN}.
-%    \begin{macrocode}
-\cs_new:Npn \@@_function_apply:nw #1#2 @
-  {
-    \@@_parse:n
-      {
-        \@@_function_store:wwNwnn #2
-          \s_@@_mark \@@_function_store:wwNwnn ;
-          \s_@@_mark \@@_function_store_end:wnnn
-        \s_@@_stop { } { } {#1}
-      }
-    \s_@@_mark
-  }
-\cs_new:Npn \@@_function_store:wwNwnn
-    #1; #2 \s_@@_mark #3#4 \s_@@_stop #5#6
-  { #3 #2 \s_@@_mark #3#4 \s_@@_stop { #5 #6 } { { #1; } } }
-\cs_new:Npn \@@_function_store_end:wnnn
-    #1 \s_@@_stop #2#3#4
-  { #4 {#2} }
-%    \end{macrocode}
-% \end{macro}
-%
 % ^^A end[todo]
 %
 % \subsection{Messages}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -71,146 +71,280 @@
 %
 % \subsection{Engine support}
 %
-% At present, \XeTeX{} does not provide random
-% numbers, while \pdfTeX{}, \LuaTeX{}, \pTeX{} and \upTeX{} provide the primitive
-% \cs{pdftex_uniformdeviate:D}.  We write the test twice simply in
-% order to write the \texttt{false} branch first.
+% Most engines provide random numbers, but not all.  We write the test
+% twice simply in order to write the \texttt{false} branch first.
 %    \begin{macrocode}
-\cs_if_exist:NF \pdftex_uniformdeviate:D
+\sys_if_rand_exist:F
   {
     \__kernel_msg_new:nnn { kernel } { fp-no-random }
-      { Random~numbers~unavailable }
+      { Random~numbers~unavailable~for~#1 }
     \cs_new:Npn \@@_rand_o:Nw ? #1 @
       {
-        \__kernel_msg_expandable_error:nn { kernel } { fp-no-random }
+        \__kernel_msg_expandable_error:nnn { kernel } { fp-no-random }
+          { fp~rand }
         \exp_after:wN \c_nan_fp
       }
     \cs_new_eq:NN \@@_randint_o:Nw \@@_rand_o:Nw
     \cs_new:Npn \int_rand:nn #1#2
       {
-        \__kernel_msg_expandable_error:nn { kernel } { fp-no-random }
+        \__kernel_msg_expandable_error:nnn { kernel } { fp-no-random }
+          { \int_rand:nn {#1} {#2} }
         \int_eval:n {#1}
       }
+    \cs_new:Npn \int_rand:n #1
+      {
+        \__kernel_msg_expandable_error:nnn { kernel } { fp-no-random }
+          { \int_rand:n {#1} }
+        1
+      }
   }
-\cs_if_exist:NT \pdftex_uniformdeviate:D
+\sys_if_rand_exist:T
   {
 %    \end{macrocode}
 %
-% \begin{macro}[EXP]{\@@_rand_uniform:}
-% \begin{variable}
-%   {
-%     \c_@@_rand_size_int,
-%     \c_@@_rand_four_int,
-%     \c_@@_rand_eight_int,
-%   }
-%   The \cs{pdftex_uniformdeviate:D} primitive gives a pseudo-random
-%   integer in a range $[0,n-1]$ of the user's choice.  This number is
-%   meant to be uniformly distributed, but is produced by rescaling a
-%   uniform pseudo-random integer in $[0,2^{28}-1]$.  For instance,
-%   setting~$n$ to (any multiple of) $2^{29}$ gives only even values.
-%   Thus it is only safe to call \cs{pdftex_uniformdeviate:D} with
-%   argument $2^{28}$.  This integer is also used in the implementation
-%   of \cs{int_rand:nn}.  We also use variants of this number
-%   rounded down to multiples of $10^4$ and $10^8$.
+% Obviously, every word \enquote{random} below means
+% \enquote{pseudo-random}, as we have no access to entropy (except a
+% very unreliable source of entropy: the time it takes to run some
+% code).
+%
+% The primitive random number generator (RNG) is provided as
+% \cs{tex_uniformdeviate:D}.  Under the hood, it maintains an array of
+% $55$ $28$-bit numbers, updated with a linear recursion relation
+% (similar to Fibonacci numbers) modulo $2^{28}$.  When
+% \cs{tex_uniformdeviate:D} \meta{integer} is called (for brevity denote
+% by~$N$ the \meta{integer}), the next $28$-bit number is read from the
+% array, scaled by $N/2^{28}$, and rounded.  To prevent $0$ and $N$ from
+% appearing half as often as other numbers, they are both mapped to the
+% result~$0$.
+%
+% This process means that \cs{tex_uniformdeviate:D} only gives a uniform
+% distribution from $0$ to $N-1$ if $N$ is a divisor of $2^{28}$, so we
+% will mostly call the RNG with such power of~$2$ arguments.  If $N$
+% does not divide $2^{28}$, then the relative non-uniformity (difference
+% between probabilities of getting different numbers) is about
+% $N/2^{28}$.  This implies that detecting deviation from $1/N$ of the
+% probability of a fixed value X requires about $2^{56}/N$ random
+% trials. But collective patterns can reduce this to about
+% $2^{56}/N^2$. For instance with $N=3\times 2^{k}$, the modulo~$3$
+% repartition of such random numbers is biased with a non-uniformity
+% about $2^k/2^{28}$ (which is much worse than the circa $3/2^{28}$
+% non-uniformity from taking directly $N=3$).  This is detectable after
+% about $2^{56}/2^{2k} = 9\cdot 2^{56}/N^2$ random numbers. For $k=15$,
+% $N=98304$, this means roughly $2^{26}$ calls to the RNG
+% (experimentally this takes at the very least 16 seconds on a 2 giga-hertz
+% processor). While this bias is not quite problematic, it is
+% uncomfortably close to being so, and it becomes worse as $N$ is
+% increased.  In our code, we shall thus combine several results from
+% the RNG\@.
+%
+% The RNG has three types of unexpected correlations.  First, everything
+% is linear modulo~$2^{28}$, hence the lowest $k$ bits of the random
+% numbers only depend on the lowest $k$ bits of the seed (and of course
+% the number of times the RNG was called since setting the seed).  The
+% recommended way to get a number from $0$ to $N-1$ is thus to scale the
+% raw $28$-bit integer, as the engine's RNG does.  We will go further
+% and in fact typically we discard some of the lowest bits.
+%
+% Second, suppose that we call the RNG with the same argument~$N$ to get
+% a set of $K$ integers in $[0,N-1]$ (throwing away repeats), and
+% suppose that $N>K^3$ and $K>55$.  The recursion used to construct more
+% $28$-bit numbers from previous ones is linear:
+% $x_n = x_{n-55} - x_{n-24}$ or $x_n = x_{n-55}-x_{n-24}+2^{28}$.
+% After rescaling and rounding we find that the result $N_n\in[0,N-1]$
+% is among $N_{n-55} - N_{n-24} + \{-1,0,1\}$ modulo~$N$ (a more
+% detailed analysis shows that $0$ appears with frequency close
+% to~$3/4$).  The resulting set thus has more triplets $(a,b,c)$ than
+% expected obeying $a=b+c$ modulo~$N$.  Namely it will have of order
+% $(K-55)\times 3/4$ such triplets, when one would expect $K^3/(6N)$.
+% This starts to be detectable around $N=2^{18}>55^3$ (earlier if one
+% keeps track of positions too, but this is more subtle than it looks
+% because the array of $28$-bit integers is read backwards by the
+% engine).  Hopefully the correlation is subtle enough to not affect
+% realistic documents so we do not specifically mitigate against this.
+% Since we typically use two calls to the RNG per \cs{int_rand:nn} we
+% would need to investigate linear relations between the $x_{2n}$ on the
+% one hand and between the $x_{2n+1}$ on the other hand.  Such relations
+% will have more complicated coefficients than $\pm 1$, which alleviates
+% the issue.
+%
+% Third, consider successive batches of $165$ calls to the RNG (with
+% argument $2^{28}$ or with argument~$2$ for instance), then most
+% batches have more odd than even numbers.  Note that this does not mean
+% that there are more odd than even numbers overall.  Similar issues are
+% discussed in Knuth's TAOCP volume 2 near exercise 3.3.2-31.  We do not
+% have any mitigation strategy for this.
+%
+% Ideally, our algorithm should be:
+% \begin{itemize}
+% \item Uniform.  The result should be as uniform as possible assuming
+%   that the RNG's underlying $28$-bit integers are uniform.
+% \item Uncorrelated.  The result should not have detectable
+%   correlations between different seeds, similar to the lowest-bit ones
+%   mentioned earlier.
+% \item Quick.  The algorithm should be fast in \TeX{}, so no
+%   \enquote{bit twiddling}, but \enquote{digit twiddling} is ok.
+% \item Simple.  The behaviour must be documentable precisely.
+% \item Predictable.  The number of calls to the RNG should be the same
+%   for any \cs{int_rand:nn}, because then the algorithm can be modified
+%   later without changing the result of other uses of the RNG\@.
+% \item Robust.  It should work even for \cs{int_rand:nn} |{| |-|
+%   \cs{c_max_int} |}| |{| \cs{c_max_int} |}| where the range is not
+%   representable as an integer.  In fact, we also provide later a
+%   floating-point |randint| whose range can go all the way up to
+%   $2\times 10^{16}-1$ possible values.
+% \end{itemize}
+% Some of these requirements conflict.  For instance, uniformity cannot
+% be achieved with a fixed number of calls to the RNG\@.
+%
+% Denote by $\operatorname{random}(N)$ one call to
+% \cs{tex_uniformdeviate:D} with argument~$N$, and by
+% $\operatorname{ediv}(p,q)$ the \eTeX{} rounding division giving
+% $\lfloor p/q+1/2\rfloor$.  Denote by $\meta{min}$, $\meta{max}$ and
+% $R=\meta{max}-\meta{min}+1$ the arguments of \cs{int_min:nn} and the
+% number of possible outcomes.  Note that $R\in [1,2^{32}-1]$ cannot
+% necessarily be represented as an integer (however, $R-2^{31}$ can).
+% Our strategy is to get two $28$-bit integers $X$ and $Y$ from the RNG,
+% split each into $14$-bit integers, as $X=X_1\times 2^{14}+X_0$ and
+% $Y=Y_1\times 2^{14}+Y_0$ then return essentially
+% $\meta{min} + \lfloor R (X_1\times 2^{-14} + Y_1\times 2^{-28} +
+% Y_0\times 2^{-42} + X_0\times 2^{-56})\rfloor$.  For small~$R$ the
+% $X_0$ term has a tiny effect so we ignore it and we can compute
+% $R\times Y/2^{28}$ much more directly by $\operatorname{random}(R)$.
+% \begin{itemize}
+% \item If $R \leq 2^{17}-1$ then return
+%   $\operatorname{ediv}(R\operatorname{random}(2^{14}) +
+%   \operatorname{random}(R) + 2^{13}, 2^{14}) - 1 + \meta{min}$.  The
+%   shifts by $2^{13}$ and $-1$ convert \eTeX{} division to truncated
+%   division.  The bound on $R$ ensures that the number obtained after
+%   the shift is less than \cs{c_max_int}.  The non-uniformity is at
+%   most of order $2^{17}/2^{42} = 2^{-25}$.
+% \item Split $R=R_2\times 2^{28}+R_1\times 2^{14}+R_0$, where
+%   $R_2\in [0,15]$.  Compute
+%   $\meta{min} + R_2 X_1 2^{14} + (R_2 Y_1 + R_1 X_1) +
+%   \operatorname{ediv}(R_2 Y_0 + R_1 Y_1 + R_0 X_1 +
+%   \operatorname{ediv}(R_2 X_0 + R_0 Y_1 + \operatorname{ediv}((2^{14}
+%   R_1 + R_0) (2^{14} Y_0 + X_0), 2^{28}), 2^{14}), 2^{14})$ then map a
+%   result of $\meta{max}+1$ to $\meta{min}$.  Writing each
+%   $\operatorname{ediv}$ in terms of truncated division with a shift,
+%   and using
+%   $\lfloor(p+\lfloor r/s\rfloor)/q\rfloor =
+%   \lfloor(ps+r)/(sq)\rfloor$, what we compute is equal to
+%   $\lfloor\meta{exact}+2^{-29}+2^{-15}+2^{-1}\rfloor$ with
+%   $\meta{exact}=\meta{min} + R \times 0.X_1Y_1Y_0X_0$.  Given we map
+%   $\meta{max}+1$ to $\meta{min}$, the shift has no effect on
+%   uniformity.  The non-uniformity is bounded by $R/2^{56}<2^{-24}$.  It
+%   may be possible to speed up the code by dropping tiny terms such as
+%   $R_0 X_0$, but the analysis of non-uniformity proves too difficult.
+%
+%   To avoid the overflow when the computation yields $\meta{max}+1$
+%   with $\meta{max}=2^{31}-1$ (note that $R$ is then arbitrary), we
+%   compute the result in two pieces.  Compute
+%   $\meta{first} = \meta{min} + R_2 X_1 2^{14}$ if $R_2<8$ or
+%   $\meta{min} + 8 X_1 2^{14} + (R_2-8) X_1 2^{14}$ if $R_2\geq 8$, the
+%   expressions being chosen to avoid overflow.  Compute
+%   $\meta{second} = R_2 Y_1 + R_1 X_1 + \operatorname{ediv}({\dots})$,
+%   at most
+%   $R_2 2^{14} + R_1 2^{14} + R_0\leq 2^{28} + 15\times 2^{14} - 1$,
+%   not at risk of overflowing.  We have
+%   $\meta{first}+\meta{second}=\meta{max}+1=\meta{min}+R$ if and only
+%   if $\meta{second} = R1 2^{14} + R_0 + R_2 2^{14}$ and
+%   $2^{14} R_2 X_1 = 2^{28} R_2 - 2^{14} R_2$ (namely $R_2=0$ or
+%   $X_1=2^{14}-1$).  In that case, return \meta{min}, otherwise return
+%   $\meta{first}+\meta{second}$, which is safe because it is at most
+%   \meta{max}.  Note that the decision of what to return does not need
+%   \meta{first} explicitly so we don't actually compute it, just put it
+%   in an integer expression in which \meta{second} is eventually added
+%   (or not).
+% \item To get a floating point number in $[0,1)$ just call the
+%   $R=10000\leq 2^{17}-1$ procedure above to produce four blocks of four
+%   digits.
+% \item To get an integer floating point number in a range (whose size
+%   can be up to $2\times 10^{16}-1$), work with fixed-point numbers:
+%   get six times four digits to build a fixed point number, multiply by
+%   $R$ and add $\meta{min}$.  This requires some care because
+%   \pkg{l3fp-extended} only supports non-negative numbers.
+% \end{itemize}
+%
+% \begin{variable}{\c__kernel_randint_max_int}
+%   Constant equal to $2^{17}-1$, the maximal size of a range that
+%   \cs{int_range:nn} can do with its \enquote{simple} algorithm.
 %    \begin{macrocode}
-    \cs_new:Npn \@@_rand_uniform:
-      { \pdftex_uniformdeviate:D \c_@@_rand_size_int }
-    \int_const:Nn \c_@@_rand_size_int   { 268 435 456 }
-    \int_const:Nn \c_@@_rand_four_int   { 268 430 000 }
-    \int_const:Nn \c_@@_rand_eight_int  { 200 000 000 }
+    \int_const:Nn \c__kernel_randint_max_int { 131071 }
 %    \end{macrocode}
 % \end{variable}
+%
+% \begin{macro}[EXP]{\__kernel_randint:n}
+%   Used in an integer expression, \cs{__kernel_randint:n} |{|$R$|}|
+%   gives a random number
+%   $1+\lfloor(R\operatorname{random}(2^{14}) +
+%   \operatorname{random}(R))/2^{14}\rfloor$ that is in $[1,R]$.
+%   Previous code was computing $\lfloor p/2^{14}\rfloor$ as
+%   $\operatorname{ediv}(p-2^{13},2^{14})$ but that wrongly gives $-1$
+%   for $p=0$.
+%    \begin{macrocode}
+    \cs_new:Npn \__kernel_randint:n #1
+      {
+        (#1 * \tex_uniformdeviate:D 16384
+        + \tex_uniformdeviate:D #1 + 8192 ) / 16384
+      }
+%    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\@@_rand_myriads:n}
 % \begin{macro}[EXP]
-%   {
-%     \@@_rand_myriads_loop:nn,
-%     \@@_rand_myriads_get:w,
-%     \@@_rand_myriads_last:,
-%     \@@_rand_myriads_last:w,
-%   }
-%   Used as \cs{@@_rand_myriads:n} |{XXX}| with one input character per
-%   block of four digit we want.  Given a pseudo-random integer from the
-%   primitive, we extract $2$ blocks of digits if possible, namely if
-%   the integer is less than $2\times 10^8$.  If that's not possible,
-%   we try to extract $1$~block, which succeeds in the range $[2\times
-%   10^8, 26843\times 10^4)$.  For the $5456$ remaining possible values
-%   we just throw away the random integer and get a new one.  Depending
-%   on whether we got $2$, $1$, or~$0$ blocks, remove the same number of
-%   characters from the input stream with \cs{use_i:nnn}, \cs{use_i:nn}
-%   or nothing.
+%   {\@@_rand_myriads:n, \@@_rand_myriads_loop:w, \@@_rand_myriads_get:w}
+%   Used as \cs{@@_rand_myriads:n} |{XXX}| with one letter |X|
+%   (specifically) per block of four digit we want; it expands to |;|
+%   followed by the requested number of brace groups, each containing
+%   four (pseudo-random) digits.  Digits are produced as a random number
+%   in $[10000,19999]$ for the usual reason of preserving leading zeros.
 %    \begin{macrocode}
     \cs_new:Npn \@@_rand_myriads:n #1
+      { \@@_rand_myriads_loop:w #1 \prg_break: X \prg_break_point: ; }
+    \cs_new:Npn \@@_rand_myriads_loop:w #1 X
       {
-        \@@_rand_myriads_loop:nn #1
-          { ? \use_i_delimit_by_q_stop:nw \@@_rand_myriads_last: }
-          { ? \use_none_delimit_by_q_stop:w } \q_stop
-      }
-    \cs_new:Npn \@@_rand_myriads_loop:nn #1#2
-      {
-        \use_none:n #2
+        #1
         \exp_after:wN \@@_rand_myriads_get:w
-        \int_value:w \@@_rand_uniform: ; {#1}{#2}
+        \int_value:w \@@_int_eval:w 9999 +
+          \__kernel_randint:n { 10000 }
+        \@@_rand_myriads_loop:w
       }
-    \cs_new:Npn \@@_rand_myriads_get:w #1 ;
-      {
-        \if_int_compare:w #1 < \c_@@_rand_eight_int
-          \exp_after:wN \use_none:n
-          \int_value:w \@@_int_eval:w
-            \c_@@_rand_eight_int + #1 \@@_int_eval_end:
-          \exp_after:wN \use_i:nnn
-        \else:
-          \if_int_compare:w #1 < \c_@@_rand_four_int
-            \exp_after:wN \use_none:nnnnn
-            \int_value:w \@@_int_eval:w
-              \c_@@_rand_four_int + #1 \@@_int_eval_end:
-            \exp_after:wN \exp_after:wN \exp_after:wN \use_i:nn
-          \fi:
-        \fi:
-        \@@_rand_myriads_loop:nn
-      }
-    \cs_new:Npn \@@_rand_myriads_last:
-      {
-        \exp_after:wN \@@_rand_myriads_last:w
-        \int_value:w \@@_rand_uniform: ;
-      }
-    \cs_new:Npn \@@_rand_myriads_last:w #1 ;
-      {
-        \if_int_compare:w #1 < \c_@@_rand_four_int
-          \exp_after:wN \use_none:nnnnn
-          \int_value:w \@@_int_eval:w
-            \c_@@_rand_four_int + #1 \@@_int_eval_end:
-        \else:
-          \exp_after:wN \@@_rand_myriads_last:
-        \fi:
-      }
+    \cs_new:Npn \@@_rand_myriads_get:w 1 #1 ; { ; {#1} }
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \subsection{Random floating point}
 %
-% \begin{macro}[EXP]{\@@_rand_o:Nw}
-% \begin{macro}[EXP]{\@@_rand_o:, \@@_rand_o:w}
+% \begin{macro}[EXP]{\@@_rand_o:Nw, \@@_rand_o:w}
 %   First we check that |random| was called without argument.  Then get
-%   four blocks of four digits.
+%   four blocks of four digits and convert that fixed point number to a
+%   floating point number (this correctly sets the exponent).  This has
+%   a minor bug: if all of the random numbers are zero then the result
+%   is correctly~$0$ but it raises the \texttt{underflow} flag; it
+%   should not do that.
 %    \begin{macrocode}
     \cs_new:Npn \@@_rand_o:Nw ? #1 @
       {
         \tl_if_empty:nTF {#1}
-          { \@@_rand_o: }
           {
+            \exp_after:wN \@@_rand_o:w
+            \exp:w \exp_end_continue_f:w
+            \@@_rand_myriads:n { XXXX } { 0000 } { 0000 } ; 0
+          }
+          {
             \__kernel_msg_expandable_error:nnnnn
               { kernel } { fp-num-args } { rand() } { 0 } { 0 }
             \exp_after:wN \c_nan_fp
           }
       }
-    \cs_new:Npn \@@_rand_o:
-      { \@@_parse_o:n { . \@@_rand_myriads:n { xxxx } } }
+    \cs_new:Npn \@@_rand_o:w ;
+      {
+        \exp_after:wN \@@_sanitize:Nw
+        \exp_after:wN 0
+        \int_value:w \@@_int_eval:w \c_zero_int
+          \@@_fixed_to_float_o:wN
+      }
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \subsection{Random integer}
 %
@@ -220,33 +354,31 @@
 %     \@@_randint_default:w,
 %     \@@_randint_badarg:w,
 %     \@@_randint_o:w,
-%     \@@_randint_e:wnn,
-%     \@@_randint_e:wwNnn,
-%     \@@_randint_e:wwwNnn,
-%     \@@_randint_narrow_e:nnnn,
-%     \@@_randint_wide_e:nnnn,
-%     \@@_randint_wide_e:wnnn,
+%     \@@_randint_auxi_o:ww,
+%     \@@_randint_auxii:wn,
+%     \@@_randint_auxiii_o:ww,
+%     \@@_randint_auxiv_o:ww,
+%     \@@_randint_auxv_o:w,
 %   }
 %     Enforce that there is one argument (then add first argument~$1$)
-%     or two arguments.  Enforce that they are integers in
-%     $(-10^{16},10^{16})$ and ordered.  We distinguish narrow ranges
-%     (less than $2^{28}$) from wider ones.
-%
-%     For narrow ranges, compute the number~$n$ of possible outputs as
-%     an integer using \cs{fp_to_int:n}, and reduce a pseudo-random
-%     $28$-bit integer~$r$ modulo~$n$.  On its own, this is not uniform
-%     when $[0,2^{28}-1]$ does not divide evenly into intervals of
-%     size~$n$.  The auxiliary \cs{@@_randint_e:wwwNnn} discards the
-%     pseudo-random integer if it lies in an incomplete interval, and
-%     repeats.
-%
-%     For wide ranges we use the same code except for the last eight
-%     digits which use \cs{@@_rand_myriads:n}.  It is not safe to
-%     combine the first digits with the last eight as a single string of
-%     digits, as this may exceed $16$~digits and be rounded.  Instead,
-%     we first add the first few digits (times $10^8$) to the lower
-%     bound.  The result is compared to the upper bound and the process
-%     repeats if needed.
+%     or two arguments.  Call \cs{@@_randint_badarg:w} on each; this
+%     function inserts |1| \cs{exp_stop_f:} to end the \cs{if_case:w}
+%     statement if either the argument is not an integer or if its
+%     absolute value is $\geq 10^{16}$.  Also bail out if
+%     \cs{@@_compare_back:ww} yields~|1|, meaning that the bounds are
+%     not in the right order.  Otherwise an auxiliary converts each
+%     argument times $10^{-16}$ (hence the shift in exponent) to a
+%     $24$-digit fixed point number (see \pkg{l3fp-extended}).
+%     Then compute the number of choices, $\meta{max}+1-\meta{min}$.
+%     Create a random $24$-digit fixed-point number with
+%     \cs{@@_rand_myriads:n}, then use a fused multiply-add instruction
+%     to multiply the number of choices to that random number and add it
+%     to \meta{min}.  Then truncate to $16$ digits (namely select the
+%     integer part of $10^{16}$ times the result) before converting back
+%     to a floating point number  (\cs{@@_sanitize:Nw} takes care of zero).
+%     To avoid issues with negative numbers, add $1$ to all fixed point
+%     numbers (namely $10^{16}$ to the integers they represent), except
+%     of course when it is time to convert back to a float.
 %    \begin{macrocode}
     \cs_new:Npn \@@_randint_o:Nw ?
       {
@@ -261,7 +393,7 @@
           {
             \if_meaning:w 1 #1
               \if_int_compare:w
-                \use_i_delimit_by_q_stop:nw #3 \q_stop > \c_@@_prec_int
+                  \@@_use_i_until_s:nw #3 ; > \c_@@_prec_int
                 1 \exp_stop_f:
               \fi:
             \fi:
@@ -273,9 +405,9 @@
         \if_case:w
             \@@_randint_badarg:w #1;
             \@@_randint_badarg:w #2;
-            \fp_compare:nNnTF { #1; } > { #2; } { 1 } { 0 } \exp_stop_f:
-          \exp_after:wN \exp_after:wN \exp_after:wN \@@_randint_e:wnn
-            \@@_parse:n { #2; - #1; } { #1; } { #2; }
+            \if:w 1 \@@_compare_back:ww #2; #1; 1 \exp_stop_f: \fi:
+            0 \exp_stop_f:
+          \@@_randint_auxi_o:ww #1; #2;
         \or:
           \@@_invalid_operation_tl_o:ff
             { randint } { \@@_array_to_clist:n { #1; #2; } }
@@ -283,134 +415,227 @@
         \fi:
         \exp_after:wN \exp_end:
       }
-    \cs_new:Npn \@@_randint_e:wnn #1;
+    \cs_new:Npn \@@_randint_auxi_o:ww #1 ; #2 ; #3 \exp_end:
       {
-        \exp_after:wN \@@_randint_e:wwNnn
-        \int_value:w \@@_rand_uniform: \exp_after:wN ;
-        \exp:w \exp_end_continue_f:w
-          \fp_compare:nNnTF { #1 ; } < \c_@@_rand_size_int
-            { \fp_to_int:n { #1 ; + 1 } ; \@@_randint_narrow_e:nnnn }
-            {
-              \fp_to_int:n { floor(#1 ; * 1e-8 + 1) } ;
-              \@@_randint_wide_e:nnnn
-            }
+        \fi:
+        \@@_randint_auxii:wn #2 ;
+        { \@@_randint_auxii:wn #1 ; \@@_randint_auxiii_o:ww }
       }
-    \cs_new:Npn \@@_randint_e:wwNnn #1 ; #2 ;
+    \cs_new:Npn \@@_randint_auxii:wn \s_@@ \@@_chk:w 1#1#2#3 ;
       {
-        \exp_after:wN \@@_randint_e:wwwNnn
-        \int_value:w \int_mod:nn {#1} {#2} ; #1 ; #2 ;
+        \exp_after:wN \@@_ep_to_fixed:wwn
+        \int_value:w \@@_int_eval:w
+          #2 - \c_@@_prec_int , #3 {0000} {0000} ;
+        {
+          \if_meaning:w 0 #1
+            \exp_after:wN \use_i:nnnn
+            \exp_after:wN \@@_fixed_add_one:wN
+          \fi:
+          \exp_after:wN \@@_fixed_sub:wwn \c_@@_one_fixed_tl
+        }
+        \@@_fixed_continue:wn
       }
-    \cs_new:Npn \@@_randint_e:wwwNnn #1 ; #2 ; #3 ; #4
+    \cs_new:Npn \@@_randint_auxiii_o:ww #1 ; #2 ;
       {
-        \int_compare:nNnTF { #2 - #1 + #3 } > \c_@@_rand_size_int
-          {
-            \exp_after:wN \@@_randint_e:wwNnn
-              \int_value:w \@@_rand_uniform: ; #3 ; #4
-          }
-          { #4 {#1} {#3} }
+        \@@_fixed_add:wwn #2 ;
+          {0000} {0000} {0000} {0001} {0000} {0000} ;
+        \@@_fixed_sub:wwn #1 ;
+        {
+          \exp_after:wN \use_i:nn
+          \exp_after:wN \@@_fixed_mul_add:wwwn
+          \exp:w \exp_end_continue_f:w \@@_rand_myriads:n { XXXXXX } ;
+        }
+        #1 ;
+        \@@_randint_auxiv_o:ww
+        #2 ;
+        \@@_randint_auxv_o:w #1 ; @
       }
-    \cs_new:Npn \@@_randint_narrow_e:nnnn #1#2#3#4
-      { \@@_parse_o:n { #3 + #1 } \exp:w }
-    \cs_new:Npn \@@_randint_wide_e:nnnn #1#2#3#4
+    \cs_new:Npn \@@_randint_auxiv_o:ww #1#2#3#4#5 ; #6#7#8#9
       {
-        \exp_after:wN \exp_after:wN
-        \exp_after:wN \@@_randint_wide_e:wnnn
-          \@@_parse:n { #3 + #1e8 + \@@_rand_myriads:n { xx } }
-          {#2} {#3} {#4}
+        \if_int_compare:w
+            \if_int_compare:w #1#2 > #6#7 \exp_stop_f: 1 \else:
+            \if_int_compare:w #1#2 < #6#7 \exp_stop_f: - \fi: \fi:
+            #3#4 > #8#9 \exp_stop_f:
+          \@@_use_i_until_s:nw
+        \fi:
+        \@@_randint_auxv_o:w {#1}{#2}{#3}{#4}#5
       }
-    \cs_new:Npn \@@_randint_wide_e:wnnn #1 ; #2#3#4
+    \cs_new:Npn \@@_randint_auxv_o:w #1#2#3#4#5 ; #6 @
       {
-        \fp_compare:nNnTF { #1 ; } > {#4}
-          {
-            \exp_after:wN \@@_randint_e:wwNnn
-              \int_value:w \@@_rand_uniform: ; #2 ;
-              \@@_randint_wide_e:nnnn {#3} {#4}
-          }
-          { \@@_exp_after_o:w #1 ; \exp:w }
+        \exp_after:wN \@@_sanitize:Nw
+        \int_value:w
+        \if_int_compare:w #1 < 10000 \exp_stop_f:
+          2
+        \else:
+          0
+          \exp_after:wN \exp_after:wN
+          \exp_after:wN \@@_reverse_args:Nww
+        \fi:
+        \exp_after:wN \@@_fixed_sub:wwn \c_@@_one_fixed_tl
+        {#1} {#2} {#3} {#4} {0000} {0000} ;
+        {
+          \exp_after:wN \exp_stop_f:
+          \int_value:w \@@_int_eval:w \c_@@_prec_int
+            \@@_fixed_to_float_o:wN
+        }
+        0
+        \exp:w \exp_after:wN \exp_end:
       }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\int_rand:nn}
-% \begin{macro}{\@@_randint:ww}
-% \begin{macro}{\@@_randint_narrow:n}
-% \begin{macro}{\@@_randint_narrow:nn}
-% \begin{macro}{\@@_randint_narrow:nnn}
+% \begin{macro}{\int_rand:nn, \@@_randint:ww}
 %   Evaluate the argument and filter out the case where the lower
 %   bound~|#1| is more than the upper bound~|#2|.  Then determine
-%   whether the range is narrower than \cs{c_@@_rand_size_int}; |#2-#1|
-%   may overflow for very large positive~|#2| and negative~|#1|.  If the
-%   range is wide, use slower code from \pkg{l3fp}.  If the range is
-%   narrow, call \cs{@@_randint_narrow:n} \Arg{choices} where
-%   \meta{choices} is the number of possible outcomes.
-%
-%   One option then would be to reduce a random number modulo
-%   \meta{choices}, but the low-order bits of random numbers provided by
-%   the primitive have poor randomness: empirical tests indicate that
-%   taking random numbers modulo~$2$ gives only two possible sequences
-%   of bits depending on the seed's parity.  Instead, fit in the output
-%   range $[0,\cs{c_@@_rand_size_int}-1]$ of the random number generator
-%   \meta{choices} equal-size intervals of maximum possible size
-%   (obtained using \cs{int_div_truncate:nn}).  Given a random number,
-%   divide it by the size to determine which interval it falls into; if
-%   it is beyond \meta{choices}, try another random number.
+%   whether the range is narrower than \cs{c__kernel_randint_max_int};
+%   |#2-#1| may overflow for very large positive~|#2| and negative~|#1|.
+%   If the range is narrow, call \cs{__kernel_randint:n} \Arg{choices}
+%   where \meta{choices} is the number of possible outcomes.  If the
+%   range is wide, use somewhat slower code.
 %    \begin{macrocode}
     \cs_new:Npn \int_rand:nn #1#2
       {
-        \exp_after:wN \@@_randint:ww
-        \int_value:w \int_eval:n {#1} \exp_after:wN ;
-        \int_value:w \int_eval:n {#2} ;
+        \int_eval:n
+          {
+            \exp_after:wN \@@_randint:ww
+            \int_value:w \int_eval:n {#1} \exp_after:wN ;
+            \int_value:w \int_eval:n {#2} ;
+          }
       }
     \cs_new:Npn \@@_randint:ww #1; #2;
       {
-        \int_compare:nNnTF {#1} > {#2}
-          {
-            \__kernel_msg_expandable_error:nnnn
-              { kernel } { randint-backward-range } {#1} {#2}
-            \@@_randint:ww #2; #1;
-          }
-          {
-            \int_compare:nNnTF {#1} > 0
-              { \int_compare:nNnTF { #2 - #1 } < \c_@@_rand_size_int }
-              { \int_compare:nNnTF {#2} < { #1 + \c_@@_rand_size_int } }
-                  {
-                    \int_eval:n
-                      {
-                        #1 +
-                        \exp_args:Nf \@@_randint_narrow:n
-                          { \int_eval:n { #2 - #1 + 1 } }
-                      }
-                  }
-                  { \fp_to_int:n { randint(#1,#2) } }
-          }
+        \if_int_compare:w #1 > #2 \exp_stop_f:
+          \__kernel_msg_expandable_error:nnnn
+            { kernel } { randint-backward-range } {#1} {#2}
+          \@@_randint:ww #2; #1;
+        \else:
+          \if_int_compare:w \@@_int_eval:w #2
+              \if_int_compare:w #1 > \c_zero_int
+                - #1 < \@@_int_eval:w
+              \else:
+                < \@@_int_eval:w #1 +
+              \fi:
+              \c__kernel_randint_max_int
+              \@@_int_eval_end:
+            \__kernel_randint:n
+              { \@@_int_eval:w #2 - #1 + 1 \@@_int_eval_end: }
+            - 1 + #1
+          \else:
+            \__kernel_randint:nn {#1} {#2}
+          \fi:
+        \fi:
       }
-    \cs_new:Npn \@@_randint_narrow:n #1
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+%   {
+%     \__kernel_randint:nn, \@@_randint_split_o:Nw, \@@_randint_split_aux:w,
+%     \@@_randinat_wide_aux:w, \@@_randinat_wide_auxii:w,
+%   }
+%   Any $n\in[-2^{31}+1,2^{31}-1]$ is uniquely written as
+%   $2^{14}n_1+n_2$ with $n_1\in[-2^{17},2^{17}-1]$ and
+%   $n_2\in[0,2^{14}-1]$.  Calling \cs{@@_randint_split_o:Nw} $n$ |;|
+%   gives $n_1$|;| $n_2$|;| and expands the next token once.  We do this
+%   for two random numbers and apply \cs{@@_randint_split_o:Nw} twice to
+%   fully decompose the range~$R$.  One subtlety is that we compute
+%   $R-2^{31}=\meta{max}-\meta{min}-(2^{31}-1)\in[-2^{31}+1,2^{31}-1]$
+%   rather than $R$ to avoid overflow.
+%
+%   Then we have \cs{@@_randint_wide_aux:w} \meta{X_1}|;|\meta{X_0}|;|
+%   \meta{Y_1}|;|\meta{Y_0}|;| \meta{R_2}|;|\meta{R_1}|;|\meta{R_0}|;.|
+%   and we apply the algorithm described earlier.
+%    \begin{macrocode}
+    \cs_new:Npn \__kernel_randint:nn #1#2
       {
-        \exp_args:Nf \@@_randint_narrow:nn
-          { \int_div_truncate:nn \c_@@_rand_size_int {#1} } {#1}
+        #1
+        \exp_after:wN \@@_randint_wide_aux:w
+        \int_value:w
+          \exp_after:wN \@@_randint_split_o:Nw
+          \tex_uniformdeviate:D 268435456 ;
+        \int_value:w
+          \exp_after:wN \@@_randint_split_o:Nw
+          \tex_uniformdeviate:D 268435456 ;
+        \int_value:w
+          \exp_after:wN \@@_randint_split_o:Nw
+          \int_value:w \@@_int_eval:w 131072 +
+            \exp_after:wN \@@_randint_split_o:Nw
+            \int_value:w
+              \__kernel_int_add:nnn {#2} { -#1 } { -\c_max_int } ;
+        .
       }
-    \cs_new:Npn \@@_randint_narrow:nn #1
+    \cs_new:Npn \@@_randint_split_o:Nw #1#2 ;
       {
-        \exp_args:Nf \@@_randint_narrow:nnn
-          {
-            \int_div_truncate:nn
-              { \pdftex_uniformdeviate:D \c_@@_rand_size_int } {#1}
-          }
-          {#1}
+        \if_meaning:w 0 #1
+          0 \exp_after:wN ; \int_value:w 0
+        \else:
+          \exp_after:wN \@@_randint_split_aux:w
+          \int_value:w \@@_int_eval:w (#1#2 - 8192) / 16384 ;
+          + #1#2
+        \fi:
+        \exp_after:wN ;
       }
-    \cs_new:Npn \@@_randint_narrow:nnn #1#2#3
+    \cs_new:Npn \@@_randint_split_aux:w #1 ;
       {
-        \int_compare:nNnTF {#1} < {#3}
-          {#1}
-          { \@@_randint_narrow:nn {#2} {#3} }
+        #1 \exp_after:wN ;
+        \int_value:w \@@_int_eval:w - #1 * 16384
       }
+    \cs_new:Npn \@@_randint_wide_aux:w #1;#2; #3;#4; #5;#6;#7; .
+      {
+        \exp_after:wN \@@_randint_wide_auxii:w
+        \int_value:w \@@_int_eval:w #5 * #3 + #6 * #1 +
+          (#5 * #4 + #6 * #3 + #7 * #1 +
+           (#5 * #2 +           #7 * #3 +
+            (16384 * #6 + #7) * (16384 * #4 + #2) / 268435456) / 16384
+          ) / 16384 \exp_after:wN ;
+        \int_value:w \@@_int_eval:w (#5 + #6) * 16384 + #7 ;
+        #1 ; #5 ;
+      }
+    \cs_new:Npn \@@_randint_wide_auxii:w #1; #2; #3; #4;
+      {
+        \if_int_odd:w 0
+            \if_int_compare:w #1 = #2 \else: \exp_stop_f: \fi:
+            \if_int_compare:w #4 = \c_zero_int 1 \fi:
+            \if_int_compare:w #3 = 16383 ~ 1 \fi:
+            \exp_stop_f:
+          \exp_after:wN \prg_break:
+        \fi:
+        \if_int_compare:w #4 < 8 \exp_stop_f:
+          + #4 * #3 * 16384
+        \else:
+          + 8 * #3 * 16384 + (#4 - 8) * #3 * 16384
+        \fi:
+        + #1
+        \prg_break_point:
+      }
 %    \end{macrocode}
 % \end{macro}
+%
+% \begin{macro}{\int_rand:n, \@@_randint:n}
+%   Similar to \cs{int_rand:nn}, but needs fewer checks.
+%    \begin{macrocode}
+    \cs_new:Npn \int_rand:n #1
+      {
+        \int_eval:n
+          { \exp_args:Nf \@@_randint:n { \int_eval:n {#1} } }
+      }
+    \cs_new:Npn \@@_randint:n #1
+      {
+        \if_int_compare:w #1 < 1 \exp_stop_f:
+          \__kernel_msg_expandable_error:nnnn
+            { kernel } { randint-backward-range } { 1 } {#1}
+          \@@_randint:ww #1; 1;
+        \else:
+          \if_int_compare:w #1 > \c__kernel_randint_max_int
+            \__kernel_randint:nn { 1 } {#1}
+          \else:
+            \__kernel_randint:n {#1}
+          \fi:
+        \fi:
+      }
+%    \end{macrocode}
 % \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
 %
 % End the initial conditional that ensures these commands are only
 % defined in engines that support random numbers.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -38,7 +38,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -512,178 +512,231 @@
 % 24 - 5 = 23$ significant digits, enough to round correctly up to
 % $0.6\cdot\text{ulp}$ in all cases.
 %
-% ^^A todo: if the exponent range is reduced, store 1/2pi as a simple tl
-% \begin{variable}[EXP]{\@@_trig_inverse_two_pi:}
-%   This macro expands to |,,!| or~|,!| followed by $10112$~decimals of
+% \begin{variable}[EXP]{\c_@@_trig_intarray}
+%   This integer array stores blocks of $8$~decimals of
+%   $10^{-16}/(2\pi)$.  Each entry is $10^8$ plus an $8$~digit number
+%   storing $8$ decimals.  In total we store $10112$~decimals of
 %   $10^{-16}/(2\pi)$.  The number of decimals we really need is the
 %   maximum exponent plus the number of digits we later need,~$52$,
-%   plus~$12$ ($4-1$~groups of $4$~digits).  We store the decimals as a
-%   control sequence name, and convert it to a token list when required:
-%   strings take up less memory than their token list representation.
+%   plus~$12$ ($4-1$~groups of $4$~digits).  The memory footprint ($1/2$
+%   byte per digit) is the same as an earlier method of storing the data
+%   as a control sequence name, but the major advantage is that we can
+%   unpack specific subsets of the digits without unpacking the $10112$
+%   decimals.
 %    \begin{macrocode}
-\cs_new:Npx \@@_trig_inverse_two_pi:
+\intarray_const_from_clist:Nn \c_@@_trig_intarray
   {
-    \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:
+    100000000, 100000000, 115915494, 130918953, 135768883, 176337251,
+    143620344, 159645740, 145644874, 176673440, 158896797, 163422653,
+    150901138, 102766253, 108595607, 128427267, 157958036, 189291184,
+    161145786, 152877967, 141073169, 198392292, 139966937, 140907757,
+    130777463, 196925307, 168871739, 128962173, 197661693, 136239024,
+    117236290, 111832380, 111422269, 197557159, 140461890, 108690267,
+    139561204, 189410936, 193784408, 155287230, 199946443, 140024867,
+    123477394, 159610898, 132309678, 130749061, 166986462, 180469944,
+    186521878, 181574786, 156696424, 110389958, 174139348, 160998386,
+    180991999, 162442875, 158517117, 188584311, 117518767, 116054654,
+    175369880, 109739460, 136475933, 137680593, 102494496, 163530532,
+    171567755, 103220324, 177781639, 171660229, 146748119, 159816584,
+    106060168, 103035998, 113391198, 174988327, 186654435, 127975507,
+    100162406, 177564388, 184957131, 108801221, 199376147, 168137776,
+    147378906, 133068046, 145797848, 117613124, 127314069, 196077502,
+    145002977, 159857089, 105690279, 167851315, 125210016, 131774602,
+    109248116, 106240561, 145620314, 164840892, 148459191, 143521157,
+    154075562, 100871526, 160680221, 171591407, 157474582, 172259774,
+    162853998, 175155329, 139081398, 117724093, 158254797, 107332871,
+    190406999, 175907657, 170784934, 170393589, 182808717, 134256403,
+    166895116, 162545705, 194332763, 112686500, 126122717, 197115321,
+    112599504, 138667945, 103762556, 108363171, 116952597, 158128224,
+    194162333, 143145106, 112353687, 185631136, 136692167, 114206974,
+    169601292, 150578336, 105311960, 185945098, 139556718, 170995474,
+    165104316, 123815517, 158083944, 129799709, 199505254, 138756612,
+    194458833, 106846050, 178529151, 151410404, 189298850, 163881607,
+    176196993, 107341038, 199957869, 118905980, 193737772, 106187543,
+    122271893, 101366255, 126123878, 103875388, 181106814, 106765434,
+    108282785, 126933426, 179955607, 107903860, 160352738, 199624512,
+    159957492, 176297023, 159409558, 143011648, 129641185, 157771240,
+    157544494, 157021789, 176979240, 194903272, 194770216, 164960356,
+    153181535, 144003840, 168987471, 176915887, 163190966, 150696440,
+    147769706, 187683656, 177810477, 197954503, 153395758, 130188183,
+    186879377, 166124814, 195305996, 155802190, 183598751, 103512712,
+    190432315, 180498719, 168687775, 194656634, 162210342, 104440855,
+    149785037, 192738694, 129353661, 193778292, 187359378, 143470323,
+    102371458, 137923557, 111863634, 119294601, 183182291, 196416500,
+    187830793, 131353497, 179099745, 186492902, 167450609, 189368909,
+    145883050, 133703053, 180547312, 132158094, 131976760, 132283131,
+    141898097, 149822438, 133517435, 169898475, 101039500, 168388003,
+    197867235, 199608024, 100273901, 108749548, 154787923, 156826113,
+    199489032, 168997427, 108349611, 149208289, 103776784, 174303550,
+    145684560, 183671479, 130845672, 133270354, 185392556, 120208683,
+    193240995, 162211753, 131839402, 109707935, 170774965, 149880868,
+    160663609, 168661967, 103747454, 121028312, 119251846, 122483499,
+    111611495, 166556037, 196967613, 199312829, 196077608, 127799010,
+    107830360, 102338272, 198790854, 102387615, 157445430, 192601191,
+    100543379, 198389046, 154921248, 129516070, 172853005, 122721023,
+    160175233, 113173179, 175931105, 103281551, 109373913, 163964530,
+    157926071, 180083617, 195487672, 146459804, 173977292, 144810920,
+    109371257, 186918332, 189588628, 139904358, 168666639, 175673445,
+    114095036, 137327191, 174311388, 106638307, 125923027, 159734506,
+    105482127, 178037065, 133778303, 121709877, 134966568, 149080032,
+    169885067, 141791464, 168350828, 116168533, 114336160, 173099514,
+    198531198, 119733758, 144420984, 116559541, 152250643, 139431286,
+    144403838, 183561508, 179771645, 101706470, 167518774, 156059160,
+    187168578, 157939226, 123475633, 117111329, 198655941, 159689071,
+    198506887, 144230057, 151919770, 156900382, 118392562, 120338742,
+    135362568, 108354156, 151729710, 188117217, 195936832, 156488518,
+    174997487, 108553116, 159830610, 113921445, 144601614, 188452770,
+    125114110, 170248521, 173974510, 138667364, 103872860, 109967489,
+    131735618, 112071174, 104788993, 168886556, 192307848, 150230570,
+    157144063, 163863202, 136852010, 174100574, 185922811, 115721968,
+    100397824, 175953001, 166958522, 112303464, 118773650, 143546764,
+    164565659, 171901123, 108476709, 193097085, 191283646, 166919177,
+    169387914, 133315566, 150669813, 121641521, 100895711, 172862384,
+    126070678, 145176011, 113450800, 169947684, 122356989, 162488051,
+    157759809, 153397080, 185475059, 175362656, 149034394, 145420581,
+    178864356, 183042000, 131509559, 147434392, 152544850, 167491429,
+    108647514, 142303321, 133245695, 111634945, 167753939, 142403609,
+    105438335, 152829243, 142203494, 184366151, 146632286, 102477666,
+    166049531, 140657343, 157553014, 109082798, 180914786, 169343492,
+    127376026, 134997829, 195701816, 119643212, 133140475, 176289748,
+    140828911, 174097478, 126378991, 181699939, 148749771, 151989818,
+    172666294, 160183053, 195832752, 109236350, 168538892, 128468247,
+    125997252, 183007668, 156937583, 165972291, 198244297, 147406163,
+    181831139, 158306744, 134851692, 185973832, 137392662, 140243450,
+    119978099, 140402189, 161348342, 173613676, 144991382, 171541660,
+    163424829, 136374185, 106122610, 186132119, 198633462, 184709941,
+    183994274, 129559156, 128333990, 148038211, 175011612, 111667205,
+    119125793, 103552929, 124113440, 131161341, 112495318, 138592695,
+    184904438, 146807849, 109739828, 108855297, 104515305, 139914009,
+    188698840, 188365483, 166522246, 168624087, 125401404, 100911787,
+    142122045, 123075334, 173972538, 114940388, 141905868, 142311594,
+    163227443, 139066125, 116239310, 162831953, 123883392, 113153455,
+    163815117, 152035108, 174595582, 101123754, 135976815, 153401874,
+    107394340, 136339780, 138817210, 104531691, 182951948, 179591767,
+    139541778, 179243527, 161740724, 160593916, 102732282, 187946819,
+    136491289, 149714953, 143255272, 135916592, 198072479, 198580612,
+    169007332, 118844526, 179433504, 155801952, 149256630, 162048766,
+    116134365, 133992028, 175452085, 155344144, 109905129, 182727454,
+    165911813, 122232840, 151166615, 165070983, 175574337, 129548631,
+    120411217, 116380915, 160616116, 157320000, 183306114, 160618128,
+    103262586, 195951602, 146321661, 138576614, 180471993, 127077713,
+    116441201, 159496011, 106328305, 120759583, 148503050, 179095584,
+    198298218, 167402898, 138551383, 123957020, 180763975, 150429225,
+    198476470, 171016426, 197438450, 143091658, 164528360, 132493360,
+    143546572, 137557916, 113663241, 120457809, 196971566, 134022158,
+    180545794, 131328278, 100552461, 132088901, 187421210, 192448910,
+    141005215, 149680971, 113720754, 100571096, 134066431, 135745439,
+    191597694, 135788920, 179342561, 177830222, 137011486, 142492523,
+    192487287, 113132021, 176673607, 156645598, 127260957, 141566023,
+    143787436, 129132109, 174858971, 150713073, 191040726, 143541417,
+    197057222, 165479803, 181512759, 157912400, 125344680, 148220261,
+    173422990, 101020483, 106246303, 137964746, 178190501, 181183037,
+    151538028, 179523433, 141955021, 135689770, 191290561, 143178787,
+    192086205, 174499925, 178975690, 118492103, 124206471, 138519113,
+    188147564, 102097605, 154895793, 178514140, 141453051, 151583964,
+    128232654, 106020603, 131189158, 165702720, 186250269, 191639375,
+    115278873, 160608114, 155694842, 110322407, 177272742, 116513642,
+    134366992, 171634030, 194053074, 180652685, 109301658, 192136921,
+    141431293, 171341061, 157153714, 106203978, 147618426, 150297807,
+    186062669, 169960809, 118422347, 163350477, 146719017, 145045144,
+    161663828, 146208240, 186735951, 102371302, 190444377, 194085350,
+    134454426, 133413062, 163074595, 113830310, 122931469, 134466832,
+    185176632, 182415152, 110179422, 164439571, 181217170, 121756492,
+    119644493, 196532222, 118765848, 182445119, 109401340, 150443213,
+    198586286, 121083179, 139396084, 143898019, 114787389, 177233102,
+    186310131, 148695521, 126205182, 178063494, 157118662, 177825659,
+    188310053, 151552316, 165984394, 109022180, 163144545, 121212978,
+    197344714, 188741258, 126822386, 102360271, 109981191, 152056882,
+    134723983, 158013366, 106837863, 128867928, 161973236, 172536066,
+    185216856, 132011948, 197807339, 158419190, 166595838, 167852941,
+    124187182, 117279875, 106103946, 106481958, 157456200, 160892122,
+    184163943, 173846549, 158993202, 184812364, 133466119, 170732430,
+    195458590, 173361878, 162906318, 150165106, 126757685, 112163575,
+    188696307, 145199922, 100107766, 176830946, 198149756, 122682434,
+    179367131, 108412102, 119520899, 148191244, 140487511, 171059184,
+    141399078, 189455775, 118462161, 190415309, 134543802, 180893862,
+    180732375, 178615267, 179711433, 123241969, 185780563, 176301808,
+    184386640, 160717536, 183213626, 129671224, 126094285, 140110963,
+    121826276, 151201170, 122552929, 128965559, 146082049, 138409069,
+    107606920, 103954646, 119164002, 115673360, 117909631, 187289199,
+    186343410, 186903200, 157966371, 103128612, 135698881, 176403642,
+    152540837, 109810814, 183519031, 121318624, 172281810, 150845123,
+    169019064, 166322359, 138872454, 163073727, 128087898, 130041018,
+    194859136, 173742589, 141812405, 167291912, 138003306, 134499821,
+    196315803, 186381054, 124578934, 150084553, 128031351, 118843410,
+    107373060, 159565443, 173624887, 171292628, 198074235, 139074061,
+    178690578, 144431052, 174262641, 176783005, 182214864, 162289361,
+    192966929, 192033046, 169332843, 181580535, 164864073, 118444059,
+    195496893, 153773183, 167266131, 130108623, 158802128, 180432893,
+    144562140, 147978945, 142337360, 158506327, 104399819, 132635916,
+    168734194, 136567839, 101281912, 120281622, 195003330, 112236091,
+    185875592, 101959081, 122415367, 194990954, 148881099, 175891989,
+    108115811, 163538891, 163394029, 123722049, 184837522, 142362091,
+    100834097, 156679171, 100841679, 157022331, 178971071, 102928884,
+    189701309, 195339954, 124415335, 106062584, 139214524, 133864640,
+    134324406, 157317477, 155340540, 144810061, 177612569, 108474646,
+    114329765, 143900008, 138265211, 145210162, 136643111, 197987319,
+    102751191, 144121361, 169620456, 193602633, 161023559, 162140467,
+    102901215, 167964187, 135746835, 187317233, 110047459, 163339773,
+    124770449, 118885134, 141536376, 100915375, 164267438, 145016622,
+    113937193, 106748706, 128815954, 164819775, 119220771, 102367432,
+    189062690, 170911791, 194127762, 112245117, 123546771, 115640433,
+    135772061, 166615646, 174474627, 130562291, 133320309, 153340551,
+    138417181, 194605321, 150142632, 180008795, 151813296, 175497284,
+    167018836, 157425342, 150169942, 131069156, 134310662, 160434122,
+    105213831, 158797111, 150754540, 163290657, 102484886, 148697402,
+    187203725, 198692811, 149360627, 140384233, 128749423, 132178578,
+    177507355, 171857043, 178737969, 134023369, 102911446, 196144864,
+    197697194, 134527467, 144296030, 189437192, 154052665, 188907106,
+    162062575, 150993037, 199766583, 167936112, 181374511, 104971506,
+    115378374, 135795558, 167972129, 135876446, 130937572, 103221320,
+    124605656, 161129971, 131027586, 191128460, 143251843, 143269155,
+    129284585, 173495971, 150425653, 199302112, 118494723, 121323805,
+    116549802, 190991967, 168151180, 122483192, 151273721, 199792134,
+    133106764, 121874844, 126215985, 112167639, 167793529, 182985195,
+    185453921, 106957880, 158685312, 132775454, 133229161, 198905318,
+    190537253, 191582222, 192325972, 178133427, 181825606, 148823337,
+    160719681, 101448145, 131983362, 137910767, 112550175, 128826351,
+    183649210, 135725874, 110356573, 189469487, 154446940, 118175923,
+    106093708, 128146501, 185742532, 149692127, 164624247, 183221076,
+    154737505, 168198834, 156410354, 158027261, 125228550, 131543250,
+    139591848, 191898263, 104987591, 115406321, 103542638, 190012837,
+    142615518, 178773183, 175862355, 117537850, 169565995, 170028011,
+    158412588, 170150030, 117025916, 174630208, 142412449, 112839238,
+    105257725, 114737141, 123102301, 172563968, 130555358, 132628403,
+    183638157, 168682846, 143304568, 105994018, 170010719, 152092970,
+    117799058, 132164175, 179868116, 158654714, 177489647, 116547948,
+    183121404, 131836079, 184431405, 157311793, 149677763, 173989893,
+    102277656, 107058530, 140837477, 152640947, 143507039, 152145247,
+    101683884, 107090870, 161471944, 137225650, 128231458, 172995869,
+    173831689, 171268519, 139042297, 111072135, 107569780, 137262545,
+    181410950, 138270388, 198736451, 162848201, 180468288, 120582913,
+    153390138, 135649144, 130040157, 106509887, 192671541, 174507066,
+    186888783, 143805558, 135011967, 145862340, 180595327, 124727843,
+    182925939, 157715840, 136885940, 198993925, 152416883, 178793572,
+    179679516, 154076673, 192703125, 164187609, 162190243, 104699348,
+    159891990, 160012977, 174692145, 132970421, 167781726, 115178506,
+    153008552, 155999794, 102099694, 155431545, 127458567, 104403686,
+    168042864, 184045128, 181182309, 179349696, 127218364, 192935516,
+    120298724, 169583299, 148193297, 183358034, 159023227, 105261254,
+    121144370, 184359584, 194433836, 138388317, 175184116, 108817112,
+    151279233, 137457721, 193398208, 119005406, 132929377, 175306906,
+    160741530, 149976826, 147124407, 176881724, 186734216, 185881509,
+    191334220, 175930947, 117385515, 193408089, 157124410, 163472089,
+    131949128, 180783576, 131158294, 100549708, 191802336, 165960770,
+    170927599, 101052702, 181508688, 197828549, 143403726, 142729262,
+    110348701, 139928688, 153550062, 106151434, 130786653, 196085995,
+    100587149, 139141652, 106530207, 100852656, 124074703, 166073660,
+    153338052, 163766757, 120188394, 197277047, 122215363, 138511354,
+    183463624, 161985542, 159938719, 133367482, 104220974, 149956672,
+    170250544, 164232439, 157506869, 159133019, 137469191, 142980999,
+    134242305, 150172665, 121209241, 145596259, 160554427, 159095199,
+    168243130, 184279693, 171132070, 121049823, 123819574, 171759855,
+    119501864, 163094029, 175943631, 194450091, 191506160, 149228764,
+    132319212, 197034460, 193584259, 126727638, 168143633, 109856853,
+    127860243, 132141052, 133076065, 188414958, 158718197, 107124299,
+    159592267, 181172796, 144388537, 196763139, 127431422, 179531145,
+    100064922, 112650013, 132686230, 121550837,
   }
 %    \end{macrocode}
 % \end{variable}
@@ -691,45 +744,79 @@
 % \begin{macro}[rEXP]
 %   {
 %     \@@_trig_large:ww,
-%     \@@_trig_large_auxi:wwwwww,
-%     \@@_trig_large_auxii:ww,
-%     \@@_trig_large_auxiii:wNNNNNNNN,
-%     \@@_trig_large_auxiv:wN
+%     \@@_trig_large_auxi:w,
+%     \@@_trig_large_auxii:w,
+%     \@@_trig_large_auxiii:w,
 %   }
 %   The exponent~|#1| is between $1$ and~$\ExplSyntaxOn \int_use:N
-%   \c__fp_max_exponent_int$.  We discard the integer part of
-%   $10^{\text{\texttt{\#1}}-16}/(2\pi)$, that is, the first |#1|~digits
-%   of $10^{-16}/(2\pi)$, because it yields an integer contribution to
-%   $x/(2\pi)$.  The \texttt{auxii} auxiliary discards~$64$ digits at a
-%   time thanks to spaces inserted in the result of
-%   \cs{@@_trig_inverse_two_pi:}, while \texttt{auxiii} discards~$8$
-%   digits at a time, and \texttt{auxiv} discards digits one at a time.
-%   Then $64$~digits are packed into groups of~$4$ and the \texttt{auxv}
-%   auxiliary is called.
+%   \c__fp_max_exponent_int$.  We wish to look up decimals
+%   $10^{\text{\texttt{\#1}}-16}/(2\pi)$ starting from the digit
+%   $|#1|+1$.  Since they are stored in batches of~$8$, compute
+%   $\lfloor|#1|/8\rfloor$ and fetch blocks of $8$ digits starting
+%   there.  The numbering of items in \cs{c_@@_trig_intarray} starts
+%   at~$1$, so the block $\lfloor|#1|/8\rfloor+1$ contains the digit we
+%   want, at one of the eight positions.  Each call to \cs{int_value:w}
+%   \cs{__kernel_intarray_item:Nn} expands the next, until being stopped
+%   by \cs{@@_trig_large_auxiii:w} using \cs{exp_stop_f:}.  Once all
+%   these blocks are unpacked, the \cs{exp_stop_f:} and $0$ to $7$
+%   digits are removed by \cs[no-index]{use_none:n\ldots{}n}.
+%   Finally, \cs{@@_trig_large_auxii:w} packs $64$ digits (there are
+%   between $65$ and $72$ at this point) into groups of~$4$ and the
+%   \texttt{auxv} auxiliary is called.
 %    \begin{macrocode}
 \cs_new:Npn \@@_trig_large:ww #1, #2#3#4#5#6;
   {
-    \exp_after:wN \@@_trig_large_auxi:wwwwww
-    \int_value:w \@@_int_eval:w (#1 - 32) / 64 \exp_after:wN ,
+    \exp_after:wN \@@_trig_large_auxi:w
     \int_value:w \@@_int_eval:w (#1 - 4) / 8 \exp_after:wN ,
-    \int_value:w #1 \@@_trig_inverse_two_pi: ;
+    \int_value:w #1 , ;
     {#2}{#3}{#4}{#5} ;
   }
-\cs_new:Npn \@@_trig_large_auxi:wwwwww #1, #2, #3, #4!
+\cs_new:Npn \@@_trig_large_auxi:w #1, #2,
   {
-    \prg_replicate:nn {#1} { \@@_trig_large_auxii:ww }
-    \prg_replicate:nn { #2 - #1 * 8 }
-      { \@@_trig_large_auxiii:wNNNNNNNN }
-    \prg_replicate:nn { #3 - #2 * 8 }
-      { \@@_trig_large_auxiv:wN }
-    \prg_replicate:nn { 8 } { \@@_pack_twice_four:wNNNNNNNN }
-    \@@_trig_large_auxv:www
-    ;
+    \exp_after:wN \exp_after:wN
+    \exp_after:wN \@@_trig_large_auxii:w
+    \cs:w
+      use_none:n \prg_replicate:nn { #2 - #1 * 8 } { n }
+      \exp_after:wN
+    \cs_end:
+    \int_value:w
+    \__kernel_intarray_item:Nn \c_@@_trig_intarray
+      { \@@_int_eval:w #1 + 1 \scan_stop: }
+    \exp_after:wN \@@_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c_@@_trig_intarray
+      { \@@_int_eval:w #1 + 2 \scan_stop: }
+    \exp_after:wN \@@_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c_@@_trig_intarray
+      { \@@_int_eval:w #1 + 3 \scan_stop: }
+    \exp_after:wN \@@_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c_@@_trig_intarray
+      { \@@_int_eval:w #1 + 4 \scan_stop: }
+    \exp_after:wN \@@_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c_@@_trig_intarray
+      { \@@_int_eval:w #1 + 5 \scan_stop: }
+    \exp_after:wN \@@_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c_@@_trig_intarray
+      { \@@_int_eval:w #1 + 6 \scan_stop: }
+    \exp_after:wN \@@_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c_@@_trig_intarray
+      { \@@_int_eval:w #1 + 7 \scan_stop: }
+    \exp_after:wN \@@_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c_@@_trig_intarray
+      { \@@_int_eval:w #1 + 8 \scan_stop: }
+    \exp_after:wN \@@_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c_@@_trig_intarray
+      { \@@_int_eval:w #1 + 9 \scan_stop: }
+    \exp_stop_f:
   }
-\cs_new:Npn \@@_trig_large_auxii:ww #1; #2 ~ { #1; }
-\cs_new:Npn \@@_trig_large_auxiii:wNNNNNNNN
-  #1; #2#3#4#5#6#7#8#9 { #1; }
-\cs_new:Npn \@@_trig_large_auxiv:wN #1; #2 { #1; }
+\cs_new:Npn \@@_trig_large_auxii:w
+  {
+    \@@_pack_twice_four:wNNNNNNNN \@@_pack_twice_four:wNNNNNNNN
+    \@@_pack_twice_four:wNNNNNNNN \@@_pack_twice_four:wNNNNNNNN
+    \@@_pack_twice_four:wNNNNNNNN \@@_pack_twice_four:wNNNNNNNN
+    \@@_pack_twice_four:wNNNNNNNN \@@_pack_twice_four:wNNNNNNNN
+    \@@_trig_large_auxv:www ;
+  }
+\cs_new:Npn \@@_trig_large_auxiii:w 1 { \exp_stop_f: }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -741,7 +828,7 @@
 %   }
 %   First come the first $64$~digits of the fractional part of
 %   $10^{\text{\texttt{\#1}}-16}/(2\pi)$, arranged in $16$~blocks
-%   of~$4$, and ending with a semicolon.  Then some more digits of the
+%   of~$4$, and ending with a semicolon.  Then a few more digits of the
 %   same fractional part, ending with a semicolon, then $4$~blocks of
 %   $4$~digits holding the significand of the original argument.
 %   Multiply the $16$-digit significand with the $64$-digit fractional

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -47,7 +47,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Added: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -0,0 +1,331 @@
+% \iffalse meta-comment
+%
+%% File: l3fparray.dtx Copyright (C) 2018 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
+%
+%    https://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.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full,kernel]{l3doc}
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \title{^^A
+%   The \textsf{l3fparray} package: fast global floating point arrays^^A
+% }
+%
+% \author{^^A
+%  The \LaTeX3 Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team at latex-project.org}
+%          {latex-team at latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Released 2018-05-12}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% \section{\pkg{l3fparray} documentation}
+%
+% For applications requiring heavy use of floating points, this module
+% provides arrays which can be accessed in constant time (contrast
+% \pkg{l3seq}, where access time is linear).  The interface is very
+% close to that of \pkg{l3intarray}.  The size of the array is fixed and
+% must be given at point of initialisation
+%
+% Currently \emph{all} functions in this module are candidates.  Their
+% documentation can be found in \pkg{l3candidates}.
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3fparray} implementation}
+%
+%    \begin{macrocode}
+%<*initex|package>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<@@=fp>
+%    \end{macrocode}
+%
+% In analogy to \pkg{l3intarray} it would make sense to have
+% |<@@=fparray>|, but we need direct access to \cs{@@_parse:n} from
+% \pkg{l3fp-parse}, and a few other (less crucial) internals of the
+% \pkg{l3fp} family.
+%
+% \subsection{Allocating arrays}
+%
+% There are somewhat more than $(2^{31}-1)^2$ floating point numbers so
+% we store each floating point number as three entries in integer
+% arrays.  To avoid having to multiply indices by three or to add 1 etc,
+% a floating point array is just a token list consisting of three
+% tokens: integer arrays of the same size.
+%
+% \begin{variable}{\g_@@_array_int}
+%   Used to generate unique names for the three integer arrays.
+%    \begin{macrocode}
+\int_new:N \g_@@_array_int
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_array_loop_int}
+%   Used to loop in \cs{@@_array_gzero:N}.
+%    \begin{macrocode}
+\int_new:N \l_@@_array_loop_int
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\fparray_new:Nn, \@@_array_new:nNNN}
+%   Build a three token token list, then define all three tokens to be
+%   integer arrays of the same size.  No need to initialize the data:
+%   the integer arrays start with zeros, and three zeros denote
+%   precisely \cs{c_zero_fp}, as we want.
+%    \begin{macrocode}
+\cs_new_protected:Npn \fparray_new:Nn #1#2
+  {
+    \tl_new:N #1
+    \prg_replicate:nn { 3 }
+      {
+        \int_gincr:N \g_@@_array_int
+        \exp_args:NNc \tl_gput_right:Nn #1
+          { g_@@_array_ \@@_int_to_roman:w \g_@@_array_int _intarray }
+      }
+    \exp_last_unbraced:Nfo \@@_array_new:nNNNN
+      { \int_eval:n {#2} } #1 #1
+  }
+\cs_new_protected:Npn \@@_array_new:nNNNN #1#2#3#4#5
+  {
+    \int_compare:nNnTF {#1} < 0
+      {
+        \__kernel_msg_error:nnn { kernel } { negative-array-size } {#1}
+        \cs_undefine:N #1
+        \int_gsub:Nn \g_@@_array_int { 3 }
+      }
+      {
+        \intarray_new:Nn #2 {#1}
+        \intarray_new:Nn #3 {#1}
+        \intarray_new:Nn #4 {#1}
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\fparray_count:N}
+%   Size of any of the intarrays, here we pick the third.
+%    \begin{macrocode}
+\cs_new:Npn \fparray_count:N #1
+  {
+    \exp_after:wN \use_i:nnn
+    \exp_after:wN \intarray_count:N #1
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Array items}
+%
+% \begin{macro}[EXP]{\@@_array_bounds:NNnTF, \@@_array_bounds_error:NNn}
+%   See the \pkg{l3intarray} analogue: only names change.
+%   The functions \cs{fparray_gset:Nnn} and \cs{fparray_item:Nn} share
+%   bounds checking.  The |T| branch is used if |#3| is within bounds of
+%   the array |#2|.
+%    \begin{macrocode}
+\cs_new:Npn \@@_array_bounds:NNnTF #1#2#3#4#5
+  {
+    \if_int_compare:w 1 > #3 \exp_stop_f:
+      \@@_array_bounds_error:NNn #1 #2 {#3}
+      #5
+    \else:
+      \if_int_compare:w #3 > \fparray_count:N #2 \exp_stop_f:
+        \@@_array_bounds_error:NNn #1 #2 {#3}
+        #5
+      \else:
+        #4
+      \fi:
+    \fi:
+  }
+\cs_new:Npn \@@_array_bounds_error:NNn #1#2#3
+  {
+    #1 { kernel } { out-of-bounds }
+      { \token_to_str:N #2 } {#3} { \fparray_count:N #2 }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+%   {
+%     \fparray_gset:Nnn, \@@_array_gset:NNNNww, \@@_array_gset:w,
+%     \@@_array_gset_recover:Nw, \@@_array_gset_special:nnNNN,
+%     \@@_array_gset_normal:w
+%   }
+%   Evaluate, then store exponent in one intarray, sign and $8$ digits
+%   of mantissa in the next, and $8$ trailing digits in the last.
+%    \begin{macrocode}
+\cs_new_protected:Npn \fparray_gset:Nnn #1#2#3
+  {
+    \exp_after:wN \exp_after:wN
+    \exp_after:wN \@@_array_gset:NNNNww
+    \exp_after:wN #1
+    \exp_after:wN #1
+    \int_value:w \int_eval:n {#2} \exp_after:wN ;
+    \exp:w \exp_end_continue_f:w \@@_parse:n {#3}
+  }
+\cs_new_protected:Npn \@@_array_gset:NNNNww #1#2#3#4#5 ; #6 ;
+  {
+    \@@_array_bounds:NNnTF \__kernel_msg_error:nnxxx #4 {#5}
+      {
+        \exp_after:wN \@@_change_func_type:NNN
+          \@@_use_i_until_s:nw #6 ;
+          \@@_array_gset:w
+          \@@_array_gset_recover:Nw
+        #6 ; {#5} #1 #2 #3
+      }
+      { }
+  }
+\cs_new_protected:Npn \@@_array_gset_recover:Nw #1#2 ;
+  {
+    \@@_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { }
+    \exp_after:wN #1 \c_nan_fp
+  }
+\cs_new_protected:Npn \@@_array_gset:w \s_@@ \@@_chk:w #1#2
+  {
+    \if_case:w #1 \exp_stop_f:
+         \@@_case_return:nw { \@@_array_gset_special:nnNNN {#2} }
+    \or: \exp_after:wN \@@_array_gset_normal:w
+    \or: \@@_case_return:nw { \@@_array_gset_special:nnNNN { #2 3 } }
+    \or: \@@_case_return:nw { \@@_array_gset_special:nnNNN { 1 } }
+    \fi:
+    \s_@@ \@@_chk:w #1 #2
+  }
+\cs_new_protected:Npn \@@_array_gset_normal:w
+  \s_@@ \@@_chk:w 1 #1 #2 #3#4#5 ; #6#7#8#9
+  {
+    \__kernel_intarray_gset:Nnn #7 {#6} {#2}
+    \__kernel_intarray_gset:Nnn #8 {#6}
+      { \if_meaning:w 2 #1 3 \else: 1 \fi: #3#4 }
+    \__kernel_intarray_gset:Nnn #9 {#6} { 1 \use:nn #5 }
+  }
+\cs_new_protected:Npn \@@_array_gset_special:nnNNN #1#2#3#4#5
+  {
+    \__kernel_intarray_gset:Nnn #3 {#2} {#1}
+    \__kernel_intarray_gset:Nnn #4 {#2} {0}
+    \__kernel_intarray_gset:Nnn #5 {#2} {0}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fparray_gzero:N}
+%    \begin{macrocode}
+\cs_new_protected:Npn \fparray_gzero:N #1
+  {
+    \int_zero:N \l_@@_array_loop_int
+    \prg_replicate:nn { \fparray_count:N #1 }
+      {
+        \int_incr:N \l_@@_array_loop_int
+        \exp_after:wN \@@_array_gset_special:nnNNN
+        \exp_after:wN 0
+        \exp_after:wN \l_@@_array_loop_int
+        #1
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]
+%   {
+%     \fparray_item:Nn,
+%     \fparray_item_to_tl:Nn,
+%     \@@_array_item:NwN,
+%     \@@_array_item:NNNnN,
+%     \@@_array_item:N,
+%     \@@_array_item:w,
+%     \@@_array_item_special:w,
+%     \@@_array_item_normal:w
+%   }
+%    \begin{macrocode}
+\cs_new:Npn \fparray_item:Nn #1#2
+  {
+    \exp_after:wN \@@_array_item:NwN
+    \exp_after:wN #1
+    \int_value:w \int_eval:n {#2} ;
+    \@@_to_decimal:w
+  }
+\cs_new:Npn \fparray_item_to_tl:Nn #1#2
+  {
+    \exp_after:wN \@@_array_item:NwN
+    \exp_after:wN #1
+    \int_value:w \int_eval:n {#2} ;
+    \@@_to_tl:w
+  }
+\cs_new:Npn \@@_array_item:NwN #1#2 ; #3
+  {
+    \@@_array_bounds:NNnTF \__kernel_msg_expandable_error:nnfff #1 {#2}
+      { \exp_after:wN \@@_array_item:NNNnN #1 {#2} #3 }
+      { \exp_after:wN #3 \c_nan_fp }
+  }
+\cs_new:Npn \@@_array_item:NNNnN #1#2#3#4
+  {
+    \exp_after:wN \@@_array_item:N
+    \int_value:w \__kernel_intarray_item:Nn #2 {#4} \exp_after:wN ;
+    \int_value:w \__kernel_intarray_item:Nn #3 {#4} \exp_after:wN ;
+    \int_value:w \__kernel_intarray_item:Nn #1 {#4} ;
+  }
+\cs_new:Npn \@@_array_item:N #1
+  {
+    \if_meaning:w 0 #1 \exp_after:wN \@@_array_item_special:w \fi:
+    \@@_array_item:w #1
+  }
+\cs_new:Npn \@@_array_item:w #1 #2#3#4#5 #6 ; 1 #7 ;
+  {
+    \exp_after:wN \@@_array_item_normal:w
+    \int_value:w \if_meaning:w #1 1 0 \else: 2 \fi: \exp_stop_f:
+    #7 ; {#2#3#4#5} {#6} ;
+  }
+\cs_new:Npn \@@_array_item_special:w #1 ; #2 ; #3 ; #4
+  {
+    \exp_after:wN #4
+    \exp:w \exp_end_continue_f:w
+    \if_case:w #3 \exp_stop_f:
+         \exp_after:wN \c_zero_fp
+    \or: \exp_after:wN \c_nan_fp
+    \or: \exp_after:wN \c_minus_zero_fp
+    \or: \exp_after:wN \c_inf_fp
+    \else: \exp_after:wN \c_minus_inf_fp
+    \fi:
+  }
+\cs_new:Npn \@@_array_item_normal:w #1 #2#3#4#5 #6 ; #7 ; #8 ; #9
+  { #9 \s_@@ \@@_chk:w 1 #1 {#8} #7 {#2#3#4#5} {#6} ; }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+%</initex|package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex


Property changes on: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -829,33 +829,8 @@
 %
 % \section{Constant integers}
 %
-% \begin{variable}
-%   {
-%     \c_zero                   ,
-%     \c_one                    ,
-%     \c_two                    ,
-%     \c_three                  ,
-%     \c_four                   ,
-%     \c_five                   ,
-%     \c_six                    ,
-%     \c_seven                  ,
-%     \c_eight                  ,
-%     \c_nine                   ,
-%     \c_ten                    ,
-%     \c_eleven                 ,
-%     \c_twelve                 ,
-%     \c_thirteen               ,
-%     \c_fourteen               ,
-%     \c_fifteen                ,
-%     \c_sixteen                ,
-%     \c_thirty_two             ,
-%     \c_one_hundred            ,
-%     \c_two_hundred_fifty_five ,
-%     \c_two_hundred_fifty_six  ,
-%     \c_one_thousand           ,
-%     \c_ten_thousand
-%   }
-%   Integer values used with primitive tests and assignments:
+% \begin{variable}[added = 2018-05-07]{\c_zero_int, \c_one_int}
+%   Integer values used with primitive tests and assignments: their
 %   self-terminating nature makes these more convenient and faster than
 %   literal numbers.
 % \end{variable}
@@ -1011,7 +986,7 @@
 %   expressions.
 %    \begin{macrocode}
 \cs_new_eq:NN \int_value:w      \tex_number:D
-\cs_new_eq:NN \@@_eval:w       \etex_numexpr:D
+\cs_new_eq:NN \@@_eval:w       \tex_numexpr:D
 \cs_new_eq:NN \@@_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
@@ -1178,6 +1153,27 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\__kernel_int_add:nnn}
+%   Equivalent to \cs{int_eval:n} |{#1+#2+#3}| except that overflow only
+%   occurs if the final result overflows $[-2^{31}+1,2^{31}-1]$.  The
+%   idea is to choose the order in which the three numbers are added
+%   together.  If |#1| and |#2| have opposite signs (one is in
+%   $[-2^{31}+1,-1]$ and the other in $[0,2^{31}-1]$) then |#1+#2|
+%   cannot overflow so we compute the result as |#1+#2+#3|.  If they
+%   have the same sign, then either |#3| has the same sign and the order
+%   does not matter, or |#3| has the opposite sign and any order in
+%   which |#3| is not last will work.  We use |#1+#3+#2|.
+%    \begin{macrocode}
+\cs_new:Npn \__kernel_int_add:nnn #1#2#3
+  {
+    \int_value:w \@@_eval:w #1
+      \if_int_compare:w #2 < \c_zero_int \exp_after:wN \reverse_if:N \fi:
+      \if_int_compare:w #1 < \c_zero_int + #2 + #3 \else: + #3 + #2 \fi:
+    \@@_eval_end:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Creating and initialising integers}
 %
 % \begin{macro}{\int_new:N, \int_new:c}
@@ -1216,7 +1212,7 @@
   { {#1} { \__kernel_chk_expr:nNnN {#2} \@@_eval:w { } \int_const:Nn } }
 \cs_new_protected:Npn \int_const:Nn #1#2
   {
-    \int_compare:nNnTF {#2} < \c_zero
+    \int_compare:nNnTF {#2} < \c_zero_int
       {
         \int_new:N #1
         \tex_global:D
@@ -1236,12 +1232,12 @@
   }
 \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 \@@_constdef:Nw \uptex_kchardef:D }
+  \cs_if_exist:NT \tex_luatexversion:D  { 1 }
+  \cs_if_exist:NT \tex_disablecjktoken:D
+    { \if_int_compare:w \tex_jis:D "2121 = "3000 ~ 1 \fi: }
+  \cs_if_exist:NT \tex_XeTeXversion:D    { 1 } ~
+    \cs_if_exist:NTF \tex_disablecjktoken:D
+      { \cs_new_eq:NN \@@_constdef:Nw \tex_kchardef:D }
       { \cs_new_eq:NN \@@_constdef:Nw \tex_chardef:D }
     \@@_constdef:Nw \c_@@_max_constdef_int 1114111 ~
 \else:
@@ -1260,9 +1256,9 @@
 %   Functions that reset an \meta{integer} register to zero.
 %    \begin{macrocode}
 \__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
-\cs_new_protected:Npn \int_zero:N  #1 { #1 = \c_zero }
+\cs_new_protected:Npn \int_zero:N  #1 { #1 = \c_zero_int }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
-\cs_new_protected:Npn \int_gzero:N #1 { \tex_global:D #1 = \c_zero }
+\cs_new_protected:Npn \int_gzero:N #1 { \tex_global:D #1 = \c_zero_int }
 \cs_generate_variant:Nn \int_zero:N  { c }
 \cs_generate_variant:Nn \int_gzero:N { c }
 %    \end{macrocode}
@@ -1377,16 +1373,16 @@
 %    \begin{macrocode}
 \__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \int_incr:N #1
-  { \tex_advance:D #1 \c_one }
+  { \tex_advance:D #1 \c_one_int }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \int_decr:N #1
-  { \tex_advance:D #1 - \c_one }
+  { \tex_advance:D #1 - \c_one_int }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \int_gincr:N #1
-  { \tex_global:D \tex_advance:D #1 \c_one }
+  { \tex_global:D \tex_advance:D #1 \c_one_int }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \int_gdecr:N #1
-  { \tex_global:D \tex_advance:D #1 - \c_one }
+  { \tex_global:D \tex_advance:D #1 - \c_one_int }
 \cs_generate_variant:Nn \int_incr:N  { c }
 \cs_generate_variant:Nn \int_decr:N  { c }
 \cs_generate_variant:Nn \int_gincr:N { c }
@@ -1451,7 +1447,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_compare_error:
   {
-    \if_int_compare:w \c_zero \c_zero \fi:
+    \if_int_compare:w \c_zero_int \c_zero_int \fi:
     =
     \@@_compare_error:
   }
@@ -1459,7 +1455,7 @@
     #1#2 \q_stop
   {
     { }
-    \c_zero \fi:
+    \c_zero_int \fi:
     \__kernel_msg_expandable_error:nnn
       { kernel } { unknown-comparison } {#1}
     \prg_return_false:
@@ -1692,10 +1688,10 @@
   { { \__kernel_chk_expr:nNnN {#1} \@@_eval:w { } \int_if_even:n } }
 \prg_new_conditional:Npnn \int_if_even:n #1 { p , T , F , TF}
   {
-    \if_int_odd:w \@@_eval:w #1 \@@_eval_end:
+    \reverse_if:N \if_int_odd:w \@@_eval:w #1 \@@_eval_end:
+      \prg_return_true:
+    \else:
       \prg_return_false:
-    \else:
-      \prg_return_true:
     \fi:
   }
 %    \end{macrocode}
@@ -1831,10 +1827,10 @@
   }
 \cs_new:Npn \@@_step:wwwN #1; #2; #3; #4
   {
-    \int_compare:nNnTF {#2} > \c_zero
+    \int_compare:nNnTF {#2} > \c_zero_int
       { \@@_step:NwnnN > }
       {
-        \int_compare:nNnTF {#2} = \c_zero
+        \int_compare:nNnTF {#2} = \c_zero_int
           {
             \__kernel_msg_expandable_error:nnn
               { kernel } { zero-step } {#4}
@@ -2502,62 +2498,13 @@
 %
 % \subsection{Constant integers}
 %
-% \begin{variable}{\c_zero}
-%   Again, in \pkg{l3basics}
-% \end{variable}
-%
-% \begin{variable}
-%   {
-%     \c_one, \c_two, \c_three, \c_four, \c_five, \c_six, \c_seven, \c_eight,
-%     \c_nine, \c_ten, \c_eleven, \c_twelve, \c_thirteen, \c_fourteen,
-%     \c_fifteen, \c_sixteen
-%   }
-% Low-number values not previously defined.
+% \begin{variable}{\c_zero_int, \c_one_int}
+%   The zero is defined in \pkg{l3basics}.
 %    \begin{macrocode}
-\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_one_int { 1 }
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\c_thirty_two}
-%   One middling value.
-%    \begin{macrocode}
-\int_const:Nn \c_thirty_two { 32 }
-%    \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\c_two_hundred_fifty_five, \c_two_hundred_fifty_six}
-%   Two classic mid-range integer constants.
-%    \begin{macrocode}
-\int_const:Nn \c_two_hundred_fifty_five { 255 }
-\int_const:Nn \c_two_hundred_fifty_six  { 256 }
-%    \end{macrocode}
-%\end{variable}
-%
-% \begin{variable}
-%   {\c_one_hundred, \c_one_thousand, \c_ten_thousand}
-%   Simple runs of powers of ten.
-%    \begin{macrocode}
-\int_const:Nn \c_one_hundred  {   100 }
-\int_const:Nn \c_one_thousand {  1000 }
-\int_const:Nn \c_ten_thousand { 10000 }
-%    \end{macrocode}
-% \end{variable}
-%
 % \begin{variable}{\c_max_int}
 %   The largest number allowed is $2^{31}-1$
 %    \begin{macrocode}
@@ -2574,8 +2521,8 @@
 \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 } ~
+      \cs_if_exist:NT \tex_luatexversion:D  { 1 }
+      \cs_if_exist:NT \tex_XeTeXversion:D    { 1 } ~
       "10FFFF
     \else:
       "FF
@@ -2602,14 +2549,15 @@
 % \subsection{Deprecated}
 %
 % \begin{variable}[deprecated = 2018-12-31]{\c_minus_one}
-%   The actual allocation mechanism is in \pkg{l3alloc}; it requires
-%   \cs{c_one} to be defined.  In package mode, reuse \tn{m at ne}.
+%   The actual allocation mechanism is in \pkg{l3alloc}.
+%   In package mode, reuse \tn{m at ne}.
 %   We also store in two global token lists some code for
-%   \cs{debug_deprecation_on:} and \cs{debug_deprecation_off:}.  For the
+%   \cs{debug_on:n} \texttt{\{deprecation\}} and \cs{debug_off:n}
+%   \texttt{\{deprecation\}}.  For the
 %   latter, we need to locally set \cs{c_minus_one} back to the constant
 %   hence use a private name.  We use \cs{tex_let:D} directly because
 %   \cs{c_minus_one} (as all deprecated commands) is made outer by
-%   \cs{debug_deprecation_on:}.
+%   \cs{debug_on:n} \texttt{\{deprecation\}}.
 %    \begin{macrocode}
 %<package>\cs_gset_eq:NN \c_@@_minus_one \m at ne
 %<initex>\int_const:Nn \c_@@_minus_one { -1 }
@@ -2620,6 +2568,66 @@
 %    \end{macrocode}
 % \end{variable}
 %
+% \begin{variable}[deprecated = 2019-12-31]
+%   {
+%     \c_zero, \c_one, \c_two, \c_three, \c_four, \c_five, \c_six,
+%     \c_seven, \c_eight, \c_nine, \c_ten, \c_eleven, \c_twelve,
+%     \c_thirteen, \c_fourteen, \c_fifteen, \c_sixteen, \c_thirty_two,
+%     \c_one_hundred, \c_two_hundred_fifty_five,
+%     \c_two_hundred_fifty_six, \c_one_thousand, \c_ten_thousand,
+%   }
+% \begin{macro}{\@@_deprecated_constants:nn}
+%   Constants that are now deprecated.  By default define them with
+%   \cs{int_const:Nn}.  To deprecate them call for instance
+%   \cs{__kernel_deprecation_error:Nnn} \cs{c_zero} |{0}|
+%   |{2019-12-31}|.  To redefine them (locally), use
+%   \cs{@@_constdef:Nw}, with an \cs{exp_not:N} construction because the
+%   constants themselves are outer at that point.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_deprecated_constants:nn #1#2
+  {
+    #1 \c_zero                   {   0 } #2
+    #1 \c_one                    {   1 } #2
+    #1 \c_two                    {   2 } #2
+    #1 \c_three                  {   3 } #2
+    #1 \c_four                   {   4 } #2
+    #1 \c_five                   {   5 } #2
+    #1 \c_six                    {   6 } #2
+    #1 \c_seven                  {   7 } #2
+    #1 \c_eight                  {   8 } #2
+    #1 \c_nine                   {   9 } #2
+    #1 \c_ten                    {  10 } #2
+    #1 \c_eleven                 {  11 } #2
+    #1 \c_twelve                 {  12 } #2
+    #1 \c_thirteen               {  13 } #2
+    #1 \c_fourteen               {  14 } #2
+    #1 \c_fifteen                {  15 } #2
+    #1 \c_sixteen                {  16 } #2
+    #1 \c_thirty_two             {  32 } #2
+    #1 \c_one_hundred            { 100 } #2
+    #1 \c_two_hundred_fifty_five { 255 } #2
+    #1 \c_two_hundred_fifty_six  { 256 } #2
+    #1 \c_one_thousand         {  1000 } #2
+    #1 \c_ten_thousand         { 10000 } #2
+  }
+\@@_deprecated_constants:nn { \int_const:Nn } { }
+\__kernel_deprecation_code:nn
+  {
+    \@@_deprecated_constants:nn
+      { \__kernel_deprecation_error:Nnn } { { 2019-12-31 } }
+  }
+  {
+    \@@_deprecated_constants:nn
+      {
+        \exp_after:wN \use:nnn
+        \exp_after:wN \@@_constdef:Nw \exp_not:N
+      }
+      { \exp_stop_f: }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{variable}
+%
 % \begin{macro}[deprecated = 2019-12-31]{\@@_value:w}
 %   Made public.
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -70,6 +70,8 @@
 %   \end{syntax}
 %   Evaluates the integer expression \meta{size} and allocates an
 %   \meta{integer array variable} with that number of (zero) entries.
+%   The variable name should start with |\g_| because assignments are
+%   always global.
 % \end{function}
 %
 % \begin{function}[EXP, added = 2018-03-29]{\intarray_count:N}
@@ -92,6 +94,14 @@
 %   global.
 % \end{function}
 %
+% \begin{function}[added = 2018-05-04]{\intarray_gzero:N}
+%   \begin{syntax}
+%     \cs{intarray_gzero:N} \meta{intarray~var}
+%   \end{syntax}
+%   Sets all entries of the \meta{integer array variable} to zero.
+%   Assignments are always global.
+% \end{function}
+%
 % \begin{function}[EXP, added = 2018-03-29]{\intarray_item:Nn}
 %   \begin{syntax}
 %     \cs{intarray_item:Nn} \meta{intarray~var} \Arg{position}
@@ -133,6 +143,21 @@
 %
 % \subsection{Allocating arrays}
 %
+% \begin{macro}{\@@_entry:w, \@@_count:w}
+%   We use these primitives quite a lot in this module.
+%    \begin{macrocode}
+\cs_new_eq:NN \@@_entry:w \tex_fontdimen:D
+\cs_new_eq:NN \@@_count:w \tex_hyphenchar:D
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_loop_int}
+%   A loop index.
+%    \begin{macrocode}
+\int_new:N \l_@@_loop_int
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{variable}{\c_@@_sp_dim}
 %   Used to convert integers to dimensions fast.
 %    \begin{macrocode}
@@ -147,7 +172,12 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}{\intarray_new:Nn}
+%    \begin{macrocode}
+\__kernel_msg_new:nnn { kernel } { negative-array-size }
+  { Size~of~array~may~not~be~negative:~#1 }
+%    \end{macrocode}
+%
+% \begin{macro}{\intarray_new:Nn, \@@_new:N}
 %   Declare |#1| to be a font (arbitrarily |cmr10| at a never-used
 %   size).  Store the array's size as the \tn{hyphenchar} of that font
 %   and make sure enough \tn{fontdimen} are allocated, by setting the
@@ -158,18 +188,28 @@
 %   Every \texttt{intarray} must be global; it's enough to run this
 %   check in \cs{intarray_new:Nn}.
 %    \begin{macrocode}
-\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN g #1 } { }
-\cs_new_protected:Npn \intarray_new:Nn #1#2
+\cs_new_protected:Npn \@@_new:N #1
   {
     \__kernel_chk_if_free_cs:N #1
     \int_gincr:N \g_@@_font_int
     \tex_global:D \tex_font:D #1
       = cmr10~at~ \g_@@_font_int \c_@@_sp_dim \scan_stop:
-    \tex_hyphenchar:D #1 = \int_eval:n {#2} \scan_stop:
-    \int_compare:nNnT { \tex_hyphenchar:D #1 } > 0
-      { \tex_fontdimen:D \tex_hyphenchar:D #1 #1 = \c_zero_dim }
-    \int_step_inline:nn { 8 } { \tex_fontdimen:D ##1 #1 = \c_zero_dim }
+    \int_step_inline:nn { 8 }
+      { \__kernel_intarray_gset:Nnn #1 {##1} \c_zero_int }
   }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN g #1 } { }
+\cs_new_protected:Npn \intarray_new:Nn #1#2
+  {
+    \@@_new:N #1
+    \@@_count:w #1 = \int_eval:n {#2} \scan_stop:
+    \int_compare:nNnT { \intarray_count:N #1 } < 0
+      {
+        \__kernel_msg_error:nnx { kernel } { negative-array-size }
+          { \intarray_count:N #1 }
+      }
+    \int_compare:nNnT { \intarray_count:N #1 } > 0
+      { \__kernel_intarray_gset:Nnn #1 { \intarray_count:N #1 } { 0 } }
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -176,12 +216,21 @@
 % \begin{macro}[EXP]{\intarray_count:N}
 %   Size of an array.
 %    \begin{macrocode}
-\cs_new:Npn \intarray_count:N #1 { \tex_the:D \tex_hyphenchar:D #1 }
+\cs_new:Npn \intarray_count:N #1 { \int_value:w \@@_count:w #1 }
 %    \end{macrocode}
 % \end{macro}
 %
 % \subsection{Array items}
 %
+% \begin{macro}[EXP]{\@@_signed_max_dim:n}
+%   Used when an item to be stored is larger than \cs{c_max_dim} in
+%   absolute value; it is replaced by $\pm\cs{c_max_dim}$.
+%    \begin{macrocode}
+\cs_new:Npn \@@_signed_max_dim:n #1
+  { \int_value:w \int_compare:nNnT {#1} < 0 { - } \c_max_dim }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[EXP]{\@@_bounds:NNnTF, \@@_bounds_error:NNn}
 %   The functions \cs{intarray_gset:Nnn} and \cs{intarray_item:Nn} share
 %   bounds checking.  The |T| branch is used if |#3| is within bounds of
@@ -218,7 +267,7 @@
 %   are within bounds.
 %    \begin{macrocode}
 \cs_new_protected:Npn \__kernel_intarray_gset:Nnn #1#2#3
-  { \tex_fontdimen:D #2 #1 #3 \c_@@_sp_dim }
+  { \@@_entry:w #2 #1 #3 \c_@@_sp_dim }
 \cs_new_protected:Npn \intarray_gset:Nnn #1#2#3
   {
     \exp_after:wN \@@_gset:Nww
@@ -230,25 +279,56 @@
   {
     \@@_bounds:NNnTF \__kernel_msg_error:nnxxx #1 {#2}
       {
-        \if_int_compare:w \int_abs:n {#3} > \c_max_dim
-          \exp_after:wN \@@_gset_overflow:NNnn
-        \fi:
+        \@@_gset_overflow_test:nw {#3}
         \__kernel_intarray_gset:Nnn #1 {#2} {#3}
       }
       { }
   }
+\cs_if_exist:NTF \tex_ifabsnum:D
+  {
+    \cs_new_protected:Npn \@@_gset_overflow_test:nw #1
+      {
+        \tex_ifabsnum:D #1 > \c_max_dim
+          \exp_after:wN \@@_gset_overflow:NNnn
+        \fi:
+      }
+  }
+  {
+    \cs_new_protected:Npn \@@_gset_overflow_test:nw #1
+      {
+        \if_int_compare:w \int_abs:n {#1} > \c_max_dim
+          \exp_after:wN \@@_gset_overflow:NNnn
+        \fi:
+      }
+  }
 \cs_new_protected:Npn \@@_gset_overflow:NNnn #1#2#3#4
   {
     \__kernel_msg_error:nnxxxx { kernel } { overflow }
-      { \token_to_str:N #2 } {#3} {#4}
-      { \int_value:w \int_compare:nNnT {#4} < 0 { - } \c_max_dim }
-    \__kernel_intarray_gset:Nnn #2 {#3}
-      { \int_value:w \int_compare:nNnT {#4} < 0 { - } \c_max_dim }
+      { \token_to_str:N #2 } {#3} {#4} {  \@@_signed_max_dim:n {#4} }
+    #1 #2 {#3} { \@@_signed_max_dim:n {#4} }
   }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\intarray_gzero:N}
+%   Set the appropriate \tn{fontdimen} to zero.  No bound checking
+%   needed.  The \cs{prg_replicate:nn} possibly uses quite a lot of
+%   memory, but this is somewhat comparable to the size of the array,
+%   and it is much faster than an \cs{int_step_inline:nn} loop.
+%    \begin{macrocode}
+\cs_new_protected:Npn \intarray_gzero:N #1
+  {
+    \int_zero:N \l_@@_loop_int
+    \prg_replicate:nn { \intarray_count:N #1 }
+      {
+        \int_incr:N \l_@@_loop_int
+        \@@_entry:w \l_@@_loop_int #1 \c_zero_dim
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}[EXP]{\intarray_item:Nn, \__kernel_intarray_item:Nn}
 % \begin{macro}{\@@_item:Nn}
 %   Get the appropriate \tn{fontdimen} and perform bound checks.  The
@@ -257,7 +337,7 @@
 %   suitable for \cs{int_value:w}.
 %    \begin{macrocode}
 \cs_new:Npn \__kernel_intarray_item:Nn #1#2
-  { \int_value:w \tex_fontdimen:D #2 #1 }
+  { \int_value:w \@@_entry:w #2 #1 }
 \cs_new:Npn \intarray_item:Nn #1#2
   {
     \exp_after:wN \@@_item:Nw
@@ -274,7 +354,188 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\intarray_rand_item:N}
+%   Importantly, \cs{intarray_item:Nn} only evaluates its argument once.
 %    \begin{macrocode}
+\cs_new:Npn \intarray_rand_item:N #1
+  { \intarray_item:Nn #1 { \int_rand:n { \intarray_count:N #1 } } }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Working with contents of integer arrays}
+%
+% At the time of writing these are candidates, but we need at least
+% \cs{intarray_const_from_clist:Nn} in \pkg{l3fp} so before
+% \pkg{l3candidates}.
+%
+% \begin{macro}{\intarray_const_from_clist:Nn, \@@_const_from_clist:nN}
+%   Similar to \cs{intarray_new:Nn} (which we don't use because when
+%   debugging is enabled that function checks the variable name starts
+%   with |g_|).  We make use of the fact that \TeX{} allows allocation
+%   of successive \tn{fontdimen} as long as no other font has been
+%   declared: no need to count the comma list items first.  We need the
+%   code in \cs{intarray_gset:Nnn} that checks the item value is not too
+%   big, namely \cs{@@_gset_overflow_test:nw}, but not the code that
+%   checks bounds.  At the end, set the size of the intarray.
+%    \begin{macrocode}
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
+\cs_new_protected:Npn \intarray_const_from_clist:Nn #1#2
+  {
+    \@@_new:N #1
+    \int_zero:N \l_@@_loop_int
+    \clist_map_inline:nn {#2}
+      { \exp_args:Nf \@@_const_from_clist:nN { \int_eval:n {##1} } #1 }
+    \@@_count:w #1 \l_@@_loop_int
+  }
+\cs_new_protected:Npn \@@_const_from_clist:nN #1#2
+  {
+    \int_incr:N \l_@@_loop_int
+    \@@_gset_overflow_test:nw {#1}
+    \__kernel_intarray_gset:Nnn #2 \l_@@_loop_int {#1}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[rEXP]{\intarray_to_clist:N, \@@_to_clist:Nn, \@@_to_clist:w}
+%   Loop through the array, putting a comma before each item.  Remove
+%   the leading comma with |f|-expansion.  We also use the auxiliary in
+%   \cs{intarray_show:N} with argument comma, space.
+%    \begin{macrocode}
+\cs_new:Npn \intarray_to_clist:N #1 { \@@_to_clist:Nn #1 { , } }
+\cs_new:Npn \@@_to_clist:Nn #1#2
+  {
+    \int_compare:nNnF { \intarray_count:N #1 } = \c_zero_int
+      {
+        \exp_last_unbraced:Nf \use_none:n
+          { \@@_to_clist:w 1 ; #1 {#2} \prg_break_point: }
+      }
+  }
+\cs_new:Npn \@@_to_clist:w #1 ; #2#3
+  {
+    \if_int_compare:w #1 > \@@_count:w #2
+      \prg_break:n
+    \fi:
+    #3 \__kernel_intarray_item:Nn #2 {#1}
+    \exp_after:wN \@@_to_clist:w
+    \int_value:w \int_eval:w #1 + \c_one_int ; #2 {#3}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intarray_show:N, \intarray_log:N}
+%   Convert the list to a comma list (with spaces after each comma)
+%    \begin{macrocode}
+\cs_new_protected:Npn \intarray_show:N { \@@_show:NN \msg_show:nnxxxx }
+\cs_generate_variant:Nn \intarray_show:N { c }
+\cs_new_protected:Npn \intarray_log:N { \@@_show:NN \msg_log:nnxxxx }
+\cs_generate_variant:Nn \intarray_log:N { c }
+\cs_new_protected:Npn \@@_show:NN #1#2
+  {
+    \__kernel_chk_defined:NT #2
+      {
+        #1 { LaTeX/kernel } { show-intarray }
+          { \token_to_str:N #2 }
+          { \intarray_count:N #2 }
+          { >~ \@@_to_clist:Nn #2 { , ~ } }
+          { }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \subsection{Random arrays}
+%
+% \begin{macro}
+%   {
+%     \intarray_gset_rand:Nn,
+%     \intarray_gset_rand:Nnn,
+%     \@@_gset_rand:Nnn,
+%     \@@_gset_rand:Nff,
+%     \@@_gset_rand_auxi:Nnnn,
+%     \@@_gset_rand_auxii:Nnnn,
+%     \@@_gset_rand_auxiii:Nnnn,
+%     \@@_gset_all_same:Nn,
+%   }
+%   We only perform the bounds checks once.  This is done by two
+%   \cs{@@_gset_overflow_test:nw}, with an appropriate empty argument to
+%   avoid a spurious \enquote{at position \texttt{\#1}} part in the
+%   error message.  Then calculate the number of choices: this is at
+%   most $(2^{30}-1)-(-(2^{30}-1))+1=2^{31}-1$, which just barely does
+%   not overflow.  For small ranges use \cs{__kernel_randint:n} (making
+%   sure to subtract~$1$ \emph{before} adding the random number to the
+%   \meta{min}, to avoid overflow when \meta{min} or \meta{max} are
+%   $\pm\cs{c_max_int}$), otherwise \cs{__kernel_randint:nn}.  Finally,
+%   if there are no random numbers do not define any of the auxiliaries.
+%    \begin{macrocode}
+\cs_new_protected:Npn \intarray_gset_rand:Nn #1
+  { \intarray_gset_rand:Nnn #1 { 1 } }
+\sys_if_rand_exist:TF
+  {
+    \cs_new_protected:Npn \intarray_gset_rand:Nnn #1#2#3
+      {
+        \@@_gset_rand:Nff #1
+          { \int_eval:n {#2} } { \int_eval:n {#3} }
+      }
+    \cs_new_protected:Npn \@@_gset_rand:Nnn #1#2#3
+      {
+        \int_compare:nNnTF {#2} > {#3}
+          {
+            \__kernel_msg_expandable_error:nnnn
+              { kernel } { randint-backward-range } {#2} {#3}
+            \@@_gset_rand:Nnn #1 {#3} {#2}
+          }
+          {
+            \@@_gset_overflow_test:nw {#2}
+            \@@_gset_rand_auxi:Nnnn #1 { } {#2} {#3}
+          }
+      }
+    \cs_generate_variant:Nn \@@_gset_rand:Nnn { Nff }
+    \cs_new_protected:Npn \@@_gset_rand_auxi:Nnnn #1#2#3#4
+      {
+        \@@_gset_overflow_test:nw {#4}
+        \@@_gset_rand_auxii:Nnnn #1 { } {#4} {#3}
+      }
+    \cs_new_protected:Npn \@@_gset_rand_auxii:Nnnn #1#2#3#4
+      {
+        \exp_args:NNf \@@_gset_rand_auxiii:Nnnn #1
+          { \int_eval:n { #3 - #4 + 1 } } {#4} {#3}
+      }
+    \cs_new_protected:Npn \@@_gset_rand_auxiii:Nnnn #1#2#3#4
+      {
+        \exp_args:NNf \@@_gset_all_same:Nn #1
+          {
+            \int_compare:nNnTF {#2} > \c__kernel_randint_max_int
+              {
+                \exp_stop_f:
+                \int_eval:n { \__kernel_randint:nn {#3} {#4} }
+              }
+              {
+                \exp_stop_f:
+                \int_eval:n { \__kernel_randint:n {#2} - 1 + #3 }
+              }
+          }
+      }
+    \cs_new_protected:Npn \@@_gset_all_same:Nn #1#2
+      {
+        \int_zero:N \l_@@_loop_int
+        \prg_replicate:nn { \intarray_count:N #1 }
+          {
+            \int_incr:N \l_@@_loop_int
+            \__kernel_intarray_gset:Nnn #1 \l_@@_loop_int {#2}
+          }
+      }
+  }
+  {
+    \cs_new_protected:Npn \intarray_gset_rand:Nnn #1#2#3
+      {
+        \__kernel_msg_error:nnn { kernel } { fp-no-random }
+          { \intarray_gset_rand:Nnn #1 {#2} {#3} }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -84,7 +84,7 @@
 %   evaluation as well as the \meta{caller}.  For instance \meta{eval}
 %   can be \cs{__int_eval:w} and \meta{caller} can be \cs{int_eval:n} or
 %   \cs{int_set:Nn}.  The argument \meta{convert} is empty except for mu
-%   expressions where it is \cs{etex_mutoglue:D}, used for internal
+%   expressions where it is \cs{tex_mutoglue:D}, used for internal
 %   purposes.
 % \end{function}
 %
@@ -199,6 +199,18 @@
 %   in package mode, where interfacing with the \LaTeXe{} kernel is necessary.
 % \end{function}
 %
+% \begin{function}[EXP]{\__kernel_int_add:nnn}
+%   \begin{syntax}
+%     \cs{__kernel_int_add:nnn} \Arg{integer_1} \Arg{integer_2} \Arg{integer_3}
+%   \end{syntax}
+%   Expands to the result of adding the three \meta{integers} (which
+%   must be suitable input for \cs{int_eval:w}), avoiding intermediate
+%   overflow.  Overflow occurs only if the overall result is outside
+%   $[-2^{31}+1,2^{31}-1]$.  The \meta{integers} may be of the form
+%   \cs{int_eval:w} \dots{} \cs{scan_stop:} but may be evaluated more
+%   than once.
+% \end{function}
+%
 % \begin{function}{\__kernel_ior_open:Nn, \__kernel_ior_open:No}
 %   \begin{syntax}
 %     \cs{__kernel_ior_open:Nn} \meta{stream} \Arg{file name}
@@ -429,6 +441,35 @@
 %   and variable mappings.
 % \end{variable}
 %
+% \begin{variable}{\c__kernel_randint_max_int}
+%   Maximal allowed argument to \cs{__kernel_randint:n}.  Equal to
+%   $2^{17}-1$.
+% \end{variable}
+%
+% \begin{function}{\__kernel_randint:n}
+%   \begin{syntax}
+%     \cs{__kernel_randint:n} \Arg{max}
+%   \end{syntax}
+%   Used in an integer expression this gives a pseudo-random number
+%   between $1$ and $\meta{max}$ included.  One must have
+%   $\meta{max}\leq 2^{17}-1$.  The \meta{max} must be suitable for
+%   \cs{int_value:w} (and any \cs{int_eval:w} must be terminated by
+%   \cs{scan_stop:} or equivalent).
+% \end{function}
+%
+% \begin{function}{\__kernel_randint:nn}
+%   \begin{syntax}
+%     \cs{__kernel_randint:nn} \Arg{min} \Arg{max}
+%   \end{syntax}
+%   Used in an integer expression this gives a pseudo-random number
+%   between $\meta{min}$ and $\meta{max}$ included.  The \meta{min} and
+%   \meta{max} must be suitable for \cs{int_value:w} (and any
+%   \cs{int_eval:w} must be terminated by \cs{scan_stop:} or
+%   equivalent).  For small ranges
+%   $R=\meta{max}-\meta{min}+1\leq 2^{17}-1$,
+%   $\meta{min} - 1 + \cs{__kernel_randint:n} |{|R|}|$ is faster.
+% \end{function}
+%
 % \begin{function}{\__kernel_register_show:N, \__kernel_register_show:c}
 %   \begin{syntax}
 %     \cs{__kernel_register_show:N} \meta{register}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -203,9 +203,9 @@
 % \begin{macro}[EXP]{\@@_escape_x:n, \@@_now_x:n, \@@_shipout_x:n}
 %   Copies of primitives.
 %    \begin{macrocode}
-\cs_new_eq:NN \@@_escape_x:n  \luatex_luaescapestring:D
-\cs_new_eq:NN \@@_now_x:n     \luatex_directlua:D
-\cs_new_eq:NN \@@_shipout_x:n \luatex_latelua:D
+\cs_new_eq:NN \@@_escape_x:n  \tex_luaescapestring:D
+\cs_new_eq:NN \@@_now_x:n     \tex_directlua:D
+\cs_new_eq:NN \@@_shipout_x:n \tex_latelua:D
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -1192,7 +1192,7 @@
         {
           \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
             {
-              \etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
+              \tex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
                 { \exp_after:wN \l_@@_internal_tl }
             }
         }
@@ -1711,7 +1711,8 @@
 \__kernel_msg_new:nnnn { kernel } { overflow }
   { Integers~larger~than~2^{30}-1~cannot~be~stored~in~arrays. }
   {
-    An~attempt~was~made~to~store~#3~at~position~#2~in~the~array~'#1'.~
+    An~attempt~was~made~to~store~#3~
+    \tl_if_empty:nF {#2} { at~position~#2~ } in~the~array~'#1'.~
     The~largest~allowed~value~#4~will~be~used~instead.
   }
 \__kernel_msg_new:nnnn { kernel } { out-of-bounds }
@@ -1912,6 +1913,8 @@
       { is~empty \\>~ . }
       { contains~the~items~(without~outer~braces): #2 . }
   }
+\__kernel_msg_new:nnn { kernel } { show-intarray }
+  { The~integer~array~#1~contains~#2~items: \\ #3 . }
 \__kernel_msg_new:nnn { kernel } { show-prop }
   {
     The~property~list~#1~

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -65,12 +65,8 @@
 % the primitives. These are named based on the engine which first introduced
 % them:
 % \begin{itemize}
-%   \item[{\cs[no-index]{tex_\ldots}}] Introduced by \TeX{} itself;
-%   \item[{\cs[no-index]{etex_\ldots}}] Introduced by the \eTeX{} extensions;
-%   \item[{\cs[no-index]{pdftex_\ldots}}] Introduced by \pdfTeX{};
-%   \item[{\cs[no-index]{xetex_\ldots}}] Introduced by \XeTeX{};
-%   \item[{\cs[no-index]{luatex_\ldots}}] Introduced by \LuaTeX{};
-%   \item[{\cs[no-index]{utex_\ldots}}] Introduced by \XeTeX{} and \LuaTeX{};
+%   \item[{\cs[no-index]{tex_\ldots}}] Introduced by \TeX{}, \eTeX{},
+%     \pdfTeX{}, \XeTeX{} and \LuaTeX{};
 %   \item[{\cs[no-index]{ptex_\ldots}}] Introduced by \pTeX{};
 %   \item[{\cs[no-index]{uptex_\ldots}}] Introduced by \upTeX{}.
 % \end{itemize}
@@ -465,10 +461,922 @@
   \@@_primitive:NN \xspaceskip            \tex_xspaceskip:D
   \@@_primitive:NN \year                  \tex_year:D
 %    \end{macrocode}
-% Since \LaTeX3 requires at least the \eTeX{} extensions,
-% we also rename the additional primitives. These are all
-% given the prefix | \etex_|.
+% Primitives introduced by \eTeX{}.
 %    \begin{macrocode}
+  \@@_primitive:NN \beginL                \tex_beginL:D
+  \@@_primitive:NN \beginR                \tex_beginR:D
+  \@@_primitive:NN \botmarks              \tex_botmarks:D
+  \@@_primitive:NN \clubpenalties         \tex_clubpenalties:D
+  \@@_primitive:NN \currentgrouplevel     \tex_currentgrouplevel:D
+  \@@_primitive:NN \currentgrouptype      \tex_currentgrouptype:D
+  \@@_primitive:NN \currentifbranch       \tex_currentifbranch:D
+  \@@_primitive:NN \currentiflevel        \tex_currentiflevel:D
+  \@@_primitive:NN \currentiftype         \tex_currentiftype:D
+  \@@_primitive:NN \detokenize            \tex_detokenize:D
+  \@@_primitive:NN \dimexpr               \tex_dimexpr:D
+  \@@_primitive:NN \displaywidowpenalties \tex_displaywidowpenalties:D
+  \@@_primitive:NN \endL                  \tex_endL:D
+  \@@_primitive:NN \endR                  \tex_endR:D
+  \@@_primitive:NN \eTeXrevision          \tex_eTeXrevision:D
+  \@@_primitive:NN \eTeXversion           \tex_eTeXversion:D
+  \@@_primitive:NN \everyeof              \tex_everyeof:D
+  \@@_primitive:NN \firstmarks            \tex_firstmarks:D
+  \@@_primitive:NN \fontchardp            \tex_fontchardp:D
+  \@@_primitive:NN \fontcharht            \tex_fontcharht:D
+  \@@_primitive:NN \fontcharic            \tex_fontcharic:D
+  \@@_primitive:NN \fontcharwd            \tex_fontcharwd:D
+  \@@_primitive:NN \glueexpr              \tex_glueexpr:D
+  \@@_primitive:NN \glueshrink            \tex_glueshrink:D
+  \@@_primitive:NN \glueshrinkorder       \tex_glueshrinkorder:D
+  \@@_primitive:NN \gluestretch           \tex_gluestretch:D
+  \@@_primitive:NN \gluestretchorder      \tex_gluestretchorder:D
+  \@@_primitive:NN \gluetomu              \tex_gluetomu:D
+  \@@_primitive:NN \ifcsname              \tex_ifcsname:D
+  \@@_primitive:NN \ifdefined             \tex_ifdefined:D
+  \@@_primitive:NN \iffontchar            \tex_iffontchar:D
+  \@@_primitive:NN \interactionmode       \tex_interactionmode:D
+  \@@_primitive:NN \interlinepenalties    \tex_interlinepenalties:D
+  \@@_primitive:NN \lastlinefit           \tex_lastlinefit:D
+  \@@_primitive:NN \lastnodetype          \tex_lastnodetype:D
+  \@@_primitive:NN \marks                 \tex_marks:D
+  \@@_primitive:NN \middle                \tex_middle:D
+  \@@_primitive:NN \muexpr                \tex_muexpr:D
+  \@@_primitive:NN \mutoglue              \tex_mutoglue:D
+  \@@_primitive:NN \numexpr               \tex_numexpr:D
+  \@@_primitive:NN \pagediscards          \tex_pagediscards:D
+  \@@_primitive:NN \parshapedimen         \tex_parshapedimen:D
+  \@@_primitive:NN \parshapeindent        \tex_parshapeindent:D
+  \@@_primitive:NN \parshapelength        \tex_parshapelength:D
+  \@@_primitive:NN \predisplaydirection   \tex_predisplaydirection:D
+  \@@_primitive:NN \protected             \tex_protected:D
+  \@@_primitive:NN \readline              \tex_readline:D
+  \@@_primitive:NN \savinghyphcodes       \tex_savinghyphcodes:D
+  \@@_primitive:NN \savingvdiscards       \tex_savingvdiscards:D
+  \@@_primitive:NN \scantokens            \tex_scantokens:D
+  \@@_primitive:NN \showgroups            \tex_showgroups:D
+  \@@_primitive:NN \showifs               \tex_showifs:D
+  \@@_primitive:NN \showtokens            \tex_showtokens:D
+  \@@_primitive:NN \splitbotmarks         \tex_splitbotmarks:D
+  \@@_primitive:NN \splitdiscards         \tex_splitdiscards:D
+  \@@_primitive:NN \splitfirstmarks       \tex_splitfirstmarks:D
+  \@@_primitive:NN \TeXXeTstate           \tex_TeXXeTstate:D
+  \@@_primitive:NN \topmarks              \tex_topmarks:D
+  \@@_primitive:NN \tracingassigns        \tex_tracingassigns:D
+  \@@_primitive:NN \tracinggroups         \tex_tracinggroups:D
+  \@@_primitive:NN \tracingifs            \tex_tracingifs:D
+  \@@_primitive:NN \tracingnesting        \tex_tracingnesting:D
+  \@@_primitive:NN \tracingscantokens     \tex_tracingscantokens:D
+  \@@_primitive:NN \unexpanded            \tex_unexpanded:D
+  \@@_primitive:NN \unless                \tex_unless:D
+  \@@_primitive:NN \widowpenalties        \tex_widowpenalties:D
+%    \end{macrocode}
+% Post-\eTeX{} primitives do not always end up with the same name in all
+% engines, if indeed they are available cross-engine anyway. We therefore
+% take the approach of preferring the shortest name that makes sense. First,
+% we deal with the primitives introduced by \pdfTeX{} which directly
+% relate to PDF output: these are copied with the names unchanged.
+%    \begin{macrocode}
+  \@@_primitive:NN \pdfannot              \tex_pdfannot:D
+  \@@_primitive:NN \pdfcatalog            \tex_pdfcatalog:D
+  \@@_primitive:NN \pdfcompresslevel      \tex_pdfcompresslevel:D
+  \@@_primitive:NN \pdfcolorstack         \tex_pdfcolorstack:D
+  \@@_primitive:NN \pdfcolorstackinit     \tex_pdfcolorstackinit:D
+  \@@_primitive:NN \pdfcreationdate       \tex_pdfcreationdate:D
+  \@@_primitive:NN \pdfdecimaldigits      \tex_pdfdecimaldigits:D
+  \@@_primitive:NN \pdfdest               \tex_pdfdest:D
+  \@@_primitive:NN \pdfdestmargin         \tex_pdfdestmargin:D
+  \@@_primitive:NN \pdfendlink            \tex_pdfendlink:D
+  \@@_primitive:NN \pdfendthread          \tex_pdfendthread:D
+  \@@_primitive:NN \pdffontattr           \tex_pdffontattr:D
+  \@@_primitive:NN \pdffontname           \tex_pdffontname:D
+  \@@_primitive:NN \pdffontobjnum         \tex_pdffontobjnum:D
+  \@@_primitive:NN \pdfgamma              \tex_pdfgamma:D
+  \@@_primitive:NN \pdfimageapplygamma    \tex_pdfimageapplygamma:D
+  \@@_primitive:NN \pdfimagegamma         \tex_pdfimagegamma:D
+  \@@_primitive:NN \pdfgentounicode       \tex_pdfgentounicode:D
+  \@@_primitive:NN \pdfglyphtounicode     \tex_pdfglyphtounicode:D
+  \@@_primitive:NN \pdfhorigin            \tex_pdfhorigin:D
+  \@@_primitive:NN \pdfimagehicolor       \tex_pdfimagehicolor:D
+  \@@_primitive:NN \pdfimageresolution    \tex_pdfimageresolution:D
+  \@@_primitive:NN \pdfincludechars       \tex_pdfincludechars:D
+  \@@_primitive:NN \pdfinclusioncopyfonts \tex_pdfinclusioncopyfonts:D
+  \@@_primitive:NN \pdfinclusionerrorlevel
+    \tex_pdfinclusionerrorlevel:D
+  \@@_primitive:NN \pdfinfo               \tex_pdfinfo:D
+  \@@_primitive:NN \pdflastannot          \tex_pdflastannot:D
+  \@@_primitive:NN \pdflastlink           \tex_pdflastlink:D
+  \@@_primitive:NN \pdflastobj            \tex_pdflastobj:D
+  \@@_primitive:NN \pdflastxform          \tex_pdflastxform:D
+  \@@_primitive:NN \pdflastximage         \tex_pdflastximage:D
+  \@@_primitive:NN \pdflastximagecolordepth
+    \tex_pdflastximagecolordepth:D
+  \@@_primitive:NN \pdflastximagepages    \tex_pdflastximagepages:D
+  \@@_primitive:NN \pdflinkmargin         \tex_pdflinkmargin:D
+  \@@_primitive:NN \pdfliteral            \tex_pdfliteral:D
+  \@@_primitive:NN \pdfminorversion       \tex_pdfminorversion:D
+  \@@_primitive:NN \pdfnames              \tex_pdfnames:D
+  \@@_primitive:NN \pdfobj                \tex_pdfobj:D
+  \@@_primitive:NN \pdfobjcompresslevel   \tex_pdfobjcompresslevel:D
+  \@@_primitive:NN \pdfoutline            \tex_pdfoutline:D
+  \@@_primitive:NN \pdfoutput             \tex_pdfoutput:D
+  \@@_primitive:NN \pdfpageattr           \tex_pdfpageattr:D
+  \@@_primitive:NN \pdfpagebox            \tex_pdfpagebox:D
+  \@@_primitive:NN \pdfpageref            \tex_pdfpageref:D
+  \@@_primitive:NN \pdfpageresources      \tex_pdfpageresources:D
+  \@@_primitive:NN \pdfpagesattr          \tex_pdfpagesattr:D
+  \@@_primitive:NN \pdfrefobj             \tex_pdfrefobj:D
+  \@@_primitive:NN \pdfrefxform           \tex_pdfrefxform:D
+  \@@_primitive:NN \pdfrefximage          \tex_pdfrefximage:D
+  \@@_primitive:NN \pdfrestore            \tex_pdfrestore:D
+  \@@_primitive:NN \pdfretval             \tex_pdfretval:D
+  \@@_primitive:NN \pdfsave               \tex_pdfsave:D
+  \@@_primitive:NN \pdfsetmatrix          \tex_pdfsetmatrix:D
+  \@@_primitive:NN \pdfstartlink          \tex_pdfstartlink:D
+  \@@_primitive:NN \pdfstartthread        \tex_pdfstartthread:D
+  \@@_primitive:NN \pdfsuppressptexinfo   \tex_pdfsuppressptexinfo:D
+  \@@_primitive:NN \pdfthread             \tex_pdfthread:D
+  \@@_primitive:NN \pdfthreadmargin       \tex_pdfthreadmargin:D
+  \@@_primitive:NN \pdftrailer            \tex_pdftrailer:D
+  \@@_primitive:NN \pdfuniqueresname      \tex_pdfuniqueresname:D
+  \@@_primitive:NN \pdfvorigin            \tex_pdfvorigin:D
+  \@@_primitive:NN \pdfxform              \tex_pdfxform:D
+  \@@_primitive:NN \pdfxformattr          \tex_pdfxformattr:D
+  \@@_primitive:NN \pdfxformname          \tex_pdfxformname:D
+  \@@_primitive:NN \pdfxformresources     \tex_pdfxformresources:D
+  \@@_primitive:NN \pdfximage             \tex_pdfximage:D
+  \@@_primitive:NN \pdfximagebbox         \tex_pdfximagebbox:D
+%    \end{macrocode}
+% These are not related to PDF output and either already appear in other
+% engines without the |\pdf| prefix, or might reasonably do so at some
+% future stage. We therefore drop the leading |pdf| here.
+%    \begin{macrocode}
+  \@@_primitive:NN \ifpdfabsdim           \tex_ifabsdim:D
+  \@@_primitive:NN \ifpdfabsnum           \tex_ifabsnum:D
+  \@@_primitive:NN \ifpdfprimitive        \tex_ifprimitive:D
+  \@@_primitive:NN \pdfadjustspacing      \tex_adjustspacing:D
+  \@@_primitive:NN \pdfcopyfont           \tex_copyfont:D
+  \@@_primitive:NN \pdfdraftmode          \tex_draftmode:D
+  \@@_primitive:NN \pdfeachlinedepth      \tex_eachlinedepth:D
+  \@@_primitive:NN \pdfeachlineheight     \tex_eachlineheight:D
+  \@@_primitive:NN \pdffilemoddate        \tex_filemoddate:D
+  \@@_primitive:NN \pdffilesize           \tex_filesize:D
+  \@@_primitive:NN \pdffirstlineheight    \tex_firstlineheight:D
+  \@@_primitive:NN \pdffontexpand         \tex_fontexpand:D
+  \@@_primitive:NN \pdffontsize           \tex_fontsize:D
+  \@@_primitive:NN \pdfignoreddimen       \tex_ignoreddimen:D
+  \@@_primitive:NN \pdfinsertht           \tex_insertht:D
+  \@@_primitive:NN \pdflastlinedepth      \tex_lastlinedepth:D
+  \@@_primitive:NN \pdflastxpos           \tex_lastxpos:D
+  \@@_primitive:NN \pdflastypos           \tex_lastypos:D
+  \@@_primitive:NN \pdfmapfile            \tex_mapfile:D
+  \@@_primitive:NN \pdfmapline            \tex_mapline:D
+  \@@_primitive:NN \pdfmdfivesum          \tex_mdfivesum:D
+  \@@_primitive:NN \pdfnoligatures        \tex_noligatures:D
+  \@@_primitive:NN \pdfnormaldeviate      \tex_normaldeviate:D
+  \@@_primitive:NN \pdfpageheight         \tex_pageheight:D
+  \@@_primitive:NN \pdfpagewidth          \tex_pagewidth:D
+  \@@_primitive:NN \pdfpkmode             \tex_pkmode:D
+  \@@_primitive:NN \pdfpkresolution       \tex_pkresolution:D
+  \@@_primitive:NN \pdfprimitive          \tex_primitive:D
+  \@@_primitive:NN \pdfprotrudechars      \tex_protrudechars:D
+  \@@_primitive:NN \pdfpxdimen            \tex_pxdimen:D
+  \@@_primitive:NN \pdfrandomseed         \tex_randomseed:D
+  \@@_primitive:NN \pdfsavepos            \tex_savepos:D
+  \@@_primitive:NN \pdfstrcmp             \tex_strcmp:D
+  \@@_primitive:NN \pdfsetrandomseed      \tex_setrandomseed:D
+  \@@_primitive:NN \pdfshellescape        \tex_shellescape:D
+  \@@_primitive:NN \pdftracingfonts       \tex_tracingfonts:D
+  \@@_primitive:NN \pdfuniformdeviate     \tex_uniformdeviate:D
+%    \end{macrocode}
+% The version primitives are not related to PDF mode but are
+% \pdfTeX{}-specific, so again are carried forward unchanged.
+%    \begin{macrocode}
+  \@@_primitive:NN \pdftexbanner          \tex_pdftexbanner:D
+  \@@_primitive:NN \pdftexrevision        \tex_pdftexrevision:D
+  \@@_primitive:NN \pdftexversion         \tex_pdftexversion:D
+%    \end{macrocode}
+% These ones appear in \pdfTeX{} but don't have |pdf| in the name at all:
+% no decisions to make.
+%    \begin{macrocode}
+  \@@_primitive:NN \efcode                \tex_efcode:D
+  \@@_primitive:NN \ifincsname            \tex_ifincsname:D
+  \@@_primitive:NN \leftmarginkern        \tex_leftmarginkern:D
+  \@@_primitive:NN \letterspacefont       \tex_letterspacefont:D
+  \@@_primitive:NN \lpcode                \tex_lpcode:D
+  \@@_primitive:NN \quitvmode             \tex_quitvmode:D
+  \@@_primitive:NN \rightmarginkern       \tex_rightmarginkern:D
+  \@@_primitive:NN \rpcode                \tex_rpcode:D
+  \@@_primitive:NN \synctex               \tex_synctex:D
+  \@@_primitive:NN \tagcode               \tex_tagcode:D
+%    \end{macrocode}
+% Post \pdfTeX{} primitive availability gets more complex. Both \XeTeX{} and
+% \LuaTeX{} have varying names for some primitives from \pdfTeX{}. Particularly
+% for \LuaTeX{} tracking all of that would be hard. Instead, we now check that
+% we only save primitives if they actually exist.
+%    \begin{macrocode}
+%</initex|names|package>
+%<*initex|package>
+  \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 \@@_primitive:NN #1#2
+    {
+      \tex_ifdefined:D #1
+        \tex_expandafter:D \use_ii:nn
+      \tex_fi:D
+        \use_none:n { \tex_global:D \tex_let:D #2 #1 }
+%<*initex>
+      \tex_global:D \tex_let:D #1 \tex_undefined:D
+%</initex>
+    }
+%</initex|package>
+%<*initex|names|package>
+%    \end{macrocode}
+% \XeTeX{}-specific primitives. Note that \XeTeX{}'s \tn{strcmp} is
+% handled earlier and is \enquote{rolled up} into \tn{pdfstrcmp}. 
+% A few cross-compatibility names which lack
+% the |pdf| of the original are handled later.
+%    \begin{macrocode}
+  \@@_primitive:NN \suppressfontnotfounderror
+    \tex_suppressfontnotfounderror:D
+  \@@_primitive:NN \XeTeXcharclass        \tex_XeTeXcharclass:D
+  \@@_primitive:NN \XeTeXcharglyph        \tex_XeTeXcharglyph:D
+  \@@_primitive:NN \XeTeXcountfeatures    \tex_XeTeXcountfeatures:D
+  \@@_primitive:NN \XeTeXcountglyphs      \tex_XeTeXcountglyphs:D
+  \@@_primitive:NN \XeTeXcountselectors   \tex_XeTeXcountselectors:D
+  \@@_primitive:NN \XeTeXcountvariations  \tex_XeTeXcountvariations:D
+  \@@_primitive:NN \XeTeXdefaultencoding  \tex_XeTeXdefaultencoding:D
+  \@@_primitive:NN \XeTeXdashbreakstate   \tex_XeTeXdashbreakstate:D
+  \@@_primitive:NN \XeTeXfeaturecode      \tex_XeTeXfeaturecode:D
+  \@@_primitive:NN \XeTeXfeaturename      \tex_XeTeXfeaturename:D
+  \@@_primitive:NN \XeTeXfindfeaturebyname
+    \tex_XeTeXfindfeaturebyname:D
+  \@@_primitive:NN \XeTeXfindselectorbyname
+    \tex_XeTeXfindselectorbyname:D
+  \@@_primitive:NN \XeTeXfindvariationbyname
+    \tex_XeTeXfindvariationbyname:D
+  \@@_primitive:NN \XeTeXfirstfontchar    \tex_XeTeXfirstfontchar:D
+  \@@_primitive:NN \XeTeXfonttype         \tex_XeTeXfonttype:D
+  \@@_primitive:NN \XeTeXgenerateactualtext
+    \tex_XeTeXgenerateactualtext:D
+  \@@_primitive:NN \XeTeXglyph            \tex_XeTeXglyph:D
+  \@@_primitive:NN \XeTeXglyphbounds      \tex_XeTeXglyphbounds:D
+  \@@_primitive:NN \XeTeXglyphindex       \tex_XeTeXglyphindex:D
+  \@@_primitive:NN \XeTeXglyphname        \tex_XeTeXglyphname:D
+  \@@_primitive:NN \XeTeXinputencoding    \tex_XeTeXinputencoding:D
+  \@@_primitive:NN \XeTeXinputnormalization
+    \tex_XeTeXinputnormalization:D
+  \@@_primitive:NN \XeTeXinterchartokenstate
+    \tex_XeTeXinterchartokenstate:D
+  \@@_primitive:NN \XeTeXinterchartoks    \tex_XeTeXinterchartoks:D
+  \@@_primitive:NN \XeTeXisdefaultselector
+    \tex_XeTeXisdefaultselector:D
+  \@@_primitive:NN \XeTeXisexclusivefeature
+    \tex_XeTeXisexclusivefeature:D
+  \@@_primitive:NN \XeTeXlastfontchar     \tex_XeTeXlastfontchar:D
+  \@@_primitive:NN \XeTeXlinebreakskip    \tex_XeTeXlinebreakskip:D
+  \@@_primitive:NN \XeTeXlinebreaklocale  \tex_XeTeXlinebreaklocale:D
+  \@@_primitive:NN \XeTeXlinebreakpenalty \tex_XeTeXlinebreakpenalty:D
+  \@@_primitive:NN \XeTeXOTcountfeatures  \tex_XeTeXOTcountfeatures:D
+  \@@_primitive:NN \XeTeXOTcountlanguages \tex_XeTeXOTcountlanguages:D
+  \@@_primitive:NN \XeTeXOTcountscripts   \tex_XeTeXOTcountscripts:D
+  \@@_primitive:NN \XeTeXOTfeaturetag     \tex_XeTeXOTfeaturetag:D
+  \@@_primitive:NN \XeTeXOTlanguagetag    \tex_XeTeXOTlanguagetag:D
+  \@@_primitive:NN \XeTeXOTscripttag      \tex_XeTeXOTscripttag:D
+  \@@_primitive:NN \XeTeXpdffile          \tex_XeTeXpdffile:D
+  \@@_primitive:NN \XeTeXpdfpagecount     \tex_XeTeXpdfpagecount:D
+  \@@_primitive:NN \XeTeXpicfile          \tex_XeTeXpicfile:D
+  \@@_primitive:NN \XeTeXrevision         \tex_XeTeXrevision:D
+  \@@_primitive:NN \XeTeXselectorname     \tex_XeTeXselectorname:D
+  \@@_primitive:NN \XeTeXtracingfonts     \tex_XeTeXtracingfonts:D
+  \@@_primitive:NN \XeTeXupwardsmode      \tex_XeTeXupwardsmode:D
+  \@@_primitive:NN \XeTeXuseglyphmetrics  \tex_XeTeXuseglyphmetrics:D
+  \@@_primitive:NN \XeTeXvariation        \tex_XeTeXvariation:D
+  \@@_primitive:NN \XeTeXvariationdefault \tex_XeTeXvariationdefault:D
+  \@@_primitive:NN \XeTeXvariationmax     \tex_XeTeXvariationmax:D
+  \@@_primitive:NN \XeTeXvariationmin     \tex_XeTeXvariationmin:D
+  \@@_primitive:NN \XeTeXvariationname    \tex_XeTeXvariationname:D
+  \@@_primitive:NN \XeTeXversion          \tex_XeTeXversion:D
+%    \end{macrocode}
+% Primitives from \pdfTeX{} that \XeTeX{} renames: also helps with
+% \LuaTeX{}.
+%    \begin{macrocode}
+  \@@_primitive:NN \mdfivesum             \tex_mdfivesum:D
+  \@@_primitive:NN \ifprimitive           \tex_ifprimitive:D
+  \@@_primitive:NN \primitive             \tex_primitive:D
+  \@@_primitive:NN \shellescape           \tex_shellescape:D
+%    \end{macrocode}
+% Primitives from \LuaTeX{}, some of which have been ported back to
+% \XeTeX{}.
+%    \begin{macrocode}
+  \@@_primitive:NN \alignmark             \tex_alignmark:D
+  \@@_primitive:NN \aligntab              \tex_aligntab:D
+  \@@_primitive:NN \attribute             \tex_attribute:D
+  \@@_primitive:NN \attributedef          \tex_attributedef:D
+  \@@_primitive:NN \automaticdiscretionary
+    \tex_automaticdiscretionary:D
+  \@@_primitive:NN \automatichyphenmode   \tex_automatichyphenmode:D
+  \@@_primitive:NN \automatichyphenpenalty
+    \tex_automatichyphenpenalty:D
+  \@@_primitive:NN \begincsname           \tex_begincsname:D
+  \@@_primitive:NN \breakafterdirmode     \tex_breakafterdirmode:D
+  \@@_primitive:NN \catcodetable          \tex_catcodetable:D
+  \@@_primitive:NN \clearmarks            \tex_clearmarks:D
+  \@@_primitive:NN \crampeddisplaystyle   \tex_crampeddisplaystyle:D
+  \@@_primitive:NN \crampedscriptscriptstyle
+    \tex_crampedscriptscriptstyle:D
+  \@@_primitive:NN \crampedscriptstyle    \tex_crampedscriptstyle:D
+  \@@_primitive:NN \crampedtextstyle      \tex_crampedtextstyle:D
+  \@@_primitive:NN \directlua             \tex_directlua:D
+  \@@_primitive:NN \dviextension          \tex_dviextension:D
+  \@@_primitive:NN \dvifeedback           \tex_dvifeedback:D
+  \@@_primitive:NN \dvivariable           \tex_dvivariable:D
+  \@@_primitive:NN \etoksapp              \tex_etoksapp:D
+  \@@_primitive:NN \etokspre              \tex_etokspre:D
+  \@@_primitive:NN \explicithyphenpenalty \tex_explicithyphenpenalty:D
+  \@@_primitive:NN \expanded              \tex_expanded:D
+  \@@_primitive:NN \explicitdiscretionary \tex_explicitdiscretionary:D
+  \@@_primitive:NN \firstvalidlanguage    \tex_firstvalidlanguage:D
+  \@@_primitive:NN \fontid                \tex_fontid:D
+  \@@_primitive:NN \formatname            \tex_formatname:D
+  \@@_primitive:NN \hjcode                \tex_hjcode:D
+  \@@_primitive:NN \hpack                 \tex_hpack:D
+  \@@_primitive:NN \hyphenationbounds     \tex_hyphenationbounds:D
+  \@@_primitive:NN \hyphenationmin        \tex_hyphenationmin:D
+  \@@_primitive:NN \hyphenpenaltymode     \tex_hyphenpenaltymode:D
+  \@@_primitive:NN \gleaders              \tex_gleaders:D
+  \@@_primitive:NN \initcatcodetable      \tex_initcatcodetable:D
+  \@@_primitive:NN \lastnamedcs           \tex_lastnamedcs:D
+  \@@_primitive:NN \latelua               \tex_latelua:D
+  \@@_primitive:NN \letcharcode           \tex_letcharcode:D
+  \@@_primitive:NN \luaescapestring       \tex_luaescapestring:D
+  \@@_primitive:NN \luafunction           \tex_luafunction:D
+  \@@_primitive:NN \luatexbanner          \tex_luatexbanner:D
+  \@@_primitive:NN \luatexrevision        \tex_luatexrevision:D
+  \@@_primitive:NN \luatexversion         \tex_luatexversion:D
+  \@@_primitive:NN \mathdelimitersmode    \tex_mathdelimitersmode:D
+  \@@_primitive:NN \mathdisplayskipmode   \tex_mathdisplayskipmode:D
+  \@@_primitive:NN \matheqnogapstep       \tex_matheqnogapstep:D
+  \@@_primitive:NN \mathnolimitsmode      \tex_mathnolimitsmode:D
+  \@@_primitive:NN \mathoption            \tex_mathoption:D
+  \@@_primitive:NN \mathpenaltiesmode     \tex_mathpenaltiesmode:D
+  \@@_primitive:NN \mathrulesfam          \tex_mathrulesfam:D
+  \@@_primitive:NN \mathscriptsmode       \tex_mathscriptsmode:D
+  \@@_primitive:NN \mathscriptboxmode     \tex_mathscriptboxmode:D
+  \@@_primitive:NN \mathstyle             \tex_mathstyle:D
+  \@@_primitive:NN \mathsurroundmode      \tex_mathsurroundmode:D
+  \@@_primitive:NN \mathsurroundskip      \tex_mathsurroundskip:D
+  \@@_primitive:NN \nohrule               \tex_nohrule:D
+  \@@_primitive:NN \nokerns               \tex_nokerns:D
+  \@@_primitive:NN \noligs                \tex_noligs:D
+  \@@_primitive:NN \nospaces              \tex_nospaces:D
+  \@@_primitive:NN \novrule               \tex_novrule:D
+  \@@_primitive:NN \outputbox             \tex_outputbox:D
+  \@@_primitive:NN \pagebottomoffset      \tex_pagebottomoffset:D
+  \@@_primitive:NN \pageleftoffset        \tex_pageleftoffset:D
+  \@@_primitive:NN \pagerightoffset       \tex_pagerightoffset:D
+  \@@_primitive:NN \pagetopoffset         \tex_pagetopoffset:D
+  \@@_primitive:NN \pdfextension          \tex_pdfextension:D
+  \@@_primitive:NN \pdffeedback           \tex_pdffeedback:D
+  \@@_primitive:NN \pdfvariable           \tex_pdfvariable:D
+  \@@_primitive:NN \postexhyphenchar      \tex_postexhyphenchar:D
+  \@@_primitive:NN \posthyphenchar        \tex_posthyphenchar:D
+  \@@_primitive:NN \prebinoppenalty       \tex_prebinoppenalty:D
+  \@@_primitive:NN \predisplaygapfactor   \tex_predisplaygapfactor:D
+  \@@_primitive:NN \preexhyphenchar       \tex_preexhyphenchar:D
+  \@@_primitive:NN \prehyphenchar         \tex_prehyphenchar:D
+  \@@_primitive:NN \prerelpenalty         \tex_prerelpenalty:D
+  \@@_primitive:NN \savecatcodetable      \tex_savecatcodetable:D
+  \@@_primitive:NN \scantextokens         \tex_scantextokens:D
+  \@@_primitive:NN \setfontid             \tex_setfontid:D
+  \@@_primitive:NN \shapemode             \tex_shapemode:D
+  \@@_primitive:NN \suppressifcsnameerror \tex_suppressifcsnameerror:D
+  \@@_primitive:NN \suppresslongerror     \tex_suppresslongerror:D
+  \@@_primitive:NN \suppressmathparerror  \tex_suppressmathparerror:D
+  \@@_primitive:NN \suppressoutererror    \tex_suppressoutererror:D
+  \@@_primitive:NN \suppressprimitiveerror
+    \tex_suppressprimitiveerror:D
+  \@@_primitive:NN \toksapp               \tex_toksapp:D
+  \@@_primitive:NN \tokspre               \tex_tokspre:D
+  \@@_primitive:NN \tpack                 \tex_tpack:D
+  \@@_primitive:NN \vpack                 \tex_vpack:D
+%    \end{macrocode}
+% These come from Omega/Aleph, but we do not support those engines and
+% so list them here.
+%    \begin{macrocode}
+  \@@_primitive:NN \bodydir               \tex_bodydir:D
+  \@@_primitive:NN \boxdir                \tex_boxdir:D
+  \@@_primitive:NN \leftghost             \tex_leftghost:D
+  \@@_primitive:NN \linedir               \tex_linedir:D
+  \@@_primitive:NN \localbrokenpenalty    \tex_localbrokenpenalty:D
+  \@@_primitive:NN \localinterlinepenalty \tex_localinterlinepenalty:D
+  \@@_primitive:NN \localleftbox          \tex_localleftbox:D
+  \@@_primitive:NN \localrightbox         \tex_localrightbox:D
+  \@@_primitive:NN \mathdir               \tex_mathdir:D
+  \@@_primitive:NN \pagedir               \tex_pagedir:D
+  \@@_primitive:NN \pardir                \tex_pardir:D
+  \@@_primitive:NN \rightghost            \tex_rightghost:D
+  \@@_primitive:NN \textdir               \tex_textdir:D
+%    \end{macrocode}
+% Primitives from \pdfTeX{} that \LuaTeX{} renames.
+%    \begin{macrocode}
+  \@@_primitive:NN \adjustspacing         \tex_adjustspacing:D
+  \@@_primitive:NN \copyfont              \tex_copyfont:D
+  \@@_primitive:NN \draftmode             \tex_draftmode:D
+  \@@_primitive:NN \expandglyphsinfont    \tex_fontexpand:D
+  \@@_primitive:NN \ifabsdim              \tex_ifabsdim:D
+  \@@_primitive:NN \ifabsnum              \tex_ifabsnum:D
+  \@@_primitive:NN \ignoreligaturesinfont \tex_ignoreligaturesinfont:D
+  \@@_primitive:NN \insertht              \tex_insertht:D
+  \@@_primitive:NN \lastsavedboxresourceindex
+    \tex_pdflastxform:D
+  \@@_primitive:NN \lastsavedimageresourceindex
+    \tex_pdflastximage:D
+  \@@_primitive:NN \lastsavedimageresourcepages
+    \tex_pdflastximagepages:D
+  \@@_primitive:NN \lastxpos              \tex_lastxpos:D
+  \@@_primitive:NN \lastypos              \tex_lastypos:D
+  \@@_primitive:NN \normaldeviate         \tex_normaldeviate:D
+  \@@_primitive:NN \outputmode            \tex_pdfoutput:D
+  \@@_primitive:NN \pageheight            \tex_pageheight:D
+  \@@_primitive:NN \pagewidth             \tex_pagewith:D
+  \@@_primitive:NN \protrudechars         \tex_protrudechars:D
+  \@@_primitive:NN \pxdimen               \tex_pxdimen:D
+  \@@_primitive:NN \randomseed            \tex_randomseed:D
+  \@@_primitive:NN \useboxresource        \tex_pdfrefxform:D
+  \@@_primitive:NN \useimageresource      \tex_pdfrefximage:D
+  \@@_primitive:NN \savepos               \tex_savepos:D
+  \@@_primitive:NN \saveboxresource       \tex_pdfxform:D
+  \@@_primitive:NN \saveimageresource     \tex_pdfximage:D
+  \@@_primitive:NN \setrandomseed         \tex_setrandomseed:D
+  \@@_primitive:NN \tracingfonts          \tex_tracingfonts:D
+  \@@_primitive:NN \uniformdeviate        \tex_uniformdeviate:D
+%    \end{macrocode}
+% The set of Unicode math primitives were introduced by \XeTeX{} and \LuaTeX{}
+% in a somewhat complex fashion: a few first as |\XeTeX...| which were then
+% renamed with \LuaTeX{} having a lot more. These names now all start
+% |\U...| and mainly |\Umath...|.
+%    \begin{macrocode}
+  \@@_primitive:NN \Uchar                 \tex_Uchar:D
+  \@@_primitive:NN \Ucharcat              \tex_Ucharcat:D
+  \@@_primitive:NN \Udelcode              \tex_Udelcode:D
+  \@@_primitive:NN \Udelcodenum           \tex_Udelcodenum:D
+  \@@_primitive:NN \Udelimiter            \tex_Udelimiter:D
+  \@@_primitive:NN \Udelimiterover        \tex_Udelimiterover:D
+  \@@_primitive:NN \Udelimiterunder       \tex_Udelimiterunder:D
+  \@@_primitive:NN \Uhextensible          \tex_Uhextensible:D
+  \@@_primitive:NN \Umathaccent           \tex_Umathaccent:D
+  \@@_primitive:NN \Umathaxis             \tex_Umathaxis:D
+  \@@_primitive:NN \Umathbinbinspacing    \tex_Umathbinbinspacing:D
+  \@@_primitive:NN \Umathbinclosespacing  \tex_Umathbinclosespacing:D
+  \@@_primitive:NN \Umathbininnerspacing  \tex_Umathbininnerspacing:D
+  \@@_primitive:NN \Umathbinopenspacing   \tex_Umathbinopenspacing:D
+  \@@_primitive:NN \Umathbinopspacing     \tex_Umathbinopspacing:D
+  \@@_primitive:NN \Umathbinordspacing    \tex_Umathbinordspacing:D
+  \@@_primitive:NN \Umathbinpunctspacing  \tex_Umathbinpunctspacing:D
+  \@@_primitive:NN \Umathbinrelspacing    \tex_Umathbinrelspacing:D
+  \@@_primitive:NN \Umathchar             \tex_Umathchar:D
+  \@@_primitive:NN \Umathcharclass        \tex_Umathcharclass:D
+  \@@_primitive:NN \Umathchardef          \tex_Umathchardef:D
+  \@@_primitive:NN \Umathcharfam          \tex_Umathcharfam:D
+  \@@_primitive:NN \Umathcharnum          \tex_Umathcharnum:D
+  \@@_primitive:NN \Umathcharnumdef       \tex_Umathcharnumdef:D
+  \@@_primitive:NN \Umathcharslot         \tex_Umathcharslot:D
+  \@@_primitive:NN \Umathclosebinspacing  \tex_Umathclosebinspacing:D
+  \@@_primitive:NN \Umathcloseclosespacing
+    \tex_Umathcloseclosespacing:D
+  \@@_primitive:NN \Umathcloseinnerspacing
+    \tex_Umathcloseinnerspacing:D
+  \@@_primitive:NN \Umathcloseopenspacing \tex_Umathcloseopenspacing:D
+  \@@_primitive:NN \Umathcloseopspacing   \tex_Umathcloseopspacing:D
+  \@@_primitive:NN \Umathcloseordspacing  \tex_Umathcloseordspacing:D
+  \@@_primitive:NN \Umathclosepunctspacing
+    \tex_Umathclosepunctspacing:D
+  \@@_primitive:NN \Umathcloserelspacing  \tex_Umathcloserelspacing:D
+  \@@_primitive:NN \Umathcode             \tex_Umathcode:D
+  \@@_primitive:NN \Umathcodenum          \tex_Umathcodenum:D
+  \@@_primitive:NN \Umathconnectoroverlapmin
+    \tex_Umathconnectoroverlapmin:D
+  \@@_primitive:NN \Umathfractiondelsize  \tex_Umathfractiondelsize:D
+  \@@_primitive:NN \Umathfractiondenomdown
+    \tex_Umathfractiondenomdown:D
+  \@@_primitive:NN \Umathfractiondenomvgap
+    \tex_Umathfractiondenomvgap:D
+  \@@_primitive:NN \Umathfractionnumup    \tex_Umathfractionnumup:D
+  \@@_primitive:NN \Umathfractionnumvgap  \tex_Umathfractionnumvgap:D
+  \@@_primitive:NN \Umathfractionrule     \tex_Umathfractionrule:D
+  \@@_primitive:NN \Umathinnerbinspacing  \tex_Umathinnerbinspacing:D
+  \@@_primitive:NN \Umathinnerclosespacing
+    \tex_Umathinnerclosespacing:D
+  \@@_primitive:NN \Umathinnerinnerspacing
+    \tex_Umathinnerinnerspacing:D
+  \@@_primitive:NN \Umathinneropenspacing \tex_Umathinneropenspacing:D
+  \@@_primitive:NN \Umathinneropspacing   \tex_Umathinneropspacing:D
+  \@@_primitive:NN \Umathinnerordspacing  \tex_Umathinnerordspacing:D
+  \@@_primitive:NN \Umathinnerpunctspacing
+    \tex_Umathinnerpunctspacing:D
+  \@@_primitive:NN \Umathinnerrelspacing  \tex_Umathinnerrelspacing:D
+  \@@_primitive:NN \Umathlimitabovebgap   \tex_Umathlimitabovebgap:D
+  \@@_primitive:NN \Umathlimitabovekern   \tex_Umathlimitabovekern:D
+  \@@_primitive:NN \Umathlimitabovevgap   \tex_Umathlimitabovevgap:D
+  \@@_primitive:NN \Umathlimitbelowbgap   \tex_Umathlimitbelowbgap:D
+  \@@_primitive:NN \Umathlimitbelowkern   \tex_Umathlimitbelowkern:D
+  \@@_primitive:NN \Umathlimitbelowvgap   \tex_Umathlimitbelowvgap:D
+  \@@_primitive:NN \Umathnolimitsubfactor \tex_Umathnolimitsubfactor:D
+  \@@_primitive:NN \Umathnolimitsupfactor \tex_Umathnolimitsupfactor:D
+  \@@_primitive:NN \Umathopbinspacing     \tex_Umathopbinspacing:D
+  \@@_primitive:NN \Umathopclosespacing   \tex_Umathopclosespacing:D
+  \@@_primitive:NN \Umathopenbinspacing   \tex_Umathopenbinspacing:D
+  \@@_primitive:NN \Umathopenclosespacing \tex_Umathopenclosespacing:D
+  \@@_primitive:NN \Umathopeninnerspacing \tex_Umathopeninnerspacing:D
+  \@@_primitive:NN \Umathopenopenspacing  \tex_Umathopenopenspacing:D
+  \@@_primitive:NN \Umathopenopspacing    \tex_Umathopenopspacing:D
+  \@@_primitive:NN \Umathopenordspacing   \tex_Umathopenordspacing:D
+  \@@_primitive:NN \Umathopenpunctspacing \tex_Umathopenpunctspacing:D
+  \@@_primitive:NN \Umathopenrelspacing   \tex_Umathopenrelspacing:D
+  \@@_primitive:NN \Umathoperatorsize     \tex_Umathoperatorsize:D
+  \@@_primitive:NN \Umathopinnerspacing   \tex_Umathopinnerspacing:D
+  \@@_primitive:NN \Umathopopenspacing    \tex_Umathopopenspacing:D
+  \@@_primitive:NN \Umathopopspacing      \tex_Umathopopspacing:D
+  \@@_primitive:NN \Umathopordspacing     \tex_Umathopordspacing:D
+  \@@_primitive:NN \Umathoppunctspacing   \tex_Umathoppunctspacing:D
+  \@@_primitive:NN \Umathoprelspacing     \tex_Umathoprelspacing:D
+  \@@_primitive:NN \Umathordbinspacing    \tex_Umathordbinspacing:D
+  \@@_primitive:NN \Umathordclosespacing  \tex_Umathordclosespacing:D
+  \@@_primitive:NN \Umathordinnerspacing  \tex_Umathordinnerspacing:D
+  \@@_primitive:NN \Umathordopenspacing   \tex_Umathordopenspacing:D
+  \@@_primitive:NN \Umathordopspacing     \tex_Umathordopspacing:D
+  \@@_primitive:NN \Umathordordspacing    \tex_Umathordordspacing:D
+  \@@_primitive:NN \Umathordpunctspacing  \tex_Umathordpunctspacing:D
+  \@@_primitive:NN \Umathordrelspacing    \tex_Umathordrelspacing:D
+  \@@_primitive:NN \Umathoverbarkern      \tex_Umathoverbarkern:D
+  \@@_primitive:NN \Umathoverbarrule      \tex_Umathoverbarrule:D
+  \@@_primitive:NN \Umathoverbarvgap      \tex_Umathoverbarvgap:D
+  \@@_primitive:NN \Umathoverdelimiterbgap
+     \tex_Umathoverdelimiterbgap:D
+  \@@_primitive:NN \Umathoverdelimitervgap
+    \tex_Umathoverdelimitervgap:D
+  \@@_primitive:NN \Umathpunctbinspacing  \tex_Umathpunctbinspacing:D
+  \@@_primitive:NN \Umathpunctclosespacing
+    \tex_Umathpunctclosespacing:D
+  \@@_primitive:NN \Umathpunctinnerspacing
+    \tex_Umathpunctinnerspacing:D
+  \@@_primitive:NN \Umathpunctopenspacing \tex_Umathpunctopenspacing:D
+  \@@_primitive:NN \Umathpunctopspacing   \tex_Umathpunctopspacing:D
+  \@@_primitive:NN \Umathpunctordspacing  \tex_Umathpunctordspacing:D
+  \@@_primitive:NN \Umathpunctpunctspacing
+    \tex_Umathpunctpunctspacing:D
+  \@@_primitive:NN \Umathpunctrelspacing  \tex_Umathpunctrelspacing:D
+  \@@_primitive:NN \Umathquad             \tex_Umathquad:D
+  \@@_primitive:NN \Umathradicaldegreeafter
+    \tex_Umathradicaldegreeafter:D
+  \@@_primitive:NN \Umathradicaldegreebefore
+    \tex_Umathradicaldegreebefore:D
+  \@@_primitive:NN \Umathradicaldegreeraise
+    \tex_Umathradicaldegreeraise:D
+  \@@_primitive:NN \Umathradicalkern      \tex_Umathradicalkern:D
+  \@@_primitive:NN \Umathradicalrule      \tex_Umathradicalrule:D
+  \@@_primitive:NN \Umathradicalvgap      \tex_Umathradicalvgap:D
+  \@@_primitive:NN \Umathrelbinspacing    \tex_Umathrelbinspacing:D
+  \@@_primitive:NN \Umathrelclosespacing  \tex_Umathrelclosespacing:D
+  \@@_primitive:NN \Umathrelinnerspacing  \tex_Umathrelinnerspacing:D
+  \@@_primitive:NN \Umathrelopenspacing   \tex_Umathrelopenspacing:D
+  \@@_primitive:NN \Umathrelopspacing     \tex_Umathrelopspacing:D
+  \@@_primitive:NN \Umathrelordspacing    \tex_Umathrelordspacing:D
+  \@@_primitive:NN \Umathrelpunctspacing  \tex_Umathrelpunctspacing:D
+  \@@_primitive:NN \Umathrelrelspacing    \tex_Umathrelrelspacing:D
+  \@@_primitive:NN \Umathskewedfractionhgap
+    \tex_Umathskewedfractionhgap:D
+  \@@_primitive:NN \Umathskewedfractionvgap
+    \tex_Umathskewedfractionvgap:D
+  \@@_primitive:NN \Umathspaceafterscript \tex_Umathspaceafterscript:D
+  \@@_primitive:NN \Umathstackdenomdown   \tex_Umathstackdenomdown:D
+  \@@_primitive:NN \Umathstacknumup       \tex_Umathstacknumup:D
+  \@@_primitive:NN \Umathstackvgap        \tex_Umathstackvgap:D
+  \@@_primitive:NN \Umathsubshiftdown     \tex_Umathsubshiftdown:D
+  \@@_primitive:NN \Umathsubshiftdrop     \tex_Umathsubshiftdrop:D
+  \@@_primitive:NN \Umathsubsupshiftdown  \tex_Umathsubsupshiftdown:D
+  \@@_primitive:NN \Umathsubsupvgap       \tex_Umathsubsupvgap:D
+  \@@_primitive:NN \Umathsubtopmax        \tex_Umathsubtopmax:D
+  \@@_primitive:NN \Umathsupbottommin     \tex_Umathsupbottommin:D
+  \@@_primitive:NN \Umathsupshiftdrop     \tex_Umathsupshiftdrop:D
+  \@@_primitive:NN \Umathsupshiftup       \tex_Umathsupshiftup:D
+  \@@_primitive:NN \Umathsupsubbottommax  \tex_Umathsupsubbottommax:D
+  \@@_primitive:NN \Umathunderbarkern     \tex_Umathunderbarkern:D
+  \@@_primitive:NN \Umathunderbarrule     \tex_Umathunderbarrule:D
+  \@@_primitive:NN \Umathunderbarvgap     \tex_Umathunderbarvgap:D
+  \@@_primitive:NN \Umathunderdelimiterbgap
+    \tex_Umathunderdelimiterbgap:D
+  \@@_primitive:NN \Umathunderdelimitervgap
+    \tex_Umathunderdelimitervgap:D
+  \@@_primitive:NN \Unosubscript          \tex_Unosubscript:D
+  \@@_primitive:NN \Unosuperscript        \tex_Unosuperscript:D
+  \@@_primitive:NN \Uoverdelimiter        \tex_Uoverdelimiter:D
+  \@@_primitive:NN \Uradical              \tex_Uradical:D
+  \@@_primitive:NN \Uroot                 \tex_Uroot:D
+  \@@_primitive:NN \Uskewed               \tex_Uskewed:D
+  \@@_primitive:NN \Uskewedwithdelims     \tex_Uskewedwithdelims:D
+  \@@_primitive:NN \Ustack                \tex_Ustack:D
+  \@@_primitive:NN \Ustartdisplaymath     \tex_Ustartdisplaymath:D
+  \@@_primitive:NN \Ustartmath            \tex_Ustartmath:D
+  \@@_primitive:NN \Ustopdisplaymath      \tex_Ustopdisplaymath:D
+  \@@_primitive:NN \Ustopmath             \tex_Ustopmath:D
+  \@@_primitive:NN \Usubscript            \tex_Usubscript:D
+  \@@_primitive:NN \Usuperscript          \tex_Usuperscript:D
+  \@@_primitive:NN \Uunderdelimiter       \tex_Uunderdelimiter:D
+  \@@_primitive:NN \Uvextensible          \tex_Uvextensible:D
+%    \end{macrocode}
+% Primitives from \pTeX{}.
+%    \begin{macrocode}
+  \@@_primitive:NN \autospacing           \tex_autospacing:D
+  \@@_primitive:NN \autoxspacing          \tex_autoxspacing:D
+  \@@_primitive:NN \dtou                  \tex_dtou:D
+  \@@_primitive:NN \epTeXinputencoding    \tex_epTeXinputencoding:D
+  \@@_primitive:NN \epTeXversion          \tex_epTeXversion:D
+  \@@_primitive:NN \euc                   \tex_euc:D
+  \@@_primitive:NN \ifdbox                \tex_ifdbox:D
+  \@@_primitive:NN \ifddir                \tex_ifddir:D
+  \@@_primitive:NN \ifmdir                \tex_ifmdir:D
+  \@@_primitive:NN \iftbox                \tex_iftbox:D
+  \@@_primitive:NN \iftdir                \tex_iftdir:D
+  \@@_primitive:NN \ifybox                \tex_ifybox:D
+  \@@_primitive:NN \ifydir                \tex_ifydir:D
+  \@@_primitive:NN \inhibitglue           \tex_inhibitglue:D
+  \@@_primitive:NN \inhibitxspcode        \tex_inhibitxspcode:D
+  \@@_primitive:NN \jcharwidowpenalty     \tex_jcharwidowpenalty:D
+  \@@_primitive:NN \jfam                  \tex_jfam:D
+  \@@_primitive:NN \jfont                 \tex_jfont:D
+  \@@_primitive:NN \jis                   \tex_jis:D
+  \@@_primitive:NN \kanjiskip             \tex_kanjiskip:D
+  \@@_primitive:NN \kansuji               \tex_kansuji:D
+  \@@_primitive:NN \kansujichar           \tex_kansujichar:D
+  \@@_primitive:NN \kcatcode              \tex_kcatcode:D
+  \@@_primitive:NN \kuten                 \tex_kuten:D
+  \@@_primitive:NN \noautospacing         \tex_noautospacing:D
+  \@@_primitive:NN \noautoxspacing        \tex_noautoxspacing:D
+  \@@_primitive:NN \postbreakpenalty      \tex_postbreakpenalty:D
+  \@@_primitive:NN \prebreakpenalty       \tex_prebreakpenalty:D
+  \@@_primitive:NN \ptexminorversion      \tex_ptexminorversion:D
+  \@@_primitive:NN \ptexrevision          \tex_ptexrevision:D
+  \@@_primitive:NN \ptexversion           \tex_ptexversion:D
+  \@@_primitive:NN \showmode              \tex_showmode:D
+  \@@_primitive:NN \sjis                  \tex_sjis:D
+  \@@_primitive:NN \tate                  \tex_tate:D
+  \@@_primitive:NN \tbaselineshift        \tex_tbaselineshift:D
+  \@@_primitive:NN \tfont                 \tex_tfont:D
+  \@@_primitive:NN \xkanjiskip            \tex_xkanjiskip:D
+  \@@_primitive:NN \xspcode               \tex_xspcode:D
+  \@@_primitive:NN \ybaselineshift        \tex_ybaselineshift:D
+  \@@_primitive:NN \yoko                  \tex_yoko:D
+%    \end{macrocode}
+% Primitives from \upTeX{}.
+%    \begin{macrocode}
+  \@@_primitive:NN \disablecjktoken       \tex_disablecjktoken:D
+  \@@_primitive:NN \enablecjktoken        \tex_enablecjktoken:D
+  \@@_primitive:NN \forcecjktoken         \tex_forcecjktoken:D
+  \@@_primitive:NN \kchar                 \tex_kchar:D
+  \@@_primitive:NN \kchardef              \tex_kchardef:D
+  \@@_primitive:NN \kuten                 \tex_kuten:D
+  \@@_primitive:NN \ucs                   \tex_ucs:D
+  \@@_primitive:NN \uptexrevision         \tex_uptexrevision:D
+  \@@_primitive:NN \uptexversion          \tex_uptexversion:D
+%    \end{macrocode}
+% End of the \enquote{just the names} part of the source.
+%    \begin{macrocode}
+%</initex|names|package>
+%<*initex|package>
+%    \end{macrocode}
+%
+% The job is done: close the group (using the primitive renamed!).
+%    \begin{macrocode}
+\tex_endgroup:D
+%    \end{macrocode}
+%
+% \LaTeXe{} moves a few primitives, so these are sorted out.
+% A convenient test for \LaTeXe{} is the \cs{@@@@end} saved primitive.
+%    \begin{macrocode}
+%<*package>
+\tex_ifdefined:D \@@@@end
+  \tex_let:D \tex_end:D                  \@@@@end
+  \tex_let:D \tex_everydisplay:D         \frozen at everydisplay
+  \tex_let:D \tex_everymath:D            \frozen at 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
+%    \end{macrocode}
+% The \tn{shipout} primitive is particularly tricky as a number of packages
+% want to hook in here. First, we see if a sufficiently-new kernel has saved
+% a copy: if it has, just use that. Otherwise, we need to check each of the
+% possible packages/classes that might move it: here, we are looking for those
+% which do \emph{not} delay action to the \tn{AtBeginDocument} hook. (We
+% cannot use \tn{primitive} as that doesn't
+% allow us to make a direct copy of the primitive \emph{itself}.) As we know
+% that \LaTeXe{} is in use, we use it's \tn{@tfor} loop here.
+%    \begin{macrocode}
+  \tex_ifdefined:D \@@@@shipout
+    \tex_let:D \tex_shipout:D \@@@@shipout
+  \tex_fi:D
+  \tex_begingroup:D
+    \tex_edef:D \l_tmpa_tl { \tex_string:D \shipout }
+    \tex_edef:D \l_tmpb_tl { \tex_meaning:D \shipout }
+    \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
+    \tex_else:D
+      \tex_expandafter:D \@tfor \tex_expandafter:D \@tempa \tex_string:D :=
+        \CROP at shipout
+        \dup at shipout
+        \GPTorg at shipout
+        \LL at shipout
+        \mem at oldshipout
+        \opem at shipout
+        \pgfpages at originalshipout
+        \pr at shipout
+        \Shipout
+        \verso at orig@shipout
+        \do
+          {
+            \tex_edef:D \l_tmpb_tl
+              { \tex_expandafter:D \tex_meaning:D \@tempa }
+            \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
+              \tex_global:D \tex_expandafter:D \tex_let:D
+                \tex_expandafter:D \tex_shipout:D \@tempa
+            \tex_fi:D
+          }
+    \tex_fi:D
+  \tex_endgroup:D
+%    \end{macrocode}
+% Some tidying up is needed for \tn[index=tracingfonts]{(pdf)tracingfonts}.
+% Newer \LuaTeX{} has
+% this simply as \tn{tracingfonts}, but that is overwritten by
+% the \LaTeXe{} kernel. So any spurious definition has to be removed, then
+% the real version saved either from the \pdfTeX{} name or from \LuaTeX{}.
+% In the latter case, we leave \tn{@@tracingfonts} available: this might
+% be useful and almost all \LaTeXe{} users will have \pkg{expl3} loaded by
+% \pkg{fontspec}. (We follow the usual kernel convention that |@@| is used
+% for saved primitives.)
+%   \begin{macrocode}
+  \tex_let:D \tex_tracingfonts:D \tex_undefined:D
+  \tex_ifdefined:D \pdftracingfonts
+    \tex_let:D \tex_tracingfonts:D \pdftracingfonts
+  \tex_else:D
+    \tex_ifdefined:D \tex_directlua:D
+      \tex_directlua:D { tex.enableprimitives("@@@@", {"tracingfonts"}) }
+      \tex_let:D \tex_tracingfonts:D \luatextracingfonts
+    \tex_fi:D
+  \tex_fi:D
+\tex_fi:D
+%    \end{macrocode}
+% That is also true for the \LuaTeX{} primitives under \LaTeXe{}
+% (depending on the format-building date). There are a few primitives
+% that get the right names anyway so are missing here!
+%    \begin{macrocode}
+\tex_ifdefined:D \luatexsuppressfontnotfounderror
+  \tex_let:D \tex_alignmark:D           \luatexalignmark
+  \tex_let:D \tex_aligntab:D            \luatexaligntab
+  \tex_let:D \tex_attribute:D           \luatexattribute
+  \tex_let:D \tex_attributedef:D        \luatexattributedef
+  \tex_let:D \tex_catcodetable:D        \luatexcatcodetable
+  \tex_let:D \tex_clearmarks:D          \luatexclearmarks
+  \tex_let:D \tex_crampeddisplaystyle:D \luatexcrampeddisplaystyle
+  \tex_let:D \tex_crampedscriptscriptstyle:D
+    \luatexcrampedscriptscriptstyle
+  \tex_let:D \tex_crampedscriptstyle:D  \luatexcrampedscriptstyle
+  \tex_let:D \tex_crampedtextstyle:D    \luatexcrampedtextstyle
+  \tex_let:D \tex_fontid:D              \luatexfontid
+  \tex_let:D \tex_formatname:D          \luatexformatname
+  \tex_let:D \tex_gleaders:D            \luatexgleaders
+  \tex_let:D \tex_initcatcodetable:D    \luatexinitcatcodetable
+  \tex_let:D \tex_latelua:D             \luatexlatelua
+  \tex_let:D \tex_luaescapestring:D     \luatexluaescapestring
+  \tex_let:D \tex_luafunction:D         \luatexluafunction
+  \tex_let:D \tex_mathstyle:D           \luatexmathstyle
+  \tex_let:D \tex_nokerns:D             \luatexnokerns
+  \tex_let:D \tex_noligs:D              \luatexnoligs
+  \tex_let:D \tex_outputbox:D           \luatexoutputbox
+  \tex_let:D \tex_pageleftoffset:D      \luatexpageleftoffset
+  \tex_let:D \tex_pagetopoffset:D       \luatexpagetopoffset
+  \tex_let:D \tex_postexhyphenchar:D    \luatexpostexhyphenchar
+  \tex_let:D \tex_posthyphenchar:D      \luatexposthyphenchar
+  \tex_let:D \tex_preexhyphenchar:D     \luatexpreexhyphenchar
+  \tex_let:D \tex_prehyphenchar:D       \luatexprehyphenchar
+  \tex_let:D \tex_savecatcodetable:D    \luatexsavecatcodetable
+  \tex_let:D \tex_scantextokens:D       \luatexscantextokens
+  \tex_let:D \tex_suppressifcsnameerror:D
+    \luatexsuppressifcsnameerror
+  \tex_let:D \tex_suppresslongerror:D   \luatexsuppresslongerror
+  \tex_let:D \tex_suppressmathparerror:D
+    \luatexsuppressmathparerror
+  \tex_let:D \tex_suppressoutererror:D  \luatexsuppressoutererror
+  \tex_let:D \tex_Uchar:D                  \luatexUchar
+  \tex_let:D \tex_suppressfontnotfounderror:D
+    \luatexsuppressfontnotfounderror
+%    \end{macrocode}
+% Which also covers those slightly odd ones.
+%    \begin{macrocode}
+  \tex_let:D \tex_bodydir:D             \luatexbodydir
+  \tex_let:D \tex_boxdir:D              \luatexboxdir
+  \tex_let:D \tex_leftghost:D           \luatexleftghost
+  \tex_let:D \tex_localbrokenpenalty:D  \luatexlocalbrokenpenalty
+  \tex_let:D \tex_localinterlinepenalty:D
+    \luatexlocalinterlinepenalty
+  \tex_let:D \tex_localleftbox:D        \luatexlocalleftbox
+  \tex_let:D \tex_localrightbox:D       \luatexlocalrightbox
+  \tex_let:D \tex_mathdir:D             \luatexmathdir
+  \tex_let:D \tex_pagebottomoffset:D    \luatexpagebottomoffset
+  \tex_let:D \tex_pagedir:D             \luatexpagedir
+  \tex_let:D \tex_pageheight:D             \luatexpageheight
+  \tex_let:D \tex_pagerightoffset:D     \luatexpagerightoffset
+  \tex_let:D \tex_pagewidth:D              \luatexpagewidth
+  \tex_let:D \tex_pardir:D              \luatexpardir
+  \tex_let:D \tex_rightghost:D          \luatexrightghost
+  \tex_let:D \tex_textdir:D             \luatextextdir
+\tex_fi:D
+%    \end{macrocode}
+% Only \pdfTeX{} and \LuaTeX{} define \tn{pdfmapfile} and \tn{pdfmapline}:
+% Tidy up the fact that some format-building processes leave
+% a couple of questionable decisions about that!
+%    \begin{macrocode}
+\tex_ifnum:D 0
+  \tex_ifdefined:D \tex_pdftexversion:D 1 \tex_fi:D
+  \tex_ifdefined:D \tex_luatexversion:D 1 \tex_fi:D
+    = 0 %
+  \tex_let:D \tex_mapfile:D \tex_undefined:D
+  \tex_let:D \tex_mapline:D \tex_undefined:D
+\tex_fi:D
+%</package>
+%    \end{macrocode}
+% Up to v0.80, \LuaTeX{} defines the \pdfTeX{} version data: rather
+% confusing. Removing them means that \cs{tex_pdftexversion:D} is
+% a marker for \pdfTeX{} alone: useful in engine-dependent code later.
+%    \begin{macrocode}
+%<*initex|package>
+\tex_ifdefined:D \tex_luatexversion:D
+  \tex_let:D \tex_pdftexbanner:D   \tex_undefined:D
+  \tex_let:D \tex_pdftexrevision:D \tex_undefined:D
+  \tex_let:D \tex_pdftexversion:D  \tex_undefined:D
+\tex_fi:D
+%</initex|package>
+%    \end{macrocode}
+%
+% For \ConTeXt{}, two tests are needed. Both Mark~II and Mark~IV move several
+% primitives: these are all covered by the first test, again using \cs{end}
+% as a marker. For Mark~IV, a few more primitives are moved: they are
+% implemented using some Lua code in the current \ConTeXt{}.
+%    \begin{macrocode}
+%<*package>
+\tex_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 \tex_unexpanded:D  \normalunexpanded
+  \tex_let:D \tex_expanded:D    \normalexpanded
+\tex_fi:D
+\tex_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 \tex_showtokens:D       \normalshowtokens
+  \tex_let:D \tex_bodydir:D          \spac_directions_normal_body_dir
+  \tex_let:D \tex_pagedir:D          \spac_directions_normal_page_dir
+\tex_fi:D
+\tex_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
+%</package>
+%    \end{macrocode}
+%
+% \subsection{Deprecated functions}
+%
+% Older versions of \pkg{expl3} divided up primitives by \enquote{source}: that
+% becomes very tricky with multiple parallel engine developments, so has been
+% dropped. To cover the transition, we provide the older names here for a
+% limited period (until the end of 2019).
+%
+% To allow \cs{debug_on:n} \Arg{deprecation} to work we save the list of
+% primitives into \cs{@@_primitives:}
+%    \begin{macrocode}
+%<*package>
+\tex_begingroup: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 \@@_primitive:NN #1#2
+    {
+      \tex_ifdefined:D #1
+        \tex_expandafter:D \use_ii:nn
+      \tex_fi:D
+        \use_none:n { \tex_global:D \tex_let:D #2 #1 }
+    }
+  \tex_xdef:D \@@_primitives:
+    {
+      \tex_unexpanded:D
+        {
   \@@_primitive:NN \beginL                \etex_beginL:D
   \@@_primitive:NN \beginR                \etex_beginR:D
   \@@_primitive:NN \botmarks              \etex_botmarks:D
@@ -536,16 +1444,6 @@
   \@@_primitive:NN \unexpanded            \etex_unexpanded:D
   \@@_primitive:NN \unless                \etex_unless:D
   \@@_primitive:NN \widowpenalties        \etex_widowpenalties:D
-%    \end{macrocode}
-% The newer primitives are more complex: there are an awful lot of them,
-% and we don't use them all at the moment. So the following is selective,
-% based on those also available in \LuaTeX{} or used in \pkg{expl3}.
-% In the case of the \pdfTeX{} primitives, we retain |pdf| at the start
-% of the names \emph{only} for directly PDF-related primitives, as
-% there are a lot of \pdfTeX{} primitives that start \cs[no-index]{pdf\ldots} but
-% are not related to PDF output. These ones related to PDF output or only
-% work in PDF mode.
-%    \begin{macrocode}
   \@@_primitive:NN \pdfannot              \pdftex_pdfannot:D
   \@@_primitive:NN \pdfcatalog            \pdftex_pdfcatalog:D
   \@@_primitive:NN \pdfcompresslevel      \pdftex_pdfcompresslevel:D
@@ -575,7 +1473,7 @@
     \pdftex_pdfinclusionerrorlevel:D
   \@@_primitive:NN \pdfinfo               \pdftex_pdfinfo:D
   \@@_primitive:NN \pdflastannot          \pdftex_pdflastannot:D
-  \@@_primitive:NN \pdflastlink           \pfdftex_pdflastlink:D
+  \@@_primitive:NN \pdflastlink           \pdftex_pdflastlink:D
   \@@_primitive:NN \pdflastobj            \pdftex_pdflastobj:D
   \@@_primitive:NN \pdflastxform          \pdftex_pdflastxform:D
   \@@_primitive:NN \pdflastximage         \pdftex_pdflastximage:D
@@ -618,9 +1516,6 @@
   \@@_primitive:NN \pdfxformresources     \pdftex_pdfxformresources:D
   \@@_primitive:NN \pdfximage             \pdftex_pdfximage:D
   \@@_primitive:NN \pdfximagebbox         \pdftex_pdfximagebbox:D
-%    \end{macrocode}
-% While these are not.
-%    \begin{macrocode}
   \@@_primitive:NN \ifpdfabsdim           \pdftex_ifabsdim:D
   \@@_primitive:NN \ifpdfabsnum           \pdftex_ifabsnum:D
   \@@_primitive:NN \ifpdfprimitive        \pdftex_ifprimitive:D
@@ -631,7 +1526,7 @@
   \@@_primitive:NN \pdfeachlineheight     \pdftex_eachlineheight:D
   \@@_primitive:NN \pdffilemoddate        \pdftex_filemoddate:D
   \@@_primitive:NN \pdffilesize           \pdftex_filesize:D
-  \@@_primitive:NN \pdffirstlineheigh     \pdftex_firstlineheight:D
+  \@@_primitive:NN \pdffirstlineheight    \pdftex_firstlineheight:D
   \@@_primitive:NN \pdffontexpand         \pdftex_fontexpand:D
   \@@_primitive:NN \pdffontsize           \pdftex_fontsize:D
   \@@_primitive:NN \pdfignoreddimen       \pdftex_ignoreddimen:D
@@ -658,17 +1553,9 @@
   \@@_primitive:NN \pdfshellescape        \pdftex_shellescape:D
   \@@_primitive:NN \pdftracingfonts       \pdftex_tracingfonts:D
   \@@_primitive:NN \pdfuniformdeviate     \pdftex_uniformdeviate:D
-%    \end{macrocode}
-% The version primitives are not related to PDF mode but are related to
-% \pdfTeX{} so retain the full prefix.
-%    \begin{macrocode}
   \@@_primitive:NN \pdftexbanner          \pdftex_pdftexbanner:D
   \@@_primitive:NN \pdftexrevision        \pdftex_pdftexrevision:D
   \@@_primitive:NN \pdftexversion         \pdftex_pdftexversion:D
-%    \end{macrocode}
-% These ones appear in \pdfTeX{} but don't have |pdf| in the name at all.
-% (\tn{synctex} is odd as it's really not from \pdfTeX{} but from SyncTeX!)
-%    \begin{macrocode}
   \@@_primitive:NN \efcode                \pdftex_efcode:D
   \@@_primitive:NN \ifincsname            \pdftex_ifincsname:D
   \@@_primitive:NN \leftmarginkern        \pdftex_leftmarginkern:D
@@ -679,35 +1566,42 @@
   \@@_primitive:NN \rpcode                \pdftex_rpcode:D
   \@@_primitive:NN \synctex               \pdftex_synctex:D
   \@@_primitive:NN \tagcode               \pdftex_tagcode:D
-%    \end{macrocode}
-% Post \pdfTeX{} primitive availability gets more complex. Both \XeTeX{} and
-% \LuaTeX{} have varying names for some primitives from \pdfTeX{}. Particularly
-% for \LuaTeX{} tracking all of that would be hard. Instead, we now check that
-% we only save primitives if they actually exist.
-%    \begin{macrocode}
-%</initex|names|package>
-%<*initex|package>
-  \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 \@@_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 }
-%<*initex>
-      \tex_global:D \tex_let:D #1 \tex_undefined:D
-%</initex>
-    }
-%</initex|package>
-%<*initex|names|package>
-%    \end{macrocode}
-% \XeTeX{}-specific primitives. Note that \XeTeX{}'s \tn{strcmp} is
-% handled earlier and is \enquote{rolled up} into \tn{pdfstrcmp}. With
-% the exception of the version primitives these don't carry |XeTeX| through
-% into the \enquote{base} name. A few cross-compatibility names which lack
-% the |pdf| of the original are handled later.
-%    \begin{macrocode}
+  \@@_primitive:NN \mdfivesum             \pdftex_mdfivesum:D
+  \@@_primitive:NN \ifprimitive           \pdftex_ifprimitive:D
+  \@@_primitive:NN \primitive             \pdftex_primitive:D
+  \@@_primitive:NN \shellescape           \pdftex_shellescape:D
+  \@@_primitive:NN \adjustspacing         \pdftex_adjustspacing:D
+  \@@_primitive:NN \copyfont              \pdftex_copyfont:D
+  \@@_primitive:NN \draftmode             \pdftex_draftmode:D
+  \@@_primitive:NN \expandglyphsinfont    \pdftex_fontexpand:D
+  \@@_primitive:NN \ifabsdim              \pdftex_ifabsdim:D
+  \@@_primitive:NN \ifabsnum              \pdftex_ifabsnum:D
+  \@@_primitive:NN \ignoreligaturesinfont
+    \pdftex_ignoreligaturesinfont:D
+  \@@_primitive:NN \insertht              \pdftex_insertht:D
+  \@@_primitive:NN \lastsavedboxresourceindex
+    \pdftex_pdflastxform:D
+  \@@_primitive:NN \lastsavedimageresourceindex
+    \pdftex_pdflastximage:D
+  \@@_primitive:NN \lastsavedimageresourcepages
+    \pdftex_pdflastximagepages:D
+  \@@_primitive:NN \lastxpos              \pdftex_lastxpos:D
+  \@@_primitive:NN \lastypos              \pdftex_lastypos:D
+  \@@_primitive:NN \normaldeviate         \pdftex_normaldeviate:D
+  \@@_primitive:NN \outputmode            \pdftex_pdfoutput:D
+  \@@_primitive:NN \pageheight            \pdftex_pageheight:D
+  \@@_primitive:NN \pagewidth             \pdftex_pagewith:D
+  \@@_primitive:NN \protrudechars         \pdftex_protrudechars:D
+  \@@_primitive:NN \pxdimen               \pdftex_pxdimen:D
+  \@@_primitive:NN \randomseed            \pdftex_randomseed:D
+  \@@_primitive:NN \useboxresource        \pdftex_pdfrefxform:D
+  \@@_primitive:NN \useimageresource      \pdftex_pdfrefximage:D
+  \@@_primitive:NN \savepos               \pdftex_savepos:D
+  \@@_primitive:NN \saveboxresource       \pdftex_pdfxform:D
+  \@@_primitive:NN \saveimageresource     \pdftex_pdfximage:D
+  \@@_primitive:NN \setrandomseed         \pdftex_setrandomseed:D
+  \@@_primitive:NN \tracingfonts          \pdftex_tracingfonts:D
+  \@@_primitive:NN \uniformdeviate        \pdftex_uniformdeviate:D
   \@@_primitive:NN \suppressfontnotfounderror
     \xetex_suppressfontnotfounderror:D
   \@@_primitive:NN \XeTeXcharclass        \xetex_charclass:D
@@ -766,24 +1660,8 @@
   \@@_primitive:NN \XeTeXvariationmax     \xetex_variationmax:D
   \@@_primitive:NN \XeTeXvariationmin     \xetex_variationmin:D
   \@@_primitive:NN \XeTeXvariationname    \xetex_variationname:D
-%    \end{macrocode}
-%   The version primitives retain |XeTeX|.
-%    \begin{macrocode}
   \@@_primitive:NN \XeTeXrevision         \xetex_XeTeXrevision:D
   \@@_primitive:NN \XeTeXversion          \xetex_XeTeXversion:D
-%    \end{macrocode}
-% Primitives from \pdfTeX{} that \XeTeX{} renames: also helps with
-% \LuaTeX{}.
-%    \begin{macrocode}
-  \@@_primitive:NN \mdfivesum             \pdftex_mdfivesum:D
-  \@@_primitive:NN \ifprimitive           \pdftex_ifprimitive:D
-  \@@_primitive:NN \primitive             \pdftex_primitive:D
-  \@@_primitive:NN \shellescape           \pdftex_shellescape:D
-%    \end{macrocode}
-% Primitives from \LuaTeX{}, some of which have been ported back to
-% \XeTeX{}. Notice that \tn{expanded} was intended for \pdfTeX{}~1.50 but
-% as that was not released we call this a \LuaTeX{} primitive.
-%    \begin{macrocode}
   \@@_primitive:NN \alignmark             \luatex_alignmark:D
   \@@_primitive:NN \aligntab              \luatex_aligntab:D
   \@@_primitive:NN \attribute             \luatex_attribute:D
@@ -883,12 +1761,6 @@
   \@@_primitive:NN \tokspre               \luatex_tokspre:D
   \@@_primitive:NN \tpack                 \luatex_tpack:D
   \@@_primitive:NN \vpack                 \luatex_vpack:D
-%    \end{macrocode}
-% Slightly more awkward are the directional primitives in \LuaTeX{}. These
-% come from Omega/Aleph, but we do not support those engines and
-% so it seems most sensible to treat them as \LuaTeX{} primitives for prefix
-% purposes. One here is \enquote{new} but fits into the general set.
-%    \begin{macrocode}
   \@@_primitive:NN \bodydir               \luatex_bodydir:D
   \@@_primitive:NN \boxdir                \luatex_boxdir:D
   \@@_primitive:NN \leftghost             \luatex_leftghost:D
@@ -903,50 +1775,6 @@
   \@@_primitive:NN \pardir                \luatex_pardir:D
   \@@_primitive:NN \rightghost            \luatex_rightghost:D
   \@@_primitive:NN \textdir               \luatex_textdir:D
-%    \end{macrocode}
-% Primitives from \pdfTeX{} that \LuaTeX{} renames.
-%    \begin{macrocode}
-  \@@_primitive:NN \adjustspacing         \pdftex_adjustspacing:D
-  \@@_primitive:NN \copyfont              \pdftex_copyfont:D
-  \@@_primitive:NN \draftmode             \pdftex_draftmode:D
-  \@@_primitive:NN \expandglyphsinfont    \pdftex_fontexpand:D
-  \@@_primitive:NN \ifabsdim              \pdftex_ifabsdim:D
-  \@@_primitive:NN \ifabsnum              \pdftex_ifabsnum:D
-  \@@_primitive:NN \ignoreligaturesinfont
-    \pdftex_ignoreligaturesinfont:D
-  \@@_primitive:NN \insertht              \pdftex_insertht:D
-  \@@_primitive:NN \lastsavedboxresourceindex
-    \pdftex_pdflastxform:D
-  \@@_primitive:NN \lastsavedimageresourceindex
-    \pdftex_pdflastximage:D
-  \@@_primitive:NN \lastsavedimageresourcepages
-    \pdftex_pdflastximagepages:D
-  \@@_primitive:NN \lastxpos              \pdftex_lastxpos:D
-  \@@_primitive:NN \lastypos              \pdftex_lastypos:D
-  \@@_primitive:NN \normaldeviate         \pdftex_normaldeviate:D
-  \@@_primitive:NN \outputmode            \pdftex_pdfoutput:D
-  \@@_primitive:NN \pageheight            \pdftex_pageheight:D
-  \@@_primitive:NN \pagewidth             \pdftex_pagewith:D
-  \@@_primitive:NN \protrudechars         \pdftex_protrudechars:D
-  \@@_primitive:NN \pxdimen               \pdftex_pxdimen:D
-  \@@_primitive:NN \randomseed            \pdftex_randomseed:D
-  \@@_primitive:NN \useboxresource        \pdftex_pdfrefxform:D
-  \@@_primitive:NN \useimageresource      \pdftex_pdfrefximage:D
-  \@@_primitive:NN \savepos               \pdftex_savepos:D
-  \@@_primitive:NN \saveboxresource       \pdftex_pdfxform:D
-  \@@_primitive:NN \saveimageresource     \pdftex_pdfximage:D
-  \@@_primitive:NN \setrandomseed         \pdftex_setrandomseed:D
-  \@@_primitive:NN \tracingfonts          \pdftex_tracingfonts:D
-  \@@_primitive:NN \uniformdeviate        \pdftex_uniformdeviate:D
-%    \end{macrocode}
-% The set of Unicode math primitives were introduced by \XeTeX{} and \LuaTeX{}
-% in a somewhat complex fashion: a few first as |\XeTeX...| which were then
-% renamed with \LuaTeX{} having a lot more. These names now all start
-% |\U...| and mainly |\Umath...|. To keep things somewhat clear we therefore
-% prefix all of these as |\utex...| (introduced by a Unicode \TeX{} engine)
-% and drop |\U(math)| from the names. Where there is a related \TeX{}90
-% primitive or where it really seems required we keep the |math| part of the name.
-%    \begin{macrocode}
   \@@_primitive:NN \Uchar                 \utex_char:D
   \@@_primitive:NN \Ucharcat              \utex_charcat:D
   \@@_primitive:NN \Udelcode              \utex_delcode:D
@@ -1114,9 +1942,6 @@
   \@@_primitive:NN \Usuperscript          \utex_superscript:D
   \@@_primitive:NN \Uunderdelimiter       \utex_underdelimiter:D
   \@@_primitive:NN \Uvextensible          \utex_vextensible:D
-%    \end{macrocode}
-% Primitives from \pTeX{}.
-%    \begin{macrocode}
   \@@_primitive:NN \autospacing           \ptex_autospacing:D
   \@@_primitive:NN \autoxspacing          \ptex_autoxspacing:D
   \@@_primitive:NN \dtou                  \ptex_dtou:D
@@ -1145,6 +1970,8 @@
   \@@_primitive:NN \noautoxspacing        \ptex_noautoxspacing:D
   \@@_primitive:NN \postbreakpenalty      \ptex_postbreakpenalty:D
   \@@_primitive:NN \prebreakpenalty       \ptex_prebreakpenalty:D
+  \@@_primitive:NN \ptexminorversion      \ptex_ptexminorversion:D
+  \@@_primitive:NN \ptexrevision          \ptex_ptexrevision:D
   \@@_primitive:NN \ptexversion           \ptex_ptexversion:D
   \@@_primitive:NN \showmode              \ptex_showmode:D
   \@@_primitive:NN \sjis                  \ptex_sjis:D
@@ -1155,9 +1982,6 @@
   \@@_primitive:NN \xspcode               \ptex_xspcode:D
   \@@_primitive:NN \ybaselineshift        \ptex_ybaselineshift:D
   \@@_primitive:NN \yoko                  \ptex_yoko:D
-%    \end{macrocode}
-% Primitives from \upTeX{}.
-%    \begin{macrocode}
   \@@_primitive:NN \disablecjktoken       \uptex_disablecjktoken:D
   \@@_primitive:NN \enablecjktoken        \uptex_enablecjktoken:D
   \@@_primitive:NN \forcecjktoken         \uptex_forcecjktoken:D
@@ -1165,238 +1989,16 @@
   \@@_primitive:NN \kchardef              \uptex_kchardef:D
   \@@_primitive:NN \kuten                 \uptex_kuten:D
   \@@_primitive:NN \ucs                   \uptex_ucs:D
+  \@@_primitive:NN \uptexrevision         \uptex_uptexrevision:D
   \@@_primitive:NN \uptexversion          \uptex_uptexversion:D
-%    \end{macrocode}
-% End of the \enquote{just the names} part of the source.
-%    \begin{macrocode}
-%</initex|names|package>
-%<*initex|package>
-%    \end{macrocode}
-%
-% The job is done: close the group (using the primitive renamed!).
-%    \begin{macrocode}
+        }
+    }
+  \@@_primitives:
 \tex_endgroup:D
-%    \end{macrocode}
-%
-% \LaTeXe{} moves a few primitives, so these are sorted out.
-% A convenient test for \LaTeXe{} is the \cs{@@@@end} saved primitive.
-%    \begin{macrocode}
-%<*package>
-\etex_ifdefined:D \@@@@end
-  \tex_let:D \tex_end:D                  \@@@@end
-  \tex_let:D \tex_everydisplay:D         \frozen at everydisplay
-  \tex_let:D \tex_everymath:D            \frozen at 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
-%    \end{macrocode}
-% The \tn{shipout} primitive is particularly tricky as a number of packages
-% want to hook in here. First, we see if a sufficiently-new kernel has saved
-% a copy: if it has, just use that. Otherwise, we need to check each of the
-% possible packages/classes that might move it: here, we are looking for those
-% which do \emph{not} delay action to the \tn{AtBeginDocument} hook. (We
-% cannot use \tn{primitive} a (u)\pTeX{} doesn't offer it and as that doesn't
-% allow us to make a direct copy of the primitive \emph{itself}.) As we know
-% that \LaTeXe{} is in use, we use it's \tn{@tfor} loop here.
-%    \begin{macrocode}
-  \etex_ifdefined:D \@@@@shipout
-    \tex_let:D \tex_shipout:D \@@@@shipout
-  \tex_fi:D
-  \tex_begingroup:D
-    \tex_edef:D \l_tmpa_tl { \tex_string:D \shipout }
-    \tex_edef:D \l_tmpb_tl { \tex_meaning:D \shipout }
-    \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
-    \tex_else:D
-      \tex_expandafter:D \@tfor \tex_expandafter:D \@tempa \tex_string:D :=
-        \CROP at shipout
-        \dup at shipout
-        \GPTorg at shipout
-        \LL at shipout
-        \mem at oldshipout
-        \opem at shipout
-        \pgfpages at originalshipout
-        \pr at shipout
-        \Shipout
-        \verso at orig@shipout
-        \do
-          {
-            \tex_edef:D \l_tmpb_tl
-              { \tex_expandafter:D \tex_meaning:D \@tempa }
-            \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
-              \tex_global:D \tex_expandafter:D \tex_let:D
-                \tex_expandafter:D \tex_shipout:D \@tempa
-            \tex_fi:D
-          }
-    \tex_fi:D
-  \tex_endgroup:D
-%    \end{macrocode}
-% Some tidying up is needed for \tn[index=tracingfonts]{(pdf)tracingfonts}.
-% Newer \LuaTeX{} has
-% this simply as \tn{tracingfonts}, but that is overwritten by
-% the \LaTeXe{} kernel. So any spurious definition has to be removed, then
-% the real version saved either from the \pdfTeX{} name or from \LuaTeX{}.
-% In the latter case, we leave \tn{@@tracingfonts} available: this might
-% be useful and almost all \LaTeXe{} users will have \pkg{expl3} loaded by
-% \pkg{fontspec}. (We follow the usual kernel convention that |@@| is used
-% for saved primitives.)
-%   \begin{macrocode}
-  \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
-%    \end{macrocode}
-% That is also true for the \LuaTeX{} primitives under \LaTeXe{}
-% (depending on the format-building date). There are a few primitives
-% that get the right names anyway so are missing here!
-%    \begin{macrocode}
-\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
-%    \end{macrocode}
-% Which also covers those slightly odd ones.
-%    \begin{macrocode}
-  \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
-%    \end{macrocode}
-% Only \pdfTeX{} and \LuaTeX{} define \tn{pdfmapfile} and \tn{pdfmapline}:
-% Tidy up the fact that some format-building processes leave
-% a couple of questionable decisions about that!
-%    \begin{macrocode}
-\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
 %</package>
 %    \end{macrocode}
-% Older \XeTeX{} versions use |\XeTeX| as the prefix for the Unicode math
-% primitives it knows. That is tided up here (we support \XeTeX{} versions
-% from 0.9994 but this change was in 0.9999).
-%    \begin{macrocode}
-%<*initex|package>
-\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
-%    \end{macrocode}
-% Up to v0.80, \LuaTeX{} defines the \pdfTeX{} version data: rather
-% confusing. Removing them means that \cs{pdftex_pdftexversion:D} is
-% a marker for \pdfTeX{} alone: useful in engine-dependent code later.
-%    \begin{macrocode}
-\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
-%</initex|package>
-%    \end{macrocode}
 %
-% For \ConTeXt{}, two tests are needed. Both Mark~II and Mark~IV move several
-% primitives: these are all covered by the first test, again using \cs{end}
-% as a marker. For Mark~IV, a few more primitives are moved: they are
-% implemented using some Lua code in the current \ConTeXt{}.
 %    \begin{macrocode}
-%<*package>
-\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
-%</package>
-%    \end{macrocode}
-%
-%    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3oldmodules.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 % }
 %
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -484,13 +484,13 @@
 %   expression.
 % \end{function}
 %
-% \begin{function}[EXP, updated = 2017-07-15]{\bool_xor_p:nn}
+% \begin{function}[EXP, pTF, added = 2018-05-09]{\bool_xor:nn}
 %   \begin{syntax}
 %     \cs{bool_xor_p:nn} \Arg{boolexpr_1} \Arg{boolexpr_2}
+%     \cs{bool_xor:nnTF} \Arg{boolexpr_1} \Arg{boolexpr_2} \Arg{true code} \Arg{false code}
 %   \end{syntax}
 %   Implements an \enquote{exclusive or} operation between two boolean
-%   expressions. There is no infix operation for this logical
-%   operator.
+%   expressions. There is no infix operation for this logical operation.
 % \end{function}
 %
 % \section{Logical loops}
@@ -862,15 +862,24 @@
 % \begin{macro}{\bool_set:Nn, \bool_set:cn}
 % \begin{macro}{\bool_gset:Nn, \bool_gset:cn}
 %   This function evaluates a boolean expression and assigns the first
-%   argument the meaning \cs{c_true_bool} or \cs{c_false_bool}.
-%   Again, we include some checking code.
+%   argument the meaning \cs{c_true_bool} or \cs{c_false_bool}.  Again,
+%   we include some checking code.  It is important to evaluate the
+%   expression before applying the \tn{chardef} primitive, because that
+%   primitive sets the left-hand side to \cs{scan_stop:} before looking
+%   for the right-hand side.
 %    \begin{macrocode}
 \__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \bool_set:Nn #1#2
-  { \tex_chardef:D #1 = \bool_if_p:n {#2} }
+  {
+    \exp_last_unbraced:NNNf
+      \tex_chardef:D #1 = { \bool_if_p:n {#2} }
+  }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \bool_gset:Nn #1#2
-  { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} }
+  {
+    \exp_last_unbraced:NNNNf
+      \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 }
 %    \end{macrocode}
@@ -1004,15 +1013,24 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]{\bool_if_p:n}
-%   First issue a \cs{group_align_safe_begin:} as we are using |&&| as
+% \begin{macro}[EXP]{\bool_if_p:n, \@@_if_p:n, \@@_if_p_aux:w}
+%   To speed up the case of a single predicate, \texttt{f}-expand and
+%   check whether the result is one token (possibly surrounded by
+%   spaces), which must be \cs{c_true_bool} or \cs{c_false_bool}.  We
+%   use a version of \cs{tl_if_single:nTF} optimized for speed since we
+%   know that an empty~|#1| is an error.  The auxiliary
+%   \cs{@@_if_p_aux:w} removes the trailing parenthesis and gets rid of
+%   any space.  For the general case, first issue a
+%   \cs{group_align_safe_begin:} as we are using |&&| as
 %   syntax shorthand for the And operation and we need to hide it for
 %   \TeX{}.  This group is closed after \cs{@@_get_next:NN} returns
 %   \cs{c_true_bool} or \cs{c_false_bool}.  That function requires the
 %   trailing parenthesis to know where the expression ends.
 %    \begin{macrocode}
-\cs_new:Npn \bool_if_p:n #1
+\cs_new:Npn \bool_if_p:n { \exp_args:Nf \@@_if_p:n }
+\cs_new:Npn \@@_if_p:n #1
   {
+    \tl_if_empty:oT { \use_none:nn #1 . } { \@@_if_p_aux:w }
     \group_align_safe_begin:
     \exp_after:wN
     \group_align_safe_end:
@@ -1019,6 +1037,7 @@
     \exp:w \exp_end_continue_f:w % (
     \@@_get_next:NN \use_i:nnnn #1 )
   }
+\cs_new:Npn \@@_if_p_aux:w #1 \use_i:nnnn #2#3 {#2}
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1163,13 +1182,21 @@
 %   is \texttt{false}.  If the end is reached without finding any
 %   \texttt{false} expression, then the result is \texttt{true}.
 %    \begin{macrocode}
-\prg_new_conditional:Npnn \bool_lazy_all:n #1 { p , T , F , TF }
+\cs_new:Npn \bool_lazy_all_p:n #1
   { \@@_lazy_all:n #1 \q_recursion_tail \q_recursion_stop }
+\prg_new_conditional:Npnn \bool_lazy_all:n #1 { T , F , TF }
+  {
+    \if_predicate:w \bool_lazy_all_p:n {#1}
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
 \cs_new:Npn \@@_lazy_all:n #1
   {
-    \quark_if_recursion_tail_stop_do:nn {#1} { \prg_return_true: }
+    \quark_if_recursion_tail_stop_do:nn {#1} { \c_true_bool }
     \bool_if:nF {#1}
-      { \use_i_delimit_by_q_recursion_stop:nw { \prg_return_false: } }
+      { \use_i_delimit_by_q_recursion_stop:nw { \c_false_bool } }
     \@@_lazy_all:n
   }
 %    \end{macrocode}
@@ -1179,12 +1206,18 @@
 % \begin{macro}[pTF]{\bool_lazy_and:nn}
 % \UnitTested
 %   Only evaluate the second expression if the first is \texttt{true}.
+%   Note that |#2| must be removed as an argument, not just by skipping
+%   to the \cs{else:} branch of the conditional since |#2| may contain
+%   unbalanced \TeX{} conditionals.
 %    \begin{macrocode}
 \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: }
+    \if_predicate:w
+        \bool_if:nTF {#1} { \bool_if_p:n {#2} } { \c_false_bool }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1196,13 +1229,21 @@
 %   is \texttt{true}.  If the end is reached without finding any
 %   \texttt{true} expression, then the result is \texttt{false}.
 %    \begin{macrocode}
-\prg_new_conditional:Npnn \bool_lazy_any:n #1 { p , T , F , TF }
+\cs_new:Npn \bool_lazy_any_p:n #1
   { \@@_lazy_any:n #1 \q_recursion_tail \q_recursion_stop }
+\prg_new_conditional:Npnn \bool_lazy_any:n #1 { T , F , TF }
+  {
+    \if_predicate:w \bool_lazy_any_p:n {#1}
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
 \cs_new:Npn \@@_lazy_any:n #1
   {
-    \quark_if_recursion_tail_stop_do:nn {#1} { \prg_return_false: }
+    \quark_if_recursion_tail_stop_do:nn {#1} { \c_false_bool }
     \bool_if:nT {#1}
-      { \use_i_delimit_by_q_recursion_stop:nw { \prg_return_true: } }
+      { \use_i_delimit_by_q_recursion_stop:nw { \c_true_bool } }
     \@@_lazy_any:n
   }
 %    \end{macrocode}
@@ -1215,9 +1256,12 @@
 %    \begin{macrocode}
 \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: } }
+    \if_predicate:w
+        \bool_if:nTF {#1} { \c_true_bool } { \bool_if_p:n {#2} }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1233,16 +1277,19 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\bool_xor_p:nn}
+% \begin{macro}[pTF]{\bool_xor:nn}
 % \UnitTested
 %    Exclusive or. If the boolean expressions have same truth value,
 %    return \texttt{false}, otherwise return \texttt{true}.
 %    \begin{macrocode}
-\cs_new:Npn \bool_xor_p:nn #1#2
+\prg_new_conditional:Npnn \bool_xor:nn #1#2 { p , T , F , TF }
   {
-    \int_compare:nNnTF { \bool_if_p:n {#1} } = { \bool_if_p:n {#2} }
-      \c_false_bool
-      \c_true_bool
+    \bool_if:nT {#1} \reverse_if:N
+    \if_predicate:w \bool_if_p:n {#2}
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1523,9 +1570,9 @@
 %   are always brace balanced.
 %    \begin{macrocode}
 \cs_new:Npn \group_align_safe_begin:
-  { \if_int_compare:w \if_false: { \fi: `} = \c_zero \fi: }
+  { \if_int_compare:w \if_false: { \fi: `} = \c_zero_int \fi: }
 \cs_new:Npn \group_align_safe_end:
-  { \if_int_compare:w `{ = \c_zero } \fi: }
+  { \if_int_compare:w `{ = \c_zero_int } \fi: }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -335,7 +335,7 @@
 %     \cs{prop_map_function:NN} \meta{property list} \meta{function}
 %   \end{syntax}
 %   Applies \meta{function} to every \meta{entry} stored in the
-%   \meta{property list}. The \meta{function} receives two argument for
+%   \meta{property list}. The \meta{function} receives two arguments for
 %   each iteration: the \meta{key} and associated \meta{value}.
 %   The order in which \meta{entries} are returned is not defined and
 %   should not be relied upon.

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -522,7 +522,7 @@
 % \begin{macro}[pTF]{\quark_if_no_value:n}
 % \UnitTested
 % \begin{macro}{\@@_if_nil:w, \@@_if_no_value:w}
-% \begin{macro}[EXP]{\@@_if_empty_return:o}
+% \begin{macro}[EXP]{\@@_if_empty_if:o}
 %   Let us explain |\quark_if_nil:n(TF)|.  Expanding \cs{@@_if_nil:w}
 %   once is safe thanks to the trailing \cs{q_nil} |??!|.  The result of
 %   expanding once is empty if and only if both delimited arguments |#1|
@@ -537,31 +537,35 @@
 %   final~|?!|, and the test returns \texttt{true} as wanted.  In the
 %   second case, the result is not empty since the first~|?!| in the
 %   definition of \cs{quark_if_nil:n} stop~|#3|. The auxiliary here
-%   is the same as \cs{__tl_if_empty_return:o}, with the same comments
+%   is the same as \cs{__tl_if_empty_if:o}, with the same comments
 %   applying.
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \quark_if_nil:n #1 { p, T , F , TF }
   {
-    \@@_if_empty_return:o
+    \@@_if_empty_if:o
       { \@@_if_nil:w {} #1 {} ? ! \q_nil ? ? ! }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 \cs_new:Npn \@@_if_nil:w #1 \q_nil #2 ? #3 ? ! { #1 #2 }
 \prg_new_conditional:Npnn \quark_if_no_value:n #1 { p, T , F , TF }
   {
-    \@@_if_empty_return:o
+    \@@_if_empty_if:o
       { \@@_if_no_value:w {} #1 {} ? ! \q_no_value ? ? ! }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 \cs_new:Npn \@@_if_no_value:w #1 \q_no_value #2 ? #3 ? ! { #1 #2 }
 \prg_generate_conditional_variant:Nnn \quark_if_nil:n
   { V , o } { p , TF , T , F }
-\cs_new:Npn \@@_if_empty_return:o #1
+\cs_new:Npn \@@_if_empty_if:o #1
   {
     \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
       \__kernel_tl_to_str:w \exp_after:wN {#1} \q_nil
-      \prg_return_true:
-    \else:
-      \prg_return_false:
-    \fi:
   }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -920,7 +920,7 @@
 %   Access the primitive: performance is key here, so we do not use
 %   the slower route \emph{via} \cs{int_eval:n}.
 %    \begin{macrocode}
-\cs_new_eq:NN \@@_int_eval:w \etex_numexpr:D
+\cs_new_eq:NN \@@_int_eval:w \tex_numexpr:D
 %     \end{macrocode}
 % \end{macro}
 %
@@ -1924,6 +1924,28 @@
 %
 % \subsubsection{Generic helpers used when compiling}
 %
+% \begin{macro}{\@@_two_if_eq:NNNNTF}
+%   Used to compare pairs of things like \cs{@@_compile_special:N} |?|
+%   together.  It's often inconvenient to get the catcodes of the
+%   character to match so we just compare the character code.
+%   Besides, the expanding behaviour of \cs{if:w} is very useful as that
+%   means we can use \cs{c_left_brace_str} and the like.
+%    \begin{macrocode}
+\prg_new_conditional:Npnn \@@_two_if_eq:NNNN #1#2#3#4 { TF }
+  {
+    \if_meaning:w #1 #3
+      \if:w #2 #4
+        \prg_return_true:
+      \else:
+        \prg_return_false:
+      \fi:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\@@_get_digits:NTFw}
 % \begin{macro}[rEXP]{\@@_get_digits_loop:w}
 %   If followed by some raw digits, collect them one by one in the
@@ -2340,7 +2362,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_compile_quantifier_lazyness:nnNN #1#2#3#4
   {
-    \str_if_eq:nnTF { #3 #4 } { \@@_compile_special:N ? }
+    \@@_two_if_eq:NNNNTF #3 #4 \@@_compile_special:N ?
       {
         \tl_build_put_right:Nn \l_@@_build_tl
           { \if_false: { \fi: } { #1 } { #2 } \c_true_bool }
@@ -2421,8 +2443,7 @@
   }
 \cs_new_protected:Npn \@@_compile_quantifier_braced_auxii:w #1#2
   {
-    \str_if_eq_x:nnTF
-      { #1 #2 } { \@@_compile_special:N \c_right_brace_str }
+    \@@_two_if_eq:NNNNTF #1 #2 \@@_compile_special:N \c_right_brace_str
       {
         \exp_args:No \@@_compile_quantifier_lazyness:nnNN
           { \int_use:N \l_@@_internal_a_int } { -1 }
@@ -2435,8 +2456,7 @@
   }
 \cs_new_protected:Npn \@@_compile_quantifier_braced_auxiii:w #1#2
   {
-    \str_if_eq_x:nnTF
-      { #1 #2 } { \@@_compile_special:N \c_right_brace_str }
+    \@@_two_if_eq:NNNNTF #1 #2 \@@_compile_special:N \c_right_brace_str
       {
         \if_int_compare:w \l_@@_internal_a_int >
           \l_@@_internal_b_int
@@ -2489,7 +2509,7 @@
   {
     \@@_if_in_class:TF
       {
-        \str_if_eq:nnTF {#2#3} { \@@_compile_special:N - }
+        \@@_two_if_eq:NNNNTF #2 #3 \@@_compile_special:N -
           { \@@_compile_range:Nw #1 }
           {
             \@@_compile_one:n
@@ -2785,7 +2805,7 @@
 \cs_new_protected:Npn \@@_compile_class:TFNN #1#2#3#4
   {
     \l_@@_mode_int = \int_value:w \l_@@_mode_int 3 \exp_stop_f:
-    \str_if_eq:nnTF { #3 #4 } { \@@_compile_special:N ^ }
+    \@@_two_if_eq:NNNNTF #3 #4 \@@_compile_special:N ^
       {
         \tl_build_put_right:Nn \l_@@_build_tl { #2 { \if_false: } \fi: }
         \@@_compile_class:NN
@@ -2840,7 +2860,7 @@
   }
 \cs_new_protected:Npn \@@_compile_class_posix:NNNNw #1#2#3#4#5#6
   {
-    \str_if_eq:nnTF { #5 #6 } { \@@_compile_special:N ^ }
+    \@@_two_if_eq:NNNNTF #5 #6 \@@_compile_special:N ^
       {
         \bool_set_false:N \l_@@_internal_bool
         \tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
@@ -2860,8 +2880,9 @@
   }
 \cs_new_protected:Npn \@@_compile_class_posix_end:w #1#2#3#4
   {
-    \str_if_eq:nnTF { #1 #2 #3 #4 }
-      { \@@_compile_special:N : \@@_compile_special:N ] }
+    \@@_two_if_eq:NNNNTF #1 #2 \@@_compile_special:N :
+      { \@@_two_if_eq:NNNNTF #3 #4 \@@_compile_special:N ] }
+      { \use_ii:nn }
       {
         \cs_if_exist:cTF { @@_posix_ \l_@@_internal_a_tl : }
           {
@@ -2956,7 +2977,7 @@
   }
 \cs_new_protected:Npn \@@_compile_lparen:w #1#2#3#4
   {
-    \str_if_eq:nnTF { #1 #2 } { \@@_compile_special:N ? }
+    \@@_two_if_eq:NNNNTF #1 #2 \@@_compile_special:N ?
       {
         \cs_if_exist_use:cF
           { @@_compile_special_group_\token_to_str:N #4 :w }
@@ -3022,7 +3043,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_compile_special_group_i:w #1#2
   {
-    \str_if_eq:nnTF { #1 #2 } { \@@_compile_special:N ) }
+    \@@_two_if_eq:NNNNTF #1 #2 \@@_compile_special:N )
       {
         \cs_set:Npn \@@_item_equal:n 
           { \@@_item_caseless_equal:n }
@@ -3039,8 +3060,9 @@
   }
 \cs_new_protected:cpn { @@_compile_special_group_-:w } #1#2#3#4
   {
-    \str_if_eq:nnTF { #1 #2 #3 #4 }
-      { \@@_compile_raw:N i \@@_compile_special:N ) }
+    \@@_two_if_eq:NNNNTF #1 #2 \@@_compile_raw:N i
+      { \@@_two_if_eq:NNNNTF #3 #4 \@@_compile_special:N ) }
+      { \use_ii:nn }
       {
         \cs_set:Npn \@@_item_equal:n
           { \@@_item_caseful_equal:n }
@@ -3134,7 +3156,7 @@
           \c_@@_catcode_in_class_mode_int
         \fi:
     \int_zero:N \l_@@_catcodes_int
-    \str_if_eq:nnTF { #1 #2 } { \@@_compile_special:N ^ }
+    \@@_two_if_eq:NNNNTF #1 #2 \@@_compile_special:N ^
       {
         \bool_set_false:N \l_@@_catcodes_bool
         \@@_compile_c_lbrack_loop:NN
@@ -3304,8 +3326,7 @@
     \@@_if_in_class_or_catcode:TF
       { \@@_compile_raw_error:N u #1 #2 }
       {
-        \str_if_eq_x:nnTF {#1#2}
-          { \@@_compile_special:N \c_left_brace_str }
+        \@@_two_if_eq:NNNNTF #1 #2 \@@_compile_special:N \c_left_brace_str
           {
             \tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
             \@@_compile_u_loop:NN
@@ -5356,9 +5377,8 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_replacement_g:w #1#2
   {
-    \str_if_eq_x:nnTF
-      { #1#2 }
-      { \@@_replacement_normal:n \c_left_brace_str }
+    \@@_two_if_eq:NNNNTF
+      #1 #2 \@@_replacement_normal:n \c_left_brace_str
       { \l_@@_internal_a_int = \@@_replacement_g_digits:NN }
       { \@@_replacement_error:NNN g #1 #2 }
   }
@@ -5447,9 +5467,8 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_replacement_u:w #1#2
   {
-    \str_if_eq_x:nnTF
-      { #1#2 }
-      { \@@_replacement_normal:n \c_left_brace_str }
+    \@@_two_if_eq:NNNNTF
+      #1 #2 \@@_replacement_normal:n \c_left_brace_str
       { \@@_replacement_cu_aux:Nw \exp_not:V }
       { \@@_replacement_error:NNN u #1#2 }
   }
@@ -5495,11 +5514,7 @@
             #2 #3
           }
           {
-            \str_if_eq:nnTF
-              { #2#3 }
-              { 
-                \@@_replacement_normal:n ( % )
-              }
+            \@@_two_if_eq:NNNNTF #2 #3 \@@_replacement_normal:n (
               {
                 \seq_push:NV \l_@@_replacement_category_seq
                   \l_@@_replacement_category_tl

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -1064,7 +1064,7 @@
 %   Primitives renamed.
 %    \begin{macrocode}
 \cs_new_eq:NN \if_dim:w      \tex_ifdim:D
-\cs_new_eq:NN \@@_eval:w      \etex_dimexpr:D
+\cs_new_eq:NN \@@_eval:w      \tex_dimexpr:D
 \cs_new_eq:NN \@@_eval_end:   \tex_relax:D
 %    \end{macrocode}
 % \end{macro}
@@ -1394,7 +1394,7 @@
   { #1 \prg_return_false: \else: \prg_return_true: \fi: }
 \cs_new_protected:Npn \@@_compare_error:
   {
-    \if_int_compare:w \c_zero \c_zero \fi:
+    \if_int_compare:w \c_zero_int \c_zero_int \fi:
     =
     \@@_compare_error:
   }
@@ -1871,7 +1871,7 @@
     \__kernel_patch_args:nnnNNpn
       { #1 ##1 }
       { }
-      { {##1} { \__kernel_chk_expr:nNnN {##2} \etex_glueexpr:D { } #3 } }
+      { {##1} { \__kernel_chk_expr:nNnN {##2} \tex_glueexpr:D { } #3 } }
     #2 #3
   }
 %    \end{macrocode}
@@ -1882,10 +1882,10 @@
 %    \begin{macrocode}
 \@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \skip_set:Nn #1#2
-  { #1 ~ \etex_glueexpr:D #2 \scan_stop: }
+  { #1 ~ \tex_glueexpr:D #2 \scan_stop: }
 \@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \skip_gset:Nn #1#2
-  { \tex_global:D #1 ~ \etex_glueexpr:D #2 \scan_stop: }
+  { \tex_global:D #1 ~ \tex_glueexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \skip_set:Nn  { c }
 \cs_generate_variant:Nn \skip_gset:Nn { c }
 %    \end{macrocode}
@@ -1914,18 +1914,18 @@
 %    \begin{macrocode}
 \@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \skip_add:Nn #1#2
-  { \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: }
+  { \tex_advance:D #1 by \tex_glueexpr:D #2 \scan_stop: }
 \@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \skip_gadd:Nn #1#2
-  { \tex_global:D \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: }
+  { \tex_global:D \tex_advance:D #1 by \tex_glueexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \skip_add:Nn  { c }
 \cs_generate_variant:Nn \skip_gadd:Nn { c }
 \@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \skip_sub:Nn #1#2
-  { \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: }
+  { \tex_advance:D #1 by - \tex_glueexpr:D #2 \scan_stop: }
 \@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \skip_gsub:Nn #1#2
-  { \tex_global:D \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: }
+  { \tex_global:D \tex_advance:D #1 by - \tex_glueexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \skip_sub:Nn  { c }
 \cs_generate_variant:Nn \skip_gsub:Nn { c }
 %    \end{macrocode}
@@ -1965,13 +1965,13 @@
       {
         {
           \__kernel_chk_expr:nNnN
-            {##1} \etex_glueexpr:D { } \skip_if_finite:n
+            {##1} \tex_glueexpr:D { } \skip_if_finite:n
         }
       }
     \prg_new_conditional:Npnn \skip_if_finite:n ##1 { p , T , F , TF }
       {
         \exp_after:wN \@@_if_finite:wwNw
-        \skip_use:N \etex_glueexpr:D ##1 ; \prg_return_false:
+        \skip_use:N \tex_glueexpr:D ##1 ; \prg_return_false:
         #1 ; \prg_return_true: \q_stop
       }
     \cs_new:Npn \@@_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \q_stop {##3}
@@ -1987,9 +1987,9 @@
 %   Evaluating a skip expression expandably.
 %    \begin{macrocode}
 \__kernel_patch_args:nNNpn
-  { { \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_eval:n } }
+  { { \__kernel_chk_expr:nNnN {#1} \tex_glueexpr:D { } \skip_eval:n } }
 \cs_new:Npn \skip_eval:n #1
-  { \skip_use:N \etex_glueexpr:D #1 \scan_stop: }
+  { \skip_use:N \tex_glueexpr:D #1 \scan_stop: }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2012,22 +2012,22 @@
 \__kernel_patch_args:nNNpn
   {
     {
-      \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { }
+      \__kernel_chk_expr:nNnN {#1} \tex_glueexpr:D { }
         \skip_horizontal:n
     }
   }
 \cs_new:Npn \skip_horizontal:n #1
-  { \skip_horizontal:N \etex_glueexpr:D #1 \scan_stop: }
+  { \skip_horizontal:N \tex_glueexpr:D #1 \scan_stop: }
 \cs_new_eq:NN  \skip_vertical:N \tex_vskip:D
 \__kernel_patch_args:nNNpn
   {
     {
-      \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { }
+      \__kernel_chk_expr:nNnN {#1} \tex_glueexpr:D { }
         \skip_vertical:n
     }
   }
 \cs_new:Npn \skip_vertical:n #1
-  { \skip_vertical:N \etex_glueexpr:D #1 \scan_stop: }
+  { \skip_vertical:N \tex_glueexpr:D #1 \scan_stop: }
 \cs_generate_variant:Nn \skip_horizontal:N { c }
 \cs_generate_variant:Nn \skip_vertical:N { c }
 %    \end{macrocode}
@@ -2173,7 +2173,7 @@
         {##1}
         {
           \__kernel_chk_expr:nNnN {##2}
-            \etex_muexpr:D { \etex_mutoglue:D } #3
+            \tex_muexpr:D { \tex_mutoglue:D } #3
         }
       }
     #2 #3
@@ -2186,10 +2186,10 @@
 %    \begin{macrocode}
 \@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \muskip_set:Nn #1#2
-  { #1 ~ \etex_muexpr:D #2 \scan_stop: }
+  { #1 ~ \tex_muexpr:D #2 \scan_stop: }
 \@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \muskip_gset:Nn #1#2
-  { \tex_global:D #1 ~ \etex_muexpr:D #2 \scan_stop: }
+  { \tex_global:D #1 ~ \tex_muexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \muskip_set:Nn  { c }
 \cs_generate_variant:Nn \muskip_gset:Nn { c }
 %    \end{macrocode}
@@ -2226,18 +2226,18 @@
 %    \begin{macrocode}
 \@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \muskip_add:Nn #1#2
-  { \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: }
+  { \tex_advance:D #1 by \tex_muexpr:D #2 \scan_stop: }
 \@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \muskip_gadd:Nn #1#2
-  { \tex_global:D \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: }
+  { \tex_global:D \tex_advance:D #1 by \tex_muexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \muskip_add:Nn  { c }
 \cs_generate_variant:Nn \muskip_gadd:Nn { c }
 \@@_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \muskip_sub:Nn #1#2
-  { \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: }
+  { \tex_advance:D #1 by - \tex_muexpr:D #2 \scan_stop: }
 \@@_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \muskip_gsub:Nn #1#2
-  { \tex_global:D \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: }
+  { \tex_global:D \tex_advance:D #1 by - \tex_muexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \muskip_sub:Nn  { c }
 \cs_generate_variant:Nn \muskip_gsub:Nn { c }
 %    \end{macrocode}
@@ -2254,12 +2254,12 @@
 \__kernel_patch_args:nNNpn
   {
     {
-      \__kernel_chk_expr:nNnN {#1} \etex_muexpr:D
-        { \etex_mutoglue:D } \muskip_eval:n
+      \__kernel_chk_expr:nNnN {#1} \tex_muexpr:D
+        { \tex_mutoglue:D } \muskip_eval:n
     }
   }
 \cs_new:Npn \muskip_eval:n #1
-  { \muskip_use:N \etex_muexpr:D #1 \scan_stop: }
+  { \muskip_use:N \tex_muexpr:D #1 \scan_stop: }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -1040,14 +1040,14 @@
 %   The need to detokenize and force
 %   expansion of input arises from the case where a |#| token is used in the
 %   input, \emph{e.g.}~|\__str_if_eq_x:nn {#} { \tl_to_str:n {#} }|, which
-%   otherwise would fail as \cs{luatex_luaescapestring:D} does not double
+%   otherwise would fail as \cs{tex_luaescapestring:D} does not double
 %   such tokens.
 %    \begin{macrocode}
-\cs_new:Npn \@@_if_eq_x:nn #1#2 { \pdftex_strcmp:D {#1} {#2} }
-\cs_if_exist:NT \luatex_luatexversion:D
+\cs_new:Npn \@@_if_eq_x:nn #1#2 { \tex_strcmp:D {#1} {#2} }
+\cs_if_exist:NT \tex_luatexversion:D
    {
-     \cs_set_eq:NN \lua_escape_x:n \luatex_luaescapestring:D
-     \cs_set_eq:NN \lua_now_x:n    \luatex_directlua:D
+     \cs_set_eq:NN \lua_escape_x:n \tex_luaescapestring:D
+     \cs_set_eq:NN \lua_now_x:n    \tex_directlua:D
      \cs_set:Npn \@@_if_eq_x:nn #1#2
        {
           \lua_now_x:n

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -222,17 +222,17 @@
 %    \begin{macrocode}
 \str_const:Nx \c_sys_engine_str
   {
-    \cs_if_exist:NT \luatex_luatexversion:D { luatex }
-    \cs_if_exist:NT \pdftex_pdftexversion:D { pdftex }
-    \cs_if_exist:NT \ptex_kanjiskip:D
+    \cs_if_exist:NT \tex_luatexversion:D { luatex }
+    \cs_if_exist:NT \tex_pdftexversion:D { pdftex }
+    \cs_if_exist:NT \tex_kanjiskip:D
       {
         \bool_lazy_and:nnTF
-          { \cs_if_exist_p:N \uptex_disablecjktoken:D }
-          { \int_compare_p:nNn { \ptex_jis:D "2121 } = { "3000 } }
+          { \cs_if_exist_p:N \tex_disablecjktoken:D }
+          { \int_compare_p:nNn { \tex_jis:D "2121 } = { "3000 } }
           { uptex }
           { ptex }
       }
-    \cs_if_exist:NT \xetex_XeTeXversion:D { xetex }
+    \cs_if_exist:NT \tex_XeTeXversion:D { xetex }
   }
 \tl_map_inline:nn { { luatex } { pdftex } { ptex } { uptex } { xetex } }
   {
@@ -256,7 +256,7 @@
 \str_const:Nx \c_sys_output_str
   {
     \int_compare:nNnTF
-      { \cs_if_exist_use:NF \pdftex_pdfoutput:D { 0 } } > { 0 }
+      { \cs_if_exist_use:NF \tex_pdfoutput:D { 0 } } > { 0 }
       { pdf }
       { dvi }
   }
@@ -268,7 +268,20 @@
 % \end{variable}
 % \end{macro}
 %
+% \subsection{Randomness}
+%
+% This candidate function is placed there because
+% \cs{sys_if_rand_exist:TF} is used in \pkg{l3fp-rand}.
+%
+% \begin{macro}[EXP, pTF]{\sys_if_rand_exist:}
+%   Currently, randomness exists under \pdfTeX{}, \LuaTeX{}, \pTeX{} and \upTeX{}.
 %    \begin{macrocode}
+\@@_const:nn { sys_if_rand_exist }
+  { \cs_if_exist_p:N \tex_uniformdeviate:D }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</initex|package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -853,13 +853,13 @@
         \exp_after:wN \prg_break:
       \fi:
       \tex_the:D \tex_toks:D #1 \s_@@
-      \if_case:w \etex_gluestretch:D \tex_skip:D #1 \exp_stop_f:
+      \if_case:w \tex_gluestretch:D \tex_skip:D #1 \exp_stop_f:
              \token_to_str:N A
       \or:   1
       \or:   1
       \else: 2
       \fi:
-      \if_int_odd:w \etex_gluestretch:D \tex_skip:D #1 \exp_stop_f:
+      \if_int_odd:w \tex_gluestretch:D \tex_skip:D #1 \exp_stop_f:
         \exp_after:wN \@@_analysis_b_special_char:wN \int_value:w
       \else:
         \exp_after:wN \@@_analysis_b_special_space:w \int_value:w

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -1489,7 +1489,7 @@
       }
       {
         \group_begin:
-          \exp_args:No \etex_everyeof:D
+          \exp_args:No \tex_everyeof:D
             { \c_@@_rescan_marker_tl \exp_not:N }
           \int_compare:nNnT \tex_endlinechar:D = { 32 }
             { \int_set:Nn \tex_endlinechar:D { -1 } }
@@ -1507,7 +1507,7 @@
       {
         \exp_after:wN \@@_rescan:w
         \exp_after:wN \prg_do_nothing:
-        \etex_scantokens:D {#1}
+        \tex_scantokens:D {#1}
       }
   }
 \exp_args:Nno \use:nn
@@ -1625,7 +1625,7 @@
               \exp_not:n { \cs_set:Npn \@@_rescan:w ##1 }
               \exp_after:wN \@@_rescan:w
               \exp_after:wN \prg_do_nothing:
-              \etex_scantokens:D {#1}
+              \tex_scantokens:D {#1}
             }
           \c_@@_rescan_marker_tl
         }
@@ -1640,7 +1640,7 @@
             = { 10 } { ~ }
           \exp_after:wN \@@_rescan:w
           \exp_after:wN \prg_do_nothing:
-          \etex_scantokens:D { #2 #1 }
+          \tex_scantokens:D { #2 #1 }
         }
     }
 \group_end:
@@ -1896,12 +1896,18 @@
 %   \TeX{} skips spaces when reading a non-delimited arguments. Thus,
 %   a \meta{token list} is blank if and only if \cs{use_none:n}
 %   \meta{token list} |?| is empty after one expansion.  The auxiliary
-%   \cs{@@_if_empty_return:o} is a fast emptyness test, converting its
+%   \cs{@@_if_empty_if:o} is a fast emptyness test, converting its
 %   argument to a string (after one expansion) and using the test
 %   \cs{if_meaning:w} \cs{q_nil} |...| \cs{q_nil}.
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF }
-  { \@@_if_empty_return:o { \use_none:n #1 ? } }
+  {
+    \@@_if_empty_if:o { \use_none:n #1 ? }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
 \prg_generate_conditional_variant:Nnn \tl_if_blank:n
   { V , o } { p , T , F , TF }
 %    \end{macrocode}
@@ -1954,26 +1960,31 @@
 % \end{macro}
 %
 % \begin{macro}[pTF,documented-as=\tl_if_empty:nTF]{\tl_if_empty:o}
-% \begin{macro}[EXP]{\@@_if_empty_return:o}
-%   The auxiliary function \cs{@@_if_empty_return:o} is for use
+% \begin{macro}[EXP]{\@@_if_empty_if:o}
+%   The auxiliary function \cs{@@_if_empty_if:o} is for use
 %   in various token list conditionals which reduce to testing
 %   if a given token list is empty after applying a simple function
 %   to it.
 %   The test for emptiness is based on \cs{tl_if_empty:nTF}, but
 %   the expansion is hard-coded for efficiency, as this auxiliary
-%   function is used in many places.
+%   function is used in several places.
+%   We don't put \cs{prg_return_true:} and so on in the definition of
+%   the auxiliary, because that would prevent an optimization applied to
+%   conditionals that end with this code.
 %    \begin{macrocode}
-\cs_new:Npn \@@_if_empty_return:o #1
+\cs_new:Npn \@@_if_empty_if:o #1
   {
     \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
       \__kernel_tl_to_str:w \exp_after:wN {#1} \q_nil
+  }
+\prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F }
+  {
+    \@@_if_empty_if:o {#1}
       \prg_return_true:
     \else:
       \prg_return_false:
     \fi:
-  }
-\prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F }
-  { \@@_if_empty_return:o {#1} }
+ }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -2004,13 +2015,13 @@
     \group_begin:
       \tl_set:Nn \l_@@_internal_a_tl {#1}
       \tl_set:Nn \l_@@_internal_b_tl {#2}
-      \if_meaning:w \l_@@_internal_a_tl \l_@@_internal_b_tl
-        \group_end:
-        \prg_return_true:
-      \else:
-        \group_end:
-        \prg_return_false:
-      \fi:
+      \exp_after:wN
+    \group_end:
+    \if_meaning:w \l_@@_internal_a_tl \l_@@_internal_b_tl
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 \tl_new:N \l_@@_internal_a_tl
 \tl_new:N \l_@@_internal_b_tl
@@ -2982,7 +2993,7 @@
 %
 %   The token list \cs{l_@@_internal_a_tl} containing the result
 %   of all these manipulations is displayed to the terminal using
-%   \cs{etex_showtokens:D} and an odd \cs{exp_after:wN} which expand the
+%   \cs{tex_showtokens:D} and an odd \cs{exp_after:wN} which expand the
 %   closing brace to improve the output slightly.  The calls to
 %   \cs{__kernel_iow_with:Nnn} ensure that the \tn{newlinechar} is set to~$10$
 %   so that the \cs{iow_newline:} inserted by the line-wrapping code
@@ -2998,7 +3009,7 @@
       {
         \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
           {
-            \etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
+            \tex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
               { \exp_after:wN \l_@@_internal_a_tl }
           }
       }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -141,12 +141,8 @@
 %     \item $12$ (other)
 %     \item $13$ (active) (not \XeTeX{})
 %   \end{itemize}
-%   and other values raise an error.
-%
-%   The \meta{charcode} may be any one valid for the engine in use. Note
-%   however that for \XeTeX{} releases prior to 0.99992 only the 8-bit
-%   range ($0$ to $255$) is accepted due to engine limitations. Note also
-%   that \XeTeX{} cannot currently generate active character tokens.
+%   and other values raise an error. The \meta{charcode} may be any one valid
+%   for the engine in use.
 % \end{function}
 %
 % \begin{variable}[added = 2011-09-05]{\c_catcode_other_space_tl}
@@ -1416,7 +1412,7 @@
 \tl_new:N \l_@@_tmp_tl
 %    \end{macrocode}
 %   Engine-dependent definitions are now needed for the implementation. For
-%   \LuaTeX{} and recent \XeTeX{} releases there is engine-level support.
+%   \LuaTeX{} and \XeTeX{} there is engine-level support.
 %   They can do cases that macro emulation can't. All of those are filtered
 %   out here using a primitive-based boolean expression for speed.
 %   The final level is the basic definition at the engine level: the arguments
@@ -1448,7 +1444,7 @@
           {
             #3
             \exp_after:wN \exp_end:
-            \utex_charcat:D #1 \exp_stop_f: #2 \exp_stop_f:
+            \tex_Ucharcat:D #1 \exp_stop_f: #2 \exp_stop_f:
           }
         \cs_new_eq:NN \@@_generate_auxii:nnw \@@_generate_aux:nnw
         \cs_gset:Npn \@@_generate_aux:nnw #1#2#3 \exp_end:

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -41,7 +41,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -82,7 +82,7 @@
 %    \end{macrocode}
 %   Set up a private copy of the char-generation primitive.
 %    \begin{macrocode}
-      \cs_set_eq:NN \@@_generate:w \utex_char:D
+      \cs_set_eq:NN \@@_generate:w \tex_Uchar:D
 %    \end{macrocode}
 % Parse the main Unicode data file for title case exceptions (the one-to-one
 % lower and upper case mappings it contains are all be covered by the \TeX{}
@@ -102,7 +102,10 @@
                 {
                   \tl_const:cx
                     { c_@@_mixed_case_ \@@_generate:w "#1 _tl }
-                    { \@@_generate:w "#7 }
+                    {
+                       \char_generate:nn { "#7 }
+                        { \char_value_catcode:n { "#7 } }
+                    }
                 }
             }
         }
@@ -130,7 +133,10 @@
                 {
                   \tl_const:cx
                     { c_@@_fold_case_ \@@_generate:w "#1 _tl }
-                    { \@@_generate:w "#3 }
+                    {
+                      \char_generate:nn { "#3 }
+                        { \char_value_catcode:n { "#3 } }
+                    }
                 }
             }
             {
@@ -142,10 +148,15 @@
         {
           \tl_const:cx { c_@@_fold_case_ \@@_generate:w "#1 _tl }
             {
-              \@@_generate:w "#2 \exp_stop_f:
-              \@@_generate:w "#3 \exp_stop_f:
+              \char_generate:nn { "#2 }
+                { \char_value_catcode:n { "#2 } }
+              \char_generate:nn { "#3 }
+                { \char_value_catcode:n { "#3 } }
               \tl_if_blank:nF {#4}
-                { \@@_generate:w "#4 }
+                {
+                  \char_generate:nn { "#4 }
+                    { \char_value_catcode:n { "#4 } }
+                }
             }
         }
       \ior_str_map_inline:Nn \g_@@_data_ior
@@ -178,10 +189,15 @@
             {
               \tl_const:cx { c_@@_ #2 _case_ \@@_generate:w "#1 _tl }
                 {
-                  \@@_generate:w "#3 \exp_stop_f:
-                  \@@_generate:w "#4 \exp_stop_f:
+                  \char_generate:nn { "#3 }
+                    { \char_value_catcode:n { "#3 } }
+                  \char_generate:nn { "#4 }
+                    { \char_value_catcode:n { "#4 } }
                   \tl_if_blank:nF {#5}
-                    { \@@_generate:w "#5 }
+                    {
+                      \char_generate:nn { "#5 }
+                        { \char_value_catcode:n { "#5 } }
+                    }
                 }
             }
         }

Modified: trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -60,7 +60,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -131,7 +131,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2018-04-30}{}
+\ProvidesExplPackage{l3keys2e}{2018-05-12}{}
   {LaTeX2e option processing using LaTeX3 keys}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -62,7 +62,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -161,7 +161,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfp}{2018-04-30}{}
+\ProvidesExplPackage{xfp}{2018-05-12}{}
   {L3 Floating point unit}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -533,7 +533,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xfrac}{2018-04-30}{}
+\ProvidesExplPackage{xfrac}{2018-05-12}{}
   {L3 Experimental split-level fractions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -67,7 +67,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -818,7 +818,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xparse}{2018-04-30}{}
+\ProvidesExplPackage{xparse}{2018-05-12}{}
   {L3 Experimental document command parser}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx	2018-05-13 21:56:47 UTC (rev 47705)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2018-04-30}
+% \date{Released 2018-05-12}
 %
 % \maketitle
 %
@@ -682,7 +682,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xtemplate}{2018-04-30}{}
+\ProvidesExplPackage{xtemplate}{2018-05-12}{}
   {L3 Experimental prototype document functions}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty	2018-05-13 21:56:47 UTC (rev 47705)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3color.dtx Copyright(C) 2017-2018 The LaTeX3 Project
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3color}{2018-04-30}{}
+\ProvidesExplPackage{l3color}{2018-05-12}{}
   {L3 Experimental color support}
 \tl_new:N \l__color_tmp_tl
 \prg_new_conditional:Npnn \__color_if_defined:n #1 { T, F, TF }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2018-05-13 21:56:47 UTC (rev 47705)
@@ -27,7 +27,7 @@
 %% 
 %% File: l3draw.dtx Copyright(C) 2018 The LaTeX3 Project
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3draw}{2018-04-30}{}
+\ProvidesExplPackage{l3draw}{2018-05-12}{}
   {L3 Experimental core drawing support}
 \RequirePackage { l3color }
 %% File: l3draw-boxes.dtx Copyright(C) 2018 The LaTeX3 Project

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-convert.sty	2018-05-13 21:56:47 UTC (rev 47705)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-convert.dtx Copyright (C) 2013-2018 The LaTeX3 Project
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-convert}{2018-04-30}{}
+\ProvidesExplPackage{l3str-convert}{2018-05-12}{}
   {L3 Experimental string encoding conversions}
 \cs_if_exist:NF \use_ii_i:nn
   { \cs_new:Npn \use_ii_i:nn #1#2 { #2 #1 } }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2018-05-13 21:56:47 UTC (rev 47705)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-format.dtx Copyright (C) 2012-2018 The LaTeX3 Project
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-format}{2018-04-30}{}
+\ProvidesExplPackage{l3str-format}{2018-05-12}{}
   {L3 Experimental string formatting}
 \cs_generate_variant:Nn \use:nn { nf }
 \cs_generate_variant:Nn \use:nnn { fnf }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2018-05-13 21:56:47 UTC (rev 47705)
@@ -20,7 +20,7 @@
 %% 
 %% File: xcoffins.dtx Copyright(C) 2010-2012,2014,2016-2018 The LaTeX3 Project
 \RequirePackage{xparse}
-\ProvidesExplPackage{xcoffins}{2018-04-30}{}
+\ProvidesExplPackage{xcoffins}{2018-05-12}{}
   {L3 Experimental design level coffins}
 \keys_define:nn { coffin }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2018-05-13 21:56:47 UTC (rev 47705)
@@ -33,7 +33,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3galley}{2018-04-30}{}
+\ProvidesExplPackage{l3galley}{2018-05-12}{}
   {L3 Experimental galley code}
 \int_new:N \l__galley_tmp_int
 \seq_new:N \g__galley_tmpa_seq
@@ -87,7 +87,7 @@
 \int_new:N \l__galley_group_level_int
 \cs_new_protected:Npn \__galley_initialise_variables:
   {
-    \int_set:Nn \l__galley_group_level_int { \etex_currentgrouplevel:D }
+    \int_set:Nn \l__galley_group_level_int { \tex_currentgrouplevel:D }
     \bool_gset_true:N \g__galley_begin_level_bool
     \bool_gset_false:N \g__galley_cutout_active_bool
     \seq_gclear:N \g__galley_cutout_left_seq
@@ -263,7 +263,7 @@
           }
         \__galley_parshape_set:
       }
-    \int_compare:nNnT \l__galley_group_level_int = \etex_currentgrouplevel:D
+    \int_compare:nNnT \l__galley_group_level_int = \tex_currentgrouplevel:D
       {
         \bool_lazy_and:nnT
           { \seq_if_empty_p:N \g__galley_cutout_left_seq }
@@ -664,8 +664,8 @@
       { \galley_vspace_set_single:n {#1} }
       {
         \dim_compare:nNnT
-          { \etex_glueexpr:D \g__galley_interpar_vspace_user_tl }
-            < { \etex_glueexpr:D (#1) \scan_stop: }
+          { \tex_glueexpr:D \g__galley_interpar_vspace_user_tl }
+            < { \tex_glueexpr:D (#1) \scan_stop: }
           { \galley_vspace_set_single:n {#1} }
       }
   }
@@ -677,7 +677,7 @@
 \dim_new:N \l_galley_par_begin_skip
 \cs_new_eq:NN \l_galley_par_end_skip   \tex_parfillskip:D
 \cs_new_eq:NN \l_galley_par_indent_dim \tex_parindent:D
-\cs_new_eq:NN \l_galley_last_line_fit_int \etex_lastlinefit:D
+\cs_new_eq:NN \l_galley_last_line_fit_int \tex_lastlinefit:D
 \cs_new_protected:Npn \galley_interword_spacing_set:N #1
   {
     \bool_if:NTF #1
@@ -727,7 +727,7 @@
 \clist_new:N \l_galley_line_penalties_clist
 \cs_new_protected:Npn \galley_display_widow_penalties_set:n #1
   {
-    \etex_displaywidowpenalties:D
+    \tex_displaywidowpenalties:D
       \int_eval:n { \clist_count:n {#1} + 1 } \exp_stop_f:
       \clist_map_function:nN {#1} \__galley_set_aux:n
       0 \exp_stop_f:
@@ -735,7 +735,7 @@
 \cs_generate_variant:Nn \galley_display_widow_penalties_set:n { V , v }
 \cs_new_protected:Npn \galley_widow_penalties_set:n #1
   {
-    \etex_widowpenalties:D
+    \tex_widowpenalties:D
       \int_eval:n { \clist_count:n {#1} + 1 } \exp_stop_f:
       \clist_map_function:nN {#1} \__galley_set_aux:n
       0 \exp_stop_f:
@@ -756,7 +756,7 @@
 \cs_generate_variant:Nn \galley_interline_penalties_set:n { V , v }
 \cs_new_protected:Npn \galley_display_club_penalties_set:n #1
   {
-    \etex_clubpenalties:D
+    \tex_clubpenalties:D
       \int_eval:n { \clist_count:n {#1} + 1 } \exp_stop_f:
       \clist_map_function:nN {#1} \__galley_set_aux:n
       0 \exp_stop_f:
@@ -765,9 +765,9 @@
 \cs_generate_variant:Nn \galley_display_club_penalties_set:n { V , v }
 \cs_new_protected:Npn \galley_interline_penalty_set:n #1
   {
-    \int_compare:nNnTF { \etex_interlinepenalties:D 0 } = 0
+    \int_compare:nNnTF { \tex_interlinepenalties:D 0 } = 0
       {
-        \etex_interlinepenalties:D 1 = \int_eval:n {#1} \exp_stop_f:
+        \tex_interlinepenalties:D 1 = \int_eval:n {#1} \exp_stop_f:
         \__galley_calc_interline_penalties:
       }
       {
@@ -775,8 +775,8 @@
           {
             \int_eval:n
               {
-                \etex_interlinepenalties:D ##1
-                - \etex_interlinepenalties:D \etex_interlinepenalties:D 0
+                \tex_interlinepenalties:D ##1
+                - \tex_interlinepenalties:D \tex_interlinepenalties:D 0
                 + #1
               }
               \exp_stop_f:
@@ -787,16 +787,16 @@
   }
 \cs_new_protected:Npn \__galley_set_interline_penalty:nn #1#2
   {
-    \etex_interlinepenalties:D
-      \etex_interlinepenalties:D 0 \exp_stop_f:
+    \tex_interlinepenalties:D
+      \tex_interlinepenalties:D 0 \exp_stop_f:
       \int_step_function:nN {#1}
         \__galley_set_interline_penalty_auxi:n
-      \int_step_function:nnN { #1 + 1 } { \etex_interlinepenalties:D 0 - 1 }
+      \int_step_function:nnN { #1 + 1 } { \tex_interlinepenalties:D 0 - 1 }
         \__galley_set_interline_penalty_auxii:n
       \int_eval:n {#2} \exp_stop_f:
   }
 \cs_new:Npn \__galley_set_interline_penalty_auxi:n #1
-  { \etex_interlinepenalties:D \int_eval:n {#1} \exp_stop_f: }
+  { \tex_interlinepenalties:D \int_eval:n {#1} \exp_stop_f: }
 \cs_new:Npn \__galley_set_interline_penalty_auxii:n #1 { }
 \cs_new_protected:Npn \__galley_calc_interline_penalties:
   {
@@ -807,7 +807,7 @@
           {
             \int_max:nn
               { \clist_count:N \l_galley_line_penalties_clist + 1 }
-              { \etex_clubpenalties:D 0 }
+              { \tex_clubpenalties:D 0 }
           }
       }
       { \clist_count:N \l_galley_line_penalties_clist }
@@ -814,12 +814,12 @@
   }
 \cs_new_protected:Npn \__galley_calc_interline_penalties:nn #1#2
   {
-    \etex_interlinepenalties:D #1 ~
+    \tex_interlinepenalties:D #1 ~
       \int_step_function:nN {#2}
         \__galley_calc_interline_penalties_auxi:n
       \int_step_function:nnN { #2 + 1 } { #1 - 1 }
         \__galley_calc_interline_penalties_auxii:n
-      \etex_interlinepenalties:D \etex_interlinepenalties:D 0 \exp_stop_f:
+      \tex_interlinepenalties:D \tex_interlinepenalties:D 0 \exp_stop_f:
   }
 \cs_new:Npn \__galley_calc_interline_penalties_auxi:n #1
   {
@@ -827,7 +827,7 @@
       {
         \clist_item:Nn \l_galley_line_penalties_clist {#1}
         + 0 \clist_item:Nn \l_galley_club_penalties_clist {#1}
-        - \etex_clubpenalties:D #1 ~
+        - \tex_clubpenalties:D #1 ~
       }
       \exp_stop_f:
   }
@@ -835,9 +835,9 @@
   {
     \int_eval:n
       {
-        \etex_interlinepenalties:D \etex_interlinepenalties:D 0 \exp_stop_f:
+        \tex_interlinepenalties:D \tex_interlinepenalties:D 0 \exp_stop_f:
         + 0 \clist_item:Nn \l_galley_club_penalties_clist {#1}
-        - \etex_clubpenalties:D #1 ~
+        - \tex_clubpenalties:D #1 ~
       }
       \exp_stop_f:
   }
@@ -849,23 +849,23 @@
   {
     \clist_set:Nx #1
       {
-        \int_step_function:nN { \etex_clubpenalties:D 0 - 1 }
+        \int_step_function:nN { \tex_clubpenalties:D 0 - 1 }
           \__galley_save_display_club_penalties:n
       }
   }
 \cs_new:Npn \__galley_save_display_club_penalties:n #1
-  { \int_value:w \etex_clubpenalties:D \int_eval:n {#1} , }
+  { \int_value:w \tex_clubpenalties:D \int_eval:n {#1} , }
 \cs_new_protected:Npn \galley_save_display_widow_penalties:N #1
   {
     \clist_set:Nx #1
       {
-        \int_step_function:nN { \etex_displaywidowpenalties:D 0 - 1 }
+        \int_step_function:nN { \tex_displaywidowpenalties:D 0 - 1 }
           \__galley_save_display_widow_penalties:n
       }
   }
 \cs_new:Npn \__galley_save_display_widow_penalties:n #1
   {
-    \int_value:w \etex_displaywidowpenalties:D
+    \int_value:w \tex_displaywidowpenalties:D
       \int_eval:n {#1} ,
   }
 \cs_new_protected:Npn \galley_save_widow_penalties:N #1
@@ -872,14 +872,14 @@
   {
     \clist_set:Nx #1
       {
-        \int_step_function:nN { \etex_widowpenalties:D 0 - 1 }
+        \int_step_function:nN { \tex_widowpenalties:D 0 - 1 }
           \__galley_save_widow_penalties:n
       }
   }
 \cs_new:Npn \__galley_save_widow_penalties:n #1
-  { \int_value:w \etex_widowpenalties:D \int_eval:n {#1} , }
+  { \int_value:w \tex_widowpenalties:D \int_eval:n {#1} , }
 \cs_new_protected:Npn \galley_interline_penalty:
-  { \int_value:w \etex_interlinepenalties:D \etex_interlinepenalties:D 0 \exp_stop_f: }
+  { \int_value:w \tex_interlinepenalties:D \tex_interlinepenalties:D 0 \exp_stop_f: }
 \__kernel_msg_new:nnn { galley } { no-line-to-end }
   { There's~no~line~here~to~end. }
 \cs_set:Npn \clearpage

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2018-05-13 21:56:47 UTC (rev 47705)
@@ -21,7 +21,7 @@
 %% File: xgalley.dtx Copyright (C) 1999-2001, 2004-2009 Frank Mittelbach
 %%                             (C) 2010-2012,2014,2016-2018 The LaTeX3 Project
 \RequirePackage{xparse}
-\ProvidesExplPackage{xgalley}{2018-04-30}{}
+\ProvidesExplPackage{xgalley}{2018-05-12}{}
   {L3 Experimental galley}
 \RequirePackage{xparse,xtemplate,l3galley}
 \clist_new:N \l__galley_tmpa_clist

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2018-05-13 21:56:47 UTC (rev 47705)
@@ -24,6 +24,7 @@
 %% l3file.dtx  (with options: `package')
 %% l3skip.dtx  (with options: `package')
 %% l3keys.dtx  (with options: `package')
+%% l3intarray.dtx  (with options: `package')
 %% l3fp.dtx  (with options: `package')
 %% l3fp-aux.dtx  (with options: `package')
 %% l3fp-traps.dtx  (with options: `package')
@@ -37,7 +38,7 @@
 %% l3fp-trig.dtx  (with options: `package')
 %% l3fp-convert.dtx  (with options: `package')
 %% l3fp-random.dtx  (with options: `package')
-%% l3intarray.dtx  (with options: `package')
+%% l3fparray.dtx  (with options: `package')
 %% l3sort.dtx  (with options: `package')
 %% l3tl-analysis.dtx  (with options: `package')
 %% l3regex.dtx  (with options: `package')
@@ -239,8 +240,8 @@
       \LineBreak
       These are available in the engines\LineBreak
       - pdfTeX v1.40\LineBreak
-      - XeTeX v0.9994\LineBreak
-      - LuaTeX v0.70\LineBreak
+      - XeTeX v0.99992\LineBreak
+      - LuaTeX v0.76\LineBreak
       - e-(u)pTeX mid-2012\LineBreak
       or later.\LineBreak
       \LineBreak
@@ -249,7 +250,14 @@
     \expandafter\ifx\csname pdfstrcmp\endcsname\relax
     \else
       \expandafter\ifx\csname pdftexversion\endcsname\relax
-        1%
+        \expandafter\ifx\csname Ucharcat\endcsname\relax
+          \ifx\csname kanjiskip\endcsname\relax
+          \else
+            1%
+          \fi
+        \else
+          1%
+        \fi
       \else
         \ifnum\pdftexversion<140 \else 1\fi
       \fi
@@ -256,7 +264,7 @@
     \fi
     \expandafter\ifx\csname directlua\endcsname\relax
     \else
-      \ifnum\luatexversion<70 \else 1\fi
+      \ifnum\luatexversion<76 \else 1\fi
     \fi
     =0 %
       \newlinechar`\^^J %
@@ -685,6 +693,775 @@
   \__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                \tex_beginL:D
+  \__kernel_primitive:NN \beginR                \tex_beginR:D
+  \__kernel_primitive:NN \botmarks              \tex_botmarks:D
+  \__kernel_primitive:NN \clubpenalties         \tex_clubpenalties:D
+  \__kernel_primitive:NN \currentgrouplevel     \tex_currentgrouplevel:D
+  \__kernel_primitive:NN \currentgrouptype      \tex_currentgrouptype:D
+  \__kernel_primitive:NN \currentifbranch       \tex_currentifbranch:D
+  \__kernel_primitive:NN \currentiflevel        \tex_currentiflevel:D
+  \__kernel_primitive:NN \currentiftype         \tex_currentiftype:D
+  \__kernel_primitive:NN \detokenize            \tex_detokenize:D
+  \__kernel_primitive:NN \dimexpr               \tex_dimexpr:D
+  \__kernel_primitive:NN \displaywidowpenalties \tex_displaywidowpenalties:D
+  \__kernel_primitive:NN \endL                  \tex_endL:D
+  \__kernel_primitive:NN \endR                  \tex_endR:D
+  \__kernel_primitive:NN \eTeXrevision          \tex_eTeXrevision:D
+  \__kernel_primitive:NN \eTeXversion           \tex_eTeXversion:D
+  \__kernel_primitive:NN \everyeof              \tex_everyeof:D
+  \__kernel_primitive:NN \firstmarks            \tex_firstmarks:D
+  \__kernel_primitive:NN \fontchardp            \tex_fontchardp:D
+  \__kernel_primitive:NN \fontcharht            \tex_fontcharht:D
+  \__kernel_primitive:NN \fontcharic            \tex_fontcharic:D
+  \__kernel_primitive:NN \fontcharwd            \tex_fontcharwd:D
+  \__kernel_primitive:NN \glueexpr              \tex_glueexpr:D
+  \__kernel_primitive:NN \glueshrink            \tex_glueshrink:D
+  \__kernel_primitive:NN \glueshrinkorder       \tex_glueshrinkorder:D
+  \__kernel_primitive:NN \gluestretch           \tex_gluestretch:D
+  \__kernel_primitive:NN \gluestretchorder      \tex_gluestretchorder:D
+  \__kernel_primitive:NN \gluetomu              \tex_gluetomu:D
+  \__kernel_primitive:NN \ifcsname              \tex_ifcsname:D
+  \__kernel_primitive:NN \ifdefined             \tex_ifdefined:D
+  \__kernel_primitive:NN \iffontchar            \tex_iffontchar:D
+  \__kernel_primitive:NN \interactionmode       \tex_interactionmode:D
+  \__kernel_primitive:NN \interlinepenalties    \tex_interlinepenalties:D
+  \__kernel_primitive:NN \lastlinefit           \tex_lastlinefit:D
+  \__kernel_primitive:NN \lastnodetype          \tex_lastnodetype:D
+  \__kernel_primitive:NN \marks                 \tex_marks:D
+  \__kernel_primitive:NN \middle                \tex_middle:D
+  \__kernel_primitive:NN \muexpr                \tex_muexpr:D
+  \__kernel_primitive:NN \mutoglue              \tex_mutoglue:D
+  \__kernel_primitive:NN \numexpr               \tex_numexpr:D
+  \__kernel_primitive:NN \pagediscards          \tex_pagediscards:D
+  \__kernel_primitive:NN \parshapedimen         \tex_parshapedimen:D
+  \__kernel_primitive:NN \parshapeindent        \tex_parshapeindent:D
+  \__kernel_primitive:NN \parshapelength        \tex_parshapelength:D
+  \__kernel_primitive:NN \predisplaydirection   \tex_predisplaydirection:D
+  \__kernel_primitive:NN \protected             \tex_protected:D
+  \__kernel_primitive:NN \readline              \tex_readline:D
+  \__kernel_primitive:NN \savinghyphcodes       \tex_savinghyphcodes:D
+  \__kernel_primitive:NN \savingvdiscards       \tex_savingvdiscards:D
+  \__kernel_primitive:NN \scantokens            \tex_scantokens:D
+  \__kernel_primitive:NN \showgroups            \tex_showgroups:D
+  \__kernel_primitive:NN \showifs               \tex_showifs:D
+  \__kernel_primitive:NN \showtokens            \tex_showtokens:D
+  \__kernel_primitive:NN \splitbotmarks         \tex_splitbotmarks:D
+  \__kernel_primitive:NN \splitdiscards         \tex_splitdiscards:D
+  \__kernel_primitive:NN \splitfirstmarks       \tex_splitfirstmarks:D
+  \__kernel_primitive:NN \TeXXeTstate           \tex_TeXXeTstate:D
+  \__kernel_primitive:NN \topmarks              \tex_topmarks:D
+  \__kernel_primitive:NN \tracingassigns        \tex_tracingassigns:D
+  \__kernel_primitive:NN \tracinggroups         \tex_tracinggroups:D
+  \__kernel_primitive:NN \tracingifs            \tex_tracingifs:D
+  \__kernel_primitive:NN \tracingnesting        \tex_tracingnesting:D
+  \__kernel_primitive:NN \tracingscantokens     \tex_tracingscantokens:D
+  \__kernel_primitive:NN \unexpanded            \tex_unexpanded:D
+  \__kernel_primitive:NN \unless                \tex_unless:D
+  \__kernel_primitive:NN \widowpenalties        \tex_widowpenalties:D
+  \__kernel_primitive:NN \pdfannot              \tex_pdfannot:D
+  \__kernel_primitive:NN \pdfcatalog            \tex_pdfcatalog:D
+  \__kernel_primitive:NN \pdfcompresslevel      \tex_pdfcompresslevel:D
+  \__kernel_primitive:NN \pdfcolorstack         \tex_pdfcolorstack:D
+  \__kernel_primitive:NN \pdfcolorstackinit     \tex_pdfcolorstackinit:D
+  \__kernel_primitive:NN \pdfcreationdate       \tex_pdfcreationdate:D
+  \__kernel_primitive:NN \pdfdecimaldigits      \tex_pdfdecimaldigits:D
+  \__kernel_primitive:NN \pdfdest               \tex_pdfdest:D
+  \__kernel_primitive:NN \pdfdestmargin         \tex_pdfdestmargin:D
+  \__kernel_primitive:NN \pdfendlink            \tex_pdfendlink:D
+  \__kernel_primitive:NN \pdfendthread          \tex_pdfendthread:D
+  \__kernel_primitive:NN \pdffontattr           \tex_pdffontattr:D
+  \__kernel_primitive:NN \pdffontname           \tex_pdffontname:D
+  \__kernel_primitive:NN \pdffontobjnum         \tex_pdffontobjnum:D
+  \__kernel_primitive:NN \pdfgamma              \tex_pdfgamma:D
+  \__kernel_primitive:NN \pdfimageapplygamma    \tex_pdfimageapplygamma:D
+  \__kernel_primitive:NN \pdfimagegamma         \tex_pdfimagegamma:D
+  \__kernel_primitive:NN \pdfgentounicode       \tex_pdfgentounicode:D
+  \__kernel_primitive:NN \pdfglyphtounicode     \tex_pdfglyphtounicode:D
+  \__kernel_primitive:NN \pdfhorigin            \tex_pdfhorigin:D
+  \__kernel_primitive:NN \pdfimagehicolor       \tex_pdfimagehicolor:D
+  \__kernel_primitive:NN \pdfimageresolution    \tex_pdfimageresolution:D
+  \__kernel_primitive:NN \pdfincludechars       \tex_pdfincludechars:D
+  \__kernel_primitive:NN \pdfinclusioncopyfonts \tex_pdfinclusioncopyfonts:D
+  \__kernel_primitive:NN \pdfinclusionerrorlevel
+    \tex_pdfinclusionerrorlevel:D
+  \__kernel_primitive:NN \pdfinfo               \tex_pdfinfo:D
+  \__kernel_primitive:NN \pdflastannot          \tex_pdflastannot:D
+  \__kernel_primitive:NN \pdflastlink           \tex_pdflastlink:D
+  \__kernel_primitive:NN \pdflastobj            \tex_pdflastobj:D
+  \__kernel_primitive:NN \pdflastxform          \tex_pdflastxform:D
+  \__kernel_primitive:NN \pdflastximage         \tex_pdflastximage:D
+  \__kernel_primitive:NN \pdflastximagecolordepth
+    \tex_pdflastximagecolordepth:D
+  \__kernel_primitive:NN \pdflastximagepages    \tex_pdflastximagepages:D
+  \__kernel_primitive:NN \pdflinkmargin         \tex_pdflinkmargin:D
+  \__kernel_primitive:NN \pdfliteral            \tex_pdfliteral:D
+  \__kernel_primitive:NN \pdfminorversion       \tex_pdfminorversion:D
+  \__kernel_primitive:NN \pdfnames              \tex_pdfnames:D
+  \__kernel_primitive:NN \pdfobj                \tex_pdfobj:D
+  \__kernel_primitive:NN \pdfobjcompresslevel   \tex_pdfobjcompresslevel:D
+  \__kernel_primitive:NN \pdfoutline            \tex_pdfoutline:D
+  \__kernel_primitive:NN \pdfoutput             \tex_pdfoutput:D
+  \__kernel_primitive:NN \pdfpageattr           \tex_pdfpageattr:D
+  \__kernel_primitive:NN \pdfpagebox            \tex_pdfpagebox:D
+  \__kernel_primitive:NN \pdfpageref            \tex_pdfpageref:D
+  \__kernel_primitive:NN \pdfpageresources      \tex_pdfpageresources:D
+  \__kernel_primitive:NN \pdfpagesattr          \tex_pdfpagesattr:D
+  \__kernel_primitive:NN \pdfrefobj             \tex_pdfrefobj:D
+  \__kernel_primitive:NN \pdfrefxform           \tex_pdfrefxform:D
+  \__kernel_primitive:NN \pdfrefximage          \tex_pdfrefximage:D
+  \__kernel_primitive:NN \pdfrestore            \tex_pdfrestore:D
+  \__kernel_primitive:NN \pdfretval             \tex_pdfretval:D
+  \__kernel_primitive:NN \pdfsave               \tex_pdfsave:D
+  \__kernel_primitive:NN \pdfsetmatrix          \tex_pdfsetmatrix:D
+  \__kernel_primitive:NN \pdfstartlink          \tex_pdfstartlink:D
+  \__kernel_primitive:NN \pdfstartthread        \tex_pdfstartthread:D
+  \__kernel_primitive:NN \pdfsuppressptexinfo   \tex_pdfsuppressptexinfo:D
+  \__kernel_primitive:NN \pdfthread             \tex_pdfthread:D
+  \__kernel_primitive:NN \pdfthreadmargin       \tex_pdfthreadmargin:D
+  \__kernel_primitive:NN \pdftrailer            \tex_pdftrailer:D
+  \__kernel_primitive:NN \pdfuniqueresname      \tex_pdfuniqueresname:D
+  \__kernel_primitive:NN \pdfvorigin            \tex_pdfvorigin:D
+  \__kernel_primitive:NN \pdfxform              \tex_pdfxform:D
+  \__kernel_primitive:NN \pdfxformattr          \tex_pdfxformattr:D
+  \__kernel_primitive:NN \pdfxformname          \tex_pdfxformname:D
+  \__kernel_primitive:NN \pdfxformresources     \tex_pdfxformresources:D
+  \__kernel_primitive:NN \pdfximage             \tex_pdfximage:D
+  \__kernel_primitive:NN \pdfximagebbox         \tex_pdfximagebbox:D
+  \__kernel_primitive:NN \ifpdfabsdim           \tex_ifabsdim:D
+  \__kernel_primitive:NN \ifpdfabsnum           \tex_ifabsnum:D
+  \__kernel_primitive:NN \ifpdfprimitive        \tex_ifprimitive:D
+  \__kernel_primitive:NN \pdfadjustspacing      \tex_adjustspacing:D
+  \__kernel_primitive:NN \pdfcopyfont           \tex_copyfont:D
+  \__kernel_primitive:NN \pdfdraftmode          \tex_draftmode:D
+  \__kernel_primitive:NN \pdfeachlinedepth      \tex_eachlinedepth:D
+  \__kernel_primitive:NN \pdfeachlineheight     \tex_eachlineheight:D
+  \__kernel_primitive:NN \pdffilemoddate        \tex_filemoddate:D
+  \__kernel_primitive:NN \pdffilesize           \tex_filesize:D
+  \__kernel_primitive:NN \pdffirstlineheight    \tex_firstlineheight:D
+  \__kernel_primitive:NN \pdffontexpand         \tex_fontexpand:D
+  \__kernel_primitive:NN \pdffontsize           \tex_fontsize:D
+  \__kernel_primitive:NN \pdfignoreddimen       \tex_ignoreddimen:D
+  \__kernel_primitive:NN \pdfinsertht           \tex_insertht:D
+  \__kernel_primitive:NN \pdflastlinedepth      \tex_lastlinedepth:D
+  \__kernel_primitive:NN \pdflastxpos           \tex_lastxpos:D
+  \__kernel_primitive:NN \pdflastypos           \tex_lastypos:D
+  \__kernel_primitive:NN \pdfmapfile            \tex_mapfile:D
+  \__kernel_primitive:NN \pdfmapline            \tex_mapline:D
+  \__kernel_primitive:NN \pdfmdfivesum          \tex_mdfivesum:D
+  \__kernel_primitive:NN \pdfnoligatures        \tex_noligatures:D
+  \__kernel_primitive:NN \pdfnormaldeviate      \tex_normaldeviate:D
+  \__kernel_primitive:NN \pdfpageheight         \tex_pageheight:D
+  \__kernel_primitive:NN \pdfpagewidth          \tex_pagewidth:D
+  \__kernel_primitive:NN \pdfpkmode             \tex_pkmode:D
+  \__kernel_primitive:NN \pdfpkresolution       \tex_pkresolution:D
+  \__kernel_primitive:NN \pdfprimitive          \tex_primitive:D
+  \__kernel_primitive:NN \pdfprotrudechars      \tex_protrudechars:D
+  \__kernel_primitive:NN \pdfpxdimen            \tex_pxdimen:D
+  \__kernel_primitive:NN \pdfrandomseed         \tex_randomseed:D
+  \__kernel_primitive:NN \pdfsavepos            \tex_savepos:D
+  \__kernel_primitive:NN \pdfstrcmp             \tex_strcmp:D
+  \__kernel_primitive:NN \pdfsetrandomseed      \tex_setrandomseed:D
+  \__kernel_primitive:NN \pdfshellescape        \tex_shellescape:D
+  \__kernel_primitive:NN \pdftracingfonts       \tex_tracingfonts:D
+  \__kernel_primitive:NN \pdfuniformdeviate     \tex_uniformdeviate:D
+  \__kernel_primitive:NN \pdftexbanner          \tex_pdftexbanner:D
+  \__kernel_primitive:NN \pdftexrevision        \tex_pdftexrevision:D
+  \__kernel_primitive:NN \pdftexversion         \tex_pdftexversion:D
+  \__kernel_primitive:NN \efcode                \tex_efcode:D
+  \__kernel_primitive:NN \ifincsname            \tex_ifincsname:D
+  \__kernel_primitive:NN \leftmarginkern        \tex_leftmarginkern:D
+  \__kernel_primitive:NN \letterspacefont       \tex_letterspacefont:D
+  \__kernel_primitive:NN \lpcode                \tex_lpcode:D
+  \__kernel_primitive:NN \quitvmode             \tex_quitvmode:D
+  \__kernel_primitive:NN \rightmarginkern       \tex_rightmarginkern:D
+  \__kernel_primitive:NN \rpcode                \tex_rpcode:D
+  \__kernel_primitive:NN \synctex               \tex_synctex:D
+  \__kernel_primitive:NN \tagcode               \tex_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
+    {
+      \tex_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
+    \tex_suppressfontnotfounderror:D
+  \__kernel_primitive:NN \XeTeXcharclass        \tex_XeTeXcharclass:D
+  \__kernel_primitive:NN \XeTeXcharglyph        \tex_XeTeXcharglyph:D
+  \__kernel_primitive:NN \XeTeXcountfeatures    \tex_XeTeXcountfeatures:D
+  \__kernel_primitive:NN \XeTeXcountglyphs      \tex_XeTeXcountglyphs:D
+  \__kernel_primitive:NN \XeTeXcountselectors   \tex_XeTeXcountselectors:D
+  \__kernel_primitive:NN \XeTeXcountvariations  \tex_XeTeXcountvariations:D
+  \__kernel_primitive:NN \XeTeXdefaultencoding  \tex_XeTeXdefaultencoding:D
+  \__kernel_primitive:NN \XeTeXdashbreakstate   \tex_XeTeXdashbreakstate:D
+  \__kernel_primitive:NN \XeTeXfeaturecode      \tex_XeTeXfeaturecode:D
+  \__kernel_primitive:NN \XeTeXfeaturename      \tex_XeTeXfeaturename:D
+  \__kernel_primitive:NN \XeTeXfindfeaturebyname
+    \tex_XeTeXfindfeaturebyname:D
+  \__kernel_primitive:NN \XeTeXfindselectorbyname
+    \tex_XeTeXfindselectorbyname:D
+  \__kernel_primitive:NN \XeTeXfindvariationbyname
+    \tex_XeTeXfindvariationbyname:D
+  \__kernel_primitive:NN \XeTeXfirstfontchar    \tex_XeTeXfirstfontchar:D
+  \__kernel_primitive:NN \XeTeXfonttype         \tex_XeTeXfonttype:D
+  \__kernel_primitive:NN \XeTeXgenerateactualtext
+    \tex_XeTeXgenerateactualtext:D
+  \__kernel_primitive:NN \XeTeXglyph            \tex_XeTeXglyph:D
+  \__kernel_primitive:NN \XeTeXglyphbounds      \tex_XeTeXglyphbounds:D
+  \__kernel_primitive:NN \XeTeXglyphindex       \tex_XeTeXglyphindex:D
+  \__kernel_primitive:NN \XeTeXglyphname        \tex_XeTeXglyphname:D
+  \__kernel_primitive:NN \XeTeXinputencoding    \tex_XeTeXinputencoding:D
+  \__kernel_primitive:NN \XeTeXinputnormalization
+    \tex_XeTeXinputnormalization:D
+  \__kernel_primitive:NN \XeTeXinterchartokenstate
+    \tex_XeTeXinterchartokenstate:D
+  \__kernel_primitive:NN \XeTeXinterchartoks    \tex_XeTeXinterchartoks:D
+  \__kernel_primitive:NN \XeTeXisdefaultselector
+    \tex_XeTeXisdefaultselector:D
+  \__kernel_primitive:NN \XeTeXisexclusivefeature
+    \tex_XeTeXisexclusivefeature:D
+  \__kernel_primitive:NN \XeTeXlastfontchar     \tex_XeTeXlastfontchar:D
+  \__kernel_primitive:NN \XeTeXlinebreakskip    \tex_XeTeXlinebreakskip:D
+  \__kernel_primitive:NN \XeTeXlinebreaklocale  \tex_XeTeXlinebreaklocale:D
+  \__kernel_primitive:NN \XeTeXlinebreakpenalty \tex_XeTeXlinebreakpenalty:D
+  \__kernel_primitive:NN \XeTeXOTcountfeatures  \tex_XeTeXOTcountfeatures:D
+  \__kernel_primitive:NN \XeTeXOTcountlanguages \tex_XeTeXOTcountlanguages:D
+  \__kernel_primitive:NN \XeTeXOTcountscripts   \tex_XeTeXOTcountscripts:D
+  \__kernel_primitive:NN \XeTeXOTfeaturetag     \tex_XeTeXOTfeaturetag:D
+  \__kernel_primitive:NN \XeTeXOTlanguagetag    \tex_XeTeXOTlanguagetag:D
+  \__kernel_primitive:NN \XeTeXOTscripttag      \tex_XeTeXOTscripttag:D
+  \__kernel_primitive:NN \XeTeXpdffile          \tex_XeTeXpdffile:D
+  \__kernel_primitive:NN \XeTeXpdfpagecount     \tex_XeTeXpdfpagecount:D
+  \__kernel_primitive:NN \XeTeXpicfile          \tex_XeTeXpicfile:D
+  \__kernel_primitive:NN \XeTeXrevision         \tex_XeTeXrevision:D
+  \__kernel_primitive:NN \XeTeXselectorname     \tex_XeTeXselectorname:D
+  \__kernel_primitive:NN \XeTeXtracingfonts     \tex_XeTeXtracingfonts:D
+  \__kernel_primitive:NN \XeTeXupwardsmode      \tex_XeTeXupwardsmode:D
+  \__kernel_primitive:NN \XeTeXuseglyphmetrics  \tex_XeTeXuseglyphmetrics:D
+  \__kernel_primitive:NN \XeTeXvariation        \tex_XeTeXvariation:D
+  \__kernel_primitive:NN \XeTeXvariationdefault \tex_XeTeXvariationdefault:D
+  \__kernel_primitive:NN \XeTeXvariationmax     \tex_XeTeXvariationmax:D
+  \__kernel_primitive:NN \XeTeXvariationmin     \tex_XeTeXvariationmin:D
+  \__kernel_primitive:NN \XeTeXvariationname    \tex_XeTeXvariationname:D
+  \__kernel_primitive:NN \XeTeXversion          \tex_XeTeXversion:D
+  \__kernel_primitive:NN \mdfivesum             \tex_mdfivesum:D
+  \__kernel_primitive:NN \ifprimitive           \tex_ifprimitive:D
+  \__kernel_primitive:NN \primitive             \tex_primitive:D
+  \__kernel_primitive:NN \shellescape           \tex_shellescape:D
+  \__kernel_primitive:NN \alignmark             \tex_alignmark:D
+  \__kernel_primitive:NN \aligntab              \tex_aligntab:D
+  \__kernel_primitive:NN \attribute             \tex_attribute:D
+  \__kernel_primitive:NN \attributedef          \tex_attributedef:D
+  \__kernel_primitive:NN \automaticdiscretionary
+    \tex_automaticdiscretionary:D
+  \__kernel_primitive:NN \automatichyphenmode   \tex_automatichyphenmode:D
+  \__kernel_primitive:NN \automatichyphenpenalty
+    \tex_automatichyphenpenalty:D
+  \__kernel_primitive:NN \begincsname           \tex_begincsname:D
+  \__kernel_primitive:NN \breakafterdirmode     \tex_breakafterdirmode:D
+  \__kernel_primitive:NN \catcodetable          \tex_catcodetable:D
+  \__kernel_primitive:NN \clearmarks            \tex_clearmarks:D
+  \__kernel_primitive:NN \crampeddisplaystyle   \tex_crampeddisplaystyle:D
+  \__kernel_primitive:NN \crampedscriptscriptstyle
+    \tex_crampedscriptscriptstyle:D
+  \__kernel_primitive:NN \crampedscriptstyle    \tex_crampedscriptstyle:D
+  \__kernel_primitive:NN \crampedtextstyle      \tex_crampedtextstyle:D
+  \__kernel_primitive:NN \directlua             \tex_directlua:D
+  \__kernel_primitive:NN \dviextension          \tex_dviextension:D
+  \__kernel_primitive:NN \dvifeedback           \tex_dvifeedback:D
+  \__kernel_primitive:NN \dvivariable           \tex_dvivariable:D
+  \__kernel_primitive:NN \etoksapp              \tex_etoksapp:D
+  \__kernel_primitive:NN \etokspre              \tex_etokspre:D
+  \__kernel_primitive:NN \explicithyphenpenalty \tex_explicithyphenpenalty:D
+  \__kernel_primitive:NN \expanded              \tex_expanded:D
+  \__kernel_primitive:NN \explicitdiscretionary \tex_explicitdiscretionary:D
+  \__kernel_primitive:NN \firstvalidlanguage    \tex_firstvalidlanguage:D
+  \__kernel_primitive:NN \fontid                \tex_fontid:D
+  \__kernel_primitive:NN \formatname            \tex_formatname:D
+  \__kernel_primitive:NN \hjcode                \tex_hjcode:D
+  \__kernel_primitive:NN \hpack                 \tex_hpack:D
+  \__kernel_primitive:NN \hyphenationbounds     \tex_hyphenationbounds:D
+  \__kernel_primitive:NN \hyphenationmin        \tex_hyphenationmin:D
+  \__kernel_primitive:NN \hyphenpenaltymode     \tex_hyphenpenaltymode:D
+  \__kernel_primitive:NN \gleaders              \tex_gleaders:D
+  \__kernel_primitive:NN \initcatcodetable      \tex_initcatcodetable:D
+  \__kernel_primitive:NN \lastnamedcs           \tex_lastnamedcs:D
+  \__kernel_primitive:NN \latelua               \tex_latelua:D
+  \__kernel_primitive:NN \letcharcode           \tex_letcharcode:D
+  \__kernel_primitive:NN \luaescapestring       \tex_luaescapestring:D
+  \__kernel_primitive:NN \luafunction           \tex_luafunction:D
+  \__kernel_primitive:NN \luatexbanner          \tex_luatexbanner:D
+  \__kernel_primitive:NN \luatexrevision        \tex_luatexrevision:D
+  \__kernel_primitive:NN \luatexversion         \tex_luatexversion:D
+  \__kernel_primitive:NN \mathdelimitersmode    \tex_mathdelimitersmode:D
+  \__kernel_primitive:NN \mathdisplayskipmode   \tex_mathdisplayskipmode:D
+  \__kernel_primitive:NN \matheqnogapstep       \tex_matheqnogapstep:D
+  \__kernel_primitive:NN \mathnolimitsmode      \tex_mathnolimitsmode:D
+  \__kernel_primitive:NN \mathoption            \tex_mathoption:D
+  \__kernel_primitive:NN \mathpenaltiesmode     \tex_mathpenaltiesmode:D
+  \__kernel_primitive:NN \mathrulesfam          \tex_mathrulesfam:D
+  \__kernel_primitive:NN \mathscriptsmode       \tex_mathscriptsmode:D
+  \__kernel_primitive:NN \mathscriptboxmode     \tex_mathscriptboxmode:D
+  \__kernel_primitive:NN \mathstyle             \tex_mathstyle:D
+  \__kernel_primitive:NN \mathsurroundmode      \tex_mathsurroundmode:D
+  \__kernel_primitive:NN \mathsurroundskip      \tex_mathsurroundskip:D
+  \__kernel_primitive:NN \nohrule               \tex_nohrule:D
+  \__kernel_primitive:NN \nokerns               \tex_nokerns:D
+  \__kernel_primitive:NN \noligs                \tex_noligs:D
+  \__kernel_primitive:NN \nospaces              \tex_nospaces:D
+  \__kernel_primitive:NN \novrule               \tex_novrule:D
+  \__kernel_primitive:NN \outputbox             \tex_outputbox:D
+  \__kernel_primitive:NN \pagebottomoffset      \tex_pagebottomoffset:D
+  \__kernel_primitive:NN \pageleftoffset        \tex_pageleftoffset:D
+  \__kernel_primitive:NN \pagerightoffset       \tex_pagerightoffset:D
+  \__kernel_primitive:NN \pagetopoffset         \tex_pagetopoffset:D
+  \__kernel_primitive:NN \pdfextension          \tex_pdfextension:D
+  \__kernel_primitive:NN \pdffeedback           \tex_pdffeedback:D
+  \__kernel_primitive:NN \pdfvariable           \tex_pdfvariable:D
+  \__kernel_primitive:NN \postexhyphenchar      \tex_postexhyphenchar:D
+  \__kernel_primitive:NN \posthyphenchar        \tex_posthyphenchar:D
+  \__kernel_primitive:NN \prebinoppenalty       \tex_prebinoppenalty:D
+  \__kernel_primitive:NN \predisplaygapfactor   \tex_predisplaygapfactor:D
+  \__kernel_primitive:NN \preexhyphenchar       \tex_preexhyphenchar:D
+  \__kernel_primitive:NN \prehyphenchar         \tex_prehyphenchar:D
+  \__kernel_primitive:NN \prerelpenalty         \tex_prerelpenalty:D
+  \__kernel_primitive:NN \savecatcodetable      \tex_savecatcodetable:D
+  \__kernel_primitive:NN \scantextokens         \tex_scantextokens:D
+  \__kernel_primitive:NN \setfontid             \tex_setfontid:D
+  \__kernel_primitive:NN \shapemode             \tex_shapemode:D
+  \__kernel_primitive:NN \suppressifcsnameerror \tex_suppressifcsnameerror:D
+  \__kernel_primitive:NN \suppresslongerror     \tex_suppresslongerror:D
+  \__kernel_primitive:NN \suppressmathparerror  \tex_suppressmathparerror:D
+  \__kernel_primitive:NN \suppressoutererror    \tex_suppressoutererror:D
+  \__kernel_primitive:NN \suppressprimitiveerror
+    \tex_suppressprimitiveerror:D
+  \__kernel_primitive:NN \toksapp               \tex_toksapp:D
+  \__kernel_primitive:NN \tokspre               \tex_tokspre:D
+  \__kernel_primitive:NN \tpack                 \tex_tpack:D
+  \__kernel_primitive:NN \vpack                 \tex_vpack:D
+  \__kernel_primitive:NN \bodydir               \tex_bodydir:D
+  \__kernel_primitive:NN \boxdir                \tex_boxdir:D
+  \__kernel_primitive:NN \leftghost             \tex_leftghost:D
+  \__kernel_primitive:NN \linedir               \tex_linedir:D
+  \__kernel_primitive:NN \localbrokenpenalty    \tex_localbrokenpenalty:D
+  \__kernel_primitive:NN \localinterlinepenalty \tex_localinterlinepenalty:D
+  \__kernel_primitive:NN \localleftbox          \tex_localleftbox:D
+  \__kernel_primitive:NN \localrightbox         \tex_localrightbox:D
+  \__kernel_primitive:NN \mathdir               \tex_mathdir:D
+  \__kernel_primitive:NN \pagedir               \tex_pagedir:D
+  \__kernel_primitive:NN \pardir                \tex_pardir:D
+  \__kernel_primitive:NN \rightghost            \tex_rightghost:D
+  \__kernel_primitive:NN \textdir               \tex_textdir:D
+  \__kernel_primitive:NN \adjustspacing         \tex_adjustspacing:D
+  \__kernel_primitive:NN \copyfont              \tex_copyfont:D
+  \__kernel_primitive:NN \draftmode             \tex_draftmode:D
+  \__kernel_primitive:NN \expandglyphsinfont    \tex_fontexpand:D
+  \__kernel_primitive:NN \ifabsdim              \tex_ifabsdim:D
+  \__kernel_primitive:NN \ifabsnum              \tex_ifabsnum:D
+  \__kernel_primitive:NN \ignoreligaturesinfont \tex_ignoreligaturesinfont:D
+  \__kernel_primitive:NN \insertht              \tex_insertht:D
+  \__kernel_primitive:NN \lastsavedboxresourceindex
+    \tex_pdflastxform:D
+  \__kernel_primitive:NN \lastsavedimageresourceindex
+    \tex_pdflastximage:D
+  \__kernel_primitive:NN \lastsavedimageresourcepages
+    \tex_pdflastximagepages:D
+  \__kernel_primitive:NN \lastxpos              \tex_lastxpos:D
+  \__kernel_primitive:NN \lastypos              \tex_lastypos:D
+  \__kernel_primitive:NN \normaldeviate         \tex_normaldeviate:D
+  \__kernel_primitive:NN \outputmode            \tex_pdfoutput:D
+  \__kernel_primitive:NN \pageheight            \tex_pageheight:D
+  \__kernel_primitive:NN \pagewidth             \tex_pagewith:D
+  \__kernel_primitive:NN \protrudechars         \tex_protrudechars:D
+  \__kernel_primitive:NN \pxdimen               \tex_pxdimen:D
+  \__kernel_primitive:NN \randomseed            \tex_randomseed:D
+  \__kernel_primitive:NN \useboxresource        \tex_pdfrefxform:D
+  \__kernel_primitive:NN \useimageresource      \tex_pdfrefximage:D
+  \__kernel_primitive:NN \savepos               \tex_savepos:D
+  \__kernel_primitive:NN \saveboxresource       \tex_pdfxform:D
+  \__kernel_primitive:NN \saveimageresource     \tex_pdfximage:D
+  \__kernel_primitive:NN \setrandomseed         \tex_setrandomseed:D
+  \__kernel_primitive:NN \tracingfonts          \tex_tracingfonts:D
+  \__kernel_primitive:NN \uniformdeviate        \tex_uniformdeviate:D
+  \__kernel_primitive:NN \Uchar                 \tex_Uchar:D
+  \__kernel_primitive:NN \Ucharcat              \tex_Ucharcat:D
+  \__kernel_primitive:NN \Udelcode              \tex_Udelcode:D
+  \__kernel_primitive:NN \Udelcodenum           \tex_Udelcodenum:D
+  \__kernel_primitive:NN \Udelimiter            \tex_Udelimiter:D
+  \__kernel_primitive:NN \Udelimiterover        \tex_Udelimiterover:D
+  \__kernel_primitive:NN \Udelimiterunder       \tex_Udelimiterunder:D
+  \__kernel_primitive:NN \Uhextensible          \tex_Uhextensible:D
+  \__kernel_primitive:NN \Umathaccent           \tex_Umathaccent:D
+  \__kernel_primitive:NN \Umathaxis             \tex_Umathaxis:D
+  \__kernel_primitive:NN \Umathbinbinspacing    \tex_Umathbinbinspacing:D
+  \__kernel_primitive:NN \Umathbinclosespacing  \tex_Umathbinclosespacing:D
+  \__kernel_primitive:NN \Umathbininnerspacing  \tex_Umathbininnerspacing:D
+  \__kernel_primitive:NN \Umathbinopenspacing   \tex_Umathbinopenspacing:D
+  \__kernel_primitive:NN \Umathbinopspacing     \tex_Umathbinopspacing:D
+  \__kernel_primitive:NN \Umathbinordspacing    \tex_Umathbinordspacing:D
+  \__kernel_primitive:NN \Umathbinpunctspacing  \tex_Umathbinpunctspacing:D
+  \__kernel_primitive:NN \Umathbinrelspacing    \tex_Umathbinrelspacing:D
+  \__kernel_primitive:NN \Umathchar             \tex_Umathchar:D
+  \__kernel_primitive:NN \Umathcharclass        \tex_Umathcharclass:D
+  \__kernel_primitive:NN \Umathchardef          \tex_Umathchardef:D
+  \__kernel_primitive:NN \Umathcharfam          \tex_Umathcharfam:D
+  \__kernel_primitive:NN \Umathcharnum          \tex_Umathcharnum:D
+  \__kernel_primitive:NN \Umathcharnumdef       \tex_Umathcharnumdef:D
+  \__kernel_primitive:NN \Umathcharslot         \tex_Umathcharslot:D
+  \__kernel_primitive:NN \Umathclosebinspacing  \tex_Umathclosebinspacing:D
+  \__kernel_primitive:NN \Umathcloseclosespacing
+    \tex_Umathcloseclosespacing:D
+  \__kernel_primitive:NN \Umathcloseinnerspacing
+    \tex_Umathcloseinnerspacing:D
+  \__kernel_primitive:NN \Umathcloseopenspacing \tex_Umathcloseopenspacing:D
+  \__kernel_primitive:NN \Umathcloseopspacing   \tex_Umathcloseopspacing:D
+  \__kernel_primitive:NN \Umathcloseordspacing  \tex_Umathcloseordspacing:D
+  \__kernel_primitive:NN \Umathclosepunctspacing
+    \tex_Umathclosepunctspacing:D
+  \__kernel_primitive:NN \Umathcloserelspacing  \tex_Umathcloserelspacing:D
+  \__kernel_primitive:NN \Umathcode             \tex_Umathcode:D
+  \__kernel_primitive:NN \Umathcodenum          \tex_Umathcodenum:D
+  \__kernel_primitive:NN \Umathconnectoroverlapmin
+    \tex_Umathconnectoroverlapmin:D
+  \__kernel_primitive:NN \Umathfractiondelsize  \tex_Umathfractiondelsize:D
+  \__kernel_primitive:NN \Umathfractiondenomdown
+    \tex_Umathfractiondenomdown:D
+  \__kernel_primitive:NN \Umathfractiondenomvgap
+    \tex_Umathfractiondenomvgap:D
+  \__kernel_primitive:NN \Umathfractionnumup    \tex_Umathfractionnumup:D
+  \__kernel_primitive:NN \Umathfractionnumvgap  \tex_Umathfractionnumvgap:D
+  \__kernel_primitive:NN \Umathfractionrule     \tex_Umathfractionrule:D
+  \__kernel_primitive:NN \Umathinnerbinspacing  \tex_Umathinnerbinspacing:D
+  \__kernel_primitive:NN \Umathinnerclosespacing
+    \tex_Umathinnerclosespacing:D
+  \__kernel_primitive:NN \Umathinnerinnerspacing
+    \tex_Umathinnerinnerspacing:D
+  \__kernel_primitive:NN \Umathinneropenspacing \tex_Umathinneropenspacing:D
+  \__kernel_primitive:NN \Umathinneropspacing   \tex_Umathinneropspacing:D
+  \__kernel_primitive:NN \Umathinnerordspacing  \tex_Umathinnerordspacing:D
+  \__kernel_primitive:NN \Umathinnerpunctspacing
+    \tex_Umathinnerpunctspacing:D
+  \__kernel_primitive:NN \Umathinnerrelspacing  \tex_Umathinnerrelspacing:D
+  \__kernel_primitive:NN \Umathlimitabovebgap   \tex_Umathlimitabovebgap:D
+  \__kernel_primitive:NN \Umathlimitabovekern   \tex_Umathlimitabovekern:D
+  \__kernel_primitive:NN \Umathlimitabovevgap   \tex_Umathlimitabovevgap:D
+  \__kernel_primitive:NN \Umathlimitbelowbgap   \tex_Umathlimitbelowbgap:D
+  \__kernel_primitive:NN \Umathlimitbelowkern   \tex_Umathlimitbelowkern:D
+  \__kernel_primitive:NN \Umathlimitbelowvgap   \tex_Umathlimitbelowvgap:D
+  \__kernel_primitive:NN \Umathnolimitsubfactor \tex_Umathnolimitsubfactor:D
+  \__kernel_primitive:NN \Umathnolimitsupfactor \tex_Umathnolimitsupfactor:D
+  \__kernel_primitive:NN \Umathopbinspacing     \tex_Umathopbinspacing:D
+  \__kernel_primitive:NN \Umathopclosespacing   \tex_Umathopclosespacing:D
+  \__kernel_primitive:NN \Umathopenbinspacing   \tex_Umathopenbinspacing:D
+  \__kernel_primitive:NN \Umathopenclosespacing \tex_Umathopenclosespacing:D
+  \__kernel_primitive:NN \Umathopeninnerspacing \tex_Umathopeninnerspacing:D
+  \__kernel_primitive:NN \Umathopenopenspacing  \tex_Umathopenopenspacing:D
+  \__kernel_primitive:NN \Umathopenopspacing    \tex_Umathopenopspacing:D
+  \__kernel_primitive:NN \Umathopenordspacing   \tex_Umathopenordspacing:D
+  \__kernel_primitive:NN \Umathopenpunctspacing \tex_Umathopenpunctspacing:D
+  \__kernel_primitive:NN \Umathopenrelspacing   \tex_Umathopenrelspacing:D
+  \__kernel_primitive:NN \Umathoperatorsize     \tex_Umathoperatorsize:D
+  \__kernel_primitive:NN \Umathopinnerspacing   \tex_Umathopinnerspacing:D
+  \__kernel_primitive:NN \Umathopopenspacing    \tex_Umathopopenspacing:D
+  \__kernel_primitive:NN \Umathopopspacing      \tex_Umathopopspacing:D
+  \__kernel_primitive:NN \Umathopordspacing     \tex_Umathopordspacing:D
+  \__kernel_primitive:NN \Umathoppunctspacing   \tex_Umathoppunctspacing:D
+  \__kernel_primitive:NN \Umathoprelspacing     \tex_Umathoprelspacing:D
+  \__kernel_primitive:NN \Umathordbinspacing    \tex_Umathordbinspacing:D
+  \__kernel_primitive:NN \Umathordclosespacing  \tex_Umathordclosespacing:D
+  \__kernel_primitive:NN \Umathordinnerspacing  \tex_Umathordinnerspacing:D
+  \__kernel_primitive:NN \Umathordopenspacing   \tex_Umathordopenspacing:D
+  \__kernel_primitive:NN \Umathordopspacing     \tex_Umathordopspacing:D
+  \__kernel_primitive:NN \Umathordordspacing    \tex_Umathordordspacing:D
+  \__kernel_primitive:NN \Umathordpunctspacing  \tex_Umathordpunctspacing:D
+  \__kernel_primitive:NN \Umathordrelspacing    \tex_Umathordrelspacing:D
+  \__kernel_primitive:NN \Umathoverbarkern      \tex_Umathoverbarkern:D
+  \__kernel_primitive:NN \Umathoverbarrule      \tex_Umathoverbarrule:D
+  \__kernel_primitive:NN \Umathoverbarvgap      \tex_Umathoverbarvgap:D
+  \__kernel_primitive:NN \Umathoverdelimiterbgap
+     \tex_Umathoverdelimiterbgap:D
+  \__kernel_primitive:NN \Umathoverdelimitervgap
+    \tex_Umathoverdelimitervgap:D
+  \__kernel_primitive:NN \Umathpunctbinspacing  \tex_Umathpunctbinspacing:D
+  \__kernel_primitive:NN \Umathpunctclosespacing
+    \tex_Umathpunctclosespacing:D
+  \__kernel_primitive:NN \Umathpunctinnerspacing
+    \tex_Umathpunctinnerspacing:D
+  \__kernel_primitive:NN \Umathpunctopenspacing \tex_Umathpunctopenspacing:D
+  \__kernel_primitive:NN \Umathpunctopspacing   \tex_Umathpunctopspacing:D
+  \__kernel_primitive:NN \Umathpunctordspacing  \tex_Umathpunctordspacing:D
+  \__kernel_primitive:NN \Umathpunctpunctspacing
+    \tex_Umathpunctpunctspacing:D
+  \__kernel_primitive:NN \Umathpunctrelspacing  \tex_Umathpunctrelspacing:D
+  \__kernel_primitive:NN \Umathquad             \tex_Umathquad:D
+  \__kernel_primitive:NN \Umathradicaldegreeafter
+    \tex_Umathradicaldegreeafter:D
+  \__kernel_primitive:NN \Umathradicaldegreebefore
+    \tex_Umathradicaldegreebefore:D
+  \__kernel_primitive:NN \Umathradicaldegreeraise
+    \tex_Umathradicaldegreeraise:D
+  \__kernel_primitive:NN \Umathradicalkern      \tex_Umathradicalkern:D
+  \__kernel_primitive:NN \Umathradicalrule      \tex_Umathradicalrule:D
+  \__kernel_primitive:NN \Umathradicalvgap      \tex_Umathradicalvgap:D
+  \__kernel_primitive:NN \Umathrelbinspacing    \tex_Umathrelbinspacing:D
+  \__kernel_primitive:NN \Umathrelclosespacing  \tex_Umathrelclosespacing:D
+  \__kernel_primitive:NN \Umathrelinnerspacing  \tex_Umathrelinnerspacing:D
+  \__kernel_primitive:NN \Umathrelopenspacing   \tex_Umathrelopenspacing:D
+  \__kernel_primitive:NN \Umathrelopspacing     \tex_Umathrelopspacing:D
+  \__kernel_primitive:NN \Umathrelordspacing    \tex_Umathrelordspacing:D
+  \__kernel_primitive:NN \Umathrelpunctspacing  \tex_Umathrelpunctspacing:D
+  \__kernel_primitive:NN \Umathrelrelspacing    \tex_Umathrelrelspacing:D
+  \__kernel_primitive:NN \Umathskewedfractionhgap
+    \tex_Umathskewedfractionhgap:D
+  \__kernel_primitive:NN \Umathskewedfractionvgap
+    \tex_Umathskewedfractionvgap:D
+  \__kernel_primitive:NN \Umathspaceafterscript \tex_Umathspaceafterscript:D
+  \__kernel_primitive:NN \Umathstackdenomdown   \tex_Umathstackdenomdown:D
+  \__kernel_primitive:NN \Umathstacknumup       \tex_Umathstacknumup:D
+  \__kernel_primitive:NN \Umathstackvgap        \tex_Umathstackvgap:D
+  \__kernel_primitive:NN \Umathsubshiftdown     \tex_Umathsubshiftdown:D
+  \__kernel_primitive:NN \Umathsubshiftdrop     \tex_Umathsubshiftdrop:D
+  \__kernel_primitive:NN \Umathsubsupshiftdown  \tex_Umathsubsupshiftdown:D
+  \__kernel_primitive:NN \Umathsubsupvgap       \tex_Umathsubsupvgap:D
+  \__kernel_primitive:NN \Umathsubtopmax        \tex_Umathsubtopmax:D
+  \__kernel_primitive:NN \Umathsupbottommin     \tex_Umathsupbottommin:D
+  \__kernel_primitive:NN \Umathsupshiftdrop     \tex_Umathsupshiftdrop:D
+  \__kernel_primitive:NN \Umathsupshiftup       \tex_Umathsupshiftup:D
+  \__kernel_primitive:NN \Umathsupsubbottommax  \tex_Umathsupsubbottommax:D
+  \__kernel_primitive:NN \Umathunderbarkern     \tex_Umathunderbarkern:D
+  \__kernel_primitive:NN \Umathunderbarrule     \tex_Umathunderbarrule:D
+  \__kernel_primitive:NN \Umathunderbarvgap     \tex_Umathunderbarvgap:D
+  \__kernel_primitive:NN \Umathunderdelimiterbgap
+    \tex_Umathunderdelimiterbgap:D
+  \__kernel_primitive:NN \Umathunderdelimitervgap
+    \tex_Umathunderdelimitervgap:D
+  \__kernel_primitive:NN \Unosubscript          \tex_Unosubscript:D
+  \__kernel_primitive:NN \Unosuperscript        \tex_Unosuperscript:D
+  \__kernel_primitive:NN \Uoverdelimiter        \tex_Uoverdelimiter:D
+  \__kernel_primitive:NN \Uradical              \tex_Uradical:D
+  \__kernel_primitive:NN \Uroot                 \tex_Uroot:D
+  \__kernel_primitive:NN \Uskewed               \tex_Uskewed:D
+  \__kernel_primitive:NN \Uskewedwithdelims     \tex_Uskewedwithdelims:D
+  \__kernel_primitive:NN \Ustack                \tex_Ustack:D
+  \__kernel_primitive:NN \Ustartdisplaymath     \tex_Ustartdisplaymath:D
+  \__kernel_primitive:NN \Ustartmath            \tex_Ustartmath:D
+  \__kernel_primitive:NN \Ustopdisplaymath      \tex_Ustopdisplaymath:D
+  \__kernel_primitive:NN \Ustopmath             \tex_Ustopmath:D
+  \__kernel_primitive:NN \Usubscript            \tex_Usubscript:D
+  \__kernel_primitive:NN \Usuperscript          \tex_Usuperscript:D
+  \__kernel_primitive:NN \Uunderdelimiter       \tex_Uunderdelimiter:D
+  \__kernel_primitive:NN \Uvextensible          \tex_Uvextensible:D
+  \__kernel_primitive:NN \autospacing           \tex_autospacing:D
+  \__kernel_primitive:NN \autoxspacing          \tex_autoxspacing:D
+  \__kernel_primitive:NN \dtou                  \tex_dtou:D
+  \__kernel_primitive:NN \epTeXinputencoding    \tex_epTeXinputencoding:D
+  \__kernel_primitive:NN \epTeXversion          \tex_epTeXversion:D
+  \__kernel_primitive:NN \euc                   \tex_euc:D
+  \__kernel_primitive:NN \ifdbox                \tex_ifdbox:D
+  \__kernel_primitive:NN \ifddir                \tex_ifddir:D
+  \__kernel_primitive:NN \ifmdir                \tex_ifmdir:D
+  \__kernel_primitive:NN \iftbox                \tex_iftbox:D
+  \__kernel_primitive:NN \iftdir                \tex_iftdir:D
+  \__kernel_primitive:NN \ifybox                \tex_ifybox:D
+  \__kernel_primitive:NN \ifydir                \tex_ifydir:D
+  \__kernel_primitive:NN \inhibitglue           \tex_inhibitglue:D
+  \__kernel_primitive:NN \inhibitxspcode        \tex_inhibitxspcode:D
+  \__kernel_primitive:NN \jcharwidowpenalty     \tex_jcharwidowpenalty:D
+  \__kernel_primitive:NN \jfam                  \tex_jfam:D
+  \__kernel_primitive:NN \jfont                 \tex_jfont:D
+  \__kernel_primitive:NN \jis                   \tex_jis:D
+  \__kernel_primitive:NN \kanjiskip             \tex_kanjiskip:D
+  \__kernel_primitive:NN \kansuji               \tex_kansuji:D
+  \__kernel_primitive:NN \kansujichar           \tex_kansujichar:D
+  \__kernel_primitive:NN \kcatcode              \tex_kcatcode:D
+  \__kernel_primitive:NN \kuten                 \tex_kuten:D
+  \__kernel_primitive:NN \noautospacing         \tex_noautospacing:D
+  \__kernel_primitive:NN \noautoxspacing        \tex_noautoxspacing:D
+  \__kernel_primitive:NN \postbreakpenalty      \tex_postbreakpenalty:D
+  \__kernel_primitive:NN \prebreakpenalty       \tex_prebreakpenalty:D
+  \__kernel_primitive:NN \ptexminorversion      \tex_ptexminorversion:D
+  \__kernel_primitive:NN \ptexrevision          \tex_ptexrevision:D
+  \__kernel_primitive:NN \ptexversion           \tex_ptexversion:D
+  \__kernel_primitive:NN \showmode              \tex_showmode:D
+  \__kernel_primitive:NN \sjis                  \tex_sjis:D
+  \__kernel_primitive:NN \tate                  \tex_tate:D
+  \__kernel_primitive:NN \tbaselineshift        \tex_tbaselineshift:D
+  \__kernel_primitive:NN \tfont                 \tex_tfont:D
+  \__kernel_primitive:NN \xkanjiskip            \tex_xkanjiskip:D
+  \__kernel_primitive:NN \xspcode               \tex_xspcode:D
+  \__kernel_primitive:NN \ybaselineshift        \tex_ybaselineshift:D
+  \__kernel_primitive:NN \yoko                  \tex_yoko:D
+  \__kernel_primitive:NN \disablecjktoken       \tex_disablecjktoken:D
+  \__kernel_primitive:NN \enablecjktoken        \tex_enablecjktoken:D
+  \__kernel_primitive:NN \forcecjktoken         \tex_forcecjktoken:D
+  \__kernel_primitive:NN \kchar                 \tex_kchar:D
+  \__kernel_primitive:NN \kchardef              \tex_kchardef:D
+  \__kernel_primitive:NN \kuten                 \tex_kuten:D
+  \__kernel_primitive:NN \ucs                   \tex_ucs:D
+  \__kernel_primitive:NN \uptexrevision         \tex_uptexrevision:D
+  \__kernel_primitive:NN \uptexversion          \tex_uptexversion:D
+\tex_endgroup:D
+\tex_ifdefined:D \@@end
+  \tex_let:D \tex_end:D                  \@@end
+  \tex_let:D \tex_everydisplay:D         \frozen at everydisplay
+  \tex_let:D \tex_everymath:D            \frozen at 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_ifdefined:D \@@shipout
+    \tex_let:D \tex_shipout:D \@@shipout
+  \tex_fi:D
+  \tex_begingroup:D
+    \tex_edef:D \l_tmpa_tl { \tex_string:D \shipout }
+    \tex_edef:D \l_tmpb_tl { \tex_meaning:D \shipout }
+    \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
+    \tex_else:D
+      \tex_expandafter:D \@tfor \tex_expandafter:D \@tempa \tex_string:D :=
+        \CROP at shipout
+        \dup at shipout
+        \GPTorg at shipout
+        \LL at shipout
+        \mem at oldshipout
+        \opem at shipout
+        \pgfpages at originalshipout
+        \pr at shipout
+        \Shipout
+        \verso at orig@shipout
+        \do
+          {
+            \tex_edef:D \l_tmpb_tl
+              { \tex_expandafter:D \tex_meaning:D \@tempa }
+            \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
+              \tex_global:D \tex_expandafter:D \tex_let:D
+                \tex_expandafter:D \tex_shipout:D \@tempa
+            \tex_fi:D
+          }
+    \tex_fi:D
+  \tex_endgroup:D
+  \tex_let:D \tex_tracingfonts:D \tex_undefined:D
+  \tex_ifdefined:D \pdftracingfonts
+    \tex_let:D \tex_tracingfonts:D \pdftracingfonts
+  \tex_else:D
+    \tex_ifdefined:D \tex_directlua:D
+      \tex_directlua:D { tex.enableprimitives("@@", {"tracingfonts"}) }
+      \tex_let:D \tex_tracingfonts:D \luatextracingfonts
+    \tex_fi:D
+  \tex_fi:D
+\tex_fi:D
+\tex_ifdefined:D \luatexsuppressfontnotfounderror
+  \tex_let:D \tex_alignmark:D           \luatexalignmark
+  \tex_let:D \tex_aligntab:D            \luatexaligntab
+  \tex_let:D \tex_attribute:D           \luatexattribute
+  \tex_let:D \tex_attributedef:D        \luatexattributedef
+  \tex_let:D \tex_catcodetable:D        \luatexcatcodetable
+  \tex_let:D \tex_clearmarks:D          \luatexclearmarks
+  \tex_let:D \tex_crampeddisplaystyle:D \luatexcrampeddisplaystyle
+  \tex_let:D \tex_crampedscriptscriptstyle:D
+    \luatexcrampedscriptscriptstyle
+  \tex_let:D \tex_crampedscriptstyle:D  \luatexcrampedscriptstyle
+  \tex_let:D \tex_crampedtextstyle:D    \luatexcrampedtextstyle
+  \tex_let:D \tex_fontid:D              \luatexfontid
+  \tex_let:D \tex_formatname:D          \luatexformatname
+  \tex_let:D \tex_gleaders:D            \luatexgleaders
+  \tex_let:D \tex_initcatcodetable:D    \luatexinitcatcodetable
+  \tex_let:D \tex_latelua:D             \luatexlatelua
+  \tex_let:D \tex_luaescapestring:D     \luatexluaescapestring
+  \tex_let:D \tex_luafunction:D         \luatexluafunction
+  \tex_let:D \tex_mathstyle:D           \luatexmathstyle
+  \tex_let:D \tex_nokerns:D             \luatexnokerns
+  \tex_let:D \tex_noligs:D              \luatexnoligs
+  \tex_let:D \tex_outputbox:D           \luatexoutputbox
+  \tex_let:D \tex_pageleftoffset:D      \luatexpageleftoffset
+  \tex_let:D \tex_pagetopoffset:D       \luatexpagetopoffset
+  \tex_let:D \tex_postexhyphenchar:D    \luatexpostexhyphenchar
+  \tex_let:D \tex_posthyphenchar:D      \luatexposthyphenchar
+  \tex_let:D \tex_preexhyphenchar:D     \luatexpreexhyphenchar
+  \tex_let:D \tex_prehyphenchar:D       \luatexprehyphenchar
+  \tex_let:D \tex_savecatcodetable:D    \luatexsavecatcodetable
+  \tex_let:D \tex_scantextokens:D       \luatexscantextokens
+  \tex_let:D \tex_suppressifcsnameerror:D
+    \luatexsuppressifcsnameerror
+  \tex_let:D \tex_suppresslongerror:D   \luatexsuppresslongerror
+  \tex_let:D \tex_suppressmathparerror:D
+    \luatexsuppressmathparerror
+  \tex_let:D \tex_suppressoutererror:D  \luatexsuppressoutererror
+  \tex_let:D \tex_Uchar:D                  \luatexUchar
+  \tex_let:D \tex_suppressfontnotfounderror:D
+    \luatexsuppressfontnotfounderror
+  \tex_let:D \tex_bodydir:D             \luatexbodydir
+  \tex_let:D \tex_boxdir:D              \luatexboxdir
+  \tex_let:D \tex_leftghost:D           \luatexleftghost
+  \tex_let:D \tex_localbrokenpenalty:D  \luatexlocalbrokenpenalty
+  \tex_let:D \tex_localinterlinepenalty:D
+    \luatexlocalinterlinepenalty
+  \tex_let:D \tex_localleftbox:D        \luatexlocalleftbox
+  \tex_let:D \tex_localrightbox:D       \luatexlocalrightbox
+  \tex_let:D \tex_mathdir:D             \luatexmathdir
+  \tex_let:D \tex_pagebottomoffset:D    \luatexpagebottomoffset
+  \tex_let:D \tex_pagedir:D             \luatexpagedir
+  \tex_let:D \tex_pageheight:D             \luatexpageheight
+  \tex_let:D \tex_pagerightoffset:D     \luatexpagerightoffset
+  \tex_let:D \tex_pagewidth:D              \luatexpagewidth
+  \tex_let:D \tex_pardir:D              \luatexpardir
+  \tex_let:D \tex_rightghost:D          \luatexrightghost
+  \tex_let:D \tex_textdir:D             \luatextextdir
+\tex_fi:D
+\tex_ifnum:D 0
+  \tex_ifdefined:D \tex_pdftexversion:D 1 \tex_fi:D
+  \tex_ifdefined:D \tex_luatexversion:D 1 \tex_fi:D
+    = 0 %
+  \tex_let:D \tex_mapfile:D \tex_undefined:D
+  \tex_let:D \tex_mapline:D \tex_undefined:D
+\tex_fi:D
+\tex_ifdefined:D \tex_luatexversion:D
+  \tex_let:D \tex_pdftexbanner:D   \tex_undefined:D
+  \tex_let:D \tex_pdftexrevision:D \tex_undefined:D
+  \tex_let:D \tex_pdftexversion:D  \tex_undefined:D
+\tex_fi:D
+\tex_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 \tex_unexpanded:D  \normalunexpanded
+  \tex_let:D \tex_expanded:D    \normalexpanded
+\tex_fi:D
+\tex_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 \tex_showtokens:D       \normalshowtokens
+  \tex_let:D \tex_bodydir:D          \spac_directions_normal_body_dir
+  \tex_let:D \tex_pagedir:D          \spac_directions_normal_page_dir
+\tex_fi:D
+\tex_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
+\tex_begingroup: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
+    {
+      \tex_ifdefined:D #1
+        \tex_expandafter:D \use_ii:nn
+      \tex_fi:D
+        \use_none:n { \tex_global:D \tex_let:D #2 #1 }
+    }
+  \tex_xdef:D \__kernel_primitives:
+    {
+      \tex_unexpanded:D
+        {
   \__kernel_primitive:NN \beginL                \etex_beginL:D
   \__kernel_primitive:NN \beginR                \etex_beginR:D
   \__kernel_primitive:NN \botmarks              \etex_botmarks:D
@@ -781,7 +1558,7 @@
     \pdftex_pdfinclusionerrorlevel:D
   \__kernel_primitive:NN \pdfinfo               \pdftex_pdfinfo:D
   \__kernel_primitive:NN \pdflastannot          \pdftex_pdflastannot:D
-  \__kernel_primitive:NN \pdflastlink           \pfdftex_pdflastlink: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
@@ -834,7 +1611,7 @@
   \__kernel_primitive:NN \pdfeachlineheight     \pdftex_eachlineheight:D
   \__kernel_primitive:NN \pdffilemoddate        \pdftex_filemoddate:D
   \__kernel_primitive:NN \pdffilesize           \pdftex_filesize:D
-  \__kernel_primitive:NN \pdffirstlineheigh     \pdftex_firstlineheight: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
@@ -874,15 +1651,42 @@
   \__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 \mdfivesum             \pdftex_mdfivesum: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 \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 \suppressfontnotfounderror
     \xetex_suppressfontnotfounderror:D
   \__kernel_primitive:NN \XeTeXcharclass        \xetex_charclass:D
@@ -943,10 +1747,6 @@
   \__kernel_primitive:NN \XeTeXvariationname    \xetex_variationname:D
   \__kernel_primitive:NN \XeTeXrevision         \xetex_XeTeXrevision:D
   \__kernel_primitive:NN \XeTeXversion          \xetex_XeTeXversion:D
-  \__kernel_primitive:NN \mdfivesum             \pdftex_mdfivesum: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
@@ -1060,38 +1860,6 @@
   \__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
@@ -1287,6 +2055,8 @@
   \__kernel_primitive:NN \noautoxspacing        \ptex_noautoxspacing:D
   \__kernel_primitive:NN \postbreakpenalty      \ptex_postbreakpenalty:D
   \__kernel_primitive:NN \prebreakpenalty       \ptex_prebreakpenalty:D
+  \__kernel_primitive:NN \ptexminorversion      \ptex_ptexminorversion:D
+  \__kernel_primitive:NN \ptexrevision          \ptex_ptexrevision:D
   \__kernel_primitive:NN \ptexversion           \ptex_ptexversion:D
   \__kernel_primitive:NN \showmode              \ptex_showmode:D
   \__kernel_primitive:NN \sjis                  \ptex_sjis:D
@@ -1304,164 +2074,12 @@
   \__kernel_primitive:NN \kchardef              \uptex_kchardef:D
   \__kernel_primitive:NN \kuten                 \uptex_kuten:D
   \__kernel_primitive:NN \ucs                   \uptex_ucs:D
+  \__kernel_primitive:NN \uptexrevision         \uptex_uptexrevision:D
   \__kernel_primitive:NN \uptexversion          \uptex_uptexversion:D
+        }
+    }
+  \__kernel_primitives:
 \tex_endgroup:D
-\etex_ifdefined:D \@@end
-  \tex_let:D \tex_end:D                  \@@end
-  \tex_let:D \tex_everydisplay:D         \frozen at everydisplay
-  \tex_let:D \tex_everymath:D            \frozen at 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
-  \etex_ifdefined:D \@@shipout
-    \tex_let:D \tex_shipout:D \@@shipout
-  \tex_fi:D
-  \tex_begingroup:D
-    \tex_edef:D \l_tmpa_tl { \tex_string:D \shipout }
-    \tex_edef:D \l_tmpb_tl { \tex_meaning:D \shipout }
-    \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
-    \tex_else:D
-      \tex_expandafter:D \@tfor \tex_expandafter:D \@tempa \tex_string:D :=
-        \CROP at shipout
-        \dup at shipout
-        \GPTorg at shipout
-        \LL at shipout
-        \mem at oldshipout
-        \opem at shipout
-        \pgfpages at originalshipout
-        \pr at shipout
-        \Shipout
-        \verso at orig@shipout
-        \do
-          {
-            \tex_edef:D \l_tmpb_tl
-              { \tex_expandafter:D \tex_meaning:D \@tempa }
-            \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
-              \tex_global:D \tex_expandafter:D \tex_let:D
-                \tex_expandafter:D \tex_shipout:D \@tempa
-            \tex_fi:D
-          }
-    \tex_fi:D
-  \tex_endgroup:D
-  \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-2018 The LaTeX3 project
 \tex_let:D \if_true:           \tex_iftrue:D
 \tex_let:D \if_false:          \tex_iffalse:D
@@ -1468,7 +2086,7 @@
 \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 \reverse_if:N       \tex_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
@@ -1477,20 +2095,20 @@
 \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 \if_cs_exist:N      \tex_ifdefined:D
+\tex_let:D \if_cs_exist:w      \tex_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_not:n          \tex_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 \tl_to_str:n          \tex_detokenize:D
 \tex_let:D \token_to_str:N       \tex_string:D
-\tex_let:D \__kernel_tl_to_str:w \etex_detokenize:D
+\tex_let:D \__kernel_tl_to_str:w \tex_detokenize: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
@@ -1513,8 +2131,8 @@
     { \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_zero_int    = 0 ~
+\tex_ifdefined:D \tex_luatexversion:D
   \tex_chardef:D \c_max_register_int = 65 535 ~
 \tex_else:D
   \tex_mathchardef:D \c_max_register_int = 32 767 ~
@@ -1521,18 +2139,18 @@
 \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_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_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_protected:D \tex_long:D \tex_def:D \cs_set_protected_nopar:Npn
+  { \tex_protected:D \tex_def:D }
+\tex_protected:D \tex_long:D \tex_def:D \cs_set_protected_nopar:Npx
+  { \tex_protected:D \tex_edef:D }
+\tex_protected:D \tex_long:D \tex_def:D \cs_set_protected:Npn
+  { \tex_protected:D \tex_long:D \tex_def:D }
+\tex_protected:D \tex_long:D \tex_def:D \cs_set_protected:Npx
+  { \tex_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
@@ -1540,13 +2158,13 @@
 \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 }
+  { \tex_protected:D \tex_gdef:D }
 \cs_set_protected:Npn \cs_gset_protected_nopar:Npx
-  { \etex_protected:D \tex_xdef:D }
+  { \tex_protected:D \tex_xdef:D }
 \cs_set_protected:Npn \cs_gset_protected:Npn
-  { \etex_protected:D \tex_long:D \tex_gdef:D }
+  { \tex_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 }
+  { \tex_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
@@ -1554,7 +2172,7 @@
     \cs_set_nopar:Npx \l__exp_internal_tl {#1}
     \l__exp_internal_tl
   }
-\cs_set:Npn \use_x:n #1 { \luatex_expanded:D {#1} }
+\cs_set:Npn \use_x:n #1 { \tex_expanded:D {#1} }
 \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}
@@ -1607,6 +2225,26 @@
               { \__kernel_msg_error:nnn { kernel } { debug } {##1} }
           }
       }
+    \cs_set_protected:Npn \__debug_all_on:
+      {
+        \debug_on:n
+          {
+            check-declarations ,
+            check-expressions ,
+            deprecation ,
+            log-functions ,
+          }
+      }
+    \cs_set_protected:Npn \__debug_all_off:
+      {
+        \debug_off:n
+          {
+            check-declarations ,
+            check-expressions ,
+            deprecation ,
+            log-functions ,
+          }
+      }
   }
   {
     \cs_set_protected:Npn \debug_on:n #1
@@ -1900,43 +2538,43 @@
 \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 } { } }
+  { \__prg_generate_conditional_parm:NNNpnn \cs_set:Npn e }
 \cs_set_protected:Npn \prg_new_conditional:Npnn
-  { \__prg_generate_conditional_parm:nnNpnn { new } { } }
+  { \__prg_generate_conditional_parm:NNNpnn \cs_new:Npn e }
 \cs_set_protected:Npn \prg_set_protected_conditional:Npnn
-  { \__prg_generate_conditional_parm:nnNpnn { set } { _protected } }
+  { \__prg_generate_conditional_parm:NNNpnn \cs_set_protected:Npn p }
 \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#
+  { \__prg_generate_conditional_parm:NNNpnn \cs_new_protected:Npn p }
+\cs_set_protected:Npn \__prg_generate_conditional_parm:NNNpnn #1#2#3#4#
   {
     \use:x
       {
-        \__prg_generate_conditional:nnNnnnnn
+        \__prg_generate_conditional:nnNNNnnn
           \cs_split_function:N #3
       }
-      {#1} {#2} {#4}
+      #1 #2 {#4}
   }
 \cs_set_protected:Npn \prg_set_conditional:Nnn
-  { \__prg_generate_conditional_count:nnNnn { set } { } }
+  { \__prg_generate_conditional_count:NNNnn \cs_set:Npn e }
 \cs_set_protected:Npn \prg_new_conditional:Nnn
-  { \__prg_generate_conditional_count:nnNnn { new } { } }
+  { \__prg_generate_conditional_count:NNNnn \cs_new:Npn e }
 \cs_set_protected:Npn \prg_set_protected_conditional:Nnn
-  { \__prg_generate_conditional_count:nnNnn { set } { _protected } }
+  { \__prg_generate_conditional_count:NNNnn \cs_set_protected:Npn p }
 \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
+  { \__prg_generate_conditional_count:NNNnn \cs_new_protected:Npn p }
+\cs_set_protected:Npn \__prg_generate_conditional_count:NNNnn #1#2#3
   {
     \use:x
       {
-        \__prg_generate_conditional_count:nnNnnnn
+        \__prg_generate_conditional_count:nnNNNnn
         \cs_split_function:N #3
       }
-      {#1} {#2}
+      #1 #2
   }
-\cs_set_protected:Npn \__prg_generate_conditional_count:nnNnnnn #1#2#3#4#5
+\cs_set_protected:Npn \__prg_generate_conditional_count:nnNNNnn #1#2#3#4#5
   {
     \__kernel_cs_parm_from_arg_count:nnF
-      { \__prg_generate_conditional:nnNnnnnn {#1} {#2} #3 {#4} {#5} }
+      { \__prg_generate_conditional:nnNNNnnn {#1} {#2} #3 #4 #5 }
       { \tl_count:n {#2} }
       {
         \__kernel_msg_error:nnxx { kernel } { bad-number-of-arguments }
@@ -1945,7 +2583,7 @@
         \use_none:nn
       }
   }
-\cs_set_protected:Npn \__prg_generate_conditional:nnNnnnnn #1#2#3#4#5#6#7#8
+\cs_set_protected:Npn \__prg_generate_conditional:nnNNNnnn #1#2#3#4#5#6#7#8
   {
     \if_meaning:w \c_false_bool #3
       \__kernel_msg_error:nnx { kernel } { missing-colon }
@@ -1954,40 +2592,53 @@
     \fi:
     \use:x
       {
-        \exp_not:N \__prg_generate_conditional:nnnnnnw
-        \exp_not:n { {#4} {#5} {#1} {#2} {#6} {#8} }
+        \exp_not:N \__prg_generate_conditional:NNnnnnNw
+        \exp_not:n { #4 #5 {#1} {#2} {#6} }
+        \__prg_generate_conditional_test:w
+          #8 \q_mark
+            \__prg_generate_conditional_fast:nw
+          \prg_return_true: \else: \prg_return_false: \fi: \q_mark
+            \use_none:n
+        \exp_not:n { {#8} \use_i_ii:nnn }
         \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 ,
+\cs_set:Npn \__prg_generate_conditional_test:w
+    #1 \prg_return_true: \else: \prg_return_false: \fi: \q_mark #2
+  { #2 {#1} }
+\cs_set:Npn \__prg_generate_conditional_fast:nw #1#2 \exp_not:n #3
+  { \exp_not:n { {#1} \use_i:nn } }
+\cs_set_protected:Npn \__prg_generate_conditional:NNnnnnNw #1#2#3#4#5#6#7#8 ,
   {
-    \if_meaning:w \q_recursion_tail #7
+    \if_meaning:w \q_recursion_tail #8
       \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
     \fi:
-    \use:c { __prg_generate_ #7 _form:wnnnnnn }
-        \tl_if_empty:nF {#7}
+    \use:c { __prg_generate_ #8 _form:wNNnnnnN }
+        \tl_if_empty:nF {#8}
           {
             \__kernel_msg_error:nnxx
               { kernel } { conditional-form-unknown }
-              {#7} { \token_to_str:c { #3 : #4 } }
+              {#8} { \token_to_str:c { #3 : #4 } }
           }
-        \use_none:nnnnnnn
+        \use_none:nnnnnnnn
       \q_stop
-      {#1} {#2} {#3} {#4} {#5} {#6}
-    \__prg_generate_conditional:nnnnnnw {#1} {#2} {#3} {#4} {#5} {#6}
+      #1 #2 {#3} {#4} {#5} {#6} #7
+    \__prg_generate_conditional:NNnnnnNw #1 #2 {#3} {#4} {#5} {#6} #7
   }
-\cs_set_protected:Npn \__prg_generate_p_form:wnnnnnn
-    #1 \q_stop #2#3#4#5#6#7
+\cs_set_protected:Npn \__prg_generate_p_form:wNNnnnnN
+    #1 \q_stop #2#3#4#5#6#7#8
   {
-    \if_meaning:w \scan_stop: #3 \scan_stop:
+    \if_meaning:w e #3
       \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 }
+        #8
+          { \exp_args:Nc #2 { #4 _p: #5 } #6 }
+          { { #7 \exp_end: \c_true_bool \c_false_bool } }
+          { #7 \__prg_p_true:w \fi: \c_false_bool }
       }
       {
         \__kernel_msg_error:nnx { kernel } { protected-predicate }
@@ -1994,24 +2645,31 @@
           { \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
+\cs_set_protected:Npn \__prg_generate_T_form:wNNnnnnN
+    #1 \q_stop #2#3#4#5#6#7#8
   {
-    \exp_args:cc { cs_ #2 #3 :Npn } { #4 : #5 T } #6
-      { #7 \exp_end: \use:n \use_none:n }
+    #8
+      { \exp_args:Nc #2 { #4 : #5 T } #6 }
+      { { #7 \exp_end: \use:n \use_none:n } }
+      { #7 \exp_after:wN \use_ii:nn \fi: \use_none:n }
   }
-\cs_set_protected:Npn \__prg_generate_F_form:wnnnnnn
-    #1 \q_stop #2#3#4#5#6#7
+\cs_set_protected:Npn \__prg_generate_F_form:wNNnnnnN
+    #1 \q_stop #2#3#4#5#6#7#8
   {
-    \exp_args:cc { cs_ #2 #3 :Npn } { #4 : #5 F } #6
-      { #7 \exp_end: { } }
+    #8
+      { \exp_args:Nc #2 { #4 : #5 F } #6 }
+      { { #7 \exp_end: { } } }
+      { #7 \exp_after:wN \use_none:nn \fi: \use:n }
   }
-\cs_set_protected:Npn \__prg_generate_TF_form:wnnnnnn
-    #1 \q_stop #2#3#4#5#6#7
+\cs_set_protected:Npn \__prg_generate_TF_form:wNNnnnnN
+    #1 \q_stop #2#3#4#5#6#7#8
   {
-    \exp_args:cc { cs_ #2 #3 :Npn } { #4 : #5 TF } #6
-      { #7 \exp_end: }
+    #8
+      { \exp_args:Nc #2 { #4 : #5 TF } #6 }
+      { { #7 \exp_end: } }
+      { #7 \exp_after:wN \use_ii:nnn \fi: \use_ii:nn }
   }
+\cs_set:Npn \__prg_p_true:w \fi: \c_false_bool { \fi: \c_true_bool }
 \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
@@ -2083,9 +2741,9 @@
       \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:N #1 { \c_zero_int }
 \cs_set:Npn \__cs_to_str:w #1 \__cs_to_str:N
-  { - \int_value:w \fi: \exp_after:wN \c_zero }
+  { - \int_value:w \fi: \exp_after:wN \c_zero_int }
 \cs_set_protected:Npn \__cs_tmp:w #1
   {
     \cs_set:Npn \cs_split_function:N ##1
@@ -2747,6 +3405,12 @@
     \exp_after:wN #2
     \exp:w \__exp_eval_register:N #3
   }
+\cs_new:Npn \exp_last_unbraced:NNf #1#2#3
+  {
+    \exp_after:wN #1
+    \exp_after:wN #2
+    \exp:w \exp_end_continue_f:w #3
+  }
 \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
@@ -2764,6 +3428,13 @@
     \exp_after:wN #3
     \exp:w \__exp_eval_register:N #4
   }
+\cs_new:Npn \exp_last_unbraced:NNNf #1#2#3#4
+  {
+    \exp_after:wN #1
+    \exp_after:wN #2
+    \exp_after:wN #3
+    \exp:w \exp_end_continue_f:w #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 \::: }
@@ -2770,16 +3441,24 @@
 \cs_new:Npn \exp_last_unbraced:NnNo { \::n \::N \::o_unbraced \::: }
 \cs_new:Npn \exp_last_unbraced:NNNNo #1#2#3#4#5
   { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN #3 \exp_after:wN #4 #5 }
+\cs_new:Npn \exp_last_unbraced:NNNNf #1#2#3#4#5
+  {
+    \exp_after:wN #1
+    \exp_after:wN #2
+    \exp_after:wN #3
+    \exp_after:wN #4
+    \exp:w \exp_end_continue_f:w #5
+  }
 \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_eq:NN \__kernel_exp_not:w \etex_unexpanded:D
+\cs_new_eq:NN \__kernel_exp_not:w \tex_unexpanded:D
 \cs_new:Npn \exp_not:c #1 { \exp_after:wN \exp_not:N \cs:w #1 \cs_end: }
 \cs_new:Npn \exp_not:o #1 { \__kernel_exp_not:w \exp_after:wN {#1} }
 \cs_new:Npn \exp_not:f #1
-  { \etex_unexpanded:D \exp_after:wN { \exp:w \exp_end_continue_f:w #1 } }
+  { \tex_unexpanded:D \exp_after:wN { \exp:w \exp_end_continue_f:w #1 } }
 \cs_new:Npn \exp_not:V #1
   {
     \__kernel_exp_not:w \exp_after:wN
@@ -3287,7 +3966,7 @@
       }
       {
         \group_begin:
-          \exp_args:No \etex_everyeof:D
+          \exp_args:No \tex_everyeof:D
             { \c__tl_rescan_marker_tl \exp_not:N }
           \int_compare:nNnT \tex_endlinechar:D = { 32 }
             { \int_set:Nn \tex_endlinechar:D { -1 } }
@@ -3305,7 +3984,7 @@
       {
         \exp_after:wN \__tl_rescan:w
         \exp_after:wN \prg_do_nothing:
-        \etex_scantokens:D {#1}
+        \tex_scantokens:D {#1}
       }
   }
 \exp_args:Nno \use:nn
@@ -3355,7 +4034,7 @@
               \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}
+              \tex_scantokens:D {#1}
             }
           \c__tl_rescan_marker_tl
         }
@@ -3370,7 +4049,7 @@
             = { 10 } { ~ }
           \exp_after:wN \__tl_rescan:w
           \exp_after:wN \prg_do_nothing:
-          \etex_scantokens:D { #2 #1 }
+          \tex_scantokens:D { #2 #1 }
         }
     }
 \group_end:
@@ -3456,7 +4135,13 @@
 \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 ? } }
+  {
+    \__tl_if_empty_if:o { \use_none:n #1 ? }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
 \prg_generate_conditional_variant:Nnn \tl_if_blank:n
   { V , o } { p , T , F , TF }
 \prg_new_conditional:Npnn \tl_if_empty:N #1 { p , T , F , TF }
@@ -3480,17 +4165,19 @@
   }
 \prg_generate_conditional_variant:Nnn \tl_if_empty:n
   { V } { p , TF , T , F }
-\cs_new:Npn \__tl_if_empty_return:o #1
+\cs_new:Npn \__tl_if_empty_if:o #1
   {
     \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
       \__kernel_tl_to_str:w \exp_after:wN {#1} \q_nil
+  }
+\prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F }
+  {
+    \__tl_if_empty_if:o {#1}
       \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
@@ -3506,13 +4193,13 @@
     \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:
+      \exp_after:wN
+    \group_end:
+    \if_meaning:w \l__tl_internal_a_tl \l__tl_internal_b_tl
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 \tl_new:N \l__tl_internal_a_tl
 \tl_new:N \l__tl_internal_b_tl
@@ -3991,7 +4678,7 @@
       {
         \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
           {
-            \etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
+            \tex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
               { \exp_after:wN \l__tl_internal_a_tl }
           }
       }
@@ -4115,11 +4802,11 @@
   { 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_new:Npn \__str_if_eq_x:nn #1#2 { \tex_strcmp:D {#1} {#2} }
+\cs_if_exist:NT \tex_luatexversion:D
    {
-     \cs_set_eq:NN \lua_escape_x:n \luatex_luaescapestring:D
-     \cs_set_eq:NN \lua_now_x:n    \luatex_directlua:D
+     \cs_set_eq:NN \lua_escape_x:n \tex_luaescapestring:D
+     \cs_set_eq:NN \lua_now_x:n    \tex_directlua:D
      \cs_set:Npn \__str_if_eq_x:nn #1#2
        {
           \lua_now_x:n
@@ -4711,26 +5398,30 @@
   { c } { p , T , F , TF }
 \prg_new_conditional:Npnn \quark_if_nil:n #1 { p, T , F , TF }
   {
-    \__quark_if_empty_return:o
+    \__quark_if_empty_if:o
       { \__quark_if_nil:w {} #1 {} ? ! \q_nil ? ? ! }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 \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 }
   {
-    \__quark_if_empty_return:o
+    \__quark_if_empty_if:o
       { \__quark_if_no_value:w {} #1 {} ? ! \q_no_value ? ? ! }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 \cs_new:Npn \__quark_if_no_value:w #1 \q_no_value #2 ? #3 ? ! { #1 #2 }
 \prg_generate_conditional_variant:Nnn \quark_if_nil:n
   { V , o } { p , TF , T , F }
-\cs_new:Npn \__quark_if_empty_return:o #1
+\cs_new:Npn \__quark_if_empty_if:o #1
   {
     \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
       \__kernel_tl_to_str:w \exp_after:wN {#1} \q_nil
-      \prg_return_true:
-    \else:
-      \prg_return_false:
-    \fi:
   }
 \tl_new:N \g__scan_marks_tl
 \__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN s #1 } { }
@@ -5294,7 +5985,7 @@
 \seq_new:N \g_tmpb_seq
 %% File: l3int.dtx Copyright (C) 1990-2018 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:w       \tex_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
@@ -5389,6 +6080,13 @@
   }
 \cs_new:Npn \__int_mod:ww #1; #2;
   { #1 - ( \__int_div_truncate:NwNw #1 ; #2 ; ) * #2 }
+\cs_new:Npn \__kernel_int_add:nnn #1#2#3
+  {
+    \int_value:w \__int_eval:w #1
+      \if_int_compare:w #2 < \c_zero_int \exp_after:wN \reverse_if:N \fi:
+      \if_int_compare:w #1 < \c_zero_int + #2 + #3 \else: + #3 + #2 \fi:
+    \__int_eval_end:
+  }
 \cs_new_protected:Npn \int_new:N #1
   {
     \__kernel_chk_if_free_cs:N #1
@@ -5401,7 +6099,7 @@
   { {#1} { \__kernel_chk_expr:nNnN {#2} \__int_eval:w { } \int_const:Nn } }
 \cs_new_protected:Npn \int_const:Nn #1#2
   {
-    \int_compare:nNnTF {#2} < \c_zero
+    \int_compare:nNnTF {#2} < \c_zero_int
       {
         \int_new:N #1
         \tex_global:D
@@ -5421,12 +6119,12 @@
   }
 \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_if_exist:NT \tex_luatexversion:D  { 1 }
+  \cs_if_exist:NT \tex_disablecjktoken:D
+    { \if_int_compare:w \tex_jis:D "2121 = "3000 ~ 1 \fi: }
+  \cs_if_exist:NT \tex_XeTeXversion:D    { 1 } ~
+    \cs_if_exist:NTF \tex_disablecjktoken:D
+      { \cs_new_eq:NN \__int_constdef:Nw \tex_kchardef:D }
       { \cs_new_eq:NN \__int_constdef:Nw \tex_chardef:D }
     \__int_constdef:Nw \c__int_max_constdef_int 1114111 ~
 \else:
@@ -5434,9 +6132,9 @@
   \tex_mathchardef:D \c__int_max_constdef_int 32767 ~
 \fi:
 \__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
-\cs_new_protected:Npn \int_zero:N  #1 { #1 = \c_zero }
+\cs_new_protected:Npn \int_zero:N  #1 { #1 = \c_zero_int }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
-\cs_new_protected:Npn \int_gzero:N #1 { \tex_global:D #1 = \c_zero }
+\cs_new_protected:Npn \int_gzero:N #1 { \tex_global:D #1 = \c_zero_int }
 \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
@@ -5481,16 +6179,16 @@
 \cs_generate_variant:Nn \int_gsub:Nn { c }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \int_incr:N #1
-  { \tex_advance:D #1 \c_one }
+  { \tex_advance:D #1 \c_one_int }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \int_decr:N #1
-  { \tex_advance:D #1 - \c_one }
+  { \tex_advance:D #1 - \c_one_int }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \int_gincr:N #1
-  { \tex_global:D \tex_advance:D #1 \c_one }
+  { \tex_global:D \tex_advance:D #1 \c_one_int }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \int_gdecr:N #1
-  { \tex_global:D \tex_advance:D #1 - \c_one }
+  { \tex_global:D \tex_advance:D #1 - \c_one_int }
 \cs_generate_variant:Nn \int_incr:N  { c }
 \cs_generate_variant:Nn \int_decr:N  { c }
 \cs_generate_variant:Nn \int_gincr:N { c }
@@ -5507,7 +6205,7 @@
 \cs_new:Npn \int_use:c #1 { \tex_the:D \cs:w #1 \cs_end: }
 \cs_new_protected:Npn \__int_compare_error:
   {
-    \if_int_compare:w \c_zero \c_zero \fi:
+    \if_int_compare:w \c_zero_int \c_zero_int \fi:
     =
     \__int_compare_error:
   }
@@ -5515,7 +6213,7 @@
     #1#2 \q_stop
   {
     { }
-    \c_zero \fi:
+    \c_zero_int \fi:
     \__kernel_msg_expandable_error:nnn
       { kernel } { unknown-comparison } {#1}
     \prg_return_false:
@@ -5631,10 +6329,10 @@
   { { \__kernel_chk_expr:nNnN {#1} \__int_eval:w { } \int_if_even:n } }
 \prg_new_conditional:Npnn \int_if_even:n #1 { p , T , F , TF}
   {
-    \if_int_odd:w \__int_eval:w #1 \__int_eval_end:
+    \reverse_if:N \if_int_odd:w \__int_eval:w #1 \__int_eval_end:
+      \prg_return_true:
+    \else:
       \prg_return_false:
-    \else:
-      \prg_return_true:
     \fi:
   }
 \cs_new:Npn \int_while_do:nn #1#2
@@ -5717,10 +6415,10 @@
   }
 \cs_new:Npn \__int_step:wwwN #1; #2; #3; #4
   {
-    \int_compare:nNnTF {#2} > \c_zero
+    \int_compare:nNnTF {#2} > \c_zero_int
       { \__int_step:NwnnN > }
       {
-        \int_compare:nNnTF {#2} = \c_zero
+        \int_compare:nNnTF {#2} = \c_zero_int
           {
             \__kernel_msg_expandable_error:nnn
               { kernel } { zero-step } {#4}
@@ -6142,34 +6840,13 @@
 \cs_generate_variant:Nn \int_log:N { c }
 \cs_new_protected:Npn \int_log:n
   { \msg_log_eval:Nn \int_eval: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_one_int { 1 }
 \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 } ~
+      \cs_if_exist:NT \tex_luatexversion:D  { 1 }
+      \cs_if_exist:NT \tex_XeTeXversion:D    { 1 } ~
       "10FFFF
     \else:
       "FF
@@ -6184,6 +6861,46 @@
 \__kernel_deprecation_code:nn
   { \__kernel_deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } }
   { \tex_let:D \c_minus_one \c__int_minus_one }
+\cs_new_protected:Npn \__int_deprecated_constants:nn #1#2
+  {
+    #1 \c_zero                   {   0 } #2
+    #1 \c_one                    {   1 } #2
+    #1 \c_two                    {   2 } #2
+    #1 \c_three                  {   3 } #2
+    #1 \c_four                   {   4 } #2
+    #1 \c_five                   {   5 } #2
+    #1 \c_six                    {   6 } #2
+    #1 \c_seven                  {   7 } #2
+    #1 \c_eight                  {   8 } #2
+    #1 \c_nine                   {   9 } #2
+    #1 \c_ten                    {  10 } #2
+    #1 \c_eleven                 {  11 } #2
+    #1 \c_twelve                 {  12 } #2
+    #1 \c_thirteen               {  13 } #2
+    #1 \c_fourteen               {  14 } #2
+    #1 \c_fifteen                {  15 } #2
+    #1 \c_sixteen                {  16 } #2
+    #1 \c_thirty_two             {  32 } #2
+    #1 \c_one_hundred            { 100 } #2
+    #1 \c_two_hundred_fifty_five { 255 } #2
+    #1 \c_two_hundred_fifty_six  { 256 } #2
+    #1 \c_one_thousand         {  1000 } #2
+    #1 \c_ten_thousand         { 10000 } #2
+  }
+\__int_deprecated_constants:nn { \int_const:Nn } { }
+\__kernel_deprecation_code:nn
+  {
+    \__int_deprecated_constants:nn
+      { \__kernel_deprecation_error:Nnn } { { 2019-12-31 } }
+  }
+  {
+    \__int_deprecated_constants:nn
+      {
+        \exp_after:wN \use:nnn
+        \exp_after:wN \__int_constdef:Nw \exp_not:N
+      }
+      { \exp_stop_f: }
+  }
 \cs_new_eq:NN \__int_value:w \int_value:w
 %% File: l3flag.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 \cs_new_protected:Npn \flag_new:n #1
@@ -6287,10 +7004,16 @@
 \cs_generate_variant:Nn \bool_gset_eq:NN { Nc, cN, cc }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
 \cs_new_protected:Npn \bool_set:Nn #1#2
-  { \tex_chardef:D #1 = \bool_if_p:n {#2} }
+  {
+    \exp_last_unbraced:NNNf
+      \tex_chardef:D #1 = { \bool_if_p:n {#2} }
+  }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_global:N #1 } { }
 \cs_new_protected:Npn \bool_gset:Nn #1#2
-  { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} }
+  {
+    \exp_last_unbraced:NNNNf
+      \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 }
 \prg_new_conditional:Npnn \bool_if:N #1 { p , T , F , TF }
@@ -6333,8 +7056,10 @@
       \prg_return_false:
     \fi:
   }
-\cs_new:Npn \bool_if_p:n #1
+\cs_new:Npn \bool_if_p:n { \exp_args:Nf \__bool_if_p:n }
+\cs_new:Npn \__bool_if_p:n #1
   {
+    \tl_if_empty:oT { \use_none:nn #1 . } { \__bool_if_p_aux:w }
     \group_align_safe_begin:
     \exp_after:wN
     \group_align_safe_end:
@@ -6341,6 +7066,7 @@
     \exp:w \exp_end_continue_f:w % (
     \__bool_get_next:NN \use_i:nnnn #1 )
   }
+\cs_new:Npn \__bool_if_p_aux:w #1 \use_i:nnnn #2#3 {#2}
 \cs_new:Npn \__bool_get_next:NN #1#2
   {
     \use:c
@@ -6380,42 +7106,67 @@
 \cs_new:cpn { __bool_|_0: } | { \__bool_get_next:NN \use_i:nnnn }
 \cs_new:cpn { __bool_|_1: } | { \__bool_get_next:NN \use_iii:nnnn }
 \cs_new:cpn { __bool_|_2: } | { \__bool_get_next:NN \use_iii:nnnn }
-\prg_new_conditional:Npnn \bool_lazy_all:n #1 { p , T , F , TF }
+\cs_new:Npn \bool_lazy_all_p:n #1
   { \__bool_lazy_all:n #1 \q_recursion_tail \q_recursion_stop }
+\prg_new_conditional:Npnn \bool_lazy_all:n #1 { T , F , TF }
+  {
+    \if_predicate:w \bool_lazy_all_p:n {#1}
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
 \cs_new:Npn \__bool_lazy_all:n #1
   {
-    \quark_if_recursion_tail_stop_do:nn {#1} { \prg_return_true: }
+    \quark_if_recursion_tail_stop_do:nn {#1} { \c_true_bool }
     \bool_if:nF {#1}
-      { \use_i_delimit_by_q_recursion_stop:nw { \prg_return_false: } }
+      { \use_i_delimit_by_q_recursion_stop:nw { \c_false_bool } }
     \__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: }
+    \if_predicate:w
+        \bool_if:nTF {#1} { \bool_if_p:n {#2} } { \c_false_bool }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
-\prg_new_conditional:Npnn \bool_lazy_any:n #1 { p , T , F , TF }
+\cs_new:Npn \bool_lazy_any_p:n #1
   { \__bool_lazy_any:n #1 \q_recursion_tail \q_recursion_stop }
+\prg_new_conditional:Npnn \bool_lazy_any:n #1 { T , F , TF }
+  {
+    \if_predicate:w \bool_lazy_any_p:n {#1}
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
 \cs_new:Npn \__bool_lazy_any:n #1
   {
-    \quark_if_recursion_tail_stop_do:nn {#1} { \prg_return_false: }
+    \quark_if_recursion_tail_stop_do:nn {#1} { \c_false_bool }
     \bool_if:nT {#1}
-      { \use_i_delimit_by_q_recursion_stop:nw { \prg_return_true: } }
+      { \use_i_delimit_by_q_recursion_stop:nw { \c_true_bool } }
     \__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: } }
+    \if_predicate:w
+        \bool_if:nTF {#1} { \c_true_bool } { \bool_if_p:n {#2} }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 \cs_new:Npn \bool_not_p:n #1 { \bool_if_p:n { ! ( #1 ) } }
-\cs_new:Npn \bool_xor_p:nn #1#2
+\prg_new_conditional:Npnn \bool_xor:nn #1#2 { p , T , F , TF }
   {
-    \int_compare:nNnTF { \bool_if_p:n {#1} } = { \bool_if_p:n {#2} }
-      \c_false_bool
-      \c_true_bool
+    \bool_if:nT {#1} \reverse_if:N
+    \if_predicate:w \bool_if_p:n {#2}
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 \cs_new:Npn \bool_while_do:Nn #1#2
   { \bool_if:NT #1 { #2 \bool_while_do:Nn #1 {#2} } }
@@ -6512,9 +7263,9 @@
 \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: }
+  { \if_int_compare:w \if_false: { \fi: `} = \c_zero_int \fi: }
 \cs_new:Npn \group_align_safe_end:
-  { \if_int_compare:w `{ = \c_zero } \fi: }
+  { \if_int_compare:w `{ = \c_zero_int } \fi: }
 \int_new:N \g__kernel_prg_map_int
 \__kernel_patch_deprecation:nnNNpn { 2019-12-31 } { \prg_break_point:Nn }
 \cs_new:Npn \__prg_break_point:Nn { \prg_break_point:Nn }
@@ -6554,17 +7305,17 @@
   }
 \str_const:Nx \c_sys_engine_str
   {
-    \cs_if_exist:NT \luatex_luatexversion:D { luatex }
-    \cs_if_exist:NT \pdftex_pdftexversion:D { pdftex }
-    \cs_if_exist:NT \ptex_kanjiskip:D
+    \cs_if_exist:NT \tex_luatexversion:D { luatex }
+    \cs_if_exist:NT \tex_pdftexversion:D { pdftex }
+    \cs_if_exist:NT \tex_kanjiskip:D
       {
         \bool_lazy_and:nnTF
-          { \cs_if_exist_p:N \uptex_disablecjktoken:D }
-          { \int_compare_p:nNn { \ptex_jis:D "2121 } = { "3000 } }
+          { \cs_if_exist_p:N \tex_disablecjktoken:D }
+          { \int_compare_p:nNn { \tex_jis:D "2121 } = { "3000 } }
           { uptex }
           { ptex }
       }
-    \cs_if_exist:NT \xetex_XeTeXversion:D { xetex }
+    \cs_if_exist:NT \tex_XeTeXversion:D { xetex }
   }
 \tl_map_inline:nn { { luatex } { pdftex } { ptex } { uptex } { xetex } }
   {
@@ -6574,7 +7325,7 @@
 \str_const:Nx \c_sys_output_str
   {
     \int_compare:nNnTF
-      { \cs_if_exist_use:NF \pdftex_pdfoutput:D { 0 } } > { 0 }
+      { \cs_if_exist_use:NF \tex_pdfoutput:D { 0 } } > { 0 }
       { pdf }
       { dvi }
   }
@@ -6582,6 +7333,8 @@
   { \str_if_eq_x_p:nn \c_sys_output_str { dvi } }
 \__sys_const:nn { sys_if_output_pdf }
   { \str_if_eq_x_p:nn \c_sys_output_str { pdf } }
+\__sys_const:nn { sys_if_rand_exist }
+  { \cs_if_exist_p:N \tex_uniformdeviate:D }
 %% File: l3clist.dtx Copyright (C) 2004-2011 Frank Mittelbach,
 %%                                 The LaTeX3 project
 %%                             (C) 2012-2018 The LaTeX3 Project
@@ -7338,7 +8091,7 @@
           {
             #3
             \exp_after:wN \exp_end:
-            \utex_charcat:D #1 \exp_stop_f: #2 \exp_stop_f:
+            \tex_Ucharcat:D #1 \exp_stop_f: #2 \exp_stop_f:
           }
         \cs_new_eq:NN \__char_generate_auxii:nnw \__char_generate_aux:nnw
         \cs_gset:Npn \__char_generate_aux:nnw #1#2#3 \exp_end:
@@ -8510,7 +9263,7 @@
         {
           \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
             {
-              \etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
+              \tex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
                 { \exp_after:wN \l__msg_internal_tl }
             }
         }
@@ -8812,7 +9565,8 @@
 \__kernel_msg_new:nnnn { kernel } { overflow }
   { Integers~larger~than~2^{30}-1~cannot~be~stored~in~arrays. }
   {
-    An~attempt~was~made~to~store~#3~at~position~#2~in~the~array~'#1'.~
+    An~attempt~was~made~to~store~#3~
+    \tl_if_empty:nF {#2} { at~position~#2~ } in~the~array~'#1'.~
     The~largest~allowed~value~#4~will~be~used~instead.
   }
 \__kernel_msg_new:nnnn { kernel } { out-of-bounds }
@@ -8984,6 +9738,8 @@
       { is~empty \\>~ . }
       { contains~the~items~(without~outer~braces): #2 . }
   }
+\__kernel_msg_new:nnn { kernel } { show-intarray }
+  { The~integer~array~#1~contains~#2~items: \\ #3 . }
 \__kernel_msg_new:nnn { kernel } { show-prop }
   {
     The~property~list~#1~
@@ -9164,7 +9920,7 @@
     \exp_args:Nno \use:n
       {
         \int_set:Nn \tex_endlinechar:D { -1 }
-        \etex_readline:D #1 to #2
+        \tex_readline:D #1 to #2
         \int_set:Nn \tex_endlinechar:D
       }   { \int_use:N \tex_endlinechar:D }
   }
@@ -9204,7 +9960,7 @@
   {
     \bool_lazy_and:nnTF
       { \sys_if_engine_luatex_p: }
-      { \int_compare_p:nNn \luatex_luatexversion:D > { 80 } }
+      { \int_compare_p:nNn \tex_luatexversion:D > { 80 } }
       { 128 }
       { 16 }
   }
@@ -9901,7 +10657,7 @@
 %% File: l3skip.dtx Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX3 Project
 %%                            (C) 2012-2018 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:w      \tex_dimexpr:D
 \cs_new_eq:NN \__dim_eval_end:   \tex_relax:D
 \cs_new_protected:Npn \dim_new:N #1
   {
@@ -10073,7 +10829,7 @@
   { #1 \prg_return_false: \else: \prg_return_true: \fi: }
 \cs_new_protected:Npn \__dim_compare_error:
   {
-    \if_int_compare:w \c_zero \c_zero \fi:
+    \if_int_compare:w \c_zero_int \c_zero_int \fi:
     =
     \__dim_compare_error:
   }
@@ -10323,15 +11079,15 @@
     \__kernel_patch_args:nnnNNpn
       { #1 ##1 }
       { }
-      { {##1} { \__kernel_chk_expr:nNnN {##2} \etex_glueexpr:D { } #3 } }
+      { {##1} { \__kernel_chk_expr:nNnN {##2} \tex_glueexpr:D { } #3 } }
     #2 #3
   }
 \__skip_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \skip_set:Nn #1#2
-  { #1 ~ \etex_glueexpr:D #2 \scan_stop: }
+  { #1 ~ \tex_glueexpr:D #2 \scan_stop: }
 \__skip_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \skip_gset:Nn #1#2
-  { \tex_global:D #1 ~ \etex_glueexpr:D #2 \scan_stop: }
+  { \tex_global:D #1 ~ \tex_glueexpr:D #2 \scan_stop: }
 \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 }
@@ -10340,18 +11096,18 @@
 \cs_generate_variant:Nn \skip_gset_eq:NN { c , Nc , cc }
 \__skip_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \skip_add:Nn #1#2
-  { \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: }
+  { \tex_advance:D #1 by \tex_glueexpr:D #2 \scan_stop: }
 \__skip_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \skip_gadd:Nn #1#2
-  { \tex_global:D \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: }
+  { \tex_global:D \tex_advance:D #1 by \tex_glueexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \skip_add:Nn  { c }
 \cs_generate_variant:Nn \skip_gadd:Nn { c }
 \__skip_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \skip_sub:Nn #1#2
-  { \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: }
+  { \tex_advance:D #1 by - \tex_glueexpr:D #2 \scan_stop: }
 \__skip_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \skip_gsub:Nn #1#2
-  { \tex_global:D \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: }
+  { \tex_global:D \tex_advance:D #1 by - \tex_glueexpr:D #2 \scan_stop: }
 \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 }
@@ -10366,13 +11122,13 @@
       {
         {
           \__kernel_chk_expr:nNnN
-            {##1} \etex_glueexpr:D { } \skip_if_finite:n
+            {##1} \tex_glueexpr:D { } \skip_if_finite:n
         }
       }
     \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:
+        \skip_use:N \tex_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}
@@ -10379,9 +11135,9 @@
   }
 \exp_args:No \__skip_tmp:w { \tl_to_str:n { fil } }
 \__kernel_patch_args:nNNpn
-  { { \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_eval:n } }
+  { { \__kernel_chk_expr:nNnN {#1} \tex_glueexpr:D { } \skip_eval:n } }
 \cs_new:Npn \skip_eval:n #1
-  { \skip_use:N \etex_glueexpr:D #1 \scan_stop: }
+  { \skip_use:N \tex_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
@@ -10388,22 +11144,22 @@
 \__kernel_patch_args:nNNpn
   {
     {
-      \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { }
+      \__kernel_chk_expr:nNnN {#1} \tex_glueexpr:D { }
         \skip_horizontal:n
     }
   }
 \cs_new:Npn \skip_horizontal:n #1
-  { \skip_horizontal:N \etex_glueexpr:D #1 \scan_stop: }
+  { \skip_horizontal:N \tex_glueexpr:D #1 \scan_stop: }
 \cs_new_eq:NN  \skip_vertical:N \tex_vskip:D
 \__kernel_patch_args:nNNpn
   {
     {
-      \__kernel_chk_expr:nNnN {#1} \etex_glueexpr:D { }
+      \__kernel_chk_expr:nNnN {#1} \tex_glueexpr:D { }
         \skip_vertical:n
     }
   }
 \cs_new:Npn \skip_vertical:n #1
-  { \skip_vertical:N \etex_glueexpr:D #1 \scan_stop: }
+  { \skip_vertical:N \tex_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
@@ -10460,7 +11216,7 @@
         {##1}
         {
           \__kernel_chk_expr:nNnN {##2}
-            \etex_muexpr:D { \etex_mutoglue:D } #3
+            \tex_muexpr:D { \tex_mutoglue:D } #3
         }
       }
     #2 #3
@@ -10467,10 +11223,10 @@
   }
 \__skip_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \muskip_set:Nn #1#2
-  { #1 ~ \etex_muexpr:D #2 \scan_stop: }
+  { #1 ~ \tex_muexpr:D #2 \scan_stop: }
 \__skip_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \muskip_gset:Nn #1#2
-  { \tex_global:D #1 ~ \etex_muexpr:D #2 \scan_stop: }
+  { \tex_global:D #1 ~ \tex_muexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \muskip_set:Nn  { c }
 \cs_generate_variant:Nn \muskip_gset:Nn { c }
 \__kernel_patch:nnNNpn { \__kernel_chk_var_local:N #1 } { }
@@ -10481,29 +11237,29 @@
 \cs_generate_variant:Nn \muskip_gset_eq:NN { c , Nc , cc }
 \__skip_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \muskip_add:Nn #1#2
-  { \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: }
+  { \tex_advance:D #1 by \tex_muexpr:D #2 \scan_stop: }
 \__skip_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \muskip_gadd:Nn #1#2
-  { \tex_global:D \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: }
+  { \tex_global:D \tex_advance:D #1 by \tex_muexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \muskip_add:Nn  { c }
 \cs_generate_variant:Nn \muskip_gadd:Nn { c }
 \__skip_tmp:w \__kernel_chk_var_local:N
 \cs_new_protected:Npn \muskip_sub:Nn #1#2
-  { \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: }
+  { \tex_advance:D #1 by - \tex_muexpr:D #2 \scan_stop: }
 \__skip_tmp:w \__kernel_chk_var_global:N
 \cs_new_protected:Npn \muskip_gsub:Nn #1#2
-  { \tex_global:D \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: }
+  { \tex_global:D \tex_advance:D #1 by - \tex_muexpr:D #2 \scan_stop: }
 \cs_generate_variant:Nn \muskip_sub:Nn  { c }
 \cs_generate_variant:Nn \muskip_gsub:Nn { c }
 \__kernel_patch_args:nNNpn
   {
     {
-      \__kernel_chk_expr:nNnN {#1} \etex_muexpr:D
-        { \etex_mutoglue:D } \muskip_eval:n
+      \__kernel_chk_expr:nNnN {#1} \tex_muexpr:D
+        { \tex_mutoglue:D } \muskip_eval:n
     }
   }
 \cs_new:Npn \muskip_eval:n #1
-  { \muskip_use:N \etex_muexpr:D #1 \scan_stop: }
+  { \muskip_use:N \tex_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
@@ -11457,9 +12213,240 @@
       { is~undefined. }
       { has~the~properties: #2 . }
   }
+%% File: l3intarray.dtx Copyright (C) 2017-2018 The LaTeX3 Project
+\cs_new_eq:NN \__intarray_entry:w \tex_fontdimen:D
+\cs_new_eq:NN \__intarray_count:w \tex_hyphenchar:D
+\int_new:N \l__intarray_loop_int
+\dim_const:Nn \c__intarray_sp_dim { 1 sp }
+\int_new:N \g__intarray_font_int
+\__kernel_msg_new:nnn { kernel } { negative-array-size }
+  { Size~of~array~may~not~be~negative:~#1 }
+\cs_new_protected:Npn \__intarray_new:N #1
+  {
+    \__kernel_chk_if_free_cs:N #1
+    \int_gincr:N \g__intarray_font_int
+    \tex_global:D \tex_font:D #1
+      = cmr10~at~ \g__intarray_font_int \c__intarray_sp_dim \scan_stop:
+    \int_step_inline:nn { 8 }
+      { \__kernel_intarray_gset:Nnn #1 {##1} \c_zero_int }
+  }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN g #1 } { }
+\cs_new_protected:Npn \intarray_new:Nn #1#2
+  {
+    \__intarray_new:N #1
+    \__intarray_count:w #1 = \int_eval:n {#2} \scan_stop:
+    \int_compare:nNnT { \intarray_count:N #1 } < 0
+      {
+        \__kernel_msg_error:nnx { kernel } { negative-array-size }
+          { \intarray_count:N #1 }
+      }
+    \int_compare:nNnT { \intarray_count:N #1 } > 0
+      { \__kernel_intarray_gset:Nnn #1 { \intarray_count:N #1 } { 0 } }
+  }
+\cs_new:Npn \intarray_count:N #1 { \int_value:w \__intarray_count:w #1 }
+\cs_new:Npn \__intarray_signed_max_dim:n #1
+  { \int_value:w \int_compare:nNnT {#1} < 0 { - } \c_max_dim }
+\cs_new:Npn \__intarray_bounds:NNnTF #1#2#3#4#5
+  {
+    \if_int_compare:w 1 > #3 \exp_stop_f:
+      \__intarray_bounds_error:NNn #1 #2 {#3}
+      #5
+    \else:
+      \if_int_compare:w #3 > \intarray_count:N #2 \exp_stop_f:
+        \__intarray_bounds_error:NNn #1 #2 {#3}
+        #5
+      \else:
+        #4
+      \fi:
+    \fi:
+  }
+\cs_new:Npn \__intarray_bounds_error:NNn #1#2#3
+  {
+    #1 { kernel } { out-of-bounds }
+      { \token_to_str:N #2 } {#3} { \intarray_count:N #2 }
+  }
+\cs_new_protected:Npn \__kernel_intarray_gset:Nnn #1#2#3
+  { \__intarray_entry:w #2 #1 #3 \c__intarray_sp_dim }
+\cs_new_protected:Npn \intarray_gset:Nnn #1#2#3
+  {
+    \exp_after:wN \__intarray_gset:Nww
+    \exp_after:wN #1
+    \int_value:w \int_eval:n {#2} \exp_after:wN ;
+    \int_value:w \int_eval:n {#3} ;
+  }
+\cs_new_protected:Npn \__intarray_gset:Nww #1#2 ; #3 ;
+  {
+    \__intarray_bounds:NNnTF \__kernel_msg_error:nnxxx #1 {#2}
+      {
+        \__intarray_gset_overflow_test:nw {#3}
+        \__kernel_intarray_gset:Nnn #1 {#2} {#3}
+      }
+      { }
+  }
+\cs_if_exist:NTF \tex_ifabsnum:D
+  {
+    \cs_new_protected:Npn \__intarray_gset_overflow_test:nw #1
+      {
+        \tex_ifabsnum:D #1 > \c_max_dim
+          \exp_after:wN \__intarray_gset_overflow:NNnn
+        \fi:
+      }
+  }
+  {
+    \cs_new_protected:Npn \__intarray_gset_overflow_test:nw #1
+      {
+        \if_int_compare:w \int_abs:n {#1} > \c_max_dim
+          \exp_after:wN \__intarray_gset_overflow:NNnn
+        \fi:
+      }
+  }
+\cs_new_protected:Npn \__intarray_gset_overflow:NNnn #1#2#3#4
+  {
+    \__kernel_msg_error:nnxxxx { kernel } { overflow }
+      { \token_to_str:N #2 } {#3} {#4} {  \__intarray_signed_max_dim:n {#4} }
+    #1 #2 {#3} { \__intarray_signed_max_dim:n {#4} }
+  }
+\cs_new_protected:Npn \intarray_gzero:N #1
+  {
+    \int_zero:N \l__intarray_loop_int
+    \prg_replicate:nn { \intarray_count:N #1 }
+      {
+        \int_incr:N \l__intarray_loop_int
+        \__intarray_entry:w \l__intarray_loop_int #1 \c_zero_dim
+      }
+  }
+\cs_new:Npn \__kernel_intarray_item:Nn #1#2
+  { \int_value:w \__intarray_entry:w #2 #1 }
+\cs_new:Npn \intarray_item:Nn #1#2
+  {
+    \exp_after:wN \__intarray_item:Nw
+    \exp_after:wN #1
+    \int_value:w \int_eval:n {#2} ;
+  }
+\cs_new:Npn \__intarray_item:Nw #1#2 ;
+  {
+    \__intarray_bounds:NNnTF \__kernel_msg_expandable_error:nnfff #1 {#2}
+      { \__kernel_intarray_item:Nn #1 {#2} }
+      { 0 }
+  }
+\cs_new:Npn \intarray_rand_item:N #1
+  { \intarray_item:Nn #1 { \int_rand:n { \intarray_count:N #1 } } }
+\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN c #1 } { }
+\cs_new_protected:Npn \intarray_const_from_clist:Nn #1#2
+  {
+    \__intarray_new:N #1
+    \int_zero:N \l__intarray_loop_int
+    \clist_map_inline:nn {#2}
+      { \exp_args:Nf \__intarray_const_from_clist:nN { \int_eval:n {##1} } #1 }
+    \__intarray_count:w #1 \l__intarray_loop_int
+  }
+\cs_new_protected:Npn \__intarray_const_from_clist:nN #1#2
+  {
+    \int_incr:N \l__intarray_loop_int
+    \__intarray_gset_overflow_test:nw {#1}
+    \__kernel_intarray_gset:Nnn #2 \l__intarray_loop_int {#1}
+  }
+\cs_new:Npn \intarray_to_clist:N #1 { \__intarray_to_clist:Nn #1 { , } }
+\cs_new:Npn \__intarray_to_clist:Nn #1#2
+  {
+    \int_compare:nNnF { \intarray_count:N #1 } = \c_zero_int
+      {
+        \exp_last_unbraced:Nf \use_none:n
+          { \__intarray_to_clist:w 1 ; #1 {#2} \prg_break_point: }
+      }
+  }
+\cs_new:Npn \__intarray_to_clist:w #1 ; #2#3
+  {
+    \if_int_compare:w #1 > \__intarray_count:w #2
+      \prg_break:n
+    \fi:
+    #3 \__kernel_intarray_item:Nn #2 {#1}
+    \exp_after:wN \__intarray_to_clist:w
+    \int_value:w \int_eval:w #1 + \c_one_int ; #2 {#3}
+  }
+\cs_new_protected:Npn \intarray_show:N { \__intarray_show:NN \msg_show:nnxxxx }
+\cs_generate_variant:Nn \intarray_show:N { c }
+\cs_new_protected:Npn \intarray_log:N { \__intarray_show:NN \msg_log:nnxxxx }
+\cs_generate_variant:Nn \intarray_log:N { c }
+\cs_new_protected:Npn \__intarray_show:NN #1#2
+  {
+    \__kernel_chk_defined:NT #2
+      {
+        #1 { LaTeX/kernel } { show-intarray }
+          { \token_to_str:N #2 }
+          { \intarray_count:N #2 }
+          { >~ \__intarray_to_clist:Nn #2 { , ~ } }
+          { }
+      }
+  }
+\cs_new_protected:Npn \intarray_gset_rand:Nn #1
+  { \intarray_gset_rand:Nnn #1 { 1 } }
+\sys_if_rand_exist:TF
+  {
+    \cs_new_protected:Npn \intarray_gset_rand:Nnn #1#2#3
+      {
+        \__intarray_gset_rand:Nff #1
+          { \int_eval:n {#2} } { \int_eval:n {#3} }
+      }
+    \cs_new_protected:Npn \__intarray_gset_rand:Nnn #1#2#3
+      {
+        \int_compare:nNnTF {#2} > {#3}
+          {
+            \__kernel_msg_expandable_error:nnnn
+              { kernel } { randint-backward-range } {#2} {#3}
+            \__intarray_gset_rand:Nnn #1 {#3} {#2}
+          }
+          {
+            \__intarray_gset_overflow_test:nw {#2}
+            \__intarray_gset_rand_auxi:Nnnn #1 { } {#2} {#3}
+          }
+      }
+    \cs_generate_variant:Nn \__intarray_gset_rand:Nnn { Nff }
+    \cs_new_protected:Npn \__intarray_gset_rand_auxi:Nnnn #1#2#3#4
+      {
+        \__intarray_gset_overflow_test:nw {#4}
+        \__intarray_gset_rand_auxii:Nnnn #1 { } {#4} {#3}
+      }
+    \cs_new_protected:Npn \__intarray_gset_rand_auxii:Nnnn #1#2#3#4
+      {
+        \exp_args:NNf \__intarray_gset_rand_auxiii:Nnnn #1
+          { \int_eval:n { #3 - #4 + 1 } } {#4} {#3}
+      }
+    \cs_new_protected:Npn \__intarray_gset_rand_auxiii:Nnnn #1#2#3#4
+      {
+        \exp_args:NNf \__intarray_gset_all_same:Nn #1
+          {
+            \int_compare:nNnTF {#2} > \c__kernel_randint_max_int
+              {
+                \exp_stop_f:
+                \int_eval:n { \__kernel_randint:nn {#3} {#4} }
+              }
+              {
+                \exp_stop_f:
+                \int_eval:n { \__kernel_randint:n {#2} - 1 + #3 }
+              }
+          }
+      }
+    \cs_new_protected:Npn \__intarray_gset_all_same:Nn #1#2
+      {
+        \int_zero:N \l__intarray_loop_int
+        \prg_replicate:nn { \intarray_count:N #1 }
+          {
+            \int_incr:N \l__intarray_loop_int
+            \__kernel_intarray_gset:Nnn #1 \l__intarray_loop_int {#2}
+          }
+      }
+  }
+  {
+    \cs_new_protected:Npn \intarray_gset_rand:Nnn #1#2#3
+      {
+        \__kernel_msg_error:nnn { kernel } { fp-no-random }
+          { \intarray_gset_rand:Nnn #1 {#2} {#3} }
+      }
+  }
 %% File: l3fp.dtx Copyright (C) 2011-2018 The LaTeX3 Project
 %% File: l3fp-aux.dtx Copyright(C) 2011-2018 The LaTeX3 Project
-\cs_new_eq:NN \__fp_int_eval:w \etex_numexpr:D
+\cs_new_eq:NN \__fp_int_eval:w \tex_numexpr:D
 \cs_new_eq:NN \__fp_int_eval_end: \scan_stop:
 \cs_new_eq:NN \__fp_int_to_roman:w \tex_romannumeral:D
 \cs_new:Npn \__fp_use_none_stop_f:n #1 { \exp_stop_f: }
@@ -11835,17 +12822,17 @@
     #2
     \s__fp_mark { #3 #1 } #4
   }
-\cs_new:Npn \__fp_str_if_eq_x:nn #1#2 { \pdftex_strcmp:D {#1} {#2} }
+\cs_new:Npn \__fp_str_if_eq_x:nn #1#2 { \tex_strcmp:D {#1} {#2} }
 \sys_if_engine_luatex:T
   {
     \cs_set:Npn \__fp_str_if_eq_x:nn #1#2
       {
-        \luatex_directlua:D
+        \tex_directlua:D
           {
             l3kernel.strcmp
               (
-                " \luatex_luaescapestring:D {#1}",
-                " \luatex_luaescapestring:D {#2}"
+                " \tex_luaescapestring:D {#1}",
+                " \tex_luaescapestring:D {#2}"
               )
           }
       }
@@ -13615,63 +14602,6 @@
     \exp:w \exp_end_continue_f:w
     \__fp_tuple_mapthread_loop_o:nw {#1} #4 @
   }
-\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_func_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_func_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 }
-      {
-        \__kernel_msg_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} }
 \__kernel_msg_new:nnn { kernel } { fp-deprecated }
   { '#1'~deprecated;~use~'#2' }
 \__kernel_msg_new:nnn { kernel } { unknown-fp-word }
@@ -15743,112 +16673,107 @@
   }
 \cs_new:Npn \__fp_exp_Taylor_break:Nww #1 #2; #3 \s_stop
   { \__fp_fixed_add_one:wN #2 ; }
+\intarray_const_from_clist:Nn \c__fp_exp_intarray
+  {
+         1 , 1 1105 1709 , 1 1807 5647 , 1 6248 1171 ,
+         1 , 1 1221 4027 , 1 5816 0169 , 1 8339 2107 ,
+         1 , 1 1349 8588 , 1 0757 6003 , 1 1039 8374 ,
+         1 , 1 1491 8246 , 1 9764 1270 , 1 3178 2485 ,
+         1 , 1 1648 7212 , 1 7070 0128 , 1 1468 4865 ,
+         1 , 1 1822 1188 , 1 0039 0508 , 1 9748 7537 ,
+         1 , 1 2013 7527 , 1 0747 0476 , 1 5216 2455 ,
+         1 , 1 2225 5409 , 1 2849 2467 , 1 6045 7954 ,
+         1 , 1 2459 6031 , 1 1115 6949 , 1 6638 0013 ,
+         1 , 1 2718 2818 , 1 2845 9045 , 1 2353 6029 ,
+         1 , 1 7389 0560 , 1 9893 0650 , 1 2272 3043 ,
+         2 , 1 2008 5536 , 1 9231 8766 , 1 7740 9285 ,
+         2 , 1 5459 8150 , 1 0331 4423 , 1 9078 1103 ,
+         3 , 1 1484 1315 , 1 9102 5766 , 1 0342 1116 ,
+         3 , 1 4034 2879 , 1 3492 7351 , 1 2260 8387 ,
+         4 , 1 1096 6331 , 1 5842 8458 , 1 5992 6372 ,
+         4 , 1 2980 9579 , 1 8704 1728 , 1 2747 4359 ,
+         4 , 1 8103 0839 , 1 2757 5384 , 1 0077 1000 ,
+         5 , 1 2202 6465 , 1 7948 0671 , 1 6516 9579 ,
+         9 , 1 4851 6519 , 1 5409 7902 , 1 7796 9107 ,
+        14 , 1 1068 6474 , 1 5815 2446 , 1 2146 9905 ,
+        18 , 1 2353 8526 , 1 6837 0199 , 1 8540 7900 ,
+        22 , 1 5184 7055 , 1 2858 7072 , 1 4640 8745 ,
+        27 , 1 1142 0073 , 1 8981 5684 , 1 2836 6296 ,
+        31 , 1 2515 4386 , 1 7091 9167 , 1 0062 6578 ,
+        35 , 1 5540 6223 , 1 8439 3510 , 1 0525 7117 ,
+        40 , 1 1220 4032 , 1 9431 7840 , 1 8020 0271 ,
+        44 , 1 2688 1171 , 1 4181 6135 , 1 4484 1263 ,
+        87 , 1 7225 9737 , 1 6812 5749 , 1 2581 7748 ,
+       131 , 1 1942 4263 , 1 9524 1255 , 1 9365 8421 ,
+       174 , 1 5221 4696 , 1 8976 4143 , 1 9505 8876 ,
+       218 , 1 1403 5922 , 1 1785 2837 , 1 4107 3977 ,
+       261 , 1 3773 0203 , 1 0092 9939 , 1 8234 0143 ,
+       305 , 1 1014 2320 , 1 5473 5004 , 1 5094 5533 ,
+       348 , 1 2726 3745 , 1 7211 2566 , 1 5673 6478 ,
+       391 , 1 7328 8142 , 1 2230 7421 , 1 7051 8866 ,
+       435 , 1 1970 0711 , 1 1401 7046 , 1 9938 8888 ,
+       869 , 1 3881 1801 , 1 9428 4368 , 1 5764 8232 ,
+      1303 , 1 7646 2009 , 1 8905 4704 , 1 8893 1073 ,
+      1738 , 1 1506 3559 , 1 7005 0524 , 1 9009 7592 ,
+      2172 , 1 2967 6283 , 1 8402 3667 , 1 0689 6630 ,
+      2606 , 1 5846 4389 , 1 5650 2114 , 1 7278 5046 ,
+      3041 , 1 1151 7900 , 1 5080 6878 , 1 2914 4154 ,
+      3475 , 1 2269 1083 , 1 0850 6857 , 1 8724 4002 ,
+      3909 , 1 4470 3047 , 1 3316 5442 , 1 6408 6591 ,
+      4343 , 1 8806 8182 , 1 2566 2921 , 1 5872 6150 ,
+      8686 , 1 7756 0047 , 1 2598 6861 , 1 0458 3204 ,
+     13029 , 1 6830 5723 , 1 7791 4884 , 1 1932 7351 ,
+     17372 , 1 6015 5609 , 1 3095 3052 , 1 3494 7574 ,
+     21715 , 1 5297 7951 , 1 6443 0315 , 1 3251 3576 ,
+     26058 , 1 4665 6719 , 1 0099 3379 , 1 5527 2929 ,
+     30401 , 1 4108 9724 , 1 3326 3186 , 1 5271 5665 ,
+     34744 , 1 3618 6973 , 1 3140 0875 , 1 3856 4102 ,
+     39087 , 1 3186 9209 , 1 6113 3900 , 1 6705 9685 ,
+  }
 \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_ \__fp_int_to_roman:w #6 :wN \exp_after:wN \cs_end:
+    \exp_after:wN \exp_after:wN \exp_after:wN \__fp_exp_large:NwN
+    \exp_after:wN \exp_after:wN \exp_after:wN #6
     \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
+\cs_new:Npn \__fp_exp_large:NwN #1#2; #3
   {
-    \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:
+    \if_case:w #3 ~
+      \exp_after:wN \__fp_fixed_continue:wn
+    \else:
+      \exp_after:wN \__fp_exp_intarray:w
+      \int_value:w \__fp_int_eval:w 36 * #1 + 4 * #3 \exp_after:wN ;
     \fi:
-    #1;
-    \__fp_exp_large_iv:wN
+    #2;
+    {
+      \if_meaning:w 0 #1
+        \exp_after:wN \__fp_exp_large_after:wwn
+      \else:
+        \exp_after:wN \__fp_exp_large:NwN
+        \int_value:w \__fp_int_eval:w #1 - 1 \exp_after:wN \scan_stop:
+      \fi:
+    }
   }
-\cs_new:Npn \__fp_exp_large_iv:wN #1; #2
+\cs_new:Npn \__fp_exp_intarray:w #1 ;
   {
-    \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
+    +
+    \__kernel_intarray_item:Nn \c__fp_exp_intarray
+      { \__fp_int_eval:w #1 - 3 \scan_stop: }
+    \exp_after:wN \use_i:nnn
+    \exp_after:wN \__fp_fixed_mul:wwn
+    \int_value:w 0
+    \exp_after:wN \__fp_exp_intarray_aux:w
+    \int_value:w \__kernel_intarray_item:Nn
+                   \c__fp_exp_intarray { \__fp_int_eval:w #1 - 2 }
+    \exp_after:wN \__fp_exp_intarray_aux:w
+    \int_value:w \__kernel_intarray_item:Nn
+                   \c__fp_exp_intarray { \__fp_int_eval:w #1 - 1 }
+    \exp_after:wN \__fp_exp_intarray_aux:w
+    \int_value:w \__kernel_intarray_item:Nn \c__fp_exp_intarray {#1} ; ;
   }
-\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_intarray_aux:w 1 #1#2#3#4#5 ; { ; {#1#2#3#4} {#5} }
 \cs_new:Npn \__fp_exp_large_after:wwn #1; #2; #3
   {
     \__fp_exp_Taylor:Nnnwn ? { } { } 0 #2; {} #3
@@ -16031,7 +16956,11 @@
     \fi:
   }
 \cs_new:Npn \__fp_pow_C_pack:w
-  { \exp_after:wN \__fp_exp_large_v:wN \c__fp_one_fixed_tl }
+  {
+    \exp_after:wN \__fp_exp_large:NwN
+    \exp_after:wN 5
+    \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 ;
@@ -16274,193 +17203,273 @@
       {#1}#2{0000}{0000};
     { \__fp_trigd_small:ww 2, }
   }
-\cs_new:Npx \__fp_trig_inverse_two_pi:
+\intarray_const_from_clist:Nn \c__fp_trig_intarray
   {
-    \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:
+    100000000, 100000000, 115915494, 130918953, 135768883, 176337251,
+    143620344, 159645740, 145644874, 176673440, 158896797, 163422653,
+    150901138, 102766253, 108595607, 128427267, 157958036, 189291184,
+    161145786, 152877967, 141073169, 198392292, 139966937, 140907757,
+    130777463, 196925307, 168871739, 128962173, 197661693, 136239024,
+    117236290, 111832380, 111422269, 197557159, 140461890, 108690267,
+    139561204, 189410936, 193784408, 155287230, 199946443, 140024867,
+    123477394, 159610898, 132309678, 130749061, 166986462, 180469944,
+    186521878, 181574786, 156696424, 110389958, 174139348, 160998386,
+    180991999, 162442875, 158517117, 188584311, 117518767, 116054654,
+    175369880, 109739460, 136475933, 137680593, 102494496, 163530532,
+    171567755, 103220324, 177781639, 171660229, 146748119, 159816584,
+    106060168, 103035998, 113391198, 174988327, 186654435, 127975507,
+    100162406, 177564388, 184957131, 108801221, 199376147, 168137776,
+    147378906, 133068046, 145797848, 117613124, 127314069, 196077502,
+    145002977, 159857089, 105690279, 167851315, 125210016, 131774602,
+    109248116, 106240561, 145620314, 164840892, 148459191, 143521157,
+    154075562, 100871526, 160680221, 171591407, 157474582, 172259774,
+    162853998, 175155329, 139081398, 117724093, 158254797, 107332871,
+    190406999, 175907657, 170784934, 170393589, 182808717, 134256403,
+    166895116, 162545705, 194332763, 112686500, 126122717, 197115321,
+    112599504, 138667945, 103762556, 108363171, 116952597, 158128224,
+    194162333, 143145106, 112353687, 185631136, 136692167, 114206974,
+    169601292, 150578336, 105311960, 185945098, 139556718, 170995474,
+    165104316, 123815517, 158083944, 129799709, 199505254, 138756612,
+    194458833, 106846050, 178529151, 151410404, 189298850, 163881607,
+    176196993, 107341038, 199957869, 118905980, 193737772, 106187543,
+    122271893, 101366255, 126123878, 103875388, 181106814, 106765434,
+    108282785, 126933426, 179955607, 107903860, 160352738, 199624512,
+    159957492, 176297023, 159409558, 143011648, 129641185, 157771240,
+    157544494, 157021789, 176979240, 194903272, 194770216, 164960356,
+    153181535, 144003840, 168987471, 176915887, 163190966, 150696440,
+    147769706, 187683656, 177810477, 197954503, 153395758, 130188183,
+    186879377, 166124814, 195305996, 155802190, 183598751, 103512712,
+    190432315, 180498719, 168687775, 194656634, 162210342, 104440855,
+    149785037, 192738694, 129353661, 193778292, 187359378, 143470323,
+    102371458, 137923557, 111863634, 119294601, 183182291, 196416500,
+    187830793, 131353497, 179099745, 186492902, 167450609, 189368909,
+    145883050, 133703053, 180547312, 132158094, 131976760, 132283131,
+    141898097, 149822438, 133517435, 169898475, 101039500, 168388003,
+    197867235, 199608024, 100273901, 108749548, 154787923, 156826113,
+    199489032, 168997427, 108349611, 149208289, 103776784, 174303550,
+    145684560, 183671479, 130845672, 133270354, 185392556, 120208683,
+    193240995, 162211753, 131839402, 109707935, 170774965, 149880868,
+    160663609, 168661967, 103747454, 121028312, 119251846, 122483499,
+    111611495, 166556037, 196967613, 199312829, 196077608, 127799010,
+    107830360, 102338272, 198790854, 102387615, 157445430, 192601191,
+    100543379, 198389046, 154921248, 129516070, 172853005, 122721023,
+    160175233, 113173179, 175931105, 103281551, 109373913, 163964530,
+    157926071, 180083617, 195487672, 146459804, 173977292, 144810920,
+    109371257, 186918332, 189588628, 139904358, 168666639, 175673445,
+    114095036, 137327191, 174311388, 106638307, 125923027, 159734506,
+    105482127, 178037065, 133778303, 121709877, 134966568, 149080032,
+    169885067, 141791464, 168350828, 116168533, 114336160, 173099514,
+    198531198, 119733758, 144420984, 116559541, 152250643, 139431286,
+    144403838, 183561508, 179771645, 101706470, 167518774, 156059160,
+    187168578, 157939226, 123475633, 117111329, 198655941, 159689071,
+    198506887, 144230057, 151919770, 156900382, 118392562, 120338742,
+    135362568, 108354156, 151729710, 188117217, 195936832, 156488518,
+    174997487, 108553116, 159830610, 113921445, 144601614, 188452770,
+    125114110, 170248521, 173974510, 138667364, 103872860, 109967489,
+    131735618, 112071174, 104788993, 168886556, 192307848, 150230570,
+    157144063, 163863202, 136852010, 174100574, 185922811, 115721968,
+    100397824, 175953001, 166958522, 112303464, 118773650, 143546764,
+    164565659, 171901123, 108476709, 193097085, 191283646, 166919177,
+    169387914, 133315566, 150669813, 121641521, 100895711, 172862384,
+    126070678, 145176011, 113450800, 169947684, 122356989, 162488051,
+    157759809, 153397080, 185475059, 175362656, 149034394, 145420581,
+    178864356, 183042000, 131509559, 147434392, 152544850, 167491429,
+    108647514, 142303321, 133245695, 111634945, 167753939, 142403609,
+    105438335, 152829243, 142203494, 184366151, 146632286, 102477666,
+    166049531, 140657343, 157553014, 109082798, 180914786, 169343492,
+    127376026, 134997829, 195701816, 119643212, 133140475, 176289748,
+    140828911, 174097478, 126378991, 181699939, 148749771, 151989818,
+    172666294, 160183053, 195832752, 109236350, 168538892, 128468247,
+    125997252, 183007668, 156937583, 165972291, 198244297, 147406163,
+    181831139, 158306744, 134851692, 185973832, 137392662, 140243450,
+    119978099, 140402189, 161348342, 173613676, 144991382, 171541660,
+    163424829, 136374185, 106122610, 186132119, 198633462, 184709941,
+    183994274, 129559156, 128333990, 148038211, 175011612, 111667205,
+    119125793, 103552929, 124113440, 131161341, 112495318, 138592695,
+    184904438, 146807849, 109739828, 108855297, 104515305, 139914009,
+    188698840, 188365483, 166522246, 168624087, 125401404, 100911787,
+    142122045, 123075334, 173972538, 114940388, 141905868, 142311594,
+    163227443, 139066125, 116239310, 162831953, 123883392, 113153455,
+    163815117, 152035108, 174595582, 101123754, 135976815, 153401874,
+    107394340, 136339780, 138817210, 104531691, 182951948, 179591767,
+    139541778, 179243527, 161740724, 160593916, 102732282, 187946819,
+    136491289, 149714953, 143255272, 135916592, 198072479, 198580612,
+    169007332, 118844526, 179433504, 155801952, 149256630, 162048766,
+    116134365, 133992028, 175452085, 155344144, 109905129, 182727454,
+    165911813, 122232840, 151166615, 165070983, 175574337, 129548631,
+    120411217, 116380915, 160616116, 157320000, 183306114, 160618128,
+    103262586, 195951602, 146321661, 138576614, 180471993, 127077713,
+    116441201, 159496011, 106328305, 120759583, 148503050, 179095584,
+    198298218, 167402898, 138551383, 123957020, 180763975, 150429225,
+    198476470, 171016426, 197438450, 143091658, 164528360, 132493360,
+    143546572, 137557916, 113663241, 120457809, 196971566, 134022158,
+    180545794, 131328278, 100552461, 132088901, 187421210, 192448910,
+    141005215, 149680971, 113720754, 100571096, 134066431, 135745439,
+    191597694, 135788920, 179342561, 177830222, 137011486, 142492523,
+    192487287, 113132021, 176673607, 156645598, 127260957, 141566023,
+    143787436, 129132109, 174858971, 150713073, 191040726, 143541417,
+    197057222, 165479803, 181512759, 157912400, 125344680, 148220261,
+    173422990, 101020483, 106246303, 137964746, 178190501, 181183037,
+    151538028, 179523433, 141955021, 135689770, 191290561, 143178787,
+    192086205, 174499925, 178975690, 118492103, 124206471, 138519113,
+    188147564, 102097605, 154895793, 178514140, 141453051, 151583964,
+    128232654, 106020603, 131189158, 165702720, 186250269, 191639375,
+    115278873, 160608114, 155694842, 110322407, 177272742, 116513642,
+    134366992, 171634030, 194053074, 180652685, 109301658, 192136921,
+    141431293, 171341061, 157153714, 106203978, 147618426, 150297807,
+    186062669, 169960809, 118422347, 163350477, 146719017, 145045144,
+    161663828, 146208240, 186735951, 102371302, 190444377, 194085350,
+    134454426, 133413062, 163074595, 113830310, 122931469, 134466832,
+    185176632, 182415152, 110179422, 164439571, 181217170, 121756492,
+    119644493, 196532222, 118765848, 182445119, 109401340, 150443213,
+    198586286, 121083179, 139396084, 143898019, 114787389, 177233102,
+    186310131, 148695521, 126205182, 178063494, 157118662, 177825659,
+    188310053, 151552316, 165984394, 109022180, 163144545, 121212978,
+    197344714, 188741258, 126822386, 102360271, 109981191, 152056882,
+    134723983, 158013366, 106837863, 128867928, 161973236, 172536066,
+    185216856, 132011948, 197807339, 158419190, 166595838, 167852941,
+    124187182, 117279875, 106103946, 106481958, 157456200, 160892122,
+    184163943, 173846549, 158993202, 184812364, 133466119, 170732430,
+    195458590, 173361878, 162906318, 150165106, 126757685, 112163575,
+    188696307, 145199922, 100107766, 176830946, 198149756, 122682434,
+    179367131, 108412102, 119520899, 148191244, 140487511, 171059184,
+    141399078, 189455775, 118462161, 190415309, 134543802, 180893862,
+    180732375, 178615267, 179711433, 123241969, 185780563, 176301808,
+    184386640, 160717536, 183213626, 129671224, 126094285, 140110963,
+    121826276, 151201170, 122552929, 128965559, 146082049, 138409069,
+    107606920, 103954646, 119164002, 115673360, 117909631, 187289199,
+    186343410, 186903200, 157966371, 103128612, 135698881, 176403642,
+    152540837, 109810814, 183519031, 121318624, 172281810, 150845123,
+    169019064, 166322359, 138872454, 163073727, 128087898, 130041018,
+    194859136, 173742589, 141812405, 167291912, 138003306, 134499821,
+    196315803, 186381054, 124578934, 150084553, 128031351, 118843410,
+    107373060, 159565443, 173624887, 171292628, 198074235, 139074061,
+    178690578, 144431052, 174262641, 176783005, 182214864, 162289361,
+    192966929, 192033046, 169332843, 181580535, 164864073, 118444059,
+    195496893, 153773183, 167266131, 130108623, 158802128, 180432893,
+    144562140, 147978945, 142337360, 158506327, 104399819, 132635916,
+    168734194, 136567839, 101281912, 120281622, 195003330, 112236091,
+    185875592, 101959081, 122415367, 194990954, 148881099, 175891989,
+    108115811, 163538891, 163394029, 123722049, 184837522, 142362091,
+    100834097, 156679171, 100841679, 157022331, 178971071, 102928884,
+    189701309, 195339954, 124415335, 106062584, 139214524, 133864640,
+    134324406, 157317477, 155340540, 144810061, 177612569, 108474646,
+    114329765, 143900008, 138265211, 145210162, 136643111, 197987319,
+    102751191, 144121361, 169620456, 193602633, 161023559, 162140467,
+    102901215, 167964187, 135746835, 187317233, 110047459, 163339773,
+    124770449, 118885134, 141536376, 100915375, 164267438, 145016622,
+    113937193, 106748706, 128815954, 164819775, 119220771, 102367432,
+    189062690, 170911791, 194127762, 112245117, 123546771, 115640433,
+    135772061, 166615646, 174474627, 130562291, 133320309, 153340551,
+    138417181, 194605321, 150142632, 180008795, 151813296, 175497284,
+    167018836, 157425342, 150169942, 131069156, 134310662, 160434122,
+    105213831, 158797111, 150754540, 163290657, 102484886, 148697402,
+    187203725, 198692811, 149360627, 140384233, 128749423, 132178578,
+    177507355, 171857043, 178737969, 134023369, 102911446, 196144864,
+    197697194, 134527467, 144296030, 189437192, 154052665, 188907106,
+    162062575, 150993037, 199766583, 167936112, 181374511, 104971506,
+    115378374, 135795558, 167972129, 135876446, 130937572, 103221320,
+    124605656, 161129971, 131027586, 191128460, 143251843, 143269155,
+    129284585, 173495971, 150425653, 199302112, 118494723, 121323805,
+    116549802, 190991967, 168151180, 122483192, 151273721, 199792134,
+    133106764, 121874844, 126215985, 112167639, 167793529, 182985195,
+    185453921, 106957880, 158685312, 132775454, 133229161, 198905318,
+    190537253, 191582222, 192325972, 178133427, 181825606, 148823337,
+    160719681, 101448145, 131983362, 137910767, 112550175, 128826351,
+    183649210, 135725874, 110356573, 189469487, 154446940, 118175923,
+    106093708, 128146501, 185742532, 149692127, 164624247, 183221076,
+    154737505, 168198834, 156410354, 158027261, 125228550, 131543250,
+    139591848, 191898263, 104987591, 115406321, 103542638, 190012837,
+    142615518, 178773183, 175862355, 117537850, 169565995, 170028011,
+    158412588, 170150030, 117025916, 174630208, 142412449, 112839238,
+    105257725, 114737141, 123102301, 172563968, 130555358, 132628403,
+    183638157, 168682846, 143304568, 105994018, 170010719, 152092970,
+    117799058, 132164175, 179868116, 158654714, 177489647, 116547948,
+    183121404, 131836079, 184431405, 157311793, 149677763, 173989893,
+    102277656, 107058530, 140837477, 152640947, 143507039, 152145247,
+    101683884, 107090870, 161471944, 137225650, 128231458, 172995869,
+    173831689, 171268519, 139042297, 111072135, 107569780, 137262545,
+    181410950, 138270388, 198736451, 162848201, 180468288, 120582913,
+    153390138, 135649144, 130040157, 106509887, 192671541, 174507066,
+    186888783, 143805558, 135011967, 145862340, 180595327, 124727843,
+    182925939, 157715840, 136885940, 198993925, 152416883, 178793572,
+    179679516, 154076673, 192703125, 164187609, 162190243, 104699348,
+    159891990, 160012977, 174692145, 132970421, 167781726, 115178506,
+    153008552, 155999794, 102099694, 155431545, 127458567, 104403686,
+    168042864, 184045128, 181182309, 179349696, 127218364, 192935516,
+    120298724, 169583299, 148193297, 183358034, 159023227, 105261254,
+    121144370, 184359584, 194433836, 138388317, 175184116, 108817112,
+    151279233, 137457721, 193398208, 119005406, 132929377, 175306906,
+    160741530, 149976826, 147124407, 176881724, 186734216, 185881509,
+    191334220, 175930947, 117385515, 193408089, 157124410, 163472089,
+    131949128, 180783576, 131158294, 100549708, 191802336, 165960770,
+    170927599, 101052702, 181508688, 197828549, 143403726, 142729262,
+    110348701, 139928688, 153550062, 106151434, 130786653, 196085995,
+    100587149, 139141652, 106530207, 100852656, 124074703, 166073660,
+    153338052, 163766757, 120188394, 197277047, 122215363, 138511354,
+    183463624, 161985542, 159938719, 133367482, 104220974, 149956672,
+    170250544, 164232439, 157506869, 159133019, 137469191, 142980999,
+    134242305, 150172665, 121209241, 145596259, 160554427, 159095199,
+    168243130, 184279693, 171132070, 121049823, 123819574, 171759855,
+    119501864, 163094029, 175943631, 194450091, 191506160, 149228764,
+    132319212, 197034460, 193584259, 126727638, 168143633, 109856853,
+    127860243, 132141052, 133076065, 188414958, 158718197, 107124299,
+    159592267, 181172796, 144388537, 196763139, 127431422, 179531145,
+    100064922, 112650013, 132686230, 121550837,
   }
 \cs_new:Npn \__fp_trig_large:ww #1, #2#3#4#5#6;
   {
-    \exp_after:wN \__fp_trig_large_auxi:wwwwww
-    \int_value:w \__fp_int_eval:w (#1 - 32) / 64 \exp_after:wN ,
+    \exp_after:wN \__fp_trig_large_auxi:w
     \int_value:w \__fp_int_eval:w (#1 - 4) / 8 \exp_after:wN ,
-    \int_value:w #1 \__fp_trig_inverse_two_pi: ;
+    \int_value:w #1 , ;
     {#2}{#3}{#4}{#5} ;
   }
-\cs_new:Npn \__fp_trig_large_auxi:wwwwww #1, #2, #3, #4!
+\cs_new:Npn \__fp_trig_large_auxi:w #1, #2,
   {
-    \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
-    ;
+    \exp_after:wN \exp_after:wN
+    \exp_after:wN \__fp_trig_large_auxii:w
+    \cs:w
+      use_none:n \prg_replicate:nn { #2 - #1 * 8 } { n }
+      \exp_after:wN
+    \cs_end:
+    \int_value:w
+    \__kernel_intarray_item:Nn \c__fp_trig_intarray
+      { \__fp_int_eval:w #1 + 1 \scan_stop: }
+    \exp_after:wN \__fp_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c__fp_trig_intarray
+      { \__fp_int_eval:w #1 + 2 \scan_stop: }
+    \exp_after:wN \__fp_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c__fp_trig_intarray
+      { \__fp_int_eval:w #1 + 3 \scan_stop: }
+    \exp_after:wN \__fp_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c__fp_trig_intarray
+      { \__fp_int_eval:w #1 + 4 \scan_stop: }
+    \exp_after:wN \__fp_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c__fp_trig_intarray
+      { \__fp_int_eval:w #1 + 5 \scan_stop: }
+    \exp_after:wN \__fp_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c__fp_trig_intarray
+      { \__fp_int_eval:w #1 + 6 \scan_stop: }
+    \exp_after:wN \__fp_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c__fp_trig_intarray
+      { \__fp_int_eval:w #1 + 7 \scan_stop: }
+    \exp_after:wN \__fp_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c__fp_trig_intarray
+      { \__fp_int_eval:w #1 + 8 \scan_stop: }
+    \exp_after:wN \__fp_trig_large_auxiii:w \int_value:w
+    \__kernel_intarray_item:Nn \c__fp_trig_intarray
+      { \__fp_int_eval:w #1 + 9 \scan_stop: }
+    \exp_stop_f:
   }
-\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_auxii:w
+  {
+    \__fp_pack_twice_four:wNNNNNNNN \__fp_pack_twice_four:wNNNNNNNN
+    \__fp_pack_twice_four:wNNNNNNNN \__fp_pack_twice_four:wNNNNNNNN
+    \__fp_pack_twice_four:wNNNNNNNN \__fp_pack_twice_four:wNNNNNNNN
+    \__fp_pack_twice_four:wNNNNNNNN \__fp_pack_twice_four:wNNNNNNNN
+    \__fp_trig_large_auxv:www ;
+  }
+\cs_new:Npn \__fp_trig_large_auxiii:w 1 { \exp_stop_f: }
 \cs_new:Npn \__fp_trig_large_auxv:www #1; #2; #3;
   {
     \exp_after:wN \__fp_use_i_until_s:nw
@@ -17131,7 +18140,7 @@
     \exp_after:wN \__fp_from_dim_test:ww
     \exp_after:wN 0
     \exp_after:wN ,
-    \int_value:w \etex_glueexpr:D #1 ;
+    \int_value:w \tex_glueexpr:D #1 ;
   }
 \cs_new:Npn \__fp_from_dim_test:ww #1, #2
   {
@@ -17200,85 +18209,70 @@
   { \__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
+\sys_if_rand_exist:F
   {
     \__kernel_msg_new:nnn { kernel } { fp-no-random }
-      { Random~numbers~unavailable }
+      { Random~numbers~unavailable~for~#1 }
     \cs_new:Npn \__fp_rand_o:Nw ? #1 @
       {
-        \__kernel_msg_expandable_error:nn { kernel } { fp-no-random }
+        \__kernel_msg_expandable_error:nnn { kernel } { fp-no-random }
+          { fp~rand }
         \exp_after:wN \c_nan_fp
       }
     \cs_new_eq:NN \__fp_randint_o:Nw \__fp_rand_o:Nw
     \cs_new:Npn \int_rand:nn #1#2
       {
-        \__kernel_msg_expandable_error:nn { kernel } { fp-no-random }
+        \__kernel_msg_expandable_error:nnn { kernel } { fp-no-random }
+          { \int_rand:nn {#1} {#2} }
         \int_eval:n {#1}
       }
+    \cs_new:Npn \int_rand:n #1
+      {
+        \__kernel_msg_expandable_error:nnn { kernel } { fp-no-random }
+          { \int_rand:n {#1} }
+        1
+      }
   }
-\cs_if_exist:NT \pdftex_uniformdeviate:D
+\sys_if_rand_exist:T
   {
-    \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
+    \int_const:Nn \c__kernel_randint_max_int { 131071 }
+    \cs_new:Npn \__kernel_randint: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
+        (#1 * \tex_uniformdeviate:D 16384
+        + \tex_uniformdeviate:D #1 + 8192 ) / 16384
       }
-    \cs_new:Npn \__fp_rand_myriads_loop:nn #1#2
+    \cs_new:Npn \__fp_rand_myriads:n #1
+      { \__fp_rand_myriads_loop:w #1 \prg_break: X \prg_break_point: ; }
+    \cs_new:Npn \__fp_rand_myriads_loop:w #1 X
       {
-        \use_none:n #2
+        #1
         \exp_after:wN \__fp_rand_myriads_get:w
-        \int_value:w \__fp_rand_uniform: ; {#1}{#2}
+        \int_value:w \__fp_int_eval:w 9999 +
+          \__kernel_randint:n { 10000 }
+        \__fp_rand_myriads_loop:w
       }
-    \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 \__fp_int_eval:w
-            \c__fp_rand_eight_int + #1 \__fp_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 \__fp_int_eval:w
-              \c__fp_rand_four_int + #1 \__fp_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 \__fp_int_eval:w
-            \c__fp_rand_four_int + #1 \__fp_int_eval_end:
-        \else:
-          \exp_after:wN \__fp_rand_myriads_last:
-        \fi:
-      }
+    \cs_new:Npn \__fp_rand_myriads_get:w 1 #1 ; { ; {#1} }
     \cs_new:Npn \__fp_rand_o:Nw ? #1 @
       {
         \tl_if_empty:nTF {#1}
-          { \__fp_rand_o: }
           {
+            \exp_after:wN \__fp_rand_o:w
+            \exp:w \exp_end_continue_f:w
+            \__fp_rand_myriads:n { XXXX } { 0000 } { 0000 } ; 0
+          }
+          {
             \__kernel_msg_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_rand_o:w ;
+      {
+        \exp_after:wN \__fp_sanitize:Nw
+        \exp_after:wN 0
+        \int_value:w \__fp_int_eval:w \c_zero_int
+          \__fp_fixed_to_float_o:wN
+      }
     \cs_new:Npn \__fp_randint_o:Nw ?
       {
         \__fp_parse_function_one_two:nnw
@@ -17292,7 +18286,7 @@
           {
             \if_meaning:w 1 #1
               \if_int_compare:w
-                \use_i_delimit_by_q_stop:nw #3 \q_stop > \c__fp_prec_int
+                  \__fp_use_i_until_s:nw #3 ; > \c__fp_prec_int
                 1 \exp_stop_f:
               \fi:
             \fi:
@@ -17304,9 +18298,9 @@
         \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; }
+            \if:w 1 \__fp_compare_back:ww #2; #1; 1 \exp_stop_f: \fi:
+            0 \exp_stop_f:
+          \__fp_randint_auxi_o:ww #1; #2;
         \or:
           \__fp_invalid_operation_tl_o:ff
             { randint } { \__fp_array_to_clist:n { #1; #2; } }
@@ -17314,125 +18308,228 @@
         \fi:
         \exp_after:wN \exp_end:
       }
-    \cs_new:Npn \__fp_randint_e:wnn #1;
+    \cs_new:Npn \__fp_randint_auxi_o:ww #1 ; #2 ; #3 \exp_end:
       {
-        \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
-            }
+        \fi:
+        \__fp_randint_auxii:wn #2 ;
+        { \__fp_randint_auxii:wn #1 ; \__fp_randint_auxiii_o:ww }
       }
-    \cs_new:Npn \__fp_randint_e:wwNnn #1 ; #2 ;
+    \cs_new:Npn \__fp_randint_auxii:wn \s__fp \__fp_chk:w 1#1#2#3 ;
       {
-        \exp_after:wN \__fp_randint_e:wwwNnn
-        \int_value:w \int_mod:nn {#1} {#2} ; #1 ; #2 ;
+        \exp_after:wN \__fp_ep_to_fixed:wwn
+        \int_value:w \__fp_int_eval:w
+          #2 - \c__fp_prec_int , #3 {0000} {0000} ;
+        {
+          \if_meaning:w 0 #1
+            \exp_after:wN \use_i:nnnn
+            \exp_after:wN \__fp_fixed_add_one:wN
+          \fi:
+          \exp_after:wN \__fp_fixed_sub:wwn \c__fp_one_fixed_tl
+        }
+        \__fp_fixed_continue:wn
       }
-    \cs_new:Npn \__fp_randint_e:wwwNnn #1 ; #2 ; #3 ; #4
+    \cs_new:Npn \__fp_randint_auxiii_o:ww #1 ; #2 ;
       {
-        \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} }
+        \__fp_fixed_add:wwn #2 ;
+          {0000} {0000} {0000} {0001} {0000} {0000} ;
+        \__fp_fixed_sub:wwn #1 ;
+        {
+          \exp_after:wN \use_i:nn
+          \exp_after:wN \__fp_fixed_mul_add:wwwn
+          \exp:w \exp_end_continue_f:w \__fp_rand_myriads:n { XXXXXX } ;
+        }
+        #1 ;
+        \__fp_randint_auxiv_o:ww
+        #2 ;
+        \__fp_randint_auxv_o:w #1 ; @
       }
-    \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
+    \cs_new:Npn \__fp_randint_auxiv_o:ww #1#2#3#4#5 ; #6#7#8#9
       {
-        \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}
+        \if_int_compare:w
+            \if_int_compare:w #1#2 > #6#7 \exp_stop_f: 1 \else:
+            \if_int_compare:w #1#2 < #6#7 \exp_stop_f: - \fi: \fi:
+            #3#4 > #8#9 \exp_stop_f:
+          \__fp_use_i_until_s:nw
+        \fi:
+        \__fp_randint_auxv_o:w {#1}{#2}{#3}{#4}#5
       }
-    \cs_new:Npn \__fp_randint_wide_e:wnnn #1 ; #2#3#4
+    \cs_new:Npn \__fp_randint_auxv_o:w #1#2#3#4#5 ; #6 @
       {
-        \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 }
+        \exp_after:wN \__fp_sanitize:Nw
+        \int_value:w
+        \if_int_compare:w #1 < 10000 \exp_stop_f:
+          2
+        \else:
+          0
+          \exp_after:wN \exp_after:wN
+          \exp_after:wN \__fp_reverse_args:Nww
+        \fi:
+        \exp_after:wN \__fp_fixed_sub:wwn \c__fp_one_fixed_tl
+        {#1} {#2} {#3} {#4} {0000} {0000} ;
+        {
+          \exp_after:wN \exp_stop_f:
+          \int_value:w \__fp_int_eval:w \c__fp_prec_int
+            \__fp_fixed_to_float_o:wN
+        }
+        0
+        \exp:w \exp_after:wN \exp_end:
       }
     \cs_new:Npn \int_rand:nn #1#2
       {
-        \exp_after:wN \__fp_randint:ww
-        \int_value:w \int_eval:n {#1} \exp_after:wN ;
-        \int_value:w \int_eval:n {#2} ;
+        \int_eval:n
+          {
+            \exp_after:wN \__fp_randint:ww
+            \int_value:w \int_eval:n {#1} \exp_after:wN ;
+            \int_value:w \int_eval:n {#2} ;
+          }
       }
     \cs_new:Npn \__fp_randint:ww #1; #2;
       {
-        \int_compare:nNnTF {#1} > {#2}
-          {
-            \__kernel_msg_expandable_error:nnnn
-              { kernel } { randint-backward-range } {#1} {#2}
-            \__fp_randint: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 } }
-                  {
-                    \int_eval:n
-                      {
-                        #1 +
-                        \exp_args:Nf \__fp_randint_narrow:n
-                          { \int_eval:n { #2 - #1 + 1 } }
-                      }
-                  }
-                  { \fp_to_int:n { randint(#1,#2) } }
-          }
+        \if_int_compare:w #1 > #2 \exp_stop_f:
+          \__kernel_msg_expandable_error:nnnn
+            { kernel } { randint-backward-range } {#1} {#2}
+          \__fp_randint:ww #2; #1;
+        \else:
+          \if_int_compare:w \__fp_int_eval:w #2
+              \if_int_compare:w #1 > \c_zero_int
+                - #1 < \__fp_int_eval:w
+              \else:
+                < \__fp_int_eval:w #1 +
+              \fi:
+              \c__kernel_randint_max_int
+              \__fp_int_eval_end:
+            \__kernel_randint:n
+              { \__fp_int_eval:w #2 - #1 + 1 \__fp_int_eval_end: }
+            - 1 + #1
+          \else:
+            \__kernel_randint:nn {#1} {#2}
+          \fi:
+        \fi:
       }
-    \cs_new:Npn \__fp_randint_narrow:n #1
+    \cs_new:Npn \__kernel_randint:nn #1#2
       {
-        \exp_args:Nf \__fp_randint_narrow:nn
-          { \int_div_truncate:nn \c__fp_rand_size_int {#1} } {#1}
+        #1
+        \exp_after:wN \__fp_randint_wide_aux:w
+        \int_value:w
+          \exp_after:wN \__fp_randint_split_o:Nw
+          \tex_uniformdeviate:D 268435456 ;
+        \int_value:w
+          \exp_after:wN \__fp_randint_split_o:Nw
+          \tex_uniformdeviate:D 268435456 ;
+        \int_value:w
+          \exp_after:wN \__fp_randint_split_o:Nw
+          \int_value:w \__fp_int_eval:w 131072 +
+            \exp_after:wN \__fp_randint_split_o:Nw
+            \int_value:w
+              \__kernel_int_add:nnn {#2} { -#1 } { -\c_max_int } ;
+        .
       }
-    \cs_new:Npn \__fp_randint_narrow:nn #1
+    \cs_new:Npn \__fp_randint_split_o:Nw #1#2 ;
       {
-        \exp_args:Nf \__fp_randint_narrow:nnn
-          {
-            \int_div_truncate:nn
-              { \pdftex_uniformdeviate:D \c__fp_rand_size_int } {#1}
-          }
-          {#1}
+        \if_meaning:w 0 #1
+          0 \exp_after:wN ; \int_value:w 0
+        \else:
+          \exp_after:wN \__fp_randint_split_aux:w
+          \int_value:w \__fp_int_eval:w (#1#2 - 8192) / 16384 ;
+          + #1#2
+        \fi:
+        \exp_after:wN ;
       }
-    \cs_new:Npn \__fp_randint_narrow:nnn #1#2#3
+    \cs_new:Npn \__fp_randint_split_aux:w #1 ;
       {
-        \int_compare:nNnTF {#1} < {#3}
-          {#1}
-          { \__fp_randint_narrow:nn {#2} {#3} }
+        #1 \exp_after:wN ;
+        \int_value:w \__fp_int_eval:w - #1 * 16384
       }
+    \cs_new:Npn \__fp_randint_wide_aux:w #1;#2; #3;#4; #5;#6;#7; .
+      {
+        \exp_after:wN \__fp_randint_wide_auxii:w
+        \int_value:w \__fp_int_eval:w #5 * #3 + #6 * #1 +
+          (#5 * #4 + #6 * #3 + #7 * #1 +
+           (#5 * #2 +           #7 * #3 +
+            (16384 * #6 + #7) * (16384 * #4 + #2) / 268435456) / 16384
+          ) / 16384 \exp_after:wN ;
+        \int_value:w \__fp_int_eval:w (#5 + #6) * 16384 + #7 ;
+        #1 ; #5 ;
+      }
+    \cs_new:Npn \__fp_randint_wide_auxii:w #1; #2; #3; #4;
+      {
+        \if_int_odd:w 0
+            \if_int_compare:w #1 = #2 \else: \exp_stop_f: \fi:
+            \if_int_compare:w #4 = \c_zero_int 1 \fi:
+            \if_int_compare:w #3 = 16383 ~ 1 \fi:
+            \exp_stop_f:
+          \exp_after:wN \prg_break:
+        \fi:
+        \if_int_compare:w #4 < 8 \exp_stop_f:
+          + #4 * #3 * 16384
+        \else:
+          + 8 * #3 * 16384 + (#4 - 8) * #3 * 16384
+        \fi:
+        + #1
+        \prg_break_point:
+      }
+    \cs_new:Npn \int_rand:n #1
+      {
+        \int_eval:n
+          { \exp_args:Nf \__fp_randint:n { \int_eval:n {#1} } }
+      }
+    \cs_new:Npn \__fp_randint:n #1
+      {
+        \if_int_compare:w #1 < 1 \exp_stop_f:
+          \__kernel_msg_expandable_error:nnnn
+            { kernel } { randint-backward-range } { 1 } {#1}
+          \__fp_randint:ww #1; 1;
+        \else:
+          \if_int_compare:w #1 > \c__kernel_randint_max_int
+            \__kernel_randint:nn { 1 } {#1}
+          \else:
+            \__kernel_randint:n {#1}
+          \fi:
+        \fi:
+      }
   }
-%% File: l3intarray.dtx Copyright (C) 2017-2018 The LaTeX3 Project
-\dim_const:Nn \c__intarray_sp_dim { 1 sp }
-\int_new:N \g__intarray_font_int
-\__kernel_patch:nnNNpn { \__kernel_chk_var_scope:NN g #1 } { }
-\cs_new_protected:Npn \intarray_new:Nn #1#2
+%% File: l3fparray.dtx Copyright (C) 2018 The LaTeX3 Project
+\int_new:N \g__fp_array_int
+\int_new:N \l__fp_array_loop_int
+\cs_new_protected:Npn \fparray_new:Nn #1#2
   {
-    \__kernel_chk_if_free_cs:N #1
-    \int_gincr:N \g__intarray_font_int
-    \tex_global:D \tex_font:D #1
-      = cmr10~at~ \g__intarray_font_int \c__intarray_sp_dim \scan_stop:
-    \tex_hyphenchar:D #1 = \int_eval:n {#2} \scan_stop:
-    \int_compare:nNnT { \tex_hyphenchar:D #1 } > 0
-      { \tex_fontdimen:D \tex_hyphenchar:D #1 #1 = \c_zero_dim }
-    \int_step_inline:nn { 8 } { \tex_fontdimen:D ##1 #1 = \c_zero_dim }
+    \tl_new:N #1
+    \prg_replicate:nn { 3 }
+      {
+        \int_gincr:N \g__fp_array_int
+        \exp_args:NNc \tl_gput_right:Nn #1
+          { g__fp_array_ \__fp_int_to_roman:w \g__fp_array_int _intarray }
+      }
+    \exp_last_unbraced:Nfo \__fp_array_new:nNNNN
+      { \int_eval:n {#2} } #1 #1
   }
-\cs_new:Npn \intarray_count:N #1 { \tex_the:D \tex_hyphenchar:D #1 }
-\cs_new:Npn \__intarray_bounds:NNnTF #1#2#3#4#5
+\cs_new_protected:Npn \__fp_array_new:nNNNN #1#2#3#4#5
   {
+    \int_compare:nNnTF {#1} < 0
+      {
+        \__kernel_msg_error:nnn { kernel } { negative-array-size } {#1}
+        \cs_undefine:N #1
+        \int_gsub:Nn \g__fp_array_int { 3 }
+      }
+      {
+        \intarray_new:Nn #2 {#1}
+        \intarray_new:Nn #3 {#1}
+        \intarray_new:Nn #4 {#1}
+      }
+  }
+\cs_new:Npn \fparray_count:N #1
+  {
+    \exp_after:wN \use_i:nnn
+    \exp_after:wN \intarray_count:N #1
+  }
+\cs_new:Npn \__fp_array_bounds:NNnTF #1#2#3#4#5
+  {
     \if_int_compare:w 1 > #3 \exp_stop_f:
-      \__intarray_bounds_error:NNn #1 #2 {#3}
+      \__fp_array_bounds_error:NNn #1 #2 {#3}
       #5
     \else:
-      \if_int_compare:w #3 > \intarray_count:N #2 \exp_stop_f:
-        \__intarray_bounds_error:NNn #1 #2 {#3}
+      \if_int_compare:w #3 > \fparray_count:N #2 \exp_stop_f:
+        \__fp_array_bounds_error:NNn #1 #2 {#3}
         #5
       \else:
         #4
@@ -17439,53 +18536,125 @@
       \fi:
     \fi:
   }
-\cs_new:Npn \__intarray_bounds_error:NNn #1#2#3
+\cs_new:Npn \__fp_array_bounds_error:NNn #1#2#3
   {
     #1 { kernel } { out-of-bounds }
-      { \token_to_str:N #2 } {#3} { \intarray_count:N #2 }
+      { \token_to_str:N #2 } {#3} { \fparray_count:N #2 }
   }
-\cs_new_protected:Npn \__kernel_intarray_gset:Nnn #1#2#3
-  { \tex_fontdimen:D #2 #1 #3 \c__intarray_sp_dim }
-\cs_new_protected:Npn \intarray_gset:Nnn #1#2#3
+\cs_new_protected:Npn \fparray_gset:Nnn #1#2#3
   {
-    \exp_after:wN \__intarray_gset:Nww
+    \exp_after:wN \exp_after:wN
+    \exp_after:wN \__fp_array_gset:NNNNww
     \exp_after:wN #1
+    \exp_after:wN #1
     \int_value:w \int_eval:n {#2} \exp_after:wN ;
-    \int_value:w \int_eval:n {#3} ;
+    \exp:w \exp_end_continue_f:w \__fp_parse:n {#3}
   }
-\cs_new_protected:Npn \__intarray_gset:Nww #1#2 ; #3 ;
+\cs_new_protected:Npn \__fp_array_gset:NNNNww #1#2#3#4#5 ; #6 ;
   {
-    \__intarray_bounds:NNnTF \__kernel_msg_error:nnxxx #1 {#2}
+    \__fp_array_bounds:NNnTF \__kernel_msg_error:nnxxx #4 {#5}
       {
-        \if_int_compare:w \int_abs:n {#3} > \c_max_dim
-          \exp_after:wN \__intarray_gset_overflow:NNnn
-        \fi:
-        \__kernel_intarray_gset:Nnn #1 {#2} {#3}
+        \exp_after:wN \__fp_change_func_type:NNN
+          \__fp_use_i_until_s:nw #6 ;
+          \__fp_array_gset:w
+          \__fp_array_gset_recover:Nw
+        #6 ; {#5} #1 #2 #3
       }
       { }
   }
-\cs_new_protected:Npn \__intarray_gset_overflow:NNnn #1#2#3#4
+\cs_new_protected:Npn \__fp_array_gset_recover:Nw #1#2 ;
   {
-    \__kernel_msg_error:nnxxxx { kernel } { overflow }
-      { \token_to_str:N #2 } {#3} {#4}
-      { \int_value:w \int_compare:nNnT {#4} < 0 { - } \c_max_dim }
-    \__kernel_intarray_gset:Nnn #2 {#3}
-      { \int_value:w \int_compare:nNnT {#4} < 0 { - } \c_max_dim }
+    \__fp_error:nffn { fp-unknown-type } { \tl_to_str:n { #2 ; } } { } { }
+    \exp_after:wN #1 \c_nan_fp
   }
-\cs_new:Npn \__kernel_intarray_item:Nn #1#2
-  { \int_value:w \tex_fontdimen:D #2 #1 }
-\cs_new:Npn \intarray_item:Nn #1#2
+\cs_new_protected:Npn \__fp_array_gset:w \s__fp \__fp_chk:w #1#2
   {
-    \exp_after:wN \__intarray_item:Nw
+    \if_case:w #1 \exp_stop_f:
+         \__fp_case_return:nw { \__fp_array_gset_special:nnNNN {#2} }
+    \or: \exp_after:wN \__fp_array_gset_normal:w
+    \or: \__fp_case_return:nw { \__fp_array_gset_special:nnNNN { #2 3 } }
+    \or: \__fp_case_return:nw { \__fp_array_gset_special:nnNNN { 1 } }
+    \fi:
+    \s__fp \__fp_chk:w #1 #2
+  }
+\cs_new_protected:Npn \__fp_array_gset_normal:w
+  \s__fp \__fp_chk:w 1 #1 #2 #3#4#5 ; #6#7#8#9
+  {
+    \__kernel_intarray_gset:Nnn #7 {#6} {#2}
+    \__kernel_intarray_gset:Nnn #8 {#6}
+      { \if_meaning:w 2 #1 3 \else: 1 \fi: #3#4 }
+    \__kernel_intarray_gset:Nnn #9 {#6} { 1 \use:nn #5 }
+  }
+\cs_new_protected:Npn \__fp_array_gset_special:nnNNN #1#2#3#4#5
+  {
+    \__kernel_intarray_gset:Nnn #3 {#2} {#1}
+    \__kernel_intarray_gset:Nnn #4 {#2} {0}
+    \__kernel_intarray_gset:Nnn #5 {#2} {0}
+  }
+\cs_new_protected:Npn \fparray_gzero:N #1
+  {
+    \int_zero:N \l__fp_array_loop_int
+    \prg_replicate:nn { \fparray_count:N #1 }
+      {
+        \int_incr:N \l__fp_array_loop_int
+        \exp_after:wN \__fp_array_gset_special:nnNNN
+        \exp_after:wN 0
+        \exp_after:wN \l__fp_array_loop_int
+        #1
+      }
+  }
+\cs_new:Npn \fparray_item:Nn #1#2
+  {
+    \exp_after:wN \__fp_array_item:NwN
     \exp_after:wN #1
     \int_value:w \int_eval:n {#2} ;
+    \__fp_to_decimal:w
   }
-\cs_new:Npn \__intarray_item:Nw #1#2 ;
+\cs_new:Npn \fparray_item_to_tl:Nn #1#2
   {
-    \__intarray_bounds:NNnTF \__kernel_msg_expandable_error:nnfff #1 {#2}
-      { \__kernel_intarray_item:Nn #1 {#2} }
-      { 0 }
+    \exp_after:wN \__fp_array_item:NwN
+    \exp_after:wN #1
+    \int_value:w \int_eval:n {#2} ;
+    \__fp_to_tl:w
   }
+\cs_new:Npn \__fp_array_item:NwN #1#2 ; #3
+  {
+    \__fp_array_bounds:NNnTF \__kernel_msg_expandable_error:nnfff #1 {#2}
+      { \exp_after:wN \__fp_array_item:NNNnN #1 {#2} #3 }
+      { \exp_after:wN #3 \c_nan_fp }
+  }
+\cs_new:Npn \__fp_array_item:NNNnN #1#2#3#4
+  {
+    \exp_after:wN \__fp_array_item:N
+    \int_value:w \__kernel_intarray_item:Nn #2 {#4} \exp_after:wN ;
+    \int_value:w \__kernel_intarray_item:Nn #3 {#4} \exp_after:wN ;
+    \int_value:w \__kernel_intarray_item:Nn #1 {#4} ;
+  }
+\cs_new:Npn \__fp_array_item:N #1
+  {
+    \if_meaning:w 0 #1 \exp_after:wN \__fp_array_item_special:w \fi:
+    \__fp_array_item:w #1
+  }
+\cs_new:Npn \__fp_array_item:w #1 #2#3#4#5 #6 ; 1 #7 ;
+  {
+    \exp_after:wN \__fp_array_item_normal:w
+    \int_value:w \if_meaning:w #1 1 0 \else: 2 \fi: \exp_stop_f:
+    #7 ; {#2#3#4#5} {#6} ;
+  }
+\cs_new:Npn \__fp_array_item_special:w #1 ; #2 ; #3 ; #4
+  {
+    \exp_after:wN #4
+    \exp:w \exp_end_continue_f:w
+    \if_case:w #3 \exp_stop_f:
+         \exp_after:wN \c_zero_fp
+    \or: \exp_after:wN \c_nan_fp
+    \or: \exp_after:wN \c_minus_zero_fp
+    \or: \exp_after:wN \c_inf_fp
+    \else: \exp_after:wN \c_minus_inf_fp
+    \fi:
+  }
+\cs_new:Npn \__fp_array_item_normal:w #1 #2#3#4#5 #6 ; #7 ; #8 ; #9
+  { #9 \s__fp \__fp_chk:w 1 #1 {#8} #7 {#2#3#4#5} {#6} ; }
 %% File l3sort.dtx (C) Copyright 2012-2018 The LaTeX3 Project
 \seq_new:N \g__sort_internal_seq
 \tl_new:N \g__sort_internal_tl
@@ -18177,13 +19346,13 @@
         \exp_after:wN \prg_break:
       \fi:
       \tex_the:D \tex_toks:D #1 \s__tl
-      \if_case:w \etex_gluestretch:D \tex_skip:D #1 \exp_stop_f:
+      \if_case:w \tex_gluestretch:D \tex_skip:D #1 \exp_stop_f:
              \token_to_str:N A
       \or:   1
       \or:   1
       \else: 2
       \fi:
-      \if_int_odd:w \etex_gluestretch:D \tex_skip:D #1 \exp_stop_f:
+      \if_int_odd:w \tex_gluestretch:D \tex_skip:D #1 \exp_stop_f:
         \exp_after:wN \__tl_analysis_b_special_char:wN \int_value:w
       \else:
         \exp_after:wN \__tl_analysis_b_special_space:w \int_value:w
@@ -18334,7 +19503,7 @@
 \cs_new_protected:Npn \tl_show_analysis:n #1
   { \tl_analysis_show:n {#1} }
 %% File: l3regex.dtx Copyright (C) 2011-2018 The LaTeX3 Project
-\cs_new_eq:NN \__regex_int_eval:w \etex_numexpr:D
+\cs_new_eq:NN \__regex_int_eval:w \tex_numexpr:D
 \cs_new_protected:Npn \__regex_standard_escapechar:
   { \int_set:Nn \tex_escapechar:D { `\\ } }
 \cs_new:Npn \__regex_toks_use:w { \tex_the:D \tex_toks:D }
@@ -18823,6 +19992,18 @@
 \cs_new_eq:NN \l__regex_internal_regex \c__regex_no_match_regex
 \seq_new:N \l__regex_show_prefix_seq
 \int_new:N \l__regex_show_lines_int
+\prg_new_conditional:Npnn \__regex_two_if_eq:NNNN #1#2#3#4 { TF }
+  {
+    \if_meaning:w #1 #3
+      \if:w #2 #4
+        \prg_return_true:
+      \else:
+        \prg_return_false:
+      \fi:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
 \cs_new_protected:Npn \__regex_get_digits:NTFw #1#2#3#4#5
   {
     \__regex_if_raw_digit:NNTF #4 #5
@@ -19049,7 +20230,7 @@
   }
 \cs_new_protected:Npn \__regex_compile_quantifier_lazyness:nnNN #1#2#3#4
   {
-    \str_if_eq:nnTF { #3 #4 } { \__regex_compile_special:N ? }
+    \__regex_two_if_eq:NNNNTF #3 #4 \__regex_compile_special:N ?
       {
         \tl_build_put_right:Nn \l__regex_build_tl
           { \if_false: { \fi: } { #1 } { #2 } \c_true_bool }
@@ -19096,8 +20277,7 @@
   }
 \cs_new_protected:Npn \__regex_compile_quantifier_braced_auxii:w #1#2
   {
-    \str_if_eq_x:nnTF
-      { #1 #2 } { \__regex_compile_special:N \c_right_brace_str }
+    \__regex_two_if_eq:NNNNTF #1 #2 \__regex_compile_special:N \c_right_brace_str
       {
         \exp_args:No \__regex_compile_quantifier_lazyness:nnNN
           { \int_use:N \l__regex_internal_a_int } { -1 }
@@ -19110,8 +20290,7 @@
   }
 \cs_new_protected:Npn \__regex_compile_quantifier_braced_auxiii:w #1#2
   {
-    \str_if_eq_x:nnTF
-      { #1 #2 } { \__regex_compile_special:N \c_right_brace_str }
+    \__regex_two_if_eq:NNNNTF #1 #2 \__regex_compile_special:N \c_right_brace_str
       {
         \if_int_compare:w \l__regex_internal_a_int >
           \l__regex_internal_b_int
@@ -19145,7 +20324,7 @@
   {
     \__regex_if_in_class:TF
       {
-        \str_if_eq:nnTF {#2#3} { \__regex_compile_special:N - }
+        \__regex_two_if_eq:NNNNTF #2 #3 \__regex_compile_special:N -
           { \__regex_compile_range:Nw #1 }
           {
             \__regex_compile_one:n
@@ -19324,7 +20503,7 @@
 \cs_new_protected:Npn \__regex_compile_class:TFNN #1#2#3#4
   {
     \l__regex_mode_int = \int_value:w \l__regex_mode_int 3 \exp_stop_f:
-    \str_if_eq:nnTF { #3 #4 } { \__regex_compile_special:N ^ }
+    \__regex_two_if_eq:NNNNTF #3 #4 \__regex_compile_special:N ^
       {
         \tl_build_put_right:Nn \l__regex_build_tl { #2 { \if_false: } \fi: }
         \__regex_compile_class:NN
@@ -19361,7 +20540,7 @@
   }
 \cs_new_protected:Npn \__regex_compile_class_posix:NNNNw #1#2#3#4#5#6
   {
-    \str_if_eq:nnTF { #5 #6 } { \__regex_compile_special:N ^ }
+    \__regex_two_if_eq:NNNNTF #5 #6 \__regex_compile_special:N ^
       {
         \bool_set_false:N \l__regex_internal_bool
         \tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi:
@@ -19381,8 +20560,9 @@
   }
 \cs_new_protected:Npn \__regex_compile_class_posix_end:w #1#2#3#4
   {
-    \str_if_eq:nnTF { #1 #2 #3 #4 }
-      { \__regex_compile_special:N : \__regex_compile_special:N ] }
+    \__regex_two_if_eq:NNNNTF #1 #2 \__regex_compile_special:N :
+      { \__regex_two_if_eq:NNNNTF #3 #4 \__regex_compile_special:N ] }
+      { \use_ii:nn }
       {
         \cs_if_exist:cTF { __regex_posix_ \l__regex_internal_a_tl : }
           {
@@ -19450,7 +20630,7 @@
   }
 \cs_new_protected:Npn \__regex_compile_lparen:w #1#2#3#4
   {
-    \str_if_eq:nnTF { #1 #2 } { \__regex_compile_special:N ? }
+    \__regex_two_if_eq:NNNNTF #1 #2 \__regex_compile_special:N ?
       {
         \cs_if_exist_use:cF
           { __regex_compile_special_group_\token_to_str:N #4 :w }
@@ -19485,7 +20665,7 @@
   { \__regex_compile_group_begin:N \__regex_group_resetting:nnnN }
 \cs_new_protected:Npn \__regex_compile_special_group_i:w #1#2
   {
-    \str_if_eq:nnTF { #1 #2 } { \__regex_compile_special:N ) }
+    \__regex_two_if_eq:NNNNTF #1 #2 \__regex_compile_special:N )
       {
         \cs_set:Npn \__regex_item_equal:n
           { \__regex_item_caseless_equal:n }
@@ -19502,8 +20682,9 @@
   }
 \cs_new_protected:cpn { __regex_compile_special_group_-:w } #1#2#3#4
   {
-    \str_if_eq:nnTF { #1 #2 #3 #4 }
-      { \__regex_compile_raw:N i \__regex_compile_special:N ) }
+    \__regex_two_if_eq:NNNNTF #1 #2 \__regex_compile_raw:N i
+      { \__regex_two_if_eq:NNNNTF #3 #4 \__regex_compile_special:N ) }
+      { \use_ii:nn }
       {
         \cs_set:Npn \__regex_item_equal:n
           { \__regex_item_caseful_equal:n }
@@ -19564,7 +20745,7 @@
           \c__regex_catcode_in_class_mode_int
         \fi:
     \int_zero:N \l__regex_catcodes_int
-    \str_if_eq:nnTF { #1 #2 } { \__regex_compile_special:N ^ }
+    \__regex_two_if_eq:NNNNTF #1 #2 \__regex_compile_special:N ^
       {
         \bool_set_false:N \l__regex_catcodes_bool
         \__regex_compile_c_lbrack_loop:NN
@@ -19690,8 +20871,7 @@
     \__regex_if_in_class_or_catcode:TF
       { \__regex_compile_raw_error:N u #1 #2 }
       {
-        \str_if_eq_x:nnTF {#1#2}
-          { \__regex_compile_special:N \c_left_brace_str }
+        \__regex_two_if_eq:NNNNTF #1 #2 \__regex_compile_special:N \c_left_brace_str
           {
             \tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi:
             \__regex_compile_u_loop:NN
@@ -20746,9 +21926,8 @@
   }
 \cs_new_protected:Npn \__regex_replacement_g:w #1#2
   {
-    \str_if_eq_x:nnTF
-      { #1#2 }
-      { \__regex_replacement_normal:n \c_left_brace_str }
+    \__regex_two_if_eq:NNNNTF
+      #1 #2 \__regex_replacement_normal:n \c_left_brace_str
       { \l__regex_internal_a_int = \__regex_replacement_g_digits:NN }
       { \__regex_replacement_error:NNN g #1 #2 }
   }
@@ -20806,9 +21985,8 @@
   }
 \cs_new_protected:Npn \__regex_replacement_u:w #1#2
   {
-    \str_if_eq_x:nnTF
-      { #1#2 }
-      { \__regex_replacement_normal:n \c_left_brace_str }
+    \__regex_two_if_eq:NNNNTF
+      #1 #2 \__regex_replacement_normal:n \c_left_brace_str
       { \__regex_replacement_cu_aux:Nw \exp_not:V }
       { \__regex_replacement_error:NNN u #1#2 }
   }
@@ -20833,12 +22011,8 @@
             #2 #3
           }
           {
-            \str_if_eq:nnTF
-              { #2#3 }
+            \__regex_two_if_eq:NNNNTF #2 #3 \__regex_replacement_normal:n (
               {
-                \__regex_replacement_normal:n ( % )
-              }
-              {
                 \seq_push:NV \l__regex_replacement_category_seq
                   \l__regex_replacement_category_tl
                 \tl_set:Nn \l__regex_replacement_category_tl {#1}
@@ -21570,7 +22744,7 @@
   }
   { }
 %% File: l3box.dtx Copyright (C) 2005-2018 The LaTeX3 Project
-\cs_new_eq:NN \__box_dim_eval:w \etex_dimexpr:D
+\cs_new_eq:NN \__box_dim_eval:w \tex_dimexpr:D
 \__kernel_patch_args:nNNpn
   {
     {
@@ -21683,12 +22857,12 @@
   { \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 } }
+  { \exp_args:No \__box_log:nNnn { \tex_the:D \tex_interactionmode:D } }
 \cs_new_protected:Npn \__box_log:nNnn #1#2#3#4
   {
-    \int_set:Nn \etex_interactionmode:D { 0 }
+    \int_set:Nn \tex_interactionmode:D { 0 }
     \__box_show:NNff 0 #2 { \int_eval:n {#3} } { \int_eval:n {#4} }
-    \int_set:Nn \etex_interactionmode:D {#1}
+    \int_set:Nn \tex_interactionmode:D {#1}
   }
 \cs_generate_variant:Nn \box_log:Nnn { c }
 \cs_new_protected:Npn \__box_show:NNnn #1#2#3#4
@@ -23064,9 +24238,9 @@
     Poles~of~coffin~#1 : #3 .
   }
 %% File: l3luatex.dtx Copyright (C) 2010-2018 The LaTeX3 Project
-\cs_new_eq:NN \__luatex_escape_x:n  \luatex_luaescapestring:D
-\cs_new_eq:NN \__luatex_now_x:n     \luatex_directlua:D
-\cs_new_eq:NN \__luatex_shipout_x:n \luatex_latelua:D
+\cs_new_eq:NN \__luatex_escape_x:n  \tex_luaescapestring:D
+\cs_new_eq:NN \__luatex_now_x:n     \tex_directlua:D
+\cs_new_eq:NN \__luatex_shipout_x:n \tex_latelua:D
 \cs_undefine:N \lua_escape_x:n
 \cs_undefine:N \lua_now_x:n
 \cs_new:Npn \lua_now_x:n #1 { \__luatex_now_x:n {#1} }
@@ -23112,7 +24286,7 @@
 \bool_lazy_or:nnTF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: }
   {
     \group_begin:
-      \cs_set_eq:NN \__char_generate:w \utex_char:D
+      \cs_set_eq:NN \__char_generate:w \tex_Uchar:D
       \ior_open:Nn \g__char_data_ior { UnicodeData.txt }
       \cs_set_protected:Npn \__char_data_auxi:w
         #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 ; #8 ; #9 ;
@@ -23126,7 +24300,10 @@
                 {
                   \tl_const:cx
                     { c__char_mixed_case_ \__char_generate:w "#1 _tl }
-                    { \__char_generate:w "#7 }
+                    {
+                       \char_generate:nn { "#7 }
+                        { \char_value_catcode:n { "#7 } }
+                    }
                 }
             }
         }
@@ -23146,7 +24323,10 @@
                 {
                   \tl_const:cx
                     { c__char_fold_case_ \__char_generate:w "#1 _tl }
-                    { \__char_generate:w "#3 }
+                    {
+                      \char_generate:nn { "#3 }
+                        { \char_value_catcode:n { "#3 } }
+                    }
                 }
             }
             {
@@ -23158,10 +24338,15 @@
         {
           \tl_const:cx { c__char_fold_case_ \__char_generate:w "#1 _tl }
             {
-              \__char_generate:w "#2 \exp_stop_f:
-              \__char_generate:w "#3 \exp_stop_f:
+              \char_generate:nn { "#2 }
+                { \char_value_catcode:n { "#2 } }
+              \char_generate:nn { "#3 }
+                { \char_value_catcode:n { "#3 } }
               \tl_if_blank:nF {#4}
-                { \__char_generate:w "#4 }
+                {
+                  \char_generate:nn { "#4 }
+                    { \char_value_catcode:n { "#4 } }
+                }
             }
         }
       \ior_str_map_inline:Nn \g__char_data_ior
@@ -23189,10 +24374,15 @@
             {
               \tl_const:cx { c__char_ #2 _case_ \__char_generate:w "#1 _tl }
                 {
-                  \__char_generate:w "#3 \exp_stop_f:
-                  \__char_generate:w "#4 \exp_stop_f:
+                  \char_generate:nn { "#3 }
+                    { \char_value_catcode:n { "#3 } }
+                  \char_generate:nn { "#4 }
+                    { \char_value_catcode:n { "#4 } }
                   \tl_if_blank:nF {#5}
-                    { \__char_generate:w "#5 }
+                    {
+                      \char_generate:nn { "#5 }
+                        { \char_value_catcode:n { "#5 } }
+                    }
                 }
             }
         }
@@ -23233,8 +24423,8 @@
 %% File: l3candidates.dtx Copyright (C) 2012-2018 The LaTeX3 Project
 \cs_new_protected:Npx \mode_leave_vertical:
   {
-    \cs_if_exist:NTF \pdftex_quitvmode:D
-      { \pdftex_quitvmode:D }
+    \cs_if_exist:NTF \tex_quitvmode:D
+      { \tex_quitvmode:D }
       {
         \exp_not:n
           {
@@ -23601,7 +24791,7 @@
     \file_get_full_name:nN {#1} \l__file_full_name_str
     \str_set:Nx #3
       {
-        \use:c { pdftex_file #2 :D } \exp_after:wN
+        \use:c { tex_file #2 :D } \exp_after:wN
           { \l__file_full_name_str }
       }
   }
@@ -23626,7 +24816,7 @@
         \file_get_full_name:nN {#1} \l__file_full_name_str
         \tl_set:Nx #2
           {
-            \pdftex_mdfivesum:D file \exp_after:wN
+            \tex_mdfivesum:D file \exp_after:wN
               { \l__file_full_name_str }
           }
       }
@@ -23726,6 +24916,12 @@
     \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2}
   }
 \cs_generate_variant:Nn \bool_const:Nn { c }
+\cs_new_protected:Npn \bool_set_inverse:N #1
+  { \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1 }
+\cs_generate_variant:Nn \bool_set_inverse:N { c }
+\cs_new_protected:Npn \bool_gset_inverse:N #1
+  { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 }
+\cs_generate_variant:Nn \bool_gset_inverse:N { c }
 \cs_new:Npn \prop_count:N #1
   {
     \int_eval:n
@@ -23835,7 +25031,7 @@
       { \s__seq \clist_map_function:nN {#2} \__seq_wrap_item:n }
   }
 \cs_generate_variant:Nn \seq_const_from_clist:Nn { c }
-\cs_if_exist:NTF \pdftex_uniformdeviate:D
+\cs_if_exist:NTF \tex_uniformdeviate:D
   {
     \int_new:N \l__seq_internal_a_int
     \int_new:N \l__seq_internal_b_int
@@ -23866,7 +25062,7 @@
       {
         \int_incr:N \l__seq_internal_a_int
         \int_set:Nn \l__seq_internal_b_int
-          { 1 + \pdftex_uniformdeviate:D \l__seq_internal_a_int }
+          { 1 + \tex_uniformdeviate:D \l__seq_internal_a_int }
         \tex_toks:D \l__seq_internal_a_int
           = \tex_toks:D \l__seq_internal_b_int
         \tex_toks:D \l__seq_internal_b_int
@@ -23882,15 +25078,51 @@
   }
   {
     \cs_new_protected:Npn \seq_shuffle:N #1
-      { \__kernel_msg_error:nn { kernel } { fp-no-random } }
+      {
+        \__kernel_msg_error:nnn { kernel } { fp-no-random }
+          { \seq_shuffle:N #1 }
+      }
     \cs_new_eq:NN \seq_gshuffle:N \seq_shuffle:N
   }
+\cs_new:Npn \seq_indexed_map_function:NN #1#2
+  {
+    \__seq_indexed_map:NN #1#2
+    \prg_break_point:Nn \seq_map_break: { }
+  }
+\cs_new_protected:Npn \seq_indexed_map_inline:Nn #1#2
+  {
+    \int_gincr:N \g__kernel_prg_map_int
+    \cs_gset_protected:cpn
+      { __seq_map_ \int_use:N \g__kernel_prg_map_int :w } ##1##2 {#2}
+    \exp_args:NNc \__seq_indexed_map:NN #1
+      { __seq_map_ \int_use:N \g__kernel_prg_map_int :w }
+    \prg_break_point:Nn \seq_map_break:
+      { \int_gdecr:N \g__kernel_prg_map_int }
+  }
+\cs_new:Npn \__seq_indexed_map:NN #1#2
+  {
+    \exp_after:wN \__seq_indexed_map:Nw
+    \exp_after:wN #2
+    \int_value:w 1
+    \exp_after:wN \use_i:nn
+    \exp_after:wN ;
+    #1
+    \prg_break: \__seq_item:n { } \prg_break_point:
+  }
+\cs_new:Npn \__seq_indexed_map:Nw #1#2 ; #3 \__seq_item:n #4
+  {
+    #3
+    #1 {#2} {#4}
+    \exp_after:wN \__seq_indexed_map:Nw
+    \exp_after:wN #1
+    \int_value:w \int_eval:w 1 + #2 ;
+  }
 \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 = \tex_gluestretch:D #1 \scan_stop:
+        #4 = \tex_glueshrink:D  #1 \scan_stop:
       }
       {
         #3 = \c_zero_skip
@@ -23898,22 +25130,90 @@
         #2
       }
   }
-\__sys_const:nn { sys_if_rand_exist }
-  { \cs_if_exist_p:N \pdftex_uniformdeviate:D }
-\cs_new:Npn \sys_rand_seed: { \tex_the:D \pdftex_randomseed:D }
-\cs_if_exist:NF \pdftex_randomseed:D
-  { \cs_set:Npn \sys_rand_seed: { 0 } }
-\cs_new_protected:Npn \sys_gset_rand_seed:n #1
-  { \pdftex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
+\str_const:Nx \c_sys_engine_version_str
+  {
+    \str_case:on \c_sys_engine_str
+      {
+        { pdftex }
+          {
+            \fp_eval:n { round(\int_use:N \tex_pdftexversion:D / 100 , 2) }
+            .
+            \tex_pdftexrevision:D
+          }
+        { ptex }
+          {
+            \cs_if_exist:NT \tex_ptexversion:D
+              {
+                p
+                \int_use:N  \tex_ptexversion:D
+                \int_use:N \tex_ptexminorversion:D
+                \tex_ptexrevision:D
+                -
+                \int_use:N \tex_epTeXversion:D
+              }
+          }
+        { luatex }
+          {
+            \fp_eval:n { round(\int_use:N \tex_luatexversion:D / 100, 2) }
+            .
+            \tex_luatexrevision:D
+          }
+        { uptex }
+          {
+            \cs_if_exist:NT \tex_ptexversion:D
+              {
+                p
+                \int_use:N  \tex_ptexversion:D
+                \int_use:N \tex_ptexminorversion:D
+                \tex_ptexrevision:D
+                -
+                u
+                \int_use:N  \tex_uptexversion:D
+                \tex_uptexrevision:D
+                -
+                \int_use:N \tex_epTeXversion:D
+              }
+          }
+        { xetex }
+          {
+            \int_use:N \tex_XeTeXversion:D
+            .
+            \tex_XeTeXrevision:D
+          }
+      }
+  }
+\sys_if_rand_exist:TF
+  { \cs_new:Npn \sys_rand_seed: { \tex_the:D \tex_randomseed:D } }
+  {
+    \cs_new:Npn \sys_rand_seed:
+      {
+        \int_value:w
+        \__kernel_msg_expandable_error:nnn { kernel } { fp-no-random }
+          { \sys_rand_seed: }
+        \c_zero_int
+      }
+  }
+\sys_if_rand_exist:TF
+  {
+    \cs_new_protected:Npn \sys_gset_rand_seed:n #1
+      { \tex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
+  }
+  {
+    \cs_new_protected:Npn \sys_gset_rand_seed:n #1
+      {
+        \__kernel_msg_error:nnn { kernel } { fp-no-random }
+          { \sys_gset_rand_seed:n {#1} }
+      }
+  }
 \int_const:Nn \c_sys_shell_escape_int
   {
     \sys_if_engine_luatex:TF
       {
-        \luatex_directlua:D
+        \tex_directlua:D
           { tex.sprint(status.shell_escape~or~os.execute()) }
       }
       {
-        \pdftex_shellescape:D
+        \tex_shellescape:D
       }
   }
 \__sys_const:nn { sys_if_shell }
@@ -23953,12 +25253,16 @@
 \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_if: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 } }
+          { \if_false: }
+          { \__tl_if_empty_if:o { \exp:w \exp_end_continue_f:w #1 } }
       }
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
   }
 \cs_new:Npn \tl_reverse_tokens:n #1
   {
@@ -24013,7 +25317,7 @@
       { \__kernel_file_missing:n {#4} }
       {
         \group_begin:
-          \exp_args:No \etex_everyeof:D
+          \exp_args:No \tex_everyeof:D
             { \c__tl_rescan_marker_tl \exp_not:N }
           #3 \scan_stop:
           \exp_after:wN \__tl_from_file_do:w
@@ -24040,7 +25344,7 @@
       { \__kernel_file_missing:n {#4} }
       {
         \group_begin:
-          \etex_everyeof:D { \exp_not:N }
+          \tex_everyeof:D { \exp_not:N }
           #3 \scan_stop:
           \tl_set:Nx \l__tl_internal_a_tl
             { \tex_input:D \l__tl_file_name_str \c_space_token }
@@ -25302,7 +26606,7 @@
 %% File: l3deprecation.dtx (C) Copyright 2017-2018 The LaTeX3 Project
 \cs_new_protected:Npn \__kernel_deprecation_error:Nnn #1#2#3
   {
-    \etex_protected:D \tex_outer:D \tex_edef:D #1
+    \tex_protected:D \tex_outer:D \tex_edef:D #1
       {
         \exp_not:N \__kernel_msg_expandable_error:nnnnn
           { kernel } { deprecated-command }
@@ -25393,6 +26697,53 @@
     \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx
       { \__kernel_msg_warning:nnxxxx }
   }
+\cs_new_protected:Npn \__deprecation_primitive:NN #1#2 { }
+\exp_last_unbraced:NNNNo
+  \cs_new:Npn \__deprecation_primitive:w #1 { \token_to_str:N _ } { }
+\__kernel_deprecation_code:nn
+  {
+    \cs_set_protected:Npn \__kernel_primitive:NN #1
+      {
+        \exp_after:wN \__deprecation_primitive:NN
+        \exp_after:wN #1
+        \exp_not:N
+      }
+    \cs_set_protected:Npn \__deprecation_primitive:NN #1#2
+      {
+        \tex_let:D #2 \scan_stop:
+        \exp_args:NNx \__kernel_deprecation_error:Nnn #2
+          {
+            \iow_char:N \\
+            \cs_if_exist:NTF #1
+              { \cs_to_str:N #1 }
+              {
+                tex_
+                \exp_last_unbraced:Nf
+                \__deprecation_primitive:w { \cs_to_str:N #2 }
+              }
+          }
+          { 2019-12-31 }
+      }
+    \__kernel_primitives:
+  }
+  {
+    \cs_set_protected:Npn \__kernel_primitive:NN #1
+      {
+        \exp_after:wN \__deprecation_primitive:NN
+        \exp_after:wN #1
+        \exp_not:N
+      }
+    \cs_set_protected:Npn \__deprecation_primitive:NN #1#2
+      {
+        \tex_let:D #2 #1
+        \cs_if_exist:cT { tex_ \cs_to_str:N #1 :D }
+          {
+            \exp_args:NNc \cs_set_eq:NN #2
+              { tex_ \cs_to_str:N #1 :D }
+          }
+      }
+    \__kernel_primitives:
+  }
 %% 
 %%
 %% End of file `expl3-code.tex'.

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2018-05-13 21:56:47 UTC (rev 47705)
@@ -90,8 +90,8 @@
     { xdvipdfmx }
     {
       \bool_lazy_and:nnTF
-        { \cs_if_exist_p:N  \pdftex_pdfoutput:D }
-        { \int_compare_p:nNn \pdftex_pdfoutput:D > 0 }
+        { \cs_if_exist_p:N  \tex_pdfoutput:D }
+        { \int_compare_p:nNn \tex_pdfoutput:D > 0 }
         { pdfmode }
         { dvips }
     }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls	2018-05-13 21:56:47 UTC (rev 47705)
@@ -1998,10 +1998,10 @@
           }
         \tl_if_empty:NF \l__codedoc_tmpa_tl
           {
-            \int_set:Nn \l__codedoc_tmpa_int { \etex_interactionmode:D }
+            \int_set:Nn \l__codedoc_tmpa_int { \tex_interactionmode:D }
             \errorstopmode
             \ClassError { l3doc } { \l__codedoc_tmpa_tl } { }
-            \int_set:Nn \etex_interactionmode:D { \l__codedoc_tmpa_int }
+            \int_set:Nn \tex_interactionmode:D { \l__codedoc_tmpa_int }
           }
       }
   }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def	2018-05-13 21:56:47 UTC (rev 47705)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 \ProvidesExplFile
-  {l3dvidpfmx.def}{2018-04-30}{}
+  {l3dvidpfmx.def}{2018-05-12}{}
   {L3 Experimental driver: dvipdfmx}
 \cs_new_eq:NN \__driver_literal_x:n \tex_special:D
 \cs_new_protected:Npn \__driver_literal:n #1

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def	2018-05-13 21:56:47 UTC (rev 47705)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 \ProvidesExplFile
-  {l3dvips.def}{2018-04-30}{}
+  {l3dvips.def}{2018-05-12}{}
   {L3 Experimental driver: dvips}
 \cs_new_eq:NN \__driver_literal_x:n \tex_special:D
 \cs_new_protected:Npn \__driver_literal:n #1

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3dvisvgm.def	2018-05-13 21:56:47 UTC (rev 47705)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 \ProvidesExplFile
-  {l3dvisvgm.def}{2018-04-30}{}
+  {l3dvisvgm.def}{2018-05-12}{}
   {L3 Experimental driver: dvisvgm}
 \cs_new_eq:NN \__driver_literal_x:n \tex_special:D
 \cs_new_protected:Npn \__driver_literal:n #1

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def	2018-05-13 21:56:47 UTC (rev 47705)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 \ProvidesExplFile
-  {l3pdfmode.def}{2018-04-30}{}
+  {l3pdfmode.def}{2018-05-12}{}
   {L3 Experimental driver: PDF mode}
 \cs_new_eq:NN \__driver_literal_x:n \tex_special:D
 \cs_new_protected:Npn \__driver_literal:n #1
@@ -99,9 +99,9 @@
   { \__driver_color_select:n { /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC } }
 \cs_new_protected:Npx \__driver_color_select:n #1
   {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D colorstack }
-      { \pdftex_pdfcolorstack:D }
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \tex_pdfextension:D colorstack }
+      { \tex_pdfcolorstack:D }
         \exp_not:N \l__driver_color_stack_int push {#1}
       \group_insert_after:N \exp_not:N \__driver_color_reset:
   }
@@ -108,36 +108,36 @@
 \cs_generate_variant:Nn \__driver_color_select:n { x }
 \cs_new_protected:Npx \__driver_color_reset:
   {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D colorstack }
-      { \pdftex_pdfcolorstack:D }
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \tex_pdfextension:D colorstack }
+      { \tex_pdfcolorstack:D }
         \exp_not:N \l__driver_color_stack_int pop \scan_stop:
   }
 \cs_new_protected:Npx \__driver_literal_pdf:n #1
   {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D literal }
-      { \pdftex_pdfliteral:D }
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \tex_pdfextension:D literal }
+      { \tex_pdfliteral:D }
         { \exp_not:N \exp_not:n {#1} }
   }
 \cs_generate_variant:Nn \__driver_literal_pdf:n { x }
 \cs_new_protected:Npx \__driver_scope_begin:
   {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D save \scan_stop: }
-      { \pdftex_pdfsave:D }
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \tex_pdfextension:D save \scan_stop: }
+      { \tex_pdfsave:D }
   }
 \cs_new_protected:Npx \__driver_scope_end:
   {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D restore \scan_stop: }
-      { \pdftex_pdfrestore:D }
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \tex_pdfextension:D restore \scan_stop: }
+      { \tex_pdfrestore:D }
   }
 \cs_new_protected:Npx \__driver_matrix:n #1
   {
-    \cs_if_exist:NTF \luatex_pdfextension:D
-      { \luatex_pdfextension:D setmatrix }
-      { \pdftex_pdfsetmatrix:D }
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \tex_pdfextension:D setmatrix }
+      { \tex_pdfsetmatrix:D }
         { \exp_not:N \exp_not:n {#1} }
   }
 \cs_generate_variant:Nn \__driver_matrix:n { x }
@@ -231,7 +231,7 @@
   }
 \cs_new_protected:Npn \__driver_image_getbb_auxii:n #1
   {
-    \tex_immediate:D \pdftex_pdfximage:D
+    \tex_immediate:D \tex_pdfximage:D
       \bool_lazy_or:nnT
         { \l_image_interpolate_bool }
         { ! \tl_if_empty_p:N \l_image_decodearray_tl }
@@ -250,16 +250,16 @@
         { \l_image_pagebox_tl }
       {#1}
     \hbox_set:Nn \l__driver_tmp_box
-      { \pdftex_pdfrefximage:D \pdftex_pdflastximage:D }
+      { \tex_pdfrefximage:D \tex_pdflastximage:D }
     \dim_set:Nn \l_image_urx_dim { \box_wd:N \l__driver_tmp_box }
     \dim_set:Nn \l_image_ury_dim { \box_ht:N \l__driver_tmp_box }
     \int_const:cn { c__driver_image_ #1 \l__driver_image_attr_tl _int }
-      { \tex_the:D \pdftex_pdflastximage:D }
+      { \tex_the:D \tex_pdflastximage:D }
     \image_bb_save:x { #1 \l__driver_image_attr_tl }
   }
 \cs_new_protected:Npn \__driver_image_include_jpg:n #1
   {
-    \pdftex_pdfrefximage:D
+    \tex_pdfrefximage:D
       \int_use:c { c__driver_image_ #1 \l__driver_image_attr_tl _int }
   }
 \cs_new_eq:NN \__driver_image_include_pdf:n \__driver_image_include_jpg:n

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def	2018-05-13 21:56:47 UTC (rev 47705)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3drivers.dtx Copyright(C) 2011-2018 The LaTeX3 Project
 \ProvidesExplFile
-  {l3xdvidpfmx.def}{2018-04-30}{}
+  {l3xdvidpfmx.def}{2018-05-12}{}
   {L3 Experimental driver: xdvipdfmx}
 \cs_new_eq:NN \__driver_literal_x:n \tex_special:D
 \cs_new_protected:Npn \__driver_literal:n #1
@@ -197,7 +197,7 @@
   {
     \int_zero:N \l_image_page_int
     \tl_clear:N \l_image_pagebox_tl
-    \__driver_image_getbb_auxi:nN {#1} \xetex_picfile:D
+    \__driver_image_getbb_auxi:nN {#1} \tex_XeTeXpicfile:D
   }
 \cs_new_eq:NN \__driver_image_getbb_png:n \__driver_image_getbb_jpg:n
 \cs_new_protected:Npn \__driver_image_getbb_pdf:n #1
@@ -204,7 +204,7 @@
   {
     \tl_clear:N \l_image_decode_tl
     \bool_set_false:N \l_image_interpolate_bool
-    \__driver_image_getbb_auxi:nN {#1} \xetex_pdffile:D
+    \__driver_image_getbb_auxi:nN {#1} \tex_XeTeXpdffile:D
   }
 \cs_new_protected:Npn \__driver_image_getbb_auxi:nN #1#2
   {
@@ -246,7 +246,7 @@
 \cs_new:Npn \__driver_image_getbb_pagebox:w #1 box {#1}
 \cs_new_protected:Npn \__driver_image_include_pdf:n #1
   {
-    \xetex_pdffile:D "#1" ~
+    \tex_XeTeXpdffile:D "#1" ~
       \int_compare:nNnT \l_image_page_int > 0
         { page~ \int_use:N \l_image_page_int }
       \__driver_image_getbb_auxiv:VnNnn \l_image_pagebox_tl

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty	2018-05-13 21:56:47 UTC (rev 47705)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3keys2e}{2018-04-30}{}
+\ProvidesExplPackage{l3keys2e}{2018-05-12}{}
   {LaTeX2e option processing using LaTeX3 keys}
 \cs_generate_variant:Nn \clist_put_right:Nn { Nv }
 \cs_generate_variant:Nn \keys_if_exist:nnT  { nx }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfp/xfp.sty	2018-05-13 21:56:47 UTC (rev 47705)
@@ -33,7 +33,7 @@
     \endinput
   }
 \RequirePackage{xparse}
-\ProvidesExplPackage{xfp}{2018-04-30}{}
+\ProvidesExplPackage{xfp}{2018-05-12}{}
   {L3 Floating point unit}
 \NewExpandableDocumentCommand \fpeval { m } { \fp_eval:n {#1} }
 \NewExpandableDocumentCommand \inteval { m } { \int_eval:n {#1} }

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xfrac/xfrac.sty	2018-05-13 21:56:47 UTC (rev 47705)
@@ -34,7 +34,7 @@
     \endinput
   }
 \RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate}
-\ProvidesExplPackage{xfrac}{2018-04-30}{}
+\ProvidesExplPackage{xfrac}{2018-05-12}{}
   {L3 Experimental split-level fractions}
 \keys_define:nn { xfrac }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty	2018-05-13 21:56:47 UTC (rev 47705)
@@ -36,7 +36,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xparse}{2018-04-30}{}
+\ProvidesExplPackage{xparse}{2018-05-12}{}
   {L3 Experimental document command parser}
 \tl_new:N \l__xparse_arg_spec_tl
 \tl_new:N \l__xparse_args_tl

Modified: trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2018-05-13 21:53:50 UTC (rev 47704)
+++ trunk/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty	2018-05-13 21:56:47 UTC (rev 47705)
@@ -36,7 +36,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{xtemplate}{2018-04-30}{}
+\ProvidesExplPackage{xtemplate}{2018-05-12}{}
   {L3 Experimental prototype document functions}
 \tl_const:Nn \c__xtemplate_code_root_tl      { template~code~>~ }
 \tl_const:Nn \c__xtemplate_defaults_root_tl  { template~defaults~>~ }



More information about the tex-live-commits mailing list